bind9-9.9.5.dfsg/0002755000470500017500000000000012271527124013043 5ustar lamontlamontbind9-9.9.5.dfsg/FAQ0000644000470500017500000010152012271526120013365 0ustar lamontlamontFrequently Asked Questions about BIND 9 Copyright © 2004-2010, 2013 Internet Systems Consortium, Inc. ("ISC") Copyright © 2000-2003 Internet Software Consortium. ----------------------------------------------------------------------- 1. Compilation and Installation Questions Q: I'm trying to compile BIND 9, and "make" is failing due to files not being found. Why? A: Using a parallel or distributed "make" to build BIND 9 is not supported, and doesn't work. If you are using one of these, use normal make or gmake instead. Q: Isn't "make install" supposed to generate a default named.conf? A: Short Answer: No. Long Answer: There really isn't a default configuration which fits any site perfectly. There are lots of decisions that need to be made and there is no consensus on what the defaults should be. For example FreeBSD uses /etc/namedb as the location where the configuration files for named are stored. Others use /var/named. What addresses to listen on? For a laptop on the move a lot you may only want to listen on the loop back interfaces. Who do you offer recursive service to? Is there are firewall to consider? If so is it stateless or stateful. Are you directly on the Internet? Are you on a private network? Are you on a NAT'd network? The answers to all these questions change how you configure even a caching name server. 2. Configuration and Setup Questions Q: Why does named log the warning message "no TTL specified - using SOA MINTTL instead"? A: Your zone file is illegal according to RFC1035. It must either have a line like: $TTL 86400 at the beginning, or the first record in it must have a TTL field, like the "84600" in this example: example.com. 86400 IN SOA ns hostmaster ( 1 3600 1800 1814400 3600 ) Q: Why do I get errors like "dns_zone_load: zone foo/IN: loading master file bar: ran out of space"? A: This is often caused by TXT records with missing close quotes. Check that all TXT records containing quoted strings have both open and close quotes. Q: How do I restrict people from looking up the server version? A: Put a "version" option containing something other than the real version in the "options" section of named.conf. Note doing this will not prevent attacks and may impede people trying to diagnose problems with your server. Also it is possible to "fingerprint" nameservers to determine their version. Q: How do I restrict only remote users from looking up the server version? A: The following view statement will intercept lookups as the internal view that holds the version information will be matched last. The caveats of the previous answer still apply, of course. view "chaos" chaos { match-clients { ; }; allow-query { none; }; zone "." { type hint; file "/dev/null"; // or any empty file }; }; Q: What do "no source of entropy found" or "could not open entropy source foo" mean? A: The server requires a source of entropy to perform certain operations, mostly DNSSEC related. These messages indicate that you have no source of entropy. On systems with /dev/random or an equivalent, it is used by default. A source of entropy can also be defined using the random-device option in named.conf. Q: I'm trying to use TSIG to authenticate dynamic updates or zone transfers. I'm sure I have the keys set up correctly, but the server is rejecting the TSIG. Why? A: This may be a clock skew problem. Check that the the clocks on the client and server are properly synchronised (e.g., using ntp). Q: I see a log message like the following. Why? couldn't open pid file '/var/run/named.pid': Permission denied A: You are most likely running named as a non-root user, and that user does not have permission to write in /var/run. The common ways of fixing this are to create a /var/run/named directory owned by the named user and set pid-file to "/var/run/named/named.pid", or set pid-file to "named.pid", which will put the file in the directory specified by the directory option (which, in this case, must be writable by the named user). Q: I can query the nameserver from the nameserver but not from other machines. Why? A: This is usually the result of the firewall configuration stopping the queries and / or the replies. Q: How can I make a server a slave for both an internal and an external view at the same time? When I tried, both views on the slave were transferred from the same view on the master. A: You will need to give the master and slave multiple IP addresses and use those to make sure you reach the correct view on the other machine. Master: 10.0.1.1 (internal), 10.0.1.2 (external, IP alias) internal: match-clients { !10.0.1.2; !10.0.1.4; 10.0.1/24; }; notify-source 10.0.1.1; transfer-source 10.0.1.1; query-source address 10.0.1.1; external: match-clients { any; }; recursion no; // don't offer recursion to the world notify-source 10.0.1.2; transfer-source 10.0.1.2; query-source address 10.0.1.2; Slave: 10.0.1.3 (internal), 10.0.1.4 (external, IP alias) internal: match-clients { !10.0.1.2; !10.0.1.4; 10.0.1/24; }; notify-source 10.0.1.3; transfer-source 10.0.1.3; query-source address 10.0.1.3; external: match-clients { any; }; recursion no; // don't offer recursion to the world notify-source 10.0.1.4; transfer-source 10.0.1.4; query-source address 10.0.1.4; You put the external address on the alias so that all the other dns clients on these boxes see the internal view by default. A: BIND 9.3 and later: Use TSIG to select the appropriate view. Master 10.0.1.1: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; // reject message ment for the // external view. 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; server 10.0.1.2 { keys external; }; // tag messages from the // external view to the // other servers for the // view. recursion no; ... }; Slave 10.0.1.2: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; ... }; view "external" { match-clients { key external; any; }; server 10.0.1.1 { keys external; }; recursion no; ... }; Q: I get error messages like "multiple RRs of singleton type" and "CNAME and other data" when transferring a zone. What does this mean? A: These indicate a malformed master zone. You can identify the exact records involved by transferring the zone using dig then running named-checkzone on it. dig axfr example.com @master-server > tmp named-checkzone example.com tmp A CNAME record cannot exist with the same name as another record except for the DNSSEC records which prove its existence (NSEC). RFC 1034, Section 3.6.2: "If a CNAME RR is present at a node, no other data should be present; this ensures that the data for a canonical name and its aliases cannot be different. This rule also insures that a cached CNAME can be used without checking with an authoritative server for other RR types." Q: I get error messages like "named.conf:99: unexpected end of input" where 99 is the last line of named.conf. A: There are unbalanced quotes in named.conf. A: Some text editors (notepad and wordpad) fail to put a line title indication (e.g. CR/LF) on the last line of a text file. This can be fixed by "adding" a blank line to the end of the file. Named expects to see EOF immediately after EOL and treats text files where this is not met as truncated. Q: How do I share a dynamic zone between multiple views? A: You choose one view to be master and the second a slave and transfer the zone between views. Master 10.0.1.1: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { algorithm hmac-sha256; secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; server 10.0.1.1 { /* Deliver notify messages to external view. */ keys { external; }; }; zone "example.com" { type master; file "internal/example.db"; allow-update { key mykey; }; also-notify { 10.0.1.1; }; }; }; view "external" { match-clients { key external; any; }; zone "example.com" { type slave; file "external/example.db"; masters { 10.0.1.1; }; transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; }; Q: I get a error message like "zone wireless.ietf56.ietf.org/IN: loading master file primaries/wireless.ietf56.ietf.org: no owner". A: This error is produced when a line in the master file contains leading white space (tab/space) but the is no current record owner name to inherit the name from. Usually this is the result of putting white space before a comment, forgetting the "@" for the SOA record, or indenting the master file. Q: Why are my logs in GMT (UTC). A: You are running chrooted (-t) and have not supplied local timezone information in the chroot area. FreeBSD: /etc/localtime Solaris: /etc/TIMEZONE and /usr/share/lib/zoneinfo OSF: /etc/zoneinfo/localtime See also tzset(3) and zic(8). Q: I get "rndc: connect failed: connection refused" when I try to run rndc. A: This is usually a configuration error. First ensure that named is running and no errors are being reported at startup (/var/log/messages or equivalent). Running "named -g " from a title can help at this point. Secondly ensure that named is configured to use rndc either by "rndc-confgen -a", rndc-confgen or manually. The Administrators Reference manual has details on how to do this. Old versions of rndc-confgen used localhost rather than 127.0.0.1 in / etc/rndc.conf for the default server. Update /etc/rndc.conf if necessary so that the default server listed in /etc/rndc.conf matches the addresses used in named.conf. "localhost" has two address (127.0.0.1 and ::1). If you use "rndc-confgen -a" and named is running with -t or -u ensure that /etc/rndc.conf has the correct ownership and that a copy is in the chroot area. You can do this by re-running "rndc-confgen -a" with appropriate -t and -u arguments. Q: I get "transfer of 'example.net/IN' from 192.168.4.12#53: failed while receiving responses: permission denied" error messages. A: These indicate a filesystem permission error preventing named creating / renaming the temporary file. These will usually also have other associated error messages like "dumping master file: sl/tmp-XXXX5il3sQ: open: permission denied" Named needs write permission on the directory containing the file. Named writes the new cache file to a temporary file then renames it to the name specified in named.conf to ensure that the contents are always complete. This is to prevent named loading a partial zone in the event of power failure or similar interrupting the write of the master file. Note file names are relative to the directory specified in options and any chroot directory ([/][]). If named is invoked as "named -t /chroot/DNS" with the following named.conf then "/chroot/DNS/var/named/sl" needs to be writable by the user named is running as. options { directory "/var/named"; }; zone "example.net" { type slave; file "sl/example.net"; masters { 192.168.4.12; }; }; Q: I want to forward all DNS queries from my caching nameserver to another server. But there are some domains which have to be served locally, via rbldnsd. How do I achieve this ? A: options { forward only; forwarders { ; }; }; zone "sbl-xbl.spamhaus.org" { type forward; forward only; forwarders { port 530; }; }; zone "list.dsbl.org" { type forward; forward only; forwarders { port 530; }; }; Q: Can you help me understand how BIND 9 uses memory to store DNS zones? Some times it seems to take several times the amount of memory it needs to store the zone. A: When reloading a zone named my have multiple copies of the zone in memory at one time. The zone it is serving and the one it is loading. If reloads are ultra fast it can have more still. e.g. Ones that are transferring out, the one that it is serving and the one that is loading. BIND 8 destroyed the zone before loading and also killed off outgoing transfers of the zone. The new strategy allows slaves to get copies of the new zone regardless of how often the master is loaded compared to the transfer time. The slave might skip some intermediate versions but the transfers will complete and it will keep reasonably in sync with the master. The new strategy also allows the master to recover from syntax and other errors in the master file as it still has an in-core copy of the old contents. Q: I want to use IPv6 locally but I don't have a external IPv6 connection. External lookups are slow. A: You can use server clauses to stop named making external lookups over IPv6. server fd81:ec6c:bd62::/48 { bogus no; }; // site ULA prefix server ::/0 { bogus yes; }; 3. Operations Questions Q: How to change the nameservers for a zone? A: Step 1: Ensure all nameservers, new and old, are serving the same zone content. Step 2: Work out the maximum TTL of the NS RRset in the parent and child zones. This is the time it will take caches to be clear of a particular version of the NS RRset. If you are just removing nameservers you can skip to Step 6. Step 3: Add new nameservers to the NS RRset for the zone and wait until all the servers for the zone are answering with this new NS RRset. Step 4: Inform the parent zone of the new NS RRset then wait for all the parent servers to be answering with the new NS RRset. Step 5: Wait for cache to be clear of the old NS RRset. See Step 2 for how long. If you are just adding nameservers you are done. Step 6: Remove any old nameservers from the zones NS RRset and wait for all the servers for the zone to be serving the new NS RRset. Step 7: Inform the parent zone of the new NS RRset then wait for all the parent servers to be answering with the new NS RRset. Step 8: Wait for cache to be clear of the old NS RRset. See Step 2 for how long. Step 9: Turn off the old nameservers or remove the zone entry from the configuration of the old nameservers. Step 10: Increment the serial number and wait for the change to be visible in all nameservers for the zone. This ensures that zone transfers are still working after the old servers are decommissioned. Note: the above procedure is designed to be transparent to dns clients. Decommissioning the old servers too early will result in some clients not being able to look up answers in the zone. Note: while it is possible to run the addition and removal stages together it is not recommended. 4. General Questions Q: I keep getting log messages like the following. Why? Dec 4 23:47:59 client 10.0.0.1#1355: updating zone 'example.com/IN': update failed: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET) A: DNS updates allow the update request to test to see if certain conditions are met prior to proceeding with the update. The message above is saying that conditions were not met and the update is not proceeding. See doc/rfc/rfc2136.txt for more details on prerequisites. Q: I keep getting log messages like the following. Why? Jun 21 12:00:00.000 client 10.0.0.1#1234: update denied A: Someone is trying to update your DNS data using the RFC2136 Dynamic Update protocol. Windows 2000 machines have a habit of sending dynamic update requests to DNS servers without being specifically configured to do so. If the update requests are coming from a Windows 2000 machine, see for information about how to turn them off. Q: When I do a "dig . ns", many of the A records for the root servers are missing. Why? A: This is normal and harmless. It is a somewhat confusing side effect of the way BIND 9 does RFC2181 trust ranking and of the efforts BIND 9 makes to avoid promoting glue into answers. When BIND 9 first starts up and primes its cache, it receives the root server addresses as additional data in an authoritative response from a root server, and these records are eligible for inclusion as additional data in responses. Subsequently it receives a subset of the root server addresses as additional data in a non-authoritative (referral) response from a root server. This causes the addresses to now be considered non-authoritative (glue) data, which is not eligible for inclusion in responses. The server does have a complete set of root server addresses cached at all times, it just may not include all of them as additional data, depending on whether they were last received as answers or as glue. You can always look up the addresses with explicit queries like "dig a.root-servers.net A". Q: Why don't my zones reload when I do an "rndc reload" or SIGHUP? A: A zone can be updated either by editing zone files and reloading the server or by dynamic update, but not both. If you have enabled dynamic update for a zone using the "allow-update" option, you are not supposed to edit the zone file by hand, and the server will not attempt to reload it. Q: Why is named listening on UDP port other than 53? A: Named uses a system selected port to make queries of other nameservers. This behaviour can be overridden by using query-source to lock down the port and/or address. See also notify-source and transfer-source. Q: I get warning messages like "zone example.com/IN: refresh: failure trying master 1.2.3.4#53: timed out". A: Check that you can make UDP queries from the slave to the master dig +norec example.com soa @1.2.3.4 You could be generating queries faster than the slave can cope with. Lower the serial query rate. serial-query-rate 5; // default 20 Q: I don't get RRSIG's returned when I use "dig +dnssec". A: You need to ensure DNSSEC is enabled (dnssec-enable yes;). Q: Can a NS record refer to a CNAME. A: No. The rules for glue (copies of the *address* records in the parent zones) and additional section processing do not allow it to work. You would have to add both the CNAME and address records (A/AAAA) as glue to the parent zone and have CNAMEs be followed when doing additional section processing to make it work. No nameserver implementation supports either of these requirements. Q: What does "RFC 1918 response from Internet for 0.0.0.10.IN-ADDR.ARPA" mean? A: If the IN-ADDR.ARPA name covered refers to a internal address space you are using then you have failed to follow RFC 1918 usage rules and are leaking queries to the Internet. You should establish your own zones for these addresses to prevent you querying the Internet's name servers for these addresses. Please see for details of the problems you are causing and the counter measures that have had to be deployed. If you are not using these private addresses then a client has queried for them. You can just ignore the messages, get the offending client to stop sending you these messages as they are most probably leaking them or setup your own zones empty zones to serve answers to these queries. zone "10.IN-ADDR.ARPA" { type master; file "empty"; }; zone "16.172.IN-ADDR.ARPA" { type master; file "empty"; }; ... zone "31.172.IN-ADDR.ARPA" { type master; file "empty"; }; zone "168.192.IN-ADDR.ARPA" { type master; file "empty"; }; empty: @ 10800 IN SOA . . ( 1 3600 1200 604800 10800 ) @ 10800 IN NS . Note Future versions of named are likely to do this automatically. Q: Will named be affected by the 2007 changes to daylight savings rules in the US. A: No, so long as the machines internal clock (as reported by "date -u") remains at UTC. The only visible change if you fail to upgrade your OS, if you are in a affected area, will be that log messages will be a hour out during the period where the old rules do not match the new rules. For most OS's this change just means that you need to update the conversion rules from UTC to local time. Normally this involves updating a file in /etc (which sets the default timezone for the machine) and possibly a directory which has all the conversion rules for the world (e.g. /usr/share/zoneinfo). When updating the OS do not forget to update any chroot areas as well. See your OS's documentation for more details. The local timezone conversion rules can also be done on a individual basis by setting the TZ environment variable appropriately. See your OS's documentation for more details. Q: Is there a bugzilla (or other tool) database that mere mortals can have (read-only) access to for bind? A: No. The BIND 9 bug database is kept closed for a number of reasons. These include, but are not limited to, that the database contains proprietory information from people reporting bugs. The database has in the past and may in future contain unfixed bugs which are capable of bringing down most of the Internet's DNS infrastructure. The release pages for each version contain up to date lists of bugs that have been fixed post release. That is as close as we can get to providing a bug database. Q: Why do queries for NSEC3 records fail to return the NSEC3 record? A: NSEC3 records are strictly meta data and can only be returned in the authority section. This is done so that signing the zone using NSEC3 records does not bring names into existence that do not exist in the unsigned version of the zone. 5. Operating-System Specific Questions 5.1. HPUX Q: I get the following error trying to configure BIND: checking if unistd.h or sys/types.h defines fd_set... no configure: error: need either working unistd.h or sys/select.h A: You have attempted to configure BIND with the bundled C compiler. This compiler does not meet the minimum compiler requirements to for building BIND. You need to install a ANSI C compiler and / or teach configure how to find the ANSI C compiler. The later can be done by adjusting the PATH environment variable and / or specifying the compiler via CC. ./configure CC= ... 5.2. Linux Q: Why do I get the following errors: general: errno2result.c:109: unexpected error: general: unable to convert errno to isc_result: 14: Bad address client: UDP client handler shutting down due to fatal receive error: unexpected error A: This is the result of a Linux kernel bug. See: Q: Why does named lock up when it attempts to connect over IPSEC tunnels? A: This is due to a kernel bug where the fact that a socket is marked non-blocking is ignored. It is reported that setting xfrm_larval_drop to 1 helps but this may have negative side effects. See: and . xfrm_larval_drop can be set to 1 by the following procedure: echo "1" > proc/sys/net/core/xfrm_larval_drop Q: Why do I see 5 (or more) copies of named on Linux? A: Linux threads each show up as a process under ps. The approximate number of threads running is n+4, where n is the number of CPUs. Note that the amount of memory used is not cumulative; if each process is using 10M of memory, only a total of 10M is used. Newer versions of Linux's ps command hide the individual threads and require -L to display them. Q: Why does BIND 9 log "permission denied" errors accessing its configuration files or zones on my Linux system even though it is running as root? A: On Linux, BIND 9 drops most of its root privileges on startup. This including the privilege to open files owned by other users. Therefore, if the server is running as root, the configuration files and zone files should also be owned by root. Q: I get the error message "named: capset failed: Operation not permitted" when starting named. A: The capability module, part of "Linux Security Modules/LSM", has not been loaded into the kernel. See insmod(8), modprobe(8). The relevant modules can be loaded by running: modprobe commoncap modprobe capability Q: I'm running BIND on Red Hat Enterprise Linux or Fedora Core - Why can't named update slave zone database files? Why can't named create DDNS journal files or update the master zones from journals? Why can't named create custom log files? A: Red Hat Security Enhanced Linux (SELinux) policy security protections : Red Hat have adopted the National Security Agency's SELinux security policy (see ) and recommendations for BIND security , which are more secure than running named in a chroot and make use of the bind-chroot environment unnecessary . By default, named is not allowed by the SELinux policy to write, create or delete any files EXCEPT in these directories: $ROOTDIR/var/named/slaves $ROOTDIR/var/named/data $ROOTDIR/var/tmp where $ROOTDIR may be set in /etc/sysconfig/named if bind-chroot is installed. The SELinux policy particularly does NOT allow named to modify the $ROOTDIR/var/named directory, the default location for master zone database files. SELinux policy overrules file access permissions - so even if all the files under /var/named have ownership named:named and mode rw-rw-r--, named will still not be able to write or create files except in the directories above, with SELinux in Enforcing mode. So, to allow named to update slave or DDNS zone files, it is best to locate them in $ROOTDIR/var/named/slaves, with named.conf zone statements such as: zone "slave.zone." IN { type slave; file "slaves/slave.zone.db"; ... }; zone "ddns.zone." IN { type master; allow-updates {...}; file "slaves/ddns.zone.db"; }; To allow named to create its cache dump and statistics files, for example, you could use named.conf options statements such as: options { ... dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; ... }; You can also tell SELinux to allow named to update any zone database files, by setting the SELinux tunable boolean parameter 'named_write_master_zones=1', using the system-config-securitylevel GUI, using the 'setsebool' command, or in /etc/selinux/targeted/ booleans. You can disable SELinux protection for named entirely by setting the 'named_disable_trans=1' SELinux tunable boolean parameter. The SELinux named policy defines these SELinux contexts for named: named_zone_t : for zone database files - $ROOTDIR/var/named/* named_conf_t : for named configuration files - $ROOTDIR/etc/{named,rndc}.* named_cache_t: for files modifiable by named - $ROOTDIR/var/{tmp,named/{slaves,data}} If you want to retain use of the SELinux policy for named, and put named files in different locations, you can do so by changing the context of the custom file locations . To create a custom configuration file location, e.g. '/root/ named.conf', to use with the 'named -c' option, do: # chcon system_u:object_r:named_conf_t /root/named.conf To create a custom modifiable named data location, e.g. '/var/log/ named' for a log file, do: # chcon system_u:object_r:named_cache_t /var/log/named To create a custom zone file location, e.g. /root/zones/, do: # chcon system_u:object_r:named_zone_t /root/zones/{.,*} See these man-pages for more information : selinux(8), named_selinux (8), chcon(1), setsebool(8) Q: I'm running BIND on Ubuntu - Why can't named update slave zone database files? Why can't named create DDNS journal files or update the master zones from journals? Why can't named create custom log files? A: Ubuntu uses AppArmor in addition to normal file system permissions to protect the system. Adjust the paths to use those specified in /etc/apparmor.d/ usr.sbin.named or adjust /etc/apparmor.d/usr.sbin.named to allow named to write at the location specified in named.conf. Q: Listening on individual IPv6 interfaces does not work. A: This is usually due to "/proc/net/if_inet6" not being available in the chroot file system. Mount another instance of "proc" in the chroot file system. This can be be made permanent by adding a second instance to /etc/ fstab. proc /proc proc defaults 0 0 proc /var/named/proc proc defaults 0 0 5.3. Windows Q: Zone transfers from my BIND 9 master to my Windows 2000 slave fail. Why? A: This may be caused by a bug in the Windows 2000 DNS server where DNS messages larger than 16K are not handled properly. This can be worked around by setting the option "transfer-format one-answer;". Also check whether your zone contains domain names with embedded spaces or other special characters, like "John\032Doe\213s\032Computer", since such names have been known to cause Windows 2000 slaves to incorrectly reject the zone. Q: I get "Error 1067" when starting named under Windows. A: This is the service manager saying that named exited. You need to examine the Application log in the EventViewer to find out why. Common causes are that you failed to create "named.conf" (usually "C:\ windows\dns\etc\named.conf") or failed to specify the directory in named.conf. options { Directory "C:\windows\dns\etc"; }; 5.4. FreeBSD Q: I have FreeBSD 4.x and "rndc-confgen -a" just sits there. A: /dev/random is not configured. Use rndcontrol(8) to tell the kernel to use certain interrupts as a source of random events. You can make this permanent by setting rand_irqs in /etc/rc.conf. rand_irqs="3 14 15" See also . 5.5. Solaris Q: How do I integrate BIND 9 and Solaris SMF A: Sun has a blog entry describing how to do this. 5.6. Apple Mac OS X Q: How do I run BIND 9 on Apple Mac OS X? A: If you run Tiger(Mac OS 10.4) or later then this is all you need to do: % sudo rndc-confgen > /etc/rndc.conf Copy the key statement from /etc/rndc.conf into /etc/rndc.key, e.g.: key "rndc-key" { algorithm hmac-sha256; secret "uvceheVuqf17ZwIcTydddw=="; }; Then start the relevant service: % sudo service org.isc.named start This is persistent upon a reboot, so you will have to do it only once. A: Alternatively you can just generate /etc/rndc.key by running: % sudo rndc-confgen -a Then start the relevant service: % sudo service org.isc.named start Named will look for /etc/rndc.key when it starts if it doesn't have a controls section or the existing controls are missing keys sub-clauses. This is persistent upon a reboot, so you will have to do it only once. bind9-9.9.5.dfsg/isc-config.sh.docbook0000644000470500017500000001146112271526120017033 0ustar lamontlamont]> December 19, 2008 isc-config.sh 1 BIND9 2009 Internet Systems Consortium, Inc. ("ISC") isc-config.sh Get information about the installed version of ISC BIND isc-config.sh libraries DESCRIPTION isc-config.sh prints information related to the installed version of ISC BIND, such as the compiler and linker flags required to compile and link programs that use ISC BIND libraries. The optional libraries are used to report specific details for compiling and linking for the listed libraries. The allowed choices are: , , , , , and . Multiple libraries may be listed on the command line. (Some libraries require other libraries, so are implied.) OPTIONS --cflags Prints the compiler command line options required to compile files that use ISC BIND. Use the command line argument(s) to print additional specific flags to pass to the C compiler. --exec-prefix Prints the directory prefix used in the ISC BIND installation for architecture dependent files to standard output. --libs Prints the linker command line options used to link with the ISC BIND libraries. Use the command line argument(s) to print additional specific flags. --prefix Prints the directory prefix used in the ISC BIND installation for architecture independent files to standard output. --version Prints the version of the installed ISC BIND suite. RETURN VALUES isc-config.sh returns an exit status of 1 if invoked with invalid arguments or no arguments at all. It returns 0 if information was successfully printed. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/install-sh0000755000470500017500000001271112271526120015042 0ustar lamontlamont#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 bind9-9.9.5.dfsg/COPYRIGHT0000644000470500017500000006500112271526120014331 0ustar lamontlamontCopyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 1996-2003 Internet Software Consortium. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions of this code release fall under one or more of the following Copyright notices. Please see individual source files for details. For binary releases also see: OpenSSL-LICENSE. Copyright (C) 1996-2001 Nominum, Inc. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright (C) 1995-2000 by Network Associates, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND STICHTING NLNET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL STICHTING NLNET BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. The development of Dynamically Loadable Zones (DLZ) for Bind 9 was conceived and contributed by Rob Butler. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ROB BUTLER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ROB BUTLER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright (c) 1987, 1990, 1993, 1994 The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (C) The Internet Society 2005. This version of this module is part of RFC 4178; see the RFC itself for full legal notices. (The above copyright notice is per RFC 3978 5.6 (a), q.v.) ----------------------------------------------------------------------------- Copyright (c) 2004 Masarykova universita (Masaryk University, Brno, Czech Republic) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (c) 1997 - 2003 Kungliga Tekniska Högskolan (Royal Institute of Technology, Stockholm, Sweden). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the Institute nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (c) 1998 Doug Rabson All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright ((c)) 2002, Rice University All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Rice University (RICE) nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. This software is provided by RICE and the contributors on an "as is" basis, without any representations or warranties of any kind, express or implied including, but not limited to, representations or warranties of non-infringement, merchantability or fitness for a particular purpose. In no event shall RICE or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. ----------------------------------------------------------------------------- Copyright (c) 1993 by Digital Equipment Corporation. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies, and that the name of Digital Equipment Corporation not be used in advertising or publicity pertaining to distribution of the document or software without specific, written prior permission. THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright 2000 Aaron D. Gifford. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (c) 1998 Doug Rabson. Copyright (c) 2001 Jake Burkholder. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (c) 1999-2000 by Nortel Networks Corporation Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND NORTEL NETWORKS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NORTEL NETWORKS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved. By using this file, you agree to the terms and conditions set forth bellow. LICENSE TERMS AND CONDITIONS The following License Terms and Conditions apply, unless a different license is obtained from Japan Network Information Center ("JPNIC"), a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, Chiyoda-ku, Tokyo 101-0047, Japan. 1. Use, Modification and Redistribution (including distribution of any modified or derived work) in source and/or binary forms is permitted under this License Terms and Conditions. 2. Redistribution of source code must retain the copyright notices as they appear in each source code file, this License Terms and Conditions. 3. Redistribution in binary form must reproduce the Copyright Notice, this License Terms and Conditions, in the documentation and/or other materials provided with the distribution. For the purposes of binary distribution the "Copyright Notice" refers to the following language: "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." 4. The name of JPNIC may not be used to endorse or promote products derived from this Software without specific prior written approval of JPNIC. 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ----------------------------------------------------------------------------- Copyright (C) 2004 Nominet, Ltd. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND NOMINET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Portions Copyright RSA Security Inc. License to copy and use this software is granted provided that it is identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface (Cryptoki)" in all material mentioning or referencing this software. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Security Inc. PKCS #11 Cryptographic Token Interface (Cryptoki)" in all material mentioning or referencing the derived work. RSA Security Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. ----------------------------------------------------------------------------- Copyright (c) 1996, David Mazieres Copyright (c) 2008, Damien Miller Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----------------------------------------------------------------------------- Copyright (c) 2000-2001 The OpenSSL Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact licensing@OpenSSL.org. 5. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project. 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- Copyright (c) 1995, 1997, 1998 The NetBSD Foundation, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. bind9-9.9.5.dfsg/unit/0002755000470500017500000000000012276444014014023 5ustar lamontlamontbind9-9.9.5.dfsg/unit/README0000644000470500017500000000106312271526120014673 0ustar lamontlamontThese unit tests for BIND 9 are based on the NetBSD Automated Test Framework release 0.17. To build an external copy of ATF for use by BIND 9: $ cd atf-src $ configure --prefix= --enable-tools --disable-shared $ make $ make install Subsequently, specify the ATF prefix when building BIND 9: $ configure --with-atf= ATF can also be built automatically during the BIND 9 build, by specifying --with-atf without an argument: $ configure --with-atf This causes BIND 9 to build ATF in the atf-src directory and link to it directly. bind9-9.9.5.dfsg/unit/Makefile.in0000644000470500017500000000223112271526120016056 0ustar lamontlamont# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ SUBDIRS = @ATFBUILD@ TARGETS = atf @BIND9_MAKE_RULES@ # # install ATF libraries, if configured with --with-atf # atf: @for i in ${ALL_SUBDIRS}; do \ if [ "$$i" != "nulldir" -a -d $$i ]; then \ (cd $$i; ${MAKE} ${MAKEDEFS} install) || exit 1; \ fi; \ done clean distclean:: rm -rf ./atf distclean:: rm unittest.sh bind9-9.9.5.dfsg/unit/atf-src/0002755000470500017500000000000012276444014015362 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-run/0002755000470500017500000000000012276444014016736 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-run/signals_test.cpp0000644000470500017500000001710212271526120022132 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include } #include #include #include #include "atf-c/defs.h" #include "atf-c++/macros.hpp" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/process.hpp" #include "signals.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace sigusr1 { static bool happened = false; static void handler(int signo ATF_DEFS_ATTRIBUTE_UNUSED) { happened = true; } static void program(void) { struct sigaction sa; sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (::sigaction(SIGUSR1, &sa, NULL) == -1) throw atf::system_error("sigusr1::program", "sigaction(2) failed", errno); } } // namespace sigusr1 namespace sigusr1_2 { static bool happened = false; static void handler(int signo ATF_DEFS_ATTRIBUTE_UNUSED) { happened = true; } } // namespace sigusr1_2 // ------------------------------------------------------------------------ // Tests for the "signal_holder" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(signal_holder_preserve); ATF_TEST_CASE_HEAD(signal_holder_preserve) { set_md_var("descr", "Tests that signal_holder preserves the original " "signal handler and restores it upon destruction"); } ATF_TEST_CASE_BODY(signal_holder_preserve) { using atf::atf_run::signal_holder; sigusr1::program(); sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1::happened); { signal_holder hld(SIGUSR1); ::kill(::getpid(), SIGUSR1); } sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1::happened); } ATF_TEST_CASE(signal_holder_destructor); ATF_TEST_CASE_HEAD(signal_holder_destructor) { set_md_var("descr", "Tests that signal_holder processes a pending " "signal upon destruction"); } ATF_TEST_CASE_BODY(signal_holder_destructor) { using atf::atf_run::signal_holder; sigusr1::program(); sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1::happened); { signal_holder hld(SIGUSR1); sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(!sigusr1::happened); } ATF_REQUIRE(sigusr1::happened); } ATF_TEST_CASE(signal_holder_process); ATF_TEST_CASE_HEAD(signal_holder_process) { set_md_var("descr", "Tests that signal_holder's process method works " "to process a delayed signal explicitly"); } ATF_TEST_CASE_BODY(signal_holder_process) { using atf::atf_run::signal_holder; sigusr1::program(); sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1::happened); { signal_holder hld(SIGUSR1); sigusr1::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(!sigusr1::happened); hld.process(); ATF_REQUIRE(sigusr1::happened); sigusr1::happened = false; } ATF_REQUIRE(!sigusr1::happened); } // ------------------------------------------------------------------------ // Tests for the "signal_programmer" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(signal_programmer_program); ATF_TEST_CASE_HEAD(signal_programmer_program) { set_md_var("descr", "Tests that signal_programmer correctly installs a " "handler"); } ATF_TEST_CASE_BODY(signal_programmer_program) { using atf::atf_run::signal_programmer; signal_programmer sp(SIGUSR1, sigusr1_2::handler); sigusr1_2::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1_2::happened); } ATF_TEST_CASE(signal_programmer_preserve); ATF_TEST_CASE_HEAD(signal_programmer_preserve) { set_md_var("descr", "Tests that signal_programmer uninstalls the " "handler during destruction"); } ATF_TEST_CASE_BODY(signal_programmer_preserve) { using atf::atf_run::signal_programmer; sigusr1::program(); sigusr1::happened = false; { signal_programmer sp(SIGUSR1, sigusr1_2::handler); sigusr1_2::happened = false; ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1_2::happened); } ATF_REQUIRE(!sigusr1::happened); ::kill(::getpid(), SIGUSR1); ATF_REQUIRE(sigusr1::happened); } // ------------------------------------------------------------------------ // Tests cases for the free functions. // ------------------------------------------------------------------------ static void reset_child(void *v ATF_DEFS_ATTRIBUTE_UNUSED) { sigusr1::program(); sigusr1::happened = false; atf::atf_run::reset(SIGUSR1); kill(::getpid(), SIGUSR1); if (sigusr1::happened) { std::cerr << "Signal was not resetted correctly\n"; std::abort(); } else { std::exit(EXIT_SUCCESS); } } ATF_TEST_CASE(reset); ATF_TEST_CASE_HEAD(reset) { set_md_var("descr", "Tests the reset function"); } ATF_TEST_CASE_BODY(reset) { atf::process::child c = atf::process::fork(reset_child, atf::process::stream_inherit(), atf::process::stream_inherit(), NULL); const atf::process::status s = c.wait(); ATF_REQUIRE(s.exited() || s.signaled()); ATF_REQUIRE(!s.signaled() || s.termsig() == SIGUSR1); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the "signal_holder" class. ATF_ADD_TEST_CASE(tcs, signal_holder_preserve); ATF_ADD_TEST_CASE(tcs, signal_holder_destructor); ATF_ADD_TEST_CASE(tcs, signal_holder_process); // Add the tests for the "signal_programmer" class. ATF_ADD_TEST_CASE(tcs, signal_programmer_program); ATF_ADD_TEST_CASE(tcs, signal_programmer_preserve); // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, reset); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/config_test.cpp0000644000470500017500000002421612271526120021743 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/test_helpers.hpp" #include "atf-c++/config.hpp" #include "atf-c++/macros.hpp" #include "config.hpp" namespace impl = atf::atf_run; namespace detail = atf::atf_run::detail; using atf::tests::vars_map; namespace atf { namespace config { void __reinit(void); } // namespace config } // namespace atf // ------------------------------------------------------------------------- // Tests for the "config" parser. // ------------------------------------------------------------------------- class config_reader : protected detail::atf_config_reader { void got_var(const std::string& name, const std::string& val) { m_calls.push_back("got_var(" + name + ", " + val + ")"); } void got_eof(void) { m_calls.push_back("got_eof()"); } public: config_reader(std::istream& is) : detail::atf_config_reader(is) { } void read(void) { atf_config_reader::read(); } std::vector< std::string > m_calls; }; ATF_TEST_CASE_WITHOUT_HEAD(config_1); ATF_TEST_CASE_BODY(config_1) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" ; const char* exp_calls[] = { "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_2); ATF_TEST_CASE_BODY(config_2) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "# This is a comment on a line of its own.\n" "# And this is another one.\n" "\n" " # Another after some whitespace.\n" "\n" "# The last one after an empty line.\n" ; const char* exp_calls[] = { "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_3); ATF_TEST_CASE_BODY(config_3) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "var1=value1\n" "var2 = value2\n" "var3 = value3\n" "var4 = value4\n" "\n" "var5=value5\n" " var6=value6\n" "\n" "var7 = \"This is a long value.\"\n" "var8 = \"Single-word\"\n" "var9 = \" Single-word \"\n" "var10 = Single-word\n" ; const char* exp_calls[] = { "got_var(var1, value1)", "got_var(var2, value2)", "got_var(var3, value3)", "got_var(var4, value4)", "got_var(var5, value5)", "got_var(var6, value6)", "got_var(var7, This is a long value.)", "got_var(var8, Single-word)", "got_var(var9, Single-word )", "got_var(var10, Single-word)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_4); ATF_TEST_CASE_BODY(config_4) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo = bar # A comment.\n" ; const char* exp_calls[] = { "got_var(foo, bar)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_50); ATF_TEST_CASE_BODY(config_50) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected equal sign", NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_51); ATF_TEST_CASE_BODY(config_51) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo bar\n" "baz\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `bar'; expected equal sign", "4: Unexpected token `<>'; expected equal sign", NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_52); ATF_TEST_CASE_BODY(config_52) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo =\n" "bar = # A comment.\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected word or quoted string", "4: Unexpected token `#'; expected word or quoted string", NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_53); ATF_TEST_CASE_BODY(config_53) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo = \"Correct value\" # With comment.\n" "\n" "bar = # A comment.\n" "\n" "baz = \"Last variable\"\n" "\n" "# End of file.\n" ; const char* exp_calls[] = { "got_var(foo, Correct value)", NULL }; const char* exp_errors[] = { "5: Unexpected token `#'; expected word or quoted string", NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(config_54); ATF_TEST_CASE_BODY(config_54) { const char* input = "Content-Type: application/X-atf-config; version=\"1\"\n" "\n" "foo = \"\n" "bar = \"text\n" "baz = \"te\\\"xt\n" "last = \"\\\"\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Missing double quotes before end of line", "4: Missing double quotes before end of line", "5: Missing double quotes before end of line", "6: Missing double quotes before end of line", NULL }; do_parser_test< config_reader >(input, exp_calls, exp_errors); } // ------------------------------------------------------------------------- // Tests for the free functions. // ------------------------------------------------------------------------- ATF_TEST_CASE(merge_configs_both_empty); ATF_TEST_CASE_HEAD(merge_configs_both_empty) {} ATF_TEST_CASE_BODY(merge_configs_both_empty) { vars_map lower, upper; ATF_REQUIRE(impl::merge_configs(lower, upper).empty()); } ATF_TEST_CASE(merge_configs_lower_empty); ATF_TEST_CASE_HEAD(merge_configs_lower_empty) {} ATF_TEST_CASE_BODY(merge_configs_lower_empty) { vars_map lower, upper; upper["var"] = "value"; vars_map merged = impl::merge_configs(lower, upper); ATF_REQUIRE_EQ("value", merged["var"]); } ATF_TEST_CASE(merge_configs_upper_empty); ATF_TEST_CASE_HEAD(merge_configs_upper_empty) {} ATF_TEST_CASE_BODY(merge_configs_upper_empty) { vars_map lower, upper; lower["var"] = "value"; vars_map merged = impl::merge_configs(lower, upper); ATF_REQUIRE_EQ("value", merged["var"]); } ATF_TEST_CASE(merge_configs_mixed); ATF_TEST_CASE_HEAD(merge_configs_mixed) {} ATF_TEST_CASE_BODY(merge_configs_mixed) { vars_map lower, upper; lower["var1"] = "value1"; lower["var2"] = "value2-l"; upper["var2"] = "value2-u"; upper["var3"] = "value3"; vars_map merged = impl::merge_configs(lower, upper); ATF_REQUIRE_EQ("value1", merged["var1"]); ATF_REQUIRE_EQ("value2-u", merged["var2"]); ATF_REQUIRE_EQ("value3", merged["var3"]); } ATF_TEST_CASE(read_config_files_none); ATF_TEST_CASE_HEAD(read_config_files_none) {} ATF_TEST_CASE_BODY(read_config_files_none) { atf::env::set("ATF_CONFDIR", "."); atf::config::__reinit(); ATF_REQUIRE(vars_map() == impl::read_config_files("test-suite")); } // ------------------------------------------------------------------------- // Main. // ------------------------------------------------------------------------- ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, config_1); ATF_ADD_TEST_CASE(tcs, config_2); ATF_ADD_TEST_CASE(tcs, config_3); ATF_ADD_TEST_CASE(tcs, config_4); ATF_ADD_TEST_CASE(tcs, config_50); ATF_ADD_TEST_CASE(tcs, config_51); ATF_ADD_TEST_CASE(tcs, config_52); ATF_ADD_TEST_CASE(tcs, config_53); ATF_ADD_TEST_CASE(tcs, config_54); ATF_ADD_TEST_CASE(tcs, merge_configs_both_empty); ATF_ADD_TEST_CASE(tcs, merge_configs_lower_empty); ATF_ADD_TEST_CASE(tcs, merge_configs_upper_empty); ATF_ADD_TEST_CASE(tcs, merge_configs_mixed); ATF_ADD_TEST_CASE(tcs, read_config_files_none); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/requirements_test.cpp0000644000470500017500000003473612271526120023231 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "atf-c++/config.hpp" #include "atf-c++/detail/text.hpp" #include "atf-c++/macros.hpp" #include "requirements.hpp" #include "user.hpp" namespace impl = atf::atf_run; // ------------------------------------------------------------------------- // Auxiliary functions. // ------------------------------------------------------------------------- namespace { const atf::tests::vars_map no_config; void do_check(const std::string& expected, const atf::tests::vars_map& metadata, const atf::tests::vars_map& config = no_config) { const std::string actual = impl::check_requirements(metadata, config); if (!atf::text::match(actual, expected)) ATF_FAIL("Requirements failure reason \"" + actual + "\" does not " "match \"" + expected + "\""); } } // anonymous namespace // ------------------------------------------------------------------------- // Tests for the require.arch metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE(require_arch_one_ok); ATF_TEST_CASE_HEAD(require_arch_one_ok) {} ATF_TEST_CASE_BODY(require_arch_one_ok) { atf::tests::vars_map metadata; metadata["require.arch"] = atf::config::get("atf_arch"); do_check("", metadata); } ATF_TEST_CASE(require_arch_one_fail); ATF_TEST_CASE_HEAD(require_arch_one_fail) {} ATF_TEST_CASE_BODY(require_arch_one_fail) { atf::tests::vars_map metadata; metadata["require.arch"] = "__fake_arch__"; do_check("Requires the '__fake_arch__' architecture", metadata); } ATF_TEST_CASE(require_arch_many_ok); ATF_TEST_CASE_HEAD(require_arch_many_ok) {} ATF_TEST_CASE_BODY(require_arch_many_ok) { atf::tests::vars_map metadata; metadata["require.arch"] = "__foo__ " + atf::config::get("atf_arch") + " __bar__"; do_check("", metadata); } ATF_TEST_CASE(require_arch_many_fail); ATF_TEST_CASE_HEAD(require_arch_many_fail) {} ATF_TEST_CASE_BODY(require_arch_many_fail) { atf::tests::vars_map metadata; metadata["require.arch"] = "__foo__ __bar__ __baz__"; do_check("Requires one of the '__foo__ __bar__ __baz__' architectures", metadata); } // ------------------------------------------------------------------------- // Tests for the require.config metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE(require_config_one_ok); ATF_TEST_CASE_HEAD(require_config_one_ok) {} ATF_TEST_CASE_BODY(require_config_one_ok) { atf::tests::vars_map metadata, config; metadata["require.config"] = "var1"; config["var1"] = "some-value"; do_check("", metadata, config); } ATF_TEST_CASE(require_config_one_fail); ATF_TEST_CASE_HEAD(require_config_one_fail) {} ATF_TEST_CASE_BODY(require_config_one_fail) { atf::tests::vars_map metadata, config; metadata["require.config"] = "var1"; do_check("Required configuration variable 'var1' not defined", metadata, config); } ATF_TEST_CASE(require_config_many_ok); ATF_TEST_CASE_HEAD(require_config_many_ok) {} ATF_TEST_CASE_BODY(require_config_many_ok) { atf::tests::vars_map metadata, config; metadata["require.config"] = "var1 var2 var3"; config["var1"] = "first-value"; config["var2"] = "second-value"; config["var3"] = "third-value"; do_check("", metadata, config); } ATF_TEST_CASE(require_config_many_fail); ATF_TEST_CASE_HEAD(require_config_many_fail) {} ATF_TEST_CASE_BODY(require_config_many_fail) { atf::tests::vars_map metadata, config; metadata["require.config"] = "var1 var2 var3"; config["var1"] = "first-value"; config["var3"] = "third-value"; do_check("Required configuration variable 'var2' not defined", metadata, config); } // ------------------------------------------------------------------------- // Tests for the require.files metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_ok); ATF_TEST_CASE_BODY(require_files_one_ok) { atf::tests::vars_map metadata; metadata["require.files"] = "/bin/ls"; do_check("", metadata); } ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_missing); ATF_TEST_CASE_BODY(require_files_one_missing) { atf::tests::vars_map metadata; metadata["require.files"] = "/non-existent/foo"; do_check("Required file '/non-existent/foo' not found", metadata); } ATF_TEST_CASE_WITHOUT_HEAD(require_files_one_fail); ATF_TEST_CASE_BODY(require_files_one_fail) { atf::tests::vars_map metadata; metadata["require.files"] = "/bin/cp this-is-relative"; ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(this-is-relative)", impl::check_requirements(metadata, no_config)); } ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_ok); ATF_TEST_CASE_BODY(require_files_many_ok) { atf::tests::vars_map metadata; metadata["require.files"] = "/bin/ls /bin/cp"; do_check("", metadata); } ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_missing); ATF_TEST_CASE_BODY(require_files_many_missing) { atf::tests::vars_map metadata; metadata["require.files"] = "/bin/ls /non-existent/bar /bin/cp"; do_check("Required file '/non-existent/bar' not found", metadata); } ATF_TEST_CASE_WITHOUT_HEAD(require_files_many_fail); ATF_TEST_CASE_BODY(require_files_many_fail) { atf::tests::vars_map metadata; metadata["require.files"] = "/bin/cp also-relative"; ATF_REQUIRE_THROW_RE(std::runtime_error, "Relative.*(also-relative)", impl::check_requirements(metadata, no_config)); } // ------------------------------------------------------------------------- // Tests for the require.machine metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE(require_machine_one_ok); ATF_TEST_CASE_HEAD(require_machine_one_ok) {} ATF_TEST_CASE_BODY(require_machine_one_ok) { atf::tests::vars_map metadata; metadata["require.machine"] = atf::config::get("atf_machine"); do_check("", metadata); } ATF_TEST_CASE(require_machine_one_fail); ATF_TEST_CASE_HEAD(require_machine_one_fail) {} ATF_TEST_CASE_BODY(require_machine_one_fail) { atf::tests::vars_map metadata; metadata["require.machine"] = "__fake_machine__"; do_check("Requires the '__fake_machine__' machine type", metadata); } ATF_TEST_CASE(require_machine_many_ok); ATF_TEST_CASE_HEAD(require_machine_many_ok) {} ATF_TEST_CASE_BODY(require_machine_many_ok) { atf::tests::vars_map metadata; metadata["require.machine"] = "__foo__ " + atf::config::get("atf_machine") + " __bar__"; do_check("", metadata); } ATF_TEST_CASE(require_machine_many_fail); ATF_TEST_CASE_HEAD(require_machine_many_fail) {} ATF_TEST_CASE_BODY(require_machine_many_fail) { atf::tests::vars_map metadata; metadata["require.machine"] = "__foo__ __bar__ __baz__"; do_check("Requires one of the '__foo__ __bar__ __baz__' machine types", metadata); } // ------------------------------------------------------------------------- // Tests for the require.memory metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE_WITHOUT_HEAD(require_memory_ok); ATF_TEST_CASE_BODY(require_memory_ok) { atf::tests::vars_map metadata; metadata["require.memory"] = "1m"; do_check("", metadata); } ATF_TEST_CASE_WITHOUT_HEAD(require_memory_not_enough); ATF_TEST_CASE_BODY(require_memory_not_enough) { atf::tests::vars_map metadata; metadata["require.memory"] = "128t"; #if defined(__APPLE__) || defined(__NetBSD__) do_check("Not enough memory; needed 140737488355328, available [0-9]*", metadata); #else skip("Don't know how to check for the amount of physical memory"); #endif } ATF_TEST_CASE_WITHOUT_HEAD(require_memory_fail); ATF_TEST_CASE_BODY(require_memory_fail) { atf::tests::vars_map metadata; metadata["require.memory"] = "foo"; ATF_REQUIRE_THROW(std::runtime_error, impl::check_requirements(metadata, no_config)); } // ------------------------------------------------------------------------- // Tests for the require.progs metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE(require_progs_one_ok); ATF_TEST_CASE_HEAD(require_progs_one_ok) {} ATF_TEST_CASE_BODY(require_progs_one_ok) { atf::tests::vars_map metadata; metadata["require.progs"] = "cp"; do_check("", metadata); } ATF_TEST_CASE(require_progs_one_missing); ATF_TEST_CASE_HEAD(require_progs_one_missing) {} ATF_TEST_CASE_BODY(require_progs_one_missing) { atf::tests::vars_map metadata; metadata["require.progs"] = "cp __non-existent__"; do_check("Required program '__non-existent__' not found in the PATH", metadata); } ATF_TEST_CASE(require_progs_one_fail); ATF_TEST_CASE_HEAD(require_progs_one_fail) {} ATF_TEST_CASE_BODY(require_progs_one_fail) { atf::tests::vars_map metadata; metadata["require.progs"] = "bin/cp"; ATF_REQUIRE_THROW(std::runtime_error, impl::check_requirements(metadata, no_config)); } ATF_TEST_CASE(require_progs_many_ok); ATF_TEST_CASE_HEAD(require_progs_many_ok) {} ATF_TEST_CASE_BODY(require_progs_many_ok) { atf::tests::vars_map metadata; metadata["require.progs"] = "cp ls mv"; do_check("", metadata); } ATF_TEST_CASE(require_progs_many_missing); ATF_TEST_CASE_HEAD(require_progs_many_missing) {} ATF_TEST_CASE_BODY(require_progs_many_missing) { atf::tests::vars_map metadata; metadata["require.progs"] = "mv ls __foo__ cp"; do_check("Required program '__foo__' not found in the PATH", metadata); } ATF_TEST_CASE(require_progs_many_fail); ATF_TEST_CASE_HEAD(require_progs_many_fail) {} ATF_TEST_CASE_BODY(require_progs_many_fail) { atf::tests::vars_map metadata; metadata["require.progs"] = "ls cp ../bin/cp"; ATF_REQUIRE_THROW(std::runtime_error, impl::check_requirements(metadata, no_config)); } // ------------------------------------------------------------------------- // Tests for the require.user metadata property. // ------------------------------------------------------------------------- ATF_TEST_CASE(require_user_root); ATF_TEST_CASE_HEAD(require_user_root) {} ATF_TEST_CASE_BODY(require_user_root) { atf::tests::vars_map metadata; metadata["require.user"] = "root"; if (atf::atf_run::is_root()) do_check("", metadata); else do_check("Requires root privileges", metadata); } ATF_TEST_CASE(require_user_unprivileged); ATF_TEST_CASE_HEAD(require_user_unprivileged) {} ATF_TEST_CASE_BODY(require_user_unprivileged) { atf::tests::vars_map metadata; metadata["require.user"] = "unprivileged"; if (atf::atf_run::is_root()) do_check("Requires an unprivileged user and the 'unprivileged-user' " "configuration variable is not set", metadata); else do_check("", metadata); } ATF_TEST_CASE(require_user_fail); ATF_TEST_CASE_HEAD(require_user_fail) {} ATF_TEST_CASE_BODY(require_user_fail) { atf::tests::vars_map metadata; metadata["require.user"] = "nobody"; ATF_REQUIRE_THROW(std::runtime_error, impl::check_requirements(metadata, no_config)); } // ------------------------------------------------------------------------- // Main. // ------------------------------------------------------------------------- ATF_INIT_TEST_CASES(tcs) { // Add test cases for require.arch. ATF_ADD_TEST_CASE(tcs, require_arch_one_ok); ATF_ADD_TEST_CASE(tcs, require_arch_one_fail); ATF_ADD_TEST_CASE(tcs, require_arch_many_ok); ATF_ADD_TEST_CASE(tcs, require_arch_many_fail); // Add test cases for require.config. ATF_ADD_TEST_CASE(tcs, require_config_one_ok); ATF_ADD_TEST_CASE(tcs, require_config_one_fail); ATF_ADD_TEST_CASE(tcs, require_config_many_ok); ATF_ADD_TEST_CASE(tcs, require_config_many_fail); // Add test cases for require.files. ATF_ADD_TEST_CASE(tcs, require_files_one_ok); ATF_ADD_TEST_CASE(tcs, require_files_one_missing); ATF_ADD_TEST_CASE(tcs, require_files_one_fail); ATF_ADD_TEST_CASE(tcs, require_files_many_ok); ATF_ADD_TEST_CASE(tcs, require_files_many_missing); ATF_ADD_TEST_CASE(tcs, require_files_many_fail); // Add test cases for require.machine. ATF_ADD_TEST_CASE(tcs, require_machine_one_ok); ATF_ADD_TEST_CASE(tcs, require_machine_one_fail); ATF_ADD_TEST_CASE(tcs, require_machine_many_ok); ATF_ADD_TEST_CASE(tcs, require_machine_many_fail); // Add test cases for require.memory. ATF_ADD_TEST_CASE(tcs, require_memory_ok); ATF_ADD_TEST_CASE(tcs, require_memory_not_enough); ATF_ADD_TEST_CASE(tcs, require_memory_fail); // Add test cases for require.progs. ATF_ADD_TEST_CASE(tcs, require_progs_one_ok); ATF_ADD_TEST_CASE(tcs, require_progs_one_missing); ATF_ADD_TEST_CASE(tcs, require_progs_one_fail); ATF_ADD_TEST_CASE(tcs, require_progs_many_ok); ATF_ADD_TEST_CASE(tcs, require_progs_many_missing); ATF_ADD_TEST_CASE(tcs, require_progs_many_fail); // Add test cases for require.user. ATF_ADD_TEST_CASE(tcs, require_user_root); ATF_ADD_TEST_CASE(tcs, require_user_unprivileged); ATF_ADD_TEST_CASE(tcs, require_user_fail); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/integration_test.sh0000644000470500017500000007632112271526120022655 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # create_atffile() { ATF_CONFDIR="$(pwd)"; export ATF_CONFDIR cat >Atffile <>Atffile done } create_helper() { cp $(atf_get_srcdir)/misc_helpers helper create_atffile helper TESTCASE=${1}; export TESTCASE } create_helper_stdin() { # TODO: This really, really, really must use real test programs. cat >${1} <>${1} [ ${cnt} -lt ${2} ] && echo "echo" >>${1} cnt=$((${cnt} + 1)) done cat >>${1} <>${1} } create_mount_helper() { cat >${1} <>${1} cat >>${1} <etc/common.conf <.conf." cat >etc/atf.conf <.atf/common.conf <.conf." cat >.atf/atf.conf <etc/common.conf <>Atffile atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \ "ATF_CONFDIR=$(pwd)/etc atf-run helper" echo "Checking that defining 'testvar' trough the configuration" \ "file overrides the one in the Atffile." mkdir etc cat >etc/common.conf <> Atffile atf_check -s eq:1 -o ignore -e ignore -x "ATF_CONFDIR=$(pwd)/etc atf-run" echo "Checking that defining 'testvar' in the correct Atffile works." echo 'conf: testvar = "a value"' >>dir/Atffile atf_check -s eq:0 -o match:'testvar: a value' -e ignore -x \ "ATF_CONFDIR=$(pwd)/etc atf-run" } atf_test_case fds fds_head() { atf_set "descr" "Tests that all streams are properly captured" } fds_body() { create_helper fds atf_check -s eq:0 \ -o match:'^tc-so:msg1 to stdout$' \ -o match:'^tc-so:msg2 to stdout$' \ -o match:'^tc-se:msg1 to stderr$' \ -o match:'^tc-se:msg2 to stderr$' \ -e empty atf-run } atf_test_case mux_streams mux_streams_head() { atf_set "descr" "Tests for a race condition in stream multiplexing" } mux_streams_body() { create_helper mux_streams for i in 1 2 3 4 5; do echo "Attempt ${i}" atf_check -s eq:0 -o match:'stdout 9999' -o match:'stderr 9999' atf-run done } atf_test_case expect expect_head() { atf_set "descr" "Tests the processing of test case results and the" \ "expect features" } expect_body() { ln -s "$(atf_get_srcdir)/expect_helpers" . create_atffile expect_helpers atf_check -s eq:1 \ -o match:'death_and_exit, expected_death' \ -o match:'death_and_signal, expected_death' \ -o match:'death_but_pass, failed' \ -o match:'exit_any_and_exit, expected_exit' \ -o match:'exit_but_pass, failed' \ -o match:'exit_code_and_exit, expected_exit' \ -o match:'fail_and_fail_check, expected_failure' \ -o match:'fail_and_fail_requirement, expected_failure' \ -o match:'fail_but_pass, failed' \ -o match:'pass_and_pass, passed' \ -o match:'pass_but_fail_check, failed' \ -o match:'pass_but_fail_requirement, failed' \ -o match:'signal_any_and_signal, expected_signal' \ -o match:'signal_but_pass, failed' \ -o match:'signal_no_and_signal, expected_signal' \ -o match:'timeout_and_hang, expected_timeout' \ -o match:'timeout_but_pass, failed' \ -e empty atf-run } atf_test_case missing_results missing_results_head() { atf_set "descr" "Ensures that atf-run correctly handles test cases that " \ "do not create the results file" } missing_results_body() { create_helper_stdin helper 1 <\${resfile} echo 'line 2' >>\${resfile} exit 0 EOF chmod +x helper create_atffile helper re='^tc-end: [0-9][0-9]*\.[0-9]*, tc1,' atf_check -s eq:1 -o match:"${re} .*line 1.*line 2" -e empty atf-run } atf_test_case broken_tp_list broken_tp_list_head() { atf_set "descr" "Ensures that atf-run reports test programs that" \ "provide a bogus test case list" } broken_tp_list_body() { cat >helper <\${resfile} exit 0 EOF chmod +x helper create_atffile helper re='^tc-end: [0-9][0-9]*\.[0-9]*, tc1,' atf_check -s eq:1 \ -o match:"${re} .*exited successfully.*reported failure" \ -e empty atf-run } atf_test_case signaled signaled_head() { atf_set "descr" "Ensures that atf-run reports test program's crashes" \ "correctly regardless of their actual results" } signaled_body() { create_helper_stdin helper 2 <\${resfile} case \${testcase} in tc1) ;; tc2) echo "Killing myself!" ; kill -9 \$\$ ;; esac EOF chmod +x helper create_atffile helper re='^tc-end: [0-9][0-9]*\.[0-9]*, tc2,' atf_check -s eq:1 -o match:"${re} .*received signal 9" \ -e empty atf-run } atf_test_case hooks hooks_head() { atf_set "descr" "Checks that the default hooks work and that they" \ "can be overriden by the user" } hooks_body() { cp $(atf_get_srcdir)/pass_helper helper create_atffile helper mkdir atf mkdir .atf echo "Checking default hooks" atf_check -s eq:0 -o match:'^info: time.start, ' \ -o match:'^info: time.end, ' -e empty -x \ "ATF_CONFDIR=$(pwd)/atf atf-run" echo "Checking the system-wide info_start hook" cat >atf/atf-run.hooks <.atf/atf-run.hooks <atf/atf-run.hooks <.atf/atf-run.hooks <\${ROOT} mkdir foo mkdir foo/bar mkdir foo/bar/mnt do_mount foo/bar/mnt mkdir foo/baz do_mount foo/baz mkdir foo/baz/foo mkdir foo/baz/foo/bar do_mount foo/baz/foo/bar EOF create_atffile helper chmod +x helper platform=$(uname) case ${platform} in Linux|FreeBSD|NetBSD|SunOS) ;; *) # XXX Possibly specify in meta-data too. atf_skip "Test unimplemented in this platform (${platform})" ;; esac atf_check -s eq:0 -o match:"main, passed" -e ignore atf-run helper mount | grep $(cat root) && atf_fail "Some file systems remain mounted" atf_check -s eq:1 -o empty -e empty test -d $(cat root)/foo } atf_test_case cleanup_symlink cleanup_symlink_head() { atf_set "descr" "Tests that the removal algorithm does not follow" \ "symlinks, which may live in another device and thus" \ "be treated as mount points" atf_set "require.user" "root" } cleanup_symlink_body() { ROOT="$(pwd)/root"; export ROOT create_mount_helper helper <\${ROOT} atf_check -s eq:0 -o empty -e empty mkdir foo atf_check -s eq:0 -o empty -e empty mkdir foo/bar do_mount foo/bar atf_check -s eq:0 -o empty -e empty touch a atf_check -s eq:0 -o empty -e empty ln -s "\$(pwd)/a" foo/bar EOF create_atffile helper chmod +x helper platform=$(uname) case ${platform} in Linux|FreeBSD|NetBSD|SunOS) ;; *) # XXX Possibly specify in meta-data too. atf_skip "Test unimplemented in this platform (${platform})" ;; esac atf_check -s eq:0 -o match:"main, passed" -e ignore atf-run helper mount | grep $(cat root) && atf_fail "Some file systems remain mounted" atf_check -s eq:1 -o empty -e empty test -d $(cat root)/foo } atf_test_case require_arch require_arch_head() { atf_set "descr" "Tests that atf-run validates the require.arch property" } require_arch_body() { create_helper require_arch create_atffile helper echo "Checking for the real architecture" arch=$(atf-config -t atf_arch) atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="${arch}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="foo ${arch}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="${arch} foo" helper echo "Checking for a fictitious architecture" arch=fictitious export ATF_ARCH=fictitious atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="${arch}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="foo ${arch}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v arch="${arch} foo" helper echo "Triggering some failures" atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*foo.*architecture" \ -e ignore atf-run -v arch="foo" helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*foo bar.*architectures" -e ignore \ atf-run -v arch="foo bar" helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*fictitiousxxx.*architecture" \ -e ignore atf-run -v arch="${arch}xxx" helper } atf_test_case require_config require_config_head() { atf_set "descr" "Tests that atf-run validates the require.config property" } require_config_body() { create_helper require_config create_atffile helper atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*var1.*not defined" \ -e ignore atf-run helper atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*var2.*not defined" \ -e ignore atf-run -v var1=foo helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v var1=a -v var2=' ' helper } atf_test_case require_files require_files_head() { atf_set "descr" "Tests that atf-run validates the require.files property" } require_files_body() { create_helper require_files create_atffile helper touch i-exist echo "Checking absolute paths" atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v files='/bin/cp' helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v files="$(pwd)/i-exist" helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*/dont-exist" \ -e ignore atf-run -v files="$(pwd)/i-exist $(pwd)/dont-exist" helper echo "Checking that relative paths are not allowed" atf_check -s eq:1 \ -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*hello" \ -e ignore atf-run -v files='hello' helper atf_check -s eq:1 \ -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*a/b" \ -e ignore atf-run -v files='a/b' helper } atf_test_case require_machine require_machine_head() { atf_set "descr" "Tests that atf-run validates the require.machine property" } require_machine_body() { create_helper require_machine create_atffile helper echo "Checking for the real machine type" machine=$(atf-config -t atf_machine) atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="${machine}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="foo ${machine}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="${machine} foo" helper echo "Checking for a fictitious machine type" machine=fictitious export ATF_MACHINE=fictitious atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="${machine}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="foo ${machine}" helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v machine="${machine} foo" helper echo "Triggering some failures" atf_check -s eq:0 -o match:"${TESTCASE}, skipped, .*foo.*machine type" \ -e ignore atf-run -v machine="foo" helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*foo bar.*machine types" -e ignore \ atf-run -v machine="foo bar" helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*fictitiousxxx.*machine type" \ -e ignore atf-run -v machine="${machine}xxx" helper } atf_test_case require_progs require_progs_head() { atf_set "descr" "Tests that atf-run validates the require.progs property" } require_progs_body() { create_helper require_progs create_atffile helper echo "Checking absolute paths" atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v progs='/bin/cp' helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*/bin/__non-existent__.*PATH" \ -e ignore atf-run -v progs='/bin/__non-existent__' helper echo "Checking that relative paths are not allowed" atf_check -s eq:1 \ -o match:"${TESTCASE}, failed, Relative paths.*not allowed.*bin/cp" \ -e ignore atf-run -v progs='bin/cp' helper echo "Check plain file names, searching them in the PATH." atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v progs='cp' helper atf_check -s eq:0 \ -o match:"${TESTCASE}, skipped, .*__non-existent__.*PATH" -e ignore \ atf-run -v progs='__non-existent__' helper } atf_test_case require_user_root require_user_root_head() { atf_set "descr" "Tests that atf-run validates the require.user property" \ "when it is set to 'root'" } require_user_root_body() { create_helper require_user create_atffile helper if [ $(id -u) -eq 0 ]; then exp=passed else exp=skipped fi atf_check -s eq:0 -o match:"${TESTCASE}, ${exp}" -e ignore atf-run \ -v user=root helper } atf_test_case require_user_unprivileged require_user_unprivileged_head() { atf_set "descr" "Tests that atf-run validates the require.user property" \ "when it is set to 'root'" } require_user_unprivileged_body() { create_helper require_user create_atffile helper if [ $(id -u) -eq 0 ]; then exp=skipped else exp=passed fi atf_check -s eq:0 -o match:"${TESTCASE}, ${exp}" -e ignore atf-run \ -v user=unprivileged helper } atf_test_case require_user_bad require_user_bad_head() { atf_set "descr" "Tests that atf-run validates the require.user property" \ "when it is set to 'root'" } require_user_bad_body() { create_helper require_user create_atffile helper atf_check -s eq:1 -o match:"${TESTCASE}, failed, Invalid value.*foobar" \ -e ignore atf-run -v user=foobar helper } atf_test_case timeout timeout_head() { atf_set "descr" "Tests that atf-run kills a test case that times out" } timeout_body() { create_helper timeout create_atffile helper atf_check -s eq:1 \ -o match:"${TESTCASE}, failed, .*timed out after 1 second" -e ignore \ atf-run -v statedir=$(pwd) helper if [ -f finished ]; then atf_fail "Test case was not killed after time out" fi } atf_test_case timeout_forkexit timeout_forkexit_head() { atf_set "descr" "Tests that atf-run deals gracefully with a test program" \ "that forks, exits, but the child process hangs" } timeout_forkexit_body() { create_helper timeout_forkexit create_atffile helper atf_check -s eq:0 -o match:"${TESTCASE}, passed" -e ignore atf-run \ -v statedir=$(pwd) helper test -f parent-finished || atf_fail "Parent did not exit as expected" test -f child-finished && atf_fail "Subprocess exited but it should have" \ "been forcibly terminated" || true } atf_test_case ignore_deprecated_use_fs ignore_deprecated_use_fs_head() { atf_set "descr" "Tests that atf-run ignores the deprecated use.fs property" } ignore_deprecated_use_fs_body() { create_helper use_fs create_atffile helper atf_check -s eq:0 -o ignore -e ignore atf-run helper } atf_init_test_cases() { atf_add_test_case no_warnings atf_add_test_case config atf_add_test_case vflag atf_add_test_case atffile atf_add_test_case atffile_recursive atf_add_test_case expect atf_add_test_case fds atf_add_test_case mux_streams atf_add_test_case missing_results atf_add_test_case broken_results atf_add_test_case broken_tp_list atf_add_test_case zero_tcs atf_add_test_case exit_codes atf_add_test_case signaled atf_add_test_case hooks atf_add_test_case isolation_env atf_add_test_case isolation_home atf_add_test_case isolation_stdin atf_add_test_case isolation_umask atf_add_test_case cleanup_pass atf_add_test_case cleanup_fail atf_add_test_case cleanup_skip atf_add_test_case cleanup_curdir atf_add_test_case cleanup_signal atf_add_test_case cleanup_mount atf_add_test_case cleanup_symlink atf_add_test_case require_arch atf_add_test_case require_config atf_add_test_case require_files atf_add_test_case require_machine atf_add_test_case require_progs atf_add_test_case require_user_root atf_add_test_case require_user_unprivileged atf_add_test_case require_user_bad atf_add_test_case timeout atf_add_test_case timeout_forkexit atf_add_test_case ignore_deprecated_use_fs } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-run/test-program.cpp0000644000470500017500000006017712271526120022071 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include #include #include } #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/process.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" #include "config.hpp" #include "fs.hpp" #include "io.hpp" #include "requirements.hpp" #include "signals.hpp" #include "test-program.hpp" #include "timer.hpp" #include "user.hpp" namespace impl = atf::atf_run; namespace detail = atf::atf_run::detail; namespace { static void check_stream(std::ostream& os) { // If we receive a signal while writing to the stream, the bad bit gets set. // Things seem to behave fine afterwards if we clear such error condition. // However, I'm not sure if it's safe to query errno at this point. if (os.bad()) { if (errno == EINTR) os.clear(); else throw std::runtime_error("Failed"); } } namespace atf_tp { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type text_type = 2; static const atf::parser::token_type colon_type = 3; static const atf::parser::token_type dblquote_type = 4; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, size_t curline) : atf::parser::tokenizer< std::istream > (is, true, eof_type, nl_type, text_type, curline) { add_delim(':', colon_type); add_quote('"', dblquote_type); } }; } // namespace atf_tp class metadata_reader : public detail::atf_tp_reader { impl::test_cases_map m_tcs; void got_tc(const std::string& ident, const atf::tests::vars_map& props) { if (m_tcs.find(ident) != m_tcs.end()) throw(std::runtime_error("Duplicate test case " + ident + " in test program")); m_tcs[ident] = props; if (m_tcs[ident].find("has.cleanup") == m_tcs[ident].end()) m_tcs[ident].insert(std::make_pair("has.cleanup", "false")); if (m_tcs[ident].find("timeout") == m_tcs[ident].end()) m_tcs[ident].insert(std::make_pair("timeout", "300")); } public: metadata_reader(std::istream& is) : detail::atf_tp_reader(is) { } const impl::test_cases_map& get_tcs(void) const { return m_tcs; } }; struct get_metadata_params { const atf::fs::path& executable; const atf::tests::vars_map& config; get_metadata_params(const atf::fs::path& p_executable, const atf::tests::vars_map& p_config) : executable(p_executable), config(p_config) { } }; struct test_case_params { const atf::fs::path& executable; const std::string& test_case_name; const std::string& test_case_part; const atf::tests::vars_map& metadata; const atf::tests::vars_map& config; const atf::fs::path& resfile; const atf::fs::path& workdir; test_case_params(const atf::fs::path& p_executable, const std::string& p_test_case_name, const std::string& p_test_case_part, const atf::tests::vars_map& p_metadata, const atf::tests::vars_map& p_config, const atf::fs::path& p_resfile, const atf::fs::path& p_workdir) : executable(p_executable), test_case_name(p_test_case_name), test_case_part(p_test_case_part), metadata(p_metadata), config(p_config), resfile(p_resfile), workdir(p_workdir) { } }; static std::string generate_timestamp(void) { struct timeval tv; if (gettimeofday(&tv, NULL) == -1) return "0.0"; char buf[32]; const int len = snprintf(buf, sizeof(buf), "%ld.%ld", static_cast< long >(tv.tv_sec), static_cast< long >(tv.tv_usec)); if (len >= static_cast< int >(sizeof(buf)) || len < 0) return "0.0"; else return buf; } static void append_to_vector(std::vector< std::string >& v1, const std::vector< std::string >& v2) { std::copy(v2.begin(), v2.end(), std::back_insert_iterator< std::vector< std::string > >(v1)); } static char** vector_to_argv(const std::vector< std::string >& v) { char** argv = new char*[v.size() + 1]; for (std::vector< std::string >::size_type i = 0; i < v.size(); i++) { argv[i] = strdup(v[i].c_str()); } argv[v.size()] = NULL; return argv; } static void exec_or_exit(const atf::fs::path& executable, const std::vector< std::string >& argv) { // This leaks memory in case of a failure, but it is OK. Exiting will // do the necessary cleanup. char* const* native_argv = vector_to_argv(argv); ::execv(executable.c_str(), native_argv); const std::string message = "Failed to execute '" + executable.str() + "': " + std::strerror(errno) + "\n"; if (::write(STDERR_FILENO, message.c_str(), message.length()) == -1) std::abort(); std::exit(EXIT_FAILURE); } static std::vector< std::string > config_to_args(const atf::tests::vars_map& config) { std::vector< std::string > args; for (atf::tests::vars_map::const_iterator iter = config.begin(); iter != config.end(); iter++) args.push_back("-v" + (*iter).first + "=" + (*iter).second); return args; } static void silence_stdin(void) { ::close(STDIN_FILENO); int fd = ::open("/dev/null", O_RDONLY); if (fd == -1) throw std::runtime_error("Could not open /dev/null"); INV(fd == STDIN_FILENO); } static void prepare_child(const atf::fs::path& workdir) { const int ret = ::setpgid(::getpid(), 0); INV(ret != -1); ::umask(S_IWGRP | S_IWOTH); for (int i = 1; i <= impl::last_signo; i++) impl::reset(i); atf::env::set("HOME", workdir.str()); atf::env::unset("LANG"); atf::env::unset("LC_ALL"); atf::env::unset("LC_COLLATE"); atf::env::unset("LC_CTYPE"); atf::env::unset("LC_MESSAGES"); atf::env::unset("LC_MONETARY"); atf::env::unset("LC_NUMERIC"); atf::env::unset("LC_TIME"); atf::env::set("TZ", "UTC"); atf::env::set("__RUNNING_INSIDE_ATF_RUN", "internal-yes-value"); impl::change_directory(workdir); silence_stdin(); } static void get_metadata_child(void* raw_params) { const get_metadata_params* params = static_cast< const get_metadata_params* >(raw_params); std::vector< std::string > argv; argv.push_back(params->executable.leaf_name()); argv.push_back("-l"); argv.push_back("-s" + params->executable.branch_path().str()); append_to_vector(argv, config_to_args(params->config)); exec_or_exit(params->executable, argv); } void run_test_case_child(void* raw_params) { const test_case_params* params = static_cast< const test_case_params* >(raw_params); const std::pair< int, int > user = impl::get_required_user( params->metadata, params->config); if (user.first != -1 && user.second != -1) impl::drop_privileges(user); // The input 'tp' parameter may be relative and become invalid once // we change the current working directory. const atf::fs::path absolute_executable = params->executable.to_absolute(); // Prepare the test program's arguments. We use dynamic memory and // do not care to release it. We are going to die anyway very soon, // either due to exec(2) or to exit(3). std::vector< std::string > argv; argv.push_back(absolute_executable.leaf_name()); argv.push_back("-r" + params->resfile.str()); argv.push_back("-s" + absolute_executable.branch_path().str()); append_to_vector(argv, config_to_args(params->config)); argv.push_back(params->test_case_name + ":" + params->test_case_part); prepare_child(params->workdir); exec_or_exit(absolute_executable, argv); } static void tokenize_result(const std::string& line, std::string& out_state, std::string& out_arg, std::string& out_reason) { const std::string::size_type pos = line.find_first_of(":("); if (pos == std::string::npos) { out_state = line; out_arg = ""; out_reason = ""; } else if (line[pos] == ':') { out_state = line.substr(0, pos); out_arg = ""; out_reason = atf::text::trim(line.substr(pos + 1)); } else if (line[pos] == '(') { const std::string::size_type pos2 = line.find("):", pos); if (pos2 == std::string::npos) throw std::runtime_error("Invalid test case result '" + line + "': unclosed optional argument"); out_state = line.substr(0, pos); out_arg = line.substr(pos + 1, pos2 - pos - 1); out_reason = atf::text::trim(line.substr(pos2 + 2)); } else UNREACHABLE; } static impl::test_case_result handle_result(const std::string& state, const std::string& arg, const std::string& reason) { PRE(state == "passed"); if (!arg.empty() || !reason.empty()) throw std::runtime_error("The test case result '" + state + "' cannot " "be accompanied by a reason nor an expected value"); return impl::test_case_result(state, -1, reason); } static impl::test_case_result handle_result_with_reason(const std::string& state, const std::string& arg, const std::string& reason) { PRE(state == "expected_death" || state == "expected_failure" || state == "expected_timeout" || state == "failed" || state == "skipped"); if (!arg.empty() || reason.empty()) throw std::runtime_error("The test case result '" + state + "' must " "be accompanied by a reason but not by an expected value"); return impl::test_case_result(state, -1, reason); } static impl::test_case_result handle_result_with_reason_and_arg(const std::string& state, const std::string& arg, const std::string& reason) { PRE(state == "expected_exit" || state == "expected_signal"); if (reason.empty()) throw std::runtime_error("The test case result '" + state + "' must " "be accompanied by a reason"); int value; if (arg.empty()) { value = -1; } else { try { value = atf::text::to_type< int >(arg); } catch (const std::runtime_error&) { throw std::runtime_error("The value '" + arg + "' passed to the '" + state + "' state must be an integer"); } } return impl::test_case_result(state, value, reason); } } // anonymous namespace detail::atf_tp_reader::atf_tp_reader(std::istream& is) : m_is(is) { } detail::atf_tp_reader::~atf_tp_reader(void) { } void detail::atf_tp_reader::got_tc( const std::string& ident ATF_DEFS_ATTRIBUTE_UNUSED, const std::map< std::string, std::string >& md ATF_DEFS_ATTRIBUTE_UNUSED) { } void detail::atf_tp_reader::got_eof(void) { } void detail::atf_tp_reader::validate_and_insert(const std::string& name, const std::string& value, const size_t lineno, std::map< std::string, std::string >& md) { using atf::parser::parse_error; if (value.empty()) throw parse_error(lineno, "The value for '" + name +"' cannot be " "empty"); const std::string ident_regex = "^[_A-Za-z0-9]+$"; const std::string integer_regex = "^[0-9]+$"; if (name == "descr") { // Any non-empty value is valid. } else if (name == "has.cleanup") { try { (void)atf::text::to_bool(value); } catch (const std::runtime_error&) { throw parse_error(lineno, "The has.cleanup property requires a" " boolean value"); } } else if (name == "ident") { if (!atf::text::match(value, ident_regex)) throw parse_error(lineno, "The identifier must match " + ident_regex + "; was '" + value + "'"); } else if (name == "require.arch") { } else if (name == "require.config") { } else if (name == "require.files") { } else if (name == "require.machine") { } else if (name == "require.memory") { try { (void)atf::text::to_bytes(value); } catch (const std::runtime_error&) { throw parse_error(lineno, "The require.memory property requires an " "integer value representing an amount of bytes"); } } else if (name == "require.progs") { } else if (name == "require.user") { } else if (name == "timeout") { if (!atf::text::match(value, integer_regex)) throw parse_error(lineno, "The timeout property requires an integer" " value"); } else if (name == "use.fs") { // Deprecated; ignore it. } else if (name.size() > 2 && name[0] == 'X' && name[1] == '-') { // Any non-empty value is valid. } else { throw parse_error(lineno, "Unknown property '" + name + "'"); } md.insert(std::make_pair(name, value)); } void detail::atf_tp_reader::read(void) { using atf::parser::parse_error; using namespace atf_tp; std::pair< size_t, atf::parser::headers_map > hml = atf::parser::read_headers(m_is, 1); atf::parser::validate_content_type(hml.second, "application/X-atf-tp", 1); tokenizer tkz(m_is, hml.first); atf::parser::parser< tokenizer > p(tkz); try { atf::parser::token t = p.expect(text_type, "property name"); if (t.text() != "ident") throw parse_error(t.lineno(), "First property of a test case " "must be 'ident'"); std::map< std::string, std::string > props; do { const std::string name = t.text(); t = p.expect(colon_type, "`:'"); const std::string value = atf::text::trim(p.rest_of_line()); t = p.expect(nl_type, "new line"); validate_and_insert(name, value, t.lineno(), props); t = p.expect(eof_type, nl_type, text_type, "property name, new " "line or eof"); if (t.type() == nl_type || t.type() == eof_type) { const std::map< std::string, std::string >::const_iterator iter = props.find("ident"); if (iter == props.end()) throw parse_error(t.lineno(), "Test case definition did " "not define an 'ident' property"); ATF_PARSER_CALLBACK(p, got_tc((*iter).second, props)); props.clear(); if (t.type() == nl_type) { t = p.expect(text_type, "property name"); if (t.text() != "ident") throw parse_error(t.lineno(), "First property of a " "test case must be 'ident'"); } } } while (t.type() != eof_type); ATF_PARSER_CALLBACK(p, got_eof()); } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } impl::test_case_result detail::parse_test_case_result(const std::string& line) { std::string state, arg, reason; tokenize_result(line, state, arg, reason); if (state == "expected_death") return handle_result_with_reason(state, arg, reason); else if (state.compare(0, 13, "expected_exit") == 0) return handle_result_with_reason_and_arg(state, arg, reason); else if (state.compare(0, 16, "expected_failure") == 0) return handle_result_with_reason(state, arg, reason); else if (state.compare(0, 15, "expected_signal") == 0) return handle_result_with_reason_and_arg(state, arg, reason); else if (state.compare(0, 16, "expected_timeout") == 0) return handle_result_with_reason(state, arg, reason); else if (state == "failed") return handle_result_with_reason(state, arg, reason); else if (state == "passed") return handle_result(state, arg, reason); else if (state == "skipped") return handle_result_with_reason(state, arg, reason); else throw std::runtime_error("Unknown test case result type in: " + line); } impl::atf_tps_writer::atf_tps_writer(std::ostream& os) : m_os(os) { atf::parser::headers_map hm; atf::parser::attrs_map ct_attrs; ct_attrs["version"] = "3"; hm["Content-Type"] = atf::parser::header_entry("Content-Type", "application/X-atf-tps", ct_attrs); atf::parser::write_headers(hm, m_os); } void impl::atf_tps_writer::info(const std::string& what, const std::string& val) { m_os << "info: " << what << ", " << val << "\n"; m_os.flush(); } void impl::atf_tps_writer::ntps(size_t p_ntps) { m_os << "tps-count: " << p_ntps << "\n"; m_os.flush(); } void impl::atf_tps_writer::start_tp(const std::string& tp, size_t ntcs) { m_tpname = tp; m_os << "tp-start: " << generate_timestamp() << ", " << tp << ", " << ntcs << "\n"; m_os.flush(); } void impl::atf_tps_writer::end_tp(const std::string& reason) { PRE(reason.find('\n') == std::string::npos); if (reason.empty()) m_os << "tp-end: " << generate_timestamp() << ", " << m_tpname << "\n"; else m_os << "tp-end: " << generate_timestamp() << ", " << m_tpname << ", " << reason << "\n"; m_os.flush(); } void impl::atf_tps_writer::start_tc(const std::string& tcname) { m_tcname = tcname; m_os << "tc-start: " << generate_timestamp() << ", " << tcname << "\n"; m_os.flush(); } void impl::atf_tps_writer::stdout_tc(const std::string& line) { m_os << "tc-so:" << line << "\n"; check_stream(m_os); m_os.flush(); check_stream(m_os); } void impl::atf_tps_writer::stderr_tc(const std::string& line) { m_os << "tc-se:" << line << "\n"; check_stream(m_os); m_os.flush(); check_stream(m_os); } void impl::atf_tps_writer::end_tc(const std::string& state, const std::string& reason) { std::string str = ", " + m_tcname + ", " + state; if (!reason.empty()) str += ", " + reason; m_os << "tc-end: " << generate_timestamp() << str << "\n"; m_os.flush(); } impl::metadata impl::get_metadata(const atf::fs::path& executable, const atf::tests::vars_map& config) { get_metadata_params params(executable, config); atf::process::child child = atf::process::fork(get_metadata_child, atf::process::stream_capture(), atf::process::stream_inherit(), static_cast< void * >(¶ms)); impl::pistream outin(child.stdout_fd()); metadata_reader parser(outin); parser.read(); const atf::process::status status = child.wait(); if (!status.exited() || status.exitstatus() != EXIT_SUCCESS) throw atf::parser::format_error("Test program returned failure " "exit status for test case list"); return metadata(parser.get_tcs()); } impl::test_case_result impl::read_test_case_result(const atf::fs::path& results_path) { std::ifstream results_file(results_path.c_str()); if (!results_file) throw std::runtime_error("Failed to open " + results_path.str()); std::string line, extra_line; std::getline(results_file, line); if (!results_file.good()) throw std::runtime_error("Results file is empty"); while (std::getline(results_file, extra_line).good()) line += "<>" + extra_line; results_file.close(); return detail::parse_test_case_result(line); } namespace { static volatile bool terminate_poll; static void sigchld_handler(const int signo ATF_DEFS_ATTRIBUTE_UNUSED) { terminate_poll = true; } class child_muxer : public impl::muxer { impl::atf_tps_writer& m_writer; void line_callback(const size_t index, const std::string& line) { switch (index) { case 0: m_writer.stdout_tc(line); break; case 1: m_writer.stderr_tc(line); break; default: UNREACHABLE; } } public: child_muxer(const int* fds, const size_t nfds, impl::atf_tps_writer& writer) : muxer(fds, nfds), m_writer(writer) { } }; } // anonymous namespace std::pair< std::string, atf::process::status > impl::run_test_case(const atf::fs::path& executable, const std::string& test_case_name, const std::string& test_case_part, const atf::tests::vars_map& metadata, const atf::tests::vars_map& config, const atf::fs::path& resfile, const atf::fs::path& workdir, atf_tps_writer& writer) { // TODO: Capture termination signals and deliver them to the subprocess // instead. Or maybe do something else; think about it. test_case_params params(executable, test_case_name, test_case_part, metadata, config, resfile, workdir); atf::process::child child = atf::process::fork(run_test_case_child, atf::process::stream_capture(), atf::process::stream_capture(), static_cast< void * >(¶ms)); terminate_poll = false; const atf::tests::vars_map::const_iterator iter = metadata.find("timeout"); INV(iter != metadata.end()); const unsigned int timeout = atf::text::to_type< unsigned int >((*iter).second); const pid_t child_pid = child.pid(); // Get the input stream of stdout and stderr. impl::file_handle outfh = child.stdout_fd(); impl::file_handle errfh = child.stderr_fd(); bool timed_out = false; // Process the test case's output and multiplex it into our output // stream as we read it. int fds[2] = {outfh.get(), errfh.get()}; child_muxer mux(fds, 2, writer); try { child_timer timeout_timer(timeout, child_pid, terminate_poll); signal_programmer sigchld(SIGCHLD, sigchld_handler); mux.mux(terminate_poll); timed_out = timeout_timer.fired(); } catch (...) { UNREACHABLE; } ::killpg(child_pid, SIGKILL); mux.flush(); atf::process::status status = child.wait(); std::string reason; if (timed_out) { // Don't assume the child process has been signaled due to the timeout // expiration as older versions did. The child process may have exited // but we may have timed out due to a subchild process getting stuck. reason = "Test case timed out after " + atf::text::to_string(timeout) + " " + (timeout == 1 ? "second" : "seconds"); } return std::make_pair(reason, status); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/requirements.cpp0000644000470500017500000002341712271526120022164 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include extern "C" { #include "atf-c/defs.h" } #include "atf-c++/config.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" #include "requirements.hpp" #include "user.hpp" namespace impl = atf::atf_run; namespace { static bool has_program(const atf::fs::path& program) { bool found = false; if (program.is_absolute()) { found = atf::fs::is_executable(program); } else { if (program.str().find('/') != std::string::npos) throw std::runtime_error("Relative paths are not allowed " "when searching for a program (" + program.str() + ")"); const std::vector< std::string > dirs = atf::text::split( atf::env::get("PATH"), ":"); for (std::vector< std::string >::const_iterator iter = dirs.begin(); !found && iter != dirs.end(); iter++) { const atf::fs::path& p = atf::fs::path(*iter) / program; if (atf::fs::is_executable(p)) found = true; } } return found; } static std::string check_arch(const std::string& arches) { const std::vector< std::string > v = atf::text::split(arches, " "); for (std::vector< std::string >::const_iterator iter = v.begin(); iter != v.end(); iter++) { if ((*iter) == atf::config::get("atf_arch")) return ""; } if (v.size() == 1) return "Requires the '" + arches + "' architecture"; else return "Requires one of the '" + arches + "' architectures"; } static std::string check_config(const std::string& variables, const atf::tests::vars_map& config) { const std::vector< std::string > v = atf::text::split(variables, " "); for (std::vector< std::string >::const_iterator iter = v.begin(); iter != v.end(); iter++) { if (config.find((*iter)) == config.end()) return "Required configuration variable '" + (*iter) + "' not " "defined"; } return ""; } static std::string check_files(const std::string& progs) { const std::vector< std::string > v = atf::text::split(progs, " "); for (std::vector< std::string >::const_iterator iter = v.begin(); iter != v.end(); iter++) { const atf::fs::path file(*iter); if (!file.is_absolute()) throw std::runtime_error("Relative paths are not allowed when " "checking for a required file (" + file.str() + ")"); if (!atf::fs::exists(file)) return "Required file '" + file.str() + "' not found"; } return ""; } static std::string check_machine(const std::string& machines) { const std::vector< std::string > v = atf::text::split(machines, " "); for (std::vector< std::string >::const_iterator iter = v.begin(); iter != v.end(); iter++) { if ((*iter) == atf::config::get("atf_machine")) return ""; } if (v.size() == 1) return "Requires the '" + machines + "' machine type"; else return "Requires one of the '" + machines + "' machine types"; } #if defined(__APPLE__) || defined(__NetBSD__) static std::string check_memory_sysctl(const int64_t needed, const char* sysctl_variable) { int64_t available; std::size_t available_length = sizeof(available); if (::sysctlbyname(sysctl_variable, &available, &available_length, NULL, 0) == -1) { const char* e = std::strerror(errno); return "Failed to get sysctl(hw.usermem64) value: " + std::string(e); } if (available < needed) { return "Not enough memory; needed " + atf::text::to_string(needed) + ", available " + atf::text::to_string(available); } else return ""; } # if defined(__APPLE__) static std::string check_memory_darwin(const int64_t needed) { return check_memory_sysctl(needed, "hw.usermem"); } # elif defined(__NetBSD__) static std::string check_memory_netbsd(const int64_t needed) { return check_memory_sysctl(needed, "hw.usermem64"); } # else # error "Conditional error" # endif #else static std::string check_memory_unknown(const int64_t needed ATF_DEFS_ATTRIBUTE_UNUSED) { return ""; } #endif static std::string check_memory(const std::string& raw_memory) { const int64_t needed = atf::text::to_bytes(raw_memory); #if defined(__APPLE__) return check_memory_darwin(needed); #elif defined(__NetBSD__) return check_memory_netbsd(needed); #else return check_memory_unknown(needed); #endif } static std::string check_progs(const std::string& progs) { const std::vector< std::string > v = atf::text::split(progs, " "); for (std::vector< std::string >::const_iterator iter = v.begin(); iter != v.end(); iter++) { if (!has_program(atf::fs::path(*iter))) return "Required program '" + (*iter) + "' not found in the PATH"; } return ""; } static std::string check_user(const std::string& user, const atf::tests::vars_map& config) { if (user == "root") { if (!impl::is_root()) return "Requires root privileges"; else return ""; } else if (user == "unprivileged") { if (impl::is_root()) { const atf::tests::vars_map::const_iterator iter = config.find( "unprivileged-user"); if (iter == config.end()) return "Requires an unprivileged user and the " "'unprivileged-user' configuration variable is not set"; else { const std::string& unprivileged_user = (*iter).second; try { (void)impl::get_user_ids(unprivileged_user); return ""; } catch (const std::runtime_error& e) { return "Failed to get information for user " + unprivileged_user; } } } else return ""; } else throw std::runtime_error("Invalid value '" + user + "' for property " "require.user"); } } // anonymous namespace std::string impl::check_requirements(const atf::tests::vars_map& metadata, const atf::tests::vars_map& config) { std::string failure_reason = ""; for (atf::tests::vars_map::const_iterator iter = metadata.begin(); failure_reason.empty() && iter != metadata.end(); iter++) { const std::string& name = (*iter).first; const std::string& value = (*iter).second; INV(!value.empty()); // Enforced by application/X-atf-tp parser. if (name == "require.arch") failure_reason = check_arch(value); else if (name == "require.config") failure_reason = check_config(value, config); else if (name == "require.files") failure_reason = check_files(value); else if (name == "require.machine") failure_reason = check_machine(value); else if (name == "require.memory") failure_reason = check_memory(value); else if (name == "require.progs") failure_reason = check_progs(value); else if (name == "require.user") failure_reason = check_user(value, config); else { // Unknown require.* properties are forbidden by the // application/X-atf-tp parser. INV(failure_reason.find("require.") != 0); } } return failure_reason; } std::pair< int, int > impl::get_required_user(const atf::tests::vars_map& metadata, const atf::tests::vars_map& config) { const atf::tests::vars_map::const_iterator user = metadata.find( "require.user"); if (user == metadata.end()) return std::make_pair(-1, -1); if ((*user).second == "unprivileged") { if (impl::is_root()) { const atf::tests::vars_map::const_iterator iter = config.find( "unprivileged-user"); try { return impl::get_user_ids((*iter).second); } catch (const std::exception& e) { UNREACHABLE; // This has been validated by check_user. throw e; } } else { return std::make_pair(-1, -1); } } else return std::make_pair(-1, -1); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/test_program_test.cpp0000644000470500017500000007127512271526120023213 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "atf-c++/macros.hpp" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/test_helpers.hpp" #include "atf-c++/detail/text.hpp" #include "test-program.hpp" namespace impl = atf::atf_run; namespace detail = atf::atf_run::detail; using atf::tests::vars_map; // ------------------------------------------------------------------------- // Auxiliary functions. // ------------------------------------------------------------------------- static atf::fs::path get_helper(const atf::tests::tc& tc, const char* name) { return atf::fs::path(tc.get_config_var("srcdir")) / name; } static void check_property(const vars_map& props, const char* name, const char* value) { const vars_map::const_iterator iter = props.find(name); ATF_REQUIRE(iter != props.end()); ATF_REQUIRE_EQ(value, (*iter).second); } static void check_result(const char* exp_state, const int exp_value, const char* exp_reason, const impl::test_case_result& tcr) { ATF_REQUIRE_EQ(exp_state, tcr.state()); ATF_REQUIRE_EQ(exp_value, tcr.value()); ATF_REQUIRE_EQ(exp_reason, tcr.reason()); } static void write_test_case_result(const char *results_path, const std::string& contents) { std::ofstream results_file(results_path); ATF_REQUIRE(results_file); results_file << contents; } static void print_indented(const std::string& str) { std::vector< std::string > ws = atf::text::split(str, "\n"); for (std::vector< std::string >::const_iterator iter = ws.begin(); iter != ws.end(); iter++) std::cout << ">>" << *iter << "<<\n"; } // XXX Should this string handling and verbosity level be part of the // ATF_REQUIRE_EQ macro? It may be hard to predict sometimes that a // string can have newlines in it, and so the error message generated // at the moment will be bogus if there are some. static void check_match(const atf::tests::tc& tc, const std::string& str, const std::string& exp) { if (!atf::text::match(str, exp)) { std::cout << "String match check failed.\n" << "Adding >> and << to delimit the string boundaries " "below.\n"; std::cout << "GOT:\n"; print_indented(str); std::cout << "EXPECTED:\n"; print_indented(exp); tc.fail("Constructed string differs from the expected one"); } } // ------------------------------------------------------------------------- // Tests for the "tp" reader. // ------------------------------------------------------------------------- class tp_reader : protected detail::atf_tp_reader { void got_tc(const std::string& ident, const std::map< std::string, std::string >& md) { std::string call = "got_tc(" + ident + ", {"; for (std::map< std::string, std::string >::const_iterator iter = md.begin(); iter != md.end(); iter++) { if (iter != md.begin()) call += ", "; call += (*iter).first + '=' + (*iter).second; } call += "})"; m_calls.push_back(call); } void got_eof(void) { m_calls.push_back("got_eof()"); } public: tp_reader(std::istream& is) : detail::atf_tp_reader(is) { } void read(void) { atf_tp_reader::read(); } std::vector< std::string > m_calls; }; ATF_TEST_CASE_WITHOUT_HEAD(tp_1); ATF_TEST_CASE_BODY(tp_1) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test_case_1\n" "\n" "ident: test_case_2\n" "\n" "ident: test_case_3\n" ; const char* exp_calls[] = { "got_tc(test_case_1, {ident=test_case_1})", "got_tc(test_case_2, {ident=test_case_2})", "got_tc(test_case_3, {ident=test_case_3})", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_2); ATF_TEST_CASE_BODY(tp_2) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test_case_1\n" "descr: This is the description\n" "timeout: 300\n" "\n" "ident: test_case_2\n" "\n" "ident: test_case_3\n" "X-prop1: A custom property\n" "descr: Third test case\n" ; // NO_CHECK_STYLE_BEGIN const char* exp_calls[] = { "got_tc(test_case_1, {descr=This is the description, ident=test_case_1, timeout=300})", "got_tc(test_case_2, {ident=test_case_2})", "got_tc(test_case_3, {X-prop1=A custom property, descr=Third test case, ident=test_case_3})", "got_eof()", NULL }; // NO_CHECK_STYLE_END const char* exp_errors[] = { NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_3); ATF_TEST_CASE_BODY(tp_3) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: single_test\n" "descr: Some description\n" "timeout: 300\n" "require.arch: thearch\n" "require.config: foo-bar\n" "require.files: /a/1 /b/2\n" "require.machine: themachine\n" "require.progs: /bin/cp mv\n" "require.user: root\n" ; // NO_CHECK_STYLE_BEGIN const char* exp_calls[] = { "got_tc(single_test, {descr=Some description, ident=single_test, require.arch=thearch, require.config=foo-bar, require.files=/a/1 /b/2, require.machine=themachine, require.progs=/bin/cp mv, require.user=root, timeout=300})", "got_eof()", NULL }; // NO_CHECK_STYLE_END const char* exp_errors[] = { NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_4); ATF_TEST_CASE_BODY(tp_4) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: single_test \n" "descr: Some description \n" ; const char* exp_calls[] = { "got_tc(single_test, {descr=Some description, ident=single_test})", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_50); ATF_TEST_CASE_BODY(tp_50) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected property name", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_51); ATF_TEST_CASE_BODY(tp_51) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "\n" "\n" "\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected property name", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_52); ATF_TEST_CASE_BODY(tp_52) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test1\n" "ident: test2\n" ; const char* exp_calls[] = { "got_tc(test1, {ident=test1})", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_53); ATF_TEST_CASE_BODY(tp_53) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "descr: Out of order\n" "ident: test1\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: First property of a test case must be 'ident'", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_54); ATF_TEST_CASE_BODY(tp_54) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident:\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: The value for 'ident' cannot be empty", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_55); ATF_TEST_CASE_BODY(tp_55) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: +*,\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: The identifier must match ^[_A-Za-z0-9]+$; was '+*,'", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_56); ATF_TEST_CASE_BODY(tp_56) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test\n" "timeout: hello\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "4: The timeout property requires an integer value", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_57); ATF_TEST_CASE_BODY(tp_57) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test\n" "unknown: property\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "4: Unknown property 'unknown'", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_58); ATF_TEST_CASE_BODY(tp_58) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test\n" "X-foo:\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "4: The value for 'X-foo' cannot be empty", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_59); ATF_TEST_CASE_BODY(tp_59) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "\n" "ident: test\n" "timeout: 300\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected property name", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tp_60); ATF_TEST_CASE_BODY(tp_60) { const char* input = "Content-Type: application/X-atf-tp; version=\"1\"\n" "\n" "ident: test\n" "require.memory: 12345D\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "4: The require.memory property requires an integer value representing" " an amount of bytes", NULL }; do_parser_test< tp_reader >(input, exp_calls, exp_errors); } // ------------------------------------------------------------------------- // Tests for the "tps" writer. // ------------------------------------------------------------------------- ATF_TEST_CASE(atf_tps_writer); ATF_TEST_CASE_HEAD(atf_tps_writer) { set_md_var("descr", "Verifies the application/X-atf-tps writer"); } ATF_TEST_CASE_BODY(atf_tps_writer) { std::ostringstream expss; std::ostringstream ss; const char *ts_regex = "[0-9]+\\.[0-9]{1,6}, "; #define RESET \ expss.str(""); \ ss.str("") #define CHECK \ check_match(*this, ss.str(), expss.str()) { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.info("foo", "bar"); expss << "info: foo, bar\n"; CHECK; w.info("baz", "second info"); expss << "info: baz, second info\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(0); expss << "tps-count: 0\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(123); expss << "tps-count: 123\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(2); expss << "tps-count: 2\n"; CHECK; w.start_tp("foo", 0); expss << "tp-start: " << ts_regex << "foo, 0\n"; CHECK; w.end_tp(""); expss << "tp-end: " << ts_regex << "foo\n"; CHECK; w.start_tp("bar", 0); expss << "tp-start: " << ts_regex << "bar, 0\n"; CHECK; w.end_tp("failed program"); expss << "tp-end: " << ts_regex << "bar, failed program\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(1); expss << "tps-count: 1\n"; CHECK; w.start_tp("foo", 1); expss << "tp-start: " << ts_regex << "foo, 1\n"; CHECK; w.start_tc("brokentc"); expss << "tc-start: " << ts_regex << "brokentc\n"; CHECK; w.end_tp("aborted"); expss << "tp-end: " << ts_regex << "foo, aborted\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(1); expss << "tps-count: 1\n"; CHECK; w.start_tp("thetp", 3); expss << "tp-start: " << ts_regex << "thetp, 3\n"; CHECK; w.start_tc("passtc"); expss << "tc-start: " << ts_regex << "passtc\n"; CHECK; w.end_tc("passed", ""); expss << "tc-end: " << ts_regex << "passtc, passed\n"; CHECK; w.start_tc("failtc"); expss << "tc-start: " << ts_regex << "failtc\n"; CHECK; w.end_tc("failed", "The reason"); expss << "tc-end: " << ts_regex << "failtc, failed, The reason\n"; CHECK; w.start_tc("skiptc"); expss << "tc-start: " << ts_regex << "skiptc\n"; CHECK; w.end_tc("skipped", "The reason"); expss << "tc-end: " << ts_regex << "skiptc, skipped, The reason\n"; CHECK; w.end_tp(""); expss << "tp-end: " << ts_regex << "thetp\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(1); expss << "tps-count: 1\n"; CHECK; w.start_tp("thetp", 1); expss << "tp-start: " << ts_regex << "thetp, 1\n"; CHECK; w.start_tc("thetc"); expss << "tc-start: " << ts_regex << "thetc\n"; CHECK; w.stdout_tc("a line"); expss << "tc-so:a line\n"; CHECK; w.stdout_tc("another line"); expss << "tc-so:another line\n"; CHECK; w.stderr_tc("an error message"); expss << "tc-se:an error message\n"; CHECK; w.end_tc("passed", ""); expss << "tc-end: " << ts_regex << "thetc, passed\n"; CHECK; w.end_tp(""); expss << "tp-end: " << ts_regex << "thetp\n"; CHECK; } { RESET; impl::atf_tps_writer w(ss); expss << "Content-Type: application/X-atf-tps; version=\"3\"\n\n"; CHECK; w.ntps(1); expss << "tps-count: 1\n"; CHECK; w.start_tp("thetp", 0); expss << "tp-start: " << ts_regex << "thetp, 0\n"; CHECK; w.end_tp(""); expss << "tp-end: " << ts_regex << "thetp\n"; CHECK; w.info("foo", "bar"); expss << "info: foo, bar\n"; CHECK; w.info("baz", "second value"); expss << "info: baz, second value\n"; CHECK; } #undef CHECK #undef RESET } // ------------------------------------------------------------------------- // Tests for the free functions. // ------------------------------------------------------------------------- ATF_TEST_CASE(get_metadata_bad); ATF_TEST_CASE_HEAD(get_metadata_bad) {} ATF_TEST_CASE_BODY(get_metadata_bad) { const atf::fs::path executable = get_helper(*this, "bad_metadata_helper"); ATF_REQUIRE_THROW(atf::parser::parse_errors, impl::get_metadata(executable, vars_map())); } ATF_TEST_CASE(get_metadata_zero_tcs); ATF_TEST_CASE_HEAD(get_metadata_zero_tcs) {} ATF_TEST_CASE_BODY(get_metadata_zero_tcs) { const atf::fs::path executable = get_helper(*this, "zero_tcs_helper"); ATF_REQUIRE_THROW(atf::parser::parse_errors, impl::get_metadata(executable, vars_map())); } ATF_TEST_CASE(get_metadata_several_tcs); ATF_TEST_CASE_HEAD(get_metadata_several_tcs) {} ATF_TEST_CASE_BODY(get_metadata_several_tcs) { const atf::fs::path executable = get_helper(*this, "several_tcs_helper"); const impl::metadata md = impl::get_metadata(executable, vars_map()); ATF_REQUIRE_EQ(3, md.test_cases.size()); { const impl::test_cases_map::const_iterator iter = md.test_cases.find("first"); ATF_REQUIRE(iter != md.test_cases.end()); ATF_REQUIRE_EQ(4, (*iter).second.size()); check_property((*iter).second, "descr", "Description 1"); check_property((*iter).second, "has.cleanup", "false"); check_property((*iter).second, "ident", "first"); check_property((*iter).second, "timeout", "300"); } { const impl::test_cases_map::const_iterator iter = md.test_cases.find("second"); ATF_REQUIRE(iter != md.test_cases.end()); ATF_REQUIRE_EQ(5, (*iter).second.size()); check_property((*iter).second, "descr", "Description 2"); check_property((*iter).second, "has.cleanup", "true"); check_property((*iter).second, "ident", "second"); check_property((*iter).second, "timeout", "500"); check_property((*iter).second, "X-property", "Custom property"); } { const impl::test_cases_map::const_iterator iter = md.test_cases.find("third"); ATF_REQUIRE(iter != md.test_cases.end()); ATF_REQUIRE_EQ(3, (*iter).second.size()); check_property((*iter).second, "has.cleanup", "false"); check_property((*iter).second, "ident", "third"); check_property((*iter).second, "timeout", "300"); } } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_death); ATF_TEST_CASE_BODY(parse_test_case_result_expected_death) { check_result("expected_death", -1, "foo bar", detail::parse_test_case_result("expected_death: foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_death")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_death(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_exit); ATF_TEST_CASE_BODY(parse_test_case_result_expected_exit) { check_result("expected_exit", -1, "foo bar", detail::parse_test_case_result("expected_exit: foo bar")); check_result("expected_exit", -1, "foo bar", detail::parse_test_case_result("expected_exit(): foo bar")); check_result("expected_exit", 5, "foo bar", detail::parse_test_case_result("expected_exit(5): foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_exit")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_exit(")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_failure); ATF_TEST_CASE_BODY(parse_test_case_result_expected_failure) { check_result("expected_failure", -1, "foo bar", detail::parse_test_case_result("expected_failure: foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_failure")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_failure(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_signal); ATF_TEST_CASE_BODY(parse_test_case_result_expected_signal) { check_result("expected_signal", -1, "foo bar", detail::parse_test_case_result("expected_signal: foo bar")); check_result("expected_signal", -1, "foo bar", detail::parse_test_case_result("expected_signal(): foo bar")); check_result("expected_signal", 5, "foo bar", detail::parse_test_case_result("expected_signal(5): foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_signal")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_signal(")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_expected_timeout); ATF_TEST_CASE_BODY(parse_test_case_result_expected_timeout) { check_result("expected_timeout", -1, "foo bar", detail::parse_test_case_result("expected_timeout: foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_timeout")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("expected_timeout(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_failed); ATF_TEST_CASE_BODY(parse_test_case_result_failed) { check_result("failed", -1, "foo bar", detail::parse_test_case_result("failed: foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("failed")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("failed(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_passed); ATF_TEST_CASE_BODY(parse_test_case_result_passed) { check_result("passed", -1, "", detail::parse_test_case_result("passed")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("passed: foo")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("passed(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_skipped); ATF_TEST_CASE_BODY(parse_test_case_result_skipped) { check_result("skipped", -1, "foo bar", detail::parse_test_case_result("skipped: foo bar")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("skipped")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("skipped(3): foo")); } ATF_TEST_CASE_WITHOUT_HEAD(parse_test_case_result_unknown); ATF_TEST_CASE_BODY(parse_test_case_result_unknown) { ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("foo")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("bar: foo")); ATF_REQUIRE_THROW(std::runtime_error, detail::parse_test_case_result("baz: foo")); } ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_failed); ATF_TEST_CASE_BODY(read_test_case_result_failed) { write_test_case_result("resfile", "failed: foo bar\n"); const impl::test_case_result tcr = impl::read_test_case_result( atf::fs::path("resfile")); ATF_REQUIRE_EQ("failed", tcr.state()); ATF_REQUIRE_EQ("foo bar", tcr.reason()); } ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_skipped); ATF_TEST_CASE_BODY(read_test_case_result_skipped) { write_test_case_result("resfile", "skipped: baz bar\n"); const impl::test_case_result tcr = impl::read_test_case_result( atf::fs::path("resfile")); ATF_REQUIRE_EQ("skipped", tcr.state()); ATF_REQUIRE_EQ("baz bar", tcr.reason()); } ATF_TEST_CASE(read_test_case_result_no_file); ATF_TEST_CASE_HEAD(read_test_case_result_no_file) {} ATF_TEST_CASE_BODY(read_test_case_result_no_file) { ATF_REQUIRE_THROW(std::runtime_error, impl::read_test_case_result(atf::fs::path("resfile"))); } ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_empty_file); ATF_TEST_CASE_BODY(read_test_case_result_empty_file) { write_test_case_result("resfile", ""); ATF_REQUIRE_THROW(std::runtime_error, impl::read_test_case_result(atf::fs::path("resfile"))); } ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_invalid); ATF_TEST_CASE_BODY(read_test_case_result_invalid) { write_test_case_result("resfile", "passed: hello\n"); ATF_REQUIRE_THROW(std::runtime_error, impl::read_test_case_result(atf::fs::path("resfile"))); } ATF_TEST_CASE_WITHOUT_HEAD(read_test_case_result_multiline); ATF_TEST_CASE_BODY(read_test_case_result_multiline) { write_test_case_result("resfile", "skipped: foo\nbar\n"); const impl::test_case_result tcr = impl::read_test_case_result( atf::fs::path("resfile")); ATF_REQUIRE_EQ("skipped", tcr.state()); ATF_REQUIRE_EQ("foo<>bar", tcr.reason()); } // ------------------------------------------------------------------------- // Main. // ------------------------------------------------------------------------- ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, tp_1); ATF_ADD_TEST_CASE(tcs, tp_2); ATF_ADD_TEST_CASE(tcs, tp_3); ATF_ADD_TEST_CASE(tcs, tp_4); ATF_ADD_TEST_CASE(tcs, tp_50); ATF_ADD_TEST_CASE(tcs, tp_51); ATF_ADD_TEST_CASE(tcs, tp_52); ATF_ADD_TEST_CASE(tcs, tp_53); ATF_ADD_TEST_CASE(tcs, tp_54); ATF_ADD_TEST_CASE(tcs, tp_55); ATF_ADD_TEST_CASE(tcs, tp_56); ATF_ADD_TEST_CASE(tcs, tp_57); ATF_ADD_TEST_CASE(tcs, tp_58); ATF_ADD_TEST_CASE(tcs, tp_59); ATF_ADD_TEST_CASE(tcs, tp_60); ATF_ADD_TEST_CASE(tcs, atf_tps_writer); ATF_ADD_TEST_CASE(tcs, get_metadata_bad); ATF_ADD_TEST_CASE(tcs, get_metadata_zero_tcs); ATF_ADD_TEST_CASE(tcs, get_metadata_several_tcs); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_death); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_exit); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_failure); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_signal); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_expected_timeout); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_failed); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_passed); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_skipped); ATF_ADD_TEST_CASE(tcs, parse_test_case_result_unknown); ATF_ADD_TEST_CASE(tcs, read_test_case_result_failed); ATF_ADD_TEST_CASE(tcs, read_test_case_result_skipped); ATF_ADD_TEST_CASE(tcs, read_test_case_result_no_file); ATF_ADD_TEST_CASE(tcs, read_test_case_result_empty_file); ATF_ADD_TEST_CASE(tcs, read_test_case_result_multiline); ATF_ADD_TEST_CASE(tcs, read_test_case_result_invalid); // TODO: Add tests for run_test_case once all the missing functionality // is implemented. } bind9-9.9.5.dfsg/unit/atf-src/atf-run/io_test.cpp0000644000470500017500000003161612271526120021107 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include } #include #include #include #include #include #include #include #include #include "../atf-c++/detail/sanity.hpp" #include "../atf-c++/macros.hpp" #include "io.hpp" #include "signals.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void systembuf_check_data(std::istream& is, std::size_t length) { char ch = 'A', chr; std::size_t cnt = 0; while (is >> chr) { ATF_REQUIRE_EQ(ch, chr); if (ch == 'Z') ch = 'A'; else ch++; cnt++; } ATF_REQUIRE_EQ(cnt, length); } static void systembuf_write_data(std::ostream& os, std::size_t length) { char ch = 'A'; for (std::size_t i = 0; i < length; i++) { os << ch; if (ch == 'Z') ch = 'A'; else ch++; } os.flush(); } static void systembuf_test_read(std::size_t length, std::size_t bufsize) { using atf::atf_run::systembuf; std::ofstream f("test_read.txt"); systembuf_write_data(f, length); f.close(); int fd = ::open("test_read.txt", O_RDONLY); ATF_REQUIRE(fd != -1); systembuf sb(fd, bufsize); std::istream is(&sb); systembuf_check_data(is, length); ::close(fd); ::unlink("test_read.txt"); } static void systembuf_test_write(std::size_t length, std::size_t bufsize) { using atf::atf_run::systembuf; int fd = ::open("test_write.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); ATF_REQUIRE(fd != -1); systembuf sb(fd, bufsize); std::ostream os(&sb); systembuf_write_data(os, length); ::close(fd); std::ifstream is("test_write.txt"); systembuf_check_data(is, length); is.close(); ::unlink("test_write.txt"); } // ------------------------------------------------------------------------ // Test cases for the "file_handle" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(file_handle_ctor); ATF_TEST_CASE_HEAD(file_handle_ctor) { set_md_var("descr", "Tests file_handle's constructors"); } ATF_TEST_CASE_BODY(file_handle_ctor) { using atf::atf_run::file_handle; file_handle fh1; ATF_REQUIRE(!fh1.is_valid()); file_handle fh2(STDOUT_FILENO); ATF_REQUIRE(fh2.is_valid()); fh2.disown(); } ATF_TEST_CASE(file_handle_copy); ATF_TEST_CASE_HEAD(file_handle_copy) { set_md_var("descr", "Tests file_handle's copy constructor"); } ATF_TEST_CASE_BODY(file_handle_copy) { using atf::atf_run::file_handle; file_handle fh1; file_handle fh2(STDOUT_FILENO); file_handle fh3(fh2); ATF_REQUIRE(!fh2.is_valid()); ATF_REQUIRE(fh3.is_valid()); fh1 = fh3; ATF_REQUIRE(!fh3.is_valid()); ATF_REQUIRE(fh1.is_valid()); fh1.disown(); } ATF_TEST_CASE(file_handle_get); ATF_TEST_CASE_HEAD(file_handle_get) { set_md_var("descr", "Tests the file_handle::get method"); } ATF_TEST_CASE_BODY(file_handle_get) { using atf::atf_run::file_handle; file_handle fh1(STDOUT_FILENO); ATF_REQUIRE_EQ(fh1.get(), STDOUT_FILENO); } ATF_TEST_CASE(file_handle_posix_remap); ATF_TEST_CASE_HEAD(file_handle_posix_remap) { set_md_var("descr", "Tests the file_handle::posix_remap method"); } ATF_TEST_CASE_BODY(file_handle_posix_remap) { using atf::atf_run::file_handle; int pfd[2]; ATF_REQUIRE(::pipe(pfd) != -1); file_handle rend(pfd[0]); file_handle wend(pfd[1]); ATF_REQUIRE(rend.get() != 10); ATF_REQUIRE(wend.get() != 10); wend.posix_remap(10); ATF_REQUIRE_EQ(wend.get(), 10); ATF_REQUIRE(::write(wend.get(), "test-posix-remap", 16) != -1); { char buf[17]; ATF_REQUIRE_EQ(::read(rend.get(), buf, sizeof(buf)), 16); buf[16] = '\0'; ATF_REQUIRE(std::strcmp(buf, "test-posix-remap") == 0); } // Redo previous to ensure that remapping over the same descriptor // has no side-effects. ATF_REQUIRE_EQ(wend.get(), 10); wend.posix_remap(10); ATF_REQUIRE_EQ(wend.get(), 10); ATF_REQUIRE(::write(wend.get(), "test-posix-remap", 16) != -1); { char buf[17]; ATF_REQUIRE_EQ(::read(rend.get(), buf, sizeof(buf)), 16); buf[16] = '\0'; ATF_REQUIRE(std::strcmp(buf, "test-posix-remap") == 0); } } // ------------------------------------------------------------------------ // Test cases for the "systembuf" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(systembuf_short_read); ATF_TEST_CASE_HEAD(systembuf_short_read) { set_md_var("descr", "Tests that a short read (one that fits in the " "internal buffer) works when using systembuf"); } ATF_TEST_CASE_BODY(systembuf_short_read) { systembuf_test_read(64, 1024); } ATF_TEST_CASE(systembuf_long_read); ATF_TEST_CASE_HEAD(systembuf_long_read) { set_md_var("descr", "Tests that a long read (one that does not fit in " "the internal buffer) works when using systembuf"); } ATF_TEST_CASE_BODY(systembuf_long_read) { systembuf_test_read(64 * 1024, 1024); } ATF_TEST_CASE(systembuf_short_write); ATF_TEST_CASE_HEAD(systembuf_short_write) { set_md_var("descr", "Tests that a short write (one that fits in the " "internal buffer) works when using systembuf"); } ATF_TEST_CASE_BODY(systembuf_short_write) { systembuf_test_write(64, 1024); } ATF_TEST_CASE(systembuf_long_write); ATF_TEST_CASE_HEAD(systembuf_long_write) { set_md_var("descr", "Tests that a long write (one that does not fit " "in the internal buffer) works when using systembuf"); } ATF_TEST_CASE_BODY(systembuf_long_write) { systembuf_test_write(64 * 1024, 1024); } // ------------------------------------------------------------------------ // Test cases for the "pistream" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(pistream); ATF_TEST_CASE_HEAD(pistream) { set_md_var("descr", "Tests the pistream class"); } ATF_TEST_CASE_BODY(pistream) { using atf::atf_run::file_handle; using atf::atf_run::pistream; using atf::atf_run::systembuf; int fds[2]; ATF_REQUIRE(::pipe(fds) != -1); pistream rend(fds[0]); systembuf wbuf(fds[1]); std::ostream wend(&wbuf); // XXX This assumes that the pipe's buffer is big enough to accept // the data written without blocking! wend << "1Test 1message\n"; wend.flush(); std::string tmp; rend >> tmp; ATF_REQUIRE_EQ(tmp, "1Test"); rend >> tmp; ATF_REQUIRE_EQ(tmp, "1message"); } // ------------------------------------------------------------------------ // Tests for the "muxer" class. // ------------------------------------------------------------------------ namespace { static void check_stream(std::ostream& os) { // If we receive a signal while writing to the stream, the bad bit gets set. // Things seem to behave fine afterwards if we clear such error condition. // However, I'm not sure if it's safe to query errno at this point. ATF_REQUIRE(os.good() || (os.bad() && errno == EINTR)); os.clear(); } class mock_muxer : public atf::atf_run::muxer { void line_callback(const size_t index, const std::string& line) { // The following should be enabled but causes the output to be so big // that it is annoying. Reenable at some point if we make atf store // the output of the test cases in some other way (e.g. only if a test // failes), because this message is the only help in seeing how the // test fails. //std::cout << "line_callback(" << index << ", " << line << ")\n"; check_stream(std::cout); switch (index) { case 0: lines0.push_back(line); break; case 1: lines1.push_back(line); break; default: ATF_REQUIRE(false); } } public: mock_muxer(const int* fds, const size_t nfds, const size_t bufsize) : muxer(fds, nfds, bufsize) {} std::vector< std::string > lines0; std::vector< std::string > lines1; }; static bool child_finished = false; static void sigchld_handler(int signo) { INV(signo == SIGCHLD); child_finished = true; } static void child_printer(const int pipeout[2], const int pipeerr[2], const size_t iterations) { ::close(pipeout[0]); ::close(pipeerr[0]); ATF_REQUIRE(::dup2(pipeout[1], STDOUT_FILENO) != -1); ATF_REQUIRE(::dup2(pipeerr[1], STDERR_FILENO) != -1); ::close(pipeout[1]); ::close(pipeerr[1]); for (size_t i = 0; i < iterations; i++) { std::cout << "stdout " << i << "\n"; std::cerr << "stderr " << i << "\n"; } std::cout << "stdout eof\n"; std::cerr << "stderr eof\n"; std::exit(EXIT_SUCCESS); } static void muxer_test(const size_t bufsize, const size_t iterations) { int pipeout[2], pipeerr[2]; ATF_REQUIRE(pipe(pipeout) != -1); ATF_REQUIRE(pipe(pipeerr) != -1); atf::atf_run::signal_programmer sigchld(SIGCHLD, sigchld_handler); std::cout.flush(); std::cerr.flush(); pid_t pid = ::fork(); ATF_REQUIRE(pid != -1); if (pid == 0) { sigchld.unprogram(); child_printer(pipeout, pipeerr, iterations); UNREACHABLE; } ::close(pipeout[1]); ::close(pipeerr[1]); int fds[2] = {pipeout[0], pipeerr[0]}; mock_muxer mux(fds, 2, bufsize); mux.mux(child_finished); check_stream(std::cout); std::cout << "mux done\n"; mux.flush(); std::cout << "flush done\n"; check_stream(std::cout); sigchld.unprogram(); int status; ATF_REQUIRE(::waitpid(pid, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE(WEXITSTATUS(status) == EXIT_SUCCESS); ATF_REQUIRE(std::cout.good()); ATF_REQUIRE(std::cerr.good()); for (size_t i = 0; i < iterations; i++) { std::ostringstream exp0, exp1; exp0 << "stdout " << i; exp1 << "stderr " << i; ATF_REQUIRE(mux.lines0.size() > i); ATF_REQUIRE_EQ(exp0.str(), mux.lines0[i]); ATF_REQUIRE(mux.lines1.size() > i); ATF_REQUIRE_EQ(exp1.str(), mux.lines1[i]); } ATF_REQUIRE_EQ("stdout eof", mux.lines0[iterations]); ATF_REQUIRE_EQ("stderr eof", mux.lines1[iterations]); std::cout << "all done\n"; } } // anonymous namespace ATF_TEST_CASE_WITHOUT_HEAD(muxer_small_buffer); ATF_TEST_CASE_BODY(muxer_small_buffer) { muxer_test(4, 20000); } ATF_TEST_CASE_WITHOUT_HEAD(muxer_large_buffer); ATF_TEST_CASE_BODY(muxer_large_buffer) { muxer_test(1024, 50000); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the "file_handle" class. ATF_ADD_TEST_CASE(tcs, file_handle_ctor); ATF_ADD_TEST_CASE(tcs, file_handle_copy); ATF_ADD_TEST_CASE(tcs, file_handle_get); ATF_ADD_TEST_CASE(tcs, file_handle_posix_remap); // Add the tests for the "systembuf" class. ATF_ADD_TEST_CASE(tcs, systembuf_short_read); ATF_ADD_TEST_CASE(tcs, systembuf_long_read); ATF_ADD_TEST_CASE(tcs, systembuf_short_write); ATF_ADD_TEST_CASE(tcs, systembuf_long_write); // Add the tests for the "pistream" class. ATF_ADD_TEST_CASE(tcs, pistream); // Add the tests for the "muxer" class. ATF_ADD_TEST_CASE(tcs, muxer_small_buffer); ATF_ADD_TEST_CASE(tcs, muxer_large_buffer); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/user.cpp0000644000470500017500000000476112271526120020420 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include "../atf-c/detail/user.h" } #include #include #include "../atf-c++/detail/sanity.hpp" #include "user.hpp" namespace impl = atf::atf_run; #define IMPL_NAME "atf::atf_run" uid_t impl::euid(void) { return atf_user_euid(); } void impl::drop_privileges(const std::pair< int, int > ids) { if (::setgid(ids.second) == -1) throw std::runtime_error("Failed to drop group privileges"); if (::setuid(ids.first) == -1) throw std::runtime_error("Failed to drop user privileges"); } std::pair< int, int > impl::get_user_ids(const std::string& user) { const struct passwd* pw = ::getpwnam(user.c_str()); if (pw == NULL) throw std::runtime_error("Failed to get information for user " + user); return std::make_pair(pw->pw_uid, pw->pw_gid); } bool impl::is_member_of_group(gid_t gid) { return atf_user_is_member_of_group(gid); } bool impl::is_root(void) { return atf_user_is_root(); } bool impl::is_unprivileged(void) { return atf_user_is_unprivileged(); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/bad_metadata_helper.c0000644000470500017500000000303412271526120023017 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include int main(void) { printf("incorrectly formatted metadata\n"); return EXIT_SUCCESS; } bind9-9.9.5.dfsg/unit/atf-src/atf-run/Atffile0000644000470500017500000000013612271526120020223 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: *_test bind9-9.9.5.dfsg/unit/atf-src/atf-run/expect_helpers.c0000644000470500017500000001205712271526120022111 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include ATF_TC_WITHOUT_HEAD(pass_and_pass); ATF_TC_BODY(pass_and_pass, tc) { atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(pass_but_fail_requirement); ATF_TC_BODY(pass_but_fail_requirement, tc) { atf_tc_expect_pass(); atf_tc_fail("Some reason"); } ATF_TC_WITHOUT_HEAD(pass_but_fail_check); ATF_TC_BODY(pass_but_fail_check, tc) { atf_tc_expect_pass(); atf_tc_fail_nonfatal("Some reason"); } ATF_TC_WITHOUT_HEAD(fail_and_fail_requirement); ATF_TC_BODY(fail_and_fail_requirement, tc) { atf_tc_expect_fail("Fail %s", "reason"); atf_tc_fail("The failure"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(fail_and_fail_check); ATF_TC_BODY(fail_and_fail_check, tc) { atf_tc_expect_fail("Fail first"); atf_tc_fail_nonfatal("abc"); atf_tc_expect_pass(); atf_tc_expect_fail("And fail again"); atf_tc_fail_nonfatal("def"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(fail_but_pass); ATF_TC_BODY(fail_but_pass, tc) { atf_tc_expect_fail("Fail first"); atf_tc_fail_nonfatal("abc"); atf_tc_expect_pass(); atf_tc_expect_fail("Will not fail"); atf_tc_expect_pass(); atf_tc_expect_fail("And fail again"); atf_tc_fail_nonfatal("def"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(exit_any_and_exit); ATF_TC_BODY(exit_any_and_exit, tc) { atf_tc_expect_exit(-1, "Call will exit"); exit(EXIT_SUCCESS); } ATF_TC_WITHOUT_HEAD(exit_code_and_exit); ATF_TC_BODY(exit_code_and_exit, tc) { atf_tc_expect_exit(123, "Call will exit"); exit(123); } ATF_TC_WITHOUT_HEAD(exit_but_pass); ATF_TC_BODY(exit_but_pass, tc) { atf_tc_expect_exit(-1, "Call won't exit"); } ATF_TC_WITHOUT_HEAD(signal_any_and_signal); ATF_TC_BODY(signal_any_and_signal, tc) { atf_tc_expect_signal(-1, "Call will signal"); kill(getpid(), SIGKILL); } ATF_TC_WITHOUT_HEAD(signal_no_and_signal); ATF_TC_BODY(signal_no_and_signal, tc) { atf_tc_expect_signal(SIGHUP, "Call will signal"); kill(getpid(), SIGHUP); } ATF_TC_WITHOUT_HEAD(signal_but_pass); ATF_TC_BODY(signal_but_pass, tc) { atf_tc_expect_signal(-1, "Call won't signal"); } ATF_TC_WITHOUT_HEAD(death_and_exit); ATF_TC_BODY(death_and_exit, tc) { atf_tc_expect_death("Exit case"); exit(123); } ATF_TC_WITHOUT_HEAD(death_and_signal); ATF_TC_BODY(death_and_signal, tc) { atf_tc_expect_death("Signal case"); kill(getpid(), SIGKILL); } ATF_TC_WITHOUT_HEAD(death_but_pass); ATF_TC_BODY(death_but_pass, tc) { atf_tc_expect_death("Call won't die"); } ATF_TC(timeout_and_hang); ATF_TC_HEAD(timeout_and_hang, tc) { atf_tc_set_md_var(tc, "timeout", "1"); } ATF_TC_BODY(timeout_and_hang, tc) { atf_tc_expect_timeout("Will overrun"); sleep(5); } ATF_TC(timeout_but_pass); ATF_TC_HEAD(timeout_but_pass, tc) { atf_tc_set_md_var(tc, "timeout", "1"); } ATF_TC_BODY(timeout_but_pass, tc) { atf_tc_expect_timeout("Will just exit"); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, pass_and_pass); ATF_TP_ADD_TC(tp, pass_but_fail_requirement); ATF_TP_ADD_TC(tp, pass_but_fail_check); ATF_TP_ADD_TC(tp, fail_and_fail_requirement); ATF_TP_ADD_TC(tp, fail_and_fail_check); ATF_TP_ADD_TC(tp, fail_but_pass); ATF_TP_ADD_TC(tp, exit_any_and_exit); ATF_TP_ADD_TC(tp, exit_code_and_exit); ATF_TP_ADD_TC(tp, exit_but_pass); ATF_TP_ADD_TC(tp, signal_any_and_signal); ATF_TP_ADD_TC(tp, signal_no_and_signal); ATF_TP_ADD_TC(tp, signal_but_pass); ATF_TP_ADD_TC(tp, death_and_exit); ATF_TP_ADD_TC(tp, death_and_signal); ATF_TP_ADD_TC(tp, death_but_pass); ATF_TP_ADD_TC(tp, timeout_and_hang); ATF_TP_ADD_TC(tp, timeout_but_pass); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/atffile.hpp0000644000470500017500000000612512271526120021055 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_ATFFILE_HPP_) #define _ATF_RUN_ATFFILE_HPP_ #include #include #include "atf-c++/tests.hpp" #include "atf-c++/detail/fs.hpp" namespace atf { namespace atf_run { // ------------------------------------------------------------------------ // The "atf_atffile_reader" class. // ------------------------------------------------------------------------ namespace detail { class atf_atffile_reader { std::istream& m_is; protected: virtual void got_conf(const std::string&, const std::string &); virtual void got_prop(const std::string&, const std::string &); virtual void got_tp(const std::string&, bool); virtual void got_eof(void); public: atf_atffile_reader(std::istream&); virtual ~atf_atffile_reader(void); void read(void); }; } // namespace detail // ------------------------------------------------------------------------ // The "atffile" class. // ------------------------------------------------------------------------ class atffile { atf::tests::vars_map m_conf; std::vector< std::string > m_tps; atf::tests::vars_map m_props; public: atffile(const atf::tests::vars_map&, const std::vector< std::string >&, const atf::tests::vars_map&); const atf::tests::vars_map& conf(void) const; const std::vector< std::string >& tps(void) const; const atf::tests::vars_map& props(void) const; }; // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ atffile read_atffile(const fs::path&); } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_ATFFILE_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/timer.cpp0000644000470500017500000001364212271526120020560 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) # include #endif extern "C" { #include } #include #include #include extern "C" { #include "atf-c/defs.h" } #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/sanity.hpp" #include "signals.hpp" #include "timer.hpp" namespace impl = atf::atf_run; #define IMPL_NAME "atf::atf_run" #if !defined(HAVE_TIMER_T) static impl::timer* compat_handle; #endif // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ #if defined(HAVE_TIMER_T) static void handler(const int signo ATF_DEFS_ATTRIBUTE_UNUSED, siginfo_t* si, void* uc ATF_DEFS_ATTRIBUTE_UNUSED) { impl::timer* timer = static_cast< impl::timer* >(si->si_value.sival_ptr); timer->set_fired(); timer->timeout_callback(); } #else static void handler(const int signo ATF_DEFS_ATTRIBUTE_UNUSED, siginfo_t* si ATF_DEFS_ATTRIBUTE_UNUSED, void* uc ATF_DEFS_ATTRIBUTE_UNUSED) { compat_handle->set_fired(); compat_handle->timeout_callback(); } #endif // ------------------------------------------------------------------------ // The "timer" class. // ------------------------------------------------------------------------ struct impl::timer::impl { #if defined(HAVE_TIMER_T) ::timer_t m_timer; ::itimerspec m_old_it; #else ::itimerval m_old_it; #endif struct ::sigaction m_old_sa; volatile bool m_fired; impl(void) : m_fired(false) { } }; impl::timer::timer(const unsigned int seconds) : m_pimpl(new impl()) { struct ::sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = ::handler; if (::sigaction(SIGALRM, &sa, &m_pimpl->m_old_sa) == -1) throw system_error(IMPL_NAME "::timer::timer", "Failed to set signal handler", errno); #if defined(HAVE_TIMER_T) struct ::sigevent se; se.sigev_notify = SIGEV_SIGNAL; se.sigev_signo = SIGALRM; se.sigev_value.sival_ptr = static_cast< void* >(this); se.sigev_notify_function = NULL; se.sigev_notify_attributes = NULL; if (::timer_create(CLOCK_MONOTONIC, &se, &m_pimpl->m_timer) == -1) { ::sigaction(SIGALRM, &m_pimpl->m_old_sa, NULL); throw system_error(IMPL_NAME "::timer::timer", "Failed to create timer", errno); } struct ::itimerspec it; it.it_interval.tv_sec = 0; it.it_interval.tv_nsec = 0; it.it_value.tv_sec = seconds; it.it_value.tv_nsec = 0; if (::timer_settime(m_pimpl->m_timer, 0, &it, &m_pimpl->m_old_it) == -1) { ::sigaction(SIGALRM, &m_pimpl->m_old_sa, NULL); ::timer_delete(m_pimpl->m_timer); throw system_error(IMPL_NAME "::timer::timer", "Failed to program timer", errno); } #else ::itimerval it; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = seconds; it.it_value.tv_usec = 0; if (::setitimer(ITIMER_REAL, &it, &m_pimpl->m_old_it) == -1) { ::sigaction(SIGALRM, &m_pimpl->m_old_sa, NULL); throw system_error(IMPL_NAME "::timer::timer", "Failed to program timer", errno); } INV(compat_handle == NULL); compat_handle = this; #endif } impl::timer::~timer(void) { #if defined(HAVE_TIMER_T) { const int ret = ::timer_delete(m_pimpl->m_timer); INV(ret != -1); } #else { const int ret = ::setitimer(ITIMER_REAL, &m_pimpl->m_old_it, NULL); INV(ret != -1); } #endif const int ret = ::sigaction(SIGALRM, &m_pimpl->m_old_sa, NULL); INV(ret != -1); #if !defined(HAVE_TIMER_T) compat_handle = NULL; #endif } bool impl::timer::fired(void) const { return m_pimpl->m_fired; } void impl::timer::set_fired(void) { m_pimpl->m_fired = true; } // ------------------------------------------------------------------------ // The "child_timer" class. // ------------------------------------------------------------------------ impl::child_timer::child_timer(const unsigned int seconds, const pid_t pid, volatile bool& terminate) : timer(seconds), m_pid(pid), m_terminate(terminate) { } impl::child_timer::~child_timer(void) { } void impl::child_timer::timeout_callback(void) { static const timespec ts = { 1, 0 }; m_terminate = true; ::kill(-m_pid, SIGTERM); ::nanosleep(&ts, NULL); if (::kill(-m_pid, 0) != -1) ::kill(-m_pid, SIGKILL); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/sample/0002755000470500017500000000000012276444014020217 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-run/sample/common.conf0000644000470500017500000000060012271526120022342 0ustar lamontlamontContent-Type: application/X-atf-config; version="1" # # Sample configuration file for properties affecting all test suites. # # When running the test suite as root, some tests require to switch to # an unprivileged user to perform extra checks. Set this variable to # the user you want to use in those cases. If not set, those tests will # be skipped. #unprivileged-user = "_atf" bind9-9.9.5.dfsg/unit/atf-src/atf-run/sample/atf-run.hooks0000644000470500017500000000074312271526120022634 0ustar lamontlamont# # Definition of custom hooks for atf-run. # # Uncomment any hooks that you want to override and add your own code # to them. Some sample calls are included in them. Be very careful # with what you print from here. # # See atf-run(1) for more details. # #info_start_hook() #{ # default_info_start_hook "${@}" # # atf_tps_writer_info "extra.info" "An example" #} #info_end_hook() #{ # default_info_end_hook "${@}" # # atf_tps_writer_info "extra.info" "An example" #} bind9-9.9.5.dfsg/unit/atf-src/atf-run/fs_test.cpp0000644000470500017500000002012412271526120021100 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include "atf-c++/macros.hpp" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/fs.hpp" #include "fs.hpp" #include "user.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void create_file(const char *name) { std::ofstream os(name); os.close(); } // ------------------------------------------------------------------------ // Test cases for the "temp_dir" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(temp_dir_raii); ATF_TEST_CASE_HEAD(temp_dir_raii) { set_md_var("descr", "Tests the RAII behavior of the temp_dir class"); } ATF_TEST_CASE_BODY(temp_dir_raii) { using atf::atf_run::temp_dir; atf::fs::path t1("non-existent"); atf::fs::path t2("non-existent"); { atf::fs::path tmpl("testdir.XXXXXX"); temp_dir td1(tmpl); temp_dir td2(tmpl); t1 = td1.get_path(); t2 = td2.get_path(); ATF_REQUIRE(t1.str().find("XXXXXX") == std::string::npos); ATF_REQUIRE(t2.str().find("XXXXXX") == std::string::npos); ATF_REQUIRE(t1 != t2); ATF_REQUIRE(!atf::fs::exists(tmpl)); ATF_REQUIRE( atf::fs::exists(t1)); ATF_REQUIRE( atf::fs::exists(t2)); atf::fs::file_info fi1(t1); ATF_REQUIRE( fi1.is_owner_readable()); ATF_REQUIRE( fi1.is_owner_writable()); ATF_REQUIRE( fi1.is_owner_executable()); ATF_REQUIRE(!fi1.is_group_readable()); ATF_REQUIRE(!fi1.is_group_writable()); ATF_REQUIRE(!fi1.is_group_executable()); ATF_REQUIRE(!fi1.is_other_readable()); ATF_REQUIRE(!fi1.is_other_writable()); ATF_REQUIRE(!fi1.is_other_executable()); atf::fs::file_info fi2(t2); ATF_REQUIRE( fi2.is_owner_readable()); ATF_REQUIRE( fi2.is_owner_writable()); ATF_REQUIRE( fi2.is_owner_executable()); ATF_REQUIRE(!fi2.is_group_readable()); ATF_REQUIRE(!fi2.is_group_writable()); ATF_REQUIRE(!fi2.is_group_executable()); ATF_REQUIRE(!fi2.is_other_readable()); ATF_REQUIRE(!fi2.is_other_writable()); ATF_REQUIRE(!fi2.is_other_executable()); } ATF_REQUIRE(t1.str() != "non-existent"); ATF_REQUIRE(!atf::fs::exists(t1)); ATF_REQUIRE(t2.str() != "non-existent"); ATF_REQUIRE(!atf::fs::exists(t2)); } // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(cleanup); ATF_TEST_CASE_HEAD(cleanup) { set_md_var("descr", "Tests the cleanup function"); } ATF_TEST_CASE_BODY(cleanup) { using atf::atf_run::cleanup; ::mkdir("root", 0755); ::mkdir("root/dir", 0755); ::mkdir("root/dir/1", 0100); ::mkdir("root/dir/2", 0644); create_file("root/reg"); atf::fs::path p("root"); ATF_REQUIRE(atf::fs::exists(p)); ATF_REQUIRE(atf::fs::exists(p / "dir")); ATF_REQUIRE(atf::fs::exists(p / "dir/1")); ATF_REQUIRE(atf::fs::exists(p / "dir/2")); ATF_REQUIRE(atf::fs::exists(p / "reg")); cleanup(p); ATF_REQUIRE(!atf::fs::exists(p)); } ATF_TEST_CASE(cleanup_eacces_on_root); ATF_TEST_CASE_HEAD(cleanup_eacces_on_root) { set_md_var("descr", "Tests the cleanup function"); } ATF_TEST_CASE_BODY(cleanup_eacces_on_root) { using atf::atf_run::cleanup; ::mkdir("aux", 0755); ::mkdir("aux/root", 0755); ATF_REQUIRE(::chmod("aux", 0555) != -1); try { cleanup(atf::fs::path("aux/root")); ATF_REQUIRE(atf::atf_run::is_root()); } catch (const atf::system_error& e) { ATF_REQUIRE(!atf::atf_run::is_root()); ATF_REQUIRE_EQ(EACCES, e.code()); } } ATF_TEST_CASE(cleanup_eacces_on_subdir); ATF_TEST_CASE_HEAD(cleanup_eacces_on_subdir) { set_md_var("descr", "Tests the cleanup function"); } ATF_TEST_CASE_BODY(cleanup_eacces_on_subdir) { using atf::atf_run::cleanup; ::mkdir("root", 0755); ::mkdir("root/1", 0755); ::mkdir("root/1/2", 0755); ::mkdir("root/1/2/3", 0755); ATF_REQUIRE(::chmod("root/1/2", 0555) != -1); ATF_REQUIRE(::chmod("root/1", 0555) != -1); const atf::fs::path p("root"); cleanup(p); ATF_REQUIRE(!atf::fs::exists(p)); } ATF_TEST_CASE(change_directory); ATF_TEST_CASE_HEAD(change_directory) { set_md_var("descr", "Tests the change_directory function"); } ATF_TEST_CASE_BODY(change_directory) { using atf::atf_run::change_directory; using atf::atf_run::get_current_dir; ::mkdir("files", 0755); ::mkdir("files/dir", 0755); create_file("files/reg"); const atf::fs::path old = get_current_dir(); ATF_REQUIRE_THROW(atf::system_error, change_directory(atf::fs::path("files/reg"))); ATF_REQUIRE(get_current_dir() == old); atf::fs::path old2 = change_directory(atf::fs::path("files")); ATF_REQUIRE(old2 == old); atf::fs::path old3 = change_directory(atf::fs::path("dir")); ATF_REQUIRE(old3 == old2 / "files"); atf::fs::path old4 = change_directory(atf::fs::path("../..")); ATF_REQUIRE(old4 == old3 / "dir"); ATF_REQUIRE(get_current_dir() == old); } ATF_TEST_CASE(get_current_dir); ATF_TEST_CASE_HEAD(get_current_dir) { set_md_var("descr", "Tests the get_current_dir function"); } ATF_TEST_CASE_BODY(get_current_dir) { using atf::atf_run::change_directory; using atf::atf_run::get_current_dir; ::mkdir("files", 0755); ::mkdir("files/dir", 0755); create_file("files/reg"); atf::fs::path curdir = get_current_dir(); change_directory(atf::fs::path(".")); ATF_REQUIRE(get_current_dir() == curdir); change_directory(atf::fs::path("files")); ATF_REQUIRE(get_current_dir() == curdir / "files"); change_directory(atf::fs::path("dir")); ATF_REQUIRE(get_current_dir() == curdir / "files/dir"); change_directory(atf::fs::path("..")); ATF_REQUIRE(get_current_dir() == curdir / "files"); change_directory(atf::fs::path("..")); ATF_REQUIRE(get_current_dir() == curdir); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the "temp_dir" class. ATF_ADD_TEST_CASE(tcs, temp_dir_raii); // Add the tests for the free functions. ATF_ADD_TEST_CASE(tcs, cleanup); ATF_ADD_TEST_CASE(tcs, cleanup_eacces_on_root); ATF_ADD_TEST_CASE(tcs, cleanup_eacces_on_subdir); ATF_ADD_TEST_CASE(tcs, change_directory); ATF_ADD_TEST_CASE(tcs, get_current_dir); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/signals.cpp0000644000470500017500000000760612271526120021103 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif extern "C" { #include #include } #include #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/sanity.hpp" #include "signals.hpp" namespace impl = atf::atf_run; #define IMPL_NAME "atf::atf_run" const int impl::last_signo = LAST_SIGNO; // ------------------------------------------------------------------------ // The "signal_holder" class. // ------------------------------------------------------------------------ namespace { static bool happened[LAST_SIGNO + 1]; static void holder_handler(const int signo) { happened[signo] = true; } } // anonymous namespace impl::signal_holder::signal_holder(const int signo) : m_signo(signo), m_sp(NULL) { happened[signo] = false; m_sp = new signal_programmer(m_signo, holder_handler); } impl::signal_holder::~signal_holder(void) { if (m_sp != NULL) delete m_sp; if (happened[m_signo]) ::kill(::getpid(), m_signo); } void impl::signal_holder::process(void) { if (happened[m_signo]) { delete m_sp; m_sp = NULL; happened[m_signo] = false; ::kill(::getpid(), m_signo); m_sp = new signal_programmer(m_signo, holder_handler); } } // ------------------------------------------------------------------------ // The "signal_programmer" class. // ------------------------------------------------------------------------ impl::signal_programmer::signal_programmer(const int signo, const handler h) : m_signo(signo), m_handler(h), m_programmed(false) { struct ::sigaction sa; sa.sa_handler = m_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (::sigaction(m_signo, &sa, &m_oldsa) == -1) throw atf::system_error(IMPL_NAME, "Could not install handler for " "signal", errno); m_programmed = true; } impl::signal_programmer::~signal_programmer(void) { unprogram(); } void impl::signal_programmer::unprogram(void) { if (m_programmed) { if (::sigaction(m_signo, &m_oldsa, NULL) == -1) UNREACHABLE; m_programmed = false; } } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ void impl::reset(const int signo) { struct ::sigaction sa; sa.sa_handler = SIG_DFL; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; (void)::sigaction(signo, &sa, NULL); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/user_test.cpp0000644000470500017500000001056612271526120021457 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include } #include #include #include "../atf-c++/macros.hpp" #include "user.hpp" // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(euid); ATF_TEST_CASE_HEAD(euid) { set_md_var("descr", "Tests the euid function"); } ATF_TEST_CASE_BODY(euid) { using atf::atf_run::euid; ATF_REQUIRE_EQ(euid(), ::geteuid()); } ATF_TEST_CASE(is_member_of_group); ATF_TEST_CASE_HEAD(is_member_of_group) { set_md_var("descr", "Tests the is_member_of_group function"); } ATF_TEST_CASE_BODY(is_member_of_group) { using atf::atf_run::is_member_of_group; std::set< gid_t > groups; gid_t maxgid = 0; { gid_t gids[NGROUPS_MAX]; int ngids = ::getgroups(NGROUPS_MAX, gids); if (ngids == -1) ATF_FAIL("Call to ::getgroups failed"); for (int i = 0; i < ngids; i++) { groups.insert(gids[i]); if (gids[i] > maxgid) maxgid = gids[i]; } std::cout << "User belongs to " << ngids << " groups\n"; std::cout << "Last GID is " << maxgid << "\n"; } const gid_t maxgid_limit = 1 << 16; if (maxgid > maxgid_limit) { std::cout << "Test truncated from " << maxgid << " groups to " << maxgid_limit << " to keep the run time reasonable " "enough\n"; maxgid = maxgid_limit; } for (gid_t g = 0; g <= maxgid; g++) { if (groups.find(g) == groups.end()) { std::cout << "Checking if user does not belong to group " << g << "\n"; ATF_REQUIRE(!is_member_of_group(g)); } else { std::cout << "Checking if user belongs to group " << g << "\n"; ATF_REQUIRE(is_member_of_group(g)); } } } ATF_TEST_CASE(is_root); ATF_TEST_CASE_HEAD(is_root) { set_md_var("descr", "Tests the is_root function"); } ATF_TEST_CASE_BODY(is_root) { using atf::atf_run::is_root; if (::geteuid() == 0) { ATF_REQUIRE(is_root()); } else { ATF_REQUIRE(!is_root()); } } ATF_TEST_CASE(is_unprivileged); ATF_TEST_CASE_HEAD(is_unprivileged) { set_md_var("descr", "Tests the is_unprivileged function"); } ATF_TEST_CASE_BODY(is_unprivileged) { using atf::atf_run::is_unprivileged; if (::geteuid() != 0) { ATF_REQUIRE(is_unprivileged()); } else { ATF_REQUIRE(!is_unprivileged()); } } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the free functions. ATF_ADD_TEST_CASE(tcs, euid); ATF_ADD_TEST_CASE(tcs, is_member_of_group); ATF_ADD_TEST_CASE(tcs, is_root); ATF_ADD_TEST_CASE(tcs, is_unprivileged); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/Makefile.am.inc0000644000470500017500000001452612271526120021542 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # bin_PROGRAMS += atf-run/atf-run atf_run_atf_run_CPPFLAGS = "-DGDB=\"$(GDB)\"" atf_run_atf_run_SOURCES = atf-run/atf-run.cpp \ atf-run/atffile.cpp \ atf-run/atffile.hpp \ atf-run/config.cpp \ atf-run/config.hpp \ atf-run/fs.cpp \ atf-run/fs.hpp \ atf-run/io.cpp \ atf-run/io.hpp \ atf-run/requirements.cpp \ atf-run/requirements.hpp \ atf-run/signals.cpp \ atf-run/signals.hpp \ atf-run/test-program.cpp \ atf-run/test-program.hpp \ atf-run/timer.cpp \ atf-run/timer.hpp \ atf-run/user.cpp \ atf-run/user.hpp atf_run_atf_run_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-run/atf-run.1 tests_atf_run_DATA = atf-run/Atffile \ atf-run/Kyuafile tests_atf_rundir = $(pkgtestsdir)/atf-run EXTRA_DIST += $(tests_atf_run_DATA) tests_atf_run_PROGRAMS = atf-run/atffile_test atf_run_atffile_test_SOURCES = atf-run/atffile_test.cpp \ atf-run/atffile.cpp atf_run_atffile_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail atf_run_atffile_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/bad_metadata_helper atf_run_bad_metadata_helper_SOURCES = atf-run/bad_metadata_helper.c atf_run_bad_metadata_helper_LDADD = libatf-c.la tests_atf_run_PROGRAMS += atf-run/config_test atf_run_config_test_SOURCES = atf-run/config_test.cpp \ atf-run/config.cpp atf_run_config_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail atf_run_config_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/expect_helpers atf_run_expect_helpers_SOURCES = atf-run/expect_helpers.c atf_run_expect_helpers_LDADD = libatf-c.la tests_atf_run_PROGRAMS += atf-run/fs_test atf_run_fs_test_SOURCES = atf-run/fs_test.cpp \ atf-run/fs.cpp \ atf-run/user.cpp atf_run_fs_test_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/io_test atf_run_io_test_SOURCES = atf-run/io_test.cpp \ atf-run/io.cpp \ atf-run/signals.cpp atf_run_io_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/misc_helpers atf_run_misc_helpers_SOURCES = atf-run/misc_helpers.cpp atf_run_misc_helpers_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/pass_helper atf_run_pass_helper_SOURCES = atf-run/pass_helper.cpp atf_run_pass_helper_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/several_tcs_helper atf_run_several_tcs_helper_SOURCES = atf-run/several_tcs_helper.c atf_run_several_tcs_helper_LDADD = libatf-c.la tests_atf_run_PROGRAMS += atf-run/requirements_test atf_run_requirements_test_SOURCES = atf-run/requirements_test.cpp \ atf-run/requirements.cpp \ atf-run/user.cpp atf_run_requirements_test_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/signals_test atf_run_signals_test_SOURCES = atf-run/signals_test.cpp atf-run/signals.cpp atf_run_signals_test_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/test_program_test atf_run_test_program_test_SOURCES = atf-run/test_program_test.cpp \ atf-run/fs.cpp \ atf-run/io.cpp \ atf-run/requirements.cpp \ atf-run/signals.cpp \ atf-run/test-program.cpp \ atf-run/timer.cpp \ atf-run/user.cpp atf_run_test_program_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail atf_run_test_program_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/user_test atf_run_user_test_SOURCES = atf-run/user_test.cpp atf-run/user.cpp atf_run_user_test_LDADD = $(ATF_CXX_LIBS) tests_atf_run_PROGRAMS += atf-run/zero_tcs_helper atf_run_zero_tcs_helper_SOURCES = atf-run/zero_tcs_helper.c atf_run_zero_tcs_helper_LDADD = libatf-c.la tests_atf_run_SCRIPTS = atf-run/integration_test CLEANFILES += atf-run/integration_test EXTRA_DIST += atf-run/integration_test.sh atf-run/integration_test: $(srcdir)/atf-run/integration_test.sh test -d atf-run || mkdir -p atf-run @src="$(srcdir)/atf-run/integration_test.sh"; \ dst="atf-run/integration_test"; $(BUILD_SH_TP) hooksdir = $(pkgdatadir) hooks_DATA = atf-run/share/atf-run.hooks EXTRA_DIST += $(hooks_DATA) egdir = $(atf_egdir) eg_DATA = atf-run/sample/atf-run.hooks eg_DATA += atf-run/sample/common.conf EXTRA_DIST += $(eg_DATA) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-run/atf-run.10000644000470500017500000001402012271526120020361 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd November 1, 2010 .Dt ATF-RUN 1 .Os .Sh NAME .Nm atf-run .Nd executes a collection of test programs .Sh SYNOPSIS .Nm .Op Fl v Ar var1=value1 Op .. Fl v Ar varN=valueN .Op Ar test_program1 Op Ar .. test_programN .Nm .Fl h .Sh DESCRIPTION .Nm executes a collection of test programs or, in other words, a complete test suite. The results of each test program are collected by the tool, and are then multiplexed into a single machine-parseable report; see .Xr atf-formats 5 for more details. This report can later be transformed into many different and saner formats using the .Nm atf-report tool. .Pp The list of test programs to execute is read from an .Pa Atffile present in the current directory. This file describes the test suite stored in the directory it lives in, which aside from the list of test programs also includes meta-data and configuration variables. .Pp .Nm is also in charge of reading the configuration files that tune the behavior of each test program and passing down the necessary variables to them. More details on how this is done are given in the .Sx Configuration section. .Pp In the first synopsis form, .Nm parses the .Pa Atffile in the current directory and runs all the test programs specified in it. If any test program names are given as part of the command line, those are the ones executed instead of the complete list. .Pp In the second synopsis form, .Nm will print information about all supported options and their purpose. .Pp The following options are available: .Bl -tag -width XvXvarXvalueXX .It Fl h Shows a short summary of all available options and their purpose. .It Fl v Ar var=value Sets the configuration variable .Ar var to the given value .Ar value . .El .Ss Configuration .Nm reads configuration data from multiple places. After all of these places have been analyzed, a list of variable-value pairs are passed to the test programs to be run. .Pp The following locations are scanned for configuration data, in order. Items down the list override values defined above them: .Bl -enum .It Configuration variables defined in the .Pa Atffile . .It Configuration variables defined in the system-wide configuration file shared among all test suites. This lives in .Pa ${ATF_CONFDIR}/common.conf . .It Configuration variables defined in the system-wide test-suite-specific configuration file. This lives in .Pa ${ATF_CONFDIR}/.conf . .It Configuration variables defined in the user-specific configuration file shared among all test suites. This lives in .Pa ${HOME}/.atf/common.conf . .It Configuration variables defined in the user-specific test-suite-specific configuration file. This lives in .Pa ${HOME}/.atf/.conf . .It Configuration variables provided as part of the command line through the .Fl v option. .El .Pp The value of .Va ATF_CONFDIR in the above list determined as detailed in .Xr atf-config 1 . .Pp The following configuration variables are globally recognized: .Bl -tag -width XunprivilegedXuserXX .It Va unprivileged-user The name of the system user that atf-run will drop root privileges into for test cases defining .Sq require.user=unprivileged . Note that this is .Em not provided for security purposes ; this feature is only for the convenience of the user. .El .Ss Hooks .Nm Ns 's internal behavior can be customized by the system administrator and the user by means of hooks. These hooks are written in the shell script language for simplicity and are stored in the following files, which are read in the order provided below: .Bl -enum .It ${ATF_CONFDIR}/atf-run.hooks .It ${HOME}/.atf/atf-run.hooks .El .Pp The following hooks are supported: .Bl -tag -width infoXstartXhookXX .It info_start_hook Called before .Nm executes any test program. The purpose of this hook is to write additional .Sq info stanzas to the top of the output report; these are defined by the .Sq application/X-atf-tps format described in .Xr atf-formats 5 . Always use the .Sq atf_tps_writer_info function to print these. .Pp This takes no parameters. .It info_end_hook Similar to .Sq info_start_hook but executed after all test programs have been run so that additional .Sq info stanzas can be added to the bottom of the output report. .Pp This takes no parameters. .El .Pp All hooks are accompanied by a function named .Sq default_ that can be executed by them to invoke the default behavior built into .Nm . For example, in order to extend the default .Sq info_start_hook hook, we could write the following function: .Bd -literal -offset indent info_start_hook() { default_info_start_hook "${@}" atf_tps_writer_info "uptime" "$(uptime)" } .Ed .Sh SEE ALSO .Xr atf-report 1 , .Xr atf-test-program 1 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-run/fs.cpp0000644000470500017500000002067212271526120020051 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif extern "C" { #include #include #include #include #include } #include #include #include #include "atf-c++/detail/auto_array.hpp" #include "atf-c++/detail/process.hpp" #include "atf-c++/detail/sanity.hpp" #include "fs.hpp" #include "user.hpp" namespace impl = atf::atf_run; #define IMPL_NAME "atf::atf_run" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void cleanup_aux(const atf::fs::path&, dev_t, bool); static void cleanup_aux_dir(const atf::fs::path&, const atf::fs::file_info&, bool); static void do_unmount(const atf::fs::path&); // The cleanup routines below are tricky: they are executed immediately after // a test case's death, and after we have forcibly killed any stale processes. // However, even if the processes are dead, this does not mean that the file // system we are scanning is stable. In particular, if the test case has // mounted file systems through fuse/puffs, the fact that the processes died // does not mean that the file system is truly unmounted. // // The code below attempts to cope with this by catching errors and either // ignoring them or retrying the actions on the same file/directory a few times // before giving up. static const int max_retries = 5; static const int retry_delay_in_seconds = 1; // The erase parameter in this routine is to control nested mount points. // We want to descend into a mount point to unmount anything that is // mounted under it, but we do not want to delete any files while doing // this traversal. In other words, we erase files until we cross the // first mount point, and after that point we only scan and unmount. static void cleanup_aux(const atf::fs::path& p, dev_t parent_device, bool erase) { try { atf::fs::file_info fi(p); if (fi.get_type() == atf::fs::file_info::dir_type) cleanup_aux_dir(p, fi, fi.get_device() == parent_device); if (fi.get_device() != parent_device) do_unmount(p); if (erase) { if (fi.get_type() == atf::fs::file_info::dir_type) atf::fs::rmdir(p); else atf::fs::remove(p); } } catch (const atf::system_error& e) { if (e.code() != ENOENT && e.code() != ENOTDIR) throw e; } } static void cleanup_aux_dir(const atf::fs::path& p, const atf::fs::file_info& fi, bool erase) { if (erase && ((fi.get_mode() & S_IRWXU) != S_IRWXU)) { int retries = max_retries; retry_chmod: if (chmod(p.c_str(), fi.get_mode() | S_IRWXU) == -1) { if (retries > 0) { retries--; ::sleep(retry_delay_in_seconds); goto retry_chmod; } else { throw atf::system_error(IMPL_NAME "::cleanup(" + p.str() + ")", "chmod(2) failed", errno); } } } std::set< std::string > subdirs; { bool ok = false; int retries = max_retries; while (!ok) { INV(retries > 0); try { const atf::fs::directory d(p); subdirs = d.names(); ok = true; } catch (const atf::system_error& e) { retries--; if (retries == 0) throw e; ::sleep(retry_delay_in_seconds); } } INV(ok); } for (std::set< std::string >::const_iterator iter = subdirs.begin(); iter != subdirs.end(); iter++) { const std::string& name = *iter; if (name != "." && name != "..") cleanup_aux(p / name, fi.get_device(), erase); } } static void do_unmount(const atf::fs::path& in_path) { // At least, FreeBSD's unmount(2) requires the path to be absolute. // Let's make it absolute in all cases just to be safe that this does // not affect other systems. const atf::fs::path& abs_path = in_path.is_absolute() ? in_path : in_path.to_absolute(); #if defined(HAVE_UNMOUNT) int retries = max_retries; retry_unmount: if (unmount(abs_path.c_str(), 0) == -1) { if (errno == EBUSY && retries > 0) { retries--; ::sleep(retry_delay_in_seconds); goto retry_unmount; } else { throw atf::system_error(IMPL_NAME "::cleanup(" + in_path.str() + ")", "unmount(2) failed", errno); } } #else // We could use umount(2) instead if it was available... but // trying to do so under, e.g. Linux, is a nightmare because we // also have to update /etc/mtab to match what we did. It is // satf::fser to just leave the system-specific umount(8) tool deal // with it, at least for now. const atf::fs::path prog("umount"); atf::process::argv_array argv("umount", abs_path.c_str(), NULL); atf::process::status s = atf::process::exec(prog, argv, atf::process::stream_inherit(), atf::process::stream_inherit()); if (!s.exited() || s.exitstatus() != EXIT_SUCCESS) throw std::runtime_error("Call to unmount failed"); #endif } // ------------------------------------------------------------------------ // The "temp_dir" class. // ------------------------------------------------------------------------ impl::temp_dir::temp_dir(const atf::fs::path& p) { atf::auto_array< char > buf(new char[p.str().length() + 1]); std::strcpy(buf.get(), p.c_str()); if (::mkdtemp(buf.get()) == NULL) throw system_error(IMPL_NAME "::temp_dir::temp_dir(" + p.str() + ")", "mkdtemp(3) failed", errno); m_path.reset(new atf::fs::path(buf.get())); } impl::temp_dir::~temp_dir(void) { cleanup(*m_path); } const atf::fs::path& impl::temp_dir::get_path(void) const { return *m_path; } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ atf::fs::path impl::change_directory(const atf::fs::path& dir) { atf::fs::path olddir = get_current_dir(); if (olddir != dir) { if (::chdir(dir.c_str()) == -1) throw system_error(IMPL_NAME "::chdir(" + dir.str() + ")", "chdir(2) failed", errno); } return olddir; } void impl::cleanup(const atf::fs::path& p) { atf::fs::file_info fi(p); cleanup_aux(p, fi.get_device(), true); } atf::fs::path impl::get_current_dir(void) { std::auto_ptr< char > cwd; #if defined(HAVE_GETCWD_DYN) cwd.reset(getcwd(NULL, 0)); #else cwd.reset(getcwd(NULL, MAXPATHLEN)); #endif if (cwd.get() == NULL) throw atf::system_error(IMPL_NAME "::get_current_dir()", "getcwd() failed", errno); return atf::fs::path(cwd.get()); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/zero_tcs_helper.c0000644000470500017500000000300412271526120022256 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include ATF_TP_ADD_TCS(tp) { if (tp != NULL) {} /* Use tp. */ return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/config.cpp0000644000470500017500000001434512271526120020706 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "atf-c/defs.h" #include "atf-c++/config.hpp" #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/parser.hpp" #include "config.hpp" namespace impl = atf::atf_run; namespace detail = atf::atf_run::detail; namespace { namespace atf_config { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type text_type = 2; static const atf::parser::token_type dblquote_type = 3; static const atf::parser::token_type equal_type = 4; static const atf::parser::token_type hash_type = 5; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, size_t curline) : atf::parser::tokenizer< std::istream > (is, true, eof_type, nl_type, text_type, curline) { add_delim('=', equal_type); add_delim('#', hash_type); add_quote('"', dblquote_type); } }; } // namespace atf_config class config_reader : public detail::atf_config_reader { atf::tests::vars_map m_vars; void got_var(const std::string& var, const std::string& name) { m_vars[var] = name; } public: config_reader(std::istream& is) : atf_config_reader(is) { } const atf::tests::vars_map& get_vars(void) const { return m_vars; } }; template< class K, class V > static void merge_maps(std::map< K, V >& dest, const std::map< K, V >& src) { for (typename std::map< K, V >::const_iterator iter = src.begin(); iter != src.end(); iter++) dest[(*iter).first] = (*iter).second; } static void merge_config_file(const atf::fs::path& config_path, atf::tests::vars_map& config) { std::ifstream is(config_path.c_str()); if (is) { config_reader reader(is); reader.read(); merge_maps(config, reader.get_vars()); } } static std::vector< atf::fs::path > get_config_dirs(void) { std::vector< atf::fs::path > dirs; dirs.push_back(atf::fs::path(atf::config::get("atf_confdir"))); if (atf::env::has("HOME")) dirs.push_back(atf::fs::path(atf::env::get("HOME")) / ".atf"); return dirs; } } // anonymous namespace detail::atf_config_reader::atf_config_reader(std::istream& is) : m_is(is) { } detail::atf_config_reader::~atf_config_reader(void) { } void detail::atf_config_reader::got_var( const std::string& var ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& val ATF_DEFS_ATTRIBUTE_UNUSED) { } void detail::atf_config_reader::got_eof(void) { } void detail::atf_config_reader::read(void) { using atf::parser::parse_error; using namespace atf_config; std::pair< size_t, atf::parser::headers_map > hml = atf::parser::read_headers(m_is, 1); atf::parser::validate_content_type(hml.second, "application/X-atf-config", 1); tokenizer tkz(m_is, hml.first); atf::parser::parser< tokenizer > p(tkz); for (;;) { try { atf::parser::token t = p.expect(eof_type, hash_type, text_type, nl_type, "eof, #, new line or text"); if (t.type() == eof_type) break; if (t.type() == hash_type) { (void)p.rest_of_line(); t = p.expect(nl_type, "new line"); } else if (t.type() == text_type) { std::string name = t.text(); t = p.expect(equal_type, "equal sign"); t = p.expect(text_type, "word or quoted string"); ATF_PARSER_CALLBACK(p, got_var(name, t.text())); t = p.expect(nl_type, hash_type, "new line or comment"); if (t.type() == hash_type) { (void)p.rest_of_line(); t = p.expect(nl_type, "new line"); } } else if (t.type() == nl_type) { } else UNREACHABLE; } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } ATF_PARSER_CALLBACK(p, got_eof()); } atf::tests::vars_map impl::merge_configs(const atf::tests::vars_map& lower, const atf::tests::vars_map& upper) { atf::tests::vars_map merged = lower; merge_maps(merged, upper); return merged; } atf::tests::vars_map impl::read_config_files(const std::string& test_suite_name) { atf::tests::vars_map config; const std::vector< atf::fs::path > dirs = get_config_dirs(); for (std::vector< atf::fs::path >::const_iterator iter = dirs.begin(); iter != dirs.end(); iter++) { merge_config_file((*iter) / "common.conf", config); merge_config_file((*iter) / (test_suite_name + ".conf"), config); } return config; } bind9-9.9.5.dfsg/unit/atf-src/atf-run/Kyuafile0000644000470500017500000000060012271526120020416 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="atffile_test"} atf_test_program{name="config_test"} atf_test_program{name="fs_test"} atf_test_program{name="integration_test"} atf_test_program{name="io_test"} atf_test_program{name="requirements_test"} atf_test_program{name="signals_test"} atf_test_program{name="test_program_test"} atf_test_program{name="user_test"} bind9-9.9.5.dfsg/unit/atf-src/atf-run/atf-run.cpp0000644000470500017500000004416012271526120021013 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif extern "C" { #include #include #include #include #include } #include #include #include #include #include #include #include #include #include "atf-c++/detail/application.hpp" #include "atf-c++/config.hpp" #include "atf-c++/tests.hpp" #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/process.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" #include "atffile.hpp" #include "config.hpp" #include "fs.hpp" #include "requirements.hpp" #include "test-program.hpp" namespace impl = atf::atf_run; #if defined(MAXCOMLEN) static const std::string::size_type max_core_name_length = MAXCOMLEN; #else static const std::string::size_type max_core_name_length = std::string::npos; #endif class atf_run : public atf::application::app { static const char* m_description; atf::tests::vars_map m_cmdline_vars; static atf::tests::vars_map::value_type parse_var(const std::string&); void process_option(int, const char*); std::string specific_args(void) const; options_set specific_options(void) const; void parse_vflag(const std::string&); std::vector< std::string > conf_args(void) const; size_t count_tps(std::vector< std::string >) const; int run_test(const atf::fs::path&, impl::atf_tps_writer&, const atf::tests::vars_map&); int run_test_directory(const atf::fs::path&, impl::atf_tps_writer&); int run_test_program(const atf::fs::path&, impl::atf_tps_writer&, const atf::tests::vars_map&); impl::test_case_result get_test_case_result(const std::string&, const atf::process::status&, const atf::fs::path&) const; public: atf_run(void); int main(void); }; static void sanitize_gdb_env(void) { try { atf::env::unset("TERM"); } catch (...) { // Just swallow exceptions here; they cannot propagate into C, which // is where this function is called from, and even if these exceptions // appear they are benign. } } static void dump_stacktrace(const atf::fs::path& tp, const atf::process::status& s, const atf::fs::path& workdir, impl::atf_tps_writer& w) { PRE(s.signaled() && s.coredump()); w.stderr_tc("Test program crashed; attempting to get stack trace"); const atf::fs::path corename = workdir / (tp.leaf_name().substr(0, max_core_name_length) + ".core"); if (!atf::fs::exists(corename)) { w.stderr_tc("Expected file " + corename.str() + " not found"); return; } const atf::fs::path gdb(GDB); const atf::fs::path gdbout = workdir / "gdb.out"; const atf::process::argv_array args(gdb.leaf_name().c_str(), "-batch", "-q", "-ex", "bt", tp.c_str(), corename.c_str(), NULL); atf::process::status status = atf::process::exec( gdb, args, atf::process::stream_redirect_path(gdbout), atf::process::stream_redirect_path(atf::fs::path("/dev/null")), sanitize_gdb_env); if (!status.exited() || status.exitstatus() != EXIT_SUCCESS) { w.stderr_tc("Execution of " GDB " failed"); return; } std::ifstream input(gdbout.c_str()); if (input) { std::string line; while (std::getline(input, line).good()) w.stderr_tc(line); input.close(); } w.stderr_tc("Stack trace complete"); } const char* atf_run::m_description = "atf-run is a tool that runs tests programs and collects their " "results."; atf_run::atf_run(void) : app(m_description, "atf-run(1)", "atf(7)") { } void atf_run::process_option(int ch, const char* arg) { switch (ch) { case 'v': parse_vflag(arg); break; default: UNREACHABLE; } } std::string atf_run::specific_args(void) const { return "[test-program1 .. test-programN]"; } atf_run::options_set atf_run::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('v', "var=value", "Sets the configuration variable " "`var' to `value'; overrides " "values in configuration files")); return opts; } void atf_run::parse_vflag(const std::string& str) { if (str.empty()) throw std::runtime_error("-v requires a non-empty argument"); std::vector< std::string > ws = atf::text::split(str, "="); if (ws.size() == 1 && str[str.length() - 1] == '=') { m_cmdline_vars[ws[0]] = ""; } else { if (ws.size() != 2) throw std::runtime_error("-v requires an argument of the form " "var=value"); m_cmdline_vars[ws[0]] = ws[1]; } } int atf_run::run_test(const atf::fs::path& tp, impl::atf_tps_writer& w, const atf::tests::vars_map& config) { atf::fs::file_info fi(tp); int errcode; if (fi.get_type() == atf::fs::file_info::dir_type) errcode = run_test_directory(tp, w); else { const atf::tests::vars_map effective_config = impl::merge_configs(config, m_cmdline_vars); errcode = run_test_program(tp, w, effective_config); } return errcode; } int atf_run::run_test_directory(const atf::fs::path& tp, impl::atf_tps_writer& w) { impl::atffile af = impl::read_atffile(tp / "Atffile"); atf::tests::vars_map test_suite_vars; { atf::tests::vars_map::const_iterator iter = af.props().find("test-suite"); INV(iter != af.props().end()); test_suite_vars = impl::read_config_files((*iter).second); } bool ok = true; for (std::vector< std::string >::const_iterator iter = af.tps().begin(); iter != af.tps().end(); iter++) { const bool result = run_test(tp / *iter, w, impl::merge_configs(af.conf(), test_suite_vars)); ok &= (result == EXIT_SUCCESS); } return ok ? EXIT_SUCCESS : EXIT_FAILURE; } impl::test_case_result atf_run::get_test_case_result(const std::string& broken_reason, const atf::process::status& s, const atf::fs::path& resfile) const { using atf::text::to_string; using impl::read_test_case_result; using impl::test_case_result; if (!broken_reason.empty()) { test_case_result tcr; try { tcr = read_test_case_result(resfile); if (tcr.state() == "expected_timeout") { return tcr; } else { return test_case_result("failed", -1, broken_reason); } } catch (const std::runtime_error&) { return test_case_result("failed", -1, broken_reason); } } if (s.exited()) { test_case_result tcr; try { tcr = read_test_case_result(resfile); } catch (const std::runtime_error& e) { return test_case_result("failed", -1, "Test case exited " "normally but failed to create the results file: " + std::string(e.what())); } if (tcr.state() == "expected_death") { return tcr; } else if (tcr.state() == "expected_exit") { if (tcr.value() == -1 || s.exitstatus() == tcr.value()) return tcr; else return test_case_result("failed", -1, "Test case was " "expected to exit with a " + to_string(tcr.value()) + " error code but returned " + to_string(s.exitstatus())); } else if (tcr.state() == "expected_failure") { if (s.exitstatus() == EXIT_SUCCESS) return tcr; else return test_case_result("failed", -1, "Test case returned an " "error in expected_failure mode but it should not have"); } else if (tcr.state() == "expected_signal") { return test_case_result("failed", -1, "Test case exited cleanly " "but was expected to receive a signal"); } else if (tcr.state() == "failed") { if (s.exitstatus() == EXIT_SUCCESS) return test_case_result("failed", -1, "Test case " "exited successfully but reported failure"); else return tcr; } else if (tcr.state() == "passed") { if (s.exitstatus() == EXIT_SUCCESS) return tcr; else return test_case_result("failed", -1, "Test case exited as " "passed but reported an error"); } else if (tcr.state() == "skipped") { if (s.exitstatus() == EXIT_SUCCESS) return tcr; else return test_case_result("failed", -1, "Test case exited as " "skipped but reported an error"); } } else if (s.signaled()) { test_case_result tcr; try { tcr = read_test_case_result(resfile); } catch (const std::runtime_error&) { return test_case_result("failed", -1, "Test program received " "signal " + atf::text::to_string(s.termsig()) + (s.coredump() ? " (core dumped)" : "")); } if (tcr.state() == "expected_death") { return tcr; } else if (tcr.state() == "expected_signal") { if (tcr.value() == -1 || s.termsig() == tcr.value()) return tcr; else return test_case_result("failed", -1, "Test case was " "expected to exit due to a " + to_string(tcr.value()) + " signal but got " + to_string(s.termsig())); } else { return test_case_result("failed", -1, "Test program received " "signal " + atf::text::to_string(s.termsig()) + (s.coredump() ? " (core dumped)" : "") + " and created a " "bogus results file"); } } UNREACHABLE; return test_case_result(); } int atf_run::run_test_program(const atf::fs::path& tp, impl::atf_tps_writer& w, const atf::tests::vars_map& config) { int errcode = EXIT_SUCCESS; impl::metadata md; try { md = impl::get_metadata(tp, config); } catch (const atf::parser::format_error& e) { w.start_tp(tp.str(), 0); w.end_tp("Invalid format for test case list: " + std::string(e.what())); return EXIT_FAILURE; } catch (const atf::parser::parse_errors& e) { const std::string reason = atf::text::join(e, "; "); w.start_tp(tp.str(), 0); w.end_tp("Invalid format for test case list: " + reason); return EXIT_FAILURE; } impl::temp_dir resdir(atf::fs::path(atf::config::get("atf_workdir")) / "atf-run.XXXXXX"); w.start_tp(tp.str(), md.test_cases.size()); if (md.test_cases.empty()) { w.end_tp("Bogus test program: reported 0 test cases"); errcode = EXIT_FAILURE; } else { for (std::map< std::string, atf::tests::vars_map >::const_iterator iter = md.test_cases.begin(); iter != md.test_cases.end(); iter++) { const std::string& tcname = (*iter).first; const atf::tests::vars_map& tcmd = (*iter).second; w.start_tc(tcname); try { const std::string& reqfail = impl::check_requirements( tcmd, config); if (!reqfail.empty()) { w.end_tc("skipped", reqfail); continue; } } catch (const std::runtime_error& e) { w.end_tc("failed", e.what()); errcode = EXIT_FAILURE; continue; } const std::pair< int, int > user = impl::get_required_user( tcmd, config); atf::fs::path resfile = resdir.get_path() / "tcr"; INV(!atf::fs::exists(resfile)); try { const bool has_cleanup = atf::text::to_bool( (*tcmd.find("has.cleanup")).second); impl::temp_dir workdir(atf::fs::path(atf::config::get( "atf_workdir")) / "atf-run.XXXXXX"); if (user.first != -1 && user.second != -1) { if (::chown(workdir.get_path().c_str(), user.first, user.second) == -1) { throw atf::system_error("chown(" + workdir.get_path().str() + ")", "chown(2) failed", errno); } resfile = workdir.get_path() / "tcr"; } std::pair< std::string, const atf::process::status > s = impl::run_test_case(tp, tcname, "body", tcmd, config, resfile, workdir.get_path(), w); if (s.second.signaled() && s.second.coredump()) dump_stacktrace(tp, s.second, workdir.get_path(), w); if (has_cleanup) (void)impl::run_test_case(tp, tcname, "cleanup", tcmd, config, resfile, workdir.get_path(), w); // TODO: Force deletion of workdir. impl::test_case_result tcr = get_test_case_result(s.first, s.second, resfile); w.end_tc(tcr.state(), tcr.reason()); if (tcr.state() == "failed") errcode = EXIT_FAILURE; } catch (...) { if (atf::fs::exists(resfile)) atf::fs::remove(resfile); throw; } if (atf::fs::exists(resfile)) atf::fs::remove(resfile); } w.end_tp(""); } return errcode; } size_t atf_run::count_tps(std::vector< std::string > tps) const { size_t ntps = 0; for (std::vector< std::string >::const_iterator iter = tps.begin(); iter != tps.end(); iter++) { atf::fs::path tp(*iter); atf::fs::file_info fi(tp); if (fi.get_type() == atf::fs::file_info::dir_type) { impl::atffile af = impl::read_atffile(tp / "Atffile"); std::vector< std::string > aux = af.tps(); for (std::vector< std::string >::iterator i2 = aux.begin(); i2 != aux.end(); i2++) *i2 = (tp / *i2).str(); ntps += count_tps(aux); } else ntps++; } return ntps; } static void call_hook(const std::string& tool, const std::string& hook) { const atf::fs::path sh(atf::config::get("atf_shell")); const atf::fs::path hooks = atf::fs::path(atf::config::get("atf_pkgdatadir")) / (tool + ".hooks"); const atf::process::status s = atf::process::exec(sh, atf::process::argv_array(sh.c_str(), hooks.c_str(), hook.c_str(), NULL), atf::process::stream_inherit(), atf::process::stream_inherit()); if (!s.exited() || s.exitstatus() != EXIT_SUCCESS) throw std::runtime_error("Failed to run the '" + hook + "' hook " "for '" + tool + "'"); } int atf_run::main(void) { impl::atffile af = impl::read_atffile(atf::fs::path("Atffile")); std::vector< std::string > tps; tps = af.tps(); if (m_argc >= 1) { // TODO: Ensure that the given test names are listed in the // Atffile. Take into account that the file can be using globs. tps.clear(); for (int i = 0; i < m_argc; i++) tps.push_back(m_argv[i]); } // Read configuration data for this test suite. atf::tests::vars_map test_suite_vars; { atf::tests::vars_map::const_iterator iter = af.props().find("test-suite"); INV(iter != af.props().end()); test_suite_vars = impl::read_config_files((*iter).second); } impl::atf_tps_writer w(std::cout); call_hook("atf-run", "info_start_hook"); w.ntps(count_tps(tps)); bool ok = true; for (std::vector< std::string >::const_iterator iter = tps.begin(); iter != tps.end(); iter++) { const bool result = run_test(atf::fs::path(*iter), w, impl::merge_configs(af.conf(), test_suite_vars)); ok &= (result == EXIT_SUCCESS); } call_hook("atf-run", "info_end_hook"); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } int main(int argc, char* const* argv) { return atf_run().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/io.hpp0000644000470500017500000003610412271526120020052 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_IO_HPP_) #define _ATF_RUN_IO_HPP_ #include #include #include #include "fs.hpp" #include "../atf-c++/detail/auto_array.hpp" #include "../atf-c++/noncopyable.hpp" namespace atf { namespace atf_run { // ------------------------------------------------------------------------ // The "file_handle" class. // ------------------------------------------------------------------------ //! //! \brief Simple RAII model for system file handles. //! //! The \a file_handle class is a simple RAII model for native system file //! handles. This class wraps one of such handles grabbing its ownership, //! and automaticaly closes it upon destruction. It is basically used //! inside the library to avoid leaking open file handles, shall an //! unexpected execution trace occur. //! //! A \a file_handle object can be copied but doing so invalidates the //! source object. There can only be a single valid \a file_handle object //! for a given system file handle. This is similar to std::auto_ptr\<\>'s //! semantics. //! //! This class also provides some convenience methods to issue special file //! operations under their respective platforms. //! class file_handle { public: //! //! \brief Opaque name for the native handle type. //! //! Each operating system identifies file handles using a specific type. //! The \a handle_type type is used to transparently refer to file //! handles regarless of the operating system in which this class is //! used. //! //! If this class is used in a POSIX system, \a NativeSystemHandle is //! an integer type while it is a \a HANDLE in a Win32 system. //! typedef int handle_type; //! //! \brief Constructs an invalid file handle. //! //! This constructor creates a new \a file_handle object that represents //! an invalid file handle. An invalid file handle can be copied but //! cannot be manipulated in any way (except checking for its validity). //! //! \see is_valid() //! file_handle(void); //! //! \brief Constructs a new file handle from a native file handle. //! //! This constructor creates a new \a file_handle object that takes //! ownership of the given \a h native file handle. The user must not //! close \a h on his own during the lifetime of the new object. //! Ownership can be reclaimed using disown(). //! //! \pre The native file handle must be valid; a close operation must //! succeed on it. //! //! \see disown() //! file_handle(handle_type h); //! //! \brief Copy constructor; invalidates the source handle. //! //! This copy constructor creates a new file handle from a given one. //! Ownership of the native file handle is transferred to the new //! object, effectively invalidating the source file handle. This //! avoids having two live \a file_handle objects referring to the //! same native file handle. The source file handle need not be //! valid in the name of simplicity. //! //! \post The source file handle is invalid. //! \post The new file handle owns the source's native file handle. //! file_handle(const file_handle& fh); //! //! \brief Releases resources if the handle is valid. //! //! If the file handle is valid, the destructor closes it. //! //! \see is_valid() //! ~file_handle(void); //! //! \brief Assignment operator; invalidates the source handle. //! //! This assignment operator transfers ownership of the RHS file //! handle to the LHS one, effectively invalidating the source file //! handle. This avoids having two live \a file_handle objects //! referring to the same native file handle. The source file //! handle need not be valid in the name of simplicity. //! //! \post The RHS file handle is invalid. //! \post The LHS file handle owns RHS' native file handle. //! \return A reference to the LHS file handle. //! file_handle& operator=(const file_handle& fh); //! //! \brief Checks whether the file handle is valid or not. //! //! Returns a boolean indicating whether the file handle is valid or //! not. If the file handle is invalid, no other applications can be //! executed other than the destructor. //! //! \return True if the file handle is valid; false otherwise. //! bool is_valid(void) const; //! //! \brief Closes the file handle. //! //! Explicitly closes the file handle, which must be valid. Upon //! exit, the handle is not valid any more. //! //! \pre The file handle is valid. //! \post The file handle is invalid. //! \post The native file handle is closed. //! void close(void); //! //! \brief Reclaims ownership of the native file handle. //! //! Explicitly reclaims ownership of the native file handle contained //! in the \a file_handle object, returning the native file handle. //! The caller is responsible of closing it later on. //! //! \pre The file handle is valid. //! \post The file handle is invalid. //! \return The native file handle. //! handle_type disown(void); //! //! \brief Gets the native file handle. //! //! Returns the native file handle for the \a file_handle object. //! The caller can issue any operation on it except closing it. //! If closing is required, disown() shall be used. //! //! \pre The file handle is valid. //! \return The native file handle. //! handle_type get(void) const; //! //! \brief Changes the native file handle to the given one. //! //! Given a new native file handle \a h, this operation assigns this //! handle to the current object, closing its old native file handle. //! In other words, it first calls dup2() to remap the old handle to //! the new one and then closes the old handle. //! //! If \a h matches the current value of the handle, this is a no-op. //! This is done for simplicity, to avoid the caller having to check //! this condition on its own. //! //! If \a h is open, it is automatically closed by dup2(). //! //! This operation is only available in POSIX systems. //! //! \pre The file handle is valid. //! \pre The native file handle \a h is valid; i.e., it must be //! closeable. //! \post The file handle's native file handle is \a h. //! \throw system_error If the internal remapping operation fails. //! void posix_remap(handle_type h); private: //! //! \brief Internal handle value. //! //! This variable holds the native handle value for the file handle //! hold by this object. It is interesting to note that this needs //! to be mutable because the copy constructor and the assignment //! operator invalidate the source object. //! mutable handle_type m_handle; //! //! \brief Constant function representing an invalid handle value. //! //! Returns the platform-specific handle value that represents an //! invalid handle. This is a constant function rather than a regular //! constant because, in the latter case, we cannot define it under //! Win32 due to the value being of a complex type. //! static handle_type invalid_value(void); }; // ------------------------------------------------------------------------ // The "systembuf" class. // ------------------------------------------------------------------------ //! //! \brief std::streambuf implementation for system file handles. //! //! systembuf provides a std::streambuf implementation for system file //! handles. Contrarywise to file_handle, this class does \b not take //! ownership of the native file handle; this should be taken care of //! somewhere else. //! //! This class follows the expected semantics of a std::streambuf object. //! However, it is not copyable to avoid introducing inconsistences with //! the on-disk file and the in-memory buffers. //! class systembuf : public std::streambuf, atf::noncopyable { public: typedef int handle_type; //! //! \brief Constructs a new systembuf for the given file handle. //! //! This constructor creates a new systembuf object that reads or //! writes data from/to the \a h native file handle. This handle //! is \b not owned by the created systembuf object; the code //! should take care of it externally. //! //! This class buffers input and output; the buffer size may be //! tuned through the \a bufsize parameter, which defaults to 8192 //! bytes. //! //! \see pistream. //! explicit systembuf(handle_type h, std::size_t bufsize = 8192); ~systembuf(void); private: //! //! \brief Native file handle used by the systembuf object. //! handle_type m_handle; //! //! \brief Internal buffer size used during read and write operations. //! std::size_t m_bufsize; //! //! \brief Internal buffer used during read operations. //! char* m_read_buf; //! //! \brief Internal buffer used during write operations. //! char* m_write_buf; protected: //! //! \brief Reads new data from the native file handle. //! //! This operation is called by input methods when there are no more //! data in the input buffer. The function fills the buffer with new //! data, if available. //! //! \pre All input positions are exhausted (gptr() >= egptr()). //! \post The input buffer has new data, if available. //! \returns traits_type::eof() if a read error occurrs or there are //! no more data to be read. Otherwise returns //! traits_type::to_int_type(*gptr()). //! virtual int_type underflow(void); //! //! \brief Makes room in the write buffer for additional data. //! //! This operation is called by output methods when there is no more //! space in the output buffer to hold a new element. The function //! first flushes the buffer's contents to disk and then clears it to //! leave room for more characters. The given \a c character is //! stored at the beginning of the new space. //! //! \pre All output positions are exhausted (pptr() >= epptr()). //! \post The output buffer has more space if no errors occurred //! during the write to disk. //! \post *(pptr() - 1) is \a c. //! \returns traits_type::eof() if a write error occurrs. Otherwise //! returns traits_type::not_eof(c). //! virtual int_type overflow(int c); //! //! \brief Flushes the output buffer to disk. //! //! Synchronizes the systembuf buffers with the contents of the file //! associated to this object through the native file handle. The //! output buffer is flushed to disk and cleared to leave new room //! for more data. //! //! \returns 0 on success, -1 if an error occurred. //! virtual int sync(void); }; // ------------------------------------------------------------------------ // The "pistream" class. // ------------------------------------------------------------------------ //! //! \brief Child process' output stream. //! //! The pistream class represents an output communication channel with the //! child process. The child process writes data to this stream and the //! parent process can read it through the pistream object. In other //! words, from the child's point of view, the communication channel is an //! output one, but from the parent's point of view it is an input one; //! hence the confusing pistream name. //! //! pistream objects cannot be copied because they own the file handle //! they use to communicate with the child and because they buffer data //! that flows through the communication channel. //! //! A pistream object behaves as a std::istream stream in all senses. //! The class is only provided because it must provide a method to let //! the caller explicitly close the communication channel. //! //! \remark Blocking remarks: Functions that read data from this //! stream can block if the associated file handle blocks during the read. //! As this class is used to communicate with child processes through //! anonymous pipes, the most typical blocking condition happens when the //! child has no more data to send to the pipe's system buffer. When //! this happens, the buffer eventually empties and the system blocks //! until the writer generates some data. //! class pistream : public std::istream, noncopyable { //! //! \brief The systembuf object used to manage this stream's data. //! systembuf m_systembuf; public: //! //! \brief Creates a new process' output stream. //! //! Given a file handle, this constructor creates a new pistream //! object that owns the given file handle \a fh. Ownership of //! \a fh is transferred to the created pistream object. //! //! \pre \a fh is valid. //! \post \a fh is invalid. //! \post The new pistream object owns \a fh. //! explicit pistream(const int); }; // ------------------------------------------------------------------------ // The "muxer" class. // ------------------------------------------------------------------------ class muxer : noncopyable { const int* m_fds; const size_t m_nfds; const size_t m_bufsize; atf::auto_array< std::string > m_buffers; protected: virtual void line_callback(const size_t, const std::string&) = 0; size_t read_one(const size_t, const int, std::string&, const bool); public: muxer(const int*, const size_t, const size_t bufsize = 1024); virtual ~muxer(void); void mux(volatile const bool&); void flush(void); }; } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_IO_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/timer.hpp0000644000470500017500000000501712271526120020562 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_ALARM_HPP_) #define _ATF_RUN_ALARM_HPP_ extern "C" { #include } #include #include "atf-c++/noncopyable.hpp" namespace atf { namespace atf_run { class signal_programmer; // ------------------------------------------------------------------------ // The "timer" class. // ------------------------------------------------------------------------ class timer : noncopyable { struct impl; std::auto_ptr< impl > m_pimpl; public: timer(const unsigned int); virtual ~timer(void); bool fired(void) const; void set_fired(void); virtual void timeout_callback(void) = 0; }; // ------------------------------------------------------------------------ // The "child_timer" class. // ------------------------------------------------------------------------ class child_timer : public timer { const pid_t m_pid; volatile bool& m_terminate; public: child_timer(const unsigned int, const pid_t, volatile bool&); virtual ~child_timer(void); void timeout_callback(void); }; } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_ALARM_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/atffile.cpp0000644000470500017500000002461612271526120021055 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "atf-c/defs.h" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/expand.hpp" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/sanity.hpp" #include "atffile.hpp" namespace impl = atf::atf_run; namespace detail = atf::atf_run::detail; // ------------------------------------------------------------------------ // The "atf_atffile" auxiliary parser. // ------------------------------------------------------------------------ namespace atf_atffile { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type text_type = 2; static const atf::parser::token_type colon_type = 3; static const atf::parser::token_type conf_type = 4; static const atf::parser::token_type dblquote_type = 5; static const atf::parser::token_type equal_type = 6; static const atf::parser::token_type hash_type = 7; static const atf::parser::token_type prop_type = 8; static const atf::parser::token_type tp_type = 9; static const atf::parser::token_type tp_glob_type = 10; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, size_t curline) : atf::parser::tokenizer< std::istream > (is, true, eof_type, nl_type, text_type, curline) { add_delim(':', colon_type); add_delim('=', equal_type); add_delim('#', hash_type); add_quote('"', dblquote_type); add_keyword("conf", conf_type); add_keyword("prop", prop_type); add_keyword("tp", tp_type); add_keyword("tp-glob", tp_glob_type); } }; } // namespace atf_atffile // ------------------------------------------------------------------------ // The "atf_atffile_reader" class. // ------------------------------------------------------------------------ detail::atf_atffile_reader::atf_atffile_reader(std::istream& is) : m_is(is) { } detail::atf_atffile_reader::~atf_atffile_reader(void) { } void detail::atf_atffile_reader::got_conf( const std::string& name ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& val ATF_DEFS_ATTRIBUTE_UNUSED) { } void detail::atf_atffile_reader::got_prop( const std::string& name ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& val ATF_DEFS_ATTRIBUTE_UNUSED) { } void detail::atf_atffile_reader::got_tp( const std::string& name ATF_DEFS_ATTRIBUTE_UNUSED, bool isglob ATF_DEFS_ATTRIBUTE_UNUSED) { } void detail::atf_atffile_reader::got_eof(void) { } void detail::atf_atffile_reader::read(void) { using atf::parser::parse_error; using namespace atf_atffile; std::pair< size_t, atf::parser::headers_map > hml = atf::parser::read_headers(m_is, 1); atf::parser::validate_content_type(hml.second, "application/X-atf-atffile", 1); tokenizer tkz(m_is, hml.first); atf::parser::parser< tokenizer > p(tkz); for (;;) { try { atf::parser::token t = p.expect(conf_type, hash_type, prop_type, tp_type, tp_glob_type, nl_type, eof_type, "conf, #, prop, tp, tp-glob, a new line or eof"); if (t.type() == eof_type) break; if (t.type() == conf_type) { t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "variable name"); std::string var = t.text(); t = p.expect(equal_type, "equal sign"); t = p.expect(text_type, "word or quoted string"); ATF_PARSER_CALLBACK(p, got_conf(var, t.text())); } else if (t.type() == hash_type) { (void)p.rest_of_line(); } else if (t.type() == prop_type) { t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "property name"); std::string name = t.text(); t = p.expect(equal_type, "equale sign"); t = p.expect(text_type, "word or quoted string"); ATF_PARSER_CALLBACK(p, got_prop(name, t.text())); } else if (t.type() == tp_type) { t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "word or quoted string"); ATF_PARSER_CALLBACK(p, got_tp(t.text(), false)); } else if (t.type() == tp_glob_type) { t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "word or quoted string"); ATF_PARSER_CALLBACK(p, got_tp(t.text(), true)); } else if (t.type() == nl_type) { continue; } else UNREACHABLE; t = p.expect(nl_type, hash_type, eof_type, "new line or comment"); if (t.type() == hash_type) { (void)p.rest_of_line(); t = p.next(); } else if (t.type() == eof_type) break; } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } ATF_PARSER_CALLBACK(p, got_eof()); } // ------------------------------------------------------------------------ // The "reader" helper class. // ------------------------------------------------------------------------ class reader : public detail::atf_atffile_reader { const atf::fs::directory& m_dir; atf::tests::vars_map m_conf, m_props; std::vector< std::string > m_tps; void got_tp(const std::string& name, bool isglob) { if (isglob) { std::vector< std::string > ms = atf::expand::expand_glob(name, m_dir.names()); // Cannot use m_tps.insert(iterator, begin, end) here because it // does not work under Solaris. for (std::vector< std::string >::const_iterator iter = ms.begin(); iter != ms.end(); iter++) m_tps.push_back(*iter); } else { if (m_dir.find(name) == m_dir.end()) throw atf::not_found_error< atf::fs::path > ("Cannot locate the " + name + " file", atf::fs::path(name)); m_tps.push_back(name); } } void got_prop(const std::string& name, const std::string& val) { m_props[name] = val; } void got_conf(const std::string& var, const std::string& val) { m_conf[var] = val; } public: reader(std::istream& is, const atf::fs::directory& dir) : detail::atf_atffile_reader(is), m_dir(dir) { } const atf::tests::vars_map& conf(void) const { return m_conf; } const atf::tests::vars_map& props(void) const { return m_props; } const std::vector< std::string >& tps(void) const { return m_tps; } }; // ------------------------------------------------------------------------ // The "atffile" class. // ------------------------------------------------------------------------ impl::atffile::atffile(const atf::tests::vars_map& config_vars, const std::vector< std::string >& test_program_names, const atf::tests::vars_map& properties) : m_conf(config_vars), m_tps(test_program_names), m_props(properties) { PRE(properties.find("test-suite") != properties.end()); } const std::vector< std::string >& impl::atffile::tps(void) const { return m_tps; } const atf::tests::vars_map& impl::atffile::conf(void) const { return m_conf; } const atf::tests::vars_map& impl::atffile::props(void) const { return m_props; } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ // XXX Glob expansion and file existance checks certainly do not belong in // a *parser*. This needs to be taken out... impl::atffile impl::read_atffile(const atf::fs::path& filename) { // Scan the directory where the atffile lives in to gather a list of // all possible test programs in it. fs::directory dir(filename.branch_path()); dir.erase(filename.leaf_name()); fs::directory::iterator iter = dir.begin(); while (iter != dir.end()) { const std::string& name = (*iter).first; const fs::file_info& fi = (*iter).second; // Discard hidden files and non-executable ones so that they are // not candidates for glob matching. if (name[0] == '.' || (!fi.is_owner_executable() && !fi.is_group_executable())) dir.erase(iter++); else iter++; } // Parse the atffile. std::ifstream is(filename.c_str()); if (!is) throw atf::not_found_error< fs::path > ("Cannot open Atffile", filename); reader r(is, dir); r.read(); is.close(); // Sanity checks. if (r.props().find("test-suite") == r.props().end()) throw atf::not_found_error< std::string > ("Undefined property `test-suite'", "test-suite"); return atffile(r.conf(), r.tps(), r.props()); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/pass_helper.cpp0000644000470500017500000000320512271526120021737 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "atf-c++/macros.hpp" ATF_TEST_CASE(main); ATF_TEST_CASE_HEAD(main) { set_md_var("descr", "Helper test case that always passes"); } ATF_TEST_CASE_BODY(main) { } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, main); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/several_tcs_helper.c0000644000470500017500000000400012271526120022735 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include ATF_TC(first); ATF_TC_HEAD(first, tc) { atf_tc_set_md_var(tc, "descr", "Description 1"); } ATF_TC_BODY(first, tc) { } ATF_TC_WITH_CLEANUP(second); ATF_TC_HEAD(second, tc) { atf_tc_set_md_var(tc, "descr", "Description 2"); atf_tc_set_md_var(tc, "timeout", "500"); atf_tc_set_md_var(tc, "X-property", "Custom property"); } ATF_TC_BODY(second, tc) { } ATF_TC_CLEANUP(second, tc) { } ATF_TC_WITHOUT_HEAD(third); ATF_TC_BODY(third, tc) { } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, first); ATF_TP_ADD_TC(tp, second); ATF_TP_ADD_TC(tp, third); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/share/0002755000470500017500000000000012276444014020040 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-run/share/atf-run.hooks0000644000470500017500000000564012271526120022456 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_tps_writer_info() { class=${1}; shift echo "info: ${class}, $*" } info_start_hook() { default_info_start_hook "${@}" } default_info_start_hook() { atf_tps_writer_info "atf.version" $(atf-version | head -n 1) atf_tps_writer_info "tests.root" $(pwd) atf_tps_writer_info "time.start" $(date) atf_tps_writer_info "uname.sysname" $(uname -s) atf_tps_writer_info "uname.nodename" $(uname -n) atf_tps_writer_info "uname.release" $(uname -r) atf_tps_writer_info "uname.version" $(uname -v) atf_tps_writer_info "uname.machine" $(uname -m) # Add all the environment variables to the report. We have to be # careful with those that span over multiple lines; otherwise their # values could be printed as multiple different variables (one per # line), which is incorrect. oldifs="${IFS}" IFS=' ' set -- $(env) val=${1}; shift while [ ${#} -gt 0 ]; do if echo "${1}" | grep '^[a-zA-Z0-0_][a-zA-Z0-9_]*=' >/dev/null; then atf_tps_writer_info "env" "${val}" val="${1}" else val="${val} ${1}" fi shift done atf_tps_writer_info "env" "${val}" IFS="${oldifs}" } info_end_hook() { default_info_end_hook "${@}" } default_info_end_hook() { atf_tps_writer_info "time.end" $(date) } sitehooks=$(atf-config -t atf_confdir)/atf-run.hooks userhooks=${HOME}/.atf/atf-run.hooks [ -f ${sitehooks} ] && . ${sitehooks} [ -f ${userhooks} ] && . ${userhooks} eval ${1} # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-run/requirements.hpp0000644000470500017500000000345712271526120022173 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "atf-c++/tests.hpp" namespace atf { namespace atf_run { std::string check_requirements(const atf::tests::vars_map&, const atf::tests::vars_map&); std::pair< int, int > get_required_user(const atf::tests::vars_map&, const atf::tests::vars_map&); } // namespace atf_run } // namespace atf bind9-9.9.5.dfsg/unit/atf-src/atf-run/test-program.hpp0000644000470500017500000000770112271526120022070 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "atf-c++/tests.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/process.hpp" namespace atf { namespace atf_run { struct test_case_result { std::string m_state; int m_value; std::string m_reason; public: test_case_result(void) : m_state("UNINITIALIZED"), m_value(-1), m_reason("") { } test_case_result(const std::string& p_state, const int p_value, const std::string& p_reason) : m_state(p_state), m_value(p_value), m_reason(p_reason) { } const std::string& state(void) const { return m_state; } int value(void) const { return m_value; } const std::string& reason(void) const { return m_reason; } }; namespace detail { class atf_tp_reader { std::istream& m_is; void validate_and_insert(const std::string&, const std::string&, const size_t, std::map< std::string, std::string >&); protected: virtual void got_tc(const std::string&, const std::map< std::string, std::string >&); virtual void got_eof(void); public: atf_tp_reader(std::istream&); virtual ~atf_tp_reader(void); void read(void); }; test_case_result parse_test_case_result(const std::string&); } // namespace detail class atf_tps_writer { std::ostream& m_os; std::string m_tpname, m_tcname; public: atf_tps_writer(std::ostream&); void info(const std::string&, const std::string&); void ntps(size_t); void start_tp(const std::string&, size_t); void end_tp(const std::string&); void start_tc(const std::string&); void stdout_tc(const std::string&); void stderr_tc(const std::string&); void end_tc(const std::string&, const std::string&); }; typedef std::map< std::string, atf::tests::vars_map > test_cases_map; struct metadata { test_cases_map test_cases; metadata(void) { } metadata(const test_cases_map& p_test_cases) : test_cases(p_test_cases) { } }; class atf_tps_writer; metadata get_metadata(const atf::fs::path&, const atf::tests::vars_map&); test_case_result read_test_case_result(const atf::fs::path&); std::pair< std::string, atf::process::status > run_test_case( const atf::fs::path&, const std::string&, const std::string&, const atf::tests::vars_map&, const atf::tests::vars_map&, const atf::fs::path&, const atf::fs::path&, atf_tps_writer&); } // namespace atf_run } // namespace atf bind9-9.9.5.dfsg/unit/atf-src/atf-run/user.hpp0000644000470500017500000000352412271526120020421 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_USER_HPP_) #define _ATF_RUN_USER_HPP_ extern "C" { #include } #include namespace atf { namespace atf_run { uid_t euid(void); void drop_privileges(const std::pair< int, int >); std::pair< int, int > get_user_ids(const std::string&); bool is_member_of_group(gid_t); bool is_root(void); bool is_unprivileged(void); } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_USER_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/signals.hpp0000644000470500017500000000546312271526120021107 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_SIGNALS_HPP_) #define _ATF_RUN_SIGNALS_HPP_ extern "C" { #include } namespace atf { namespace atf_run { extern const int last_signo; typedef void (*handler)(const int); class signal_programmer; // ------------------------------------------------------------------------ // The "signal_holder" class. // ------------------------------------------------------------------------ // // A RAII model to hold a signal while the object is alive. // class signal_holder { const int m_signo; signal_programmer* m_sp; public: signal_holder(const int); ~signal_holder(void); void process(void); }; // ------------------------------------------------------------------------ // The "signal_programmer" class. // ------------------------------------------------------------------------ // // A RAII model to program a signal while the object is alive. // class signal_programmer { const int m_signo; const handler m_handler; bool m_programmed; struct sigaction m_oldsa; public: signal_programmer(const int, const handler); ~signal_programmer(void); void unprogram(void); }; // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ void reset(const int); } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_SIGNALS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/atffile_test.cpp0000644000470500017500000004344012271526120022110 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include #include "atf-c++/macros.hpp" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/test_helpers.hpp" #include "atffile.hpp" namespace detail = atf::atf_run::detail; // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace { static std::auto_ptr< std::ofstream > new_atffile(void) { std::auto_ptr< std::ofstream > os(new std::ofstream("Atffile")); ATF_REQUIRE(*os); (*os) << "Content-Type: application/X-atf-atffile; version=\"1\"\n\n"; return os; } static void touch_exec(const char* name) { std::ofstream os(name); ATF_REQUIRE(os); os.close(); ATF_REQUIRE(::chmod(name, S_IRWXU) != -1); } static inline bool is_in(const std::string& value, const std::vector< std::string >& v) { return std::find(v.begin(), v.end(), value) != v.end(); } } // anonymous namespace // ------------------------------------------------------------------------ // Tests cases for the "atffile" parser. // ------------------------------------------------------------------------ class atffile_reader : protected detail::atf_atffile_reader { void got_conf(const std::string& name, const std::string& val) { m_calls.push_back("got_conf(" + name + ", " + val + ")"); } void got_prop(const std::string& name, const std::string& val) { m_calls.push_back("got_prop(" + name + ", " + val + ")"); } void got_tp(const std::string& name, bool isglob) { m_calls.push_back("got_tp(" + name + ", " + (isglob ? "true" : "false") + ")"); } void got_eof(void) { m_calls.push_back("got_eof()"); } public: atffile_reader(std::istream& is) : detail::atf_atffile_reader(is) { } void read(void) { atf_atffile_reader::read(); } std::vector< std::string > m_calls; }; ATF_TEST_CASE_WITHOUT_HEAD(atffile_1); ATF_TEST_CASE_BODY(atffile_1) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" ; const char* exp_calls[] = { "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_2); ATF_TEST_CASE_BODY(atffile_2) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "# This is a comment on a line of its own.\n" "# And this is another one.\n" "\n" " # Another after some whitespace.\n" "\n" "# The last one after an empty line.\n" ; const char* exp_calls[] = { "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_3); ATF_TEST_CASE_BODY(atffile_3) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "conf: var1=value1\n" "conf: var2 = value2\n" "conf: var3 = value3\n" "conf: var4 = value4\n" "\n" "conf:var5=value5\n" " conf:var6=value6\n" "\n" "conf: var7 = \"This is a long value.\"\n" "conf: var8 = \"Single-word\"\n" "conf: var9 = \" Single-word \"\n" "conf: var10 = Single-word\n" ; const char* exp_calls[] = { "got_conf(var1, value1)", "got_conf(var2, value2)", "got_conf(var3, value3)", "got_conf(var4, value4)", "got_conf(var5, value5)", "got_conf(var6, value6)", "got_conf(var7, This is a long value.)", "got_conf(var8, Single-word)", "got_conf(var9, Single-word )", "got_conf(var10, Single-word)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_4); ATF_TEST_CASE_BODY(atffile_4) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "prop: var1=value1\n" "prop: var2 = value2\n" "prop: var3 = value3\n" "prop: var4 = value4\n" "\n" "prop:var5=value5\n" " prop:var6=value6\n" "\n" "prop: var7 = \"This is a long value.\"\n" "prop: var8 = \"Single-word\"\n" "prop: var9 = \" Single-word \"\n" "prop: var10 = Single-word\n" ; const char* exp_calls[] = { "got_prop(var1, value1)", "got_prop(var2, value2)", "got_prop(var3, value3)", "got_prop(var4, value4)", "got_prop(var5, value5)", "got_prop(var6, value6)", "got_prop(var7, This is a long value.)", "got_prop(var8, Single-word)", "got_prop(var9, Single-word )", "got_prop(var10, Single-word)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_5); ATF_TEST_CASE_BODY(atffile_5) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "tp:foo\n" "tp: foo\n" "tp: foo\n" "tp: foo\n" "tp: foo\n" "tp: \"name with spaces\"\n" "tp: \"single-word\"\n" "tp: single-word\n" "\n" "tp-glob:foo*?bar\n" "tp-glob: foo*?bar\n" "tp-glob: foo*?bar\n" "tp-glob: foo*?bar\n" "tp-glob: foo*?bar\n" "tp-glob: \"glob * with ? spaces\"\n" "tp-glob: \"single-*-word\"\n" "tp-glob: single-*-word\n" ; const char* exp_calls[] = { "got_tp(foo, false)", "got_tp(foo, false)", "got_tp(foo, false)", "got_tp(foo, false)", "got_tp(foo, false)", "got_tp(name with spaces, false)", "got_tp(single-word, false)", "got_tp(single-word, false)", "got_tp(foo*?bar, true)", "got_tp(foo*?bar, true)", "got_tp(foo*?bar, true)", "got_tp(foo*?bar, true)", "got_tp(foo*?bar, true)", "got_tp(glob * with ? spaces, true)", "got_tp(single-*-word, true)", "got_tp(single-*-word, true)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_6); ATF_TEST_CASE_BODY(atffile_6) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "prop: foo = bar # A comment.\n" "conf: foo = bar # A comment.\n" "tp: foo # A comment.\n" "tp-glob: foo # A comment.\n" ; const char* exp_calls[] = { "got_prop(foo, bar)", "got_conf(foo, bar)", "got_tp(foo, false)", "got_tp(foo, true)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_50); ATF_TEST_CASE_BODY(atffile_50) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "foo\n" ; const char* exp_calls[] = { NULL }; // NO_CHECK_STYLE_BEGIN const char* exp_errors[] = { "3: Unexpected token `foo'; expected conf, #, prop, tp, tp-glob, a new line or eof", NULL }; // NO_CHECK_STYLE_END do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_51); ATF_TEST_CASE_BODY(atffile_51) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "foo bar\n" "baz\n" ; const char* exp_calls[] = { NULL }; // NO_CHECK_STYLE_BEGIN const char* exp_errors[] = { "3: Unexpected token `foo'; expected conf, #, prop, tp, tp-glob, a new line or eof", "4: Unexpected token `baz'; expected conf, #, prop, tp, tp-glob, a new line or eof", NULL }; // NO_CHECK_STYLE_END do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_52); ATF_TEST_CASE_BODY(atffile_52) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "conf\n" "conf:\n" "conf: foo =\n" "conf: bar = # A comment.\n" "\n" "prop\n" "prop:\n" "prop: foo =\n" "prop: bar = # A comment.\n" "\n" "tp\n" "tp:\n" "tp: # A comment.\n" "\n" "tp-glob\n" "tp-glob:\n" "tp-glob: # A comment.\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected `:'", "4: Unexpected token `<>'; expected variable name", "5: Unexpected token `<>'; expected word or quoted string", "6: Unexpected token `#'; expected word or quoted string", "8: Unexpected token `<>'; expected `:'", "9: Unexpected token `<>'; expected property name", "10: Unexpected token `<>'; expected word or quoted string", "11: Unexpected token `#'; expected word or quoted string", "13: Unexpected token `<>'; expected `:'", "14: Unexpected token `<>'; expected word or quoted string", "15: Unexpected token `#'; expected word or quoted string", "17: Unexpected token `<>'; expected `:'", "18: Unexpected token `<>'; expected word or quoted string", "19: Unexpected token `#'; expected word or quoted string", NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_53); ATF_TEST_CASE_BODY(atffile_53) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "prop: foo = \"Correct value\" # With comment.\n" "\n" "prop: bar = # A comment.\n" "\n" "prop: baz = \"Last variable\"\n" "\n" "# End of file.\n" ; const char* exp_calls[] = { "got_prop(foo, Correct value)", NULL }; const char* exp_errors[] = { "5: Unexpected token `#'; expected word or quoted string", NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(atffile_54); ATF_TEST_CASE_BODY(atffile_54) { const char* input = "Content-Type: application/X-atf-atffile; version=\"1\"\n" "\n" "prop: foo = \"\n" "prop: bar = \"text\n" "prop: baz = \"te\\\"xt\n" "prop: last = \"\\\"\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Missing double quotes before end of line", "4: Missing double quotes before end of line", "5: Missing double quotes before end of line", "6: Missing double quotes before end of line", NULL }; do_parser_test< atffile_reader >(input, exp_calls, exp_errors); } // ------------------------------------------------------------------------ // Tests cases for the "atffile" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(atffile_getters); ATF_TEST_CASE_HEAD(atffile_getters) {} ATF_TEST_CASE_BODY(atffile_getters) { atf::tests::vars_map config_vars; config_vars["config-var-1"] = "value 1"; std::vector< std::string > test_program_names; test_program_names.push_back("test-program-1"); atf::tests::vars_map properties; properties["test-suite"] = "a test name"; const atf::atf_run::atffile atffile(config_vars, test_program_names, properties); ATF_REQUIRE(config_vars == atffile.conf()); ATF_REQUIRE(test_program_names == atffile.tps()); ATF_REQUIRE(properties == atffile.props()); } // ------------------------------------------------------------------------ // Tests cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE_WITHOUT_HEAD(read_ok_simple); ATF_TEST_CASE_BODY(read_ok_simple) { std::auto_ptr< std::ofstream > os = new_atffile(); (*os) << "prop: test-suite = foo\n"; (*os) << "tp: tp-1\n"; (*os) << "conf: var1 = value1\n"; (*os) << "tp: tp-2\n"; (*os) << "tp: tp-3\n"; (*os) << "prop: prop1 = propvalue1\n"; (*os) << "conf: var2 = value2\n"; (*os).close(); touch_exec("tp-1"); touch_exec("tp-2"); touch_exec("tp-3"); const atf::atf_run::atffile atffile = atf::atf_run::read_atffile( atf::fs::path("Atffile")); ATF_REQUIRE_EQ(2, atffile.conf().size()); ATF_REQUIRE_EQ("value1", atffile.conf().find("var1")->second); ATF_REQUIRE_EQ("value2", atffile.conf().find("var2")->second); ATF_REQUIRE_EQ(3, atffile.tps().size()); ATF_REQUIRE(is_in("tp-1", atffile.tps())); ATF_REQUIRE(is_in("tp-2", atffile.tps())); ATF_REQUIRE(is_in("tp-3", atffile.tps())); ATF_REQUIRE_EQ(2, atffile.props().size()); ATF_REQUIRE_EQ("foo", atffile.props().find("test-suite")->second); ATF_REQUIRE_EQ("propvalue1", atffile.props().find("prop1")->second); } ATF_TEST_CASE_WITHOUT_HEAD(read_ok_some_globs); ATF_TEST_CASE_BODY(read_ok_some_globs) { std::auto_ptr< std::ofstream > os = new_atffile(); (*os) << "prop: test-suite = foo\n"; (*os) << "tp: foo\n"; (*os) << "tp-glob: *K*\n"; (*os) << "tp: bar\n"; (*os) << "tp-glob: t_*\n"; (*os).close(); touch_exec("foo"); touch_exec("bar"); touch_exec("aK"); touch_exec("KKKKK"); touch_exec("t_hello"); touch_exec("zzzt_hello"); const atf::atf_run::atffile atffile = atf::atf_run::read_atffile( atf::fs::path("Atffile")); ATF_REQUIRE_EQ(5, atffile.tps().size()); ATF_REQUIRE(is_in("foo", atffile.tps())); ATF_REQUIRE(is_in("bar", atffile.tps())); ATF_REQUIRE(is_in("aK", atffile.tps())); ATF_REQUIRE(is_in("KKKKK", atffile.tps())); ATF_REQUIRE(is_in("t_hello", atffile.tps())); } ATF_TEST_CASE_WITHOUT_HEAD(read_missing_test_suite); ATF_TEST_CASE_BODY(read_missing_test_suite) { std::auto_ptr< std::ofstream > os = new_atffile(); (*os).close(); try { (void)atf::atf_run::read_atffile(atf::fs::path("Atffile")); ATF_FAIL("Missing property 'test-suite' did not raise an error"); } catch (const atf::not_found_error< std::string >& e) { ATF_REQUIRE_EQ("test-suite", e.get_value()); } } ATF_TEST_CASE_WITHOUT_HEAD(read_missing_test_program); ATF_TEST_CASE_BODY(read_missing_test_program) { std::auto_ptr< std::ofstream > os = new_atffile(); (*os) << "tp: foo\n"; (*os) << "tp: bar\n"; (*os) << "tp: baz\n"; (*os).close(); touch_exec("foo"); touch_exec("baz"); try { (void)atf::atf_run::read_atffile(atf::fs::path("Atffile")); ATF_FAIL("Missing file 'bar' did not raise an error"); } catch (const atf::not_found_error< atf::fs::path >& e) { ATF_REQUIRE_EQ("bar", e.get_value().str()); } } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the parser class. ATF_ADD_TEST_CASE(tcs, atffile_1); ATF_ADD_TEST_CASE(tcs, atffile_2); ATF_ADD_TEST_CASE(tcs, atffile_3); ATF_ADD_TEST_CASE(tcs, atffile_4); ATF_ADD_TEST_CASE(tcs, atffile_5); ATF_ADD_TEST_CASE(tcs, atffile_6); ATF_ADD_TEST_CASE(tcs, atffile_50); ATF_ADD_TEST_CASE(tcs, atffile_51); ATF_ADD_TEST_CASE(tcs, atffile_52); ATF_ADD_TEST_CASE(tcs, atffile_53); ATF_ADD_TEST_CASE(tcs, atffile_54); // Add the test cases for the atffile class. ATF_ADD_TEST_CASE(tcs, atffile_getters); // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, read_ok_simple); ATF_ADD_TEST_CASE(tcs, read_ok_some_globs); ATF_ADD_TEST_CASE(tcs, read_missing_test_suite); ATF_ADD_TEST_CASE(tcs, read_missing_test_program); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/misc_helpers.cpp0000644000470500017500000002744712271526120022125 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include } #include #include #include #include #include #include #include "atf-c++/macros.hpp" #include "atf-c++/detail/env.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/process.hpp" #include "atf-c++/detail/sanity.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void touch(const std::string& path) { std::ofstream os(path.c_str()); if (!os) ATF_FAIL("Could not create file " + path); os.close(); } // ------------------------------------------------------------------------ // Helper tests for "t_integration". // ------------------------------------------------------------------------ ATF_TEST_CASE(pass); ATF_TEST_CASE_HEAD(pass) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(pass) { } ATF_TEST_CASE(config); ATF_TEST_CASE_HEAD(config) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(config) { std::cout << "1st: " << get_config_var("1st") << "\n"; std::cout << "2nd: " << get_config_var("2nd") << "\n"; std::cout << "3rd: " << get_config_var("3rd") << "\n"; std::cout << "4th: " << get_config_var("4th") << "\n"; } ATF_TEST_CASE(fds); ATF_TEST_CASE_HEAD(fds) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(fds) { std::cout << "msg1 to stdout" << "\n"; std::cout << "msg2 to stdout" << "\n"; std::cerr << "msg1 to stderr" << "\n"; std::cerr << "msg2 to stderr" << "\n"; } ATF_TEST_CASE_WITHOUT_HEAD(mux_streams); ATF_TEST_CASE_BODY(mux_streams) { for (size_t i = 0; i < 10000; i++) { switch (i % 5) { case 0: std::cout << "stdout " << i << "\n"; break; case 1: std::cerr << "stderr " << i << "\n"; break; case 2: std::cout << "stdout " << i << "\n"; std::cerr << "stderr " << i << "\n"; break; case 3: std::cout << "stdout " << i << "\n"; std::cout << "stdout " << i << "\n"; std::cerr << "stderr " << i << "\n"; break; case 4: std::cout << "stdout " << i << "\n"; std::cerr << "stderr " << i << "\n"; std::cerr << "stderr " << i << "\n"; break; default: UNREACHABLE; } } } ATF_TEST_CASE(testvar); ATF_TEST_CASE_HEAD(testvar) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(testvar) { if (!has_config_var("testvar")) fail("testvar variable not defined"); std::cout << "testvar: " << get_config_var("testvar") << "\n"; } ATF_TEST_CASE(env_list); ATF_TEST_CASE_HEAD(env_list) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(env_list) { const atf::process::status s = atf::process::exec(atf::fs::path("env"), atf::process::argv_array("env", NULL), atf::process::stream_inherit(), atf::process::stream_inherit()); ATF_REQUIRE(s.exited()); ATF_REQUIRE(s.exitstatus() == EXIT_SUCCESS); } ATF_TEST_CASE(env_home); ATF_TEST_CASE_HEAD(env_home) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(env_home) { ATF_REQUIRE(atf::env::has("HOME")); atf::fs::path p(atf::env::get("HOME")); atf::fs::file_info fi1(p); atf::fs::file_info fi2(atf::fs::path(".")); ATF_REQUIRE_EQ(fi1.get_device(), fi2.get_device()); ATF_REQUIRE_EQ(fi1.get_inode(), fi2.get_inode()); } ATF_TEST_CASE(read_stdin); ATF_TEST_CASE_HEAD(read_stdin) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(read_stdin) { char buf[100]; ssize_t len = ::read(STDIN_FILENO, buf, sizeof(buf) - 1); ATF_REQUIRE(len != -1); buf[len + 1] = '\0'; for (ssize_t i = 0; i < len; i++) { if (buf[i] != '\0') { fail("The stdin of the test case does not seem to be /dev/zero; " "got '" + std::string(buf) + "'"); } } } ATF_TEST_CASE(umask); ATF_TEST_CASE_HEAD(umask) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(umask) { mode_t m = ::umask(0); std::cout << "umask: " << std::setw(4) << std::setfill('0') << std::oct << m << "\n"; (void)::umask(m); } ATF_TEST_CASE_WITH_CLEANUP(cleanup_states); ATF_TEST_CASE_HEAD(cleanup_states) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(cleanup_states) { touch(get_config_var("statedir") + "/to-delete"); touch(get_config_var("statedir") + "/to-stay"); if (get_config_var("state") == "fail") ATF_FAIL("On purpose"); else if (get_config_var("state") == "skip") ATF_SKIP("On purpose"); } ATF_TEST_CASE_CLEANUP(cleanup_states) { atf::fs::remove(atf::fs::path(get_config_var("statedir") + "/to-delete")); } ATF_TEST_CASE_WITH_CLEANUP(cleanup_curdir); ATF_TEST_CASE_HEAD(cleanup_curdir) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(cleanup_curdir) { std::ofstream os("oldvalue"); if (!os) ATF_FAIL("Failed to create oldvalue file"); os << 1234; os.close(); } ATF_TEST_CASE_CLEANUP(cleanup_curdir) { std::ifstream is("oldvalue"); if (is) { int i; is >> i; std::cout << "Old value: " << i << "\n"; is.close(); } } ATF_TEST_CASE(require_arch); ATF_TEST_CASE_HEAD(require_arch) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.arch", get_config_var("arch", "not-set")); } ATF_TEST_CASE_BODY(require_arch) { } ATF_TEST_CASE(require_config); ATF_TEST_CASE_HEAD(require_config) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.config", "var1 var2"); } ATF_TEST_CASE_BODY(require_config) { std::cout << "var1: " << get_config_var("var1") << "\n"; std::cout << "var2: " << get_config_var("var2") << "\n"; } ATF_TEST_CASE(require_files); ATF_TEST_CASE_HEAD(require_files) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.files", get_config_var("files", "not-set")); } ATF_TEST_CASE_BODY(require_files) { } ATF_TEST_CASE(require_machine); ATF_TEST_CASE_HEAD(require_machine) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.machine", get_config_var("machine", "not-set")); } ATF_TEST_CASE_BODY(require_machine) { } ATF_TEST_CASE(require_progs); ATF_TEST_CASE_HEAD(require_progs) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.progs", get_config_var("progs", "not-set")); } ATF_TEST_CASE_BODY(require_progs) { } ATF_TEST_CASE(require_user); ATF_TEST_CASE_HEAD(require_user) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("require.user", get_config_var("user", "not-set")); } ATF_TEST_CASE_BODY(require_user) { } ATF_TEST_CASE(timeout); ATF_TEST_CASE_HEAD(timeout) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("timeout", "1"); } ATF_TEST_CASE_BODY(timeout) { sleep(10); touch(get_config_var("statedir") + "/finished"); } ATF_TEST_CASE(timeout_forkexit); ATF_TEST_CASE_HEAD(timeout_forkexit) { set_md_var("descr", "Helper test case for the t_integration test program"); } ATF_TEST_CASE_BODY(timeout_forkexit) { pid_t pid = fork(); ATF_REQUIRE(pid != -1); if (pid == 0) { sigset_t mask; sigemptyset(&mask); std::cout << "Waiting in subprocess\n"; std::cout.flush(); ::sigsuspend(&mask); touch(get_config_var("statedir") + "/child-finished"); std::cout << "Subprocess exiting\n"; std::cout.flush(); exit(EXIT_SUCCESS); } else { // Don't wait for the child process and let atf-run deal with it. touch(get_config_var("statedir") + "/parent-finished"); std::cout << "Parent process exiting\n"; ATF_PASS(); } } ATF_TEST_CASE(use_fs); ATF_TEST_CASE_HEAD(use_fs) { set_md_var("descr", "Helper test case for the t_integration test program"); set_md_var("use.fs", "this-is-deprecated"); } ATF_TEST_CASE_BODY(use_fs) { touch("test-file"); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { std::string which = atf::env::get("TESTCASE"); // Add helper tests for t_integration. if (which == "pass") ATF_ADD_TEST_CASE(tcs, pass); if (which == "config") ATF_ADD_TEST_CASE(tcs, config); if (which == "fds") ATF_ADD_TEST_CASE(tcs, fds); if (which == "mux_streams") ATF_ADD_TEST_CASE(tcs, mux_streams); if (which == "testvar") ATF_ADD_TEST_CASE(tcs, testvar); if (which == "env_list") ATF_ADD_TEST_CASE(tcs, env_list); if (which == "env_home") ATF_ADD_TEST_CASE(tcs, env_home); if (which == "read_stdin") ATF_ADD_TEST_CASE(tcs, read_stdin); if (which == "umask") ATF_ADD_TEST_CASE(tcs, umask); if (which == "cleanup_states") ATF_ADD_TEST_CASE(tcs, cleanup_states); if (which == "cleanup_curdir") ATF_ADD_TEST_CASE(tcs, cleanup_curdir); if (which == "require_arch") ATF_ADD_TEST_CASE(tcs, require_arch); if (which == "require_config") ATF_ADD_TEST_CASE(tcs, require_config); if (which == "require_files") ATF_ADD_TEST_CASE(tcs, require_files); if (which == "require_machine") ATF_ADD_TEST_CASE(tcs, require_machine); if (which == "require_progs") ATF_ADD_TEST_CASE(tcs, require_progs); if (which == "require_user") ATF_ADD_TEST_CASE(tcs, require_user); if (which == "timeout") ATF_ADD_TEST_CASE(tcs, timeout); if (which == "timeout_forkexit") ATF_ADD_TEST_CASE(tcs, timeout_forkexit); if (which == "use_fs") ATF_ADD_TEST_CASE(tcs, use_fs); } bind9-9.9.5.dfsg/unit/atf-src/atf-run/io.cpp0000644000470500017500000002133112271526120020041 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include } #include #include extern "C" { #include "../atf-c/error.h" } #include "../atf-c++/detail/auto_array.hpp" #include "../atf-c++/detail/exceptions.hpp" #include "../atf-c++/detail/sanity.hpp" #include "io.hpp" namespace impl = atf::atf_run; #define IMPL_NAME "atf::atf_run" // ------------------------------------------------------------------------ // The "file_handle" class. // ------------------------------------------------------------------------ impl::file_handle::file_handle(void) : m_handle(invalid_value()) { } impl::file_handle::file_handle(handle_type h) : m_handle(h) { PRE(m_handle != invalid_value()); } impl::file_handle::file_handle(const file_handle& fh) : m_handle(fh.m_handle) { fh.m_handle = invalid_value(); } impl::file_handle::~file_handle(void) { if (is_valid()) close(); } impl::file_handle& impl::file_handle::operator=(const file_handle& fh) { m_handle = fh.m_handle; fh.m_handle = invalid_value(); return *this; } bool impl::file_handle::is_valid(void) const { return m_handle != invalid_value(); } void impl::file_handle::close(void) { PRE(is_valid()); ::close(m_handle); m_handle = invalid_value(); } impl::file_handle::handle_type impl::file_handle::disown(void) { PRE(is_valid()); handle_type h = m_handle; m_handle = invalid_value(); return h; } impl::file_handle::handle_type impl::file_handle::get(void) const { PRE(is_valid()); return m_handle; } void impl::file_handle::posix_remap(handle_type h) { PRE(is_valid()); if (m_handle == h) return; if (::dup2(m_handle, h) == -1) throw system_error(IMPL_NAME "::file_handle::posix_remap", "dup2(2) failed", errno); if (::close(m_handle) == -1) { ::close(h); throw system_error(IMPL_NAME "::file_handle::posix_remap", "close(2) failed", errno); } m_handle = h; } impl::file_handle::handle_type impl::file_handle::invalid_value(void) { return -1; } // ------------------------------------------------------------------------ // The "systembuf" class. // ------------------------------------------------------------------------ impl::systembuf::systembuf(handle_type h, std::size_t bufsize) : m_handle(h), m_bufsize(bufsize), m_read_buf(NULL), m_write_buf(NULL) { PRE(m_handle >= 0); PRE(m_bufsize > 0); try { m_read_buf = new char[bufsize]; m_write_buf = new char[bufsize]; } catch (...) { if (m_read_buf != NULL) delete [] m_read_buf; if (m_write_buf != NULL) delete [] m_write_buf; throw; } setp(m_write_buf, m_write_buf + m_bufsize); } impl::systembuf::~systembuf(void) { delete [] m_read_buf; delete [] m_write_buf; } impl::systembuf::int_type impl::systembuf::underflow(void) { PRE(gptr() >= egptr()); bool ok; ssize_t cnt = ::read(m_handle, m_read_buf, m_bufsize); ok = (cnt != -1 && cnt != 0); if (!ok) return traits_type::eof(); else { setg(m_read_buf, m_read_buf, m_read_buf + cnt); return traits_type::to_int_type(*gptr()); } } impl::systembuf::int_type impl::systembuf::overflow(int c) { PRE(pptr() >= epptr()); if (sync() == -1) return traits_type::eof(); if (!traits_type::eq_int_type(c, traits_type::eof())) { traits_type::assign(*pptr(), c); pbump(1); } return traits_type::not_eof(c); } int impl::systembuf::sync(void) { ssize_t cnt = pptr() - pbase(); bool ok; ok = ::write(m_handle, pbase(), cnt) == cnt; if (ok) pbump(-cnt); return ok ? 0 : -1; } // ------------------------------------------------------------------------ // The "pistream" class. // ------------------------------------------------------------------------ impl::pistream::pistream(const int fd) : std::istream(NULL), m_systembuf(fd) { rdbuf(&m_systembuf); } // ------------------------------------------------------------------------ // The "muxer" class. // ------------------------------------------------------------------------ static int safe_poll(struct pollfd fds[], nfds_t nfds, int timeout) { int ret = ::poll(fds, nfds, timeout); if (ret == -1) { if (errno == EINTR) ret = 0; else throw atf::system_error(IMPL_NAME "::safe_poll", "poll(2) failed", errno); } INV(ret >= 0); return ret; } static size_t safe_read(const int fd, void* buffer, const size_t nbytes, const bool report_errors) { int ret; while ((ret = ::read(fd, buffer, nbytes)) == -1 && errno == EINTR) {} if (ret == -1) { INV(errno != EINTR); if (report_errors) throw atf::system_error(IMPL_NAME "::safe_read", "read(2) failed", errno); else ret = 0; } INV(ret >= 0); return static_cast< size_t >(ret); } impl::muxer::muxer(const int* fds, const size_t nfds, const size_t bufsize) : m_fds(fds), m_nfds(nfds), m_bufsize(bufsize), m_buffers(new std::string[nfds]) { } impl::muxer::~muxer(void) { } size_t impl::muxer::read_one(const size_t index, const int fd, std::string& accum, const bool report_errors) { atf::auto_array< char > buffer(new char[m_bufsize]); const size_t nbytes = safe_read(fd, buffer.get(), m_bufsize - 1, report_errors); INV(nbytes < m_bufsize); buffer[nbytes] = '\0'; std::string line(accum); size_t line_start = 0; for (size_t i = 0; i < nbytes; i++) { if (buffer[i] == '\n') { line_callback(index, line); line.clear(); accum.clear(); line_start = i + 1; } else if (buffer[i] == '\r') { // Do nothing. } else { line.append(1, buffer[i]); } } accum.append(&buffer[line_start]); return nbytes; } void impl::muxer::mux(volatile const bool& terminate) { atf::auto_array< struct pollfd > poll_fds(new struct pollfd[m_nfds]); for (size_t i = 0; i < m_nfds; i++) { poll_fds[i].fd = m_fds[i]; poll_fds[i].events = POLLIN; } size_t nactive = m_nfds; while (nactive > 0 && !terminate) { int ret; while (!terminate && (ret = safe_poll(poll_fds.get(), 2, 250)) == 0) {} for (size_t i = 0; !terminate && i < m_nfds; i++) { if (poll_fds[i].events == 0) continue; if (poll_fds[i].revents & POLLHUP) { // Any data still available at this point will be processed by // a call to the flush method. poll_fds[i].events = 0; INV(nactive >= 1); nactive--; } else if (poll_fds[i].revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)) { (void)read_one(i, poll_fds[i].fd, m_buffers[i], true); } } } } void impl::muxer::flush(void) { for (size_t i = 0; i < m_nfds; i++) { while (read_one(i, m_fds[i], m_buffers[i], false) > 0) {} if (!m_buffers[i].empty()) line_callback(i, m_buffers[i]); } } bind9-9.9.5.dfsg/unit/atf-src/atf-run/fs.hpp0000644000470500017500000000365412271526120020057 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_RUN_FS_HPP_) #define _ATF_RUN_FS_HPP_ #include #include "atf-c++/detail/fs.hpp" namespace atf { namespace atf_run { class temp_dir { std::auto_ptr< atf::fs::path > m_path; public: temp_dir(const atf::fs::path&); ~temp_dir(void); const atf::fs::path& get_path(void) const; }; atf::fs::path change_directory(const atf::fs::path&); void cleanup(const atf::fs::path&); atf::fs::path get_current_dir(void); } // namespace atf_run } // namespace atf #endif // !defined(_ATF_RUN_FS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-run/config.hpp0000644000470500017500000000404212271526120020704 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "atf-c++/tests.hpp" namespace atf { namespace atf_run { namespace detail { class atf_config_reader { std::istream& m_is; protected: virtual void got_var(const std::string&, const std::string &); virtual void got_eof(void); public: atf_config_reader(std::istream&); virtual ~atf_config_reader(void); void read(void); }; } // namespace detail atf::tests::vars_map merge_configs(const atf::tests::vars_map&, const atf::tests::vars_map&); atf::tests::vars_map read_config_files(const std::string&); } // namespace atf_run } // namespace atf bind9-9.9.5.dfsg/unit/atf-src/atf-report/0002755000470500017500000000000012276444014017445 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-report/atf-report.10000644000470500017500000001232212271526120021602 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd December 16, 2011 .Dt ATF-REPORT 1 .Os .Sh NAME .Nm atf-report .Nd transforms the output of atf-run to different formats .Sh SYNOPSIS .Nm .Op Fl o Ar fmt1:path1 Op .. Fl o Ar fmtN:pathN .Nm .Fl h .Sh DESCRIPTION .Nm reads the output of .Nm atf-run and transforms it to different formats. Some of these are user-friendly and others are machine-parseable, which opens a wide range of possibilities to analyze the results of a test suite's execution. See .Sx Output formats below for more details on which these formats are. .Pp In the first synopsis form, .Nm reads the output of .Nm atf-run through its standard input and, if no .Fl o options are given, prints a user-friendly report on its standard output using the .Sq ticker format. If .Fl o options are provided (more than one are allowed), they specify the complete list of reports to generate. They are all generated simultaneously, and for obvious reasons, two reports cannot be written to the same file. Note that the default output is suppressed when .Fl o is provided. .Pp In the second synopsis form, .Nm will print information about all supported options and their purpose. .Pp The following options are available: .Bl -tag -width XoXfmtXpathXX .It Fl h Shows a short summary of all available options and their purpose. .It Fl o Ar fmt:path Adds a new output format. .Ar fmt is one of the formats described later on in .Sx Output formats . .Ar path specifies where the report will be written to. Depending on the chosen format, this may refer to a single file or to a directory. For those formats that write to a single file, specifying a .Sq - as the path will redirect the report to the standard output. .El .Ss Output formats The following output formats are allowed: .Bl -tag -width tickerXX .It csv A machine-parseable Comma-Separated Values (CSV) file. This file contains the results for all test cases and test programs. Test cases are logged using the following syntax: .Bd -literal -offset indent tc, duration, test-program, test-case, result[, reason] .Ed .Pp The .Sq result field for test cases is always one of .Sq passed , .Sq skipped or .Sq failed . The last two are always followed by a reason. .Pp Test programs are logged with the following syntax: .Bd -literal -offset indent tp, duration, test-program, result[, reason] .Ed .Pp In this case, the .Sq result can be one of: .Sq passed , which denotes test programs that ran without any failure; .Sq failed , which refers to test programs in which one or more test cases failed; or .Sq bogus , which mentions those test programs that failed to execute by some reason. The reason field is only available in the last case. .Pp The time required to execute each test case and test program is also provided. You should not rely on the order of the entries in the resulting output. .It ticker A user-friendly report that shows the progress of the test suite's execution as it operates. This type of report should always be redirected to a virtual terminal, not a file, as it may use control sequences that will make the output unreadable in regular files. .It xml A report contained in a single XML file. Ideal for later processing with .Xr xsltproc 1 to generate nice HTML reports. .El .Sh EXAMPLES The most simple way of running a test suite is to pipe the output of .Nm atf-run through .Nm without any additional flags. This will use the default output format, which is suitable to most users: .Bd -literal -offset indent atf-run | atf-report .Ed .Pp In some situations, it may be interesting to get a machine-parseable file aside from the standard report. This can be done as follows: .Bd -literal -offset indent atf-run | atf-report -o csv:testsuite.csv -o ticker:- .Ed .Pp Or if the standard report is not desired, thus achieving completely silent operation: atf-run | atf-report -o csv:testsuite.csv .Sh SEE ALSO .Xr atf-run 1 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-report/integration_test.sh0000644000470500017500000003451512271526120023363 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # create_helpers() { mkdir dir1 cp $(atf_get_srcdir)/pass_helper dir1/tp1 cp $(atf_get_srcdir)/fail_helper dir1/tp2 cp $(atf_get_srcdir)/pass_helper tp3 cp $(atf_get_srcdir)/fail_helper tp4 cat >tp5 <Atffile <dir1/Atffile <etc/atf-run.hooks <tps.out 2>/dev/null rm -rf etc } atf_test_case default default_head() { atf_set "descr" "Checks that the default output uses the ticker" \ "format" } default_body() { create_helpers run_helpers # Check that the default output uses the ticker format. atf_check -s eq:0 -o match:'test cases' -o match:'Failed test cases' \ -o match:'Summary for' -e empty -x 'atf-report Atffile <expout <expout <expout <>'; expected \`:' EOF # NO_CHECK_STYLE_END atf_check -s eq:0 -o file:expout -e empty -x \ "atf-report -o csv:- expout <>'; expected \`:'' [#.#s] Failed (bogus) test programs: tp5 Failed test cases: dir1/tp2:main, tp4:main Summary for 5 test programs: 2 passed test cases. 2 failed test cases. 0 expected failed test cases. 0 skipped test cases. EOF atf_check -s eq:0 -o file:expout -e empty -x \ "atf-report -o ticker:- expout < A value #.# #.# This always fails #.# #.# #.# #.# This always fails #.# #.# Invalid format for test case list: 1: Unexpected token \`<<NEWLINE>>'; expected \`:' #.# Another value EOF # NO_CHECK_STYLE_END atf_check -s eq:0 -o file:expout -e empty -x \ "atf-report -o xml:- < tps.out | sed -E -e 's/>[0-9]+.[0-9]{6}#.#Atffile <expout < A value --- a 2007-11-04 14:00:41.000000000 +0100 +++ b 2007-11-04 14:00:48.000000000 +0100 @@ -1,7 +1,7 @@ This test is meant to simulate a diff. Blank space at beginning of context lines must be preserved. -First original line. -Second original line. +First modified line. +Second modified line. EOF #.# #.# Another value EOF # NO_CHECK_STYLE_END run_helpers atf_check -s eq:0 -o file:expout -e empty -x \ "atf-report -o xml:- [0-9]+.[0-9]{6}#.#experr < #include #include #include #include #include "atf-c++/macros.hpp" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/test_helpers.hpp" #include "atf-c++/detail/text.hpp" #include "reader.hpp" namespace impl = atf::atf_report; class tps_reader : protected impl::atf_tps_reader { void got_info(const std::string& what, const std::string& val) { m_calls.push_back("got_info(" + what + ", " + val + ")"); } void got_ntps(size_t ntps) { m_calls.push_back("got_ntps(" + atf::text::to_string(ntps) + ")"); } void got_tp_start(const std::string& tpname, size_t ntcs) { m_calls.push_back("got_tp_start(" + tpname + ", " + atf::text::to_string(ntcs) + ")"); } void got_tp_end(struct timeval* tv ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& reason) { m_calls.push_back("got_tp_end(" + reason + ")"); } void got_tc_start(const std::string& tcname) { m_calls.push_back("got_tc_start(" + tcname + ")"); } void got_tc_end(const std::string& state, struct timeval* tv ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& reason) { const std::string r = state + (reason.empty() ? "" : ", " + reason); m_calls.push_back("got_tc_end(" + r + ")"); } void got_tc_stdout_line(const std::string& line) { m_calls.push_back("got_tc_stdout_line(" + line + ")"); } void got_tc_stderr_line(const std::string& line) { m_calls.push_back("got_tc_stderr_line(" + line + ")"); } void got_eof(void) { m_calls.push_back("got_eof()"); } public: tps_reader(std::istream& is) : impl::atf_tps_reader(is) { } void read(void) { atf_tps_reader::read(); } std::vector< std::string > m_calls; }; ATF_TEST_CASE_WITHOUT_HEAD(tps_1); ATF_TEST_CASE_BODY(tps_1) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 0\n" ; const char* exp_calls[] = { "got_ntps(0)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_2); ATF_TEST_CASE_BODY(tps_2) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 2\n" "tp-start: 123.456, first-prog, 0\n" "tp-end: 123.567, first-prog\n" "tp-start: 123.678, second-prog, 0\n" "tp-end: 123.789, second-prog, This program failed\n" ; const char* exp_calls[] = { "got_ntps(2)", "got_tp_start(first-prog, 0)", "got_tp_end()", "got_tp_start(second-prog, 0)", "got_tp_end(This program failed)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_3); ATF_TEST_CASE_BODY(tps_3) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 2\n" "tp-start: 123.123, first-prog, 3\n" "tc-start: 123.234, first-test\n" "tc-end: 123.345, first-test, passed\n" "tc-start: 123.456, second-test\n" "tc-end: 123.567, second-test, skipped, Testing skipped reason\n" "tc-start: 123.678, third.test\n" "tc-end: 123.789, third.test, failed, Testing failed reason\n" "tp-end: 123.890, first-prog\n" "tp-start: 124.901, second-prog, 3\n" "tc-start: 124.1012, first-test\n" "tc-so:first stdout line for 1st test\n" "tc-se:first stderr line for 1st test\n" "tc-so:second stdout line for 1st test\n" "tc-se:second stderr line for 1st test\n" "tc-end: 124.1123, first-test, passed\n" "tc-start: 124.1234, second-test\n" "tc-so:first stdout line for 2nd test\n" "tc-se:first stderr line for 2nd test\n" "tc-so:second stdout line for 2nd test\n" "tc-se:second stderr line for 2nd test\n" "tc-end: 124.1345, second-test, skipped, Testing skipped reason\n" "tc-start: 124.1456, third.test\n" "tc-so:first stdout line for 3rd test\n" "tc-se:first stderr line for 3rd test\n" "tc-so:second stdout line for 3rd test\n" "tc-se:second stderr line for 3rd test\n" "tc-end: 124.1567, third.test, failed, Testing failed reason\n" "tp-end: 124.1678, second-prog, This program failed\n" ; const char* exp_calls[] = { "got_ntps(2)", "got_tp_start(first-prog, 3)", "got_tc_start(first-test)", "got_tc_end(passed)", "got_tc_start(second-test)", "got_tc_end(skipped, Testing skipped reason)", "got_tc_start(third.test)", "got_tc_end(failed, Testing failed reason)", "got_tp_end()", "got_tp_start(second-prog, 3)", "got_tc_start(first-test)", "got_tc_stdout_line(first stdout line for 1st test)", "got_tc_stderr_line(first stderr line for 1st test)", "got_tc_stdout_line(second stdout line for 1st test)", "got_tc_stderr_line(second stderr line for 1st test)", "got_tc_end(passed)", "got_tc_start(second-test)", "got_tc_stdout_line(first stdout line for 2nd test)", "got_tc_stderr_line(first stderr line for 2nd test)", "got_tc_stdout_line(second stdout line for 2nd test)", "got_tc_stderr_line(second stderr line for 2nd test)", "got_tc_end(skipped, Testing skipped reason)", "got_tc_start(third.test)", "got_tc_stdout_line(first stdout line for 3rd test)", "got_tc_stderr_line(first stderr line for 3rd test)", "got_tc_stdout_line(second stdout line for 3rd test)", "got_tc_stderr_line(second stderr line for 3rd test)", "got_tc_end(failed, Testing failed reason)", "got_tp_end(This program failed)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_4); ATF_TEST_CASE_BODY(tps_4) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a, foo\n" "info: b, bar\n" "info: c, baz\n" "tps-count: 2\n" "tp-start: 234.1, first-prog, 3\n" "tc-start: 234.12, first-test\n" "tc-end: 234.23, first-test, passed\n" "tc-start: 234.34, second-test\n" "tc-end: 234.45, second-test, skipped, Testing skipped reason\n" "tc-start: 234.56, third-test\n" "tc-end: 234.67, third-test, failed, Testing failed reason\n" "tp-end: 234.78, first-prog\n" "tp-start: 234.89, second-prog, 3\n" "tc-start: 234.90, first-test\n" "tc-so:first stdout line for 1st test\n" "tc-se:first stderr line for 1st test\n" "tc-so:second stdout line for 1st test\n" "tc-se:second stderr line for 1st test\n" "tc-end: 234.101, first-test, passed\n" "tc-start: 234.112, second-test\n" "tc-so:first stdout line for 2nd test\n" "tc-se:first stderr line for 2nd test\n" "tc-so:second stdout line for 2nd test\n" "tc-se:second stderr line for 2nd test\n" "tc-end: 234.123, second-test, skipped, Testing skipped reason\n" "tc-start: 234.134, third-test\n" "tc-so:first stdout line for 3rd test\n" "tc-se:first stderr line for 3rd test\n" "tc-so:second stdout line for 3rd test\n" "tc-se:second stderr line for 3rd test\n" "tc-end: 234.145, third-test, failed, Testing failed reason\n" "tp-end: 234.156, second-prog, This program failed\n" "info: d, foo\n" "info: e, bar\n" "info: f, baz\n" ; const char* exp_calls[] = { "got_info(a, foo)", "got_info(b, bar)", "got_info(c, baz)", "got_ntps(2)", "got_tp_start(first-prog, 3)", "got_tc_start(first-test)", "got_tc_end(passed)", "got_tc_start(second-test)", "got_tc_end(skipped, Testing skipped reason)", "got_tc_start(third-test)", "got_tc_end(failed, Testing failed reason)", "got_tp_end()", "got_tp_start(second-prog, 3)", "got_tc_start(first-test)", "got_tc_stdout_line(first stdout line for 1st test)", "got_tc_stderr_line(first stderr line for 1st test)", "got_tc_stdout_line(second stdout line for 1st test)", "got_tc_stderr_line(second stderr line for 1st test)", "got_tc_end(passed)", "got_tc_start(second-test)", "got_tc_stdout_line(first stdout line for 2nd test)", "got_tc_stderr_line(first stderr line for 2nd test)", "got_tc_stdout_line(second stdout line for 2nd test)", "got_tc_stderr_line(second stderr line for 2nd test)", "got_tc_end(skipped, Testing skipped reason)", "got_tc_start(third-test)", "got_tc_stdout_line(first stdout line for 3rd test)", "got_tc_stderr_line(first stderr line for 3rd test)", "got_tc_stdout_line(second stdout line for 3rd test)", "got_tc_stderr_line(second stderr line for 3rd test)", "got_tc_end(failed, Testing failed reason)", "got_tp_end(This program failed)", "got_info(d, foo)", "got_info(e, bar)", "got_info(f, baz)", "got_eof()", NULL }; const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_5); ATF_TEST_CASE_BODY(tps_5) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "tp-start: 345.123, the-prog, 1\n" "tc-start: 345.134, the-test\n" "tc-so:--- a 2007-11-04 14:00:41.000000000 +0100\n" "tc-so:+++ b 2007-11-04 14:00:48.000000000 +0100\n" "tc-so:@@ -1,7 +1,7 @@\n" "tc-so: This test is meant to simulate a diff.\n" "tc-so: Blank space at beginning of context lines must be preserved.\n" "tc-so: \n" "tc-so:-First original line.\n" "tc-so:-Second original line.\n" "tc-so:+First modified line.\n" "tc-so:+Second modified line.\n" "tc-so: \n" "tc-so: EOF\n" "tc-end: 345.145, the-test, passed\n" "tp-end: 345.156, the-prog\n" ; // NO_CHECK_STYLE_BEGIN const char* exp_calls[] = { "got_ntps(1)", "got_tp_start(the-prog, 1)", "got_tc_start(the-test)", "got_tc_stdout_line(--- a 2007-11-04 14:00:41.000000000 +0100)", "got_tc_stdout_line(+++ b 2007-11-04 14:00:48.000000000 +0100)", "got_tc_stdout_line(@@ -1,7 +1,7 @@)", "got_tc_stdout_line( This test is meant to simulate a diff.)", "got_tc_stdout_line( Blank space at beginning of context lines must be preserved.)", "got_tc_stdout_line( )", "got_tc_stdout_line(-First original line.)", "got_tc_stdout_line(-Second original line.)", "got_tc_stdout_line(+First modified line.)", "got_tc_stdout_line(+Second modified line.)", "got_tc_stdout_line( )", "got_tc_stdout_line( EOF)", "got_tc_end(passed)", "got_tp_end()", "got_eof()", NULL }; // NO_CHECK_STYLE_END const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_6); ATF_TEST_CASE_BODY(tps_6) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "tp-start: 321.1, the-prog, 8\n" "tc-start: 321.12, one\n" "tc-end: 321.23, one, expected_death, The reason\n" "tc-start: 321.34, two\n" "tc-end: 321.45, two, expected_exit, This would be an exit\n" "tc-start: 321.56, three\n" "tc-end: 321.67, three, expected_failure, And this a failure\n" "tc-start: 321.78, four\n" "tc-end: 321.89, four, expected_signal, And this a signal\n" "tc-start: 321.90, five\n" "tc-end: 321.101, five, failed, Another reason\n" "tc-start: 321.112, six\n" "tc-end: 321.123, six, passed\n" "tc-start: 321.134, seven\n" "tc-end: 321.145, seven, skipped, Skipping it\n" "tc-start: 321.156, eight\n" "tc-end: 321.167, eight, expected_timeout, Some hang reason\n" "tp-end: 321.178, the-prog\n" ; // NO_CHECK_STYLE_BEGIN const char* exp_calls[] = { "got_ntps(1)", "got_tp_start(the-prog, 8)", "got_tc_start(one)", "got_tc_end(expected_death, The reason)", "got_tc_start(two)", "got_tc_end(expected_exit, This would be an exit)", "got_tc_start(three)", "got_tc_end(expected_failure, And this a failure)", "got_tc_start(four)", "got_tc_end(expected_signal, And this a signal)", "got_tc_start(five)", "got_tc_end(failed, Another reason)", "got_tc_start(six)", "got_tc_end(passed)", "got_tc_start(seven)", "got_tc_end(skipped, Skipping it)", "got_tc_start(eight)", "got_tc_end(expected_timeout, Some hang reason)", "got_tp_end()", "got_eof()", NULL }; // NO_CHECK_STYLE_END const char* exp_errors[] = { NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_50); ATF_TEST_CASE_BODY(tps_50) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "foo\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `foo'; expected tps-count or info field", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_51); ATF_TEST_CASE_BODY(tps_51) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected `:'", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_52); ATF_TEST_CASE_BODY(tps_52) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count:\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected number of test programs", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_53); ATF_TEST_CASE_BODY(tps_53) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "foo\n" ; const char* exp_calls[] = { "got_ntps(1)", NULL }; const char* exp_errors[] = { "4: Unexpected token `foo'; expected start of test program", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_54); ATF_TEST_CASE_BODY(tps_54) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "foo\n" "tp-start\n" "tp-start:\n" "tp-start: 123\n" "tp-start: 123.\n" "tp-start: 123.456\n" "tp-start: 123.456,\n" "tp-start: 123.456, foo\n" "tp-start: 123.456, foo,\n" "tp-start: 123.456, foo, 0\n" "bar\n" "tp-start: 456.789, foo, 0\n" "tp-end\n" "tp-start: 777.777, foo, 0\n" "tp-end:\n" "tp-start: 777.777, foo, 0\n" "tp-end: 777\n" "tp-start: 777.777, foo, 0\n" "tp-end: 777.\n" "tp-start: 777.777, foo, 0\n" "tp-end: 777.888\n" "tp-start: 777.777, foo, 0\n" "tp-end: 777.888, \n" "tp-start: 777.777, foo, 0\n" "tp-end: 777.888, bar\n" "tp-start: 777.777, foo, 0\n" "tp-end: 777.888, foo,\n" ; const char* exp_calls[] = { "got_ntps(1)", NULL }; const char* exp_errors[] = { "4: Unexpected token `foo'; expected start of test program", "5: Unexpected token `<>'; expected `:'", "6: Unexpected token `<>'; expected timestamp", "7: Malformed timestamp value 123", "8: Malformed timestamp value 123.", "9: Unexpected token `<>'; expected `,'", "10: Unexpected token `<>'; expected test program name", "11: Unexpected token `<>'; expected `,'", "12: Unexpected token `<>'; expected number of test programs", "14: Unexpected token `bar'; expected end of test program", "16: Unexpected token `<>'; expected `:'", "18: Unexpected token `<>'; expected timestamp", "20: Malformed timestamp value 777", "22: Malformed timestamp value 777.", "24: Unexpected token `<>'; expected `,'", "26: Unexpected token `<>'; expected test program name", "28: Test program name used in terminator does not match opening", "30: Empty reason for failed test program", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_55); ATF_TEST_CASE_BODY(tps_55) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "tp-start: 100.200, foo, 1\n" "foo\n" "tc-start\n" "tc-start:\n" "tc-start: 111\n" "tc-start: 111.\n" "tc-start: 111.222\n" "tc-start: 111.222,\n" "tc-start: 111.222, foo\n" "bar\n" "tc-start: 111.333, foo\n" "tc-end\n" "tc-start: 111.444, foo\n" "tc-end:\n" "tc-start: 111.444, foo\n" "tc-end: 111\n" "tc-start: 111.444, foo\n" "tc-end: 111.\n" "tc-start: 111.444, foo\n" "tc-end: 111.555\n" "tc-start: 111.444, foo\n" "tc-end: 111.555, \n" "tc-start: 111.444, foo\n" "tc-end: 111.555, bar\n" "tc-start: 111.444, foo\n" "tc-end: 111.555, foo\n" "tc-start: 111.444, foo\n" "tc-end: 111.555, foo,\n" "tp-end: 111.666, foo\n" ; const char* exp_calls[] = { "got_ntps(1)", "got_tp_start(foo, 1)", NULL }; // NO_CHECK_STYLE_BEGIN const char* exp_errors[] = { "5: Unexpected token `foo'; expected start of test case", "6: Unexpected token `<>'; expected `:'", "7: Unexpected token `<>'; expected timestamp", "8: Malformed timestamp value 111", "9: Malformed timestamp value 111.", "10: Unexpected token `<>'; expected `,'", "11: Unexpected token `<>'; expected test case name", "13: Unexpected token `bar'; expected end of test case or test case's stdout/stderr line", "15: Unexpected token `<>'; expected `:'", "17: Unexpected token `<>'; expected timestamp", "19: Malformed timestamp value 111", "21: Malformed timestamp value 111.", "23: Unexpected token `<>'; expected `,'", "25: Unexpected token `<>'; expected test case name", "27: Test case name used in terminator does not match opening", "29: Unexpected token `<>'; expected `,'", "31: Unexpected token `<>'; expected expected_{death,exit,failure,signal,timeout}, failed, passed or skipped", "32: Unexpected token `tp-end'; expected start of test case", NULL }; // NO_CHECK_STYLE_END do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_56); ATF_TEST_CASE_BODY(tps_56) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "tp-start: 111.222, foo, 1\n" "tc-start: 111.333, foo\n" "tc-end: 111.444, foo, passe\n" "tc-start: 111.333, foo\n" "tc-end: 111.444, foo, passed,\n" "tc-start: 111.555, bar\n" "tc-end: 111.666, bar, failed\n" "tc-start: 111.555, bar\n" "tc-end: 111.666, bar, failed,\n" "tc-start: 111.555, baz\n" "tc-end: 111.666, baz, skipped\n" "tc-start: 111.555, baz\n" "tc-end: 111.666, baz, skipped,\n" "tp-end: 111.777, foo\n" ; const char* exp_calls[] = { "got_ntps(1)", "got_tp_start(foo, 1)", "got_tc_start(foo)", NULL }; // NO_CHECK_STYLE_BEGIN const char* exp_errors[] = { "6: Unexpected token `passe'; expected expected_{death,exit,failure,signal,timeout}, failed, passed or skipped", "8: Unexpected token `,'; expected new line", "10: Unexpected token `<>'; expected `,'", "12: Empty reason for failed test case result", "14: Unexpected token `<>'; expected `,'", "16: Empty reason for skipped test case result", "17: Unexpected token `tp-end'; expected start of test case", NULL }; // NO_CHECK_STYLE_END do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_57); ATF_TEST_CASE_BODY(tps_57) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 2\n" "tp-start: 111.222, foo, 0\n" "tp-end: 111.333, foo\n" ; const char* exp_calls[] = { "got_ntps(2)", "got_tp_start(foo, 0)", "got_tp_end()", NULL }; const char* exp_errors[] = { "6: Unexpected token `<>'; expected start of test program", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_58); ATF_TEST_CASE_BODY(tps_58) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "tps-count: 1\n" "tp-start: 111.222, foo, 0\n" "tp-end: 111.333, foo\n" "tp-start: 111.444, bar, 0\n" "tp-end: 111.555, bar\n" ; const char* exp_calls[] = { "got_ntps(1)", "got_tp_start(foo, 0)", "got_tp_end()", NULL }; const char* exp_errors[] = { "6: Unexpected token `tp-start'; expected end of stream or info field", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_59); ATF_TEST_CASE_BODY(tps_59) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected `:'", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_60); ATF_TEST_CASE_BODY(tps_60) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info:\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected info property name", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_61); ATF_TEST_CASE_BODY(tps_61) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "3: Unexpected token `<>'; expected `,'", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_62); ATF_TEST_CASE_BODY(tps_62) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a,\n" ; const char* exp_calls[] = { "got_info(a, )", NULL }; const char* exp_errors[] = { "4: Unexpected token `<>'; expected tps-count or info field", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_63); ATF_TEST_CASE_BODY(tps_63) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a, b\n" ; const char* exp_calls[] = { "got_info(a, b)", NULL }; const char* exp_errors[] = { "4: Unexpected token `<>'; expected tps-count or info field", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_64); ATF_TEST_CASE_BODY(tps_64) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a, b\n" "info: a.b.c.def, g\n" "tps-count\n" ; const char* exp_calls[] = { "got_info(a, b)", "got_info(a.b.c.def, g)", NULL }; const char* exp_errors[] = { "5: Unexpected token `<>'; expected `:'", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_65); ATF_TEST_CASE_BODY(tps_65) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a, b\n" "tps-count:\n" ; const char* exp_calls[] = { "got_info(a, b)", NULL }; const char* exp_errors[] = { "4: Unexpected token `<>'; expected number of test programs", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(tps_66); ATF_TEST_CASE_BODY(tps_66) { const char* input = "Content-Type: application/X-atf-tps; version=\"3\"\n" "\n" "info: a, b\n" "tps-count: 0\n" "info\n" ; const char* exp_calls[] = { "got_info(a, b)", "got_ntps(0)", NULL }; const char* exp_errors[] = { "5: Unexpected token `<>'; expected `:'", NULL }; do_parser_test< tps_reader >(input, exp_calls, exp_errors); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, tps_1); ATF_ADD_TEST_CASE(tcs, tps_2); ATF_ADD_TEST_CASE(tcs, tps_3); ATF_ADD_TEST_CASE(tcs, tps_4); ATF_ADD_TEST_CASE(tcs, tps_5); ATF_ADD_TEST_CASE(tcs, tps_6); ATF_ADD_TEST_CASE(tcs, tps_50); ATF_ADD_TEST_CASE(tcs, tps_51); ATF_ADD_TEST_CASE(tcs, tps_52); ATF_ADD_TEST_CASE(tcs, tps_53); ATF_ADD_TEST_CASE(tcs, tps_54); ATF_ADD_TEST_CASE(tcs, tps_55); ATF_ADD_TEST_CASE(tcs, tps_56); ATF_ADD_TEST_CASE(tcs, tps_57); ATF_ADD_TEST_CASE(tcs, tps_58); ATF_ADD_TEST_CASE(tcs, tps_59); ATF_ADD_TEST_CASE(tcs, tps_60); ATF_ADD_TEST_CASE(tcs, tps_61); ATF_ADD_TEST_CASE(tcs, tps_62); ATF_ADD_TEST_CASE(tcs, tps_63); ATF_ADD_TEST_CASE(tcs, tps_64); ATF_ADD_TEST_CASE(tcs, tps_65); ATF_ADD_TEST_CASE(tcs, tps_66); } bind9-9.9.5.dfsg/unit/atf-src/atf-report/tests-results.css0000644000470500017500000000766412271526120023025 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ body { margin: 0 0 0 0; } .nobr { white-space: nowrap; } h1 { background: black; color: white; font-family: Arial; font-size: 24pt; padding: 5pt; } h2 { background: #eeeeee; font-family: Arial; font-size: 16pt; margin-left: 10pt; margin-right: 10pt; padding: 3pt; } h3 { font-family: Arial; font-size: 12pt; margin-left: 20pt; margin-right: 20pt; padding: 3pt; } p.details { margin-left: 20pt; margin-right: 20pt; } p.term { margin-left: 40pt; margin-right: 40pt; } pre.so { margin-left: 40pt; margin-right: 40pt; } pre.se { margin-left: 40pt; margin-right: 40pt; } table.summary { border-collapse: collapse; border-color: black; border-style: solid; border-width: 1pt; margin-left: auto; margin-right: auto; } table.summary th { background: #aaaadd; border-style: solid; border-width: 1pt; padding: 3pt 6pt 3pt 6pt; } table.summary td { border-style: solid; border-width: 1pt; padding: 3pt 6pt 3pt 6pt; } table.summary td.numeric p { text-align: right; } table.summary td.numeric-error p { text-align: right; color: red; } table.summary td.numeric-warning p { text-align: right; color: #aaaa00; } table.summary tr.group { background: #dddddd; } table.summary tr.entry td p { margin-left: 10pt; } table.tcs-summary { border-collapse: collapse; border-color: black; border-style: solid; border-width: 1pt; margin-left: auto; margin-right: auto; width: 80%; } table.tcs-summary td { border-style: solid; border-width: 1pt; padding: 3pt 6pt 3pt 6pt; } table.tcs-summary th { background: #aaaadd; border-style: solid; border-width: 1pt; padding: 3pt 6pt 3pt 6pt; } table.tcs-summary td.numeric { width: 1pt; } table.tcs-summary td.numeric p { text-align: right; } table.tcs-summary td.tp-numeric { background: #dddddd; width: 1pt; } table.tcs-summary td.tp-numeric p { text-align: right; } table.tcs-summary td.tp-id { background: #dddddd; font-weight: bold; width: 1pt; } table.tcs-summary td.tc-id p { margin-left: 10pt; } table.tcs-summary td.tcr-passed { background: #aaffaa; width: 1pt; } table.tcs-summary td.tcr-failed { background: #ffaaaa; width: 1pt; } table.tcs-summary td.tcr-skipped { background: #ffffaa; width: 1pt; } table.tcs-summary td.tcr-xfail { background: #ffaaff; width: 1pt; } table.tcs-summary td.tcr-reason { width: 100%; } bind9-9.9.5.dfsg/unit/atf-src/atf-report/reader.hpp0000644000470500017500000000541512271526120021415 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_REPORT_FORMATS_HPP_) #define _ATF_REPORT_FORMATS_HPP_ extern "C" { #include } #include #include #include namespace atf { namespace atf_report { struct test_case_result { enum state_enum { PASSED, FAILED, SKIPPED, }; const state_enum state; const std::string& reason; test_case_result(const state_enum p_state, const std::string& p_reason) : state(p_state), reason(p_reason) { } }; class atf_tps_reader { std::istream& m_is; void read_info(void*); void read_tp(void*); void read_tc(void*); protected: virtual void got_info(const std::string&, const std::string&); virtual void got_ntps(size_t); virtual void got_tp_start(const std::string&, size_t); virtual void got_tp_end(struct timeval*, const std::string&); virtual void got_tc_start(const std::string&); virtual void got_tc_stdout_line(const std::string&); virtual void got_tc_stderr_line(const std::string&); virtual void got_tc_end(const std::string&, struct timeval*, const std::string&); virtual void got_eof(void); public: atf_tps_reader(std::istream&); virtual ~atf_tps_reader(void); void read(void); }; } // namespace atf_report } // namespace atf #endif // !defined(_ATF_REPORT_FORMATS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-report/Atffile0000644000470500017500000000013612271526120020732 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: *_test bind9-9.9.5.dfsg/unit/atf-src/atf-report/tests-results.dtd0000644000470500017500000000440712271526120023000 0ustar lamontlamont bind9-9.9.5.dfsg/unit/atf-src/atf-report/atf-report.cpp0000644000470500017500000005251412271526120022233 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include #include #include #include #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" #include "atf-c++/detail/ui.hpp" #include "reader.hpp" typedef std::auto_ptr< std::ostream > ostream_ptr; static ostream_ptr open_outfile(const atf::fs::path& path) { ostream_ptr osp; if (path.str() == "-") osp = ostream_ptr(new std::ofstream("/dev/stdout")); else osp = ostream_ptr(new std::ofstream(path.c_str())); if (!(*osp)) throw std::runtime_error("Could not create file " + path.str()); return osp; } static std::string format_tv(struct timeval* tv) { std::ostringstream output; output << static_cast< long >(tv->tv_sec) << '.' << std::setfill('0') << std::setw(6) << static_cast< long >(tv->tv_usec); return output.str(); } // ------------------------------------------------------------------------ // The "writer" interface. // ------------------------------------------------------------------------ //! //! \brief A base class that defines an output format. //! //! The writer base class defines a generic interface to output formats. //! This is meant to be subclassed, and each subclass can redefine any //! method to format the information as it wishes. //! //! This class is not tied to a output stream nor a file because, depending //! on the output format, we will want to write to a single file or to //! multiple ones. //! class writer { public: writer(void) {} virtual ~writer(void) {} virtual void write_info(const std::string&, const std::string&) {} virtual void write_ntps(size_t) {} virtual void write_tp_start(const std::string&, size_t) {} virtual void write_tp_end(struct timeval*, const std::string&) {} virtual void write_tc_start(const std::string&) {} virtual void write_tc_stdout_line(const std::string&) {} virtual void write_tc_stderr_line(const std::string&) {} virtual void write_tc_end(const std::string&, struct timeval*, const std::string&) {} virtual void write_eof(void) {} }; // ------------------------------------------------------------------------ // The "csv_writer" class. // ------------------------------------------------------------------------ //! //! \brief A very simple plain-text output format. //! //! The csv_writer class implements a very simple plain-text output //! format that summarizes the results of each executed test case. The //! results are meant to be easily parseable by third-party tools, hence //! they are formatted as a CSV file. //! class csv_writer : public writer { ostream_ptr m_os; bool m_failed; std::string m_tpname; std::string m_tcname; public: csv_writer(const atf::fs::path& p) : m_os(open_outfile(p)) { } virtual void write_tp_start(const std::string& name, size_t ntcs ATF_DEFS_ATTRIBUTE_UNUSED) { m_tpname = name; m_failed = false; } virtual void write_tp_end(struct timeval* tv, const std::string& reason) { const std::string timestamp = format_tv(tv); if (!reason.empty()) (*m_os) << "tp, " << timestamp << ", " << m_tpname << ", bogus, " << reason << "\n"; else if (m_failed) (*m_os) << "tp, " << timestamp << ", "<< m_tpname << ", failed\n"; else (*m_os) << "tp, " << timestamp << ", "<< m_tpname << ", passed\n"; } virtual void write_tc_start(const std::string& name) { m_tcname = name; } virtual void write_tc_end(const std::string& state, struct timeval* tv, const std::string& reason) { std::string str = m_tpname + ", " + m_tcname + ", " + state; if (!reason.empty()) str += ", " + reason; (*m_os) << "tc, " << format_tv(tv) << ", " << str << "\n"; if (state == "failed") m_failed = true; } }; // ------------------------------------------------------------------------ // The "ticker_writer" class. // ------------------------------------------------------------------------ //! //! \brief A console-friendly output format. //! //! The ticker_writer class implements a formatter that is user-friendly //! in the sense that it shows the execution of test cases in an easy to //! read format. It is not meant to be parseable and its format can //! freely change across releases. //! class ticker_writer : public writer { ostream_ptr m_os; size_t m_curtp, m_ntps; size_t m_tcs_passed, m_tcs_failed, m_tcs_skipped, m_tcs_expected_failures; std::string m_tcname, m_tpname; std::vector< std::string > m_failed_tcs; std::map< std::string, std::string > m_expected_failures_tcs; std::vector< std::string > m_failed_tps; void write_info(const std::string& what, const std::string& val) { if (what == "tests.root") { (*m_os) << "Tests root: " << val << "\n\n"; } } void write_ntps(size_t ntps) { m_curtp = 1; m_tcs_passed = 0; m_tcs_failed = 0; m_tcs_skipped = 0; m_tcs_expected_failures = 0; m_ntps = ntps; } void write_tp_start(const std::string& tp, size_t ntcs) { using atf::text::to_string; using atf::ui::format_text; m_tpname = tp; (*m_os) << format_text(tp + " (" + to_string(m_curtp) + "/" + to_string(m_ntps) + "): " + to_string(ntcs) + " test cases") << "\n"; (*m_os).flush(); } void write_tp_end(struct timeval* tv, const std::string& reason) { using atf::ui::format_text_with_tag; m_curtp++; if (!reason.empty()) { (*m_os) << format_text_with_tag("BOGUS TEST PROGRAM: Cannot " "trust its results because " "of `" + reason + "'", m_tpname + ": ", false) << "\n"; m_failed_tps.push_back(m_tpname); } (*m_os) << "[" << format_tv(tv) << "s]\n\n"; (*m_os).flush(); m_tpname.clear(); } void write_tc_start(const std::string& tcname) { m_tcname = tcname; (*m_os) << " " + tcname + ": "; (*m_os).flush(); } void write_tc_end(const std::string& state, struct timeval* tv, const std::string& reason) { std::string str; (*m_os) << "[" << format_tv(tv) << "s] "; if (state == "expected_death" || state == "expected_exit" || state == "expected_failure" || state == "expected_signal" || state == "expected_timeout") { str = "Expected failure: " + reason; m_tcs_expected_failures++; m_expected_failures_tcs[m_tpname + ":" + m_tcname] = reason; } else if (state == "failed") { str = "Failed: " + reason; m_tcs_failed++; m_failed_tcs.push_back(m_tpname + ":" + m_tcname); } else if (state == "passed") { str = "Passed."; m_tcs_passed++; } else if (state == "skipped") { str = "Skipped: " + reason; m_tcs_skipped++; } else UNREACHABLE; // XXX Wrap text. format_text_with_tag does not currently allow // to specify the current column, which is needed because we have // already printed the tc's name. (*m_os) << str << '\n'; m_tcname = ""; } static void write_expected_failures(const std::map< std::string, std::string >& xfails, std::ostream& os) { using atf::ui::format_text; using atf::ui::format_text_with_tag; os << format_text("Test cases for known bugs:") << "\n"; for (std::map< std::string, std::string >::const_iterator iter = xfails.begin(); iter != xfails.end(); iter++) { const std::string& name = (*iter).first; const std::string& reason = (*iter).second; os << format_text_with_tag(reason, " " + name + ": ", false) << "\n"; } } void write_eof(void) { using atf::text::join; using atf::text::to_string; using atf::ui::format_text; using atf::ui::format_text_with_tag; if (!m_failed_tps.empty()) { (*m_os) << format_text("Failed (bogus) test programs:") << "\n"; (*m_os) << format_text_with_tag(join(m_failed_tps, ", "), " ", false) << "\n\n"; } if (!m_expected_failures_tcs.empty()) { write_expected_failures(m_expected_failures_tcs, *m_os); (*m_os) << "\n"; } if (!m_failed_tcs.empty()) { (*m_os) << format_text("Failed test cases:") << "\n"; (*m_os) << format_text_with_tag(join(m_failed_tcs, ", "), " ", false) << "\n\n"; } (*m_os) << format_text("Summary for " + to_string(m_ntps) + " test programs:") << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_passed) + " passed test cases.", " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_failed) + " failed test cases.", " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_expected_failures) + " expected failed test cases.", " ", false) << "\n"; (*m_os) << format_text_with_tag(to_string(m_tcs_skipped) + " skipped test cases.", " ", false) << "\n"; } public: ticker_writer(const atf::fs::path& p) : m_os(open_outfile(p)) { } }; // ------------------------------------------------------------------------ // The "xml" class. // ------------------------------------------------------------------------ //! //! \brief A single-file XML output format. //! //! The xml_writer class implements a formatter that prints the results //! of test cases in an XML format easily parseable later on by other //! utilities. //! class xml_writer : public writer { ostream_ptr m_os; std::string m_tcname, m_tpname; static std::string attrval(const std::string& str) { return str; } static std::string elemval(const std::string& str) { std::ostringstream buf; for (std::string::const_iterator iter = str.begin(); iter != str.end(); iter++) { const int character = static_cast< unsigned char >(*iter); if (character == '&') { buf << "&"; } else if (character == '<') { buf << "<"; } else if (character == '>') { buf << ">"; } else if (std::isalnum(character) || std::ispunct(character) || std::isspace(character)) { buf << static_cast< char >(character); } else { buf << "&#" << character << ";"; } } return buf.str(); } void write_info(const std::string& what, const std::string& val) { (*m_os) << "" << val << "\n"; } void write_tp_start(const std::string& tp, size_t ntcs ATF_DEFS_ATTRIBUTE_UNUSED) { (*m_os) << "\n"; } void write_tp_end(struct timeval* tv, const std::string& reason) { if (!reason.empty()) (*m_os) << "" << elemval(reason) << "\n"; (*m_os) << "" << format_tv(tv) << ""; (*m_os) << "\n"; } void write_tc_start(const std::string& tcname) { (*m_os) << "\n"; } void write_tc_stdout_line(const std::string& line) { (*m_os) << "" << elemval(line) << "\n"; } void write_tc_stderr_line(const std::string& line) { (*m_os) << "" << elemval(line) << "\n"; } void write_tc_end(const std::string& state, struct timeval* tv, const std::string& reason) { std::string str; if (state == "expected_death" || state == "expected_exit" || state == "expected_failure" || state == "expected_signal" || state == "expected_timeout") { (*m_os) << "<" << state << ">" << elemval(reason) << "\n"; } else if (state == "passed") { (*m_os) << "\n"; } else if (state == "failed") { (*m_os) << "" << elemval(reason) << "\n"; } else if (state == "skipped") { (*m_os) << "" << elemval(reason) << "\n"; } else UNREACHABLE; (*m_os) << "" << format_tv(tv) << ""; (*m_os) << "\n"; } void write_eof(void) { (*m_os) << "\n"; } public: xml_writer(const atf::fs::path& p) : m_os(open_outfile(p)) { (*m_os) << "\n" << "\n\n" "\n"; } }; // ------------------------------------------------------------------------ // The "converter" class. // ------------------------------------------------------------------------ //! //! \brief A reader that redirects events to multiple writers. //! //! The converter class implements an atf_tps_reader that, for each event //! raised by the parser, redirects it to multiple writers so that they //! can reformat it according to their output rules. //! class converter : public atf::atf_report::atf_tps_reader { typedef std::vector< writer* > outs_vector; outs_vector m_outs; void got_info(const std::string& what, const std::string& val) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_info(what, val); } void got_ntps(size_t ntps) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_ntps(ntps); } void got_tp_start(const std::string& tp, size_t ntcs) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tp_start(tp, ntcs); } void got_tp_end(struct timeval* tv, const std::string& reason) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tp_end(tv, reason); } void got_tc_start(const std::string& tcname) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tc_start(tcname); } void got_tc_stdout_line(const std::string& line) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tc_stdout_line(line); } void got_tc_stderr_line(const std::string& line) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tc_stderr_line(line); } void got_tc_end(const std::string& state, struct timeval* tv, const std::string& reason) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_tc_end(state, tv, reason); } void got_eof(void) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) (*iter)->write_eof(); } public: converter(std::istream& is) : atf::atf_report::atf_tps_reader(is) { } ~converter(void) { for (outs_vector::iterator iter = m_outs.begin(); iter != m_outs.end(); iter++) delete *iter; } void add_output(const std::string& fmt, const atf::fs::path& p) { if (fmt == "csv") { m_outs.push_back(new csv_writer(p)); } else if (fmt == "ticker") { m_outs.push_back(new ticker_writer(p)); } else if (fmt == "xml") { m_outs.push_back(new xml_writer(p)); } else throw std::runtime_error("Unknown format `" + fmt + "'"); } }; // ------------------------------------------------------------------------ // The "atf_report" class. // ------------------------------------------------------------------------ class atf_report : public atf::application::app { static const char* m_description; typedef std::pair< std::string, atf::fs::path > fmt_path_pair; std::vector< fmt_path_pair > m_oflags; void process_option(int, const char*); options_set specific_options(void) const; public: atf_report(void); int main(void); }; const char* atf_report::m_description = "atf-report is a tool that parses the output of atf-run and " "generates user-friendly reports in multiple different formats."; atf_report::atf_report(void) : app(m_description, "atf-report(1)", "atf(7)") { } void atf_report::process_option(int ch, const char* arg) { switch (ch) { case 'o': { std::string str(arg); std::string::size_type pos = str.find(':'); if (pos == std::string::npos) throw std::runtime_error("Syntax error in -o option"); else { std::string fmt = str.substr(0, pos); atf::fs::path path = atf::fs::path(str.substr(pos + 1)); m_oflags.push_back(fmt_path_pair(fmt, path)); } } break; default: UNREACHABLE; } } atf_report::options_set atf_report::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('o', "fmt:path", "Adds a new output file; multiple " "ones can be specified, and a - " "path means stdout")); return opts; } int atf_report::main(void) { if (m_argc > 0) throw std::runtime_error("No arguments allowed"); if (m_oflags.empty()) m_oflags.push_back(fmt_path_pair("ticker", atf::fs::path("-"))); // Look for path duplicates. std::set< atf::fs::path > paths; for (std::vector< fmt_path_pair >::const_iterator iter = m_oflags.begin(); iter != m_oflags.end(); iter++) { atf::fs::path p = (*iter).second; if (p == atf::fs::path("/dev/stdout")) p = atf::fs::path("-"); if (paths.find(p) != paths.end()) throw std::runtime_error("The file `" + p.str() + "' was " "specified more than once"); paths.insert((*iter).second); } // Generate the output files. converter cnv(std::cin); for (std::vector< fmt_path_pair >::const_iterator iter = m_oflags.begin(); iter != m_oflags.end(); iter++) cnv.add_output((*iter).first, (*iter).second); cnv.read(); return EXIT_SUCCESS; } int main(int argc, char* const* argv) { return atf_report().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-report/Makefile.am.inc0000644000470500017500000000643612271526120022252 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # bin_PROGRAMS += atf-report/atf-report atf_report_atf_report_SOURCES = atf-report/atf-report.cpp \ atf-report/reader.cpp \ atf-report/reader.hpp atf_report_atf_report_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-report/atf-report.1 cssdir = $(atf_cssdir) css_DATA = atf-report/tests-results.css EXTRA_DIST += $(css_DATA) dtddir = $(atf_dtddir) dtd_DATA = atf-report/tests-results.dtd EXTRA_DIST += $(dtd_DATA) xsldir = $(atf_xsldir) xsl_DATA = atf-report/tests-results.xsl EXTRA_DIST += $(xsl_DATA) tests_atf_report_DATA = atf-report/Atffile \ atf-report/Kyuafile tests_atf_reportdir = $(pkgtestsdir)/atf-report EXTRA_DIST += $(tests_atf_report_DATA) tests_atf_report_PROGRAMS = atf-report/fail_helper atf_report_fail_helper_SOURCES = atf-report/fail_helper.cpp atf_report_fail_helper_LDADD = $(ATF_CXX_LIBS) tests_atf_report_PROGRAMS += atf-report/misc_helpers atf_report_misc_helpers_SOURCES = atf-report/misc_helpers.cpp atf_report_misc_helpers_LDADD = $(ATF_CXX_LIBS) tests_atf_report_PROGRAMS += atf-report/pass_helper atf_report_pass_helper_SOURCES = atf-report/pass_helper.cpp atf_report_pass_helper_LDADD = $(ATF_CXX_LIBS) tests_atf_report_SCRIPTS = atf-report/integration_test CLEANFILES += atf-report/integration_test EXTRA_DIST += atf-report/integration_test.sh atf-report/integration_test: $(srcdir)/atf-report/integration_test.sh test -d atf-report || mkdir -p atf-report @src="$(srcdir)/atf-report/integration_test.sh"; \ dst="atf-report/integration_test"; $(BUILD_SH_TP) tests_atf_report_PROGRAMS += atf-report/reader_test atf_report_reader_test_SOURCES = atf-report/reader_test.cpp \ atf-report/reader.cpp atf_report_reader_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail atf_report_reader_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-report/Kyuafile0000644000470500017500000000017112271526120021130 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="integration_test"} atf_test_program{name="reader_test"} bind9-9.9.5.dfsg/unit/atf-src/atf-report/fail_helper.cpp0000644000470500017500000000324312271526120022415 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "atf-c++/macros.hpp" ATF_TEST_CASE(main); ATF_TEST_CASE_HEAD(main) { set_md_var("descr", "Helper test case that always fails"); } ATF_TEST_CASE_BODY(main) { fail("This always fails"); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, main); } bind9-9.9.5.dfsg/unit/atf-src/atf-report/pass_helper.cpp0000644000470500017500000000320512271526120022446 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "atf-c++/macros.hpp" ATF_TEST_CASE(main); ATF_TEST_CASE_HEAD(main) { set_md_var("descr", "Helper test case that always passes"); } ATF_TEST_CASE_BODY(main) { } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, main); } bind9-9.9.5.dfsg/unit/atf-src/atf-report/reader.cpp0000644000470500017500000003243212271526120021407 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include #include #include #include "atf-c/defs.h" #include "atf-c++/detail/parser.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" #include "reader.hpp" namespace impl = atf::atf_report; #define IMPL_NAME "atf::atf_report" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ template< typename Type > Type string_to_int(const std::string& str) { std::istringstream ss(str); Type s; ss >> s; return s; } // ------------------------------------------------------------------------ // The "atf_tps" auxiliary parser. // ------------------------------------------------------------------------ namespace atf_tps { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type text_type = 2; static const atf::parser::token_type colon_type = 3; static const atf::parser::token_type comma_type = 4; static const atf::parser::token_type tps_count_type = 5; static const atf::parser::token_type tp_start_type = 6; static const atf::parser::token_type tp_end_type = 7; static const atf::parser::token_type tc_start_type = 8; static const atf::parser::token_type tc_so_type = 9; static const atf::parser::token_type tc_se_type = 10; static const atf::parser::token_type tc_end_type = 11; static const atf::parser::token_type passed_type = 12; static const atf::parser::token_type failed_type = 13; static const atf::parser::token_type skipped_type = 14; static const atf::parser::token_type info_type = 16; static const atf::parser::token_type expected_death_type = 17; static const atf::parser::token_type expected_exit_type = 18; static const atf::parser::token_type expected_failure_type = 19; static const atf::parser::token_type expected_signal_type = 20; static const atf::parser::token_type expected_timeout_type = 21; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, size_t curline) : atf::parser::tokenizer< std::istream > (is, true, eof_type, nl_type, text_type, curline) { add_delim(':', colon_type); add_delim(',', comma_type); add_keyword("tps-count", tps_count_type); add_keyword("tp-start", tp_start_type); add_keyword("tp-end", tp_end_type); add_keyword("tc-start", tc_start_type); add_keyword("tc-so", tc_so_type); add_keyword("tc-se", tc_se_type); add_keyword("tc-end", tc_end_type); add_keyword("passed", passed_type); add_keyword("failed", failed_type); add_keyword("skipped", skipped_type); add_keyword("info", info_type); add_keyword("expected_death", expected_death_type); add_keyword("expected_exit", expected_exit_type); add_keyword("expected_failure", expected_failure_type); add_keyword("expected_signal", expected_signal_type); add_keyword("expected_timeout", expected_timeout_type); } }; } // namespace atf_tps struct timeval read_timeval(atf::parser::parser< atf_tps::tokenizer >& parser) { using namespace atf_tps; atf::parser::token t = parser.expect(text_type, "timestamp"); const std::string::size_type divider = t.text().find('.'); if (divider == std::string::npos || divider == 0 || divider == t.text().length() - 1) throw atf::parser::parse_error(t.lineno(), "Malformed timestamp value " + t.text()); struct timeval tv; tv.tv_sec = string_to_int< long >(t.text().substr(0, divider)); tv.tv_usec = string_to_int< long >(t.text().substr(divider + 1)); return tv; } // ------------------------------------------------------------------------ // The "atf_tps_reader" class. // ------------------------------------------------------------------------ impl::atf_tps_reader::atf_tps_reader(std::istream& is) : m_is(is) { } impl::atf_tps_reader::~atf_tps_reader(void) { } void impl::atf_tps_reader::got_info( const std::string& what ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& val ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_ntps(size_t ntps ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tp_start( const std::string& tp ATF_DEFS_ATTRIBUTE_UNUSED, size_t ntcs ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tp_end( struct timeval* tv ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& reason ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tc_start( const std::string& tcname ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tc_stdout_line( const std::string& line ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tc_stderr_line( const std::string& line ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_tc_end( const std::string& state ATF_DEFS_ATTRIBUTE_UNUSED, struct timeval* tv ATF_DEFS_ATTRIBUTE_UNUSED, const std::string& reason ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::atf_tps_reader::got_eof(void) { } void impl::atf_tps_reader::read_info(void* pptr) { using atf::parser::parse_error; using namespace atf_tps; atf::parser::parser< tokenizer >& p = *reinterpret_cast< atf::parser::parser< tokenizer >* > (pptr); (void)p.expect(colon_type, "`:'"); atf::parser::token t = p.expect(text_type, "info property name"); (void)p.expect(comma_type, "`,'"); got_info(t.text(), atf::text::trim(p.rest_of_line())); (void)p.expect(nl_type, "new line"); } void impl::atf_tps_reader::read_tp(void* pptr) { using atf::parser::parse_error; using namespace atf_tps; atf::parser::parser< tokenizer >& p = *reinterpret_cast< atf::parser::parser< tokenizer >* > (pptr); atf::parser::token t = p.expect(tp_start_type, "start of test program"); t = p.expect(colon_type, "`:'"); struct timeval s1 = read_timeval(p); t = p.expect(comma_type, "`,'"); t = p.expect(text_type, "test program name"); std::string tpname = t.text(); t = p.expect(comma_type, "`,'"); t = p.expect(text_type, "number of test programs"); size_t ntcs = string_to_int< std::size_t >(t.text()); t = p.expect(nl_type, "new line"); ATF_PARSER_CALLBACK(p, got_tp_start(tpname, ntcs)); size_t i = 0; while (p.good() && i < ntcs) { try { read_tc(&p); i++; } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } t = p.expect(tp_end_type, "end of test program"); t = p.expect(colon_type, "`:'"); struct timeval s2 = read_timeval(p); struct timeval s3; timersub(&s2, &s1, &s3); t = p.expect(comma_type, "`,'"); t = p.expect(text_type, "test program name"); if (t.text() != tpname) throw parse_error(t.lineno(), "Test program name used in " "terminator does not match " "opening"); t = p.expect(nl_type, comma_type, "new line or comma_type"); std::string reason; if (t.type() == comma_type) { reason = text::trim(p.rest_of_line()); if (reason.empty()) throw parse_error(t.lineno(), "Empty reason for failed test program"); t = p.next(); } ATF_PARSER_CALLBACK(p, got_tp_end(&s3, reason)); } void impl::atf_tps_reader::read_tc(void* pptr) { using atf::parser::parse_error; using namespace atf_tps; atf::parser::parser< tokenizer >& p = *reinterpret_cast< atf::parser::parser< tokenizer >* > (pptr); atf::parser::token t = p.expect(tc_start_type, "start of test case"); t = p.expect(colon_type, "`:'"); struct timeval s1 = read_timeval(p); t = p.expect(comma_type, "`,'"); t = p.expect(text_type, "test case name"); std::string tcname = t.text(); ATF_PARSER_CALLBACK(p, got_tc_start(tcname)); t = p.expect(nl_type, "new line"); t = p.expect(tc_end_type, tc_so_type, tc_se_type, "end of test case or test case's stdout/stderr line"); while (t.type() != tc_end_type && (t.type() == tc_so_type || t.type() == tc_se_type)) { atf::parser::token t2 = t; t = p.expect(colon_type, "`:'"); std::string line = p.rest_of_line(); if (t2.type() == tc_so_type) { ATF_PARSER_CALLBACK(p, got_tc_stdout_line(line)); } else { INV(t2.type() == tc_se_type); ATF_PARSER_CALLBACK(p, got_tc_stderr_line(line)); } t = p.expect(nl_type, "new line"); t = p.expect(tc_end_type, tc_so_type, tc_se_type, "end of test case or test case's stdout/stderr line"); } t = p.expect(colon_type, "`:'"); struct timeval s2 = read_timeval(p); struct timeval s3; timersub(&s2, &s1, &s3); t = p.expect(comma_type, "`,'"); t = p.expect(text_type, "test case name"); if (t.text() != tcname) throw parse_error(t.lineno(), "Test case name used in terminator does not " "match opening"); t = p.expect(comma_type, "`,'"); t = p.expect(expected_death_type, expected_exit_type, expected_failure_type, expected_signal_type, expected_timeout_type, passed_type, failed_type, skipped_type, "expected_{death,exit,failure,signal,timeout}, failed, " "passed or skipped"); if (t.type() == passed_type) { ATF_PARSER_CALLBACK(p, got_tc_end("passed", &s3, "")); } else { std::string state; if (t.type() == expected_death_type) state = "expected_death"; else if (t.type() == expected_exit_type) state = "expected_exit"; else if (t.type() == expected_failure_type) state = "expected_failure"; else if (t.type() == expected_signal_type) state = "expected_signal"; else if (t.type() == expected_timeout_type) state = "expected_timeout"; else if (t.type() == failed_type) state = "failed"; else if (t.type() == skipped_type) state = "skipped"; else UNREACHABLE; t = p.expect(comma_type, "`,'"); std::string reason = text::trim(p.rest_of_line()); if (reason.empty()) throw parse_error(t.lineno(), "Empty reason for " + state + " test case result"); ATF_PARSER_CALLBACK(p, got_tc_end(state, &s3, reason)); } t = p.expect(nl_type, "new line"); } void impl::atf_tps_reader::read(void) { using atf::parser::parse_error; using namespace atf_tps; std::pair< size_t, atf::parser::headers_map > hml = atf::parser::read_headers(m_is, 1); atf::parser::validate_content_type(hml.second, "application/X-atf-tps", 3); tokenizer tkz(m_is, hml.first); atf::parser::parser< tokenizer > p(tkz); try { atf::parser::token t; while ((t = p.expect(tps_count_type, info_type, "tps-count or info " "field")).type() == info_type) read_info(&p); t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "number of test programs"); size_t ntps = string_to_int< std::size_t >(t.text()); ATF_PARSER_CALLBACK(p, got_ntps(ntps)); t = p.expect(nl_type, "new line"); size_t i = 0; while (p.good() && i < ntps) { try { read_tp(&p); i++; } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } while ((t = p.expect(eof_type, info_type, "end of stream or info " "field")).type() == info_type) read_info(&p); ATF_PARSER_CALLBACK(p, got_eof()); } catch (const parse_error& pe) { p.add_error(pe); p.reset(nl_type); } } bind9-9.9.5.dfsg/unit/atf-src/atf-report/tests-results.xsl0000644000470500017500000004624512271526120023041 0ustar lamontlamont ]> tests-results.css ATF Tests Results <xsl:value-of select="$global.title" />

Execution summary

Item

Value

ATF

Version

Timings

Start time of tests

End time of tests

System information

Host name

Operating system

Operating system release

Operating system version

Platform

Tests results

Root

Test programs

Bogus test programs

Bogus test programs

Test cases

Passed test cases

Failed test cases

Failed test cases

Expected failures

Expected failures

Skipped test cases

Skipped test cases

See more execution details

Execution details

Environment variables

  • Test cases summary

    all

    Test case

    Result

    Reason

    Duration

    Expected failures summary

    xfail

    Test case

    Result

    Reason

    Duration

    Failed test cases summary

    failed

    Test case

    Result

    Reason

    Duration

    Bogus test programs summary

    bogus
    Test program

    Skipped test cases summary

    skipped

    Test case

    Result

    Reason

    Duration

    yes yes yes yes yes yes yes yes yes yes no

    s

    yes yes yes yes yes yes yes yes yes no

    s

    Passed

    N/A

    Expected death

    Expected exit

    Expected failure

    Expected timeout

    Expected signal

    Failed

    Skipped

    FAILED:

    XFAIL:

    SKIPPED:

    Test case: /

    Duration:

    Termination reason

    Standard output stream

    Standard error stream

    seconds
    bind9-9.9.5.dfsg/unit/atf-src/atf-report/misc_helpers.cpp0000644000470500017500000000517112271526120022622 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "atf-c++/macros.hpp" // ------------------------------------------------------------------------ // Helper tests for "t_integration". // ------------------------------------------------------------------------ ATF_TEST_CASE(diff); ATF_TEST_CASE_HEAD(diff) { set_md_var("descr", "Helper test case for the t_integration program"); } ATF_TEST_CASE_BODY(diff) { std::cout << "--- a 2007-11-04 14:00:41.000000000 +0100\n"; std::cout << "+++ b 2007-11-04 14:00:48.000000000 +0100\n"; std::cout << "@@ -1,7 +1,7 @@\n"; std::cout << " This test is meant to simulate a diff.\n"; std::cout << " Blank space at beginning of context lines must be " "preserved.\n"; std::cout << " \n"; std::cout << "-First original line.\n"; std::cout << "-Second original line.\n"; std::cout << "+First modified line.\n"; std::cout << "+Second modified line.\n"; std::cout << " \n"; std::cout << " EOF\n"; } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add helper tests for t_integration. ATF_ADD_TEST_CASE(tcs, diff); } bind9-9.9.5.dfsg/unit/atf-src/NEWS0000644000470500017500000006064412271526120016063 0ustar lamontlamontMajor changes between releases Automated Testing Framework =========================================================================== Changes in version 0.17 *********************** Experimental version released on February 14th, 2013. * Added the atf_utils_cat_file, atf_utils_compare_file, atf_utils_copy_file, atf_utils_create_file, atf_utils_file_exists, atf_utils_fork, atf_utils_grep_file, atf_utils_grep_string, atf_utils_readline, atf_utils_redirect and atf_utils_wait utility functions to atf-c-api. Documented the already-public atf_utils_free_charpp function. * Added the cat_file, compare_file, copy_file, create_file, file_exists, fork, grep_collection, grep_file, grep_string, redirect and wait functions to the atf::utils namespace of atf-c++-api. These are wrappers around the same functions added to the atf-c-api library. * Added the ATF_CHECK_MATCH, ATF_CHECK_MATCH_MSG, ATF_REQUIRE_MATCH and ATF_REQUIRE_MATCH_MSG macros to atf-c to simplify the validation of a string against a regular expression. * Miscellaneous fixes for manpage typos and compilation problems with clang. * Added caching of the results of those configure tests that rely on executing a test program. This should help crossbuild systems by providing a mechanism to pre-specify what the results should be. * PR bin/45690: Make atf-report convert any non-printable characters to a plain-text representation (matching their corresponding hexadecimal entities) in XML output files. This is to prevent the output of test cases from breaking xsltproc later. Changes in version 0.16 *********************** Experimental version released on July 10th, 2012. * Added a --enable-tools flag to configure to request the build of the deprecated ATF tools, whose build is now disabled by default. In order to continue running tests, you should migrate to Kyua instead of enabling the build of the deprecated tools. The kyua-atf-compat package provides transitional compatibility versions of atf-run and atf-report built on top of Kyua. * Tweaked the ATF_TEST_CASE macro of atf-c++ so that the compiler can detect defined but unused test cases. * PR bin/45859: Fixed some XSLT bugs that resulted in the tc-time and tp-time XML tags leaking into the generated HTML file. Also improved the CSS file slightly to correct alignment and color issues with the timestamps column. * Optimized atf-c++/macros.hpp so that GNU G++ consumes less memory during compilation with GNU G++. * Flipped the default to building shared libraries for atf-c and atf-c++, and started versioning them. As a side-effect, this removes the --enable-unstable-shared flag from configure that appears to not work any more (under NetBSD). Additionally, some distributions require the use of shared libraries for proper dependency tracking (e.g. Fedora), so it is better if we do the right versioning upstream. * Project hosting moved from an adhoc solution (custom web site and Monotone repository) to Google Code (standard wiki and Git). ATF now lives in a subcomponent of the Kyua project. Changes in version 0.15 *********************** Experimental version released on January 16th, 2012. * Respect stdin in atf-check. The previous release silenced stdin for any processes spawned by atf, not only test programs, which caused breakage in tests that pipe data through atf-check. * Performance improvements to atf-sh. * Enabled detection of unused parameters and variables in the code and fixed all warnings. * Changed the behavior of "developer mode". Compiler warnings are now enabled unconditionally regardless of whether we are in developer mode or not; developer mode is now only used to perform strict warning checks and to enable assertions. Additionally, developer mode is now only automatically enabled when building from the repository, not for formal releases. * Added new Autoconf M4 macros (ATF_ARG_WITH, ATF_CHECK_C and ATF_CHECK_CXX) to provide a consistent way of defining a --with-arg flag in configure scripts and detecting the presence of any of the ATF bindings. Note that ATF_CHECK_SH was already introduced in 0.14, but it has now been modified to also honor --with-atf if instantiated. * Added timing support to atf-run / atf-report. * Added support for a 'require.memory' property, to specify the minimum amount of physical memory needed by the test case to yield valid results. * PR bin/45690: Force an ISO-8859-1 encoding in the XML files generated by atf-report so that invalid data in the output of test cases does not mangle our report. Changes in version 0.14 *********************** Experimental version released on June 14th, 2011. * Added a pkg-config file for atf-sh and an aclocal file to ease the detection of atf-sh from autoconf scripts. * Made the default test case body defined by atf_sh fail. This is to ensure that test cases are properly defined in test programs and helps in catching typos in the names of the body functions. * PR bin/44882: Made atf-run connect the stdin of test cases to /dev/zero. This provides more consistent results with "normal" execution (in particular, when tests are executed detached from a terminal). * Made atf-run hardcode TZ=UTC for test cases. It used to undefine TZ, but that does not take into account that libc determines the current timezone from a configuration file. * All test programs will now print a warning when they are not run through atf-run(1) stating that this is unsupported and may deliver incorrect results. * Added support for the 'require.files' test-case property. This allows test cases to specify installed files that must be present for the test case to run. Changes in version 0.13 *********************** Experimental version released on March 31st, 2011. This is the first release after the creation of the Kyua project, a more modular and reliable replacement for ATF. From now on, ATF will change to accomodate the transition to this new codebase, but ATF will still continue to see development in the short/medium term. Check out the project page at http://code.google.com/p/kyua/ for more details. The changes in this release are: * Added support to run the tests with the Kyua runtime engine (kyua-cli), a new package that aims to replace atf-run and atf-report. The ATF tests can be run with the new system by issuing a 'make installcheck-kyua' from the top-level directory of the project (assuming the 'kyua' binary is available during the configuration stage of ATF). * atf-run and atf-report are now in maintenance mode (but *not* deprecated yet!). Kyua already implements a new, much more reliable runtime engine that provides similar features to these tools. That said, it is not complete yet so all development efforts should go towards it. * If GDB is installed, atf-run dumps the stack trace of crashing test programs in an attempt to aid debugging. Contributed by Antti Kantee. * Reverted default timeout change in previous release and reset its value to 5 minutes. This was causing several issues, specially when running the existing NetBSD test suite in qemu. * Fixed the 'match' output checker in atf-check to properly validate the last line of a file even if it does not have a newline. * Added the ATF_REQUIRE_IN and ATF_REQUIRE_NOT_IN macros to atf-c++ to check for the presence (or lack thereof) of an element in a collection. * PR bin/44176: Fixed a race condition in atf-run that would crash atf-run when the cleanup of a test case triggered asynchronous modifications to its work directory (e.g. killing a daemon process that cleans up a pid file in the work directory). * PR bin/44301: Fixed the sample XSLT file to report bogus test programs instead of just listing them as having 0 test cases. Changes in version 0.12 *********************** Experimental version released on November 7th, 2010. * Added the ATF_REQUIRE_THROW_RE to atf-c++, which is the same as ATF_REQUIRE_THROW but allows checking for the validity of the exception's error message by means of a regular expression. * Added the ATF_REQUIRE_MATCH to atf-c++, which allows checking for a regular expression match in a string. * Changed the default timeout for test cases from 5 minutes to 30 seconds. 30 seconds is long enough for virtually all tests to complete, and 5 minutes is a way too long pause in a test suite where a single test case stalls. * Deprecated the use.fs property. While this seemed like a good idea in the first place to impose more control on what test cases can do, it turns out to be bad. First, use.fs=false prevents bogus test cases from dumping core so after-the-fact debugging is harder. Second, supporting use.fs adds a lot of unnecessary complexity. atf-run will now ignore any value provided to use.fs and will allow test cases to freely access the file system if they wish to. * Added the atf_tc_get_config_var_as_{bool,long}{,_wd} functions to the atf-c library. The 'text' module became private in 0.11 but was being used externally to simplify the parsing of configuration variables. * Made atf-run recognize the 'unprivileged-user' configuration variable and automatically drop root privileges when a test case sets require.user=unprivileged. Note that this is, by no means, done for security purposes; this is just for user convenience; tests should, in general, not be blindly run as root in the first place. Changes in version 0.11 *********************** Experimental version released on October 20th, 2010. * The ATF_CHECK* macros in atf-c++ were renamed to ATF_REQUIRE* to match their counterparts in atf-c. * Clearly separated the modules in atf-c that are supposed to be public from those that are implementation details. The header files for the internal modules are not installed any more. * Made the atf-check tool private. It is only required by atf-sh and being public has the danger of causing confusion. Also, making it private simplifies the public API of atf. * Changed atf-sh to enable per-command error checking (set -e) by default. This catches many cases in which a test case is broken but it is not reported as such because execution continues. * Fixed the XSTL and CSS stylesheets to support expected failures. Changes in version 0.10 *********************** Experimental version released on July 2nd, 2010. Miscellaneous features * Added expected failures support to test cases and atf-run. These include, for example, expected clean exits, expected reception of fatal signals, expected timeouts and expected errors in condition checks. These statuses can be used to denote test cases that are known to fail due to a bug in the code they are testing. atf-report reports these tests separately but they do not count towards the failed test cases amount. * Added the ATF_CHECK_ERRNO and ATF_REQUIRE_ERRNO to the C library to allow easy checking of call failures that update errno. * Added the has.cleanup meta-data property to test caes that specifies whether the test case has a cleanup routine or not; its value is automatically set. This property is read by atf-run to know if it has to run the cleanup routine; skipping this run for every test case significantly speeds up the run time of test suites. * Reversed the order of the ATF_CHECK_THROW macro in the C++ binding to take the expected exception as the first argument and the statement to execute as the second argument. Changes in atf-check * Changed atf-check to support negating the status and output checks by prefixing them with not- and added support to specify multiple checkers for stdout and stderr, not only one. * Added the match output checker to atf-check to look for regular expressions in the stdout and stderr of commands. * Modified the exit checks in atf-check to support checking for the reception of signals. Code simplifications and cleanups * Removed usage messages from test programs to simplify the implementation of every binding by a significant amount. They just now refer the user to the appropriate manual page and do not attempt to wrap lines on terminal boundaries. Test programs are not supposed to be run by users directly so this minor interface regression is not important. * Removed the atf-format internal utility, which is unused after the change documented above. * Removed the atf-cleanup internal utility. It has been unused since the test case isolation was moved to atf-run in 0.8 * Splitted the Makefile.am into smaller files for easier maintenance and dropped the use of M4. Only affects users building from the repository sources. * Intermixed tests with the source files in the source tree to provide them more visibility and easier access. The tests directory is gone from the source tree and tests are now suffixed by _test, not prefixed by t_. * Simplifications to the atf-c library: removed the io, tcr and ui modules as they had become unnecessary after all simplifications introduced since the 0.8 release. * Removed the application/X-atf-tcr format introduced in 0.8 release. Tests now print a much simplified format that is easy to parse and nicer to read by end users. As a side effect, the default for test cases is now to print their results to stdout unless otherwise stated by providing the -r flag. * Removed XML distribution documents and replaced them with plain-text documents. They provided little value and introduced a lot of complexity to the build system. * Simplified the output of atf-version by not attempting to print a revision number when building form a distfile. Makes the build system easier to maintain. Changes in version 0.9 ********************** Experimental version released on June 3rd, 2010. * Added atf-sh, an interpreter to process test programs written using the shell API. This is not really a shell interpreter by itself though: it is just a wrapper around the system shell that eases the loading of the necessary ATF libraries. * Removed atf-compile in favour of atf-sh. * Added the use.fs metadata property to test case, which is used to specify which test cases require file system access. This is to highlight dependencies on external resources more clearly and to speed up the execution of test suites by skipping the creation of many unnecessary work directories. * Fixed test programs to get a sane default value for their source directory. This means that it should not be necessary any more to pass -s when running test programs that do not live in the current directory. * Defining test case headers became optional. This is trivial to achieve in shell-based tests but a bit ugly in C and C++. In C, use the new ATF_TC_WITHOUT_HEAD macro to define the test case, and in C++ use ATF_TEST_CASE_WITHOUT_HEAD. Changes in version 0.8 ********************** Experimental version released on May 7th, 2010. * Test programs no longer run several test cases in a row. The execution of a test program now requires a test case name, and that single test case is executed. To execute several test cases, use the atf-run utility as usual. * Test programs no longer fork a subprocess to isolate the execution of test cases. They run the test case code in-process, and a crash of the test case will result in a crash of the test program. This is to ease debugging of faulty test cases. * Test programs no longer isolate their test cases. This means that they will not create temporary directories nor sanitize the environment any more. Yes: running a test case that depends on system state by hand will most likely yield different results depending on where (machine, directory, user environment, etc.) it is run. Isolation has been moved to atf-run. * Test programs no longer print a cryptic format (application/X-atf-tcs) on a special file channel. They can now print whatever they want on the screen. Because test programs can now only run one test case every time, providing controlled output is not necessary any more. * Test programs no longer write their status into a special file descriptor. Instead, they create a file with the results, which is later parsed by atf-run. This changes the semantics of the -r flag. * atf-run has been adjusted to perform the test case isolation. As a result, there is now a single canonical place that implements the isolation of test caes. In previous releases, the three language bindings (C, C++ and shell) had to be kept in sync with each other (read: not a nice thing to do at all). As a side effect of this change, writing bindings for other languages will be much, much easier from now on. * atf-run forks test programs on a test case basis, instead of on a test program basis as it did before. This is to provide the test case isolation that was before implemented by the test programs themselves. * Removed the atf-exec tool. This was used to implement test case isolation in atf-sh, but it is now unnecessary. * It is now optional to define the descr meta-data property. It has been proven to be mostly useless, because test cases often carry a descriptive name of their own. Changes in version 0.7 ********************** Experimental version released on December 22nd, 2009. * Added build-time checks to atf-c and atf-c++. A binding for atf-sh will come later. * Migrated all build-time checks for header files to proper ATF tests. This demonstrates the use of the new feature described above. * Added an internal API for child process management. * Converted all plain-text distribution documents to a Docbook canonical version, and include pre-generated plain text and HTML copies in the distribution file. * Simplified the contents of the Makefile.am by regenerating it from a canonical Makefile.am.m4 source. As a side-effect, some dependency specifications were fixed. * Migrated all checks from the check target to installcheck, as these require ATF to be installed. * Fixed sign comparison mismatches triggered by the now-enabled -Wsign-compare. * Fixed many memory and object leaks. Changes in version 0.6 ********************** Experimental version released on January 18th, 2009. * Make atf-exec be able to kill its child process after a certain period of time; this is controlled through the new -t option. * Change atf-sh to use atf-exec's -t option to control the test case's timeouts, instead of doing it internally. Same behavior as before, but noticeably faster. * atf-exec's -g option and atf-killpg are gone due to the previous change. * Added the atf-check(1) tool, a program that executes a given command and checks its exit code against a known value and allows the management of stdout and stderr in multiple ways. This replaces the previous atf_check function in the atf-sh library and exposes this functionality to both atf-c and atf-c++. * Added the ATF_REQUIRE family of macros to the C interface. These help in checking for fatal test conditions. The old ATF_CHECK macros now perform non-fatal checks only. I.e. by using ATF_CHECK, the test case can now continue its execution and the failures will not be reported until the end of the whole run. * Extended the amount of ATF_CHECK_* C macros with new ones to provide more features to the developer. These also have their corresponding counterparts in the ATF_REQUIRE_* family. The new macros (listing the suffixes only) are: _EQ (replaces _EQUAL), _EQ_MSG, _STREQ and _STREQ_MSG. Changes in version 0.5 ********************** Experimental version released on May 1st, 2008. * Clauses 3 and 4 of the BSD license used by the project were dropped. All the code is now under a 2-clause BSD license compatible with the GNU General Public License (GPL). * Added a C-only binding so that binary test programs do not need to be tied to C++ at all. This binding is now known as the atf-c library. * Renamed the C++ binding to atf-c++ for consistency with the new atf-c. * Renamed the POSIX shell binding to atf-sh for consistency with the new atf-c and atf-c++. * Added a -w flag to test programs through which it is possible to specify the work directory to be used. This was possible in prior releases by defining the workdir configuration variable (-v workdir=...), but was a conceptually incorrect mechanism. * Test programs now preserve the execution order of test cases when they are given in the command line. Even those mentioned more than once are executed multiple times to comply with the user's requests. Changes in version 0.4 ********************** Experimental version released on February 4th, 2008. * Added two new manual pages, atf-c++-api and atf-sh-api, describing the C++ and POSIX shell interfaces used to write test programs. * Added a pkg-config file, useful to get the flags to build against the C++ library or to easily detect the presence of ATF. * Added a way for test cases to require a specific architecture and/or machine type through the new 'require.arch' and 'require.machine' meta-data properties, respectively. * Added the 'timeout' property to test cases, useful to set an upper-bound limit for the test's run time and thus prevent global test program stalls due to the test case's misbehavior. * Added the atf-exec(1) internal utility, used to execute a command after changing the process group it belongs to. * Added the atf-killpg(1) internal utility, used to kill process groups. * Multiple portability fixes. Of special interest, full support for SunOS (Solaris Express Developer Edition 2007/09) using the Sun Studio 12 C++ compiler. * Fixed a serious bug that prevented atf-run(1) from working at all under Fedora 8 x86_64. Due to the nature of the bug, other platforms were likely affected too. Changes in version 0.3 ********************** Experimental version released on November 11th, 2007. * Added XML output support to atf-report. This is accompanied by a DTD for the format's structure and sample XSLT/CSS files to post-process this output and convert it to a plain HTML report. * Changed atf-run to add system information to the report it generates. This is currently used by atf-report's XML output only, and is later printed in the HTML reports in a nice and useful summary table. The user and system administrator are allowed to tune this feature by means of hooks. * Removed the test cases' 'isolated' property. This was intended to avoid touching the file system at all when running the related test case, but this has not been true for a long while: some control files are unconditionally required for several purposes, and we cannot easily get rid of them. This way we remove several critical and delicate pieces of code. * Improved atf-report's CSV output format to include information about test programs too. * Fixed the tests that used atf-compile to not require this tool as a helper. Avoids systems without build-time utilities to skip many tests that could otherwise be run. (E.g. NetBSD without the comp.tgz set installed.) * Many general cleanups: Fixed many pieces of code marked as ugly and/or incomplete. Changes in version 0.2 ********************** Experimental version released on September 20th, 2007. * Test cases now get a known umask on entry. * atf-run now detects many unexpected failures caused by test programs and reports them as bogus tests. atf-report is able to handle these new errors and nicely reports them to the user. * All the data formats read and written by the tools have been documented and cleaned up. These include those grammars that define how the different components communicate with each other as well as the format of files written by the developers and users: the Atffiles and the configuration files. * Added the atf-version tool, a utility that displays information about the currently installed version of ATF. * Test cases can now define an optional cleanup routine to undo their actions regardless of their exit status. * atf-report now summarizes the list of failed (bogus) test programs when using the ticker output format. * Test programs now capture some termination signals and clean up any temporary files before exiting the program. * Multiple bug fixes and improvements all around. Changes in version 0.1 ********************** Experimental version released on August 20th, 2007. * First public version. This was released coinciding with the end of the Google Summer of Code 2007 program. =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/admin/0002755000470500017500000000000012276444014016452 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/admin/install-sh0000755000470500017500000001515012271526120020450 0ustar lamontlamont#!/bin/sh # # $NetBSD: install-sh.in,v 1.6 2012/01/11 13:07:31 hans Exp $ # This script now also installs multiple files, but might choke on installing # multiple files with spaces in the file names. # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. awkprog="${AWKPROG-awk}" mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" instcmd="$cpprog" instflags="" pathcompchmodcmd="$chmodprog 755" chmodcmd="$chmodprog 755" chowncmd="" chgrpcmd="" stripcmd="" stripflags="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" msrc="" dst="" dir_arg="" suffix="" suffixfmt="" while [ x"$1" != x ]; do case $1 in -b) suffix=".old" shift continue;; -B) suffixfmt="$2" shift shift continue;; -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -m*) chmodcmd="$chmodprog ${1#-m}" shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -S) stripcmd="$stripprog" stripflags="-S $2 $stripflags" shift shift continue;; -p) instflags="-p" shift continue;; *) if [ x"$msrc" = x ] then msrc="$dst" else msrc="$msrc $dst" fi src="$dst" dst="$1" shift continue;; esac done if [ x"$dir_arg" = x ] then dstisfile="" if [ ! -d "$dst" ] then if [ x"$msrc" = x"$src" ] then dstisfile=true else echo "install: destination is not a directory" exit 1 fi fi else msrc="$msrc $dst" fi if [ x"$msrc" = x ] then echo "install: no destination specified" exit 1 fi for srcarg in $msrc; do if [ x"$dir_arg" != x ]; then dstarg="$srcarg" else dstarg="$dst" # Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$srcarg" ] then doinst="$instcmd $instflags" elif [ -d "$srcarg" ] then echo "install: $srcarg: not a regular file" exit 1 elif [ "$srcarg" = "/dev/null" ] then doinst="$cpprog" else echo "install: $srcarg does not exist" exit 1 fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d "$dstarg" ] then dstarg="$dstarg"/`basename "$srcarg"` fi fi ## this sed command emulates the dirname command dstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $doit $mkdirprog "${pathcomp}" if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi && if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then if [ -d "$dstarg" ]; then true else $doit $mkdirprog "$dstarg" && if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi fi else if [ x"$dstisfile" = x ] then file=$srcarg else file=$dst fi dstfile=`basename "$file"` dstfinal="$dstdir/$dstfile" # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Make a backup file name in the proper directory. case x$suffixfmt in *%*) suffix=`echo x | $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" ' { cnt = 0; do { sfx = sprintf(fmt, cnt++); name = bname sfx; } while (system("test -f " name) == 0); print sfx; }' -`;; x) ;; *) suffix="$suffixfmt";; esac dstbackup="$dstfinal$suffix" # Move or copy the file name to the temp name $doit $doinst $srcarg "$dsttmp" && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi && # Now rename the file to the real destination. if [ x"$suffix" != x ] && [ -f "$dstfinal" ] then $doit $mvcmd "$dstfinal" "$dstbackup" else $doit $rmcmd -f "$dstfinal" fi && $doit $mvcmd "$dsttmp" "$dstfinal" fi done && exit 0 bind9-9.9.5.dfsg/unit/atf-src/admin/missing0000755000470500017500000002370312271526120020046 0ustar lamontlamont#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.18; # UTC # Copyright (C) 1996-2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, 'missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file 'aclocal.m4' autoconf touch file 'configure' autoheader touch file 'config.h.in' autom4te touch the output file, or create a stub one automake touch all 'Makefile.in' files bison create 'y.tab.[ch]', if possible, from existing .[ch] flex create 'lex.yy.c', if possible, from existing .c help2man touch the output file lex create 'lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create 'y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running '$TOOL --version' or '$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acconfig.h' or '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: '$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get '$1' as part of Autoconf from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: '$1' $msg. You should only need it if you modified a '.y' file. You may need the Bison package in order for those modifications to take effect. You can get Bison from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.l' file. You may need the Flex package in order for those modifications to take effect. You can get Flex from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the Help2man package in order for those modifications to take effect. You can get Help2man from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.texi' or '.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy 'make' (AIX, DU, IRIX). You might want to install the Texinfo package or the GNU make package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: '$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the 'README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing '$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bind9-9.9.5.dfsg/unit/atf-src/admin/check-style-shell.awk0000644000470500017500000000501212271526120022464 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # function warn(msg) { print FILENAME "[" FNR "]: " msg > "/dev/stderr" error = 1 } BEGIN { skip = 0 error = 0 emacs_modeline = 0 vim_modeline = 0 } /NO_CHECK_STYLE_BEGIN/ { skip = 1 next } /NO_CHECK_STYLE_END/ { skip = 0 next } /NO_CHECK_STYLE/ { next } { if (skip) next } /vim: syntax=sh/ { vim_modeline = 1 } /^[ \t]*#/ { next } /[$ \t]+_[a-zA-Z0-9]+=/ { warn("Variable should not start with an underline") } /[^\\]\$[^0-9!'"$?@#*{}(|\/,]+/ { warn("Missing braces around variable name") } /=(""|'')/ { warn("Assignment to the empty string does not need quotes"); } /basename[ \t]+/ { warn("Use parameter expansion instead of basename"); } /if[ \t]+(test|![ \t]+test)/ { warn("Use [ instead of test"); } /[ \t]+(test|\[).*==/ { warn("test(1)'s == operator is not portable"); } /if.*;[ \t]*fi$/ { warn("Avoid using a single-line if conditional"); } END { if (skip) warn("Missing NO_CHECK_STYLE_END"); if (! vim_modeline) warn("Missing mode lines"); if (error) exit 1 } # vim: syntax=awk:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/check-style-cpp.awk0000644000470500017500000000432012271526120022140 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # function warn(msg) { print FILENAME "[" FNR "]: " msg > "/dev/stderr" error = 1 } BEGIN { skip = 0 error = 0 } /NO_CHECK_STYLE_BEGIN/ { skip = 1 next } /NO_CHECK_STYLE_END/ { skip = 0 next } /NO_CHECK_STYLE/ { next } { if (skip) next } /#ifdef/ { warn("Undesired usage of #ifdef; use #if defined()") } /#ifndef/ { warn("Undesired usage of #ifndef; use #if !defined()") } /assert[ \t]*\(/ { warn("Use the macros in sanity.hpp instead of assert"); } /include.*assert/ { warn("Do not include assert.h nor cassert"); } /std::endl/ { warn("Use \\n instead of std::endl"); } /\/\*/ { warn("Do not use C-style comments"); } END { if (skip) warn("Missing NO_CHECK_STYLE_END"); if (error) exit 1 } # vim: syntax=awk:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/ltmain.sh0000755000470500017500000073326512271526120020305 0ustar lamontlamont# Generated from ltmain.m4sh. # ltmain.sh (GNU libtool) 2.2.6b # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print informational messages (default) # --version print version information # -h, --help print short or long help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.2.6b # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . PROGRAM=ltmain.sh PACKAGE=libtool VERSION=2.2.6b TIMESTAMP="" package_revision=1.3017 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # 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 BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # NLS nuisances: We save the old values to restore during execute mode. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done $lt_unset CDPATH unset CP unset MV unset RM : ${CP="cp -f"} : ${ECHO="echo"} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # Generated shell functions inserted here. # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: # In the unlikely event $progname began with a '-', it would play havoc with # func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result case $progname in -*) progname=./$progname ;; esac # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname${mode+: }$mode: $*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` done my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "X$my_tmpdir" | $Xsed } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "X$1" | $Xsed \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_version # Echo version message to standard output and exit. func_version () { $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $SED -n '/^# Usage:/,/# -h/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" $ECHO $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help # Echo long help message to standard output and exit. func_help () { $SED -n '/^# Usage:/,/# Report bugs to/ { s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p }' < "$progpath" exit $? } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { func_error "missing argument for $1" exit_cmd=exit } exit_cmd=: # Check that we have a working $ECHO. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then # Yippee, $ECHO works! : else # Restart under the correct shell, and then maybe $ECHO will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # Parse options once, thoroughly. This comes as soon as possible in # the script to make things like `libtool --version' happen quickly. { # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Parse non-mode specific arguments: while test "$#" -gt 0; do opt="$1" shift case $opt in --config) func_config ;; --debug) preserve_args="$preserve_args $opt" func_echo "enabling shell trace mode" opt_debug='set -x' $opt_debug ;; -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break execute_dlfiles="$execute_dlfiles $1" shift ;; --dry-run | -n) opt_dry_run=: ;; --features) func_features ;; --finish) mode="finish" ;; --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break case $1 in # Valid mode arguments: clean) ;; compile) ;; execute) ;; finish) ;; install) ;; link) ;; relink) ;; uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac mode="$1" shift ;; --preserve-dup-deps) opt_duplicate_deps=: ;; --quiet|--silent) preserve_args="$preserve_args $opt" opt_silent=: ;; --verbose| -v) preserve_args="$preserve_args $opt" opt_silent=false ;; --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break preserve_args="$preserve_args $opt $1" func_enable_tag "$1" # tagname is set here shift ;; # Separate optargs to long options: -dlopen=*|--mode=*|--tag=*) func_opt_split "$opt" set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} shift ;; -\?|-h) func_usage ;; --help) opt_help=: ;; --version) func_version ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) nonopt="$opt" break ;; esac done case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_duplicate_deps ;; esac # Having warned about all mis-specified options, bail out if # anything was wrong. $exit_cmd $EXIT_FAILURE } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } ## ----------- ## ## Main. ## ## ----------- ## $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi test -z "$mode" && func_fatal_error "error: you must specify a MODE." # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$mode' for more information." } # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_ltwrapper_scriptname_result="" if func_ltwrapper_executable_p "$1"; then func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" fi } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case "$@ " in " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T <?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi removelist="$removelist $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist removelist="$removelist $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir command="$command -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then command="$command -o $obj" fi # Suppress compiler output if we already did a PIC compilation. command="$command$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$mode'" ;; esac $ECHO $ECHO "Try \`$progname --help' for more information about other modes." exit $? } # Now that we've collected a possible --mode arg, show help if necessary $opt_help && func_mode_help # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $execute_dlfiles; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_quote_for_eval "$file" args="$args $func_quote_for_eval_result" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" $ECHO "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS $ECHO "X----------------------------------------------------------------------" | $Xsed $ECHO "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done $ECHO $ECHO "If you ever happen to want to link against installed libraries" $ECHO "in a given directory, LIBDIR, you must either use libtool, and" $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" $ECHO "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" $ECHO " during execution" fi if test -n "$runpath_var"; then $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" $ECHO " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $ECHO $ECHO "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" $ECHO "pages." ;; *) $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac $ECHO "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS } test "$mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $ECHO "X$nonopt" | $GREP shtool >/dev/null; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" install_prog="$install_prog$func_quote_for_eval_result" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" install_prog="$install_prog $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for progfile in $progfiles; do func_verbose "extracting global C symbols from \`$progfile'" $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" } done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" fi $ECHO >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; " case $host in *cygwin* | *mingw* | *cegcc* ) $ECHO >> "$output_objdir/$my_dlsyms" "\ /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */" lt_dlsym_const= ;; *osf5*) echo >> "$output_objdir/$my_dlsyms" "\ /* This system does not cope well with relocations in const data */" lt_dlsym_const= ;; *) lt_dlsym_const=const ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) symtab_cflags="$symtab_cflags $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper_part1 [arg=no] # # Emit the first part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part1 () { func_emit_wrapper_part1_arg1=no if test -n "$1" ; then func_emit_wrapper_part1_arg1=$1 fi $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # 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 BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then ECHO=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then # Yippee, \$ECHO works! : else # Restart under the correct shell, and then maybe \$ECHO will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $ECHO "\ # Find the directory that this script lives in. thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done " } # end: func_emit_wrapper_part1 # func_emit_wrapper_part2 [arg=no] # # Emit the second part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part2 () { func_emit_wrapper_part2_arg1=no if test -n "$1" ; then func_emit_wrapper_part2_arg1=$1 fi $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # end: func_emit_wrapper_part2 # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=no if test -n "$1" ; then func_emit_wrapper_arg1=$1 fi # split this up so that func_emit_cwrapperexe_src # can call each part independently. func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" } # func_to_host_path arg # # Convert paths to host format when used with build tools. # Intended for use with "native" mingw (where libtool itself # is running under the msys shell), or in the following cross- # build environments: # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # where wine is equipped with the `winepath' executable. # In the native mingw case, the (msys) shell automatically # converts paths for any non-msys applications it launches, # but that facility isn't available from inside the cwrapper. # Similar accommodations are necessary for $host mingw and # $build cygwin. Calling this function does no harm for other # $host/$build combinations not listed above. # # ARG is the path (on $build) that should be converted to # the proper representation for $host. The result is stored # in $func_to_host_path_result. func_to_host_path () { func_to_host_path_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' case $build in *mingw* ) # actually, msys # awkward: cmd appends spaces to result lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_path_tmp1=`( cmd //c echo "$1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_path_tmp1=`cygpath -w "$1"` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # Unfortunately, winepath does not exit with a non-zero # error code, so we are forced to check the contents of # stdout. On the other hand, if the command is not # found, the shell will set an exit code of 127 and print # *an error message* to stdout. So we must check for both # error code of zero AND non-empty stdout, which explains # the odd construction: func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` else # Allow warning below. func_to_host_path_result="" fi ;; esac if test -z "$func_to_host_path_result" ; then func_error "Could not determine host path corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_path_result="$1" fi ;; esac fi } # end: func_to_host_path # func_to_host_pathlist arg # # Convert pathlists to host format when used with build tools. # See func_to_host_path(), above. This function supports the # following $build/$host combinations (but does no harm for # combinations not listed here): # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # # Path separators are also converted from $build format to # $host format. If ARG begins or ends with a path separator # character, it is preserved (but converted to $host format) # on output. # # ARG is a pathlist (on $build) that should be converted to # the proper representation on $host. The result is stored # in $func_to_host_pathlist_result. func_to_host_pathlist () { func_to_host_pathlist_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_to_host_pathlist_tmp2="$1" # Once set for this call, this variable should not be # reassigned. It is used in tha fallback case. func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e 's|^:*||' -e 's|:*$||'` case $build in *mingw* ) # Actually, msys. # Awkward: cmd appends spaces to result. lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # unfortunately, winepath doesn't convert pathlists func_to_host_pathlist_result="" func_to_host_pathlist_oldIFS=$IFS IFS=: for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do IFS=$func_to_host_pathlist_oldIFS if test -n "$func_to_host_pathlist_f" ; then func_to_host_path "$func_to_host_pathlist_f" if test -n "$func_to_host_path_result" ; then if test -z "$func_to_host_pathlist_result" ; then func_to_host_pathlist_result="$func_to_host_path_result" else func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" fi fi fi IFS=: done IFS=$func_to_host_pathlist_oldIFS ;; esac if test -z "$func_to_host_pathlist_result" ; then func_error "Could not determine the host path(s) corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This may break if $1 contains DOS-style drive # specifications. The fix is not to complicate the expression # below, but for the user to provide a working wine installation # with winepath so that path translation in the cross-to-mingw # case works properly. lt_replace_pathsep_nix_to_dos="s|:|;|g" func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_replace_pathsep_nix_to_dos"` fi # Now, add the leading and trailing path separators back case "$1" in :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" ;; esac case "$1" in *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" ;; esac ;; esac fi } # end: func_to_host_pathlist # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include # define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include # define HAVE_SETENV # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif # endif #endif #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif #ifdef _MSC_VER # define S_IXUSR _S_IEXEC # define stat _stat # ifndef _INTPTR_T_DEFINED # define intptr_t int # endif #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifdef __CYGWIN__ # define FOPEN_WB "wb" #endif #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #undef LTWRAPPER_DEBUGPRINTF #if defined DEBUGWRAPPER # define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args static void ltwrapper_debugprintf (const char *fmt, ...) { va_list args; va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } #else # define LTWRAPPER_DEBUGPRINTF(args) #endif const char *program_name = NULL; void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_fatal (const char *message, ...); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_opt_process_env_set (const char *arg); void lt_opt_process_env_prepend (const char *arg); void lt_opt_process_env_append (const char *arg); int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); static const char *script_text_part1 = EOF func_emit_wrapper_part1 yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ "/' -e 's/$/\\n"/' echo ";" cat <"))); for (i = 0; i < newargc; i++) { LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); } EOF case $host_os in mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); return 127; } return rval; EOF ;; *) cat <<"EOF" execv (lt_argv_zero, newargz); return rval; /* =127, but avoids unused variable warning */ EOF ;; esac cat <<"EOF" } void * xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char) name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable (const char *path) { struct stat st; LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", tmp_pathspec)); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { char *errstr = strerror (errno); lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal ("Could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } void lt_setenv (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", (name ? name : ""), (value ? value : ""))); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } int lt_split_name_value (const char *arg, char** name, char** value) { const char *p; int len; if (!arg || !*arg) return 1; p = strchr (arg, (int)'='); if (!p) return 1; *value = xstrdup (++p); len = strlen (arg) - strlen (*value); *name = XMALLOC (char, len); strncpy (*name, arg, len-1); (*name)[len - 1] = '\0'; return 0; } void lt_opt_process_env_set (const char *arg) { char *name = NULL; char *value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); } lt_setenv (name, value); XFREE (name); XFREE (value); } void lt_opt_process_env_prepend (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); } new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_opt_process_env_append (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); } new_value = lt_extend_str (getenv (name), value, 1); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_update_exe_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF } # end: func_emit_cwrapperexe_src # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) deplibs="$deplibs $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) weak_libs="$weak_libs $arg" prev= continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname '-L' '' "$arg" dir=$func_stripname_result if test -z "$dir"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" linker_flags="$linker_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" compiler_flags="$compiler_flags $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_duplicate_deps ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= case $lib in *.la) func_source "$lib" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` case " $weak_libs " in *" $deplib_base "*) ;; *) deplibs="$deplibs $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" dir=$func_stripname_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $ECHO $ECHO "*** Warning: Trying to link with static lib archive $deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because the file extensions .$libext of this argument makes me believe" $ECHO "*** that it is just a static archive that I should not use here." else $ECHO $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) temp_rpath="$temp_rpath$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded notinst_deplibs="$notinst_deplibs $lib" need_relink=no ;; *) if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then $ECHO if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $ECHO $ECHO "*** And there doesn't seem to be a static archive available" $ECHO "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $ECHO $ECHO "*** Warning: This system can not link to static lib archive $lib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $ECHO "*** But as you try to build a module library, libtool will still create " $ECHO "*** a static module, that should work as long as the dlopening application" $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) func_dirname "$deplib" "" "." dir="$func_dirname_result" # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else $ECHO $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" versuffix2="$major.$age" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= versuffix2= else versuffix=".0.0" versuffix2=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= versuffix2= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" libobjs="$libobjs $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` done fi if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | $GREP . >/dev/null; then $ECHO if test "X$deplibs_check_method" = "Xnone"; then $ECHO "*** Warning: inter-library dependencies are not supported in this platform." else $ECHO "*** Warning: inter-library dependencies are not known to be supported." fi $ECHO "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $ECHO $ECHO "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" $ECHO "*** a static module, that should work as long as the dlopening" $ECHO "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $ECHO "*** The inter-library dependencies that have been dropped here will be" $ECHO "*** automatically added whenever a program is linked with this library" $ECHO "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $ECHO $ECHO "*** Since this library must not contain undefined symbols," $ECHO "*** because either the platform does not support them or" $ECHO "*** it was explicitly requested with -no-undefined," $ECHO "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" delfiles="$delfiles $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" func_len " $cmd" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then func_show_eval "$cmd" 'exit $?' skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$ECHO "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" $ECHO 'INPUT (' > $output for obj in $save_libobjs do $ECHO "$obj" >> $output done $ECHO ')' >> $output delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do $ECHO "$obj" >> $output done delfiles="$delfiles $output" output=$firstobj\"$file_list_spec$output\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=$obj func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi delfiles="$delfiles $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *cegcc) # Disable wrappers for cegcc, we are cross compiling anyway. wrappers_required=no ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $ECHO for shipping. if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then oldobjs="$oldobjs $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles oldobjs="$oldobjs $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else $ECHO "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlfiles="$newdlfiles $libdir/$name" ;; *) newdlfiles="$newdlfiles $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlprefiles="$newdlprefiles $libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$mode" = link || test "$mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) RM="$RM $arg"; rmforce=yes ;; -*) RM="$RM $arg" ;; *) files="$files $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then objdir="$origobjdir" else objdir="$dir/$origobjdir" fi func_basename "$file" name="$func_basename_result" test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result rmfiles="$rmfiles $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$mode" = uninstall || test "$mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 bind9-9.9.5.dfsg/unit/atf-src/admin/config.sub0000755000470500017500000010324512271526120020432 0ustar lamontlamont#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2009-12-31' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: bind9-9.9.5.dfsg/unit/atf-src/admin/check-style-man.awk0000644000470500017500000000370212271526120022134 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # function warn(msg) { print FILENAME "[" FNR "]: " msg > "/dev/stderr" error = 1 } BEGIN { skip = 0 error = 0 } /NO_CHECK_STYLE_BEGIN|^\.Bd/ { skip = 1 next } /NO_CHECK_STYLE_END|^\.Ed/ { skip = 0 next } /NO_CHECK_STYLE/ { next } /^\.\\"/ { next } { if (skip) next } /\.\.|e\.g\.|i\.e\./ { next } /\.[ ]+[a-zA-Z]+/ { warn("Sentence does not start on new line") } END { if (skip) warn("Missing NO_CHECK_STYLE_END"); if (error) exit 1 } # vim: syntax=awk:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/depcomp0000755000470500017500000005055212271526120020026 0ustar lamontlamont#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999-2012 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bind9-9.9.5.dfsg/unit/atf-src/admin/Makefile.am.inc0000644000470500017500000000342012271526120021245 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # dist-hook: check-style PHONY_TARGETS += check-style check-style: $(srcdir)/admin/check-style.sh EXTRA_DIST += admin/check-style-common.awk \ admin/check-style-c.awk \ admin/check-style-cpp.awk \ admin/check-style-man.awk \ admin/check-style-shell.awk \ admin/check-style.sh # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/admin/compile0000755000470500017500000001610312271526120020021 0ustar lamontlamont#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-03-05.13; # UTC # Copyright (C) 1999-2012 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bind9-9.9.5.dfsg/unit/atf-src/admin/check-style-common.awk0000644000470500017500000000415412271526120022653 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # function warn(msg) { print FILENAME "[" FNR "]: " msg > "/dev/stderr" error = 1 } BEGIN { skip = 0 error = 0 } /NO_CHECK_STYLE_BEGIN/ { skip = 1 next } /NO_CHECK_STYLE_END/ { skip = 0 next } /NO_CHECK_STYLE/ { next } { if (skip) next if (length > 80) warn("Line too long to fit on screen") } /^ *\t+/ { if (! match(FILENAME, "Makefile")) warn("Tab character used for indentation"); } /[ \t]+$/ { warn("Trailing spaces or tabs"); } /#![^ ]/ { # NO_CHECK_STYLE warn("Invalid shellbang: missing space after !"); } END { if (skip) warn("Missing NO_CHECK_STYLE_END"); if (error) exit 1 } # vim: syntax=awk:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/check-style-c.awk0000644000470500017500000000441112271526120021601 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # function warn(msg) { print FILENAME "[" FNR "]: " msg > "/dev/stderr" error = 1 } BEGIN { skip = 0 error = 0 } /NO_CHECK_STYLE_BEGIN/ { skip = 1 next } /NO_CHECK_STYLE_END/ { skip = 0 next } /NO_CHECK_STYLE/ { next } { if (skip) next } /#ifdef/ { warn("Undesired usage of #ifdef; use #if defined()") } /#ifndef/ { warn("Undesired usage of #ifndef; use #if !defined()") } /assert[ \t]*\(/ { warn("Use the macros in sanity.h instead of assert"); } /getprogname/ { warn("getprogname(3) is not portable"); } /include.*assert.h/ { warn("Do not include assert.h"); } /setprogname/ { warn("setprogname(3) is not portable"); } /\/\// { warn("Do not use C99-style comments"); } END { if (skip) warn("Missing NO_CHECK_STYLE_END"); if (error) exit 1 } # vim: syntax=awk:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/check-style.sh0000755000470500017500000001072612271526120021222 0ustar lamontlamont#! /bin/sh # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # A utility to sanity check the coding style of all source files in the # project tree. # Prog_Name=${0##*/} # # err message # err() { echo "${Prog_Name}: ${@}" 1>&2 exit 1 } # # warn message # warn() { echo "${Prog_Name}: ${@}" 1>&2 } # # guess_topdir # # Locates the project's top directory and prints its path. The caller # must verify if the result is correct or not. # guess_topdir() { olddir=$(pwd) topdir=$(pwd) while [ ${topdir} != / ]; do if [ -f ./atf-c.h ]; then break else cd .. topdir=$(pwd) fi done cd ${olddir} echo ${topdir} } # # find_sources # # Locates all source files within the project, relative to the current # directory, and prints their paths. # find_sources() { find . \( -name "AUTHORS" -o \ -name "COPYING" -o \ -name "ChangeLog" -o \ -name "NEWS" -o \ -name "README" -o \ -name "TODO" -o \ -name "*.[0-9]" -o \ -name "*.ac" -o \ -name "*.at" -o \ -name "*.awk" -o \ -name "*.c" -o \ -name "*.cpp" -o \ -name "*.h" -o \ -name "*.h.in" -o \ -name "*.hpp" -o \ -name "*.m4" -o \ -name "*.sh" \ \) -a \( \ \! -path "*/atf-[0-9]*" -a \ \! -path "*autom4te*" -a \ -type f -a \ \! -name "aclocal.m4" \ \! -name "bconfig.h" \ \! -name "defs.h" \ \! -name "libtool.m4" \ \! -name "ltoptions.m4" \ \! -name "ltsugar.m4" \ \! -name "lt~obsolete.m4" \ \! -name "*.so.*" \ \) } # # guess_formats file # # Guesses the formats applicable to the given file and prints the resulting # list. # guess_formats() { case ${1} in */ltmain.sh) ;; *.[0-9]) echo common man ;; *.c|*.h) echo common c ;; *.cpp|*.hpp) echo common cpp ;; *.sh) echo common shell ;; *) echo common ;; esac } # # check_file file # # Checks the validity of the given file. # check_file() { err=0 for format in $(guess_formats ${1}); do awk -f ${topdir}/admin/check-style-${format}.awk ${1} || err=1 done return ${err} } # # main [file list] # # Entry point. # main() { topdir=$(guess_topdir) if [ ! -f ${topdir}/atf-c.h ]; then err "Could not locate the project's top directory" fi if [ ${#} -gt 0 ]; then sources=${@} else cd ${topdir} sources=$(find_sources) fi ok=0 for file in ${sources}; do file=$(echo ${file} | sed -e "s,\\./,,") if [ ! -f ${file} ]; then err "Could not open ${file}" else check_file ${file} || ok=1 fi done return ${ok} } main "${@}" # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/admin/config.guess0000755000470500017500000012763712271526120021002 0ustar lamontlamont#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2009-12-30' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: bind9-9.9.5.dfsg/unit/atf-src/atf-sh/0002755000470500017500000000000012276444014016544 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-check_test.sh0000644000470500017500000002761712271526120021771 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2008 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The Atf_Check and Atf-Shell variables are set by atf-sh. h_pass() { cmd="$1"; shift echo "Running [atf-check $*] against [${cmd}]" cat >script.sh <tmp; then cat tmp atf_fail "atf-check failed" fi } h_fail() { cmd="$1"; shift echo "Running [atf-check $*] against [${cmd}]" cat >script.sh <tmp; then cat tmp atf_fail "atf-check succeeded but should fail" fi } atf_test_case sflag_eq_ne sflag_eq_ne_head() { atf_set "descr" "Tests for the -s option using the 'eq' and 'ne' qualifiers" } sflag_eq_ne_body() { h_pass "true" -s eq:0 h_pass "false" -s ne:0 h_pass "exit 255" -s eq:255 h_pass "exit 0" -s ne:255 h_fail "exit 256" -s eq:256 h_fail "exit -1" -s eq:-1 h_fail "true" -s ne:256 h_fail "true" -s ne:-1 } atf_test_case sflag_exit sflag_exit_head() { atf_set "descr" "Tests for the -s option using the 'exit' qualifier" } sflag_exit_body() { h_pass 'true' -s exit:0 h_pass 'false' -s not-exit:0 h_pass 'exit 255' -s exit:255 h_pass 'exit 0' -s not-exit:255 h_fail 'exit 256' -s exit:256 h_fail 'exit -1' -s exit:-1 h_fail 'true' -s not-exit:256 h_fail 'true' -s not-exit:-1 h_pass 'true' -s exit h_pass 'false' -s exit if ${Atf_Check} -s exit -x 'kill $$'; then atf_fail "Signal detected as clean exit" fi } atf_test_case sflag_ignore sflag_ignore_head() { atf_set "descr" "Tests for the -s option using the 'ignore' qualifier" } sflag_ignore_body() { h_pass 'true' -s ignore h_pass 'false' -s ignore if ${Atf_Check} -s ignored -x 'kill $$'; then atf_fail "Signal not ignored" fi } atf_test_case sflag_signal sflag_signal_head() { atf_set "descr" "Tests for the -s option using the 'signal' qualifier" } sflag_signal_body() { ${Atf_Check} -s signal:hup -x 'kill -1 $$' || atf_fail "Signal not detected" ${Atf_Check} -s signal:sighup -x 'kill -1 $$' || atf_fail "Signal not" \ "detected" ${Atf_Check} -s signal:1 -x 'kill -1 $$' || atf_fail "Signal not detected" ${Atf_Check} -s signal -x 'kill -1 $$' || atf_fail "Signal not detected" ${Atf_Check} -s not-signal:kill -x 'kill -9 $$' && \ atf_fail "not-signal:kill matched kill -9" ${Atf_Check} -s not-signal:kill -x 'kill -1 $$' || \ atf_fail "not-signal:kill did not match kill -1" h_fail 'true' -s signal h_fail 'false' -s signal } atf_test_case xflag xflag_head() { atf_set "descr" "Tests for the -x option" } xflag_body() { ${Atf_Check} -s ne:0 -o ignore -e ignore "echo foo 2>&1" || \ atf_fail "Shell command succeeded without -x" ${Atf_Check} -e inline:"foo\n" -x "echo foo 1>&2" || \ atf_fail "Cannot run command with -x" ${Atf_Check} -o inline:"foo\n" -x echo foo || \ atf_fail "Using -x does not respect all provided arguments" } atf_test_case oflag_empty oflag_empty_head() { atf_set "descr" "Tests for the -o option using the 'empty' argument" } oflag_empty_body() { h_pass "true" -o empty h_fail "echo foo" -o empty } atf_test_case oflag_ignore oflag_ignore_head() { atf_set "descr" "Tests for the -o option using the 'ignore' argument" } oflag_ignore_body() { h_pass "true" -o ignore h_pass "echo foo" -o ignore } atf_test_case oflag_file oflag_file_head() { atf_set "descr" "Tests for the -o option using the 'file:' argument" } oflag_file_body() { touch empty h_pass "true" -o file:empty echo foo >text h_pass "echo foo" -o file:text h_fail "echo bar" -o file:text dd if=/dev/urandom of=bin bs=1k count=10 h_pass "cat bin" -o file:bin } atf_test_case oflag_inline oflag_inline_head() { atf_set "descr" "Tests for the -o option using the 'inline:' argument" } oflag_inline_body() { h_pass "true" -o inline: h_pass "echo foo bar" -o inline:"foo bar\n" h_pass "printf 'foo bar'" -o inline:"foo bar" h_pass "printf '\t\n\t\n'" -o inline:"\t\n\t\n" # XXX Ugly hack to workaround the lack of \e in FreeBSD. Also, \e doesn't # seem to work as expected in Linux. Look for a nicer solution. case $(uname) in Darwin|FreeBSD|Linux) h_pass "printf '\a\b\f\n\r\t\v'" -o inline:"\a\b\f\n\r\t\v" ;; *) h_pass "printf '\a\b\e\f\n\r\t\v'" -o inline:"\a\b\e\f\n\r\t\v" ;; esac h_pass "printf '\011\022\033\012'" -o inline:"\011\022\033\012" h_fail "echo foo bar" -o inline:"foo bar" h_fail "echo -n foo bar" -o inline:"foo bar\n" } atf_test_case oflag_match oflag_match_head() { atf_set "descr" "Tests for the -o option using the 'match:' argument" } oflag_match_body() { h_pass "printf no-newline" -o "match:^no-newline" h_pass "echo line1; echo foo bar" -o "match:^foo" h_pass "echo foo bar" -o "match:o b" h_fail "echo foo bar" -o "match:baz" h_fail "echo foo bar" -o "match:^bar" } atf_test_case oflag_save oflag_save_head() { atf_set "descr" "Tests for the -o option using the 'save:' argument" } oflag_save_body() { h_pass "echo foo" -o save:out echo foo >exp cmp -s out exp || atf_fail "Saved output does not match expected results" } atf_test_case oflag_multiple oflag_multiple_head() { atf_set "descr" "Tests for multiple occurrences of the -o option" } oflag_multiple_body() { h_pass "echo foo bar" -o match:foo -o match:bar h_pass "echo foo; echo bar" -o match:foo -o match:bar h_fail "echo foo baz" -o match:bar -o match:foo h_fail "echo foo; echo baz" -o match:bar -o match:foo } atf_test_case oflag_negated oflag_negated_head() { atf_set "descr" "Tests for negated occurrences of the -o option" } oflag_negated_body() { h_fail "echo foo" -o empty h_pass "echo foo" -o not-empty h_pass "echo foo bar" -o match:foo h_fail "echo foo bar" -o not-match:foo } atf_test_case eflag_empty eflag_empty_head() { atf_set "descr" "Tests for the -e option using the 'empty' argument" } eflag_empty_body() { h_pass "true 1>&2" -e empty h_fail "echo foo 1>&2" -e empty } atf_test_case eflag_ignore eflag_ignore_head() { atf_set "descr" "Tests for the -e option using the 'ignore' argument" } eflag_ignore_body() { h_pass "true 1>&2" -e ignore h_pass "echo foo 1>&2" -e ignore } atf_test_case eflag_file eflag_file_head() { atf_set "descr" "Tests for the -e option using the 'file:' argument" } eflag_file_body() { touch empty h_pass "true 1>&2" -e file:empty echo foo >text h_pass "echo foo 1>&2" -e file:text h_fail "echo bar 1>&2" -e file:text dd if=/dev/urandom of=bin bs=1k count=10 h_pass "cat bin 1>&2" -e file:bin } atf_test_case eflag_inline eflag_inline_head() { atf_set "descr" "Tests for the -e option using the 'inline:' argument" } eflag_inline_body() { h_pass "true 1>&2" -e inline: h_pass "echo foo bar 1>&2" -e inline:"foo bar\n" h_pass "printf 'foo bar' 1>&2" -e inline:"foo bar" h_pass "printf '\t\n\t\n' 1>&2" -e inline:"\t\n\t\n" # XXX Ugly hack to workaround the lack of \e in FreeBSD. Also, \e doesn't # seem to work as expected in Linux. Look for a nicer solution. case $(uname) in Darwin|FreeBSD|Linux) h_pass "printf '\a\b\f\n\r\t\v' 1>&2" -e inline:"\a\b\f\n\r\t\v" ;; *) h_pass "printf '\a\b\e\f\n\r\t\v' 1>&2" -e inline:"\a\b\e\f\n\r\t\v" ;; esac h_pass "printf '\011\022\033\012' 1>&2" -e inline:"\011\022\033\012" h_fail "echo foo bar 1>&2" -e inline:"foo bar" h_fail "echo -n foo bar 1>&2" -e inline:"foo bar\n" } atf_test_case eflag_save eflag_save_head() { atf_set "descr" "Tests for the -e option using the 'save:' argument" } eflag_save_body() { h_pass "echo foo 1>&2" -e save:out echo foo >exp cmp -s out exp || atf_fail "Saved output does not match expected results" } atf_test_case eflag_match eflag_match_head() { atf_set "descr" "Tests for the -e option using the 'match:' argument" } eflag_match_body() { h_pass "printf no-newline 1>&2" -e "match:^no-newline" h_pass "echo line1 1>&2; echo foo bar 1>&2" -e "match:^foo" h_pass "echo foo bar 1>&2" -e "match:o b" h_fail "echo foo bar 1>&2" -e "match:baz" h_fail "echo foo bar 1>&2" -e "match:^bar" } atf_test_case eflag_multiple eflag_multiple_head() { atf_set "descr" "Tests for multiple occurrences of the -e option" } eflag_multiple_body() { h_pass "echo foo bar 1>&2" -e match:foo -e match:bar h_pass "echo foo 1>&2; echo bar 1>&2" -e match:foo -e match:bar h_fail "echo foo baz 1>&2" -e match:bar -e match:foo h_fail "echo foo 1>&2; echo baz 1>&2" -e match:bar -e match:foo } atf_test_case eflag_negated eflag_negated_head() { atf_set "descr" "Tests for negated occurrences of the -e option" } eflag_negated_body() { h_fail "echo foo 1>&2" -e empty h_pass "echo foo 1>&2" -e not-empty h_pass "echo foo bar 1>&2" -e match:foo h_fail "echo foo bar 1>&2" -e not-match:foo } atf_test_case stdin stdin_head() { atf_set "descr" "Tests that stdin is preserved" } stdin_body() { echo "hello" | ${Atf_Check} -o match:"hello" cat || \ atf_fail "atf-check does not seem to respect stdin" } atf_test_case invalid_umask invalid_umask_head() { atf_set "descr" "Tests for a correct error condition if the umask is" \ "too restrictive" } invalid_umask_body() { umask 0222 ${Atf_Check} false 2>stderr && \ atf_fail "atf-check returned 0 but it should have failed" cat stderr grep 'temporary.*current umask.*0222' stderr >/dev/null || \ atf_fail "atf-check did not report an error related to the" \ "current umask" } atf_init_test_cases() { atf_add_test_case sflag_eq_ne atf_add_test_case sflag_exit atf_add_test_case sflag_ignore atf_add_test_case sflag_signal atf_add_test_case xflag atf_add_test_case oflag_empty atf_add_test_case oflag_ignore atf_add_test_case oflag_file atf_add_test_case oflag_inline atf_add_test_case oflag_match atf_add_test_case oflag_save atf_add_test_case oflag_multiple atf_add_test_case oflag_negated atf_add_test_case eflag_empty atf_add_test_case eflag_ignore atf_add_test_case eflag_file atf_add_test_case eflag_inline atf_add_test_case eflag_match atf_add_test_case eflag_save atf_add_test_case eflag_multiple atf_add_test_case eflag_negated atf_add_test_case stdin atf_add_test_case invalid_umask } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/tp_test.sh0000644000470500017500000000400012271526120020544 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case srcdir srcdir_head() { atf_set "descr" "Verifies that the source directory can be queried" \ "from the initialization function" } srcdir_body() { mkdir work atf_check -s eq:0 -o empty -e empty cp "$(atf_get_srcdir)/misc_helpers" work cat >work/subrs <expout <experr <&2' } atf_test_case atf_check_null_stdout atf_check_null_stdout_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_null_stdout_body() { atf_check -s eq:0 -o empty -e empty echo "These are the contents" } atf_test_case atf_check_null_stderr atf_check_null_stderr_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_null_stderr_body() { atf_check -s eq:0 -o empty -e empty -x 'echo "These are the contents" 1>&2' } atf_test_case atf_check_equal_ok atf_check_equal_ok_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_equal_ok_body() { atf_check_equal a a } atf_test_case atf_check_equal_fail atf_check_equal_fail_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_equal_fail_body() { atf_check_equal a b } atf_test_case atf_check_equal_eval_ok atf_check_equal_eval_ok_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_equal_eval_ok_body() { x=a y=a atf_check_equal '${x}' '${y}' } atf_test_case atf_check_equal_eval_fail atf_check_equal_eval_fail_head() { atf_set "descr" "Helper test case for the t_atf_check test program" } atf_check_equal_eval_fail_body() { x=a y=b atf_check_equal '${x}' '${y}' } # ------------------------------------------------------------------------- # Helper tests for "t_config". # ------------------------------------------------------------------------- atf_test_case config_get config_get_head() { atf_set "descr" "Helper test case for the t_config test program" } config_get_body() { if atf_config_has ${TEST_VARIABLE}; then echo "${TEST_VARIABLE} = $(atf_config_get ${TEST_VARIABLE})" fi } atf_test_case config_has config_has_head() { atf_set "descr" "Helper test case for the t_config test program" } config_has_body() { if atf_config_has ${TEST_VARIABLE}; then echo "${TEST_VARIABLE} found" else echo "${TEST_VARIABLE} not found" fi } # ------------------------------------------------------------------------- # Helper tests for "t_normalize". # ------------------------------------------------------------------------- atf_test_case normalize normalize_head() { atf_set "descr" "Helper test case for the t_normalize test program" atf_set "a.b" "test value 1" atf_set "c-d" "test value 2" } normalize_body() { echo "a.b: $(atf_get a.b)" echo "c-d: $(atf_get c-d)" } # ------------------------------------------------------------------------- # Helper tests for "t_tc". # ------------------------------------------------------------------------- atf_test_case tc_pass_true tc_pass_true_head() { atf_set "descr" "Helper test case for the t_tc test program" } tc_pass_true_body() { true } atf_test_case tc_pass_false tc_pass_false_head() { atf_set "descr" "Helper test case for the t_tc test program" } tc_pass_false_body() { false } atf_test_case tc_pass_return_error tc_pass_return_error_head() { atf_set "descr" "Helper test case for the t_tc test program" } tc_pass_return_error_body() { return 1 } atf_test_case tc_fail tc_fail_head() { atf_set "descr" "Helper test case for the t_tc test program" } tc_fail_body() { echo "An error" 1>&2 exit 1 } atf_test_case tc_missing_body tc_missing_body_head() { atf_set "descr" "Helper test case for the t_tc test program" } # ------------------------------------------------------------------------- # Helper tests for "t_tp". # ------------------------------------------------------------------------- atf_test_case tp_srcdir tp_srcdir_head() { atf_set "descr" "Helper test case for the t_tp test program" } tp_srcdir_body() { echo "Calling helper" helper_subr || atf_fail "Could not call helper subroutine" } # ------------------------------------------------------------------------- # Main. # ------------------------------------------------------------------------- atf_init_test_cases() { # Add helper tests for t_atf_check. atf_add_test_case atf_check_info_ok atf_add_test_case atf_check_info_fail atf_add_test_case atf_check_expout_mismatch atf_add_test_case atf_check_experr_mismatch atf_add_test_case atf_check_null_stdout atf_add_test_case atf_check_null_stderr atf_add_test_case atf_check_equal_ok atf_add_test_case atf_check_equal_fail atf_add_test_case atf_check_equal_eval_ok atf_add_test_case atf_check_equal_eval_fail # Add helper tests for t_config. atf_add_test_case config_get atf_add_test_case config_has # Add helper tests for t_normalize. atf_add_test_case normalize # Add helper tests for t_tc. atf_add_test_case tc_pass_true atf_add_test_case tc_pass_false atf_add_test_case tc_pass_return_error atf_add_test_case tc_fail atf_add_test_case tc_missing_body # Add helper tests for t_tp. [ -f $(atf_get_srcdir)/subrs ] && . $(atf_get_srcdir)/subrs atf_add_test_case tp_srcdir } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-check.cpp0000644000470500017500000005475712271526120021107 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include #include } #include #include #include #include #include #include #include #include #include #include #include "atf-c++/check.hpp" #include "atf-c++/config.hpp" #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/auto_array.hpp" #include "atf-c++/detail/exceptions.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/process.hpp" #include "atf-c++/detail/sanity.hpp" #include "atf-c++/detail/text.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace { enum status_check_t { sc_exit, sc_ignore, sc_signal, }; struct status_check { status_check_t type; bool negated; int value; status_check(const status_check_t& p_type, const bool p_negated, const int p_value) : type(p_type), negated(p_negated), value(p_value) { } }; enum output_check_t { oc_ignore, oc_inline, oc_file, oc_empty, oc_match, oc_save }; struct output_check { output_check_t type; bool negated; std::string value; output_check(const output_check_t& p_type, const bool p_negated, const std::string& p_value) : type(p_type), negated(p_negated), value(p_value) { } }; class temp_file : public std::ostream { std::auto_ptr< atf::fs::path > m_path; int m_fd; public: temp_file(const atf::fs::path& p) : std::ostream(NULL), m_fd(-1) { atf::auto_array< char > buf(new char[p.str().length() + 1]); std::strcpy(buf.get(), p.c_str()); m_fd = ::mkstemp(buf.get()); if (m_fd == -1) throw atf::system_error("atf_check::temp_file::temp_file(" + p.str() + ")", "mkstemp(3) failed", errno); m_path.reset(new atf::fs::path(buf.get())); } ~temp_file(void) { close(); try { remove(*m_path); } catch (const atf::system_error&) { // Ignore deletion errors. } } const atf::fs::path& get_path(void) const { return *m_path; } void write(const std::string& text) { if (::write(m_fd, text.c_str(), text.size()) == -1) throw atf::system_error("atf_check", "write(2) failed", errno); } void close(void) { if (m_fd != -1) { flush(); ::close(m_fd); m_fd = -1; } } }; } // anonymous namespace static int parse_exit_code(const std::string& str) { try { const int value = atf::text::to_type< int >(str); if (value < 0 || value > 255) throw std::runtime_error("Unused reason"); return value; } catch (const std::runtime_error&) { throw atf::application::usage_error("Invalid exit code for -s option; " "must be an integer in range 0-255"); } } static struct name_number { const char *name; int signo; } signal_names_to_numbers[] = { { "hup", SIGHUP }, { "int", SIGINT }, { "quit", SIGQUIT }, { "trap", SIGTRAP }, { "abrt", SIGABRT }, { "kill", SIGKILL }, { "segv", SIGSEGV }, { "pipe", SIGPIPE }, { "alrm", SIGALRM }, { "term", SIGTERM }, { "usr1", SIGUSR1 }, { "usr2", SIGUSR2 }, { NULL, INT_MIN }, }; static int signal_name_to_number(const std::string& str) { struct name_number* iter = signal_names_to_numbers; int signo = INT_MIN; while (signo == INT_MIN && iter->name != NULL) { if (str == iter->name || str == std::string("sig") + iter->name) signo = iter->signo; else iter++; } return signo; } static int parse_signal(const std::string& str) { const int signo = signal_name_to_number(str); if (signo == INT_MIN) { try { return atf::text::to_type< int >(str); } catch (std::runtime_error) { throw atf::application::usage_error("Invalid signal name or number " "in -s option"); } } INV(signo != INT_MIN); return signo; } static status_check parse_status_check_arg(const std::string& arg) { const std::string::size_type delimiter = arg.find(':'); bool negated = (arg.compare(0, 4, "not-") == 0); const std::string action_str = arg.substr(0, delimiter); const std::string action = negated ? action_str.substr(4) : action_str; const std::string value_str = ( delimiter == std::string::npos ? "" : arg.substr(delimiter + 1)); int value; status_check_t type; if (action == "eq") { // Deprecated; use exit instead. TODO: Remove after 0.10. type = sc_exit; if (negated) throw atf::application::usage_error("Cannot negate eq checker"); negated = false; value = parse_exit_code(value_str); } else if (action == "exit") { type = sc_exit; if (value_str.empty()) value = INT_MIN; else value = parse_exit_code(value_str); } else if (action == "ignore") { if (negated) throw atf::application::usage_error("Cannot negate ignore checker"); type = sc_ignore; value = INT_MIN; } else if (action == "ne") { // Deprecated; use not-exit instead. TODO: Remove after 0.10. type = sc_exit; if (negated) throw atf::application::usage_error("Cannot negate ne checker"); negated = true; value = parse_exit_code(value_str); } else if (action == "signal") { type = sc_signal; if (value_str.empty()) value = INT_MIN; else value = parse_signal(value_str); } else throw atf::application::usage_error("Invalid status checker"); return status_check(type, negated, value); } static output_check parse_output_check_arg(const std::string& arg) { const std::string::size_type delimiter = arg.find(':'); const bool negated = (arg.compare(0, 4, "not-") == 0); const std::string action_str = arg.substr(0, delimiter); const std::string action = negated ? action_str.substr(4) : action_str; output_check_t type; if (action == "empty") type = oc_empty; else if (action == "file") type = oc_file; else if (action == "ignore") { if (negated) throw atf::application::usage_error("Cannot negate ignore checker"); type = oc_ignore; } else if (action == "inline") type = oc_inline; else if (action == "match") type = oc_match; else if (action == "save") { if (negated) throw atf::application::usage_error("Cannot negate save checker"); type = oc_save; } else throw atf::application::usage_error("Invalid output checker"); return output_check(type, negated, arg.substr(delimiter + 1)); } static std::string flatten_argv(char* const* argv) { std::string cmdline; char* const* arg = &argv[0]; while (*arg != NULL) { if (arg != &argv[0]) cmdline += ' '; cmdline += *arg; arg++; } return cmdline; } static std::auto_ptr< atf::check::check_result > execute(const char* const* argv) { std::cout << "Executing command [ "; for (int i = 0; argv[i] != NULL; ++i) std::cout << argv[i] << " "; std::cout << "]\n"; atf::process::argv_array argva(argv); return atf::check::exec(argva); } static std::auto_ptr< atf::check::check_result > execute_with_shell(char* const* argv) { const std::string cmd = flatten_argv(argv); const char* sh_argv[4]; sh_argv[0] = atf::config::get("atf_shell").c_str(); sh_argv[1] = "-c"; sh_argv[2] = cmd.c_str(); sh_argv[3] = NULL; return execute(sh_argv); } static void cat_file(const atf::fs::path& path) { std::ifstream stream(path.c_str()); if (!stream) throw std::runtime_error("Failed to open " + path.str()); stream >> std::noskipws; std::istream_iterator< char > begin(stream), end; std::ostream_iterator< char > out(std::cerr); std::copy(begin, end, out); stream.close(); } static bool grep_file(const atf::fs::path& path, const std::string& regexp) { std::ifstream stream(path.c_str()); if (!stream) throw std::runtime_error("Failed to open " + path.str()); bool found = false; std::string line; while (!found && !std::getline(stream, line).fail()) { if (atf::text::match(line, regexp)) found = true; } stream.close(); return found; } static bool file_empty(const atf::fs::path& p) { atf::fs::file_info f(p); return (f.get_size() == 0); } static bool compare_files(const atf::fs::path& p1, const atf::fs::path& p2) { bool equal = false; std::ifstream f1(p1.c_str()); if (!f1) throw std::runtime_error("Failed to open " + p1.str()); std::ifstream f2(p2.c_str()); if (!f2) throw std::runtime_error("Failed to open " + p1.str()); for (;;) { char buf1[512], buf2[512]; f1.read(buf1, sizeof(buf1)); if (f1.bad()) throw std::runtime_error("Failed to read from " + p1.str()); f2.read(buf2, sizeof(buf2)); if (f2.bad()) throw std::runtime_error("Failed to read from " + p1.str()); if ((f1.gcount() == 0) && (f2.gcount() == 0)) { equal = true; break; } if ((f1.gcount() != f2.gcount()) || (std::memcmp(buf1, buf2, f1.gcount()) != 0)) { break; } } return equal; } static void print_diff(const atf::fs::path& p1, const atf::fs::path& p2) { const atf::process::status s = atf::process::exec(atf::fs::path("diff"), atf::process::argv_array("diff", "-u", p1.c_str(), p2.c_str(), NULL), atf::process::stream_connect(STDOUT_FILENO, STDERR_FILENO), atf::process::stream_inherit()); if (!s.exited()) std::cerr << "Failed to run diff(3)\n"; if (s.exitstatus() != 1) std::cerr << "Error while running diff(3)\n"; } static std::string decode(const std::string& s) { size_t i; std::string res; res.reserve(s.length()); i = 0; while (i < s.length()) { char c = s[i++]; if (c == '\\') { switch (s[i++]) { case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'c': break; case 'e': c = 033; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '\\': break; case '0': { int count = 3; c = 0; while (--count >= 0 && (unsigned)(s[i] - '0') < 8) c = (c << 3) + (s[i++] - '0'); break; } default: --i; break; } } res.push_back(c); } return res; } static bool run_status_check(const status_check& sc, const atf::check::check_result& cr) { bool result; if (sc.type == sc_exit) { if (cr.exited() && sc.value != INT_MIN) { const int status = cr.exitcode(); if (!sc.negated && sc.value != status) { std::cerr << "Fail: incorrect exit status: " << status << ", expected: " << sc.value << "\n"; result = false; } else if (sc.negated && sc.value == status) { std::cerr << "Fail: incorrect exit status: " << status << ", expected: " << "anything else\n"; result = false; } else result = true; } else if (cr.exited() && sc.value == INT_MIN) { result = true; } else { std::cerr << "Fail: program did not exit cleanly\n"; result = false; } } else if (sc.type == sc_ignore) { result = true; } else if (sc.type == sc_signal) { if (cr.signaled() && sc.value != INT_MIN) { const int status = cr.termsig(); if (!sc.negated && sc.value != status) { std::cerr << "Fail: incorrect signal received: " << status << ", expected: " << sc.value << "\n"; result = false; } else if (sc.negated && sc.value == status) { std::cerr << "Fail: incorrect signal received: " << status << ", expected: " << "anything else\n"; result = false; } else result = true; } else if (cr.signaled() && sc.value == INT_MIN) { result = true; } else { std::cerr << "Fail: program did not receive a signal\n"; result = false; } } else { UNREACHABLE; result = false; } if (result == false) { std::cerr << "stdout:\n"; cat_file(atf::fs::path(cr.stdout_path())); std::cerr << "\n"; std::cerr << "stderr:\n"; cat_file(atf::fs::path(cr.stderr_path())); std::cerr << "\n"; } return result; } static bool run_status_checks(const std::vector< status_check >& checks, const atf::check::check_result& result) { bool ok = false; for (std::vector< status_check >::const_iterator iter = checks.begin(); !ok && iter != checks.end(); iter++) { ok |= run_status_check(*iter, result); } return ok; } static bool run_output_check(const output_check oc, const atf::fs::path& path, const std::string& stdxxx) { bool result; if (oc.type == oc_empty) { const bool is_empty = file_empty(path); if (!oc.negated && !is_empty) { std::cerr << "Fail: " << stdxxx << " not empty\n"; print_diff(atf::fs::path("/dev/null"), path); result = false; } else if (oc.negated && is_empty) { std::cerr << "Fail: " << stdxxx << " is empty\n"; result = false; } else result = true; } else if (oc.type == oc_file) { const bool equals = compare_files(path, atf::fs::path(oc.value)); if (!oc.negated && !equals) { std::cerr << "Fail: " << stdxxx << " does not match golden " "output\n"; print_diff(atf::fs::path(oc.value), path); result = false; } else if (oc.negated && equals) { std::cerr << "Fail: " << stdxxx << " matches golden output\n"; cat_file(atf::fs::path(oc.value)); result = false; } else result = true; } else if (oc.type == oc_ignore) { result = true; } else if (oc.type == oc_inline) { atf::fs::path path2 = atf::fs::path(atf::config::get("atf_workdir")) / "inline.XXXXXX"; temp_file temp(path2); temp.write(decode(oc.value)); temp.close(); const bool equals = compare_files(path, temp.get_path()); if (!oc.negated && !equals) { std::cerr << "Fail: " << stdxxx << " does not match expected " "value\n"; print_diff(temp.get_path(), path); result = false; } else if (oc.negated && equals) { std::cerr << "Fail: " << stdxxx << " matches expected value\n"; cat_file(temp.get_path()); result = false; } else result = true; } else if (oc.type == oc_match) { const bool matches = grep_file(path, oc.value); if (!oc.negated && !matches) { std::cerr << "Fail: regexp " + oc.value + " not in " << stdxxx << "\n"; cat_file(path); result = false; } else if (oc.negated && matches) { std::cerr << "Fail: regexp " + oc.value + " is in " << stdxxx << "\n"; cat_file(path); result = false; } else result = true; } else if (oc.type == oc_save) { INV(!oc.negated); std::ifstream ifs(path.c_str(), std::fstream::binary); ifs >> std::noskipws; std::istream_iterator< char > begin(ifs), end; std::ofstream ofs(oc.value.c_str(), std::fstream::binary | std::fstream::trunc); std::ostream_iterator obegin(ofs); std::copy(begin, end, obegin); result = true; } else { UNREACHABLE; result = false; } return result; } static bool run_output_checks(const std::vector< output_check >& checks, const atf::fs::path& path, const std::string& stdxxx) { bool ok = true; for (std::vector< output_check >::const_iterator iter = checks.begin(); iter != checks.end(); iter++) { ok &= run_output_check(*iter, path, stdxxx); } return ok; } // ------------------------------------------------------------------------ // The "atf_check" application. // ------------------------------------------------------------------------ namespace { class atf_check : public atf::application::app { bool m_xflag; std::vector< status_check > m_status_checks; std::vector< output_check > m_stdout_checks; std::vector< output_check > m_stderr_checks; static const char* m_description; bool run_output_checks(const atf::check::check_result&, const std::string&) const; std::string specific_args(void) const; options_set specific_options(void) const; void process_option(int, const char*); void process_option_s(const std::string&); public: atf_check(void); int main(void); }; } // anonymous namespace const char* atf_check::m_description = "atf-check executes given command and analyzes its results."; atf_check::atf_check(void) : app(m_description, "atf-check(1)", "atf(7)"), m_xflag(false) { } bool atf_check::run_output_checks(const atf::check::check_result& r, const std::string& stdxxx) const { if (stdxxx == "stdout") { return ::run_output_checks(m_stdout_checks, atf::fs::path(r.stdout_path()), "stdout"); } else if (stdxxx == "stderr") { return ::run_output_checks(m_stderr_checks, atf::fs::path(r.stderr_path()), "stderr"); } else { UNREACHABLE; return false; } } std::string atf_check::specific_args(void) const { return ""; } atf_check::options_set atf_check::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('s', "qual:value", "Handle status. Qualifier " "must be one of: ignore exit: signal:")); opts.insert(option('o', "action:arg", "Handle stdout. Action must be " "one of: empty ignore file: inline: match:regexp " "save:")); opts.insert(option('e', "action:arg", "Handle stderr. Action must be " "one of: empty ignore file: inline: match:regexp " "save:")); opts.insert(option('x', "", "Execute command as a shell command")); return opts; } void atf_check::process_option(int ch, const char* arg) { switch (ch) { case 's': m_status_checks.push_back(parse_status_check_arg(arg)); break; case 'o': m_stdout_checks.push_back(parse_output_check_arg(arg)); break; case 'e': m_stderr_checks.push_back(parse_output_check_arg(arg)); break; case 'x': m_xflag = true; break; default: UNREACHABLE; } } int atf_check::main(void) { if (m_argc < 1) throw atf::application::usage_error("No command specified"); int status = EXIT_FAILURE; std::auto_ptr< atf::check::check_result > r = m_xflag ? execute_with_shell(m_argv) : execute(m_argv); if (m_status_checks.empty()) m_status_checks.push_back(status_check(sc_exit, false, EXIT_SUCCESS)); else if (m_status_checks.size() > 1) { // TODO: Remove this restriction. throw atf::application::usage_error("Cannot specify -s more than once"); } if (m_stdout_checks.empty()) m_stdout_checks.push_back(output_check(oc_empty, false, "")); if (m_stderr_checks.empty()) m_stderr_checks.push_back(output_check(oc_empty, false, "")); if ((run_status_checks(m_status_checks, *r) == false) || (run_output_checks(*r, "stderr") == false) || (run_output_checks(*r, "stdout") == false)) status = EXIT_FAILURE; else status = EXIT_SUCCESS; return status; } int main(int argc, char* const* argv) { return atf_check().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-sh/normalize_test.sh0000644000470500017500000000352312271526120022132 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case main main_head() { atf_set "descr" "Verifies that variable names with symbols not" \ "allowed as part of shell variable names work" } main_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:0 -o match:'a.b: test value 1' \ -o match:'c-d: test value 2' -e ignore ${h} normalize } atf_init_test_cases() { atf_add_test_case main } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/integration_test.sh0000644000470500017500000000503012271526120022450 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2010 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # create_test_program() { echo '#! /usr/bin/env atf-sh' >"${1}" cat >>"${1}" chmod +x "${1}" } atf_test_case no_args no_args_body() { cat >experr <experr <>>\${0}<<<" while test \${#} -gt 0; do echo ">>>\${1}<<<" shift done true } EOF cat >expout <>>./tp<<< >>> a b <<< >>>foo<<< EOF atf_check -s eq:0 -o file:expout -e empty ./tp ' a b ' foo cat >expout <>>tp<<< >>> hello bye <<< >>>foo bar<<< EOF atf_check -s eq:0 -o file:expout -e empty atf-sh tp ' hello bye ' 'foo bar' } atf_init_test_cases() { atf_add_test_case no_args atf_add_test_case missing_script atf_add_test_case arguments } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/libatf-sh.subr0000644000470500017500000004404212271526120021306 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # set -e # ------------------------------------------------------------------------ # GLOBAL VARIABLES # ------------------------------------------------------------------------ # Values for the expect property. Expect=pass Expect_Reason= # A boolean variable that indicates whether we are parsing a test case's # head or not. Parsing_Head=false # The program name. Prog_Name=${0##*/} # The file to which the test case will print its result. Results_File= # The test program's source directory: i.e. where its auxiliary data files # and helper utilities can be found. Can be overriden through the '-s' flag. Source_Dir="$(dirname ${0})" # Indicates the test case we are currently processing. Test_Case= # List of meta-data variables for the current test case. Test_Case_Vars= # The list of all test cases provided by the test program. Test_Cases= # ------------------------------------------------------------------------ # PUBLIC INTERFACE # ------------------------------------------------------------------------ # # atf_add_test_case tc-name # # Adds the given test case to the list of test cases that form the test # program. The name provided here must be accompanied by two functions # named after it: _head and _body, and optionally by # a _cleanup function. # atf_add_test_case() { Test_Cases="${Test_Cases} ${1}" } # # atf_check cmd expcode expout experr # # Executes atf-check with given arguments and automatically calls # atf_fail in case of failure. # atf_check() { ${Atf_Check} "${@}" || \ atf_fail "atf-check failed; see the output of the test for details" } # # atf_check_equal expr1 expr2 # # Checks that expr1's value matches expr2's and, if not, raises an # error. Ideally expr1 and expr2 should be provided quoted (not # expanded) so that the error message is helpful; otherwise it will # only show the values, not the expressions themselves. # atf_check_equal() { eval _val1=\"${1}\" eval _val2=\"${2}\" test "${_val1}" = "${_val2}" || \ atf_fail "${1} != ${2} (${_val1} != ${_val2})" } # # atf_config_get varname [defvalue] # # Prints the value of a configuration variable. If it is not # defined, prints the given default value. # atf_config_get() { _varname="__tc_config_var_$(_atf_normalize ${1})" if [ ${#} -eq 1 ]; then eval _value=\"\${${_varname}-__unset__}\" [ "${_value}" = __unset__ ] && \ _atf_error 1 "Could not find configuration variable \`${1}'" echo ${_value} elif [ ${#} -eq 2 ]; then eval echo \${${_varname}-${2}} else _atf_error 1 "Incorrect number of parameters for atf_config_get" fi } # # atf_config_has varname # # Returns a boolean indicating if the given configuration variable is # defined or not. # atf_config_has() { _varname="__tc_config_var_$(_atf_normalize ${1})" eval _value=\"\${${_varname}-__unset__}\" [ "${_value}" != __unset__ ] } # # atf_expect_death reason # # Sets the expectations to 'death'. # atf_expect_death() { _atf_validate_expect Expect=death _atf_create_resfile "expected_death: ${*}" } # # atf_expect_timeout reason # # Sets the expectations to 'timeout'. # atf_expect_timeout() { _atf_validate_expect Expect=timeout _atf_create_resfile "expected_timeout: ${*}" } # # atf_expect_exit exitcode reason # # Sets the expectations to 'exit'. # atf_expect_exit() { _exitcode="${1}"; shift _atf_validate_expect Expect=exit if [ "${_exitcode}" = "-1" ]; then _atf_create_resfile "expected_exit: ${*}" else _atf_create_resfile "expected_exit(${_exitcode}): ${*}" fi } # # atf_expect_fail reason # # Sets the expectations to 'fail'. # atf_expect_fail() { _atf_validate_expect Expect=fail Expect_Reason="${*}" } # # atf_expect_pass # # Sets the expectations to 'pass'. # atf_expect_pass() { _atf_validate_expect Expect=pass Expect_Reason= } # # atf_expect_signal signo reason # # Sets the expectations to 'signal'. # atf_expect_signal() { _signo="${1}"; shift _atf_validate_expect Expect=signal if [ "${_signo}" = "-1" ]; then _atf_create_resfile "expected_signal: ${*}" else _atf_create_resfile "expected_signal(${_signo}): ${*}" fi } # # atf_expected_failure msg1 [.. msgN] # # Makes the test case report an expected failure with the given error # message. Multiple words can be provided, which are concatenated with # a single blank space. # atf_expected_failure() { _atf_create_resfile "expected_failure: ${Expect_Reason}: ${*}" exit 0 } # # atf_fail msg1 [.. msgN] # # Makes the test case fail with the given error message. Multiple # words can be provided, in which case they are joined by a single # blank space. # atf_fail() { case "${Expect}" in fail) atf_expected_failure "${@}" ;; pass) _atf_create_resfile "failed: ${*}" exit 1 ;; *) _atf_error 128 "Unreachable" ;; esac } # # atf_get varname # # Prints the value of a test case-specific variable. Given that one # should not get the value of non-existent variables, it is fine to # always use this function as 'val=$(atf_get var)'. # atf_get() { eval echo \${__tc_var_${Test_Case}_$(_atf_normalize ${1})} } # # atf_get_srcdir # # Prints the value of the test case's source directory. # atf_get_srcdir() { echo ${Source_Dir} } # # atf_pass # # Makes the test case pass. Shouldn't be used in general, as a test # case that does not explicitly fail is assumed to pass. # atf_pass() { case "${Expect}" in fail) Expect=pass atf_fail "Test case was expecting a failure but got a pass instead" ;; pass) _atf_create_resfile passed exit 0 ;; *) _atf_error 128 "Unreachable" ;; esac } # # atf_require_prog prog # # Checks that the given program name (either provided as an absolute # path or as a plain file name) can be found. If it is not available, # automatically skips the test case with an appropriate message. # # Relative paths are not allowed because the test case cannot predict # where it will be executed from. # atf_require_prog() { _prog= case ${1} in /*) _prog="${1}" [ -x ${_prog} ] || \ atf_skip "The required program ${1} could not be found" ;; */*) atf_fail "atf_require_prog does not accept relative path names \`${1}'" ;; *) _prog=$(_atf_find_in_path "${1}") [ -n "${_prog}" ] || \ atf_skip "The required program ${1} could not be found" \ "in the PATH" ;; esac } # # atf_set varname val1 [.. valN] # # Sets the test case's variable 'varname' to the specified values # which are concatenated using a single blank space. This function # is supposed to be called form the test case's head only. # atf_set() { ${Parsing_Head} || \ _atf_error 128 "atf_set called from the test case's body" Test_Case_Vars="${Test_Case_Vars} ${1}" _var=$(_atf_normalize ${1}); shift eval __tc_var_${Test_Case}_${_var}=\"\${*}\" } # # atf_skip msg1 [.. msgN] # # Skips the test case because of the reason provided. Multiple words # can be given, in which case they are joined by a single blank space. # atf_skip() { _atf_create_resfile "skipped: ${*}" exit 0 } # # atf_test_case tc-name cleanup # # Defines a new test case named tc-name. The name provided here must be # accompanied by two functions named after it: _head and # _body. If cleanup is set to 'cleanup', then this also expects # a _cleanup function to be defined. # atf_test_case() { eval "${1}_head() { :; }" eval "${1}_body() { atf_fail 'Test case not implemented'; }" if [ "${2}" = cleanup ]; then eval __has_cleanup_${1}=true eval "${1}_cleanup() { :; }" else eval "${1}_cleanup() { _atf_error 1 'Test case ${1} declared without a cleanup routine'; }" fi } # ------------------------------------------------------------------------ # PRIVATE INTERFACE # ------------------------------------------------------------------------ # # _atf_config_set varname val1 [.. valN] # # Sets the test case's private variable 'varname' to the specified # values which are concatenated using a single blank space. # _atf_config_set() { _var=$(_atf_normalize ${1}); shift eval __tc_config_var_${_var}=\"\${*}\" Config_Vars="${Config_Vars} __tc_config_var_${_var}" } # # _atf_config_set_str varname=val # # Sets the test case's private variable 'varname' to the specified # value. The parameter is of the form 'varname=val'. # _atf_config_set_from_str() { _oldifs=${IFS} IFS='=' set -- ${*} _var=${1} shift _val="${@}" IFS=${_oldifs} _atf_config_set "${_var}" "${_val}" } # # _atf_create_resfile contents # # Creates the results file. # _atf_create_resfile() { if [ -n "${Results_File}" ]; then echo "${*}" >"${Results_File}" || \ _atf_error 128 "Cannot create results file '${Results_File}'" else echo "${*}" fi } # # _atf_error error_code [msg1 [.. msgN]] # # Prints the given error message (which can be composed of multiple # arguments, in which case are joined by a single space) and exits # with the specified error code. # # This must not be used by test programs themselves (hence making # the function private) to indicate a test case's failure. They # have to use the atf_fail function. # _atf_error() { _error_code="${1}"; shift echo "${Prog_Name}: ERROR:" "$@" 1>&2 exit ${_error_code} } # # _atf_warning msg1 [.. msgN] # # Prints the given warning message (which can be composed of multiple # arguments, in which case are joined by a single space). # _atf_warning() { echo "${Prog_Name}: WARNING:" "$@" 1>&2 } # # _atf_find_in_path program # # Looks for a program in the path and prints the full path to it or # nothing if it could not be found. It also returns true in case of # success. # _atf_find_in_path() { _prog="${1}" _oldifs=${IFS} IFS=: for _dir in ${PATH} do if [ -x ${_dir}/${_prog} ]; then IFS=${_oldifs} echo ${_dir}/${_prog} return 0 fi done IFS=${_oldifs} return 1 } # # _atf_has_tc name # # Returns true if the given test case exists. # _atf_has_tc() { for _tc in ${Test_Cases}; do [ "${_tc}" != "${1}" ] || return 0 done return 1 } # # _atf_list_tcs # # Describes all test cases and prints the list to the standard output. # _atf_list_tcs() { echo 'Content-Type: application/X-atf-tp; version="1"' echo set -- ${Test_Cases} while [ ${#} -gt 0 ]; do _atf_parse_head ${1} echo "ident: $(atf_get ident)" for _var in ${Test_Case_Vars}; do [ "${_var}" != "ident" ] && echo "${_var}: $(atf_get ${_var})" done [ ${#} -gt 1 ] && echo shift done } # # _atf_normalize str # # Normalizes a string so that it is a valid shell variable name. # _atf_normalize() { echo ${1} | tr .- __ } # # _atf_parse_head tcname # # Evaluates a test case's head to gather its variables and prepares the # test program to run it. # _atf_parse_head() { Parsing_Head=true Test_Case="${1}" Test_Case_Vars= if _atf_has_cleanup "${1}"; then atf_set has.cleanup "true" fi ${1}_head atf_set ident "${1}" Parsing_Head=false } # # _atf_run_tc tc # # Runs the specified test case. Prints its exit status to the # standard output and returns a boolean indicating if the test was # successful or not. # _atf_run_tc() { case ${1} in *:*) _tcname=${1%%:*} _tcpart=${1#*:} if [ "${_tcpart}" != body -a "${_tcpart}" != cleanup ]; then _atf_syntax_error "Unknown test case part \`${_tcpart}'" fi ;; *) _tcname=${1} _tcpart=body ;; esac _atf_has_tc "${_tcname}" || _atf_syntax_error "Unknown test case \`${1}'" if [ "${__RUNNING_INSIDE_ATF_RUN}" != "internal-yes-value" ]; then _atf_warning "Running test cases without atf-run(1) is unsupported" _atf_warning "No isolation nor timeout control is being applied;" \ "you may get unexpected failures; see atf-test-case(4)" fi _atf_parse_head ${_tcname} case ${_tcpart} in body) if ${_tcname}_body; then _atf_validate_expect _atf_create_resfile passed else Expect=pass atf_fail "Test case body returned a non-ok exit code, but" \ "this is not allowed" fi ;; cleanup) if _atf_has_cleanup "${_tcname}"; then ${_tcname}_cleanup || _atf_error 128 "The test case cleanup" \ "returned a non-ok exit code, but this is not allowed" fi ;; *) _atf_error 128 "Unknown test case part" ;; esac } # # _atf_syntax_error msg1 [.. msgN] # # Formats and prints a syntax error message and terminates the # program prematurely. # _atf_syntax_error() { echo "${Prog_Name}: ERROR: ${@}" 1>&2 echo "${Prog_Name}: See atf-test-program(1) for usage details." 1>&2 exit 1 } # # _atf_has_cleanup tc-name # # Returns a boolean indicating if the given test case has a cleanup # routine or not. # _atf_has_cleanup() { _found=true eval "[ x\"\${__has_cleanup_${1}}\" = xtrue ] || _found=false" [ "${_found}" = true ] } # # _atf_validate_expect # # Ensures that the current test case state is correct regarding the expect # status. # _atf_validate_expect() { case "${Expect}" in death) Expect=pass atf_fail "Test case was expected to terminate abruptly but it" \ "continued execution" ;; exit) Expect=pass atf_fail "Test case was expected to exit cleanly but it continued" \ "execution" ;; fail) Expect=pass atf_fail "Test case was expecting a failure but none were raised" ;; pass) ;; signal) Expect=pass atf_fail "Test case was expected to receive a termination signal" \ "but it continued execution" ;; timeout) Expect=pass atf_fail "Test case was expected to hang but it continued execution" ;; *) _atf_error 128 "Unreachable" ;; esac } # # _atf_warning [msg1 [.. msgN]] # # Prints the given warning message (which can be composed of multiple # arguments, in which case are joined by a single space). # # This must not be used by test programs themselves (hence making # the function private). # _atf_warning() { echo "${Prog_Name}: WARNING:" "$@" 1>&2 } # # main [options] test_case # # Test program's entry point. # main() { # Process command-line options first. _numargs=${#} _lflag=false while getopts :lr:s:v: arg; do case ${arg} in l) _lflag=true ;; r) Results_File=${OPTARG} ;; s) Source_Dir=${OPTARG} ;; v) _atf_config_set_from_str "${OPTARG}" ;; \?) _atf_syntax_error "Unknown option -${OPTARG}." # NOTREACHED ;; esac done shift `expr ${OPTIND} - 1` # First of all, make sure that the source directory is correct. It # doesn't matter if the user did not change it, because the default # value may not work. (TODO: It possibly should, even though it is # not a big deal because atf-run deals with this.) case ${Source_Dir} in /*) ;; *) Source_Dir=$(pwd)/${Source_Dir} ;; esac [ -f ${Source_Dir}/${Prog_Name} ] || \ _atf_error 1 "Cannot find the test program in the source" \ "directory \`${Source_Dir}'" # Call the test program's hook to register all available test cases. atf_init_test_cases # Run or list test cases. if `${_lflag}`; then if [ ${#} -gt 0 ]; then _atf_syntax_error "Cannot provide test case names with -l" fi _atf_list_tcs else if [ ${#} -eq 0 ]; then _atf_syntax_error "Must provide a test case name" elif [ ${#} -gt 1 ]; then _atf_syntax_error "Cannot provide more than one test case name" else _atf_run_tc "${1}" fi fi } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-sh-api.30000644000470500017500000002544512271526120020563 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2008 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd June 28, 2010 .Dt ATF-SH-API 3 .Os .Sh NAME .Nm atf_add_test_case , .Nm atf_check , .Nm atf_check_equal , .Nm atf_config_get , .Nm atf_config_has , .Nm atf_expect_death , .Nm atf_expect_exit , .Nm atf_expect_fail , .Nm atf_expect_pass , .Nm atf_expect_signal , .Nm atf_expect_timeout , .Nm atf_fail , .Nm atf_get , .Nm atf_get_srcdir , .Nm atf_pass , .Nm atf_require_prog , .Nm atf_set , .Nm atf_skip , .Nm atf_test_case .Nd POSIX shell API to write ATF-based test programs .Sh SYNOPSIS .Fn atf_add_test_case "name" .Fn atf_check "command" .Fn atf_check_equal "expr1" "expr2" .Fn atf_config_get "var_name" .Fn atf_config_has "var_name" .Fn atf_expect_death "reason" "..." .Fn atf_expect_exit "exitcode" "reason" "..." .Fn atf_expect_fail "reason" "..." .Fn atf_expect_pass .Fn atf_expect_signal "signo" "reason" "..." .Fn atf_expect_timeout "reason" "..." .Fn atf_fail "reason" .Fn atf_get "var_name" .Fn atf_get_srcdir .Fn atf_pass .Fn atf_require_prog "prog_name" .Fn atf_set "var_name" "value" .Fn atf_skip "reason" .Fn atf_test_case "name" "cleanup" .Sh DESCRIPTION ATF provides a simple but powerful interface to easily write test programs in the POSIX shell language. These are extremely helpful given that they are trivial to write due to the language simplicity and the great deal of available external tools, so they are often ideal to test other applications at the user level. .Pp Test programs written using this library must be run using the .Xr atf-sh 1 interpreter by putting the following on their very first line: .Bd -literal -offset indent #! /usr/bin/env atf-sh .Ed .Pp Shell-based test programs always follow this template: .Bd -literal -offset indent atf_test_case tc1 tc1_head() { ... first test case's header ... } tc1_body() { ... first test case's body ... } atf_test_case tc2 cleanup tc2_head() { ... second test case's header ... } tc2_body() { ... second test case's body ... } tc2_cleanup() { ... second test case's cleanup ... } .Ns ... additional test cases ... atf_init_test_cases() { atf_add_test_case tc1 atf_add_test_case tc2 ... add additional test cases ... } .Ed .Ss Definition of test cases Test cases have an identifier and are composed of three different parts: the header, the body and an optional cleanup routine, all of which are described in .Xr atf-test-case 4 . To define test cases, one can use the .Fn atf_test_case function, which takes a first parameter specifiying the test case's name and instructs the library to set things up to accept it as a valid test case. The second parameter is optional and, if provided, must be .Sq cleanup ; providing this parameter allows defining a cleanup routine for the test case. It is important to note that this function .Em does not set the test case up for execution when the program is run. In order to do so, a later registration is needed through the .Fn atf_add_test_case function detailed in .Sx Program initialization . .Pp Later on, one must define the three parts of the body by providing two or three functions (remember that the cleanup routine is optional). These functions are named after the test case's identifier, and are .Fn _head , .Fn _body and .Fn _cleanup. None of these take parameters when executed. .Ss Program initialization The test program must define an .Fn atf_init_test_cases function, which is in charge of registering the test cases that will be executed at run time by using the .Fn atf_add_test_case function, which takes the name of a test case as its single parameter. This main function should not do anything else, except maybe sourcing auxiliary source files that define extra variables and functions. .Ss Configuration variables The test case has read-only access to the current configuration variables through the .Fn atf_config_has and .Fn atf_config_get methods. The former takes a single parameter specifying a variable name and returns a boolean indicating whether the variable is defined or not. The latter can take one or two parameters. If it takes only one, it specifies the variable from which to get the value, and this variable must be defined. If it takes two, the second one specifies a default value to be returned if the variable is not available. .Ss Access to the source directory It is possible to get the path to the test case's source directory from anywhere in the test program by using the .Fn atf_get_srcdir function. It is interesting to note that this can be used inside .Fn atf_init_test_cases to silently include additional helper files from the source directory. .Ss Requiring programs Aside from the .Va require.progs meta-data variable available in the header only, one can also check for additional programs in the test case's body by using the .Fn atf_require_prog function, which takes the base name or full path of a single binary. Relative paths are forbidden. If it is not found, the test case will be automatically skipped. .Ss Test case finalization The test case finalizes either when the body reaches its end, at which point the test is assumed to have .Em passed , or at any explicit call to .Fn atf_pass , .Fn atf_fail or .Fn atf_skip . These three functions terminate the execution of the test case immediately. The cleanup routine will be processed afterwards in a completely automated way, regardless of the test case's termination reason. .Pp .Fn atf_pass does not take any parameters. .Fn atf_fail and .Fn atf_skip take a single string parameter that describes why the test case failed or was skipped, respectively. It is very important to provide a clear error message in both cases so that the user can quickly know why the test did not pass. .Ss Expectations Everything explained in the previous section changes when the test case expectations are redefined by the programmer. .Pp Each test case has an internal state called .Sq expect that describes what the test case expectations are at any point in time. The value of this property can change during execution by any of: .Bl -tag -width indent .It Fn atf_expect_death "reason" "..." Expects the test case to exit prematurely regardless of the nature of the exit. .It Fn atf_expect_exit "exitcode" "reason" "..." Expects the test case to exit cleanly. If .Va exitcode is not .Sq -1 , .Xr atf-run 1 will validate that the exit code of the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn atf_expect_fail "reason" Any failure raised in this mode is recorded, but such failures do not report the test case as failed; instead, the test case finalizes cleanly and is reported as .Sq expected failure ; this report includes the provided .Fa reason as part of it. If no error is raised while running in this mode, then the test case is reported as .Sq failed . .Pp This mode is useful to reproduce actual known bugs in tests. Whenever the developer fixes the bug later on, the test case will start reporting a failure, signaling the developer that the test case must be adjusted to the new conditions. In this situation, it is useful, for example, to set .Fa reason as the bug number for tracking purposes. .It Fn atf_expect_pass This is the normal mode of execution. In this mode, any failure is reported as such to the user and the test case is marked as .Sq failed . .It Fn atf_expect_signal "signo" "reason" "..." Expects the test case to terminate due to the reception of a signal. If .Va signo is not .Sq -1 , .Xr atf-run 1 will validate that the signal that terminated the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn atf_expect_timeout "reason" "..." Expects the test case to execute for longer than its timeout. .El .Ss Helper functions for common checks .Fn atf_check [options] command [args] .Pp This function wraps the execution of the .Nm atf-check tool and makes the test case fail if the tool reports failure. You should always use this function instead of the tool in your scripts. For more details on the parameters of this function, refer to .Xr atf-check 1 . .Pp .Fn atf_check_equal expr1 expr2 .Pp This function takes two expressions, evaluates them and, if their results differ, aborts the test case with an appropriate failure message. .Sh EXAMPLES The following shows a complete test program with a single test case that validates the addition operator: .Bd -literal -offset indent atf_test_case addition addition_head() { atf_set "descr" "Sample tests for the addition operator" } addition_body() { atf_check_equal $((0 + 0)) 0 atf_check_equal $((0 + 1)) 1 atf_check_equal $((1 + 0)) 0 atf_check_equal $((1 + 1)) 2 atf_check_equal $((100 + 200)) 300 } atf_init_test_cases() { atf_add_test_case addition } .Ed .Pp This other example shows how to include a file with extra helper functions in the test program: .Bd -literal -offset indent .Ns ... definition of test cases ... atf_init_test_cases() { . $(atf_get_srcdir)/helper_functions.sh atf_add_test_case foo1 atf_add_test_case foo2 } .Ed .Pp This example demonstrates the use of the very useful .Fn atf_check function: .Bd -literal -offset indent # Check for silent output atf_check 'true' 0 null null # Check for silent output and failure atf_check 'false' 1 null null # Check for known stdout and silent stderr echo foo >expout atf_check 'echo foo' 0 expout null # Generate a file for later inspection atf_check 'ls' 0 stdout null grep foo ls || atf_fail "foo file not found in listing" .Ed .Sh SEE ALSO .Xr atf-sh 1 , .Xr atf-test-program 1 , .Xr atf-test-case 4 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf_check_test.sh0000644000470500017500000001521212271526120022037 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # TODO: Bring in the checks in the bootstrap testsuite for atf_check. atf_test_case info_ok info_ok_head() { atf_set "descr" "Verifies that atf_check prints an informative" \ "message even when the command is successful" } info_ok_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:0 -o save:stdout -e save:stderr -x \ "${h} atf_check_info_ok" grep 'Executing command.*true' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" atf_check -s eq:0 -o save:stdout -e save:stderr -x \ "${h} atf_check_info_fail" grep 'Executing command.*false' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" } atf_test_case expout_mismatch expout_mismatch_head() { atf_set "descr" "Verifies that atf_check prints a diff of the" \ "stdout and the expected stdout if the two do not" \ "match" } expout_mismatch_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:1 -o save:stdout -e save:stderr -x \ "${h} atf_check_expout_mismatch" grep 'Executing command.*echo bar' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" grep 'stdout does not match golden output' stderr >/dev/null || \ atf_fail "atf_check does not print the stdout header" grep 'stderr' stderr >/dev/null && \ atf_fail "atf_check prints the stderr header" grep '^-foo' stderr >/dev/null || \ atf_fail "atf_check does not print the stdout's diff" grep '^+bar' stderr >/dev/null || \ atf_fail "atf_check does not print the stdout's diff" } atf_test_case experr_mismatch experr_mismatch_head() { atf_set "descr" "Verifies that atf_check prints a diff of the" \ "stderr and the expected stderr if the two do not" \ "match" } experr_mismatch_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:1 -o save:stdout -e save:stderr -x \ "${h} atf_check_experr_mismatch" grep 'Executing command.*echo bar' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" grep 'stdout' stderr >/dev/null && \ atf_fail "atf_check prints the stdout header" grep 'stderr does not match golden output' stderr >/dev/null || \ atf_fail "atf_check does not print the stderr header" grep '^-foo' stderr >/dev/null || \ atf_fail "atf_check does not print the stderr's diff" grep '^+bar' stderr >/dev/null || \ atf_fail "atf_check does not print the stderr's diff" } atf_test_case null_stdout null_stdout_head() { atf_set "descr" "Verifies that atf_check prints a the stdout it got" \ "when it was supposed to be null" } null_stdout_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:1 -o save:stdout -e save:stderr -x \ "${h} atf_check_null_stdout" grep 'Executing command.*echo.*These.*contents' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" grep 'stdout not empty' stderr >/dev/null || \ atf_fail "atf_check does not print the stdout header" grep 'stderr' stderr >/dev/null && \ atf_fail "atf_check prints the stderr header" grep 'These are the contents' stderr >/dev/null || \ atf_fail "atf_check does not print stdout's contents" } atf_test_case null_stderr null_stderr_head() { atf_set "descr" "Verifies that atf_check prints a the stderr it got" \ "when it was supposed to be null" } null_stderr_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:1 -o save:stdout -e save:stderr -x \ "${h} atf_check_null_stderr" grep 'Executing command.*echo.*These.*contents' stdout >/dev/null || \ atf_fail "atf_check does not print an informative message" grep 'stdout' stderr >/dev/null && \ atf_fail "atf_check prints the stdout header" grep 'stderr not empty' stderr >/dev/null || \ atf_fail "atf_check does not print the stderr header" grep 'These are the contents' stderr >/dev/null || \ atf_fail "atf_check does not print stderr's contents" } atf_test_case equal equal_head() { atf_set "descr" "Verifies that atf_check_equal works" } equal_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:0 -o ignore -e ignore -x "${h} atf_check_equal_ok" atf_check -s eq:1 -o ignore -e ignore -x \ "${h} -r resfile atf_check_equal_fail" atf_check -s eq:0 -o ignore -e empty grep '^failed: a != b (a != b)$' \ resfile atf_check -s eq:0 -o ignore -e ignore -x "${h} atf_check_equal_eval_ok" atf_check -s eq:1 -o ignore -e ignore -x \ "${h} -r resfile atf_check_equal_eval_fail" atf_check -s eq:0 -o ignore -e empty \ grep '^failed: \${x} != \${y} (a != b)$' resfile } atf_init_test_cases() { atf_add_test_case info_ok atf_add_test_case expout_mismatch atf_add_test_case experr_mismatch atf_add_test_case null_stdout atf_add_test_case null_stderr atf_add_test_case equal } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/Atffile0000644000470500017500000000030412271526120020026 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: tc_test tp: tp_test tp: normalize_test tp: config_test tp: atf-check_test tp: atf_check_test tp: integration_test bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-check.10000644000470500017500000001066012271526120020446 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2008 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd June 27, 2010 .Dt ATF-CHECK 1 .Os .Sh NAME .Nm atf-check .Nd executes a command and analyzes its results .Sh SYNOPSIS .Nm .Op Fl s Ar qual:value .Op Fl o Ar action:arg ... .Op Fl e Ar action:arg ... .Op Fl x .Ar command .Nm .Fl h .Sh DESCRIPTION .Nm executes a given command and analyzes its results, including exit code, stdout and stderr. .Pp In the first synopsis form, .Nm will execute the provided command and apply checks specified by arguments. By default it will act as if it was run with .Fl s .Ar exit:0 .Fl o .Ar empty .Fl e .Ar empty . Multiple checks for the same output channel are allowed and, if specified, their results will be combined as a logical and (meaning that the output must match all the provided checks). .Pp In the second synopsis form, .Nm will print information about all supported options and their purpose. .Pp The following options are available: .Bl -tag -width XqualXvalueXX .It Fl h Shows a short summary of all available options and their purpose. .It Fl s Ar qual:value Analyzes termination status. Must be one of: .Bl -tag -width signal: -compact .It Ar exit: checks that the program exited cleanly and that its exit status is equal to .Va value . The exit code can be omitted altogether, in which case any clean exit is accepted. .It Ar ignore ignores the exit check. .It Ar signal: checks that the program exited due to a signal and that the signal that terminated it is .Va value . The signal can be specified both as a number or as a name, or it can also be omitted altogether, in which case any signal is accepted. .El .Pp Most of these checkers can be prefixed by the .Sq not- string, which effectively reverses the check. .It Fl o Ar action:arg Analyzes standard output. Must be one of: .Bl -tag -width inline: -compact .It Ar empty checks that stdout is empty .It Ar ignore ignores stdout .It Ar file: compares stdout with given file .It Ar inline: compares stdout with inline value .It Ar match: looks for a regular expression in stdout .It Ar save: saves stdout to given file .El .Pp Most of these checkers can be prefixed by the .Sq not- string, which effectively reverses the check. .It Fl e Ar action:arg Analyzes standard error (syntax identical to above) .It Fl x Executes .Ar command as a shell command line, executing it with the system shell defined by .Va ATF_SHELL in .Xr atf-config 1 . You should avoid using this flag if at all possible to prevent shell quoting issues. .El .Sh EXIT STATUS .Nm exits 0 on success, and other (unspecified) value on failure. .Sh EXAMPLES .Bd -literal -offset indent # Exit code 0, nothing on stdout/stderr atf-check 'true' # Typical usage if failure is expected atf-check -s not-exit:0 'false' # Checking stdout/stderr echo foobar >expout atf-check -o file:expout -e inline:"xx\etyy\en" \e 'echo foobar ; printf "xx\etyy\en" >&2' # Checking for a crash atf-check -s signal:sigsegv my_program # Combined checks atf-check -o match:foo -o not-match:bar echo foo baz .Ed .Sh SEE ALSO .Xr atf-config 1 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-sh.cpp0000644000470500017500000001136312271526120020426 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2010 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include #include #include #include #include "atf-c++/config.hpp" #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/fs.hpp" #include "atf-c++/detail/sanity.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace { static std::string fix_plain_name(const char *filename) { const atf::fs::path filepath(filename); if (filepath.branch_path().str() == ".") return std::string("./") + filename; else return std::string(filename); } static std::string* construct_script(const char* filename) { const std::string libexecdir = atf::config::get("atf_libexecdir"); const std::string pkgdatadir = atf::config::get("atf_pkgdatadir"); const std::string shell = atf::config::get("atf_shell"); std::string* command = new std::string(); command->reserve(512); (*command) += ("Atf_Check='" + libexecdir + "/atf-check' ; " + "Atf_Shell='" + shell + "' ; " + ". " + pkgdatadir + "/libatf-sh.subr ; " + ". " + fix_plain_name(filename) + " ; " + "main \"${@}\""); return command; } static const char** construct_argv(const std::string& shell, const int interpreter_argc, const char* const* interpreter_argv) { PRE(interpreter_argc >= 1); PRE(interpreter_argv[0] != NULL); const std::string* script = construct_script(interpreter_argv[0]); const int count = 4 + (interpreter_argc - 1) + 1; const char** argv = new const char*[count]; argv[0] = shell.c_str(); argv[1] = "-c"; argv[2] = script->c_str(); argv[3] = interpreter_argv[0]; for (int i = 1; i < interpreter_argc; i++) argv[4 + i - 1] = interpreter_argv[i]; argv[count - 1] = NULL; return argv; } } // anonymous namespace // ------------------------------------------------------------------------ // The "atf_sh" class. // ------------------------------------------------------------------------ class atf_sh : public atf::application::app { static const char* m_description; public: atf_sh(void); int main(void); }; const char* atf_sh::m_description = "atf-sh is a shell interpreter that extends the functionality of the " "system sh(1) with the atf-sh library."; atf_sh::atf_sh(void) : app(m_description, "atf-sh(1)", "atf(7)") { } int atf_sh::main(void) { if (m_argc < 1) throw atf::application::usage_error("No test program provided"); const atf::fs::path script(m_argv[0]); if (!atf::fs::exists(script)) throw std::runtime_error("The test program '" + script.str() + "' " "does not exist"); const std::string shell = atf::config::get("atf_shell"); const char** argv = construct_argv(shell, m_argc, m_argv); // Don't bother keeping track of the memory allocated by construct_argv: // we are going to exec or die immediately. const int ret = execv(shell.c_str(), const_cast< char** >(argv)); INV(ret == -1); std::cerr << "Failed to execute " << shell << ": " << std::strerror(errno) << "\n"; return EXIT_FAILURE; } int main(int argc, char* const* argv) { return atf_sh().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-sh.10000644000470500017500000000456012271526120020005 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2010 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd May 9, 2010 .Dt ATF-SH 1 .Os .Sh NAME .Nm atf-sh .Nd interpreter for shell-based test programs .Sh SYNOPSIS .Nm .Ar script .Nm .Fl h .Sh DESCRIPTION .Nm is an interpreter that runs the test program given in .Ar script after loading the .Xr atf-sh-api 3 library. .Pp .Nm is not a real interpreter though: it is just a wrapper around the system-wide shell defined by the .Sq atf_shell configuration value in .Xr atf-config 1 . .Nm executes the interpreter, loads the .Xr atf-sh-api 3 library and then runs the script. .Pp Scripts using .Xr atf-sh-api 3 should start with: .Bd -literal -offset indent #! /usr/bin/env atf-sh .Ed .Pp The following options are available: .Bl -tag -width XhXX .It Fl h Shows a short summary of all available options and their purpose. For those formats that write to a single file, specifying a .Sq - as the path will redirect the report to the standard output. .El .Sh SEE ALSO .Xr atf-config 1 , .Xr atf-sh-api 3 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/Makefile.am.inc0000644000470500017500000001142112271526120021337 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # libexec_PROGRAMS += atf-sh/atf-check atf_sh_atf_check_SOURCES = atf-sh/atf-check.cpp atf_sh_atf_check_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-sh/atf-check.1 bin_PROGRAMS += atf-sh/atf-sh atf_sh_atf_sh_SOURCES = atf-sh/atf-sh.cpp atf_sh_atf_sh_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-sh/atf-sh.1 atf_sh_DATA = atf-sh/libatf-sh.subr atf_shdir = $(pkgdatadir) EXTRA_DIST += $(atf_sh_DATA) dist_man_MANS += atf-sh/atf-sh-api.3 atf_aclocal_DATA += atf-sh/atf-sh.m4 EXTRA_DIST += atf-sh/atf-sh.m4 atf_shpkgconfigdir = $(atf_pkgconfigdir) atf_shpkgconfig_DATA = atf-sh/atf-sh.pc CLEANFILES += atf-sh/atf-sh.pc EXTRA_DIST += atf-sh/atf-sh.pc.in atf-sh/atf-sh.pc: $(srcdir)/atf-sh/atf-sh.pc.in Makefile test -d atf-sh || mkdir -p atf-sh sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__EXEC_PREFIX__#$(exec_prefix)#g' \ <$(srcdir)/atf-sh/atf-sh.pc.in >atf-sh/atf-sh.pc.tmp mv atf-sh/atf-sh.pc.tmp atf-sh/atf-sh.pc tests_atf_sh_DATA = atf-sh/Atffile \ atf-sh/Kyuafile tests_atf_shdir = $(pkgtestsdir)/atf-sh EXTRA_DIST += $(tests_atf_sh_DATA) tests_atf_sh_SCRIPTS = atf-sh/misc_helpers CLEANFILES += atf-sh/misc_helpers EXTRA_DIST += atf-sh/misc_helpers.sh atf-sh/misc_helpers: $(srcdir)/atf-sh/misc_helpers.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/misc_helpers.sh"; \ dst="atf-sh/misc_helpers"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/atf_check_test CLEANFILES += atf-sh/atf_check_test EXTRA_DIST += atf-sh/atf_check_test.sh atf-sh/atf_check_test: $(srcdir)/atf-sh/atf_check_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/atf_check_test.sh"; \ dst="atf-sh/atf_check_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/atf-check_test CLEANFILES += atf-sh/atf-check_test EXTRA_DIST += atf-sh/atf-check_test.sh atf-sh/atf-check_test: $(srcdir)/atf-sh/atf-check_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/atf-check_test.sh"; \ dst="atf-sh/atf-check_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/config_test CLEANFILES += atf-sh/config_test EXTRA_DIST += atf-sh/config_test.sh atf-sh/config_test: $(srcdir)/atf-sh/config_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/config_test.sh"; \ dst="atf-sh/config_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/integration_test CLEANFILES += atf-sh/integration_test EXTRA_DIST += atf-sh/integration_test.sh atf-sh/integration_test: $(srcdir)/atf-sh/integration_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/integration_test.sh"; \ dst="atf-sh/integration_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/normalize_test CLEANFILES += atf-sh/normalize_test EXTRA_DIST += atf-sh/normalize_test.sh atf-sh/normalize_test: $(srcdir)/atf-sh/normalize_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/normalize_test.sh"; \ dst="atf-sh/normalize_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/tc_test CLEANFILES += atf-sh/tc_test EXTRA_DIST += atf-sh/tc_test.sh atf-sh/tc_test: $(srcdir)/atf-sh/tc_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/tc_test.sh"; \ dst="atf-sh/tc_test"; $(BUILD_SH_TP) tests_atf_sh_SCRIPTS += atf-sh/tp_test CLEANFILES += atf-sh/tp_test EXTRA_DIST += atf-sh/tp_test.sh atf-sh/tp_test: $(srcdir)/atf-sh/tp_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/tp_test.sh"; \ dst="atf-sh/tp_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-sh.pc.in0000644000470500017500000000027712271526120020655 0ustar lamontlamont# ATF pkg-config file exec_prefix=__EXEC_PREFIX__ interpreter=${exec_prefix}/bin/atf-sh Name: atf-sh Description: Automated Testing Framework (POSIX shell binding) Version: __ATF_VERSION__ bind9-9.9.5.dfsg/unit/atf-src/atf-sh/config_test.sh0000644000470500017500000000563412271526120021404 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case has has_head() { atf_set "descr" "Verifies that atf_config_has works" } has_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:0 -o match:'foo not found' -e ignore -x \ "TEST_VARIABLE=foo ${h} config_has" atf_check -s eq:0 -o match:'foo found' -e ignore -x \ "TEST_VARIABLE=foo ${h} -v foo=bar config_has" echo "Checking for deprecated variables" atf_check -s eq:0 -o match:'workdir not found' -e ignore -x \ "TEST_VARIABLE=workdir ${h} config_has" } atf_test_case get get_head() { atf_set "descr" "Verifies that atf_config_get works" } get_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" echo "Querying an undefined variable" ( atf_config_get "undefined" ) >out 2>err && \ atf_fail "Getting an undefined variable succeeded" grep 'not find' err || \ atf_fail "Getting an undefined variable did not report an error" echo "Querying an undefined variable using a default value" v=$(atf_config_get "undefined" "the default value") [ "${v}" = "the default value" ] || \ atf_fail "Default value does not work" atf_check -s eq:0 -o match:'foo = bar' -e ignore -x \ "TEST_VARIABLE=foo ${h} -v foo=bar config_get" atf_check -s eq:0 -o match:'foo = baz' -e ignore -x \ "TEST_VARIABLE=foo ${h} -v foo=baz config_get" } atf_init_test_cases() { atf_add_test_case has atf_add_test_case get } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/Kyuafile0000644000470500017500000000046312271526120020233 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="tc_test"} atf_test_program{name="tp_test"} atf_test_program{name="normalize_test"} atf_test_program{name="config_test"} atf_test_program{name="atf-check_test"} atf_test_program{name="atf_check_test"} atf_test_program{name="integration_test"} bind9-9.9.5.dfsg/unit/atf-src/atf-sh/tc_test.sh0000644000470500017500000000460112271526120020536 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case default_status default_status_head() { atf_set "descr" "Verifies that test cases get the correct default" \ "status if they did not provide any" } default_status_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:0 -o ignore -e ignore ${h} tc_pass_true atf_check -s eq:1 -o ignore -e ignore ${h} tc_pass_false atf_check -s eq:1 -o match:'failed:.*body.*non-ok exit code' -e ignore \ ${h} tc_pass_return_error atf_check -s eq:1 -o ignore -e match:'An error' ${h} tc_fail } atf_test_case missing_body missing_body_head() { atf_set "descr" "Verifies that test cases without a body are reported" \ "as failed" } missing_body_body() { h="$(atf_get_srcdir)/misc_helpers -s $(atf_get_srcdir)" atf_check -s eq:1 -o ignore -e ignore ${h} tc_missing_body } atf_init_test_cases() { atf_add_test_case default_status atf_add_test_case missing_body } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-sh/atf-sh.m40000644000470500017500000000467012271526120020167 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright 2011 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ATF_CHECK_SH([version-spec]) dnl dnl Checks if atf-sh is present. If version-spec is provided, ensures that dnl the installed version of atf-sh matches the required version. This dnl argument must be something like '>= 0.14' and accepts any version dnl specification supported by pkg-config. dnl dnl Defines and substitutes ATF_SH with the full path to the atf-sh interpreter. AC_DEFUN([ATF_CHECK_SH], [ spec="atf-sh[]m4_default_nblank([ $1], [])" _ATF_CHECK_ARG_WITH( [AC_MSG_CHECKING([for ${spec}]) PKG_CHECK_EXISTS([${spec}], [found=yes], [found=no]) if test "${found}" = yes; then ATF_SH="$(${PKG_CONFIG} --variable=interpreter atf-sh)" AC_SUBST([ATF_SH], [${ATF_SH}]) found_atf_sh=yes fi AC_MSG_RESULT([${ATF_SH}])], [required ${spec} not found]) ]) bind9-9.9.5.dfsg/unit/atf-src/atf-version/0002755000470500017500000000000012276444014017617 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-version/atf-version.cpp0000644000470500017500000000560512271526120022556 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/ui.hpp" #include "revision.h" class atf_version : public atf::application::app { static const char* m_description; public: atf_version(void); int main(void); }; const char* atf_version::m_description = "atf-version is a tool that shows information about the currently " "installed version of ATF."; atf_version::atf_version(void) : app(m_description, "atf-version(1)", "atf(7)") { } int atf_version::main(void) { using atf::ui::format_text; using atf::ui::format_text_with_tag; std::cout << PACKAGE_STRING " (" PACKAGE_TARNAME "-" PACKAGE_VERSION ")\n" PACKAGE_COPYRIGHT "\n\n"; #if defined(PACKAGE_REVISION_TYPE_DIST) std::cout << format_text("Built from a distribution file; no revision " "information available.") << "\n"; #elif defined(PACKAGE_REVISION_TYPE_GIT) std::cout << format_text_with_tag(PACKAGE_REVISION_BRANCH, "Branch: ", false) << "\n"; std::cout << format_text_with_tag(PACKAGE_REVISION_BASE # if PACKAGE_REVISION_MODIFIED " (locally modified)" # endif " " PACKAGE_REVISION_DATE, "Base revision: ", false) << "\n"; #else # error "Unknown PACKAGE_REVISION_TYPE value" #endif return EXIT_SUCCESS; } int main(int argc, char* const* argv) { return atf_version().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-version/Makefile.am.inc0000644000470500017500000000460212271526120022415 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # bin_PROGRAMS += atf-version/atf-version atf_version_atf_version_SOURCES = atf-version/atf-version.cpp nodist_atf_version_atf_version_SOURCES = atf-version/revision.h atf_version_atf_version_CPPFLAGS = -Iatf-version atf_version_atf_version_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-version/atf-version.1 EXTRA_DIST += atf-version/generate-revision.sh BUILT_SOURCES += atf-version/revision.h CLEANFILES += atf-version/revision.h atf-version/revision.h: atf-version/revision.h.stamp @test -d atf-version || mkdir -p atf-version @cmp -s atf-version/revision.h atf-version/revision.h.stamp || \ cp -p atf-version/revision.h.stamp atf-version/revision.h CLEANFILES += atf-version/revision.h.stamp PHONY_TARGETS += atf-version/revision.h.stamp atf-version/revision.h.stamp: @test -d atf-version || mkdir -p atf-version @$(top_srcdir)/atf-version/generate-revision.sh \ -g "$(GIT)" -r $(top_srcdir) -o atf-version/revision.h.stamp \ -v $(PACKAGE_VERSION) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-version/atf-version.10000644000470500017500000000411512271526120022127 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd September 16, 2007 .Dt ATF-VERSION 1 .Os .Sh NAME .Nm atf-version .Nd shows information about the installed ATF version .Sh SYNOPSIS .Nm .Nm .Fl h .Sh DESCRIPTION .Nm is a utility that prints information about the version of ATF currently installed in the system. .Pp In the first synopsis form, .Nm shows the release version of the ATF package installed in the system (the installation that corresponds to the instance of .Nm being executed) and also shows information related to the repository revision used to build that package. .Pp In the second synopsis form, .Nm will print information about all supported options and their purpose. .Sh SEE ALSO .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-version/generate-revision.sh0000755000470500017500000000705212271526120023600 0ustar lamontlamont#! /bin/sh # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Generates a header file with information about the revision used to # build ATF. # set -e Prog_Name=${0##*/} GIT= ROOT= # # err message # err() { echo "${Prog_Name}: ${@}" 1>&2 exit 1 } # # call_git args # call_git() { ( cd "${ROOT}" && "${GIT}" "${@}" ) } # # generate_from_dist revfile version # generate_from_dist() { revfile=${1}; shift version=${1}; shift >${revfile} echo "#define PACKAGE_REVISION_TYPE_DIST" >>${revfile} } # # generate_from_git revfile # generate_from_git() { revfile=${1} rev_base_id=$(call_git rev-parse HEAD) rev_branch=$(call_git branch | grep '^\* ' | cut -d ' ' -f 2-) rev_date=$(call_git log -1 | grep '^Date:' | sed -e 's,^Date:[ \t]*,,') if [ -z "$(call_git status -s)" ]; then rev_modified=false else rev_modified=true fi >${revfile} echo "#define PACKAGE_REVISION_TYPE_GIT" >>${revfile} echo "#define PACKAGE_REVISION_BRANCH \"${rev_branch}\"" >>${revfile} echo "#define PACKAGE_REVISION_BASE \"${rev_base_id}\"" >>${revfile} if [ ${rev_modified} = true ]; then echo "#define PACKAGE_REVISION_MODIFIED 1" >>${revfile} fi echo "#define PACKAGE_REVISION_DATE \"${rev_date}\"" >>${revfile} } # # main # # Entry point. # main() { outfile= version= while getopts :g:r:o:v: arg; do case ${arg} in g) GIT=${OPTARG} ;; o) outfile=${OPTARG} ;; r) ROOT=${OPTARG} ;; v) version=${OPTARG} ;; *) err "Unknown option ${arg}" ;; esac done [ -n "${ROOT}" ] || \ err "Must specify the top-level source directory with -r" [ -n "${outfile}" ] || \ err "Must specify an output file with -o" [ -n "${version}" ] || \ err "Must specify a version number with -v" if [ -n "${GIT}" -a -d ${ROOT}/.git ]; then generate_from_git ${outfile} else generate_from_dist ${outfile} ${version} fi } main "${@}" # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/aclocal.m40000644000470500017500000010754212271526120017223 0ustar lamontlamont# generated automatically by aclocal 1.12.2 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.12' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.12.2], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.12.2])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 17 # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 19 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated. For more info, see: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl dnl Support for Objective C++ was only introduced in Autoconf 2.65, dnl but we still cater to Autoconf 2.62. m4_ifdef([AC_PROG_OBJCXX], [AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of '-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/compiler-flags.m4]) m4_include([m4/cxx-std-funcs.m4]) m4_include([m4/developer-mode.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/module-application.m4]) m4_include([m4/module-defs.m4]) m4_include([m4/module-env.m4]) m4_include([m4/module-fs.m4]) m4_include([m4/module-sanity.m4]) m4_include([m4/module-signals.m4]) m4_include([m4/runtime-tool.m4]) bind9-9.9.5.dfsg/unit/atf-src/doc/0002755000470500017500000000000012276444014016127 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/doc/atf-formats.50000644000470500017500000001753112271526120020437 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd December 20, 2011 .Dt ATF-FORMATS 5 .Os .Sh NAME .Nm atf-formats .Nd machine-parseable data formats used by ATF .Sh DESCRIPTION This manual page describes the multiple data formats used in ATF. These formats affect configuration files, control files and any data that is externalized or internalized by the tools. .Pp Data files are always organized as follows: .Bd -literal -offset indent Header1: Value1 \\ ... | head HeaderN: ValueN / mandatory blank line Free-form text contents \\ ... | body ... / .Ed .Pp A file must always contain a .Sq Content-Type header and must always separate that header from the body with a blank line, even if the body is empty. .Pp The .Sq Content-Type is always of the form: .Bd -literal -offset indent Content-Type: application/X-atf-; version="" .Ed .Pp where .Sq subtype indicates the specific file format and .Sq version its format version. This header must be the first one of the file. .Pp The main purpose of the .Sq Content-Type header, aside from determining the format used in the file, is to allow future changes to a given format. Whenever an incompatible change is made, the version is bumped by one. By keeping the header in the first line, future versions may even remove the need for such a header -- e.g. if some format was replaced by XML files, which have their own mandatory header. .Pp The rest of this document details the different format types. .Ss Format: application/X-atf-atffile, version: 1 Atffiles are logically divided into three sections: .Bl -bullet .It Test programs: the list of test programs that define the test suite described by the Atffile. .It Meta-data properties: these define some constant values applicable to all the test programs defined in the file. In some sense they define the properties that describe the test suite. .It Configuration variables: defaults for configuration variables that can be overridden through configuration files or the command line. .El .Pp The grammar for Atffiles is the following: .Bd -literal -offset indent DATA ::= ( ( CONF | PROP | TP )? COMMENT? NEWLINE )* EOF CONF ::= 'conf:' WORD EQUAL STRING PROP ::= 'prop:' WORD EQUAL STRING TP ::= TPFILE | TPGLOB TPFILE ::= 'tp: ' STRING TPGLOB ::= 'tp-glob: ' STRING STRING ::= WORD | '"' WORD* '"' .Ed .Pp The meaning of the constructions above is: .Bl -tag -width TPGLOBXX .It CONF Definition of a configuration variable. .It PROP Definition of a meta-data property. .It TPFILE Addition of a test program into the test suite. The string is taken literally as the program's name, and this program must exist. .It TPGLOB Addition of multiple test programs into the test suite. The string is taken as a glob pattern, which may have or not have any matches in the current directory. .El .Pp An example: .Bd -literal -offset indent prop: test-suite = utilities conf: unprivileged-user = nobody tp: t_cp tp: t_mv tp: t_df tp-glob: t_dir_* .Ed .Ss Format: application/X-atf-config, version: 1 Configuration files are very simple: they only contain a list of variable name/variable value pairs. Their grammar is: .Bd -literal -offset indent DATA ::= ( VAR? COMMENT? NEWLINE )* EOF VAR ::= WORD EQUAL STRING COMMENT ::= HASH WORD* STRING ::= WORD | '"' WORD* '"' .Ed .Pp An example: .Bd -literal -offset indent # This is the system-wide configuration file for ATF. # The above and this line are comments placed on their own line. var1 = this is a variable value var2 = this is another one # Optional comment at the end. .Ed .Ss Format: application/X-atf-tps, version: 3 The .Sq application/X-atf-tps format multiplexes the standard output, standard error and results output streams from multiple test programs into a single data file. This format is used by .Xr atf-run 1 to report the execution of several test programs and is later parsed by .Xr atf-report 1 to inform the user of this process. It has the following grammar: .Bd -literal -offset indent DATA ::= INFO* TPS-COUNT TP-STANZA* INFO* EOF INFO ::= 'info' COLON STRING COMMA STRING NEWLINE TPS-COUNT ::= 'tps-count' COLON POSITIVE-NUMBER NEWLINE TP-STANZA ::= TP-START TC-STANZA* TC-END TP-START ::= 'tp-start' COLON TIMESTAMP COMMA STRING COMMA POSITIVE-NUMBER NEWLINE TP-END ::= 'tc-end' COLON TIMESTAMP COMMA STRING (COMMA STRING)? TC-STANZA ::= TC-START (TC-SO | TC-SE)* TC-END TC-START ::= 'tc-start' COLON TIMESTAMP COMMA STRING NEWLINE TC-SO ::= 'tc-so' COLON STRING NEWLINE TC-SE ::= 'tc-se' COLON STRING NEWLINE TC-END ::= 'tc-end' COLON TIMESTAMP COMMA STRING COMMA TCR NEWLINE TCR ::= 'passed' | ('failed' | 'skipped') COMMA STRING TIMESTAMP ::= [0-9]+.[0-9]+ .Ed .Pp The meaning of the constructions above is: .Bl -tag -width TPSXCOUNTXX .It TPS-COUNT Indicates the number of test programs that will be executed. There will be this exact amount of .Sq TP-STANZA constructions following it. .It TP-START Indicates the beginning of a test program. This includes the program's name and the amount of test cases that will follow. .It TP-END Indicates the completion of a test program. This is followed by the program's name and, if the program ended prematurely, an error message indicating the reason of its failure. A successful execution of a test program (regardless of the status of its test cases) must not be accompanied by any reason. .It TC-START Indicates the beginning of a test case. This is accompanied by the test case's name. .It TC-SO Contains a text line sent to the standard output stream during the execution of the test case. Leading and trailing space is preserved. .It TC-SE Contains a text line sent to the standard error stream during the execution of the test case. Leading and trailing space is preserved. .It TC-END Indicates the completion of a test case. This is accompanied by the test case's name, its result and the reason associated with this result (if applicable). .El .Pp An example: .Bd -literal -offset indent tps-count: 2 tp-start: calculator, 1324318951.838923, 2 tc-start: add, 1324318951.839101 tc-end: add, 1324318951.839500, passed tc-start: subtract, 1324318951.840001 tc-so: 3-2 expected to return 1 but got 0 tc-end: subtract, 1324318952.000123, failed, Calculated an unexpected value tp-end: calculator, 1324318952.002301 tp-start: files, 1, 1324318952.502348 tc-start: copy, 1324318952.508291 tc-se: could not find the cp(1) utility tc-end: copy, 1324318953.203145, skipped tp-end: files, 1324318953.203800 .Ed .Sh SEE ALSO .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/doc/atf-test-program.10000644000470500017500000000755712271526120021413 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd February 6, 2011 .Dt ATF-TEST-PROGRAM 1 .Os .Sh NAME .Nm atf-test-program .Nd common interface to ATF test programs .Sh SYNOPSIS .Nm .Op Fl r Ar resfile .Op Fl s Ar srcdir .Op Fl v Ar var1=value1 Op .. Fl v Ar varN=valueN .Ar test_case .Nm .Fl l .Sh DESCRIPTION Test programs written using the ATF libraries all share a common user interface, which is what this manual page describes. .Em NOTE: There is no binary known as .Nm ; .Em what is described in this manual page is the command-line interface .Em exposed by the atf-c, atf-c++ and atf-sh bindings . .Pp In the first synopsis form, the test program will execute the provided test case and print its results to the standard output, unless otherwise stated by the .Fl r flag. Optionally, the test case name can be suffixed by .Sq :cleanup , in which case the cleanup routine of the test case will be executed instead of the test case body; see .Xr atf-test-case 4 . Note that the test case is .Em executed without isolation , so it can and probably will create and modify files in the current directory. To execute test cases in a controller manner, refer to .Xr atf-run 1 , which is the preferred way to run test cases. You should only execute test cases by hand for debugging purposes. .Pp In the second synopsis form, the test program will list all available test cases alongside their meta-data properties in a format that is machine parseable. This list is processed by .Xr atf-run 1 to know how to execute the test cases of a given test program. .Pp The following options are available: .Bl -tag -width XvXvarXvalueXX .It Fl l Lists available test cases alongside a brief description for each of them. .It Fl r Ar resfile Specifies the file that will receive the test case result. If not specified, the test case prints its results to stdout. If the result of a test case needs to be parsed by another program, you must use this option to redirect the result to a file and then read the resulting file from the other program. Note: .Em do not try to process the stdout of the test case because your program may break in the future. .It Fl s Ar srcdir The path to the directory where the test program is located. This is needed in all cases, except when the test program is being executed from the current directory. The test program will use this path to locate any helper data files or utilities. .It Fl v Ar var=value Sets the configuration variable .Ar var to the value .Ar value . .El .Sh SEE ALSO .Xr atf-run 1 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/doc/atf-test-case.40000644000470500017500000002510712271526120020651 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd January 13, 2011 .Dt ATF-TEST-CASE 4 .Os .Sh NAME .Nm atf-test-case .Nd generic description of test cases .Sh DESCRIPTION A .Em test case is a piece of code that stress-tests a specific feature of the software. This feature is typically self-contained enough, either in the amount of code that implements it or in the general idea that describes it, to warrant its independent testing. Given this, test cases are very fine-grained, but they attempt to group similar smaller tests which are semantically related. .Pp A test case is defined by three components regardless of the language it is implemented in: a header, a body and a cleanup routine. The .Em header is, basically, a declarative piece of code that defines several properties to describe what the test case does and how it behaves. In other words: it defines the test case's .Em meta-data , further described in the .Sx Meta-data section. The .Em body is the test case itself. It executes all actions needed to reproduce the test, and checks for failures. This body is only executed if the abstract conditions specified by the header are met. The .Em cleanup routine is a piece of code always executed after the body, regardless of the exit status of the test case. It can be used to undo side-effects of the test case. Note that almost all side-effects of a test case are automatically cleaned up by the library; this is explained in more detail in the rest of this document. .Pp It is extremely important to keep the separation between a test case's header and body well-defined, because the header is .Em always parsed, whereas the body is only executed when the conditions defined in the header are met and when the user specifies that test case. .Pp At last, test cases are always contained into test programs. The test programs act as a front-end to them, providing a consistent interface to the user and several APIs to ease their implementation. .Ss Results Upon termination, a test case reports a status and, optionally, a textual reason describing why the test reported such status. The caller must ensure that the test case really performed the task that its status describes, as the test program may be bogus and therefore providing a misleading result (e.g. providing a result that indicates success but the error code of the program says otherwise). .Pp The possible exit status of a test case are one of the following: .Bl -tag -width expectedXfailureXX .It expected_death The test case expects to terminate abruptly. .It expected_exit The test case expects to exit cleanly. .It expected_failure The test case expects to exit with a controller fatal/non-fatal failure. If this happens, the test program exits with a success error code. .It expected_signal The test case expects to receive a signal that makes it terminate. .It expected_timeout The test case expects to execute for longer than its timeout. .It passed The test case was executed successfully. The test program exits with a success error code. .It skipped The test case could not be executed because some preconditions were not met. This is not a failure because it can typically be resolved by adjusting the system to meet the necessary conditions. This is always accompanied by a .Em reason , a message describing why the test was skipped. The test program exits with a success error code. .It failed An error appeared during the execution of the test case. This is always accompanied by a .Em reason , a message describing why the test failed. The test program exits with a failure error code. .El .Pp The usefulness of the .Sq expected_* results comes when writing test cases that verify known failures caused, in general, due to programming errors (aka bugs). Whenever the faulty condition that the expectation is trying to convery is fixed, then the test case will be reported as .Sq failed and the developer will have to adjust it to match its new condition. .Pp It is important to note that all .Sq expected_* results are only provided as a .Em hint to the caller; the caller must verify that the test case did actually terminate as the expected condition says. .Ss Input/output Test cases are free to print whatever they want to their .Xr stdout 4 and .Xr stderr 4 file descriptors. They are, in fact, encouraged to print status information as they execute to keep the user informed of their actions. This is specially important for long test cases. .Pp Test cases will log their results to an auxiliary file, which is then collected by the test program they are contained in. The developer need not care about this as long as he uses the correct APIs to implement the test cases. .Pp The standard input of the test cases is unconditionally connected to .Sq /dev/zero . .Ss Meta-data The following list describes all meta-data properties interpreted internally by ATF. You are free to define new properties in your test cases and use them as you wish, but non-standard properties must be prefixed by .Sq X- . .Bl -tag -width requireXmachineXX .It descr Type: textual. Required. .Pp A brief textual description of the test case's purpose. Will be shown to the user in reports. Also good for documentation purposes. .It has.cleanup Type: boolean. Optional. .Pp If set to true, specifies that the test case has a cleanup routine that has to be executed by .Xr atf-run 1 during the cleanup phase of the execution. This property is automatically set by the framework when defining a test case with a cleanup routine, so it should never be set by hand. .It ident Type: textual. Required. .Pp The test case's identifier. Must be unique inside the test program and should be short but descriptive. .It require.arch Type: textual. Optional. .Pp A whitespace separated list of architectures that the test case can be run under without causing errors due to an architecture mismatch. .It require.config Type: textual. Optional. .Pp A whitespace separated list of configuration variables that must be defined to execute the test case. If any of the required variables is not defined, the test case is .Em skipped . .It require.files Type: textual. Optional. .Pp A whitespace separated list of files that must be present to execute the test case. The names of these files must be absolute paths. If any of the required files is not found, the test case is .Em skipped . .It require.machine Type: textual. Optional. .Pp A whitespace separated list of machine types that the test case can be run under without causing errors due to a machine type mismatch. .It require.memory Type: integer. Optional. Specifies the minimum amount of physical memory needed by the test. The value can have a size suffix such as .Sq K , .Sq M , .Sq G or .Sq T to make the amount of bytes easier to type and read. .It require.progs Type: textual. Optional. .Pp A whitespace separated list of programs that must be present to execute the test case. These can be given as plain names, in which case they are looked in the user's .Ev PATH , or as absolute paths. If any of the required programs is not found, the test case is .Em skipped . .It require.user Type: textual. Optional. .Pp The required privileges to execute the test case. Can be one of .Sq root or .Sq unprivileged . .Pp If the test case is running as a regular user and this property is .Sq root , the test case is .Em skipped . .Pp If the test case is running as root and this property is .Sq unprivileged , .Xr atf-run 1 will automatically drop the privileges if the .Sq unprivileged-user configuration property is set; otherwise the test case is .Em skipped . .It timeout Type: integral. Optional; defaults to .Sq 300 . .Pp Specifies the maximum amount of time the test case can run. This is particularly useful because some tests can stall either because they are incorrectly coded or because they trigger an anomalous behavior of the program. It is not acceptable for these tests to stall the whole execution of the test program. .Pp Can optionally be set to zero, in which case the test case has no run-time limit. This is discouraged. .El .Ss Environment Every time a test case is executed, several environment variables are cleared or reseted to sane values to ensure they do not make the test fail due to unexpected conditions. These variables are: .Bl -tag -width LCXMESSAGESXX .It Ev HOME Set to the work directory's path. .It Ev LANG Undefined. .It Ev LC_ALL Undefined. .It Ev LC_COLLATE Undefined. .It Ev LC_CTYPE Undefined. .It Ev LC_MESSAGES Undefined. .It Ev LC_MONETARY Undefined. .It Ev LC_NUMERIC Undefined. .It Ev LC_TIME Undefined. .It Ev TZ Hardcoded to .Sq UTC . .El .Ss Work directories The test program always creates a temporary directory and switches to it before running the test case's body. This way the test case is free to modify its current directory as it wishes, and the runtime engine will be able to clean it up later on in a safe way, removing any traces of its execution from the system. To do so, the runtime engine will perform a recursive removal of the work directory without crossing mount points; if a mount point is found, the file system will be unmounted (if possible). .Ss File creation mode mask (umask) Test cases are always executed with a file creation mode mask (umask) of .Sq 0022 . The test case's code is free to change this during execution. .Sh SEE ALSO .Xr atf-run 1 , .Xr atf-test-program 1 , .Xr atf-formats 5 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/doc/Makefile.am.inc0000644000470500017500000000354112271526120020726 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # dist_man_MANS += doc/atf-test-case.4 \ doc/atf-test-program.1 if ENABLE_TOOLS man_MANS += doc/atf.7 CLEANFILES += doc/atf.7 EXTRA_DIST += doc/atf.7.in dist_man_MANS += doc/atf-formats.5 doc/atf.7: $(srcdir)/doc/atf.7.in test -d doc || mkdir -p doc sed -e 's#__DOCDIR__#$(docdir)#g' \ -e 's#__TESTSDIR__#$(testsdir)#g' \ <$(srcdir)/doc/atf.7.in >doc/atf.7.tmp mv doc/atf.7.tmp doc/atf.7 endif # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/doc/atf.7.in0000644000470500017500000001315212271526120017370 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd August 28, 2010 .Dt ATF 7 .Os .Sh NAME .Nm ATF .Nd introduction to the Automated Testing Framework .Sh DESCRIPTION .Em IMPORTANT: If you are here because you want to know how to run the tests in .Em Pa __TESTSDIR__ , .Em you most likely want to read the .Em Xr tests 7 .Em manual page instead. .Pp The Automated Testing Framework .Pf ( Nm ) is a collection of libraries and utilities designed to ease unattended application testing in the hands of developers and end users of a specific piece of software. .Pp As regards developers, .Nm provides the necessary means to easily create test suites composed of multiple test programs, which in turn are a collection of test cases. It also attempts to simplify the debugging of problems when these test cases detect an error by providing as much information as possible about the failure. .Pp As regards users, it simplifies the process of running the test suites and, in special, encourages end users to run them often: they do not need to have source trees around nor any other development tools installed to be able to certify that a given piece of software works on their machine as advertised. .Pp If your operating systems distributes .Nm , it is possible that it provides an introductory .Xr tests 7 manual page. You are encouraged to read it now. .Ss License .Nm is distributed under the terms of the TNF License, a 2-clause BSD license. For more details please see: .Bd -literal -offset indent .Pa __DOCDIR__/COPYING .Ed .Ss Components .Nm is a highly modular piece of software. It provides a couple of libraries to ease the implementation of test programs: one for the C and C++ languages and another one for shell scripts. It also includes multiple small utilities that follow the principle of doing a single thing but doing it right. This section outlines which these components are. .Pp Public utilities: .Bl -tag -width atfXtestXprogramXXXXX .It Xr atf-check 1 Executes a command and checks that its exit code, its standard output and its standard error output match pre-specified expected values. .It Xr atf-config 1 Queries static configuration information. .It Xr atf-report 1 Converts the output of .Nm atf-run to user-friendly and/or machine-parseable reports. .It Xr atf-run 1 Automates the execution of a series of test programs and collects their results in a unified report. .It Xr atf-sh 1 Shell interpreter for shell-based test programs. .El .Pp Programming interfaces: .Bl -tag -width atfXtestXprogramXXXXX .It Xr atf-c-api 3 C programming interface for test programs. .It Xr atf-c++-api 3 C++ programming interface for test programs. .It Xr atf-sh-api 3 POSIX shell programming interface for test programs. .El .Pp Other: .Bl -tag -width atfXtestXprogramXXXXX .It Xr atf-formats 5 Description of the machine-parseable data formats used by the tools. .It Xr atf-test-case 4 Generic description of test cases, independent of the language they are implemented in. .It Xr atf-test-program 1 Common interface provided by the test programs written using the .Nm libraries. .El .Ss Recommended reading order For end users wishing to run tests: .Bl -enum -compact .It .Xr tests 7 (only if provided by your operating system). .It .Xr atf-test-program 1 .It .Xr atf-run 1 .It .Xr atf-report 1 .It .Xr atf-config 1 .El .Pp For developers wanting to write their own tests: .Bl -enum -compact .It Everything recommended to users. .It .Xr atf-test-case 4 .It .Xr atf-c-api 3 .It .Xr atf-c++-api 3 .It .Xr atf-sh-api 3 .It .Xr atf-sh 1 .It .Xr atf-check 1 .El .Pp For those interested in .Nm internals: .Bl -enum -compact .It Everything recommended to users. .It Everything recommended to developers. .It .Xr atf-formats 5 .El .Sh SEE ALSO .Xr tests 7 .Sh HISTORY .Nm started as a Google Summer of Code 2007 project mentored by The NetBSD Foundation. Its original goal was to provide a testing framework for The NetBSD Operating System, but it grew as an independent project because the framework itself did not need to be tied to a specific operating system. .Pp For more details on this subject, please see: .Bd -literal -offset indent .Pa __DOCDIR__/NEWS .Pa __DOCDIR__/ROADMAP .Ed .Sh AUTHORS For more details on the people that made .Nm possible, please see: .Bd -literal -offset indent .Pa __DOCDIR__/AUTHORS .Ed bind9-9.9.5.dfsg/unit/atf-src/README0000644000470500017500000000301712271526120016233 0ustar lamontlamontIntroductory information Automated Testing Framework =========================================================================== Introduction ************ The Automated Testing Framework (ATF) is a collection of libraries and utilities designed to ease unattended application testing in the hands of developers and end users of a specific piece of software. As regards developers, ATF provides the necessary means to easily create test suites composed of multiple test programs, which in turn are a collection of test cases. It also attempts to simplify the debugging of problems when these test cases detect an error by providing as much information as possible about the failure. As regards users, it simplifies the process of running the test suites and, in special, encourages end users to run them often: they do not need to have source trees around nor any other development tools installed to be able to certify that a given piece of software works on their machine as advertised. Other documents *************** * AUTHORS: List of authors and contributors for this project. * COPYING: License information. * INSTALL: Compilation and installation instructions. These is not the standard document shipped with many packages, so be sure to read it for things that are specific to ATF's build. * NEWS: List of major changes between formal, published releases. =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/m4/0002755000470500017500000000000012276444014015702 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/m4/ltsugar.m40000644000470500017500000001042412271526120017616 0ustar lamontlamont# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) bind9-9.9.5.dfsg/unit/atf-src/m4/ltoptions.m40000644000470500017500000002724212271526120020176 0ustar lamontlamont# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [0], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-application.m40000644000470500017500000000600612271526120021724 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_MODULE_APPLICATION], [ ATF_CHECK_STD_VSNPRINTF AC_CACHE_CHECK( [whether getopt allows a + sign for POSIX behavior], [kyua_cv_getopt_plus], [ AC_LANG_PUSH([C]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include #include #include ], [ int argc = 4; char* argv@<:@5@:>@ = { strdup("conftest"), strdup("-+"), strdup("-a"), strdup("bar"), NULL }; int ch; int seen_a = 0, seen_plus = 0; while ((ch = getopt(argc, argv, "+a:")) != -1) { switch (ch) { case 'a': seen_a = 1; break; case '+': seen_plus = 1; break; case '?': default: ; } } return (seen_a && !seen_plus) ? EXIT_SUCCESS : EXIT_FAILURE; ])], [kyua_cv_getopt_plus=yes], [kyua_cv_getopt_plus=no]) AC_LANG_POP([C]) ]) if test x"${kyua_cv_getopt_plus}" = xyes; then AC_DEFINE([HAVE_GNU_GETOPT], [1], [Define to 1 if getopt allows a + sign for POSIX behavior]) fi AC_CACHE_CHECK( [whether getopt has optreset], [kyua_cv_getopt_optreset], [ AC_LANG_PUSH([C]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include #include ], [ optreset = 1; return EXIT_SUCCESS; ])], [kyua_cv_getopt_optreset=yes], [kyua_cv_getopt_optreset=no]) AC_LANG_POP([C]) ]) if test x"${kyua_cv_getopt_optreset}" = xyes; then AC_DEFINE([HAVE_OPTRESET], [1], [Define to 1 if getopt has optreset]) fi ]) bind9-9.9.5.dfsg/unit/atf-src/m4/cxx-std-funcs.m40000644000470500017500000000552312271526120020647 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_CHECK_IN_STD], [ AC_MSG_CHECKING(whether $1 is in std) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2], [$3 return 0;])], AC_MSG_RESULT(yes) AC_DEFINE([HAVE_]translit($1, [a-z], [A-Z])[_IN_STD], [1], [Define to 1 if $1 is in std]), AC_MSG_RESULT(no) ) ]) AC_DEFUN([ATF_CHECK_STD_PUTENV], [ ATF_CHECK_IN_STD([putenv], [#include ], [std::putenv("a=b");] ) ]) AC_DEFUN([ATF_CHECK_STD_SETENV], [ ATF_CHECK_IN_STD([setenv], [#include ], [std::setenv("a", "b");] ) ]) AC_DEFUN([ATF_CHECK_STD_SNPRINTF], [ ATF_CHECK_IN_STD([snprintf], [#include ], [char buf; std::snprintf(&buf, 1, "");] ) ]) AC_DEFUN([ATF_CHECK_STD_UNSETENV], [ ATF_CHECK_IN_STD([unsetenv], [#include ], [std::unsetenv("a");] ) ]) AC_DEFUN([ATF_CHECK_STD_VSNPRINTF], [ ATF_CHECK_IN_STD([vsnprintf], [#include #include ], [va_list ap; char* buf = NULL; const char* fmt = NULL; std::vsnprintf(buf, 0, fmt, ap);] ) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/developer-mode.m40000644000470500017500000001104212271526120021041 0ustar lamontlamontdnl Copyright 2010 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl \file developer-mode.m4 dnl dnl "Developer mode" is a mode in which the build system reports any dnl build-time warnings as fatal errors. This helps in minimizing the dnl amount of trivial coding problems introduced in the code. dnl Unfortunately, this is not bullet-proof due to the wide variety of dnl compilers available and their different warning diagnostics. dnl dnl When developer mode support is added to a package, the compilation will dnl gain a bunch of extra warning diagnostics. These will NOT be enforced dnl unless developer mode is enabled. dnl dnl Developer mode is enabled when the user requests it through the dnl configure command line, or when building from the repository. The dnl latter is to minimize the risk of committing new code with warnings dnl into the tree. dnl Adds "developer mode" support to the package. dnl dnl This macro performs the actual definition of the --enable-developer dnl flag and implements all of its logic. See the file-level comment for dnl details as to what this implies. AC_DEFUN([KYUA_DEVELOPER_MODE], [ m4_foreach([language], [$1], [m4_set_add([languages], language)]) AC_ARG_ENABLE( [developer], AS_HELP_STRING([--enable-developer], [enable developer features]),, [if test -d ${srcdir}/.git; then AC_MSG_NOTICE([building from HEAD; developer mode autoenabled]) enable_developer=yes else enable_developer=no fi]) # # The following warning flags should also be enabled but cannot be. # Reasons given below. # # -Wold-style-cast: Raises errors when using TIOCGWINSZ, at least under # Mac OS X. This is due to the way _IOR is defined. # try_c_cxx_flags="-D_FORTIFY_SOURCE=2 \ -Wall \ -Wcast-qual \ -Wextra \ -Wpointer-arith \ -Wredundant-decls \ -Wreturn-type \ -Wshadow \ -Wsign-compare \ -Wswitch \ -Wwrite-strings" try_c_flags="-Wmissing-prototypes \ -Wno-traditional \ -Wstrict-prototypes" try_cxx_flags="-Wabi \ -Wctor-dtor-privacy \ -Wno-deprecated \ -Wno-non-template-friend \ -Wno-pmf-conversions \ -Wnon-virtual-dtor \ -Woverloaded-virtual \ -Wreorder \ -Wsign-promo \ -Wsynth" if test ${enable_developer} = yes; then try_werror=yes try_c_cxx_flags="${try_c_cxx_flags} -g -Werror" else try_werror=no try_c_cxx_flags="${try_c_cxx_flags} -DNDEBUG" fi m4_set_contains([languages], [C], [KYUA_CC_FLAGS(${try_c_cxx_flags} ${try_c_flags})]) m4_set_contains([languages], [C++], [KYUA_CXX_FLAGS(${try_c_cxx_flags} ${try_cxx_flags})]) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/compiler-flags.m40000644000470500017500000001361412271526120021045 0ustar lamontlamontdnl Copyright 2010 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl \file compiler-flags.m4 dnl dnl Macros to check for the existence of compiler flags. The macros in this dnl file support both C and C++. dnl dnl Be aware that, in order to detect a flag accurately, we may need to enable dnl strict warning checking in the compiler (i.e. enable -Werror). Some dnl compilers, e.g. Clang, report unknown -W flags as warnings unless -Werror is dnl selected. This fact would confuse the flag checks below because we would dnl conclude that a flag is valid while in reality it is not. To resolve this, dnl the macros below will pass -Werror to the compiler along with any other flag dnl being checked. dnl Checks for a compiler flag and sets a result variable. dnl dnl This is an auxiliary macro for the implementation of _KYUA_FLAG. dnl dnl \param 1 The shell variable containing the compiler name. Used for dnl reporting purposes only. C or CXX. dnl \param 2 The shell variable containing the flags for the compiler. dnl CFLAGS or CXXFLAGS. dnl \param 3 The name of the compiler flag to check for. dnl \param 4 The shell variable to set with the result of the test. Will dnl be set to 'yes' if the flag is valid, 'no' otherwise. dnl \param 5 Additional, optional flags to pass to the C compiler while dnl looking for the flag in $3. We use this here to pass -Werror to the dnl flag checks (unless we are checking for -Werror already). AC_DEFUN([_KYUA_FLAG_AUX], [ if test x"${$4-unset}" = xunset; then AC_MSG_CHECKING(whether ${$1} supports $3) saved_flags="${$2}" $4=no $2="${$2} $5 $3" AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])], AC_MSG_RESULT(yes) $4=yes, AC_MSG_RESULT(no)) $2="${saved_flags}" fi ]) dnl Checks for a compiler flag and appends it to a result variable. dnl dnl \param 1 The shell variable containing the compiler name. Used for dnl reporting purposes only. CC or CXX. dnl \param 2 The shell variable containing the flags for the compiler. dnl CFLAGS or CXXFLAGS. dnl \param 3 The name of the compiler flag to check for. dnl \param 4 The shell variable to which to append $3 if the flag is valid. AC_DEFUN([_KYUA_FLAG], [ _KYUA_FLAG_AUX([$1], [$2], [-Werror], [kyua_$1_has_werror]) if test "$3" = "-Werror"; then found=${kyua_$1_has_werror} else found=unset if test ${kyua_$1_has_werror} = yes; then _KYUA_FLAG_AUX([$1], [$2], [$3], [found], [-Werror]) else _KYUA_FLAG_AUX([$1], [$2], [$3], [found], []) fi fi if test ${found} = yes; then $4="${$4} $3" fi ]) dnl Checks for a C compiler flag and appends it to a variable. dnl dnl \pre The current language is C. dnl dnl \param 1 The name of the compiler flag to check for. dnl \param 2 The shell variable to which to append $1 if the flag is valid. AC_DEFUN([KYUA_CC_FLAG], [ AC_LANG_ASSERT([C]) _KYUA_FLAG([CC], [CFLAGS], [$1], [$2]) ]) dnl Checks for a C++ compiler flag and appends it to a variable. dnl dnl \pre The current language is C++. dnl dnl \param 1 The name of the compiler flag to check for. dnl \param 2 The shell variable to which to append $1 if the flag is valid. AC_DEFUN([KYUA_CXX_FLAG], [ AC_LANG_ASSERT([C++]) _KYUA_FLAG([CXX], [CXXFLAGS], [$1], [$2]) ]) dnl Checks for a set of C compiler flags and appends them to CFLAGS. dnl dnl The checks are performed independently and only when all the checks are dnl done, the output variable is modified. dnl dnl \param 1 Whitespace-separated list of C flags to check. AC_DEFUN([KYUA_CC_FLAGS], [ AC_LANG_PUSH([C]) valid_cflags= for f in $1; do KYUA_CC_FLAG(${f}, valid_cflags) done if test -n "${valid_cflags}"; then CFLAGS="${CFLAGS} ${valid_cflags}" fi AC_LANG_POP([C]) ]) dnl Checks for a set of C++ compiler flags and appends them to CXXFLAGS. dnl dnl The checks are performed independently and only when all the checks are dnl done, the output variable is modified. dnl dnl \pre The current language is C++. dnl dnl \param 1 Whitespace-separated list of C flags to check. AC_DEFUN([KYUA_CXX_FLAGS], [ AC_LANG_PUSH([C++]) valid_cxxflags= for f in $1; do KYUA_CXX_FLAG(${f}, valid_cxxflags) done if test -n "${valid_cxxflags}"; then CXXFLAGS="${CXXFLAGS} ${valid_cxxflags}" fi AC_LANG_POP([C++]) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-fs.m40000644000470500017500000000543112271526120020032 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_MODULE_FS], [ AC_MSG_CHECKING(whether basename takes a constant pointer) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([#include ], [ const char* s = "/foo/bar/"; (void)::basename(s); ])], AC_MSG_RESULT(yes) AC_DEFINE([HAVE_CONST_BASENAME], [1], [Define to 1 if basename takes a constant pointer]), AC_MSG_RESULT(no)) AC_MSG_CHECKING(whether dirname takes a constant pointer) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([#include ], [ const char* s = "/foo/bar/"; (void)::dirname(s); ])], AC_MSG_RESULT(yes) AC_DEFINE([HAVE_CONST_DIRNAME], [1], [Define to 1 if dirname takes a constant pointer]), AC_MSG_RESULT(no)) AC_CACHE_CHECK( [whether getcwd(NULL, 0) works], [kyua_cv_getcwd_works], [ AC_RUN_IFELSE( [AC_LANG_PROGRAM([#include #include ], [ char *cwd = getcwd(NULL, 0); return (cwd != NULL) ? EXIT_SUCCESS : EXIT_FAILURE; ])], [kyua_cv_getcwd_works=yes], [kyua_cv_getcwd_works=no]) ]) if test x"${kyua_cv_getcwd_works}" = xyes; then AC_DEFINE([HAVE_GETCWD_DYN], [1], [Define to 1 if getcwd(NULL, 0) works]) fi AC_CHECK_FUNCS([unmount]) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-sanity.m40000644000470500017500000000276112271526120020734 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_MODULE_SANITY], [ ATF_CHECK_STD_SNPRINTF ]) bind9-9.9.5.dfsg/unit/atf-src/m4/runtime-tool.m40000644000470500017500000000366512271526120020604 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2009 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ----------------------------------------------------------------------- dnl User-customizable tools used at run-time. dnl ----------------------------------------------------------------------- dnl dnl ATF_RUNTIME_TOOL(varname, description, default) dnl dnl Provides a configuration-time environment variable to select a tool dnl that will be later available through atf-config(1). dnl AC_DEFUN([ATF_RUNTIME_TOOL],[ AC_ARG_VAR([$1], [$2]) test x"${$1-unset}" = x"unset" && $1="$3" AC_SUBST($1) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-defs.m40000644000470500017500000000711112271526120020340 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2008 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_ATTRIBUTE_FORMAT_PRINTF], [ AC_MSG_CHECKING( [whether __attribute__((__format__(__printf__, a, b))) is supported]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([ #include #include static void test_printf(const char *, ...) __attribute__((__format__(__printf__, 1, 2))); static void test_printf(const char *format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); }], [ test_printf("foo %s", "bar"); return 0; ])], [AC_MSG_RESULT(yes) value="__attribute__((__format__(__printf__, a, b)))"], [AC_MSG_RESULT(no) value=""] ) AC_SUBST([ATTRIBUTE_FORMAT_PRINTF], [${value}]) ]) AC_DEFUN([ATF_ATTRIBUTE_NORETURN], [ dnl XXX This check is overly simple and should be fixed. For example, dnl Sun's cc does support the noreturn attribute but CC (the C++ dnl compiler) does not. And in that case, CC just raises a warning dnl during compilation, not an error, which later breaks the dnl atf-c++/t_pkg_config:cxx_build check. AC_CACHE_CHECK( [whether __attribute__((__noreturn__)) is supported], [kyua_cv_attribute_noreturn], [ AC_RUN_IFELSE( [AC_LANG_PROGRAM([], [ #if ((__GNUC__ == 2 && __GNUC_MINOR__ >= 5) || __GNUC__ > 2) return 0; #else return 1; #endif ])], [kyua_cv_attribute_noreturn=yes], [kyua_cv_attribute_noreturn=no]) ]) if test x"${kyua_cv_attribute_noreturn}" = xyes; then value="__attribute__((__noreturn__))" else value="" fi AC_SUBST([ATTRIBUTE_NORETURN], [${value}]) ]) AC_DEFUN([ATF_ATTRIBUTE_UNUSED], [ AC_MSG_CHECKING(whether __attribute__((__unused__)) is supported) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([ static void function(int a __attribute__((__unused__))) { }], [ function(3); return 0; ])], [AC_MSG_RESULT(yes) value="__attribute__((__unused__))"], [AC_MSG_RESULT(no) value=""] ) AC_SUBST([ATTRIBUTE_UNUSED], [${value}]) ]) AC_DEFUN([ATF_MODULE_DEFS], [ ATF_ATTRIBUTE_FORMAT_PRINTF ATF_ATTRIBUTE_NORETURN ATF_ATTRIBUTE_UNUSED ]) bind9-9.9.5.dfsg/unit/atf-src/m4/ltversion.m40000644000470500017500000000127712271526120020170 0ustar lamontlamont# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # Generated from ltversion.in. # serial 3017 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.2.6b]) m4_define([LT_PACKAGE_REVISION], [1.3017]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.2.6b' macro_revision='1.3017' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/lt~obsolete.m40000644000470500017500000001311312271526120020505 0ustar lamontlamont# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 4 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-signals.m40000644000470500017500000000553512271526120021067 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2008 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_MODULE_SIGNALS], [ AC_CACHE_CHECK( [for the last valid signal], [kyua_cv_signal_lastno], [ AC_RUN_IFELSE([AC_LANG_PROGRAM([#include #include #include #include #include #include ], [ int i; FILE *f; i = 0; while (i < 1024) { i++; if (i != SIGKILL && i != SIGSTOP) { struct sigaction sa; int ret; sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; ret = sigaction(i, &sa, NULL); if (ret == -1) { if (errno == EINVAL) { i--; break; } else err(EXIT_FAILURE, "sigaction failed"); } } } if (i == 100) errx(EXIT_FAILURE, "too much signals"); f = fopen("conftest.cnt", "w"); if (f == NULL) err(EXIT_FAILURE, "failed to open file"); fprintf(f, "%d\n", i); fclose(f); return EXIT_SUCCESS; ])], [if test ! -f conftest.cnt; then kyua_cv_signal_lastno=15 else kyua_cv_signal_lastno=$(cat conftest.cnt) rm -f conftest.cnt fi], [kyua_cv_signal_lastno=15]) ]) AC_DEFINE_UNQUOTED([LAST_SIGNO], [${kyua_cv_signal_lastno}], [Define to the last valid signal number]) ]) bind9-9.9.5.dfsg/unit/atf-src/m4/module-env.m40000644000470500017500000000311612271526120020210 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AC_DEFUN([ATF_MODULE_ENV], [ AC_CHECK_FUNCS([putenv setenv unsetenv]) ATF_CHECK_STD_PUTENV ATF_CHECK_STD_SETENV ATF_CHECK_STD_UNSETENV ]) bind9-9.9.5.dfsg/unit/atf-src/m4/libtool.m40000644000470500017500000077317612271526120017625 0ustar lamontlamont# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 56 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl _LT_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\[$]0 --fallback-echo"')dnl " lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` ;; esac _LT_OUTPUT_LIBTOOL_INIT ]) # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) cat >"$CONFIG_LT" <<_LTEOF #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. lt_cl_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2008 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. if test "$no_create" != yes; then lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) fi ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_XSI_SHELLFNS sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(whole_archive_flag_spec, $1)='' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX # ----------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. m4_defun([_LT_PROG_ECHO_BACKSLASH], [_LT_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac ECHO=${lt_ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF [$]* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(lt_ECHO) ]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that does not interpret backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [AC_CHECK_TOOL(AR, ar, false) test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1]) AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line __oline__ "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method == "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC*) # IBM XL 8.0 on PPC _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE(int foo(void) {}, _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' ) LDFLAGS="$save_LDFLAGS" else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then _LT_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], [[If ld is used when linking, flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [fix_srcfile_path], [1], [Fix the shell variable $srcfile for the compiler]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_PROG_CXX # ------------ # Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ # compiler, we have our own version here. m4_defun([_LT_PROG_CXX], [ pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) AC_PROG_CXX if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_CXX dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_CXX], []) # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [AC_REQUIRE([_LT_PROG_CXX])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_PROG_F77 # ------------ # Since AC_PROG_F77 is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_F77], [ pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) AC_PROG_F77 if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_F77 dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_F77], []) # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_REQUIRE([_LT_PROG_F77])dnl AC_LANG_PUSH(Fortran 77) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${F77-"f77"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_PROG_FC # ----------- # Since AC_PROG_FC is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_FC], [ pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) AC_PROG_FC if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_FC dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_FC], []) # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_REQUIRE([_LT_PROG_FC])dnl AC_LANG_PUSH(Fortran) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${FC-"f95"} compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC="$lt_save_CC" ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC= CC=${RC-"windres"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC="$lt_save_CC" ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_XSI_SHELLFNS # --------------------- # Bourne and XSI compatible variants of some useful shell functions. m4_defun([_LT_PROG_XSI_SHELLFNS], [case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $[*] )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } dnl func_dirname_and_basename dnl A portable version of this function is already defined in general.m4sh dnl so there is no need for it here. # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[[^=]]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$[@]"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]+=\$[2]" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]=\$$[1]\$[2]" } _LT_EOF ;; esac ]) bind9-9.9.5.dfsg/unit/atf-src/Atffile0000644000470500017500000000027612271526120016654 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: atf-c tp: atf-c++ tp: atf-sh tp: test-programs tp-glob: atf-config* tp-glob: atf-report* tp-glob: atf-run* bind9-9.9.5.dfsg/unit/atf-src/atf-c++/0002755000470500017500000000000012276444014016502 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-c++/config_test.cpp0000644000470500017500000001644612271526120021515 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "config.hpp" #include "macros.hpp" #include "detail/env.hpp" #include "detail/exceptions.hpp" #include "detail/test_helpers.hpp" static const char *test_value = "env-value"; static struct varnames { const char *lc; const char *uc; bool can_be_empty; } all_vars[] = { { "atf_arch", "ATF_ARCH", false }, { "atf_build_cc", "ATF_BUILD_CC", false }, { "atf_build_cflags", "ATF_BUILD_CFLAGS", true }, { "atf_build_cpp", "ATF_BUILD_CPP", false }, { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true }, { "atf_build_cxx", "ATF_BUILD_CXX", false }, { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true }, { "atf_confdir", "ATF_CONFDIR", false }, { "atf_includedir", "ATF_INCLUDEDIR", false }, { "atf_libdir", "ATF_LIBDIR", false }, { "atf_libexecdir", "ATF_LIBEXECDIR", false }, { "atf_machine", "ATF_MACHINE", false }, { "atf_pkgdatadir", "ATF_PKGDATADIR", false }, { "atf_shell", "ATF_SHELL", false }, { "atf_workdir", "ATF_WORKDIR", false }, { NULL, NULL, false } }; // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace atf { namespace config { void __reinit(void); } } static void set_env_var(const char* name, const char* val) { try { atf::env::set(name, val); } catch (const atf::system_error&) { ATF_FAIL(std::string("set_env_var(") + name + ", " + val + ") failed"); } } static void unset_env_var(const char* name) { try { atf::env::unset(name); } catch (const atf::system_error&) { ATF_FAIL(std::string("unset_env_var(") + name + ") failed"); } } static size_t all_vars_count(void) { size_t count = 0; for (const struct varnames* v = all_vars; v->lc != NULL; v++) count++; return count; } static void unset_all(void) { for (const struct varnames* v = all_vars; v->lc != NULL; v++) unset_env_var(v->uc); } static void compare_one(const char* var, const char* expvalue) { std::cout << "Checking that " << var << " is set to " << expvalue << "\n"; for (const struct varnames* v = all_vars; v->lc != NULL; v++) { if (std::strcmp(v->lc, var) == 0) ATF_REQUIRE_EQ(atf::config::get(v->lc), test_value); else ATF_REQUIRE(atf::config::get(v->lc) != test_value); } } // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(get); ATF_TEST_CASE_HEAD(get) { set_md_var("descr", "Tests the config::get function"); } ATF_TEST_CASE_BODY(get) { // Unset all known environment variables and make sure the built-in // values do not match the bogus value we will use for testing. unset_all(); atf::config::__reinit(); for (const struct varnames* v = all_vars; v->lc != NULL; v++) ATF_REQUIRE(atf::config::get(v->lc) != test_value); // Test the behavior of empty values. for (const struct varnames* v = all_vars; v->lc != NULL; v++) { unset_all(); if (!atf::config::get(v->lc).empty()) { set_env_var(v->uc, ""); atf::config::__reinit(); if (v->can_be_empty) ATF_REQUIRE(atf::config::get(v->lc).empty()); else ATF_REQUIRE(!atf::config::get(v->lc).empty()); } } // Check if the ATF_ARCH variable is recognized. for (const struct varnames* v = all_vars; v->lc != NULL; v++) { unset_all(); set_env_var(v->uc, test_value); atf::config::__reinit(); compare_one(v->lc, test_value); } } ATF_TEST_CASE(get_all); ATF_TEST_CASE_HEAD(get_all) { set_md_var("descr", "Tests the config::get_all function"); } ATF_TEST_CASE_BODY(get_all) { atf::config::__reinit(); // Check that the valid variables, and only those, are returned. std::map< std::string, std::string > vars = atf::config::get_all(); ATF_REQUIRE_EQ(vars.size(), all_vars_count()); for (const struct varnames* v = all_vars; v->lc != NULL; v++) ATF_REQUIRE(vars.find(v->lc) != vars.end()); } ATF_TEST_CASE(has); ATF_TEST_CASE_HEAD(has) { set_md_var("descr", "Tests the config::has function"); } ATF_TEST_CASE_BODY(has) { atf::config::__reinit(); // Check for all the variables that must exist. for (const struct varnames* v = all_vars; v->lc != NULL; v++) ATF_REQUIRE(atf::config::has(v->lc)); // Same as above, but using uppercase (which is incorrect). for (const struct varnames* v = all_vars; v->lc != NULL; v++) ATF_REQUIRE(!atf::config::has(v->uc)); // Check for some other variables that cannot exist. ATF_REQUIRE(!atf::config::has("foo")); ATF_REQUIRE(!atf::config::has("BAR")); ATF_REQUIRE(!atf::config::has("atf_foo")); ATF_REQUIRE(!atf::config::has("ATF_BAR")); ATF_REQUIRE(!atf::config::has("atf_shel")); ATF_REQUIRE(!atf::config::has("atf_shells")); } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/config.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, has); ATF_ADD_TEST_CASE(tcs, get); ATF_ADD_TEST_CASE(tcs, get_all); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/atf-c++.m40000644000470500017500000000442612271526120020062 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright 2011 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ATF_CHECK_CXX([version-spec]) dnl dnl Checks if atf-c++ is present. If version-spec is provided, ensures that dnl the installed version of atf-sh matches the required version. This dnl argument must be something like '>= 0.14' and accepts any version dnl specification supported by pkg-config. dnl dnl Defines and substitutes ATF_CXX_CFLAGS and ATF_CXX_LIBS with the compiler dnl and linker flags need to build against atf-c++. AC_DEFUN([ATF_CHECK_CXX], [ spec="atf-c++[]m4_default_nblank([ $1], [])" _ATF_CHECK_ARG_WITH( [PKG_CHECK_MODULES([ATF_CXX], [${spec}], [found=yes found_atf_cxx=yes], [found=no])], [required ${spec} not found]) ]) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/noncopyable.hpp0000644000470500017500000000430712271526120021520 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_NONCOPYABLE_HPP_) #define _ATF_CXX_NONCOPYABLE_HPP_ namespace atf { // ------------------------------------------------------------------------ // The "noncopyable" class. // ------------------------------------------------------------------------ class noncopyable { // The class cannot be empty; otherwise we get ABI-stability warnings // during the build, which will break it due to strict checking. int m_noncopyable_dummy; noncopyable(const noncopyable& nc); noncopyable& operator=(const noncopyable& nc); protected: // Explicitly needed to provide some non-private functions. Otherwise // we also get some warnings during the build. noncopyable(void) {} ~noncopyable(void) {} }; } // namespace atf #endif // !defined(_ATF_CXX_NONCOPYABLE_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/utils.cpp0000644000470500017500000000601512271526120020340 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include "atf-c/utils.h" } #include #include #include "utils.hpp" void atf::utils::cat_file(const std::string& path, const std::string& prefix) { atf_utils_cat_file(path.c_str(), prefix.c_str()); } void atf::utils::copy_file(const std::string& source, const std::string& destination) { atf_utils_copy_file(source.c_str(), destination.c_str()); } bool atf::utils::compare_file(const std::string& path, const std::string& contents) { return atf_utils_compare_file(path.c_str(), contents.c_str()); } void atf::utils::create_file(const std::string& path, const std::string& contents) { atf_utils_create_file(path.c_str(), "%s", contents.c_str()); } bool atf::utils::file_exists(const std::string& path) { return atf_utils_file_exists(path.c_str()); } pid_t atf::utils::fork(void) { std::cout.flush(); std::cerr.flush(); return atf_utils_fork(); } bool atf::utils::grep_file(const std::string& regex, const std::string& path) { return atf_utils_grep_file("%s", path.c_str(), regex.c_str()); } bool atf::utils::grep_string(const std::string& regex, const std::string& str) { return atf_utils_grep_string("%s", str.c_str(), regex.c_str()); } void atf::utils::redirect(const int fd, const std::string& path) { if (fd == STDOUT_FILENO) std::cout.flush(); else if (fd == STDERR_FILENO) std::cerr.flush(); atf_utils_redirect(fd, path.c_str()); } void atf::utils::wait(const pid_t pid, const int exitstatus, const std::string& expout, const std::string& experr) { atf_utils_wait(pid, exitstatus, expout.c_str(), experr.c_str()); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/tests_test.cpp0000644000470500017500000001263012271526120021401 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include } #include #include #include "macros.hpp" #include "detail/parser.hpp" #include "detail/test_helpers.hpp" // ------------------------------------------------------------------------ // Tests for the "atf_tp_writer" class. // ------------------------------------------------------------------------ static void print_indented(const std::string& str) { std::vector< std::string > ws = atf::text::split(str, "\n"); for (std::vector< std::string >::const_iterator iter = ws.begin(); iter != ws.end(); iter++) std::cout << ">>" << *iter << "<<\n"; } // XXX Should this string handling and verbosity level be part of the // ATF_REQUIRE_EQ macro? It may be hard to predict sometimes that a // string can have newlines in it, and so the error message generated // at the moment will be bogus if there are some. static void check_equal(const atf::tests::tc& tc, const std::string& str, const std::string& exp) { if (str != exp) { std::cout << "String equality check failed.\n" "Adding >> and << to delimit the string boundaries below.\n"; std::cout << "GOT:\n"; print_indented(str); std::cout << "EXPECTED:\n"; print_indented(exp); tc.fail("Constructed string differs from the expected one"); } } ATF_TEST_CASE(atf_tp_writer); ATF_TEST_CASE_HEAD(atf_tp_writer) { set_md_var("descr", "Verifies the application/X-atf-tp writer"); } ATF_TEST_CASE_BODY(atf_tp_writer) { std::ostringstream expss; std::ostringstream ss; #define RESET \ expss.str(""); \ ss.str("") #define CHECK \ check_equal(*this, ss.str(), expss.str()) { RESET; atf::tests::detail::atf_tp_writer w(ss); expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n"; CHECK; } { RESET; atf::tests::detail::atf_tp_writer w(ss); expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n"; CHECK; w.start_tc("test1"); expss << "ident: test1\n"; CHECK; w.end_tc(); CHECK; } { RESET; atf::tests::detail::atf_tp_writer w(ss); expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n"; CHECK; w.start_tc("test1"); expss << "ident: test1\n"; CHECK; w.end_tc(); CHECK; w.start_tc("test2"); expss << "\nident: test2\n"; CHECK; w.end_tc(); CHECK; } { RESET; atf::tests::detail::atf_tp_writer w(ss); expss << "Content-Type: application/X-atf-tp; version=\"1\"\n\n"; CHECK; w.start_tc("test1"); expss << "ident: test1\n"; CHECK; w.tc_meta_data("descr", "the description"); expss << "descr: the description\n"; CHECK; w.end_tc(); CHECK; w.start_tc("test2"); expss << "\nident: test2\n"; CHECK; w.tc_meta_data("descr", "second test case"); expss << "descr: second test case\n"; CHECK; w.tc_meta_data("require.progs", "/bin/cp"); expss << "require.progs: /bin/cp\n"; CHECK; w.tc_meta_data("X-custom", "foo bar baz"); expss << "X-custom: foo bar baz\n"; CHECK; w.end_tc(); CHECK; } #undef CHECK #undef RESET } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/tests.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add tests for the "atf_tp_writer" class. ATF_ADD_TEST_CASE(tcs, atf_tp_writer); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/check.cpp0000644000470500017500000001046712271526120020263 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include extern "C" { #include "atf-c/build.h" #include "atf-c/error.h" } #include "check.hpp" #include "detail/exceptions.hpp" #include "detail/process.hpp" #include "detail/sanity.hpp" namespace impl = atf::check; #define IMPL_NAME "atf::check" // ------------------------------------------------------------------------ // The "check_result" class. // ------------------------------------------------------------------------ impl::check_result::check_result(const atf_check_result_t* result) { std::memcpy(&m_result, result, sizeof(m_result)); } impl::check_result::~check_result(void) { atf_check_result_fini(&m_result); } bool impl::check_result::exited(void) const { return atf_check_result_exited(&m_result); } int impl::check_result::exitcode(void) const { PRE(exited()); return atf_check_result_exitcode(&m_result); } bool impl::check_result::signaled(void) const { return atf_check_result_signaled(&m_result); } int impl::check_result::termsig(void) const { PRE(signaled()); return atf_check_result_termsig(&m_result); } const std::string impl::check_result::stdout_path(void) const { return atf_check_result_stdout(&m_result); } const std::string impl::check_result::stderr_path(void) const { return atf_check_result_stderr(&m_result); } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ bool impl::build_c_o(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { bool success; atf_error_t err = atf_check_build_c_o(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &success); if (atf_is_error(err)) throw_atf_error(err); return success; } bool impl::build_cpp(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { bool success; atf_error_t err = atf_check_build_cpp(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &success); if (atf_is_error(err)) throw_atf_error(err); return success; } bool impl::build_cxx_o(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { bool success; atf_error_t err = atf_check_build_cxx_o(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &success); if (atf_is_error(err)) throw_atf_error(err); return success; } std::auto_ptr< impl::check_result > impl::exec(const atf::process::argv_array& argva) { atf_check_result_t result; atf_error_t err = atf_check_exec_array(argva.exec_argv(), &result); if (atf_is_error(err)) throw_atf_error(err); return std::auto_ptr< impl::check_result >(new impl::check_result(&result)); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/tests.cpp0000644000470500017500000004160312271526120020344 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include #include #include } #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include "atf-c/error.h" #include "atf-c/tc.h" #include "atf-c/utils.h" } #include "noncopyable.hpp" #include "tests.hpp" #include "detail/application.hpp" #include "detail/auto_array.hpp" #include "detail/env.hpp" #include "detail/exceptions.hpp" #include "detail/fs.hpp" #include "detail/parser.hpp" #include "detail/sanity.hpp" #include "detail/text.hpp" namespace impl = atf::tests; namespace detail = atf::tests::detail; #define IMPL_NAME "atf::tests" // ------------------------------------------------------------------------ // The "atf_tp_writer" class. // ------------------------------------------------------------------------ detail::atf_tp_writer::atf_tp_writer(std::ostream& os) : m_os(os), m_is_first(true) { atf::parser::headers_map hm; atf::parser::attrs_map ct_attrs; ct_attrs["version"] = "1"; hm["Content-Type"] = atf::parser::header_entry("Content-Type", "application/X-atf-tp", ct_attrs); atf::parser::write_headers(hm, m_os); } void detail::atf_tp_writer::start_tc(const std::string& ident) { if (!m_is_first) m_os << "\n"; m_os << "ident: " << ident << "\n"; m_os.flush(); } void detail::atf_tp_writer::end_tc(void) { if (m_is_first) m_is_first = false; } void detail::atf_tp_writer::tc_meta_data(const std::string& name, const std::string& value) { PRE(name != "ident"); m_os << name << ": " << value << "\n"; m_os.flush(); } // ------------------------------------------------------------------------ // Free helper functions. // ------------------------------------------------------------------------ bool detail::match(const std::string& regexp, const std::string& str) { return atf::text::match(str, regexp); } // ------------------------------------------------------------------------ // The "tc" class. // ------------------------------------------------------------------------ static std::map< atf_tc_t*, impl::tc* > wraps; static std::map< const atf_tc_t*, const impl::tc* > cwraps; struct impl::tc_impl : atf::noncopyable { std::string m_ident; atf_tc_t m_tc; bool m_has_cleanup; tc_impl(const std::string& ident, const bool has_cleanup) : m_ident(ident), m_has_cleanup(has_cleanup) { } static void wrap_head(atf_tc_t *tc) { std::map< atf_tc_t*, impl::tc* >::iterator iter = wraps.find(tc); INV(iter != wraps.end()); (*iter).second->head(); } static void wrap_body(const atf_tc_t *tc) { std::map< const atf_tc_t*, const impl::tc* >::const_iterator iter = cwraps.find(tc); INV(iter != cwraps.end()); try { (*iter).second->body(); } catch (const std::exception& e) { (*iter).second->fail("Caught unhandled exception: " + std::string( e.what())); } catch (...) { (*iter).second->fail("Caught unknown exception"); } } static void wrap_cleanup(const atf_tc_t *tc) { std::map< const atf_tc_t*, const impl::tc* >::const_iterator iter = cwraps.find(tc); INV(iter != cwraps.end()); (*iter).second->cleanup(); } }; impl::tc::tc(const std::string& ident, const bool has_cleanup) : pimpl(new tc_impl(ident, has_cleanup)) { } impl::tc::~tc(void) { cwraps.erase(&pimpl->m_tc); wraps.erase(&pimpl->m_tc); atf_tc_fini(&pimpl->m_tc); } void impl::tc::init(const vars_map& config) { atf_error_t err; auto_array< const char * > array(new const char*[(config.size() * 2) + 1]); const char **ptr = array.get(); for (vars_map::const_iterator iter = config.begin(); iter != config.end(); iter++) { *ptr = (*iter).first.c_str(); *(ptr + 1) = (*iter).second.c_str(); ptr += 2; } *ptr = NULL; wraps[&pimpl->m_tc] = this; cwraps[&pimpl->m_tc] = this; err = atf_tc_init(&pimpl->m_tc, pimpl->m_ident.c_str(), pimpl->wrap_head, pimpl->wrap_body, pimpl->m_has_cleanup ? pimpl->wrap_cleanup : NULL, array.get()); if (atf_is_error(err)) throw_atf_error(err); } bool impl::tc::has_config_var(const std::string& var) const { return atf_tc_has_config_var(&pimpl->m_tc, var.c_str()); } bool impl::tc::has_md_var(const std::string& var) const { return atf_tc_has_md_var(&pimpl->m_tc, var.c_str()); } const std::string impl::tc::get_config_var(const std::string& var) const { return atf_tc_get_config_var(&pimpl->m_tc, var.c_str()); } const std::string impl::tc::get_config_var(const std::string& var, const std::string& defval) const { return atf_tc_get_config_var_wd(&pimpl->m_tc, var.c_str(), defval.c_str()); } const std::string impl::tc::get_md_var(const std::string& var) const { return atf_tc_get_md_var(&pimpl->m_tc, var.c_str()); } const impl::vars_map impl::tc::get_md_vars(void) const { vars_map vars; char **array = atf_tc_get_md_vars(&pimpl->m_tc); try { char **ptr; for (ptr = array; *ptr != NULL; ptr += 2) vars[*ptr] = *(ptr + 1); } catch (...) { atf_utils_free_charpp(array); throw; } return vars; } void impl::tc::set_md_var(const std::string& var, const std::string& val) { atf_error_t err = atf_tc_set_md_var(&pimpl->m_tc, var.c_str(), val.c_str()); if (atf_is_error(err)) throw_atf_error(err); } void impl::tc::run(const std::string& resfile) const { atf_error_t err = atf_tc_run(&pimpl->m_tc, resfile.c_str()); if (atf_is_error(err)) throw_atf_error(err); } void impl::tc::run_cleanup(void) const { atf_error_t err = atf_tc_cleanup(&pimpl->m_tc); if (atf_is_error(err)) throw_atf_error(err); } void impl::tc::head(void) { } void impl::tc::cleanup(void) const { } void impl::tc::require_prog(const std::string& prog) const { atf_tc_require_prog(prog.c_str()); } void impl::tc::pass(void) { atf_tc_pass(); } void impl::tc::fail(const std::string& reason) { atf_tc_fail("%s", reason.c_str()); } void impl::tc::fail_nonfatal(const std::string& reason) { atf_tc_fail_nonfatal("%s", reason.c_str()); } void impl::tc::skip(const std::string& reason) { atf_tc_skip("%s", reason.c_str()); } void impl::tc::check_errno(const char* file, const int line, const int exp_errno, const char* expr_str, const bool result) { atf_tc_check_errno(file, line, exp_errno, expr_str, result); } void impl::tc::require_errno(const char* file, const int line, const int exp_errno, const char* expr_str, const bool result) { atf_tc_require_errno(file, line, exp_errno, expr_str, result); } void impl::tc::expect_pass(void) { atf_tc_expect_pass(); } void impl::tc::expect_fail(const std::string& reason) { atf_tc_expect_fail("%s", reason.c_str()); } void impl::tc::expect_exit(const int exitcode, const std::string& reason) { atf_tc_expect_exit(exitcode, "%s", reason.c_str()); } void impl::tc::expect_signal(const int signo, const std::string& reason) { atf_tc_expect_signal(signo, "%s", reason.c_str()); } void impl::tc::expect_death(const std::string& reason) { atf_tc_expect_death("%s", reason.c_str()); } void impl::tc::expect_timeout(const std::string& reason) { atf_tc_expect_timeout("%s", reason.c_str()); } // ------------------------------------------------------------------------ // The "tp" class. // ------------------------------------------------------------------------ class tp : public atf::application::app { public: typedef std::vector< impl::tc * > tc_vector; private: static const char* m_description; bool m_lflag; atf::fs::path m_resfile; std::string m_srcdir_arg; atf::fs::path m_srcdir; atf::tests::vars_map m_vars; std::string specific_args(void) const; options_set specific_options(void) const; void process_option(int, const char*); void (*m_add_tcs)(tc_vector&); tc_vector m_tcs; void parse_vflag(const std::string&); void handle_srcdir(void); tc_vector init_tcs(void); enum tc_part { BODY, CLEANUP, }; void list_tcs(void); impl::tc* find_tc(tc_vector, const std::string&); static std::pair< std::string, tc_part > process_tcarg(const std::string&); int run_tc(const std::string&); public: tp(void (*)(tc_vector&)); ~tp(void); int main(void); }; const char* tp::m_description = "This is an independent atf test program."; tp::tp(void (*add_tcs)(tc_vector&)) : app(m_description, "atf-test-program(1)", "atf(7)", false), m_lflag(false), m_resfile("/dev/stdout"), m_srcdir("."), m_add_tcs(add_tcs) { } tp::~tp(void) { for (tc_vector::iterator iter = m_tcs.begin(); iter != m_tcs.end(); iter++) { impl::tc* tc = *iter; delete tc; } } std::string tp::specific_args(void) const { return "test_case"; } tp::options_set tp::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('l', "", "List test cases and their purpose")); opts.insert(option('r', "resfile", "The file to which the test program " "will write the results of the " "executed test case")); opts.insert(option('s', "srcdir", "Directory where the test's data " "files are located")); opts.insert(option('v', "var=value", "Sets the configuration variable " "`var' to `value'")); return opts; } void tp::process_option(int ch, const char* arg) { switch (ch) { case 'l': m_lflag = true; break; case 'r': m_resfile = atf::fs::path(arg); break; case 's': m_srcdir_arg = arg; break; case 'v': parse_vflag(arg); break; default: UNREACHABLE; } } void tp::parse_vflag(const std::string& str) { if (str.empty()) throw std::runtime_error("-v requires a non-empty argument"); std::vector< std::string > ws = atf::text::split(str, "="); if (ws.size() == 1 && str[str.length() - 1] == '=') { m_vars[ws[0]] = ""; } else { if (ws.size() != 2) throw std::runtime_error("-v requires an argument of the form " "var=value"); m_vars[ws[0]] = ws[1]; } } void tp::handle_srcdir(void) { if (m_srcdir_arg.empty()) { m_srcdir = atf::fs::path(m_argv0).branch_path(); if (m_srcdir.leaf_name() == ".libs") m_srcdir = m_srcdir.branch_path(); } else m_srcdir = atf::fs::path(m_srcdir_arg); if (!atf::fs::exists(m_srcdir / m_prog_name)) throw std::runtime_error("Cannot find the test program in the " "source directory `" + m_srcdir.str() + "'"); if (!m_srcdir.is_absolute()) m_srcdir = m_srcdir.to_absolute(); m_vars["srcdir"] = m_srcdir.str(); } tp::tc_vector tp::init_tcs(void) { m_add_tcs(m_tcs); for (tc_vector::iterator iter = m_tcs.begin(); iter != m_tcs.end(); iter++) { impl::tc* tc = *iter; tc->init(m_vars); } return m_tcs; } // // An auxiliary unary predicate that compares the given test case's // identifier to the identifier stored in it. // class tc_equal_to_ident { const std::string& m_ident; public: tc_equal_to_ident(const std::string& i) : m_ident(i) { } bool operator()(const impl::tc* tc) { return tc->get_md_var("ident") == m_ident; } }; void tp::list_tcs(void) { tc_vector tcs = init_tcs(); detail::atf_tp_writer writer(std::cout); for (tc_vector::const_iterator iter = tcs.begin(); iter != tcs.end(); iter++) { const impl::vars_map vars = (*iter)->get_md_vars(); { impl::vars_map::const_iterator iter2 = vars.find("ident"); INV(iter2 != vars.end()); writer.start_tc((*iter2).second); } for (impl::vars_map::const_iterator iter2 = vars.begin(); iter2 != vars.end(); iter2++) { const std::string& key = (*iter2).first; if (key != "ident") writer.tc_meta_data(key, (*iter2).second); } writer.end_tc(); } } impl::tc* tp::find_tc(tc_vector tcs, const std::string& name) { std::vector< std::string > ids; for (tc_vector::iterator iter = tcs.begin(); iter != tcs.end(); iter++) { impl::tc* tc = *iter; if (tc->get_md_var("ident") == name) return tc; } throw atf::application::usage_error("Unknown test case `%s'", name.c_str()); } std::pair< std::string, tp::tc_part > tp::process_tcarg(const std::string& tcarg) { const std::string::size_type pos = tcarg.find(':'); if (pos == std::string::npos) { return std::make_pair(tcarg, BODY); } else { const std::string tcname = tcarg.substr(0, pos); const std::string partname = tcarg.substr(pos + 1); if (partname == "body") return std::make_pair(tcname, BODY); else if (partname == "cleanup") return std::make_pair(tcname, CLEANUP); else { using atf::application::usage_error; throw usage_error("Invalid test case part `%s'", partname.c_str()); } } } int tp::run_tc(const std::string& tcarg) { const std::pair< std::string, tc_part > fields = process_tcarg(tcarg); impl::tc* tc = find_tc(init_tcs(), fields.first); if (!atf::env::has("__RUNNING_INSIDE_ATF_RUN") || atf::env::get( "__RUNNING_INSIDE_ATF_RUN") != "internal-yes-value") { std::cerr << m_prog_name << ": WARNING: Running test cases without " "atf-run(1) is unsupported\n"; std::cerr << m_prog_name << ": WARNING: No isolation nor timeout " "control is being applied; you may get unexpected failures; see " "atf-test-case(4)\n"; } try { switch (fields.second) { case BODY: tc->run(m_resfile.str()); break; case CLEANUP: tc->run_cleanup(); break; default: UNREACHABLE; } return EXIT_SUCCESS; } catch (const std::runtime_error& e) { std::cerr << "ERROR: " << e.what() << "\n"; return EXIT_FAILURE; } } int tp::main(void) { using atf::application::usage_error; int errcode; handle_srcdir(); if (m_lflag) { if (m_argc > 0) throw usage_error("Cannot provide test case names with -l"); list_tcs(); errcode = EXIT_SUCCESS; } else { if (m_argc == 0) throw usage_error("Must provide a test case name"); else if (m_argc > 1) throw usage_error("Cannot provide more than one test case name"); INV(m_argc == 1); errcode = run_tc(m_argv[0]); } return errcode; } namespace atf { namespace tests { int run_tp(int, char* const*, void (*)(tp::tc_vector&)); } } int impl::run_tp(int argc, char* const* argv, void (*add_tcs)(tp::tc_vector&)) { return tp(add_tcs).run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/atf_c++_test.cpp0000644000470500017500000000370612271526120021445 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "macros.hpp" #include "detail/test_helpers.hpp" // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/check.hpp0000644000470500017500000001000712271526120020256 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_CHECK_HPP_) #define _ATF_CXX_CHECK_HPP_ extern "C" { #include } #include #include #include #include #include namespace atf { namespace process { class argv_array; } // namespace process namespace check { // ------------------------------------------------------------------------ // The "check_result" class. // ------------------------------------------------------------------------ //! //! \brief A class that contains results of executed command. //! //! The check_result class holds information about results //! of executing arbitrary command and manages files containing //! its output. //! class check_result : noncopyable { //! //! \brief Internal representation of a result. //! atf_check_result_t m_result; //! //! \brief Constructs a results object and grabs ownership of the //! parameter passed in. //! check_result(const atf_check_result_t* result); friend check_result test_constructor(const char* const*); friend std::auto_ptr< check_result > exec(const atf::process::argv_array&); public: //! //! \brief Destroys object and removes all managed files. //! ~check_result(void); //! //! \brief Returns whether the command exited correctly or not. //! bool exited(void) const; //! //! \brief Returns command's exit status. //! int exitcode(void) const; //! //! \brief Returns whether the command received a signal or not. //! bool signaled(void) const; //! //! \brief Returns the signal that terminated the command. //! int termsig(void) const; //! //! \brief Returns the path to file contaning command's stdout. //! const std::string stdout_path(void) const; //! //! \brief Returns the path to file contaning command's stderr. //! const std::string stderr_path(void) const; }; // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ bool build_c_o(const std::string&, const std::string&, const atf::process::argv_array&); bool build_cpp(const std::string&, const std::string&, const atf::process::argv_array&); bool build_cxx_o(const std::string&, const std::string&, const atf::process::argv_array&); std::auto_ptr< check_result > exec(const atf::process::argv_array&); // Useful for testing only. check_result test_constructor(void); } // namespace check } // namespace atf #endif // !defined(_ATF_CXX_CHECK_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/Atffile0000644000470500017500000000033312271526120017766 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: detail tp: atf_c++_test tp: build_test tp: check_test tp: config_test tp: macros_test tp: pkg_config_test tp: tests_test tp: utils_test bind9-9.9.5.dfsg/unit/atf-src/atf-c++/pkg_config_test.sh0000644000470500017500000001074612271526120022203 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2008 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The following tests assume that the atfc++.pc file is installed in a # directory that is known by pkg-config. Otherwise they will fail, # and you will be required to adjust PKG_CONFIG_PATH accordingly. # # It would be possible to bypass this requirement by setting the path # explicitly during the tests, but then this would not do a real check # to ensure that the installation is working. require_pc() { pkg-config ${1} || atf_fail "pkg-config could not locate ${1}.pc;" \ "maybe need to set PKG_CONFIG_PATH?" } check_version() { atf_check -s eq:0 -o save:stdout -e empty -x \ "atf-version | head -n 1 | cut -d ' ' -f 4" ver1=$(cat stdout) echo "Version reported by atf-version: ${ver1}" atf_check -s eq:0 -o save:stdout -e empty pkg-config --modversion "${1}" ver2=$(cat stdout) echo "Version reported by pkg-config: ${ver2}" atf_check_equal ${ver1} ${ver2} } atf_test_case version version_head() { atf_set "descr" "Checks that the version in atf-c++ is correct" atf_set "require.progs" "pkg-config" } version_body() { require_pc "atf-c++" check_version "atf-c++" } atf_test_case build build_head() { atf_set "descr" "Checks that a test program can be built against" \ "the C++ library based on the pkg-config information" atf_set "require.progs" "pkg-config" } build_body() { require_pc "atf-c++" atf_check -s eq:0 -o save:stdout -e empty \ pkg-config --variable=cxx atf-c++ cxx=$(cat stdout) echo "Compiler is: ${cxx}" atf_require_prog ${cxx} cat >tp.cpp < #include ATF_TEST_CASE(tc); ATF_TEST_CASE_HEAD(tc) { set_md_var("descr", "A test case"); } ATF_TEST_CASE_BODY(tc) { std::cout << "Running\n"; } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, tc); } EOF atf_check -s eq:0 -o save:stdout -e empty pkg-config --cflags atf-c++ cxxflags=$(cat stdout) echo "CXXFLAGS are: ${cxxflags}" atf_check -s eq:0 -o save:stdout -e empty \ pkg-config --libs-only-L --libs-only-other atf-c++ ldflags=$(cat stdout) atf_check -s eq:0 -o save:stdout -e empty \ pkg-config --libs-only-l atf-c++ libs=$(cat stdout) echo "LDFLAGS are: ${ldflags}" echo "LIBS are: ${libs}" atf_check -s eq:0 -o empty -e empty ${cxx} ${cxxflags} -o tp.o -c tp.cpp atf_check -s eq:0 -o empty -e empty ${cxx} ${ldflags} -o tp tp.o ${libs} libpath= for f in ${ldflags}; do case ${f} in -L*) dir=$(echo ${f} | sed -e 's,^-L,,') if [ -z "${libpath}" ]; then libpath="${dir}" else libpath="${libpath}:${dir}" fi ;; *) ;; esac done atf_check -s eq:0 -o empty -e empty test -x tp atf_check -s eq:0 -o match:'Running' -e empty -x \ "LD_LIBRARY_PATH=${libpath} ./tp tc" } atf_init_test_cases() { atf_add_test_case version atf_add_test_case build } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-c++/tests.hpp0000644000470500017500000001014312271526120020344 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_TESTS_HPP_) #define _ATF_CXX_TESTS_HPP_ #include #include #include extern "C" { #include } #include namespace atf { namespace tests { namespace detail { class atf_tp_writer { std::ostream& m_os; bool m_is_first; public: atf_tp_writer(std::ostream&); void start_tc(const std::string&); void end_tc(void); void tc_meta_data(const std::string&, const std::string&); }; bool match(const std::string&, const std::string&); } // namespace // ------------------------------------------------------------------------ // The "vars_map" class. // ------------------------------------------------------------------------ typedef std::map< std::string, std::string > vars_map; // ------------------------------------------------------------------------ // The "tc" class. // ------------------------------------------------------------------------ struct tc_impl; class tc : noncopyable { std::auto_ptr< tc_impl > pimpl; protected: virtual void head(void); virtual void body(void) const = 0; virtual void cleanup(void) const; void require_prog(const std::string&) const; friend struct tc_impl; public: tc(const std::string&, const bool); virtual ~tc(void); void init(const vars_map&); const std::string get_config_var(const std::string&) const; const std::string get_config_var(const std::string&, const std::string&) const; const std::string get_md_var(const std::string&) const; const vars_map get_md_vars(void) const; bool has_config_var(const std::string&) const; bool has_md_var(const std::string&) const; void set_md_var(const std::string&, const std::string&); void run(const std::string&) const; void run_cleanup(void) const; // To be called from the child process only. static void pass(void) ATF_DEFS_ATTRIBUTE_NORETURN; static void fail(const std::string&) ATF_DEFS_ATTRIBUTE_NORETURN; static void fail_nonfatal(const std::string&); static void skip(const std::string&) ATF_DEFS_ATTRIBUTE_NORETURN; static void check_errno(const char*, const int, const int, const char*, const bool); static void require_errno(const char*, const int, const int, const char*, const bool); static void expect_pass(void); static void expect_fail(const std::string&); static void expect_exit(const int, const std::string&); static void expect_signal(const int, const std::string&); static void expect_death(const std::string&); static void expect_timeout(const std::string&); }; } // namespace tests } // namespace atf #endif // !defined(_ATF_CXX_TESTS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/utils_test.cpp0000644000470500017500000003723412271526120021406 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include #include } #include #include #include #include #include #include "macros.hpp" #include "utils.hpp" #include "detail/test_helpers.hpp" static std::string read_file(const char *path) { char buffer[1024]; const int fd = open(path, O_RDONLY); if (fd == -1) ATF_FAIL("Cannot open " + std::string(path)); const ssize_t length = read(fd, buffer, sizeof(buffer) - 1); close(fd); ATF_REQUIRE(length != -1); if (length == sizeof(buffer) - 1) ATF_FAIL("Internal buffer not long enough to read temporary file"); ((char *)buffer)[length] = '\0'; return buffer; } // ------------------------------------------------------------------------ // Tests cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE_WITHOUT_HEAD(cat_file__empty); ATF_TEST_CASE_BODY(cat_file__empty) { atf::utils::create_file("file.txt", ""); atf::utils::redirect(STDOUT_FILENO, "captured.txt"); atf::utils::cat_file("file.txt", "PREFIX"); std::cout.flush(); close(STDOUT_FILENO); ATF_REQUIRE_EQ("", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(cat_file__one_line); ATF_TEST_CASE_BODY(cat_file__one_line) { atf::utils::create_file("file.txt", "This is a single line\n"); atf::utils::redirect(STDOUT_FILENO, "captured.txt"); atf::utils::cat_file("file.txt", "PREFIX"); std::cout.flush(); close(STDOUT_FILENO); ATF_REQUIRE_EQ("PREFIXThis is a single line\n", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(cat_file__several_lines); ATF_TEST_CASE_BODY(cat_file__several_lines) { atf::utils::create_file("file.txt", "First\nSecond line\nAnd third\n"); atf::utils::redirect(STDOUT_FILENO, "captured.txt"); atf::utils::cat_file("file.txt", ">"); std::cout.flush(); close(STDOUT_FILENO); ATF_REQUIRE_EQ(">First\n>Second line\n>And third\n", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(cat_file__no_newline_eof); ATF_TEST_CASE_BODY(cat_file__no_newline_eof) { atf::utils::create_file("file.txt", "Foo\n bar baz"); atf::utils::redirect(STDOUT_FILENO, "captured.txt"); atf::utils::cat_file("file.txt", "PREFIX"); std::cout.flush(); close(STDOUT_FILENO); ATF_REQUIRE_EQ("PREFIXFoo\nPREFIX bar baz", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__empty__match); ATF_TEST_CASE_BODY(compare_file__empty__match) { atf::utils::create_file("test.txt", ""); ATF_REQUIRE(atf::utils::compare_file("test.txt", "")); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__empty__not_match); ATF_TEST_CASE_BODY(compare_file__empty__not_match) { atf::utils::create_file("test.txt", ""); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "foo")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", " ")); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__short__match); ATF_TEST_CASE_BODY(compare_file__short__match) { atf::utils::create_file("test.txt", "this is a short file"); ATF_REQUIRE(atf::utils::compare_file("test.txt", "this is a short file")); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__short__not_match); ATF_TEST_CASE_BODY(compare_file__short__not_match) { atf::utils::create_file("test.txt", "this is a short file"); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a Short file")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a short fil")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "this is a short file ")); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__long__match); ATF_TEST_CASE_BODY(compare_file__long__match) { char long_contents[3456]; size_t i = 0; for (; i < sizeof(long_contents) - 1; i++) long_contents[i] = '0' + (i % 10); long_contents[i] = '\0'; atf::utils::create_file("test.txt", long_contents); ATF_REQUIRE(atf::utils::compare_file("test.txt", long_contents)); } ATF_TEST_CASE_WITHOUT_HEAD(compare_file__long__not_match); ATF_TEST_CASE_BODY(compare_file__long__not_match) { char long_contents[3456]; size_t i = 0; for (; i < sizeof(long_contents) - 1; i++) long_contents[i] = '0' + (i % 10); long_contents[i] = '\0'; atf::utils::create_file("test.txt", long_contents); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "\n")); ATF_REQUIRE(!atf::utils::compare_file("test.txt", "0123456789")); long_contents[i - 1] = 'Z'; ATF_REQUIRE(!atf::utils::compare_file("test.txt", long_contents)); } ATF_TEST_CASE_WITHOUT_HEAD(copy_file__empty); ATF_TEST_CASE_BODY(copy_file__empty) { atf::utils::create_file("src.txt", ""); ATF_REQUIRE(chmod("src.txt", 0520) != -1); atf::utils::copy_file("src.txt", "dest.txt"); ATF_REQUIRE(atf::utils::compare_file("dest.txt", "")); struct stat sb; ATF_REQUIRE(stat("dest.txt", &sb) != -1); ATF_REQUIRE_EQ(0520, sb.st_mode & 0xfff); } ATF_TEST_CASE_WITHOUT_HEAD(copy_file__some_contents); ATF_TEST_CASE_BODY(copy_file__some_contents) { atf::utils::create_file("src.txt", "This is a\ntest file\n"); atf::utils::copy_file("src.txt", "dest.txt"); ATF_REQUIRE(atf::utils::compare_file("dest.txt", "This is a\ntest file\n")); } ATF_TEST_CASE_WITHOUT_HEAD(create_file); ATF_TEST_CASE_BODY(create_file) { atf::utils::create_file("test.txt", "This is a %d test"); ATF_REQUIRE_EQ("This is a %d test", read_file("test.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(file_exists); ATF_TEST_CASE_BODY(file_exists) { atf::utils::create_file("test.txt", "foo"); ATF_REQUIRE( atf::utils::file_exists("test.txt")); ATF_REQUIRE( atf::utils::file_exists("./test.txt")); ATF_REQUIRE(!atf::utils::file_exists("./test.tx")); ATF_REQUIRE(!atf::utils::file_exists("test.txt2")); } ATF_TEST_CASE_WITHOUT_HEAD(fork); ATF_TEST_CASE_BODY(fork) { std::cout << "Should not get into child\n"; std::cerr << "Should not get into child\n"; pid_t pid = atf::utils::fork(); if (pid == 0) { std::cout << "Child stdout\n"; std::cerr << "Child stderr\n"; exit(EXIT_SUCCESS); } int status; ATF_REQUIRE(waitpid(pid, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); ATF_REQUIRE_EQ("Child stdout\n", read_file("atf_utils_fork_out.txt")); ATF_REQUIRE_EQ("Child stderr\n", read_file("atf_utils_fork_err.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(grep_collection__set); ATF_TEST_CASE_BODY(grep_collection__set) { std::set< std::string > strings; strings.insert("First"); strings.insert("Second"); ATF_REQUIRE( atf::utils::grep_collection("irs", strings)); ATF_REQUIRE( atf::utils::grep_collection("cond", strings)); ATF_REQUIRE(!atf::utils::grep_collection("Third", strings)); } ATF_TEST_CASE_WITHOUT_HEAD(grep_collection__vector); ATF_TEST_CASE_BODY(grep_collection__vector) { std::vector< std::string > strings; strings.push_back("First"); strings.push_back("Second"); ATF_REQUIRE( atf::utils::grep_collection("irs", strings)); ATF_REQUIRE( atf::utils::grep_collection("cond", strings)); ATF_REQUIRE(!atf::utils::grep_collection("Third", strings)); } ATF_TEST_CASE_WITHOUT_HEAD(grep_file); ATF_TEST_CASE_BODY(grep_file) { atf::utils::create_file("test.txt", "line1\nthe second line\naaaabbbb\n"); ATF_REQUIRE(atf::utils::grep_file("line1", "test.txt")); ATF_REQUIRE(atf::utils::grep_file("second line", "test.txt")); ATF_REQUIRE(atf::utils::grep_file("aa.*bb", "test.txt")); ATF_REQUIRE(!atf::utils::grep_file("foo", "test.txt")); ATF_REQUIRE(!atf::utils::grep_file("bar", "test.txt")); ATF_REQUIRE(!atf::utils::grep_file("aaaaa", "test.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(grep_string); ATF_TEST_CASE_BODY(grep_string) { const char *str = "a string - aaaabbbb"; ATF_REQUIRE(atf::utils::grep_string("a string", str)); ATF_REQUIRE(atf::utils::grep_string("^a string", str)); ATF_REQUIRE(atf::utils::grep_string("aaaabbbb$", str)); ATF_REQUIRE(atf::utils::grep_string("aa.*bb", str)); ATF_REQUIRE(!atf::utils::grep_string("foo", str)); ATF_REQUIRE(!atf::utils::grep_string("bar", str)); ATF_REQUIRE(!atf::utils::grep_string("aaaaa", str)); } ATF_TEST_CASE_WITHOUT_HEAD(redirect__stdout); ATF_TEST_CASE_BODY(redirect__stdout) { std::cout << "Buffer this"; atf::utils::redirect(STDOUT_FILENO, "captured.txt"); std::cout << "The printed message"; std::cout.flush(); ATF_REQUIRE_EQ("The printed message", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(redirect__stderr); ATF_TEST_CASE_BODY(redirect__stderr) { std::cerr << "Buffer this"; atf::utils::redirect(STDERR_FILENO, "captured.txt"); std::cerr << "The printed message"; std::cerr.flush(); ATF_REQUIRE_EQ("The printed message", read_file("captured.txt")); } ATF_TEST_CASE_WITHOUT_HEAD(redirect__other); ATF_TEST_CASE_BODY(redirect__other) { const std::string message = "Foo bar\nbaz\n"; atf::utils::redirect(15, "captured.txt"); ATF_REQUIRE(write(15, message.c_str(), message.length()) != -1); close(15); ATF_REQUIRE_EQ(message, read_file("captured.txt")); } static void fork_and_wait(const int exitstatus, const char* expout, const char* experr) { const pid_t pid = atf::utils::fork(); if (pid == 0) { std::cout << "Some output\n"; std::cerr << "Some error\n"; exit(123); } atf::utils::wait(pid, exitstatus, expout, experr); exit(EXIT_SUCCESS); } ATF_TEST_CASE_WITHOUT_HEAD(wait__ok); ATF_TEST_CASE_BODY(wait__ok) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); } } ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_exitstatus); ATF_TEST_CASE_BODY(wait__invalid_exitstatus) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(120, "Some output\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_stdout); ATF_TEST_CASE_BODY(wait__invalid_stdout) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output foo\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TEST_CASE_WITHOUT_HEAD(wait__invalid_stderr); ATF_TEST_CASE_BODY(wait__invalid_stderr) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "Some error foo\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TEST_CASE_WITHOUT_HEAD(wait__save_stdout); ATF_TEST_CASE_BODY(wait__save_stdout) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "save:my-output.txt", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); ATF_REQUIRE(atf::utils::compare_file("my-output.txt", "Some output\n")); } } ATF_TEST_CASE_WITHOUT_HEAD(wait__save_stderr); ATF_TEST_CASE_BODY(wait__save_stderr) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "save:my-output.txt"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); ATF_REQUIRE(atf::utils::compare_file("my-output.txt", "Some error\n")); } } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/utils.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test for the free functions. ATF_ADD_TEST_CASE(tcs, cat_file__empty); ATF_ADD_TEST_CASE(tcs, cat_file__one_line); ATF_ADD_TEST_CASE(tcs, cat_file__several_lines); ATF_ADD_TEST_CASE(tcs, cat_file__no_newline_eof); ATF_ADD_TEST_CASE(tcs, compare_file__empty__match); ATF_ADD_TEST_CASE(tcs, compare_file__empty__not_match); ATF_ADD_TEST_CASE(tcs, compare_file__short__match); ATF_ADD_TEST_CASE(tcs, compare_file__short__not_match); ATF_ADD_TEST_CASE(tcs, compare_file__long__match); ATF_ADD_TEST_CASE(tcs, compare_file__long__not_match); ATF_ADD_TEST_CASE(tcs, copy_file__empty); ATF_ADD_TEST_CASE(tcs, copy_file__some_contents); ATF_ADD_TEST_CASE(tcs, create_file); ATF_ADD_TEST_CASE(tcs, file_exists); ATF_ADD_TEST_CASE(tcs, fork); ATF_ADD_TEST_CASE(tcs, grep_collection__set); ATF_ADD_TEST_CASE(tcs, grep_collection__vector); ATF_ADD_TEST_CASE(tcs, grep_file); ATF_ADD_TEST_CASE(tcs, grep_string); ATF_ADD_TEST_CASE(tcs, redirect__stdout); ATF_ADD_TEST_CASE(tcs, redirect__stderr); ATF_ADD_TEST_CASE(tcs, redirect__other); ATF_ADD_TEST_CASE(tcs, wait__ok); ATF_ADD_TEST_CASE(tcs, wait__invalid_exitstatus); ATF_ADD_TEST_CASE(tcs, wait__invalid_stdout); ATF_ADD_TEST_CASE(tcs, wait__invalid_stderr); ATF_ADD_TEST_CASE(tcs, wait__save_stdout); ATF_ADD_TEST_CASE(tcs, wait__save_stderr); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/macros_test.cpp0000644000470500017500000005463012271526120021531 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include #include #include "macros.hpp" #include "utils.hpp" #include "detail/fs.hpp" #include "detail/process.hpp" #include "detail/sanity.hpp" #include "detail/test_helpers.hpp" #include "detail/text.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void create_ctl_file(const char *name) { ATF_REQUIRE(open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1); } // ------------------------------------------------------------------------ // Auxiliary test cases. // ------------------------------------------------------------------------ ATF_TEST_CASE(h_pass); ATF_TEST_CASE_HEAD(h_pass) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_pass) { create_ctl_file("before"); ATF_PASS(); create_ctl_file("after"); } ATF_TEST_CASE(h_fail); ATF_TEST_CASE_HEAD(h_fail) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_fail) { create_ctl_file("before"); ATF_FAIL("Failed on purpose"); create_ctl_file("after"); } ATF_TEST_CASE(h_skip); ATF_TEST_CASE_HEAD(h_skip) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_skip) { create_ctl_file("before"); ATF_SKIP("Skipped on purpose"); create_ctl_file("after"); } ATF_TEST_CASE(h_require); ATF_TEST_CASE_HEAD(h_require) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require) { bool condition = atf::text::to_bool(get_config_var("condition")); create_ctl_file("before"); ATF_REQUIRE(condition); create_ctl_file("after"); } ATF_TEST_CASE(h_require_eq); ATF_TEST_CASE_HEAD(h_require_eq) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_eq) { long v1 = atf::text::to_type< long >(get_config_var("v1")); long v2 = atf::text::to_type< long >(get_config_var("v2")); create_ctl_file("before"); ATF_REQUIRE_EQ(v1, v2); create_ctl_file("after"); } ATF_TEST_CASE(h_require_in); ATF_TEST_CASE_HEAD(h_require_in) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_in) { const std::string element = get_config_var("value"); std::set< std::string > collection; collection.insert("foo"); collection.insert("bar"); collection.insert("baz"); create_ctl_file("before"); ATF_REQUIRE_IN(element, collection); create_ctl_file("after"); } ATF_TEST_CASE(h_require_match); ATF_TEST_CASE_HEAD(h_require_match) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_match) { const std::string regexp = get_config_var("regexp"); const std::string string = get_config_var("string"); create_ctl_file("before"); ATF_REQUIRE_MATCH(regexp, string); create_ctl_file("after"); } ATF_TEST_CASE(h_require_not_in); ATF_TEST_CASE_HEAD(h_require_not_in) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_not_in) { const std::string element = get_config_var("value"); std::set< std::string > collection; collection.insert("foo"); collection.insert("bar"); collection.insert("baz"); create_ctl_file("before"); ATF_REQUIRE_NOT_IN(element, collection); create_ctl_file("after"); } ATF_TEST_CASE(h_require_throw); ATF_TEST_CASE_HEAD(h_require_throw) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_throw) { create_ctl_file("before"); if (get_config_var("what") == "throw_int") ATF_REQUIRE_THROW(std::runtime_error, if (1) throw int(5)); else if (get_config_var("what") == "throw_rt") ATF_REQUIRE_THROW(std::runtime_error, if (1) throw std::runtime_error("e")); else if (get_config_var("what") == "no_throw_rt") ATF_REQUIRE_THROW(std::runtime_error, if (0) throw std::runtime_error("e")); create_ctl_file("after"); } ATF_TEST_CASE(h_require_throw_re); ATF_TEST_CASE_HEAD(h_require_throw_re) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_throw_re) { create_ctl_file("before"); if (get_config_var("what") == "throw_int") ATF_REQUIRE_THROW_RE(std::runtime_error, "5", if (1) throw int(5)); else if (get_config_var("what") == "throw_rt_match") ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz", if (1) throw std::runtime_error("a foo bar baz")); else if (get_config_var("what") == "throw_rt_no_match") ATF_REQUIRE_THROW_RE(std::runtime_error, "foo.*baz", if (1) throw std::runtime_error("baz foo bar a")); else if (get_config_var("what") == "no_throw_rt") ATF_REQUIRE_THROW_RE(std::runtime_error, "e", if (0) throw std::runtime_error("e")); create_ctl_file("after"); } static int errno_fail_stub(const int raised_errno) { errno = raised_errno; return -1; } static int errno_ok_stub(void) { return 0; } ATF_TEST_CASE(h_check_errno); ATF_TEST_CASE_HEAD(h_check_errno) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_check_errno) { create_ctl_file("before"); if (get_config_var("what") == "no_error") ATF_CHECK_ERRNO(-1, errno_ok_stub() == -1); else if (get_config_var("what") == "errno_ok") ATF_CHECK_ERRNO(2, errno_fail_stub(2) == -1); else if (get_config_var("what") == "errno_fail") ATF_CHECK_ERRNO(3, errno_fail_stub(4) == -1); else UNREACHABLE; create_ctl_file("after"); } ATF_TEST_CASE(h_require_errno); ATF_TEST_CASE_HEAD(h_require_errno) { set_md_var("descr", "Helper test case"); } ATF_TEST_CASE_BODY(h_require_errno) { create_ctl_file("before"); if (get_config_var("what") == "no_error") ATF_REQUIRE_ERRNO(-1, errno_ok_stub() == -1); else if (get_config_var("what") == "errno_ok") ATF_REQUIRE_ERRNO(2, errno_fail_stub(2) == -1); else if (get_config_var("what") == "errno_fail") ATF_REQUIRE_ERRNO(3, errno_fail_stub(4) == -1); else UNREACHABLE; create_ctl_file("after"); } // ------------------------------------------------------------------------ // Test cases for the macros. // ------------------------------------------------------------------------ ATF_TEST_CASE(pass); ATF_TEST_CASE_HEAD(pass) { set_md_var("descr", "Tests the ATF_PASS macro"); } ATF_TEST_CASE_BODY(pass) { ATF_TEST_CASE_USE(h_pass); run_h_tc< ATF_TEST_CASE_NAME(h_pass) >(); ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(atf::fs::path("before"))); ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after"))); } ATF_TEST_CASE(fail); ATF_TEST_CASE_HEAD(fail) { set_md_var("descr", "Tests the ATF_FAIL macro"); } ATF_TEST_CASE_BODY(fail) { ATF_TEST_CASE_USE(h_fail); run_h_tc< ATF_TEST_CASE_NAME(h_fail) >(); ATF_REQUIRE(atf::utils::grep_file("^failed: Failed on purpose", "result")); ATF_REQUIRE(atf::fs::exists(atf::fs::path("before"))); ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after"))); } ATF_TEST_CASE(skip); ATF_TEST_CASE_HEAD(skip) { set_md_var("descr", "Tests the ATF_SKIP macro"); } ATF_TEST_CASE_BODY(skip) { ATF_TEST_CASE_USE(h_skip); run_h_tc< ATF_TEST_CASE_NAME(h_skip) >(); ATF_REQUIRE(atf::utils::grep_file("^skipped: Skipped on purpose", "result")); ATF_REQUIRE(atf::fs::exists(atf::fs::path("before"))); ATF_REQUIRE(!atf::fs::exists(atf::fs::path("after"))); } ATF_TEST_CASE(require); ATF_TEST_CASE_HEAD(require) { set_md_var("descr", "Tests the ATF_REQUIRE macro"); } ATF_TEST_CASE_BODY(require) { struct test { const char *cond; bool ok; } *t, tests[] = { { "false", false }, { "true", true }, { NULL, false } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->cond != NULL; t++) { atf::tests::vars_map config; config["condition"] = t->cond; std::cout << "Checking with a " << t->cond << " value\n"; ATF_TEST_CASE_USE(h_require); run_h_tc< ATF_TEST_CASE_NAME(h_require) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { ATF_REQUIRE(atf::utils::grep_file( "^failed: .*condition not met", "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_eq); ATF_TEST_CASE_HEAD(require_eq) { set_md_var("descr", "Tests the ATF_REQUIRE_EQ macro"); } ATF_TEST_CASE_BODY(require_eq) { struct test { const char *v1; const char *v2; bool ok; } *t, tests[] = { { "1", "1", true }, { "1", "2", false }, { "2", "1", false }, { "2", "2", true }, { NULL, NULL, false } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->v1 != NULL; t++) { atf::tests::vars_map config; config["v1"] = t->v1; config["v2"] = t->v2; std::cout << "Checking with " << t->v1 << ", " << t->v2 << " and expecting " << (t->ok ? "true" : "false") << "\n"; ATF_TEST_CASE_USE(h_require_eq); run_h_tc< ATF_TEST_CASE_NAME(h_require_eq) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { ATF_REQUIRE(atf::utils::grep_file("^failed: .*v1 != v2", "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_in); ATF_TEST_CASE_HEAD(require_in) { set_md_var("descr", "Tests the ATF_REQUIRE_IN macro"); } ATF_TEST_CASE_BODY(require_in) { struct test { const char *value; bool ok; } *t, tests[] = { { "foo", true }, { "bar", true }, { "baz", true }, { "xxx", false }, { "fooa", false }, { "foo ", false }, { NULL, false } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->value != NULL; t++) { atf::tests::vars_map config; config["value"] = t->value; ATF_TEST_CASE_USE(h_require_in); run_h_tc< ATF_TEST_CASE_NAME(h_require_in) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_match); ATF_TEST_CASE_HEAD(require_match) { set_md_var("descr", "Tests the ATF_REQUIRE_MATCH macro"); } ATF_TEST_CASE_BODY(require_match) { struct test { const char *regexp; const char *string; bool ok; } *t, tests[] = { { "foo.*bar", "this is a foo, bar, baz", true }, { "bar.*baz", "this is a baz, bar, foo", false }, { NULL, NULL, false } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->regexp != NULL; t++) { atf::tests::vars_map config; config["regexp"] = t->regexp; config["string"] = t->string; std::cout << "Checking with " << t->regexp << ", " << t->string << " and expecting " << (t->ok ? "true" : "false") << "\n"; ATF_TEST_CASE_USE(h_require_match); run_h_tc< ATF_TEST_CASE_NAME(h_require_match) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_not_in); ATF_TEST_CASE_HEAD(require_not_in) { set_md_var("descr", "Tests the ATF_REQUIRE_NOT_IN macro"); } ATF_TEST_CASE_BODY(require_not_in) { struct test { const char *value; bool ok; } *t, tests[] = { { "foo", false }, { "bar", false }, { "baz", false }, { "xxx", true }, { "fooa", true }, { "foo ", true }, { NULL, false } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->value != NULL; t++) { atf::tests::vars_map config; config["value"] = t->value; ATF_TEST_CASE_USE(h_require_not_in); run_h_tc< ATF_TEST_CASE_NAME(h_require_not_in) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { ATF_REQUIRE(atf::utils::grep_file("^failed: ", "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_throw); ATF_TEST_CASE_HEAD(require_throw) { set_md_var("descr", "Tests the ATF_REQUIRE_THROW macro"); } ATF_TEST_CASE_BODY(require_throw) { struct test { const char *what; bool ok; const char *msg; } *t, tests[] = { { "throw_int", false, "unexpected error" }, { "throw_rt", true, NULL }, { "no_throw_rt", false, "did not throw" }, { NULL, false, NULL } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->what != NULL; t++) { atf::tests::vars_map config; config["what"] = t->what; std::cout << "Checking with " << t->what << " and expecting " << (t->ok ? "true" : "false") << "\n"; ATF_TEST_CASE_USE(h_require_throw); run_h_tc< ATF_TEST_CASE_NAME(h_require_throw) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { std::cout << "Checking that message contains '" << t->msg << "'\n"; std::string exp_result = std::string("^failed: .*") + t->msg; ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(require_throw_re); ATF_TEST_CASE_HEAD(require_throw_re) { set_md_var("descr", "Tests the ATF_REQUIRE_THROW_RE macro"); } ATF_TEST_CASE_BODY(require_throw_re) { struct test { const char *what; bool ok; const char *msg; } *t, tests[] = { { "throw_int", false, "unexpected error" }, { "throw_rt_match", true, NULL }, { "throw_rt_no_match", false, "threw.*runtime_error\\(baz foo bar a\\).*" "does not match 'foo\\.\\*baz'" }, { "no_throw_rt", false, "did not throw" }, { NULL, false, NULL } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->what != NULL; t++) { atf::tests::vars_map config; config["what"] = t->what; std::cout << "Checking with " << t->what << " and expecting " << (t->ok ? "true" : "false") << "\n"; ATF_TEST_CASE_USE(h_require_throw_re); run_h_tc< ATF_TEST_CASE_NAME(h_require_throw_re) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { std::cout << "Checking that message contains '" << t->msg << "'\n"; std::string exp_result = std::string("^failed: .*") + t->msg; ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } ATF_TEST_CASE(check_errno); ATF_TEST_CASE_HEAD(check_errno) { set_md_var("descr", "Tests the ATF_CHECK_ERRNO macro"); } ATF_TEST_CASE_BODY(check_errno) { struct test { const char *what; bool ok; const char *msg; } *t, tests[] = { { "no_error", false, "Expected true value in errno_ok_stub\\(\\) == -1" }, { "errno_ok", true, NULL }, { "errno_fail", false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" }, { NULL, false, NULL } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->what != NULL; t++) { atf::tests::vars_map config; config["what"] = t->what; ATF_TEST_CASE_USE(h_check_errno); run_h_tc< ATF_TEST_CASE_NAME(h_check_errno) >(config); ATF_REQUIRE(atf::fs::exists(before)); ATF_REQUIRE(atf::fs::exists(after)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); } else { ATF_REQUIRE(atf::utils::grep_file("^failed", "result")); std::string exp_result = "macros_test.cpp:[0-9]+: " + std::string(t->msg) + "$"; ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "stderr")); } atf::fs::remove(before); atf::fs::remove(after); } } ATF_TEST_CASE(require_errno); ATF_TEST_CASE_HEAD(require_errno) { set_md_var("descr", "Tests the ATF_REQUIRE_ERRNO macro"); } ATF_TEST_CASE_BODY(require_errno) { struct test { const char *what; bool ok; const char *msg; } *t, tests[] = { { "no_error", false, "Expected true value in errno_ok_stub\\(\\) == -1" }, { "errno_ok", true, NULL }, { "errno_fail", false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" }, { NULL, false, NULL } }; const atf::fs::path before("before"); const atf::fs::path after("after"); for (t = &tests[0]; t->what != NULL; t++) { atf::tests::vars_map config; config["what"] = t->what; ATF_TEST_CASE_USE(h_require_errno); run_h_tc< ATF_TEST_CASE_NAME(h_require_errno) >(config); ATF_REQUIRE(atf::fs::exists(before)); if (t->ok) { ATF_REQUIRE(atf::utils::grep_file("^passed", "result")); ATF_REQUIRE(atf::fs::exists(after)); } else { std::string exp_result = "^failed: .*macros_test.cpp:[0-9]+: " + std::string(t->msg) + "$"; ATF_REQUIRE(atf::utils::grep_file(exp_result.c_str(), "result")); ATF_REQUIRE(!atf::fs::exists(after)); } atf::fs::remove(before); if (t->ok) atf::fs::remove(after); } } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/macros.hpp"); BUILD_TC(use, "macros_hpp_test.cpp", "Tests that the macros provided by the atf-c++/macros.hpp file " "do not cause syntax errors when used", "Build of macros_hpp_test.cpp failed; some macros in " "atf-c++/macros.hpp are broken"); BUILD_TC_FAIL(detect_unused_tests, "unused_test.cpp", "Tests that defining an unused test case raises a warning (and thus " "an error)", "Build of unused_test.cpp passed; unused test cases are not properly " "detected"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the macros. ATF_ADD_TEST_CASE(tcs, pass); ATF_ADD_TEST_CASE(tcs, fail); ATF_ADD_TEST_CASE(tcs, skip); ATF_ADD_TEST_CASE(tcs, check_errno); ATF_ADD_TEST_CASE(tcs, require); ATF_ADD_TEST_CASE(tcs, require_eq); ATF_ADD_TEST_CASE(tcs, require_in); ATF_ADD_TEST_CASE(tcs, require_match); ATF_ADD_TEST_CASE(tcs, require_not_in); ATF_ADD_TEST_CASE(tcs, require_throw); ATF_ADD_TEST_CASE(tcs, require_throw_re); ATF_ADD_TEST_CASE(tcs, require_errno); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); ATF_ADD_TEST_CASE(tcs, use); ATF_ADD_TEST_CASE(tcs, detect_unused_tests); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/check_test.cpp0000644000470500017500000003167112271526120021322 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include } #include #include #include #include #include #include #include #include #include "check.hpp" #include "config.hpp" #include "utils.hpp" #include "detail/fs.hpp" #include "detail/process.hpp" #include "detail/test_helpers.hpp" #include "detail/text.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static std::auto_ptr< atf::check::check_result > do_exec(const atf::tests::tc* tc, const char* helper_name) { std::vector< std::string > argv; argv.push_back(get_process_helpers_path(*tc).str()); argv.push_back(helper_name); std::cout << "Executing " << argv[0] << " " << argv[1] << "\n"; atf::process::argv_array argva(argv); return atf::check::exec(argva); } static std::auto_ptr< atf::check::check_result > do_exec(const atf::tests::tc* tc, const char* helper_name, const char *carg2) { std::vector< std::string > argv; argv.push_back(get_process_helpers_path(*tc).str()); argv.push_back(helper_name); argv.push_back(carg2); std::cout << "Executing " << argv[0] << " " << argv[1] << " " << argv[2] << "\n"; atf::process::argv_array argva(argv); return atf::check::exec(argva); } // ------------------------------------------------------------------------ // Helper test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(h_build_c_o_ok); ATF_TEST_CASE_HEAD(h_build_c_o_ok) { set_md_var("descr", "Helper test case for build_c_o"); } ATF_TEST_CASE_BODY(h_build_c_o_ok) { std::ofstream sfile("test.c"); sfile << "#include \n"; sfile.close(); ATF_REQUIRE(atf::check::build_c_o("test.c", "test.o", atf::process::argv_array())); } ATF_TEST_CASE(h_build_c_o_fail); ATF_TEST_CASE_HEAD(h_build_c_o_fail) { set_md_var("descr", "Helper test case for build_c_o"); } ATF_TEST_CASE_BODY(h_build_c_o_fail) { std::ofstream sfile("test.c"); sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; sfile.close(); ATF_REQUIRE(!atf::check::build_c_o("test.c", "test.o", atf::process::argv_array())); } ATF_TEST_CASE(h_build_cpp_ok); ATF_TEST_CASE_HEAD(h_build_cpp_ok) { set_md_var("descr", "Helper test case for build_cpp"); } ATF_TEST_CASE_BODY(h_build_cpp_ok) { std::ofstream sfile("test.c"); sfile << "#define A foo\n"; sfile << "#define B bar\n"; sfile << "A B\n"; sfile.close(); ATF_REQUIRE(atf::check::build_cpp("test.c", "test.p", atf::process::argv_array())); } ATF_TEST_CASE(h_build_cpp_fail); ATF_TEST_CASE_HEAD(h_build_cpp_fail) { set_md_var("descr", "Helper test case for build_cpp"); } ATF_TEST_CASE_BODY(h_build_cpp_fail) { std::ofstream sfile("test.c"); sfile << "#include \"./non-existent.h\"\n"; sfile.close(); ATF_REQUIRE(!atf::check::build_cpp("test.c", "test.p", atf::process::argv_array())); } ATF_TEST_CASE(h_build_cxx_o_ok); ATF_TEST_CASE_HEAD(h_build_cxx_o_ok) { set_md_var("descr", "Helper test case for build_cxx_o"); } ATF_TEST_CASE_BODY(h_build_cxx_o_ok) { std::ofstream sfile("test.cpp"); sfile << "#include \n"; sfile.close(); ATF_REQUIRE(atf::check::build_cxx_o("test.cpp", "test.o", atf::process::argv_array())); } ATF_TEST_CASE(h_build_cxx_o_fail); ATF_TEST_CASE_HEAD(h_build_cxx_o_fail) { set_md_var("descr", "Helper test case for build_cxx_o"); } ATF_TEST_CASE_BODY(h_build_cxx_o_fail) { std::ofstream sfile("test.cpp"); sfile << "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"; sfile.close(); ATF_REQUIRE(!atf::check::build_cxx_o("test.cpp", "test.o", atf::process::argv_array())); } // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(build_c_o); ATF_TEST_CASE_HEAD(build_c_o) { set_md_var("descr", "Tests the build_c_o function"); } ATF_TEST_CASE_BODY(build_c_o) { ATF_TEST_CASE_USE(h_build_c_o_ok); run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_ok) >(); ATF_REQUIRE(atf::utils::grep_file("-o test.o", "stdout")); ATF_REQUIRE(atf::utils::grep_file("-c test.c", "stdout")); ATF_TEST_CASE_USE(h_build_c_o_fail); run_h_tc< ATF_TEST_CASE_NAME(h_build_c_o_fail) >(); ATF_REQUIRE(atf::utils::grep_file("-o test.o", "stdout")); ATF_REQUIRE(atf::utils::grep_file("-c test.c", "stdout")); ATF_REQUIRE(atf::utils::grep_file("test.c", "stderr")); ATF_REQUIRE(atf::utils::grep_file("UNDEFINED_SYMBOL", "stderr")); } ATF_TEST_CASE(build_cpp); ATF_TEST_CASE_HEAD(build_cpp) { set_md_var("descr", "Tests the build_cpp function"); } ATF_TEST_CASE_BODY(build_cpp) { ATF_TEST_CASE_USE(h_build_cpp_ok); run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_ok) >(); ATF_REQUIRE(atf::utils::grep_file("-o.*test.p", "stdout")); ATF_REQUIRE(atf::utils::grep_file("test.c", "stdout")); ATF_REQUIRE(atf::utils::grep_file("foo bar", "test.p")); ATF_TEST_CASE_USE(h_build_cpp_fail); run_h_tc< ATF_TEST_CASE_NAME(h_build_cpp_fail) >(); ATF_REQUIRE(atf::utils::grep_file("-o test.p", "stdout")); ATF_REQUIRE(atf::utils::grep_file("test.c", "stdout")); ATF_REQUIRE(atf::utils::grep_file("test.c", "stderr")); ATF_REQUIRE(atf::utils::grep_file("non-existent.h", "stderr")); } ATF_TEST_CASE(build_cxx_o); ATF_TEST_CASE_HEAD(build_cxx_o) { set_md_var("descr", "Tests the build_cxx_o function"); } ATF_TEST_CASE_BODY(build_cxx_o) { ATF_TEST_CASE_USE(h_build_cxx_o_ok); run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_ok) >(); ATF_REQUIRE(atf::utils::grep_file("-o test.o", "stdout")); ATF_REQUIRE(atf::utils::grep_file("-c test.cpp", "stdout")); ATF_TEST_CASE_USE(h_build_cxx_o_fail); run_h_tc< ATF_TEST_CASE_NAME(h_build_cxx_o_fail) >(); ATF_REQUIRE(atf::utils::grep_file("-o test.o", "stdout")); ATF_REQUIRE(atf::utils::grep_file("-c test.cpp", "stdout")); ATF_REQUIRE(atf::utils::grep_file("test.cpp", "stderr")); ATF_REQUIRE(atf::utils::grep_file("UNDEFINED_SYMBOL", "stderr")); } ATF_TEST_CASE(exec_cleanup); ATF_TEST_CASE_HEAD(exec_cleanup) { set_md_var("descr", "Tests that exec properly cleans up the temporary " "files it creates"); } ATF_TEST_CASE_BODY(exec_cleanup) { std::auto_ptr< atf::fs::path > out; std::auto_ptr< atf::fs::path > err; { std::auto_ptr< atf::check::check_result > r = do_exec(this, "exit-success"); out.reset(new atf::fs::path(r->stdout_path())); err.reset(new atf::fs::path(r->stderr_path())); ATF_REQUIRE(atf::fs::exists(*out.get())); ATF_REQUIRE(atf::fs::exists(*err.get())); } ATF_REQUIRE(!atf::fs::exists(*out.get())); ATF_REQUIRE(!atf::fs::exists(*err.get())); } ATF_TEST_CASE(exec_exitstatus); ATF_TEST_CASE_HEAD(exec_exitstatus) { set_md_var("descr", "Tests that exec properly captures the exit " "status of the executed command"); } ATF_TEST_CASE_BODY(exec_exitstatus) { { std::auto_ptr< atf::check::check_result > r = do_exec(this, "exit-success"); ATF_REQUIRE(r->exited()); ATF_REQUIRE(!r->signaled()); ATF_REQUIRE_EQ(r->exitcode(), EXIT_SUCCESS); } { std::auto_ptr< atf::check::check_result > r = do_exec(this, "exit-failure"); ATF_REQUIRE(r->exited()); ATF_REQUIRE(!r->signaled()); ATF_REQUIRE_EQ(r->exitcode(), EXIT_FAILURE); } { std::auto_ptr< atf::check::check_result > r = do_exec(this, "exit-signal"); ATF_REQUIRE(!r->exited()); ATF_REQUIRE(r->signaled()); ATF_REQUIRE_EQ(r->termsig(), SIGKILL); } } static void check_lines(const std::string& path, const char* outname, const char* resname) { std::ifstream f(path.c_str()); ATF_REQUIRE(f); std::string line; std::getline(f, line); ATF_REQUIRE_EQ(line, std::string("Line 1 to ") + outname + " for " + resname); std::getline(f, line); ATF_REQUIRE_EQ(line, std::string("Line 2 to ") + outname + " for " + resname); } ATF_TEST_CASE(exec_stdout_stderr); ATF_TEST_CASE_HEAD(exec_stdout_stderr) { set_md_var("descr", "Tests that exec properly captures the stdout " "and stderr streams of the child process"); } ATF_TEST_CASE_BODY(exec_stdout_stderr) { std::auto_ptr< atf::check::check_result > r1 = do_exec(this, "stdout-stderr", "result1"); ATF_REQUIRE(r1->exited()); ATF_REQUIRE_EQ(r1->exitcode(), EXIT_SUCCESS); std::auto_ptr< atf::check::check_result > r2 = do_exec(this, "stdout-stderr", "result2"); ATF_REQUIRE(r2->exited()); ATF_REQUIRE_EQ(r2->exitcode(), EXIT_SUCCESS); const std::string out1 = r1->stdout_path(); const std::string out2 = r2->stdout_path(); const std::string err1 = r1->stderr_path(); const std::string err2 = r2->stderr_path(); ATF_REQUIRE(out1.find("check.XXXXXX") == std::string::npos); ATF_REQUIRE(out2.find("check.XXXXXX") == std::string::npos); ATF_REQUIRE(err1.find("check.XXXXXX") == std::string::npos); ATF_REQUIRE(err2.find("check.XXXXXX") == std::string::npos); ATF_REQUIRE(out1.find("/check") != std::string::npos); ATF_REQUIRE(out2.find("/check") != std::string::npos); ATF_REQUIRE(err1.find("/check") != std::string::npos); ATF_REQUIRE(err2.find("/check") != std::string::npos); ATF_REQUIRE(out1.find("/stdout") != std::string::npos); ATF_REQUIRE(out2.find("/stdout") != std::string::npos); ATF_REQUIRE(err1.find("/stderr") != std::string::npos); ATF_REQUIRE(err2.find("/stderr") != std::string::npos); ATF_REQUIRE(out1 != out2); ATF_REQUIRE(err1 != err2); check_lines(out1, "stdout", "result1"); check_lines(out2, "stdout", "result2"); check_lines(err1, "stderr", "result1"); check_lines(err2, "stderr", "result2"); } ATF_TEST_CASE(exec_unknown); ATF_TEST_CASE_HEAD(exec_unknown) { set_md_var("descr", "Tests that running a non-existing binary " "is handled correctly"); } ATF_TEST_CASE_BODY(exec_unknown) { std::vector< std::string > argv; argv.push_back(atf::config::get("atf_workdir") + "/non-existent"); atf::process::argv_array argva(argv); std::auto_ptr< atf::check::check_result > r = atf::check::exec(argva); ATF_REQUIRE(r->exited()); ATF_REQUIRE_EQ(r->exitcode(), 127); } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/check.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, build_c_o); ATF_ADD_TEST_CASE(tcs, build_cpp); ATF_ADD_TEST_CASE(tcs, build_cxx_o); ATF_ADD_TEST_CASE(tcs, exec_cleanup); ATF_ADD_TEST_CASE(tcs, exec_exitstatus); ATF_ADD_TEST_CASE(tcs, exec_stdout_stderr); ATF_ADD_TEST_CASE(tcs, exec_unknown); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/build.cpp0000644000470500017500000000722512271526120020303 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include "atf-c/build.h" #include "atf-c/error.h" #include "atf-c/utils.h" } #include "build.hpp" #include "detail/exceptions.hpp" #include "detail/process.hpp" namespace impl = atf::build; #define IMPL_NAME "atf::build" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ inline atf::process::argv_array cargv_to_argv(const atf_list_t* l) { std::vector< const char* > aux; atf_list_citer_t iter; atf_list_for_each_c(iter, l) aux.push_back(static_cast< const char* >(atf_list_citer_data(iter))); return atf::process::argv_array(aux); } inline atf::process::argv_array cargv_to_argv_and_free(char** l) { try { atf::process::argv_array argv((const char* const*)l); atf_utils_free_charpp(l); return argv; } catch (...) { atf_utils_free_charpp(l); throw; } } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ atf::process::argv_array impl::c_o(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { char** l; atf_error_t err = atf_build_c_o(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &l); if (atf_is_error(err)) throw_atf_error(err); return cargv_to_argv_and_free(l); } atf::process::argv_array impl::cpp(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { char** l; atf_error_t err = atf_build_cpp(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &l); if (atf_is_error(err)) throw_atf_error(err); return cargv_to_argv_and_free(l); } atf::process::argv_array impl::cxx_o(const std::string& sfile, const std::string& ofile, const atf::process::argv_array& optargs) { char** l; atf_error_t err = atf_build_cxx_o(sfile.c_str(), ofile.c_str(), optargs.exec_argv(), &l); if (atf_is_error(err)) throw_atf_error(err); return cargv_to_argv_and_free(l); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/atf-c++.pc.in0000644000470500017500000000035212271526120020543 0ustar lamontlamont# ATF pkg-config file cxx=__CXX__ includedir=__INCLUDEDIR__ libdir=__LIBDIR__ Name: atf-c++ Description: Automated Testing Framework (C++ binding) Version: __ATF_VERSION__ Cflags: -I${includedir} Libs: -L${libdir} -latf-c++ -latf-c bind9-9.9.5.dfsg/unit/atf-src/atf-c++/utils.hpp0000644000470500017500000000471212271526120020347 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_UTILS_HPP_) #define _ATF_CXX_UTILS_HPP_ extern "C" { #include } #include namespace atf { namespace utils { void cat_file(const std::string&, const std::string&); bool compare_file(const std::string&, const std::string&); void copy_file(const std::string&, const std::string&); void create_file(const std::string&, const std::string&); bool file_exists(const std::string&); pid_t fork(void); bool grep_file(const std::string&, const std::string&); bool grep_string(const std::string&, const std::string&); void redirect(const int, const std::string&); void wait(const pid_t, const int, const std::string&, const std::string&); template< typename Collection > bool grep_collection(const std::string& regexp, const Collection& collection) { for (typename Collection::const_iterator iter = collection.begin(); iter != collection.end(); ++iter) { if (grep_string(regexp, *iter)) return true; } return false; } } // namespace utils } // namespace atf #endif // !defined(_ATF_CXX_UTILS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/macros_hpp_test.cpp0000644000470500017500000001077112271526120022376 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include void atf_check_errno_semicolons(void) { // Check that ATF_CHECK_ERRNO does not contain a semicolon that would // cause an empty-statement that confuses some compilers. ATF_CHECK_ERRNO(1, 1 == 1); ATF_CHECK_ERRNO(2, 2 == 2); } void atf_require_inside_if(void) { // Make sure that ATF_REQUIRE can be used inside an if statement that // does not have braces. Earlier versions of it generated an error // if there was an else clause because they confused the compiler // by defining an unprotected nested if. if (true) ATF_REQUIRE(true); else ATF_REQUIRE(true); } void atf_require_eq_inside_if(void) { // Make sure that ATF_REQUIRE_EQ can be used inside an if statement // that does not have braces. Earlier versions of it generated an // error if there was an else clause because they confused the // compiler by defining an unprotected nested if. if (true) ATF_REQUIRE_EQ(true, true); else ATF_REQUIRE_EQ(true, true); } void atf_require_throw_runtime_error(void) { // Check that we can pass std::runtime_error to ATF_REQUIRE_THROW. // Earlier versions generated a warning because the macro's code also // attempted to capture this exception, and thus we had a duplicate // catch clause. ATF_REQUIRE_THROW(std::runtime_error, (void)0); } void atf_require_throw_inside_if(void) { // Make sure that ATF_REQUIRE_THROW can be used inside an if statement // that does not have braces. Earlier versions of it generated an // error because a trailing ; after a catch block was not allowed. if (true) ATF_REQUIRE_THROW(std::runtime_error, (void)0); else ATF_REQUIRE_THROW(std::runtime_error, (void)1); } void atf_require_errno_semicolons(void) { // Check that ATF_REQUIRE_ERRNO does not contain a semicolon that would // cause an empty-statement that confuses some compilers. ATF_REQUIRE_ERRNO(1, 1 == 1); ATF_REQUIRE_ERRNO(2, 2 == 2); } // Test case names should not be expanded during instatiation so that they // can have the exact same name as macros. #define TEST_MACRO_1 invalid + name #define TEST_MACRO_2 invalid + name #define TEST_MACRO_3 invalid + name ATF_TEST_CASE(TEST_MACRO_1); ATF_TEST_CASE_HEAD(TEST_MACRO_1) { } ATF_TEST_CASE_BODY(TEST_MACRO_1) { } void instantiate_1(void) { ATF_TEST_CASE_USE(TEST_MACRO_1); atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_1)(); delete the_test; } ATF_TEST_CASE_WITH_CLEANUP(TEST_MACRO_2); ATF_TEST_CASE_HEAD(TEST_MACRO_2) { } ATF_TEST_CASE_BODY(TEST_MACRO_2) { } ATF_TEST_CASE_CLEANUP(TEST_MACRO_2) { } void instatiate_2(void) { ATF_TEST_CASE_USE(TEST_MACRO_2); atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_2)(); delete the_test; } ATF_TEST_CASE_WITH_CLEANUP(TEST_MACRO_3); ATF_TEST_CASE_HEAD(TEST_MACRO_3) { } ATF_TEST_CASE_BODY(TEST_MACRO_3) { } ATF_TEST_CASE_CLEANUP(TEST_MACRO_3) { } void instatiate_3(void) { ATF_TEST_CASE_USE(TEST_MACRO_3); atf::tests::tc* the_test = new ATF_TEST_CASE_NAME(TEST_MACRO_3)(); delete the_test; } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/Makefile.am.inc0000644000470500017500000001160712271526120021303 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ATF_CXX_LIBS = libatf-c++.la libatf-c.la lib_LTLIBRARIES += libatf-c++.la libatf_c___la_LIBADD = libatf-c.la libatf_c___la_SOURCES = atf-c++/build.cpp \ atf-c++/build.hpp \ atf-c++/check.cpp \ atf-c++/check.hpp \ atf-c++/config.cpp \ atf-c++/config.hpp \ atf-c++/macros.hpp \ atf-c++/noncopyable.hpp \ atf-c++/tests.cpp \ atf-c++/tests.hpp \ atf-c++/utils.cpp \ atf-c++/utils.hpp libatf_c___la_LDFLAGS = -version-info 0:0:0 include_HEADERS += atf-c++.hpp atf_c___HEADERS = atf-c++/build.hpp \ atf-c++/check.hpp \ atf-c++/config.hpp \ atf-c++/macros.hpp \ atf-c++/noncopyable.hpp \ atf-c++/tests.hpp \ atf-c++/utils.hpp atf_c__dir = $(includedir)/atf-c++ dist_man_MANS += atf-c++/atf-c++-api.3 atf_aclocal_DATA += atf-c++/atf-c++.m4 EXTRA_DIST += atf-c++/atf-c++.m4 atf_c__dirpkgconfigdir = $(atf_pkgconfigdir) atf_c__dirpkgconfig_DATA = atf-c++/atf-c++.pc CLEANFILES += atf-c++/atf-c++.pc EXTRA_DIST += atf-c++/atf-c++.pc.in atf-c++/atf-c++.pc: $(srcdir)/atf-c++/atf-c++.pc.in Makefile test -d atf-c++ || mkdir -p atf-c++ sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__CXX__#$(CXX)#g' \ -e 's#__INCLUDEDIR__#$(includedir)#g' \ -e 's#__LIBDIR__#$(libdir)#g' \ <$(srcdir)/atf-c++/atf-c++.pc.in >atf-c++/atf-c++.pc.tmp mv atf-c++/atf-c++.pc.tmp atf-c++/atf-c++.pc tests_atf_c___DATA = atf-c++/Atffile \ atf-c++/Kyuafile \ atf-c++/macros_hpp_test.cpp \ atf-c++/unused_test.cpp tests_atf_c__dir = $(pkgtestsdir)/atf-c++ EXTRA_DIST += $(tests_atf_c___DATA) tests_atf_c___PROGRAMS = atf-c++/atf_c++_test atf_c___atf_c___test_SOURCES = atf-c++/atf_c++_test.cpp atf_c___atf_c___test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___PROGRAMS += atf-c++/build_test atf_c___build_test_SOURCES = atf-c++/build_test.cpp atf-c/h_build.h atf_c___build_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___PROGRAMS += atf-c++/check_test atf_c___check_test_SOURCES = atf-c++/check_test.cpp atf_c___check_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___PROGRAMS += atf-c++/config_test atf_c___config_test_SOURCES = atf-c++/config_test.cpp atf_c___config_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___PROGRAMS += atf-c++/macros_test atf_c___macros_test_SOURCES = atf-c++/macros_test.cpp atf_c___macros_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___SCRIPTS = atf-c++/pkg_config_test CLEANFILES += atf-c++/pkg_config_test EXTRA_DIST += atf-c++/pkg_config_test.sh atf-c++/pkg_config_test: $(srcdir)/atf-c++/pkg_config_test.sh test -d atf-c++ || mkdir -p atf-c++ @src="$(srcdir)/atf-c++/pkg_config_test.sh"; \ dst="atf-c++/pkg_config_test"; $(BUILD_SH_TP) tests_atf_c___PROGRAMS += atf-c++/tests_test atf_c___tests_test_SOURCES = atf-c++/tests_test.cpp atf_c___tests_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___PROGRAMS += atf-c++/utils_test atf_c___utils_test_SOURCES = atf-c++/utils_test.cpp atf_c___utils_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) include atf-c++/detail/Makefile.am.inc # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-c++/unused_test.cpp0000644000470500017500000000340112271526120021536 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2012 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include ATF_TEST_CASE(this_is_used); ATF_TEST_CASE_HEAD(this_is_used) { } ATF_TEST_CASE_BODY(this_is_used) { } ATF_TEST_CASE(this_is_unused); ATF_TEST_CASE_HEAD(this_is_unused) { } ATF_TEST_CASE_BODY(this_is_unused) { } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, this_is_used); //ATF_ADD_TEST_CASE(tcs, this_is_unused); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/config.cpp0000644000470500017500000000755512271526120020457 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include extern "C" { #include "atf-c/config.h" } #include "config.hpp" #include "detail/env.hpp" #include "detail/sanity.hpp" static std::map< std::string, std::string > m_variables; // // Adds all predefined standard build-time variables to the m_variables // map, considering the values a user may have provided in the environment. // // Can only be called once during the program's lifetime. // static void init_variables(void) { PRE(m_variables.empty()); m_variables["atf_arch"] = atf_config_get("atf_arch"); m_variables["atf_build_cc"] = atf_config_get("atf_build_cc"); m_variables["atf_build_cflags"] = atf_config_get("atf_build_cflags"); m_variables["atf_build_cpp"] = atf_config_get("atf_build_cpp"); m_variables["atf_build_cppflags"] = atf_config_get("atf_build_cppflags"); m_variables["atf_build_cxx"] = atf_config_get("atf_build_cxx"); m_variables["atf_build_cxxflags"] = atf_config_get("atf_build_cxxflags"); m_variables["atf_confdir"] = atf_config_get("atf_confdir"); m_variables["atf_includedir"] = atf_config_get("atf_includedir"); m_variables["atf_libdir"] = atf_config_get("atf_libdir"); m_variables["atf_libexecdir"] = atf_config_get("atf_libexecdir"); m_variables["atf_machine"] = atf_config_get("atf_machine"); m_variables["atf_pkgdatadir"] = atf_config_get("atf_pkgdatadir"); m_variables["atf_shell"] = atf_config_get("atf_shell"); m_variables["atf_workdir"] = atf_config_get("atf_workdir"); POST(!m_variables.empty()); } const std::string& atf::config::get(const std::string& varname) { if (m_variables.empty()) init_variables(); PRE(has(varname)); return m_variables[varname]; } const std::map< std::string, std::string >& atf::config::get_all(void) { if (m_variables.empty()) init_variables(); return m_variables; } bool atf::config::has(const std::string& varname) { if (m_variables.empty()) init_variables(); return m_variables.find(varname) != m_variables.end(); } extern "C" { void __atf_config_reinit(void); } namespace atf { namespace config { // // Auxiliary function for the t_config test program so that it can // revert the configuration's global status to an empty state and // do new tests from there on. // // Ideally this shouldn't be part of the production library... but // this is so small that it does not matter. // void __reinit(void) { __atf_config_reinit(); m_variables.clear(); } } // namespace config } // namespace atf bind9-9.9.5.dfsg/unit/atf-src/atf-c++/Kyuafile0000644000470500017500000000055712271526120020175 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="atf_c++_test"} atf_test_program{name="build_test"} atf_test_program{name="check_test"} atf_test_program{name="config_test"} atf_test_program{name="macros_test"} atf_test_program{name="pkg_config_test"} atf_test_program{name="tests_test"} atf_test_program{name="utils_test"} include("detail/Kyuafile") bind9-9.9.5.dfsg/unit/atf-src/atf-c++/build.hpp0000644000470500017500000000425412271526120020307 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_BUILD_HPP_) #define _ATF_CXX_BUILD_HPP_ #include namespace atf { namespace process { class argv_array; } // namespace process namespace build { // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ process::argv_array c_o(const std::string&, const std::string&, const process::argv_array&); process::argv_array cpp(const std::string&, const std::string&, const process::argv_array&); process::argv_array cxx_o(const std::string&, const std::string&, const process::argv_array&); } // namespace build } // namespace atf #endif // !defined(_ATF_CXX_BUILD_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/macros.hpp0000644000470500017500000001727312271526120020501 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_MACROS_HPP_) #define _ATF_CXX_MACROS_HPP_ #include #include #include #include // Do not define inline methods for the test case classes. Doing so // significantly increases the memory requirements of GNU G++ during // compilation. #define ATF_TEST_CASE_WITHOUT_HEAD(name) \ namespace { \ class atfu_tc_ ## name : public atf::tests::tc { \ void body(void) const; \ public: \ atfu_tc_ ## name(void); \ }; \ static atfu_tc_ ## name* atfu_tcptr_ ## name; \ atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \ } #define ATF_TEST_CASE(name) \ namespace { \ class atfu_tc_ ## name : public atf::tests::tc { \ void head(void); \ void body(void) const; \ public: \ atfu_tc_ ## name(void); \ }; \ static atfu_tc_ ## name* atfu_tcptr_ ## name; \ atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, false) {} \ } #define ATF_TEST_CASE_WITH_CLEANUP(name) \ namespace { \ class atfu_tc_ ## name : public atf::tests::tc { \ void head(void); \ void body(void) const; \ void cleanup(void) const; \ public: \ atfu_tc_ ## name(void); \ }; \ static atfu_tc_ ## name* atfu_tcptr_ ## name; \ atfu_tc_ ## name::atfu_tc_ ## name(void) : atf::tests::tc(#name, true) {} \ } #define ATF_TEST_CASE_NAME(name) atfu_tc_ ## name #define ATF_TEST_CASE_USE(name) (atfu_tcptr_ ## name) = NULL #define ATF_TEST_CASE_HEAD(name) \ void \ atfu_tc_ ## name::head(void) #define ATF_TEST_CASE_BODY(name) \ void \ atfu_tc_ ## name::body(void) \ const #define ATF_TEST_CASE_CLEANUP(name) \ void \ atfu_tc_ ## name::cleanup(void) \ const #define ATF_FAIL(reason) atf::tests::tc::fail(reason) #define ATF_SKIP(reason) atf::tests::tc::skip(reason) #define ATF_PASS() atf::tests::tc::pass() #define ATF_REQUIRE(x) \ do { \ if (!(x)) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " << #x << " not met"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } while (false) #define ATF_REQUIRE_EQ(x, y) \ do { \ if ((x) != (y)) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " << #x << " != " << #y \ << " (" << (x) << " != " << (y) << ")"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } while (false) #define ATF_REQUIRE_IN(element, collection) \ ATF_REQUIRE((collection).find(element) != (collection).end()) #define ATF_REQUIRE_NOT_IN(element, collection) \ ATF_REQUIRE((collection).find(element) == (collection).end()) #define ATF_REQUIRE_MATCH(regexp, string) \ do { \ if (!atf::tests::detail::match(regexp, string)) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": '" << string << "' does not " \ << "match regexp '" << regexp << "'"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } while (false) #define ATF_REQUIRE_THROW(e, x) \ do { \ try { \ x; \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " did not throw " \ #e " as expected"; \ atf::tests::tc::fail(atfu_ss.str()); \ } catch (const e&) { \ } catch (const std::exception& atfu_e) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \ "unexpected error (not " #e "): " << atfu_e.what(); \ atf::tests::tc::fail(atfu_ss.str()); \ } catch (...) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \ "unexpected error (not " #e ")"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } while (false) #define ATF_REQUIRE_THROW_RE(type, regexp, x) \ do { \ try { \ x; \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " did not throw " \ #type " as expected"; \ atf::tests::tc::fail(atfu_ss.str()); \ } catch (const type& e) { \ if (!atf::tests::detail::match(regexp, e.what())) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " threw " #type "(" \ << e.what() << "), but does not match '" << regexp \ << "'"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } catch (const std::exception& atfu_e) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \ "unexpected error (not " #type "): " << atfu_e.what(); \ atf::tests::tc::fail(atfu_ss.str()); \ } catch (...) { \ std::ostringstream atfu_ss; \ atfu_ss << "Line " << __LINE__ << ": " #x " threw an " \ "unexpected error (not " #type ")"; \ atf::tests::tc::fail(atfu_ss.str()); \ } \ } while (false) #define ATF_CHECK_ERRNO(exp_errno, bool_expr) \ atf::tests::tc::check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, \ bool_expr) #define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \ atf::tests::tc::require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, \ bool_expr) #define ATF_INIT_TEST_CASES(tcs) \ namespace atf { \ namespace tests { \ int run_tp(int, char* const*, \ void (*)(std::vector< atf::tests::tc * >&)); \ } \ } \ \ static void atfu_init_tcs(std::vector< atf::tests::tc * >&); \ \ int \ main(int argc, char* const* argv) \ { \ return atf::tests::run_tp(argc, argv, atfu_init_tcs); \ } \ \ static \ void \ atfu_init_tcs(std::vector< atf::tests::tc * >& tcs) #define ATF_ADD_TEST_CASE(tcs, tcname) \ do { \ atfu_tcptr_ ## tcname = new atfu_tc_ ## tcname(); \ (tcs).push_back(atfu_tcptr_ ## tcname); \ } while (0); #endif // !defined(_ATF_CXX_MACROS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/0002755000470500017500000000000012276444014017744 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/sanity.hpp0000644000470500017500000000307012271526120021754 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_SANITY_HPP_) #define _ATF_CXX_SANITY_HPP_ extern "C" { #include "../../atf-c/detail/sanity.h" } #endif // !defined(_ATF_CXX_SANITY_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/auto_array.hpp0000644000470500017500000000762712271526120022627 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_AUTO_ARRAY_HPP_) #define _ATF_CXX_AUTO_ARRAY_HPP_ #include namespace atf { // ------------------------------------------------------------------------ // The "auto_array" class. // ------------------------------------------------------------------------ template< class T > struct auto_array_ref { T* m_ptr; explicit auto_array_ref(T*); }; template< class T > auto_array_ref< T >::auto_array_ref(T* ptr) : m_ptr(ptr) { } template< class T > class auto_array { T* m_ptr; public: auto_array(T* = NULL) throw(); auto_array(auto_array< T >&) throw(); auto_array(auto_array_ref< T >) throw(); ~auto_array(void) throw(); T* get(void) throw(); const T* get(void) const throw(); T* release(void) throw(); void reset(T* = NULL) throw(); auto_array< T >& operator=(auto_array< T >&) throw(); auto_array< T >& operator=(auto_array_ref< T >) throw(); T& operator[](int) throw(); operator auto_array_ref< T >(void) throw(); }; template< class T > auto_array< T >::auto_array(T* ptr) throw() : m_ptr(ptr) { } template< class T > auto_array< T >::auto_array(auto_array< T >& ptr) throw() : m_ptr(ptr.release()) { } template< class T > auto_array< T >::auto_array(auto_array_ref< T > ref) throw() : m_ptr(ref.m_ptr) { } template< class T > auto_array< T >::~auto_array(void) throw() { if (m_ptr != NULL) delete [] m_ptr; } template< class T > T* auto_array< T >::get(void) throw() { return m_ptr; } template< class T > const T* auto_array< T >::get(void) const throw() { return m_ptr; } template< class T > T* auto_array< T >::release(void) throw() { T* ptr = m_ptr; m_ptr = NULL; return ptr; } template< class T > void auto_array< T >::reset(T* ptr) throw() { if (m_ptr != NULL) delete [] m_ptr; m_ptr = ptr; } template< class T > auto_array< T >& auto_array< T >::operator=(auto_array< T >& ptr) throw() { reset(ptr.release()); return *this; } template< class T > auto_array< T >& auto_array< T >::operator=(auto_array_ref< T > ref) throw() { if (m_ptr != ref.m_ptr) { delete [] m_ptr; m_ptr = ref.m_ptr; } return *this; } template< class T > T& auto_array< T >::operator[](int pos) throw() { return m_ptr[pos]; } template< class T > auto_array< T >::operator auto_array_ref< T >(void) throw() { return auto_array_ref< T >(release()); } } // namespace atf #endif // !defined(_ATF_CXX_AUTO_ARRAY_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/env.hpp0000644000470500017500000000575212271526120021246 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_ENV_HPP_) #define _ATF_CXX_ENV_HPP_ #include namespace atf { namespace env { // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ //! //! \brief Returns the value of an environment variable. //! //! Returns the value of the specified environment variable. The variable //! must be defined. //! std::string get(const std::string&); //! //! \brief Checks if the environment has a variable. //! //! Checks if the environment has a given variable. //! bool has(const std::string&); //! //! \brief Sets an environment variable to a given value. //! //! Sets the specified environment variable to the given value. Note that //! variables set to the empty string are different to undefined ones. //! //! Be aware that this alters the program's global status, which in general //! is a bad thing to do due to the side-effects it may have. There are //! some legitimate usages for this function, though. //! void set(const std::string&, const std::string&); //! //! \brief Unsets an environment variable. //! //! Unsets the specified environment variable Note that undefined //! variables are different to those defined but set to an empty value. //! //! Be aware that this alters the program's global status, which in general //! is a bad thing to do due to the side-effects it may have. There are //! some legitimate usages for this function, though. //! void unset(const std::string&); } // namespace env } // namespace atf #endif // !defined(_ATF_CXX_ENV_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/parser.cpp0000644000470500017500000002347512271526120021747 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "parser.hpp" #include "sanity.hpp" #include "text.hpp" namespace impl = atf::parser; #define IMPL_NAME "atf::parser" // ------------------------------------------------------------------------ // The "parse_error" class. // ------------------------------------------------------------------------ impl::parse_error::parse_error(size_t line, std::string msg) : std::runtime_error(msg), std::pair< size_t, std::string >(line, msg) { } impl::parse_error::~parse_error(void) throw() { } const char* impl::parse_error::what(void) const throw() { try { std::ostringstream oss; oss << "LONELY PARSE ERROR: " << first << ": " << second; m_msg = oss.str(); return m_msg.c_str(); } catch (...) { return "Could not format message for parsing error."; } } impl::parse_error::operator std::string(void) const { return atf::text::to_string(first) + ": " + second; } // ------------------------------------------------------------------------ // The "parse_errors" class. // ------------------------------------------------------------------------ impl::parse_errors::parse_errors(void) : std::runtime_error("No parsing errors yet") { m_msg.clear(); } impl::parse_errors::~parse_errors(void) throw() { } const char* impl::parse_errors::what(void) const throw() { try { m_msg = atf::text::join(*this, "\n"); return m_msg.c_str(); } catch (...) { return "Could not format messages for parsing errors."; } } // ------------------------------------------------------------------------ // The "format_error" class. // ------------------------------------------------------------------------ impl::format_error::format_error(const std::string& w) : std::runtime_error(w.c_str()) { } // ------------------------------------------------------------------------ // The "token" class. // ------------------------------------------------------------------------ impl::token::token(void) : m_inited(false) { } impl::token::token(size_t p_line, const token_type& p_type, const std::string& p_text) : m_inited(true), m_line(p_line), m_type(p_type), m_text(p_text) { } size_t impl::token::lineno(void) const { return m_line; } const impl::token_type& impl::token::type(void) const { return m_type; } const std::string& impl::token::text(void) const { return m_text; } impl::token::operator bool(void) const { return m_inited; } bool impl::token::operator!(void) const { return !m_inited; } // ------------------------------------------------------------------------ // The "header_entry" class. // ------------------------------------------------------------------------ impl::header_entry::header_entry(void) { } impl::header_entry::header_entry(const std::string& n, const std::string& v, attrs_map as) : m_name(n), m_value(v), m_attrs(as) { } const std::string& impl::header_entry::name(void) const { return m_name; } const std::string& impl::header_entry::value(void) const { return m_value; } const impl::attrs_map& impl::header_entry::attrs(void) const { return m_attrs; } bool impl::header_entry::has_attr(const std::string& n) const { return m_attrs.find(n) != m_attrs.end(); } const std::string& impl::header_entry::get_attr(const std::string& n) const { attrs_map::const_iterator iter = m_attrs.find(n); PRE(iter != m_attrs.end()); return (*iter).second; } // ------------------------------------------------------------------------ // The header tokenizer. // ------------------------------------------------------------------------ namespace header { static const impl::token_type eof_type = 0; static const impl::token_type nl_type = 1; static const impl::token_type text_type = 2; static const impl::token_type colon_type = 3; static const impl::token_type semicolon_type = 4; static const impl::token_type dblquote_type = 5; static const impl::token_type equal_type = 6; class tokenizer : public impl::tokenizer< std::istream > { public: tokenizer(std::istream& is, size_t curline) : impl::tokenizer< std::istream > (is, true, eof_type, nl_type, text_type, curline) { add_delim(';', semicolon_type); add_delim(':', colon_type); add_delim('=', equal_type); add_quote('"', dblquote_type); } }; static impl::parser< header::tokenizer >& read(impl::parser< header::tokenizer >& p, impl::header_entry& he) { using namespace header; impl::token t = p.expect(text_type, nl_type, "a header name"); if (t.type() == nl_type) { he = impl::header_entry(); return p; } std::string hdr_name = t.text(); t = p.expect(colon_type, "`:'"); t = p.expect(text_type, "a textual value"); std::string hdr_value = t.text(); impl::attrs_map attrs; for (;;) { t = p.expect(eof_type, semicolon_type, nl_type, "eof, `;' or new line"); if (t.type() == eof_type || t.type() == nl_type) break; t = p.expect(text_type, "an attribute name"); std::string attr_name = t.text(); t = p.expect(equal_type, "`='"); t = p.expect(text_type, "word or quoted string"); std::string attr_value = t.text(); attrs[attr_name] = attr_value; } he = impl::header_entry(hdr_name, hdr_value, attrs); return p; } static std::ostream& write(std::ostream& os, const impl::header_entry& he) { std::string line = he.name() + ": " + he.value(); impl::attrs_map as = he.attrs(); for (impl::attrs_map::const_iterator iter = as.begin(); iter != as.end(); iter++) { PRE((*iter).second.find('\"') == std::string::npos); line += "; " + (*iter).first + "=\"" + (*iter).second + "\""; } os << line << "\n"; return os; } } // namespace header // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ std::pair< size_t, impl::headers_map > impl::read_headers(std::istream& is, size_t curline) { using impl::format_error; headers_map hm; // // Grammar // // header = entry+ nl // entry = line nl // line = text colon text // (semicolon (text equal (text | dblquote string dblquote)))* // string = quoted_string // header::tokenizer tkz(is, curline); impl::parser< header::tokenizer > p(tkz); bool first = true; for (;;) { try { header_entry he; if (!header::read(p, he).good() || he.name().empty()) break; if (first && he.name() != "Content-Type") throw format_error("Could not determine content type"); else first = false; hm[he.name()] = he; } catch (const impl::parse_error& pe) { p.add_error(pe); p.reset(header::nl_type); } } if (!is.good()) throw format_error("Unexpected end of stream"); return std::pair< size_t, headers_map >(tkz.lineno(), hm); } void impl::write_headers(const impl::headers_map& hm, std::ostream& os) { PRE(!hm.empty()); headers_map::const_iterator ct = hm.find("Content-Type"); PRE(ct != hm.end()); header::write(os, (*ct).second); for (headers_map::const_iterator iter = hm.begin(); iter != hm.end(); iter++) { if ((*iter).first != "Content-Type") header::write(os, (*iter).second); } os << "\n"; } void impl::validate_content_type(const impl::headers_map& hm, const std::string& fmt, int version) { using impl::format_error; headers_map::const_iterator iter = hm.find("Content-Type"); if (iter == hm.end()) throw format_error("Could not determine content type"); const header_entry& he = (*iter).second; if (he.value() != fmt) throw format_error("Mismatched content type: expected `" + fmt + "' but got `" + he.value() + "'"); if (!he.has_attr("version")) throw format_error("Could not determine version"); const std::string& vstr = atf::text::to_string(version); if (he.get_attr("version") != vstr) throw format_error("Mismatched version: expected `" + vstr + "' but got `" + he.get_attr("version") + "'"); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/ui.cpp0000644000470500017500000001152712271526120021063 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include #include } #include #include "env.hpp" #include "text.hpp" #include "sanity.hpp" #include "text.hpp" #include "ui.hpp" namespace impl = atf::ui; #define IMPL_NAME "atf::ui" static size_t terminal_width(void) { static bool done = false; static size_t width = 0; if (!done) { if (atf::env::has("COLUMNS")) { const std::string cols = atf::env::get("COLUMNS"); if (cols.length() > 0) { width = atf::text::to_type< size_t >(cols); } } else { struct winsize ws; if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) width = ws.ws_col; } if (width >= 80) width -= 5; done = true; } return width; } static std::string format_paragraph(const std::string& text, const std::string& tag, const bool first, const bool repeat, const size_t col) { PRE(text.find('\n') == std::string::npos); const std::string pad(col - tag.length(), ' '); const std::string fullpad(col, ' '); std::string formatted; if (first || repeat) formatted = tag + pad; else formatted = fullpad; INV(formatted.length() == col); size_t curcol = col; const size_t maxcol = terminal_width(); std::vector< std::string > words = atf::text::split(text, " "); for (std::vector< std::string >::const_iterator iter = words.begin(); iter != words.end(); iter++) { const std::string& word = *iter; if (iter != words.begin() && maxcol > 0 && curcol + word.length() + 1 > maxcol) { if (repeat) formatted += '\n' + tag + pad; else formatted += '\n' + fullpad; curcol = col; } else if (iter != words.begin()) { formatted += ' '; curcol++; } formatted += word; curcol += word.length(); } return formatted; } std::string impl::format_error(const std::string& prog_name, const std::string& error) { return format_text_with_tag("ERROR: " + error, prog_name + ": ", true); } std::string impl::format_info(const std::string& prog_name, const std::string& msg) { return format_text_with_tag(msg, prog_name + ": ", true); } std::string impl::format_text(const std::string& text) { return format_text_with_tag(text, "", false, 0); } std::string impl::format_text_with_tag(const std::string& text, const std::string& tag, bool repeat, size_t col) { PRE(col == 0 || col >= tag.length()); if (col == 0) col = tag.length(); std::string formatted; std::vector< std::string > lines = atf::text::split(text, "\n"); for (std::vector< std::string >::const_iterator iter = lines.begin(); iter != lines.end(); iter++) { const std::string& line = *iter; formatted += format_paragraph(line, tag, iter == lines.begin(), repeat, col); if (iter + 1 != lines.end()) { if (repeat) formatted += "\n" + tag + "\n"; else formatted += "\n\n"; } } return formatted; } std::string impl::format_warning(const std::string& prog_name, const std::string& error) { return format_text_with_tag("WARNING: " + error, prog_name + ": ", true); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/application_test.cpp0000644000470500017500000000602212271526120024002 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include "application.hpp" #include "../macros.hpp" class getopt_app : public atf::application::app { public: getopt_app(void) : app("description", "manpage", "other") {} int main(void) { // Provide an option that is unknown to the application driver and // one that is, together with an argument that would be swallowed by // the test program option if it were recognized. int argc = 4; char arg1[] = "progname"; char arg2[] = "-Z"; char arg3[] = "-s"; char arg4[] = "foo"; char *const argv[] = { arg1, arg2, arg3, arg4, NULL }; int ch; bool zflag; // Given that this obviously is an application, and that we used the // same driver to start, we can test getopt(3) right here without doing // any fancy stuff. zflag = false; while ((ch = ::getopt(argc, argv, ":Z")) != -1) { switch (ch) { case 'Z': zflag = true; break; case '?': default: if (optopt != 's') ATF_FAIL("Unexpected unknown option found"); } } ATF_REQUIRE(zflag); ATF_REQUIRE_EQ(1, argc - optind); ATF_REQUIRE_EQ(std::string("foo"), argv[optind]); return 0; } }; ATF_TEST_CASE_WITHOUT_HEAD(getopt); ATF_TEST_CASE_BODY(getopt) { int argc = 1; char arg1[] = "progname"; char *const argv[] = { arg1, NULL }; ATF_REQUIRE_EQ(0, getopt_app().run(argc, argv)); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, getopt); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/test_helpers.cpp0000644000470500017500000001002512271526120023137 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include #include #include "../check.hpp" #include "../config.hpp" #include "../macros.hpp" #include "fs.hpp" #include "process.hpp" #include "test_helpers.hpp" void build_check_cxx_o_aux(const atf::fs::path& sfile, const char* failmsg, const bool expect_pass) { std::vector< std::string > optargs; optargs.push_back("-I" + atf::config::get("atf_includedir")); optargs.push_back("-Wall"); optargs.push_back("-Werror"); const bool result = atf::check::build_cxx_o( sfile.str(), "test.o", atf::process::argv_array(optargs)); if ((expect_pass && !result) || (!expect_pass && result)) ATF_FAIL(failmsg); } void build_check_cxx_o(const atf::tests::tc& tc, const char* sfile, const char* failmsg, const bool expect_pass) { const atf::fs::path sfilepath = atf::fs::path(tc.get_config_var("srcdir")) / sfile; build_check_cxx_o_aux(sfilepath, failmsg, expect_pass); } void header_check(const char *hdrname) { std::ofstream srcfile("test.c"); ATF_REQUIRE(srcfile); srcfile << "#include <" << hdrname << ">\n"; srcfile.close(); const std::string failmsg = std::string("Header check failed; ") + hdrname + " is not self-contained"; build_check_cxx_o_aux(atf::fs::path("test.c"), failmsg.c_str(), true); } atf::fs::path get_process_helpers_path(const atf::tests::tc& tc) { return atf::fs::path(tc.get_config_var("srcdir")) / ".." / "atf-c" / "detail" / "process_helpers"; } void test_helpers_detail::check_equal(const char* expected[], const string_vector& actual) { const char** expected_iter = expected; string_vector::const_iterator actual_iter = actual.begin(); bool equals = true; while (equals && *expected_iter != NULL && actual_iter != actual.end()) { if (*expected_iter != *actual_iter) { equals = false; } else { expected_iter++; actual_iter++; } } if (equals && ((*expected_iter == NULL && actual_iter != actual.end()) || (*expected_iter != NULL && actual_iter == actual.end()))) equals = false; if (!equals) { std::cerr << "EXPECTED:\n"; for (expected_iter = expected; *expected_iter != NULL; expected_iter++) std::cerr << *expected_iter << "\n"; std::cerr << "ACTUAL:\n"; for (actual_iter = actual.begin(); actual_iter != actual.end(); actual_iter++) std::cerr << *actual_iter << "\n"; ATF_FAIL("Expected results differ to actual values"); } } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/test_helpers.hpp0000644000470500017500000001156312271526120023154 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(TESTS_ATF_ATF_CXX_TEST_HELPERS_H) # error "Cannot include test_helpers.hpp more than once." #else # define TESTS_ATF_ATF_CXX_TEST_HELPERS_H #endif #include #include #include #include #include "../macros.hpp" #include "../tests.hpp" #include "parser.hpp" #include "process.hpp" #include "text.hpp" #define HEADER_TC(name, hdrname) \ ATF_TEST_CASE(name); \ ATF_TEST_CASE_HEAD(name) \ { \ set_md_var("descr", "Tests that the " hdrname " file can be " \ "included on its own, without any prerequisites"); \ } \ ATF_TEST_CASE_BODY(name) \ { \ header_check(hdrname); \ } #define BUILD_TC(name, sfile, descr, failmsg) \ ATF_TEST_CASE(name); \ ATF_TEST_CASE_HEAD(name) \ { \ set_md_var("descr", descr); \ } \ ATF_TEST_CASE_BODY(name) \ { \ build_check_cxx_o(*this, sfile, failmsg, true); \ } #define BUILD_TC_FAIL(name, sfile, descr, failmsg) \ ATF_TEST_CASE(name); \ ATF_TEST_CASE_HEAD(name) \ { \ set_md_var("descr", descr); \ } \ ATF_TEST_CASE_BODY(name) \ { \ build_check_cxx_o(*this, sfile, failmsg, false); \ } namespace atf { namespace tests { class tc; } } void header_check(const char*); void build_check_cxx_o(const atf::tests::tc&, const char*, const char*, bool); atf::fs::path get_process_helpers_path(const atf::tests::tc&); struct run_h_tc_data { const atf::tests::vars_map& m_config; run_h_tc_data(const atf::tests::vars_map& config) : m_config(config) {} }; template< class TestCase > void run_h_tc_child(void* v) { run_h_tc_data* data = static_cast< run_h_tc_data* >(v); TestCase tc; tc.init(data->m_config); tc.run("result"); std::exit(EXIT_SUCCESS); } template< class TestCase > void run_h_tc(atf::tests::vars_map config = atf::tests::vars_map()) { run_h_tc_data data(config); atf::process::child c = atf::process::fork( run_h_tc_child< TestCase >, atf::process::stream_redirect_path(atf::fs::path("stdout")), atf::process::stream_redirect_path(atf::fs::path("stderr")), &data); const atf::process::status s = c.wait(); ATF_REQUIRE(s.exited()); } namespace test_helpers_detail { typedef std::vector< std::string > string_vector; template< class Reader > std::pair< string_vector, string_vector > do_read(const char* input) { string_vector errors; std::istringstream is(input); Reader reader(is); try { reader.read(); } catch (const atf::parser::parse_errors& pes) { for (std::vector< atf::parser::parse_error >::const_iterator iter = pes.begin(); iter != pes.end(); iter++) errors.push_back(*iter); } catch (const atf::parser::parse_error& pe) { ATF_FAIL("Raised a lonely parse error: " + atf::text::to_string(pe.first) + ": " + pe.second); } return std::make_pair(reader.m_calls, errors); } void check_equal(const char*[], const string_vector&); } // namespace test_helpers_detail template< class Reader > void do_parser_test(const char* input, const char* exp_calls[], const char* exp_errors[]) { const std::pair< test_helpers_detail::string_vector, test_helpers_detail::string_vector > actual = test_helpers_detail::do_read< Reader >(input); test_helpers_detail::check_equal(exp_calls, actual.first); test_helpers_detail::check_equal(exp_errors, actual.second); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/expand.hpp0000644000470500017500000000554512271526120021735 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_EXPAND_HPP_) #define _ATF_CXX_EXPAND_HPP_ #include #include namespace atf { namespace expand { // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ //! //! \brief Checks if the given string is a glob pattern. //! //! Returns true if the given string is a glob pattern; i.e. if it contains //! any character that will be expanded by expand_glob. //! bool is_glob(const std::string&); //! //! \brief Checks if a given string matches a glob pattern. //! //! Given a glob pattern and a string, checks whether the former matches //! the latter. Returns a boolean indicating this condition. //! bool matches_glob(const std::string&, const std::string&); //! //! \brief Expands a glob pattern among multiple candidates. //! //! Given a glob pattern and a set of candidate strings, checks which of //! those strings match the glob pattern and returns them. //! template< class T > std::vector< std::string > expand_glob(const std::string& glob, const T& candidates) { std::vector< std::string > exps; for (typename T::const_iterator iter = candidates.begin(); iter != candidates.end(); iter++) if (matches_glob(glob, *iter)) exps.push_back(*iter); return exps; } } // namespace expand } // namespace atf #endif // !defined(_ATF_CXX_EXPAND_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/process_test.cpp0000644000470500017500000002541512271526120023164 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "../macros.hpp" #include "process.hpp" #include "test_helpers.hpp" // TODO: Testing the fork function is a huge task and I'm afraid of // copy/pasting tons of stuff from the C version. I'd rather not do that // until some code can be shared, which cannot happen until the C++ binding // is cleaned by a fair amount. Instead... just rely (at the moment) on // the system tests for the tools using this module. // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static std::size_t array_size(const char* const* array) { std::size_t size = 0; for (const char* const* ptr = array; *ptr != NULL; ptr++) size++; return size; } static atf::process::status exec_process_helpers(const atf::tests::tc& tc, const char* helper_name) { using atf::process::exec; std::vector< std::string > argv; argv.push_back(get_process_helpers_path(tc).leaf_name()); argv.push_back(helper_name); return exec(get_process_helpers_path(tc), atf::process::argv_array(argv), atf::process::stream_inherit(), atf::process::stream_inherit()); } // ------------------------------------------------------------------------ // Tests for the "argv_array" type. // ------------------------------------------------------------------------ ATF_TEST_CASE(argv_array_init_carray); ATF_TEST_CASE_HEAD(argv_array_init_carray) { set_md_var("descr", "Tests that argv_array is correctly constructed " "from a C-style array of strings"); } ATF_TEST_CASE_BODY(argv_array_init_carray) { { const char* const carray[] = { NULL }; atf::process::argv_array argv(carray); ATF_REQUIRE_EQ(argv.size(), 0); } { const char* const carray[] = { "arg0", NULL }; atf::process::argv_array argv(carray); ATF_REQUIRE_EQ(argv.size(), 1); ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0); } { const char* const carray[] = { "arg0", "arg1", "arg2", NULL }; atf::process::argv_array argv(carray); ATF_REQUIRE_EQ(argv.size(), 3); ATF_REQUIRE(std::strcmp(argv[0], carray[0]) == 0); ATF_REQUIRE(std::strcmp(argv[1], carray[1]) == 0); ATF_REQUIRE(std::strcmp(argv[2], carray[2]) == 0); } } ATF_TEST_CASE(argv_array_init_col); ATF_TEST_CASE_HEAD(argv_array_init_col) { set_md_var("descr", "Tests that argv_array is correctly constructed " "from a string collection"); } ATF_TEST_CASE_BODY(argv_array_init_col) { { std::vector< std::string > col; atf::process::argv_array argv(col); ATF_REQUIRE_EQ(argv.size(), 0); } { std::vector< std::string > col; col.push_back("arg0"); atf::process::argv_array argv(col); ATF_REQUIRE_EQ(argv.size(), 1); ATF_REQUIRE_EQ(argv[0], col[0]); } { std::vector< std::string > col; col.push_back("arg0"); col.push_back("arg1"); col.push_back("arg2"); atf::process::argv_array argv(col); ATF_REQUIRE_EQ(argv.size(), 3); ATF_REQUIRE_EQ(argv[0], col[0]); ATF_REQUIRE_EQ(argv[1], col[1]); ATF_REQUIRE_EQ(argv[2], col[2]); } } ATF_TEST_CASE(argv_array_init_empty); ATF_TEST_CASE_HEAD(argv_array_init_empty) { set_md_var("descr", "Tests that argv_array is correctly constructed " "by the default constructor"); } ATF_TEST_CASE_BODY(argv_array_init_empty) { atf::process::argv_array argv; ATF_REQUIRE_EQ(argv.size(), 0); } ATF_TEST_CASE(argv_array_init_varargs); ATF_TEST_CASE_HEAD(argv_array_init_varargs) { set_md_var("descr", "Tests that argv_array is correctly constructed " "from a variable list of arguments"); } ATF_TEST_CASE_BODY(argv_array_init_varargs) { { atf::process::argv_array argv("arg0", NULL); ATF_REQUIRE_EQ(argv.size(), 1); ATF_REQUIRE_EQ(argv[0], std::string("arg0")); } { atf::process::argv_array argv("arg0", "arg1", "arg2", NULL); ATF_REQUIRE_EQ(argv.size(), 3); ATF_REQUIRE_EQ(argv[0], std::string("arg0")); ATF_REQUIRE_EQ(argv[1], std::string("arg1")); ATF_REQUIRE_EQ(argv[2], std::string("arg2")); } } ATF_TEST_CASE(argv_array_assign); ATF_TEST_CASE_HEAD(argv_array_assign) { set_md_var("descr", "Tests that assigning an argv_array works"); } ATF_TEST_CASE_BODY(argv_array_assign) { using atf::process::argv_array; const char* const carray1[] = { "arg1", NULL }; const char* const carray2[] = { "arg1", "arg2", NULL }; std::auto_ptr< argv_array > argv1(new argv_array(carray1)); std::auto_ptr< argv_array > argv2(new argv_array(carray2)); *argv2 = *argv1; ATF_REQUIRE_EQ(argv2->size(), argv1->size()); ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0); ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv()); argv1.release(); { const char* const* eargv2 = argv2->exec_argv(); ATF_REQUIRE(std::strcmp(eargv2[0], carray1[0]) == 0); ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL)); } argv2.release(); } ATF_TEST_CASE(argv_array_copy); ATF_TEST_CASE_HEAD(argv_array_copy) { set_md_var("descr", "Tests that copying an argv_array constructed from " "a C-style array of strings works"); } ATF_TEST_CASE_BODY(argv_array_copy) { using atf::process::argv_array; const char* const carray[] = { "arg0", NULL }; std::auto_ptr< argv_array > argv1(new argv_array(carray)); std::auto_ptr< argv_array > argv2(new argv_array(*argv1)); ATF_REQUIRE_EQ(argv2->size(), argv1->size()); ATF_REQUIRE(std::strcmp((*argv2)[0], (*argv1)[0]) == 0); ATF_REQUIRE(argv2->exec_argv() != argv1->exec_argv()); argv1.release(); { const char* const* eargv2 = argv2->exec_argv(); ATF_REQUIRE(std::strcmp(eargv2[0], carray[0]) == 0); ATF_REQUIRE_EQ(eargv2[1], static_cast< const char* >(NULL)); } argv2.release(); } ATF_TEST_CASE(argv_array_exec_argv); ATF_TEST_CASE_HEAD(argv_array_exec_argv) { set_md_var("descr", "Tests that the exec argv provided by an argv_array " "is correct"); } ATF_TEST_CASE_BODY(argv_array_exec_argv) { using atf::process::argv_array; { argv_array argv; const char* const* eargv = argv.exec_argv(); ATF_REQUIRE_EQ(array_size(eargv), 0); ATF_REQUIRE_EQ(eargv[0], static_cast< const char* >(NULL)); } { const char* const carray[] = { "arg0", NULL }; argv_array argv(carray); const char* const* eargv = argv.exec_argv(); ATF_REQUIRE_EQ(array_size(eargv), 1); ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0); ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL)); } { std::vector< std::string > col; col.push_back("arg0"); argv_array argv(col); const char* const* eargv = argv.exec_argv(); ATF_REQUIRE_EQ(array_size(eargv), 1); ATF_REQUIRE(std::strcmp(eargv[0], "arg0") == 0); ATF_REQUIRE_EQ(eargv[1], static_cast< const char* >(NULL)); } } ATF_TEST_CASE(argv_array_iter); ATF_TEST_CASE_HEAD(argv_array_iter) { set_md_var("descr", "Tests that an argv_array can be iterated"); } ATF_TEST_CASE_BODY(argv_array_iter) { using atf::process::argv_array; std::vector< std::string > vector; vector.push_back("arg0"); vector.push_back("arg1"); vector.push_back("arg2"); argv_array argv(vector); ATF_REQUIRE_EQ(argv.size(), 3); std::vector< std::string >::size_type pos = 0; for (argv_array::const_iterator iter = argv.begin(); iter != argv.end(); iter++) { ATF_REQUIRE_EQ(*iter, vector[pos]); pos++; } } // ------------------------------------------------------------------------ // Tests cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(exec_failure); ATF_TEST_CASE_HEAD(exec_failure) { set_md_var("descr", "Tests execing a command that reports failure"); } ATF_TEST_CASE_BODY(exec_failure) { const atf::process::status s = exec_process_helpers(*this, "exit-failure"); ATF_REQUIRE(s.exited()); ATF_REQUIRE_EQ(s.exitstatus(), EXIT_FAILURE); } ATF_TEST_CASE(exec_success); ATF_TEST_CASE_HEAD(exec_success) { set_md_var("descr", "Tests execing a command that reports success"); } ATF_TEST_CASE_BODY(exec_success) { const atf::process::status s = exec_process_helpers(*this, "exit-success"); ATF_REQUIRE(s.exited()); ATF_REQUIRE_EQ(s.exitstatus(), EXIT_SUCCESS); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the "argv_array" type. ATF_ADD_TEST_CASE(tcs, argv_array_assign); ATF_ADD_TEST_CASE(tcs, argv_array_copy); ATF_ADD_TEST_CASE(tcs, argv_array_exec_argv); ATF_ADD_TEST_CASE(tcs, argv_array_init_carray); ATF_ADD_TEST_CASE(tcs, argv_array_init_col); ATF_ADD_TEST_CASE(tcs, argv_array_init_empty); ATF_ADD_TEST_CASE(tcs, argv_array_init_varargs); ATF_ADD_TEST_CASE(tcs, argv_array_iter); // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, exec_failure); ATF_ADD_TEST_CASE(tcs, exec_success); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/Atffile0000644000470500017500000000035612271526120021235 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: application_test tp: auto_array_test tp: env_test tp: exceptions_test tp: expand_test tp: fs_test tp: parser_test tp: sanity_test tp: text_test tp: ui_test bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/parser.hpp0000644000470500017500000003747312271526120021757 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_PARSER_HPP_) #define _ATF_CXX_PARSER_HPP_ #include #include #include #include #include #include #include namespace atf { namespace parser { // ------------------------------------------------------------------------ // The "parse_error" class. // ------------------------------------------------------------------------ class parse_error : public std::runtime_error, public std::pair< size_t, std::string > { mutable std::string m_msg; public: parse_error(size_t, std::string); ~parse_error(void) throw(); const char* what(void) const throw(); operator std::string(void) const; }; // ------------------------------------------------------------------------ // The "parse_errors" class. // ------------------------------------------------------------------------ class parse_errors : public std::runtime_error, public std::vector< parse_error > { std::vector< parse_error > m_errors; mutable std::string m_msg; public: parse_errors(void); ~parse_errors(void) throw(); const char* what(void) const throw(); }; // ------------------------------------------------------------------------ // The "format_error" class. // ------------------------------------------------------------------------ class format_error : public std::runtime_error { public: format_error(const std::string&); }; // ------------------------------------------------------------------------ // The "token" class. // ------------------------------------------------------------------------ typedef int token_type; //! //! \brief Representation of a read token. //! //! A pair that contains the information of a token read from a stream. //! It contains the token's type and its associated data, if any. //! struct token { bool m_inited; size_t m_line; token_type m_type; std::string m_text; public: token(void); token(size_t, const token_type&, const std::string& = ""); size_t lineno(void) const; const token_type& type(void) const; const std::string& text(void) const; operator bool(void) const; bool operator!(void) const; }; // ------------------------------------------------------------------------ // The "tokenizer" class. // ------------------------------------------------------------------------ //! //! \brief A stream tokenizer. //! //! This template implements an extremely simple, line-oriented stream //! tokenizer. It is only able to recognize one character-long delimiters, //! random-length keywords, skip whitespace and, anything that does not //! match these rules is supposed to be a word. //! //! Parameter IS: The input stream's type. //! template< class IS > class tokenizer { IS& m_is; size_t m_lineno; token m_la; bool m_skipws; token_type m_eof_type, m_nl_type, m_text_type; std::map< char, token_type > m_delims_map; std::string m_delims_str; char m_quotech; token_type m_quotetype; std::map< std::string, token_type > m_keywords_map; token_type alloc_type(void); template< class TKZ > friend class parser; public: tokenizer(IS&, bool, const token_type&, const token_type&, const token_type&, size_t = 1); size_t lineno(void) const; void add_delim(char, const token_type&); void add_keyword(const std::string&, const token_type&); void add_quote(char, const token_type&); token next(void); std::string rest_of_line(void); }; template< class IS > tokenizer< IS >::tokenizer(IS& p_is, bool p_skipws, const token_type& p_eof_type, const token_type& p_nl_type, const token_type& p_text_type, size_t p_lineno) : m_is(p_is), m_lineno(p_lineno), m_skipws(p_skipws), m_eof_type(p_eof_type), m_nl_type(p_nl_type), m_text_type(p_text_type), m_quotech(-1) { } template< class IS > size_t tokenizer< IS >::lineno(void) const { return m_lineno; } template< class IS > void tokenizer< IS >::add_delim(char delim, const token_type& type) { m_delims_map[delim] = type; m_delims_str += delim; } template< class IS > void tokenizer< IS >::add_keyword(const std::string& keyword, const token_type& type) { m_keywords_map[keyword] = type; } template< class IS > void tokenizer< IS >::add_quote(char ch, const token_type& type) { m_quotech = ch; m_quotetype = type; } template< class IS > token tokenizer< IS >::next(void) { if (m_la) { token t = m_la; m_la = token(); if (t.type() == m_nl_type) m_lineno++; return t; } char ch; std::string text; bool done = false, quoted = false; token t(m_lineno, m_eof_type, "<>"); while (!done && m_is.get(ch).good()) { if (ch == m_quotech) { if (text.empty()) { bool escaped = false; while (!done && m_is.get(ch).good()) { if (!escaped) { if (ch == '\\') escaped = true; else if (ch == '\n') { m_la = token(m_lineno, m_nl_type, "<>"); throw parse_error(t.lineno(), "Missing double quotes before " "end of line"); } else if (ch == m_quotech) done = true; else text += ch; } else { text += ch; escaped = false; } } if (!m_is.good()) throw parse_error(t.lineno(), "Missing double quotes before " "end of file"); t = token(m_lineno, m_text_type, text); quoted = true; } else { m_is.unget(); done = true; } } else { typename std::map< char, token_type >::const_iterator idelim; idelim = m_delims_map.find(ch); if (idelim != m_delims_map.end()) { done = true; if (text.empty()) t = token(m_lineno, (*idelim).second, std::string("") + ch); else m_is.unget(); } else if (ch == '\n') { done = true; if (text.empty()) t = token(m_lineno, m_nl_type, "<>"); else m_is.unget(); } else if (m_skipws && (ch == ' ' || ch == '\t')) { if (!text.empty()) done = true; } else text += ch; } } if (!quoted && !text.empty()) { typename std::map< std::string, token_type >::const_iterator ikw; ikw = m_keywords_map.find(text); if (ikw != m_keywords_map.end()) t = token(m_lineno, (*ikw).second, text); else t = token(m_lineno, m_text_type, text); } if (t.type() == m_nl_type) m_lineno++; return t; } template< class IS > std::string tokenizer< IS >::rest_of_line(void) { std::string str; while (m_is.good() && m_is.peek() != '\n') str += m_is.get(); return str; } // ------------------------------------------------------------------------ // The "parser" class. // ------------------------------------------------------------------------ template< class TKZ > class parser { TKZ& m_tkz; token m_last; parse_errors m_errors; bool m_thrown; public: parser(TKZ& tkz); ~parser(void); bool good(void) const; void add_error(const parse_error&); bool has_errors(void) const; token next(void); std::string rest_of_line(void); token reset(const token_type&); token expect(const token_type&, const std::string&); token expect(const token_type&, const token_type&, const std::string&); token expect(const token_type&, const token_type&, const token_type&, const std::string&); token expect(const token_type&, const token_type&, const token_type&, const token_type&, const std::string&); token expect(const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const std::string&); token expect(const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const token_type&, const std::string&); }; template< class TKZ > parser< TKZ >::parser(TKZ& tkz) : m_tkz(tkz), m_thrown(false) { } template< class TKZ > parser< TKZ >::~parser(void) { if (!m_errors.empty() && !m_thrown) throw m_errors; } template< class TKZ > bool parser< TKZ >::good(void) const { return m_tkz.m_is.good(); } template< class TKZ > void parser< TKZ >::add_error(const parse_error& pe) { m_errors.push_back(pe); } template< class TKZ > bool parser< TKZ >::has_errors(void) const { return !m_errors.empty(); } template< class TKZ > token parser< TKZ >::next(void) { token t = m_tkz.next(); m_last = t; if (t.type() == m_tkz.m_eof_type) { if (!m_errors.empty()) { m_thrown = true; throw m_errors; } } return t; } template< class TKZ > std::string parser< TKZ >::rest_of_line(void) { return m_tkz.rest_of_line(); } template< class TKZ > token parser< TKZ >::reset(const token_type& stop) { token t = m_last; while (t.type() != m_tkz.m_eof_type && t.type() != stop) t = next(); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const std::string& textual) { token t = next(); if (t.type() != t1) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const token_type& t2, const std::string& textual) { token t = next(); if (t.type() != t1 && t.type() != t2) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const token_type& t2, const token_type& t3, const std::string& textual) { token t = next(); if (t.type() != t1 && t.type() != t2 && t.type() != t3) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const token_type& t2, const token_type& t3, const token_type& t4, const std::string& textual) { token t = next(); if (t.type() != t1 && t.type() != t2 && t.type() != t3 && t.type() != t4) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const token_type& t2, const token_type& t3, const token_type& t4, const token_type& t5, const token_type& t6, const token_type& t7, const std::string& textual) { token t = next(); if (t.type() != t1 && t.type() != t2 && t.type() != t3 && t.type() != t4 && t.type() != t5 && t.type() != t6 && t.type() != t7) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } template< class TKZ > token parser< TKZ >::expect(const token_type& t1, const token_type& t2, const token_type& t3, const token_type& t4, const token_type& t5, const token_type& t6, const token_type& t7, const token_type& t8, const std::string& textual) { token t = next(); if (t.type() != t1 && t.type() != t2 && t.type() != t3 && t.type() != t4 && t.type() != t5 && t.type() != t6 && t.type() != t7 && t.type() != t8) throw parse_error(t.lineno(), "Unexpected token `" + t.text() + "'; expected " + textual); return t; } #define ATF_PARSER_CALLBACK(parser, func) \ do { \ if (!(parser).has_errors()) \ func; \ } while (false) // ------------------------------------------------------------------------ // Header parsing. // ------------------------------------------------------------------------ typedef std::map< std::string, std::string > attrs_map; class header_entry { std::string m_name; std::string m_value; attrs_map m_attrs; public: header_entry(void); header_entry(const std::string&, const std::string&, attrs_map = attrs_map()); const std::string& name(void) const; const std::string& value(void) const; const attrs_map& attrs(void) const; bool has_attr(const std::string&) const; const std::string& get_attr(const std::string&) const; }; typedef std::map< std::string, header_entry > headers_map; std::pair< size_t, headers_map > read_headers(std::istream&, size_t); void write_headers(const headers_map&, std::ostream&); void validate_content_type(const headers_map&, const std::string&, int); } // namespace parser } // namespace atf #endif // !defined(_ATF_CXX_PARSER_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/env_test.cpp0000644000470500017500000000604312271526120022272 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "../macros.hpp" #include "env.hpp" // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(has_get); ATF_TEST_CASE_HEAD(has_get) { set_md_var("descr", "Tests the has and get functions"); } ATF_TEST_CASE_BODY(has_get) { ATF_REQUIRE(atf::env::has("PATH")); ATF_REQUIRE(!atf::env::get("PATH").empty()); ATF_REQUIRE(!atf::env::has("_UNDEFINED_VARIABLE_")); } ATF_TEST_CASE(set); ATF_TEST_CASE_HEAD(set) { set_md_var("descr", "Tests the set function"); } ATF_TEST_CASE_BODY(set) { ATF_REQUIRE(atf::env::has("PATH")); const std::string& oldval = atf::env::get("PATH"); atf::env::set("PATH", "foo-bar"); ATF_REQUIRE(atf::env::get("PATH") != oldval); ATF_REQUIRE_EQ(atf::env::get("PATH"), "foo-bar"); ATF_REQUIRE(!atf::env::has("_UNDEFINED_VARIABLE_")); atf::env::set("_UNDEFINED_VARIABLE_", "foo2-bar2"); ATF_REQUIRE_EQ(atf::env::get("_UNDEFINED_VARIABLE_"), "foo2-bar2"); } ATF_TEST_CASE(unset); ATF_TEST_CASE_HEAD(unset) { set_md_var("descr", "Tests the unset function"); } ATF_TEST_CASE_BODY(unset) { ATF_REQUIRE(atf::env::has("PATH")); atf::env::unset("PATH"); ATF_REQUIRE(!atf::env::has("PATH")); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, has_get); ATF_ADD_TEST_CASE(tcs, set); ATF_ADD_TEST_CASE(tcs, unset); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/auto_array_test.cpp0000644000470500017500000002076612271526120023660 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include #include "atf-c/defs.h" #include "../macros.hpp" #include "auto_array.hpp" // ------------------------------------------------------------------------ // Tests for the "auto_array" class. // ------------------------------------------------------------------------ class test_array { public: int m_value; static ssize_t m_nblocks; static atf::auto_array< test_array > do_copy(atf::auto_array< test_array >& ta) { return atf::auto_array< test_array >(ta); } void* operator new(size_t size ATF_DEFS_ATTRIBUTE_UNUSED) { ATF_FAIL("New called but should have been new[]"); return new int(5); } void* operator new[](size_t size) { m_nblocks++; void* mem = ::operator new(size); std::cout << "Allocated 'test_array' object " << mem << "\n"; return mem; } void operator delete(void* mem ATF_DEFS_ATTRIBUTE_UNUSED) { ATF_FAIL("Delete called but should have been delete[]"); } void operator delete[](void* mem) { std::cout << "Releasing 'test_array' object " << mem << "\n"; if (m_nblocks == 0) ATF_FAIL("Unbalanced delete[]"); m_nblocks--; ::operator delete(mem); } }; ssize_t test_array::m_nblocks = 0; ATF_TEST_CASE(auto_array_scope); ATF_TEST_CASE_HEAD(auto_array_scope) { set_md_var("descr", "Tests the automatic scope handling in the " "auto_array smart pointer class"); } ATF_TEST_CASE_BODY(auto_array_scope) { using atf::auto_array; ATF_REQUIRE_EQ(test_array::m_nblocks, 0); { auto_array< test_array > t(new test_array[10]); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_copy); ATF_TEST_CASE_HEAD(auto_array_copy) { set_md_var("descr", "Tests the auto_array smart pointer class' copy " "constructor"); } ATF_TEST_CASE_BODY(auto_array_copy) { using atf::auto_array; ATF_REQUIRE_EQ(test_array::m_nblocks, 0); { auto_array< test_array > t1(new test_array[10]); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); { auto_array< test_array > t2(t1); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_copy_ref); ATF_TEST_CASE_HEAD(auto_array_copy_ref) { set_md_var("descr", "Tests the auto_array smart pointer class' copy " "constructor through the auxiliary auto_array_ref object"); } ATF_TEST_CASE_BODY(auto_array_copy_ref) { using atf::auto_array; ATF_REQUIRE_EQ(test_array::m_nblocks, 0); { auto_array< test_array > t1(new test_array[10]); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); { auto_array< test_array > t2 = test_array::do_copy(t1); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_get); ATF_TEST_CASE_HEAD(auto_array_get) { set_md_var("descr", "Tests the auto_array smart pointer class' get " "method"); } ATF_TEST_CASE_BODY(auto_array_get) { using atf::auto_array; test_array* ta = new test_array[10]; auto_array< test_array > t(ta); ATF_REQUIRE_EQ(t.get(), ta); } ATF_TEST_CASE(auto_array_release); ATF_TEST_CASE_HEAD(auto_array_release) { set_md_var("descr", "Tests the auto_array smart pointer class' release " "method"); } ATF_TEST_CASE_BODY(auto_array_release) { using atf::auto_array; test_array* ta1 = new test_array[10]; { auto_array< test_array > t(ta1); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); test_array* ta2 = t.release(); ATF_REQUIRE_EQ(ta2, ta1); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 1); delete [] ta1; } ATF_TEST_CASE(auto_array_reset); ATF_TEST_CASE_HEAD(auto_array_reset) { set_md_var("descr", "Tests the auto_array smart pointer class' reset " "method"); } ATF_TEST_CASE_BODY(auto_array_reset) { using atf::auto_array; test_array* ta1 = new test_array[10]; test_array* ta2 = new test_array[10]; ATF_REQUIRE_EQ(test_array::m_nblocks, 2); { auto_array< test_array > t(ta1); ATF_REQUIRE_EQ(test_array::m_nblocks, 2); t.reset(ta2); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); t.reset(); ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_assign); ATF_TEST_CASE_HEAD(auto_array_assign) { set_md_var("descr", "Tests the auto_array smart pointer class' " "assignment operator"); } ATF_TEST_CASE_BODY(auto_array_assign) { using atf::auto_array; ATF_REQUIRE_EQ(test_array::m_nblocks, 0); { auto_array< test_array > t1(new test_array[10]); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); { auto_array< test_array > t2; t2 = t1; ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_assign_ref); ATF_TEST_CASE_HEAD(auto_array_assign_ref) { set_md_var("descr", "Tests the auto_array smart pointer class' " "assignment operator through the auxiliary auto_array_ref " "object"); } ATF_TEST_CASE_BODY(auto_array_assign_ref) { using atf::auto_array; ATF_REQUIRE_EQ(test_array::m_nblocks, 0); { auto_array< test_array > t1(new test_array[10]); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); { auto_array< test_array > t2; t2 = test_array::do_copy(t1); ATF_REQUIRE_EQ(test_array::m_nblocks, 1); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_REQUIRE_EQ(test_array::m_nblocks, 0); } ATF_TEST_CASE(auto_array_access); ATF_TEST_CASE_HEAD(auto_array_access) { set_md_var("descr", "Tests the auto_array smart pointer class' access " "operator"); } ATF_TEST_CASE_BODY(auto_array_access) { using atf::auto_array; auto_array< test_array > t(new test_array[10]); for (int i = 0; i < 10; i++) t[i].m_value = i * 2; for (int i = 0; i < 10; i++) ATF_REQUIRE_EQ(t[i].m_value, i * 2); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test for the "auto_array" class. ATF_ADD_TEST_CASE(tcs, auto_array_scope); ATF_ADD_TEST_CASE(tcs, auto_array_copy); ATF_ADD_TEST_CASE(tcs, auto_array_copy_ref); ATF_ADD_TEST_CASE(tcs, auto_array_get); ATF_ADD_TEST_CASE(tcs, auto_array_release); ATF_ADD_TEST_CASE(tcs, auto_array_reset); ATF_ADD_TEST_CASE(tcs, auto_array_assign); ATF_ADD_TEST_CASE(tcs, auto_array_assign_ref); ATF_ADD_TEST_CASE(tcs, auto_array_access); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/application.cpp0000644000470500017500000002237412271526120022753 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif extern "C" { #include } #include #include #include #include #include extern "C" { #include "atf-c/defs.h" } #include "application.hpp" #include "sanity.hpp" #include "ui.hpp" #if !defined(HAVE_VSNPRINTF_IN_STD) namespace std { using ::vsnprintf; } #endif // !defined(HAVE_VSNPRINTF_IN_STD) namespace impl = atf::application; #define IMPL_NAME "atf::application" // ------------------------------------------------------------------------ // The "usage_error" class. // ------------------------------------------------------------------------ impl::usage_error::usage_error(const char *fmt, ...) throw() : std::runtime_error("usage_error; message unformatted") { va_list ap; va_start(ap, fmt); std::vsnprintf(m_text, sizeof(m_text), fmt, ap); va_end(ap); } impl::usage_error::~usage_error(void) throw() { } const char* impl::usage_error::what(void) const throw() { return m_text; } // ------------------------------------------------------------------------ // The "application" class. // ------------------------------------------------------------------------ impl::option::option(char ch, const std::string& a, const std::string& desc) : m_character(ch), m_argument(a), m_description(desc) { } bool impl::option::operator<(const impl::option& o) const { return m_character < o.m_character; } impl::app::app(const std::string& description, const std::string& manpage, const std::string& global_manpage, const bool use_ui) : m_hflag(false), m_argc(-1), m_argv(NULL), m_prog_name(NULL), m_description(description), m_manpage(manpage), m_global_manpage(global_manpage), m_use_ui(use_ui) { } impl::app::~app(void) { } bool impl::app::inited(void) { return m_argc != -1; } impl::app::options_set impl::app::options(void) { options_set opts = specific_options(); if (m_use_ui) { opts.insert(option('h', "", "Shows this help message")); } return opts; } std::string impl::app::specific_args(void) const { return ""; } impl::app::options_set impl::app::specific_options(void) const { return options_set(); } void impl::app::process_option(int ch ATF_DEFS_ATTRIBUTE_UNUSED, const char* arg ATF_DEFS_ATTRIBUTE_UNUSED) { } void impl::app::process_options(void) { PRE(inited()); std::string optstr; #if defined(HAVE_GNU_GETOPT) optstr += '+'; // Turn on POSIX behavior. #endif optstr += ':'; { options_set opts = options(); for (options_set::const_iterator iter = opts.begin(); iter != opts.end(); iter++) { const option& opt = (*iter); optstr += opt.m_character; if (!opt.m_argument.empty()) optstr += ':'; } } int ch; const int old_opterr = ::opterr; ::opterr = 0; while ((ch = ::getopt(m_argc, m_argv, optstr.c_str())) != -1) { switch (ch) { case 'h': INV(m_use_ui); m_hflag = true; break; case ':': throw usage_error("Option -%c requires an argument.", ::optopt); case '?': throw usage_error("Unknown option -%c.", ::optopt); default: process_option(ch, ::optarg); } } m_argc -= ::optind; m_argv += ::optind; // Clear getopt state just in case the test wants to use it. opterr = old_opterr; optind = 1; #if defined(HAVE_OPTRESET) optreset = 1; #endif } void impl::app::usage(std::ostream& os) { PRE(inited()); std::string args = specific_args(); if (!args.empty()) args = " " + args; os << ui::format_text_with_tag(std::string(m_prog_name) + " [options]" + args, "Usage: ", false) << "\n\n" << ui::format_text(m_description) << "\n\n"; options_set opts = options(); INV(!opts.empty()); os << "Available options:\n"; size_t coldesc = 0; for (options_set::const_iterator iter = opts.begin(); iter != opts.end(); iter++) { const option& opt = (*iter); if (opt.m_argument.length() + 1 > coldesc) coldesc = opt.m_argument.length() + 1; } for (options_set::const_iterator iter = opts.begin(); iter != opts.end(); iter++) { const option& opt = (*iter); std::string tag = std::string(" -") + opt.m_character; if (opt.m_argument.empty()) tag += " "; else tag += " " + opt.m_argument + " "; os << ui::format_text_with_tag(opt.m_description, tag, false, coldesc + 10) << "\n"; } os << "\n"; std::string gmp; if (!m_global_manpage.empty()) gmp = " and " + m_global_manpage; os << ui::format_text("For more details please see " + m_manpage + gmp + ".") << "\n"; } int impl::app::run(int argc, char* const* argv) { PRE(argc > 0); PRE(argv != NULL); m_argc = argc; m_argv = argv; m_argv0 = m_argv[0]; m_prog_name = std::strrchr(m_argv[0], '/'); if (m_prog_name == NULL) m_prog_name = m_argv[0]; else m_prog_name++; // Libtool workaround: if running from within the source tree (binaries // that are not installed yet), skip the "lt-" prefix added to files in // the ".libs" directory to show the real (not temporary) name. if (std::strncmp(m_prog_name, "lt-", 3) == 0) m_prog_name += 3; const std::string bug = std::string("This is probably a bug in ") + m_prog_name + " or one of the libraries it uses. Please report this problem to " PACKAGE_BUGREPORT " and provide as many details as possible " "describing how you got to this condition."; int errcode; try { int oldargc = m_argc; process_options(); if (m_hflag) { INV(m_use_ui); if (oldargc != 2) throw usage_error("-h must be given alone."); usage(std::cout); errcode = EXIT_SUCCESS; } else errcode = main(); } catch (const usage_error& e) { if (m_use_ui) { std::cerr << ui::format_error(m_prog_name, e.what()) << "\n" << ui::format_info(m_prog_name, std::string("Type `") + m_prog_name + " -h' for more details.") << "\n"; } else { std::cerr << m_prog_name << ": ERROR: " << e.what() << "\n"; std::cerr << m_prog_name << ": See " << m_manpage << " for usage " "details.\n"; } errcode = EXIT_FAILURE; } catch (const std::runtime_error& e) { if (m_use_ui) { std::cerr << ui::format_error(m_prog_name, std::string(e.what())) << "\n"; } else { std::cerr << m_prog_name << ": ERROR: " << e.what() << "\n"; } errcode = EXIT_FAILURE; } catch (const std::exception& e) { if (m_use_ui) { std::cerr << ui::format_error(m_prog_name, std::string("Caught " "unexpected error: ") + e.what() + "\n" + bug) << "\n"; } else { std::cerr << m_prog_name << ": ERROR: Caught unexpected error: " << e.what() << "\n"; } errcode = EXIT_FAILURE; } catch (...) { if (m_use_ui) { std::cerr << ui::format_error(m_prog_name, std::string("Caught " "unknown error\n") + bug) << "\n"; } else { std::cerr << m_prog_name << ": ERROR: Caught unknown error\n"; } errcode = EXIT_FAILURE; } return errcode; } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/sanity_test.cpp0000644000470500017500000000310512271526120023005 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "../macros.hpp" ATF_TEST_CASE_WITHOUT_HEAD(nothing); ATF_TEST_CASE_BODY(nothing) { // TODO } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, nothing); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/text.cpp0000644000470500017500000001077112271526120021432 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include } #include #include extern "C" { #include "../../atf-c/error.h" #include "../../atf-c/detail/text.h" } #include "exceptions.hpp" #include "text.hpp" namespace impl = atf::text; #define IMPL_NAME "atf::text" char* impl::duplicate(const char* str) { char* copy = new char[std::strlen(str) + 1]; std::strcpy(copy, str); return copy; } bool impl::match(const std::string& str, const std::string& regex) { bool found; // Special case: regcomp does not like empty regular expressions. if (regex.empty()) { found = str.empty(); } else { ::regex_t preg; if (::regcomp(&preg, regex.c_str(), REG_EXTENDED) != 0) throw std::runtime_error("Invalid regular expression '" + regex + "'"); const int res = ::regexec(&preg, str.c_str(), 0, NULL, 0); regfree(&preg); if (res != 0 && res != REG_NOMATCH) throw std::runtime_error("Invalid regular expression " + regex); found = res == 0; } return found; } std::string impl::to_lower(const std::string& str) { std::string lc; for (std::string::const_iterator iter = str.begin(); iter != str.end(); iter++) lc += std::tolower(*iter); return lc; } std::vector< std::string > impl::split(const std::string& str, const std::string& delim) { std::vector< std::string > words; std::string::size_type pos = 0, newpos = 0; while (pos < str.length() && newpos != std::string::npos) { newpos = str.find(delim, pos); if (newpos != pos) words.push_back(str.substr(pos, newpos - pos)); pos = newpos + delim.length(); } return words; } std::string impl::trim(const std::string& str) { std::string::size_type pos1 = str.find_first_not_of(" \t"); std::string::size_type pos2 = str.find_last_not_of(" \t"); if (pos1 == std::string::npos && pos2 == std::string::npos) return ""; else if (pos1 == std::string::npos) return str.substr(0, str.length() - pos2); else if (pos2 == std::string::npos) return str.substr(pos1); else return str.substr(pos1, pos2 - pos1 + 1); } bool impl::to_bool(const std::string& str) { bool b; atf_error_t err = atf_text_to_bool(str.c_str(), &b); if (atf_is_error(err)) throw_atf_error(err); return b; } int64_t impl::to_bytes(std::string str) { if (str.empty()) throw std::runtime_error("Empty value"); const char unit = str[str.length() - 1]; int64_t multiplier; switch (unit) { case 'k': case 'K': multiplier = 1 << 10; break; case 'm': case 'M': multiplier = 1 << 20; break; case 'g': case 'G': multiplier = 1 << 30; break; case 't': case 'T': multiplier = int64_t(1) << 40; break; default: if (!std::isdigit(unit)) throw std::runtime_error(std::string("Unknown size unit '") + unit + "'"); multiplier = 1; } if (multiplier != 1) str.erase(str.length() - 1); return to_type< int64_t >(str) * multiplier; } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/fs_test.cpp0000644000470500017500000003717412271526120022123 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include #include "../macros.hpp" #include "exceptions.hpp" #include "fs.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static void create_files(void) { ::mkdir("files", 0755); ::mkdir("files/dir", 0755); std::ofstream os("files/reg"); os.close(); // TODO: Should create all other file types (blk, chr, fifo, lnk, sock) // and test for them... but the underlying file system may not support // most of these. Specially as we are working on /tmp, which can be // mounted with flags such as "nodev". See how to deal with this // situation. } // ------------------------------------------------------------------------ // Test cases for the "path" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(path_normalize); ATF_TEST_CASE_HEAD(path_normalize) { set_md_var("descr", "Tests the path's normalization"); } ATF_TEST_CASE_BODY(path_normalize) { using atf::fs::path; ATF_REQUIRE_EQ(path(".").str(), "."); ATF_REQUIRE_EQ(path("..").str(), ".."); ATF_REQUIRE_EQ(path("foo").str(), "foo"); ATF_REQUIRE_EQ(path("foo/bar").str(), "foo/bar"); ATF_REQUIRE_EQ(path("foo/bar/").str(), "foo/bar"); ATF_REQUIRE_EQ(path("/foo").str(), "/foo"); ATF_REQUIRE_EQ(path("/foo/bar").str(), "/foo/bar"); ATF_REQUIRE_EQ(path("/foo/bar/").str(), "/foo/bar"); ATF_REQUIRE_EQ(path("///foo").str(), "/foo"); ATF_REQUIRE_EQ(path("///foo///bar").str(), "/foo/bar"); ATF_REQUIRE_EQ(path("///foo///bar///").str(), "/foo/bar"); } ATF_TEST_CASE(path_is_absolute); ATF_TEST_CASE_HEAD(path_is_absolute) { set_md_var("descr", "Tests the path::is_absolute function"); } ATF_TEST_CASE_BODY(path_is_absolute) { using atf::fs::path; ATF_REQUIRE( path("/").is_absolute()); ATF_REQUIRE( path("////").is_absolute()); ATF_REQUIRE( path("////a").is_absolute()); ATF_REQUIRE( path("//a//").is_absolute()); ATF_REQUIRE(!path("a////").is_absolute()); ATF_REQUIRE(!path("../foo").is_absolute()); } ATF_TEST_CASE(path_is_root); ATF_TEST_CASE_HEAD(path_is_root) { set_md_var("descr", "Tests the path::is_root function"); } ATF_TEST_CASE_BODY(path_is_root) { using atf::fs::path; ATF_REQUIRE( path("/").is_root()); ATF_REQUIRE( path("////").is_root()); ATF_REQUIRE(!path("////a").is_root()); ATF_REQUIRE(!path("//a//").is_root()); ATF_REQUIRE(!path("a////").is_root()); ATF_REQUIRE(!path("../foo").is_root()); } ATF_TEST_CASE(path_branch_path); ATF_TEST_CASE_HEAD(path_branch_path) { set_md_var("descr", "Tests the path::branch_path function"); } ATF_TEST_CASE_BODY(path_branch_path) { using atf::fs::path; ATF_REQUIRE_EQ(path(".").branch_path().str(), "."); ATF_REQUIRE_EQ(path("foo").branch_path().str(), "."); ATF_REQUIRE_EQ(path("foo/bar").branch_path().str(), "foo"); ATF_REQUIRE_EQ(path("/foo").branch_path().str(), "/"); ATF_REQUIRE_EQ(path("/foo/bar").branch_path().str(), "/foo"); } ATF_TEST_CASE(path_leaf_name); ATF_TEST_CASE_HEAD(path_leaf_name) { set_md_var("descr", "Tests the path::leaf_name function"); } ATF_TEST_CASE_BODY(path_leaf_name) { using atf::fs::path; ATF_REQUIRE_EQ(path(".").leaf_name(), "."); ATF_REQUIRE_EQ(path("foo").leaf_name(), "foo"); ATF_REQUIRE_EQ(path("foo/bar").leaf_name(), "bar"); ATF_REQUIRE_EQ(path("/foo").leaf_name(), "foo"); ATF_REQUIRE_EQ(path("/foo/bar").leaf_name(), "bar"); } ATF_TEST_CASE(path_compare_equal); ATF_TEST_CASE_HEAD(path_compare_equal) { set_md_var("descr", "Tests the comparison for equality between paths"); } ATF_TEST_CASE_BODY(path_compare_equal) { using atf::fs::path; ATF_REQUIRE(path("/") == path("///")); ATF_REQUIRE(path("/a") == path("///a")); ATF_REQUIRE(path("/a") == path("///a///")); ATF_REQUIRE(path("a/b/c") == path("a//b//c")); ATF_REQUIRE(path("a/b/c") == path("a//b//c///")); } ATF_TEST_CASE(path_compare_different); ATF_TEST_CASE_HEAD(path_compare_different) { set_md_var("descr", "Tests the comparison for difference between paths"); } ATF_TEST_CASE_BODY(path_compare_different) { using atf::fs::path; ATF_REQUIRE(path("/") != path("//a/")); ATF_REQUIRE(path("/a") != path("a///")); ATF_REQUIRE(path("a/b/c") != path("a/b")); ATF_REQUIRE(path("a/b/c") != path("a//b")); ATF_REQUIRE(path("a/b/c") != path("/a/b/c")); ATF_REQUIRE(path("a/b/c") != path("/a//b//c")); } ATF_TEST_CASE(path_concat); ATF_TEST_CASE_HEAD(path_concat) { set_md_var("descr", "Tests the concatenation of multiple paths"); } ATF_TEST_CASE_BODY(path_concat) { using atf::fs::path; ATF_REQUIRE_EQ((path("foo") / "bar").str(), "foo/bar"); ATF_REQUIRE_EQ((path("foo/") / "/bar").str(), "foo/bar"); ATF_REQUIRE_EQ((path("foo/") / "/bar/baz").str(), "foo/bar/baz"); ATF_REQUIRE_EQ((path("foo/") / "///bar///baz").str(), "foo/bar/baz"); } ATF_TEST_CASE(path_to_absolute); ATF_TEST_CASE_HEAD(path_to_absolute) { set_md_var("descr", "Tests the conversion of a relative path to an " "absolute one"); } ATF_TEST_CASE_BODY(path_to_absolute) { using atf::fs::file_info; using atf::fs::path; create_files(); { const path p("."); path pa = p.to_absolute(); ATF_REQUIRE(pa.is_absolute()); file_info fi(p); file_info fia(pa); ATF_REQUIRE_EQ(fi.get_device(), fia.get_device()); ATF_REQUIRE_EQ(fi.get_inode(), fia.get_inode()); } { const path p("files/reg"); path pa = p.to_absolute(); ATF_REQUIRE(pa.is_absolute()); file_info fi(p); file_info fia(pa); ATF_REQUIRE_EQ(fi.get_device(), fia.get_device()); ATF_REQUIRE_EQ(fi.get_inode(), fia.get_inode()); } } ATF_TEST_CASE(path_op_less); ATF_TEST_CASE_HEAD(path_op_less) { set_md_var("descr", "Tests that the path's less-than operator works"); } ATF_TEST_CASE_BODY(path_op_less) { using atf::fs::path; create_files(); ATF_REQUIRE(!(path("aaa") < path("aaa"))); ATF_REQUIRE( path("aab") < path("abc")); ATF_REQUIRE(!(path("abc") < path("aab"))); } // ------------------------------------------------------------------------ // Test cases for the "directory" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(directory_read); ATF_TEST_CASE_HEAD(directory_read) { set_md_var("descr", "Tests the directory class creation, which reads " "the contents of a directory"); } ATF_TEST_CASE_BODY(directory_read) { using atf::fs::directory; using atf::fs::path; create_files(); directory d(path("files")); ATF_REQUIRE_EQ(d.size(), 4); ATF_REQUIRE(d.find(".") != d.end()); ATF_REQUIRE(d.find("..") != d.end()); ATF_REQUIRE(d.find("dir") != d.end()); ATF_REQUIRE(d.find("reg") != d.end()); } ATF_TEST_CASE(directory_file_info); ATF_TEST_CASE_HEAD(directory_file_info) { set_md_var("descr", "Tests that the file_info objects attached to the " "directory are valid"); } ATF_TEST_CASE_BODY(directory_file_info) { using atf::fs::directory; using atf::fs::file_info; using atf::fs::path; create_files(); directory d(path("files")); { directory::const_iterator iter = d.find("dir"); ATF_REQUIRE(iter != d.end()); const file_info& fi = (*iter).second; ATF_REQUIRE(fi.get_type() == file_info::dir_type); } { directory::const_iterator iter = d.find("reg"); ATF_REQUIRE(iter != d.end()); const file_info& fi = (*iter).second; ATF_REQUIRE(fi.get_type() == file_info::reg_type); } } ATF_TEST_CASE(directory_names); ATF_TEST_CASE_HEAD(directory_names) { set_md_var("descr", "Tests the directory's names method"); } ATF_TEST_CASE_BODY(directory_names) { using atf::fs::directory; using atf::fs::path; create_files(); directory d(path("files")); std::set< std::string > ns = d.names(); ATF_REQUIRE_EQ(ns.size(), 4); ATF_REQUIRE(ns.find(".") != ns.end()); ATF_REQUIRE(ns.find("..") != ns.end()); ATF_REQUIRE(ns.find("dir") != ns.end()); ATF_REQUIRE(ns.find("reg") != ns.end()); } // ------------------------------------------------------------------------ // Test cases for the "file_info" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(file_info_stat); ATF_TEST_CASE_HEAD(file_info_stat) { set_md_var("descr", "Tests the file_info creation and its basic contents"); } ATF_TEST_CASE_BODY(file_info_stat) { using atf::fs::file_info; using atf::fs::path; create_files(); { path p("files/dir"); file_info fi(p); ATF_REQUIRE(fi.get_type() == file_info::dir_type); } { path p("files/reg"); file_info fi(p); ATF_REQUIRE(fi.get_type() == file_info::reg_type); } } ATF_TEST_CASE(file_info_perms); ATF_TEST_CASE_HEAD(file_info_perms) { set_md_var("descr", "Tests the file_info methods to get the file's " "permissions"); } ATF_TEST_CASE_BODY(file_info_perms) { using atf::fs::file_info; using atf::fs::path; path p("file"); std::ofstream os(p.c_str()); os.close(); #define perms(ur, uw, ux, gr, gw, gx, othr, othw, othx) \ { \ file_info fi(p); \ ATF_REQUIRE(fi.is_owner_readable() == ur); \ ATF_REQUIRE(fi.is_owner_writable() == uw); \ ATF_REQUIRE(fi.is_owner_executable() == ux); \ ATF_REQUIRE(fi.is_group_readable() == gr); \ ATF_REQUIRE(fi.is_group_writable() == gw); \ ATF_REQUIRE(fi.is_group_executable() == gx); \ ATF_REQUIRE(fi.is_other_readable() == othr); \ ATF_REQUIRE(fi.is_other_writable() == othw); \ ATF_REQUIRE(fi.is_other_executable() == othx); \ } ::chmod(p.c_str(), 0000); perms(false, false, false, false, false, false, false, false, false); ::chmod(p.c_str(), 0001); perms(false, false, false, false, false, false, false, false, true); ::chmod(p.c_str(), 0010); perms(false, false, false, false, false, true, false, false, false); ::chmod(p.c_str(), 0100); perms(false, false, true, false, false, false, false, false, false); ::chmod(p.c_str(), 0002); perms(false, false, false, false, false, false, false, true, false); ::chmod(p.c_str(), 0020); perms(false, false, false, false, true, false, false, false, false); ::chmod(p.c_str(), 0200); perms(false, true, false, false, false, false, false, false, false); ::chmod(p.c_str(), 0004); perms(false, false, false, false, false, false, true, false, false); ::chmod(p.c_str(), 0040); perms(false, false, false, true, false, false, false, false, false); ::chmod(p.c_str(), 0400); perms(true, false, false, false, false, false, false, false, false); ::chmod(p.c_str(), 0644); perms(true, true, false, true, false, false, true, false, false); ::chmod(p.c_str(), 0755); perms(true, true, true, true, false, true, true, false, true); ::chmod(p.c_str(), 0777); perms(true, true, true, true, true, true, true, true, true); #undef perms } // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(exists); ATF_TEST_CASE_HEAD(exists) { set_md_var("descr", "Tests the exists function"); } ATF_TEST_CASE_BODY(exists) { using atf::fs::exists; using atf::fs::path; create_files(); ATF_REQUIRE( exists(path("files"))); ATF_REQUIRE(!exists(path("file"))); ATF_REQUIRE(!exists(path("files2"))); ATF_REQUIRE( exists(path("files/."))); ATF_REQUIRE( exists(path("files/.."))); ATF_REQUIRE( exists(path("files/dir"))); ATF_REQUIRE( exists(path("files/reg"))); ATF_REQUIRE(!exists(path("files/foo"))); } ATF_TEST_CASE(is_executable); ATF_TEST_CASE_HEAD(is_executable) { set_md_var("descr", "Tests the is_executable function"); } ATF_TEST_CASE_BODY(is_executable) { using atf::fs::is_executable; using atf::fs::path; create_files(); ATF_REQUIRE( is_executable(path("files"))); ATF_REQUIRE( is_executable(path("files/."))); ATF_REQUIRE( is_executable(path("files/.."))); ATF_REQUIRE( is_executable(path("files/dir"))); ATF_REQUIRE(!is_executable(path("non-existent"))); ATF_REQUIRE(!is_executable(path("files/reg"))); ATF_REQUIRE(::chmod("files/reg", 0755) != -1); ATF_REQUIRE( is_executable(path("files/reg"))); } ATF_TEST_CASE(remove); ATF_TEST_CASE_HEAD(remove) { set_md_var("descr", "Tests the remove function"); } ATF_TEST_CASE_BODY(remove) { using atf::fs::exists; using atf::fs::path; using atf::fs::remove; create_files(); ATF_REQUIRE( exists(path("files/reg"))); remove(path("files/reg")); ATF_REQUIRE(!exists(path("files/reg"))); ATF_REQUIRE( exists(path("files/dir"))); ATF_REQUIRE_THROW(atf::system_error, remove(path("files/dir"))); ATF_REQUIRE( exists(path("files/dir"))); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the "path" class. ATF_ADD_TEST_CASE(tcs, path_normalize); ATF_ADD_TEST_CASE(tcs, path_is_absolute); ATF_ADD_TEST_CASE(tcs, path_is_root); ATF_ADD_TEST_CASE(tcs, path_branch_path); ATF_ADD_TEST_CASE(tcs, path_leaf_name); ATF_ADD_TEST_CASE(tcs, path_compare_equal); ATF_ADD_TEST_CASE(tcs, path_compare_different); ATF_ADD_TEST_CASE(tcs, path_concat); ATF_ADD_TEST_CASE(tcs, path_to_absolute); ATF_ADD_TEST_CASE(tcs, path_op_less); // Add the tests for the "file_info" class. ATF_ADD_TEST_CASE(tcs, file_info_stat); ATF_ADD_TEST_CASE(tcs, file_info_perms); // Add the tests for the "directory" class. ATF_ADD_TEST_CASE(tcs, directory_read); ATF_ADD_TEST_CASE(tcs, directory_names); ATF_ADD_TEST_CASE(tcs, directory_file_info); // Add the tests for the free functions. ATF_ADD_TEST_CASE(tcs, exists); ATF_ADD_TEST_CASE(tcs, is_executable); ATF_ADD_TEST_CASE(tcs, remove); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/expand_test.cpp0000644000470500017500000002126512271526120022764 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "../macros.hpp" #include "expand.hpp" // XXX Many of the tests here are duplicated in atf-c/t_expand. Should // find a way to easily share them, or maybe remove the ones here. // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(is_glob); ATF_TEST_CASE_HEAD(is_glob) { set_md_var("descr", "Tests the is_glob function."); } ATF_TEST_CASE_BODY(is_glob) { using atf::expand::is_glob; ATF_REQUIRE(!is_glob("")); ATF_REQUIRE(!is_glob("a")); ATF_REQUIRE(!is_glob("foo")); ATF_REQUIRE( is_glob("*")); ATF_REQUIRE( is_glob("a*")); ATF_REQUIRE( is_glob("*a")); ATF_REQUIRE( is_glob("a*b")); ATF_REQUIRE( is_glob("?")); ATF_REQUIRE( is_glob("a?")); ATF_REQUIRE( is_glob("?a")); ATF_REQUIRE( is_glob("a?b")); } ATF_TEST_CASE(matches_glob_plain); ATF_TEST_CASE_HEAD(matches_glob_plain) { set_md_var("descr", "Tests the matches_glob function by using plain " "text strings as patterns only."); } ATF_TEST_CASE_BODY(matches_glob_plain) { using atf::expand::matches_glob; ATF_REQUIRE( matches_glob("", "")); ATF_REQUIRE(!matches_glob("a", "")); ATF_REQUIRE(!matches_glob("", "a")); ATF_REQUIRE( matches_glob("ab", "ab")); ATF_REQUIRE(!matches_glob("abc", "ab")); ATF_REQUIRE(!matches_glob("ab", "abc")); } ATF_TEST_CASE(matches_glob_star); ATF_TEST_CASE_HEAD(matches_glob_star) { set_md_var("descr", "Tests the matches_glob function by using the '*' " "meta-character as part of the pattern."); } ATF_TEST_CASE_BODY(matches_glob_star) { using atf::expand::matches_glob; ATF_REQUIRE( matches_glob("*", "")); ATF_REQUIRE( matches_glob("*", "a")); ATF_REQUIRE( matches_glob("*", "ab")); ATF_REQUIRE(!matches_glob("a*", "")); ATF_REQUIRE( matches_glob("a*", "a")); ATF_REQUIRE( matches_glob("a*", "aa")); ATF_REQUIRE( matches_glob("a*", "ab")); ATF_REQUIRE( matches_glob("a*", "abc")); ATF_REQUIRE(!matches_glob("a*", "ba")); ATF_REQUIRE( matches_glob("*a", "a")); ATF_REQUIRE( matches_glob("*a", "ba")); ATF_REQUIRE(!matches_glob("*a", "bc")); ATF_REQUIRE(!matches_glob("*a", "bac")); ATF_REQUIRE( matches_glob("*ab", "ab")); ATF_REQUIRE( matches_glob("*ab", "aab")); ATF_REQUIRE( matches_glob("*ab", "aaab")); ATF_REQUIRE( matches_glob("*ab", "bab")); ATF_REQUIRE(!matches_glob("*ab", "bcb")); ATF_REQUIRE(!matches_glob("*ab", "bacb")); ATF_REQUIRE( matches_glob("a*b", "ab")); ATF_REQUIRE( matches_glob("a*b", "acb")); ATF_REQUIRE( matches_glob("a*b", "acdeb")); ATF_REQUIRE(!matches_glob("a*b", "acdebz")); ATF_REQUIRE(!matches_glob("a*b", "zacdeb")); } ATF_TEST_CASE(matches_glob_question); ATF_TEST_CASE_HEAD(matches_glob_question) { set_md_var("descr", "Tests the matches_glob function by using the '?' " "meta-character as part of the pattern."); } ATF_TEST_CASE_BODY(matches_glob_question) { using atf::expand::matches_glob; ATF_REQUIRE(!matches_glob("?", "")); ATF_REQUIRE( matches_glob("?", "a")); ATF_REQUIRE(!matches_glob("?", "ab")); ATF_REQUIRE( matches_glob("?", "b")); ATF_REQUIRE( matches_glob("?", "c")); ATF_REQUIRE( matches_glob("a?", "ab")); ATF_REQUIRE( matches_glob("a?", "ac")); ATF_REQUIRE(!matches_glob("a?", "ca")); ATF_REQUIRE( matches_glob("???", "abc")); ATF_REQUIRE( matches_glob("???", "def")); ATF_REQUIRE(!matches_glob("???", "a")); ATF_REQUIRE(!matches_glob("???", "ab")); ATF_REQUIRE(!matches_glob("???", "abcd")); } ATF_TEST_CASE(expand_glob_base); ATF_TEST_CASE_HEAD(expand_glob_base) { set_md_var("descr", "Tests the expand_glob function with random " "patterns."); } ATF_TEST_CASE_BODY(expand_glob_base) { using atf::expand::expand_glob; std::vector< std::string > candidates; candidates.push_back("foo"); candidates.push_back("bar"); candidates.push_back("baz"); candidates.push_back("foobar"); candidates.push_back("foobarbaz"); candidates.push_back("foobarbazfoo"); std::vector< std::string > exps; exps = expand_glob("foo", candidates); ATF_REQUIRE_EQ(exps.size(), 1); ATF_REQUIRE(exps[0] == "foo"); exps = expand_glob("bar", candidates); ATF_REQUIRE_EQ(exps.size(), 1); ATF_REQUIRE(exps[0] == "bar"); exps = expand_glob("foo*", candidates); ATF_REQUIRE_EQ(exps.size(), 4); ATF_REQUIRE(exps[0] == "foo"); ATF_REQUIRE(exps[1] == "foobar"); ATF_REQUIRE(exps[2] == "foobarbaz"); ATF_REQUIRE(exps[3] == "foobarbazfoo"); exps = expand_glob("*foo", candidates); ATF_REQUIRE_EQ(exps.size(), 2); ATF_REQUIRE(exps[0] == "foo"); ATF_REQUIRE(exps[1] == "foobarbazfoo"); exps = expand_glob("*foo*", candidates); ATF_REQUIRE_EQ(exps.size(), 4); ATF_REQUIRE(exps[0] == "foo"); ATF_REQUIRE(exps[1] == "foobar"); ATF_REQUIRE(exps[2] == "foobarbaz"); ATF_REQUIRE(exps[3] == "foobarbazfoo"); exps = expand_glob("ba", candidates); ATF_REQUIRE_EQ(exps.size(), 0); exps = expand_glob("ba*", candidates); ATF_REQUIRE_EQ(exps.size(), 2); ATF_REQUIRE(exps[0] == "bar"); ATF_REQUIRE(exps[1] == "baz"); exps = expand_glob("*ba", candidates); ATF_REQUIRE_EQ(exps.size(), 0); exps = expand_glob("*ba*", candidates); ATF_REQUIRE_EQ(exps.size(), 5); ATF_REQUIRE(exps[0] == "bar"); ATF_REQUIRE(exps[1] == "baz"); ATF_REQUIRE(exps[2] == "foobar"); ATF_REQUIRE(exps[3] == "foobarbaz"); ATF_REQUIRE(exps[4] == "foobarbazfoo"); } ATF_TEST_CASE(expand_glob_tps); ATF_TEST_CASE_HEAD(expand_glob_tps) { set_md_var("descr", "Tests the expand_glob function with patterns that " "match typical test program names. This is just a subcase " "of expand_base, but it is nice to make sure that it really " "works."); } ATF_TEST_CASE_BODY(expand_glob_tps) { using atf::expand::expand_glob; std::vector< std::string > candidates; candidates.push_back("Atffile"); candidates.push_back("h_foo"); candidates.push_back("t_foo"); candidates.push_back("t_bar"); candidates.push_back("t_baz"); candidates.push_back("foo_helper"); candidates.push_back("foo_test"); candidates.push_back("bar_test"); candidates.push_back("baz_test"); std::vector< std::string > exps; exps = expand_glob("t_*", candidates); ATF_REQUIRE_EQ(exps.size(), 3); ATF_REQUIRE(exps[0] == "t_foo"); ATF_REQUIRE(exps[1] == "t_bar"); ATF_REQUIRE(exps[2] == "t_baz"); exps = expand_glob("*_test", candidates); ATF_REQUIRE_EQ(exps.size(), 3); ATF_REQUIRE(exps[0] == "foo_test"); ATF_REQUIRE(exps[1] == "bar_test"); ATF_REQUIRE(exps[2] == "baz_test"); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the tests for the free functions. ATF_ADD_TEST_CASE(tcs, is_glob); ATF_ADD_TEST_CASE(tcs, matches_glob_plain); ATF_ADD_TEST_CASE(tcs, matches_glob_star); ATF_ADD_TEST_CASE(tcs, matches_glob_question); ATF_ADD_TEST_CASE(tcs, expand_glob_base); ATF_ADD_TEST_CASE(tcs, expand_glob_tps); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/Makefile.am.inc0000644000470500017500000001225312271526120022543 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # libatf_c___la_SOURCES += atf-c++/detail/application.cpp \ atf-c++/detail/application.hpp \ atf-c++/detail/auto_array.hpp \ atf-c++/detail/env.cpp \ atf-c++/detail/env.hpp \ atf-c++/detail/exceptions.cpp \ atf-c++/detail/exceptions.hpp \ atf-c++/detail/expand.cpp \ atf-c++/detail/expand.hpp \ atf-c++/detail/fs.cpp \ atf-c++/detail/fs.hpp \ atf-c++/detail/parser.cpp \ atf-c++/detail/parser.hpp \ atf-c++/detail/process.cpp \ atf-c++/detail/process.hpp \ atf-c++/detail/sanity.hpp \ atf-c++/detail/text.cpp \ atf-c++/detail/text.hpp \ atf-c++/detail/ui.cpp \ atf-c++/detail/ui.hpp tests_atf_c___detail_DATA = atf-c++/detail/Atffile \ atf-c++/detail/Kyuafile tests_atf_c___detaildir = $(pkgtestsdir)/atf-c++/detail EXTRA_DIST += $(tests_atf_c___detail_DATA) noinst_LTLIBRARIES += atf-c++/detail/libtest_helpers.la atf_c___detail_libtest_helpers_la_SOURCES = atf-c++/detail/test_helpers.cpp \ atf-c++/detail/test_helpers.hpp tests_atf_c___detail_PROGRAMS = atf-c++/detail/application_test atf_c___detail_application_test_SOURCES = atf-c++/detail/application_test.cpp atf_c___detail_application_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/auto_array_test atf_c___detail_auto_array_test_SOURCES = atf-c++/detail/auto_array_test.cpp atf_c___detail_auto_array_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/env_test atf_c___detail_env_test_SOURCES = atf-c++/detail/env_test.cpp atf_c___detail_env_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/exceptions_test atf_c___detail_exceptions_test_SOURCES = atf-c++/detail/exceptions_test.cpp atf_c___detail_exceptions_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/expand_test atf_c___detail_expand_test_SOURCES = atf-c++/detail/expand_test.cpp atf_c___detail_expand_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/fs_test atf_c___detail_fs_test_SOURCES = atf-c++/detail/fs_test.cpp atf_c___detail_fs_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/parser_test atf_c___detail_parser_test_SOURCES = atf-c++/detail/parser_test.cpp atf_c___detail_parser_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/process_test atf_c___detail_process_test_SOURCES = atf-c++/detail/process_test.cpp atf_c___detail_process_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/sanity_test atf_c___detail_sanity_test_SOURCES = atf-c++/detail/sanity_test.cpp atf_c___detail_sanity_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/text_test atf_c___detail_text_test_SOURCES = atf-c++/detail/text_test.cpp atf_c___detail_text_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_PROGRAMS += atf-c++/detail/ui_test atf_c___detail_ui_test_SOURCES = atf-c++/detail/ui_test.cpp atf_c___detail_ui_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/process.cpp0000644000470500017500000002017512271526120022123 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include "../../atf-c/error.h" #include "../../atf-c/detail/process.h" } #include #include "exceptions.hpp" #include "process.hpp" #include "sanity.hpp" namespace detail = atf::process::detail; namespace impl = atf::process; #define IMPL_NAME "atf::process" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ template< class C > atf::auto_array< const char* > collection_to_argv(const C& c) { atf::auto_array< const char* > argv(new const char*[c.size() + 1]); std::size_t pos = 0; for (typename C::const_iterator iter = c.begin(); iter != c.end(); iter++) { argv[pos] = (*iter).c_str(); pos++; } INV(pos == c.size()); argv[pos] = NULL; return argv; } template< class C > C argv_to_collection(const char* const* argv) { C c; for (const char* const* iter = argv; *iter != NULL; iter++) c.push_back(std::string(*iter)); return c; } // ------------------------------------------------------------------------ // The "argv_array" type. // ------------------------------------------------------------------------ impl::argv_array::argv_array(void) : m_exec_argv(collection_to_argv(m_args)) { } impl::argv_array::argv_array(const char* arg1, ...) { m_args.push_back(arg1); { va_list ap; const char* nextarg; va_start(ap, arg1); while ((nextarg = va_arg(ap, const char*)) != NULL) m_args.push_back(nextarg); va_end(ap); } ctor_init_exec_argv(); } impl::argv_array::argv_array(const char* const* ca) : m_args(argv_to_collection< args_vector >(ca)), m_exec_argv(collection_to_argv(m_args)) { } impl::argv_array::argv_array(const argv_array& a) : m_args(a.m_args), m_exec_argv(collection_to_argv(m_args)) { } void impl::argv_array::ctor_init_exec_argv(void) { m_exec_argv = collection_to_argv(m_args); } const char* const* impl::argv_array::exec_argv(void) const { return m_exec_argv.get(); } impl::argv_array::size_type impl::argv_array::size(void) const { return m_args.size(); } const char* impl::argv_array::operator[](int idx) const { return m_args[idx].c_str(); } impl::argv_array::const_iterator impl::argv_array::begin(void) const { return m_args.begin(); } impl::argv_array::const_iterator impl::argv_array::end(void) const { return m_args.end(); } impl::argv_array& impl::argv_array::operator=(const argv_array& a) { if (this != &a) { m_args = a.m_args; m_exec_argv = collection_to_argv(m_args); } return *this; } // ------------------------------------------------------------------------ // The "stream" types. // ------------------------------------------------------------------------ impl::basic_stream::basic_stream(void) : m_inited(false) { } impl::basic_stream::~basic_stream(void) { if (m_inited) atf_process_stream_fini(&m_sb); } const atf_process_stream_t* impl::basic_stream::get_sb(void) const { INV(m_inited); return &m_sb; } impl::stream_capture::stream_capture(void) { atf_error_t err = atf_process_stream_init_capture(&m_sb); if (atf_is_error(err)) throw_atf_error(err); m_inited = true; } impl::stream_connect::stream_connect(const int src_fd, const int tgt_fd) { atf_error_t err = atf_process_stream_init_connect(&m_sb, src_fd, tgt_fd); if (atf_is_error(err)) throw_atf_error(err); m_inited = true; } impl::stream_inherit::stream_inherit(void) { atf_error_t err = atf_process_stream_init_inherit(&m_sb); if (atf_is_error(err)) throw_atf_error(err); m_inited = true; } impl::stream_redirect_fd::stream_redirect_fd(const int fd) { atf_error_t err = atf_process_stream_init_redirect_fd(&m_sb, fd); if (atf_is_error(err)) throw_atf_error(err); m_inited = true; } impl::stream_redirect_path::stream_redirect_path(const fs::path& p) { atf_error_t err = atf_process_stream_init_redirect_path(&m_sb, p.c_path()); if (atf_is_error(err)) throw_atf_error(err); m_inited = true; } // ------------------------------------------------------------------------ // The "status" type. // ------------------------------------------------------------------------ impl::status::status(atf_process_status_t& s) : m_status(s) { } impl::status::~status(void) { atf_process_status_fini(&m_status); } bool impl::status::exited(void) const { return atf_process_status_exited(&m_status); } int impl::status::exitstatus(void) const { return atf_process_status_exitstatus(&m_status); } bool impl::status::signaled(void) const { return atf_process_status_signaled(&m_status); } int impl::status::termsig(void) const { return atf_process_status_termsig(&m_status); } bool impl::status::coredump(void) const { return atf_process_status_coredump(&m_status); } // ------------------------------------------------------------------------ // The "child" type. // ------------------------------------------------------------------------ impl::child::child(atf_process_child_t& c) : m_child(c), m_waited(false) { } impl::child::~child(void) { if (!m_waited) { ::kill(atf_process_child_pid(&m_child), SIGTERM); atf_process_status_t s; atf_error_t err = atf_process_child_wait(&m_child, &s); INV(!atf_is_error(err)); atf_process_status_fini(&s); } } impl::status impl::child::wait(void) { atf_process_status_t s; atf_error_t err = atf_process_child_wait(&m_child, &s); if (atf_is_error(err)) throw_atf_error(err); m_waited = true; return status(s); } pid_t impl::child::pid(void) const { return atf_process_child_pid(&m_child); } int impl::child::stdout_fd(void) { return atf_process_child_stdout(&m_child); } int impl::child::stderr_fd(void) { return atf_process_child_stderr(&m_child); } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ void detail::flush_streams(void) { // This is a weird hack to ensure that the output of the parent process // is flushed before executing a child which prevents, for example, the // output of the atf-run hooks to appear before the output of atf-run // itself. // // TODO: This should only be executed when inheriting the stdout or // stderr file descriptors. However, the flushing is specific to the // iostreams, so we cannot do it from the C library where all the process // logic is performed. Come up with a better design. std::cout.flush(); std::cerr.flush(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/fs.cpp0000644000470500017500000002701512271526120021055 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif extern "C" { #include #include #include #include #include #include #include #include } #include #include #include extern "C" { #include "../../atf-c/error.h" } #include "../utils.hpp" #include "exceptions.hpp" #include "env.hpp" #include "fs.hpp" #include "process.hpp" #include "sanity.hpp" #include "text.hpp" namespace impl = atf::fs; #define IMPL_NAME "atf::fs" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ static bool safe_access(const impl::path&, int, int); //! //! \brief A controlled version of access(2). //! //! This function reimplements the standard access(2) system call to //! safely control its exit status and raise an exception in case of //! failure. //! static bool safe_access(const impl::path& p, int mode, int experr) { bool ok; atf_error_t err = atf_fs_eaccess(p.c_path(), mode); if (atf_is_error(err)) { if (atf_error_is(err, "libc")) { if (atf_libc_error_code(err) == experr) { atf_error_free(err); ok = false; } else { atf::throw_atf_error(err); // XXX Silence warning; maybe throw_atf_error should be // an exception and not a function. ok = false; } } else { atf::throw_atf_error(err); // XXX Silence warning; maybe throw_atf_error should be // an exception and not a function. ok = false; } } else ok = true; return ok; } // ------------------------------------------------------------------------ // The "path" class. // ------------------------------------------------------------------------ impl::path::path(const std::string& s) { atf_error_t err = atf_fs_path_init_fmt(&m_path, "%s", s.c_str()); if (atf_is_error(err)) throw_atf_error(err); } impl::path::path(const path& p) { atf_error_t err = atf_fs_path_copy(&m_path, &p.m_path); if (atf_is_error(err)) throw_atf_error(err); } impl::path::path(const atf_fs_path_t *p) { atf_error_t err = atf_fs_path_copy(&m_path, p); if (atf_is_error(err)) throw_atf_error(err); } impl::path::~path(void) { atf_fs_path_fini(&m_path); } const char* impl::path::c_str(void) const { return atf_fs_path_cstring(&m_path); } const atf_fs_path_t* impl::path::c_path(void) const { return &m_path; } std::string impl::path::str(void) const { return c_str(); } bool impl::path::is_absolute(void) const { return atf_fs_path_is_absolute(&m_path); } bool impl::path::is_root(void) const { return atf_fs_path_is_root(&m_path); } impl::path impl::path::branch_path(void) const { atf_fs_path_t bp; atf_error_t err; err = atf_fs_path_branch_path(&m_path, &bp); if (atf_is_error(err)) throw_atf_error(err); path p(atf_fs_path_cstring(&bp)); atf_fs_path_fini(&bp); return p; } std::string impl::path::leaf_name(void) const { atf_dynstr_t ln; atf_error_t err; err = atf_fs_path_leaf_name(&m_path, &ln); if (atf_is_error(err)) throw_atf_error(err); std::string s(atf_dynstr_cstring(&ln)); atf_dynstr_fini(&ln); return s; } impl::path impl::path::to_absolute(void) const { atf_fs_path_t pa; atf_error_t err = atf_fs_path_to_absolute(&m_path, &pa); if (atf_is_error(err)) throw_atf_error(err); path p(atf_fs_path_cstring(&pa)); atf_fs_path_fini(&pa); return p; } impl::path& impl::path::operator=(const path& p) { atf_fs_path_t tmp; atf_error_t err = atf_fs_path_init_fmt(&tmp, "%s", p.c_str()); if (atf_is_error(err)) throw_atf_error(err); else { atf_fs_path_fini(&m_path); m_path = tmp; } return *this; } bool impl::path::operator==(const path& p) const { return atf_equal_fs_path_fs_path(&m_path, &p.m_path); } bool impl::path::operator!=(const path& p) const { return !atf_equal_fs_path_fs_path(&m_path, &p.m_path); } impl::path impl::path::operator/(const std::string& p) const { path p2 = *this; atf_error_t err = atf_fs_path_append_fmt(&p2.m_path, "%s", p.c_str()); if (atf_is_error(err)) throw_atf_error(err); return p2; } impl::path impl::path::operator/(const path& p) const { path p2 = *this; atf_error_t err = atf_fs_path_append_fmt(&p2.m_path, "%s", atf_fs_path_cstring(&p.m_path)); if (atf_is_error(err)) throw_atf_error(err); return p2; } bool impl::path::operator<(const path& p) const { const char *s1 = atf_fs_path_cstring(&m_path); const char *s2 = atf_fs_path_cstring(&p.m_path); return std::strcmp(s1, s2) < 0; } // ------------------------------------------------------------------------ // The "file_info" class. // ------------------------------------------------------------------------ const int impl::file_info::blk_type = atf_fs_stat_blk_type; const int impl::file_info::chr_type = atf_fs_stat_chr_type; const int impl::file_info::dir_type = atf_fs_stat_dir_type; const int impl::file_info::fifo_type = atf_fs_stat_fifo_type; const int impl::file_info::lnk_type = atf_fs_stat_lnk_type; const int impl::file_info::reg_type = atf_fs_stat_reg_type; const int impl::file_info::sock_type = atf_fs_stat_sock_type; const int impl::file_info::wht_type = atf_fs_stat_wht_type; impl::file_info::file_info(const path& p) { atf_error_t err; err = atf_fs_stat_init(&m_stat, p.c_path()); if (atf_is_error(err)) throw_atf_error(err); } impl::file_info::file_info(const file_info& fi) { atf_fs_stat_copy(&m_stat, &fi.m_stat); } impl::file_info::~file_info(void) { atf_fs_stat_fini(&m_stat); } dev_t impl::file_info::get_device(void) const { return atf_fs_stat_get_device(&m_stat); } ino_t impl::file_info::get_inode(void) const { return atf_fs_stat_get_inode(&m_stat); } mode_t impl::file_info::get_mode(void) const { return atf_fs_stat_get_mode(&m_stat); } off_t impl::file_info::get_size(void) const { return atf_fs_stat_get_size(&m_stat); } int impl::file_info::get_type(void) const { return atf_fs_stat_get_type(&m_stat); } bool impl::file_info::is_owner_readable(void) const { return atf_fs_stat_is_owner_readable(&m_stat); } bool impl::file_info::is_owner_writable(void) const { return atf_fs_stat_is_owner_writable(&m_stat); } bool impl::file_info::is_owner_executable(void) const { return atf_fs_stat_is_owner_executable(&m_stat); } bool impl::file_info::is_group_readable(void) const { return atf_fs_stat_is_group_readable(&m_stat); } bool impl::file_info::is_group_writable(void) const { return atf_fs_stat_is_group_writable(&m_stat); } bool impl::file_info::is_group_executable(void) const { return atf_fs_stat_is_group_executable(&m_stat); } bool impl::file_info::is_other_readable(void) const { return atf_fs_stat_is_other_readable(&m_stat); } bool impl::file_info::is_other_writable(void) const { return atf_fs_stat_is_other_writable(&m_stat); } bool impl::file_info::is_other_executable(void) const { return atf_fs_stat_is_other_executable(&m_stat); } // ------------------------------------------------------------------------ // The "directory" class. // ------------------------------------------------------------------------ impl::directory::directory(const path& p) { DIR* dp = ::opendir(p.c_str()); if (dp == NULL) throw system_error(IMPL_NAME "::directory::directory(" + p.str() + ")", "opendir(3) failed", errno); struct dirent* dep; while ((dep = ::readdir(dp)) != NULL) { path entryp = p / dep->d_name; insert(value_type(dep->d_name, file_info(entryp))); } if (::closedir(dp) == -1) throw system_error(IMPL_NAME "::directory::directory(" + p.str() + ")", "closedir(3) failed", errno); } std::set< std::string > impl::directory::names(void) const { std::set< std::string > ns; for (const_iterator iter = begin(); iter != end(); iter++) ns.insert((*iter).first); return ns; } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ bool impl::exists(const path& p) { atf_error_t err; bool b; err = atf_fs_exists(p.c_path(), &b); if (atf_is_error(err)) throw_atf_error(err); return b; } bool impl::have_prog_in_path(const std::string& prog) { PRE(prog.find('/') == std::string::npos); // Do not bother to provide a default value for PATH. If it is not // there something is broken in the user's environment. if (!atf::env::has("PATH")) throw std::runtime_error("PATH not defined in the environment"); std::vector< std::string > dirs = atf::text::split(atf::env::get("PATH"), ":"); bool found = false; for (std::vector< std::string >::const_iterator iter = dirs.begin(); !found && iter != dirs.end(); iter++) { const path& dir = path(*iter); if (is_executable(dir / prog)) found = true; } return found; } bool impl::is_executable(const path& p) { if (!exists(p)) return false; return safe_access(p, atf_fs_access_x, EACCES); } void impl::remove(const path& p) { if (file_info(p).get_type() == file_info::dir_type) throw atf::system_error(IMPL_NAME "::remove(" + p.str() + ")", "Is a directory", EPERM); if (::unlink(p.c_str()) == -1) throw atf::system_error(IMPL_NAME "::remove(" + p.str() + ")", "unlink(" + p.str() + ") failed", errno); } void impl::rmdir(const path& p) { atf_error_t err = atf_fs_rmdir(p.c_path()); if (atf_is_error(err)) throw_atf_error(err); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/expand.cpp0000644000470500017500000000516012271526120021721 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "expand.hpp" #include "text.hpp" namespace impl = atf::expand; #define IMPL_NAME "atf::expand" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace { std::string glob_to_regex(const std::string& glob) { std::string regex; regex.reserve(glob.length() * 2); regex += '^'; for (std::string::const_iterator iter = glob.begin(); iter != glob.end(); iter++) { switch (*iter) { case '*': regex += ".*"; break; case '?': regex += "."; break; default: regex += *iter; } } regex += '$'; return regex; } } // anonymous namespace // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ bool impl::is_glob(const std::string& glob) { // NOTE: Keep this in sync with glob_to_regex! return glob.find_first_of("*?") != std::string::npos; } bool impl::matches_glob(const std::string& glob, const std::string& candidate) { return atf::text::match(candidate, glob_to_regex(glob)); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/Kyuafile0000644000470500017500000000063412271526120021433 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="application_test"} atf_test_program{name="auto_array_test"} atf_test_program{name="env_test"} atf_test_program{name="exceptions_test"} atf_test_program{name="expand_test"} atf_test_program{name="fs_test"} atf_test_program{name="parser_test"} atf_test_program{name="sanity_test"} atf_test_program{name="text_test"} atf_test_program{name="ui_test"} bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/process.hpp0000644000470500017500000002057212271526120022131 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2008 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_PROCESS_HPP_) #define _ATF_CXX_PROCESS_HPP_ extern "C" { #include #include "../../atf-c/error.h" #include "../../atf-c/detail/process.h" } #include #include #include "auto_array.hpp" #include "exceptions.hpp" #include "fs.hpp" namespace atf { namespace process { class child; class status; // ------------------------------------------------------------------------ // The "argv_array" type. // ------------------------------------------------------------------------ class argv_array { typedef std::vector< std::string > args_vector; args_vector m_args; // TODO: This is immutable, so we should be able to use // std::tr1::shared_array instead when it becomes widely available. // The reason would be to remove all copy constructors and assignment // operators from this class. auto_array< const char* > m_exec_argv; void ctor_init_exec_argv(void); public: typedef args_vector::const_iterator const_iterator; typedef args_vector::size_type size_type; argv_array(void); argv_array(const char*, ...); explicit argv_array(const char* const*); template< class C > explicit argv_array(const C&); argv_array(const argv_array&); const char* const* exec_argv(void) const; size_type size(void) const; const char* operator[](int) const; const_iterator begin(void) const; const_iterator end(void) const; argv_array& operator=(const argv_array&); }; template< class C > argv_array::argv_array(const C& c) { for (typename C::const_iterator iter = c.begin(); iter != c.end(); iter++) m_args.push_back(*iter); ctor_init_exec_argv(); } // ------------------------------------------------------------------------ // The "stream" types. // ------------------------------------------------------------------------ class basic_stream { protected: atf_process_stream_t m_sb; bool m_inited; const atf_process_stream_t* get_sb(void) const; public: basic_stream(void); ~basic_stream(void); }; class stream_capture : basic_stream { // Allow access to the getters. template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); public: stream_capture(void); }; class stream_connect : basic_stream { // Allow access to the getters. template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); public: stream_connect(const int, const int); }; class stream_inherit : basic_stream { // Allow access to the getters. template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); public: stream_inherit(void); }; class stream_redirect_fd : basic_stream { // Allow access to the getters. template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); public: stream_redirect_fd(const int); }; class stream_redirect_path : basic_stream { // Allow access to the getters. template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); public: stream_redirect_path(const fs::path&); }; // ------------------------------------------------------------------------ // The "status" type. // ------------------------------------------------------------------------ class status { atf_process_status_t m_status; friend class child; template< class OutStream, class ErrStream > friend status exec(const atf::fs::path&, const argv_array&, const OutStream&, const ErrStream&, void (*)(void)); status(atf_process_status_t&); public: ~status(void); bool exited(void) const; int exitstatus(void) const; bool signaled(void) const; int termsig(void) const; bool coredump(void) const; }; // ------------------------------------------------------------------------ // The "child" type. // ------------------------------------------------------------------------ class child { atf_process_child_t m_child; bool m_waited; template< class OutStream, class ErrStream > friend child fork(void (*)(void*), const OutStream&, const ErrStream&, void*); child(atf_process_child_t& c); public: ~child(void); status wait(void); pid_t pid(void) const; int stdout_fd(void); int stderr_fd(void); }; // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ namespace detail { void flush_streams(void); } // namespace detail // TODO: The void* cookie can probably be templatized, thus also allowing // const data structures. template< class OutStream, class ErrStream > child fork(void (*start)(void*), const OutStream& outsb, const ErrStream& errsb, void* v) { atf_process_child_t c; detail::flush_streams(); atf_error_t err = atf_process_fork(&c, start, outsb.get_sb(), errsb.get_sb(), v); if (atf_is_error(err)) throw_atf_error(err); return child(c); } template< class OutStream, class ErrStream > status exec(const atf::fs::path& prog, const argv_array& argv, const OutStream& outsb, const ErrStream& errsb, void (*prehook)(void)) { atf_process_status_t s; detail::flush_streams(); atf_error_t err = atf_process_exec_array(&s, prog.c_path(), argv.exec_argv(), outsb.get_sb(), errsb.get_sb(), prehook); if (atf_is_error(err)) throw_atf_error(err); return status(s); } template< class OutStream, class ErrStream > status exec(const atf::fs::path& prog, const argv_array& argv, const OutStream& outsb, const ErrStream& errsb) { return exec(prog, argv, outsb, errsb, NULL); } } // namespace process } // namespace atf #endif // !defined(_ATF_CXX_PROCESS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/parser_test.cpp0000644000470500017500000006737112271526120023011 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "../macros.hpp" #include "parser.hpp" #include "test_helpers.hpp" // ------------------------------------------------------------------------ // Tests for the "parse_error" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(parse_error_to_string); ATF_TEST_CASE_HEAD(parse_error_to_string) { set_md_var("descr", "Tests the parse_error conversion to strings"); } ATF_TEST_CASE_BODY(parse_error_to_string) { using atf::parser::parse_error; const parse_error e(123, "This is the message"); ATF_REQUIRE_EQ("123: This is the message", std::string(e)); } // ------------------------------------------------------------------------ // Tests for the "parse_errors" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(parse_errors_what); ATF_TEST_CASE_HEAD(parse_errors_what) { set_md_var("descr", "Tests the parse_errors description"); } ATF_TEST_CASE_BODY(parse_errors_what) { using atf::parser::parse_error; using atf::parser::parse_errors; parse_errors es; es.push_back(parse_error(2, "Second error")); es.push_back(parse_error(1, "First error")); ATF_REQUIRE_EQ("2: Second error\n1: First error", std::string(es.what())); } // ------------------------------------------------------------------------ // Tests for the "token" class. // ------------------------------------------------------------------------ ATF_TEST_CASE(token_getters); ATF_TEST_CASE_HEAD(token_getters) { set_md_var("descr", "Tests the token getters"); } ATF_TEST_CASE_BODY(token_getters) { using atf::parser::token; { token t(10, 0); ATF_REQUIRE_EQ(t.lineno(), 10); ATF_REQUIRE_EQ(t.type(), 0); ATF_REQUIRE(t.text().empty()); } { token t(10, 0, "foo"); ATF_REQUIRE_EQ(t.lineno(), 10); ATF_REQUIRE_EQ(t.type(), 0); ATF_REQUIRE_EQ(t.text(), "foo"); } { token t(20, 1); ATF_REQUIRE_EQ(t.lineno(), 20); ATF_REQUIRE_EQ(t.type(), 1); ATF_REQUIRE(t.text().empty()); } { token t(20, 1, "bar"); ATF_REQUIRE_EQ(t.lineno(), 20); ATF_REQUIRE_EQ(t.type(), 1); ATF_REQUIRE_EQ(t.text(), "bar"); } } // ------------------------------------------------------------------------ // Tests for the "tokenizer" class. // ------------------------------------------------------------------------ #define EXPECT(tkz, ttype, ttext) \ do { \ atf::parser::token t = tkz.next(); \ ATF_REQUIRE(t.type() == ttype); \ ATF_REQUIRE_EQ(t.text(), ttext); \ } while (false); namespace minimal { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type word_type = 2; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, bool skipws) : atf::parser::tokenizer< std::istream > (is, skipws, eof_type, nl_type, word_type) { } }; } namespace delims { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type word_type = 2; static const atf::parser::token_type plus_type = 3; static const atf::parser::token_type minus_type = 4; static const atf::parser::token_type equal_type = 5; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, bool skipws) : atf::parser::tokenizer< std::istream > (is, skipws, eof_type, nl_type, word_type) { add_delim('+', plus_type); add_delim('-', minus_type); add_delim('=', equal_type); } }; } namespace keywords { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type word_type = 2; static const atf::parser::token_type var_type = 3; static const atf::parser::token_type loop_type = 4; static const atf::parser::token_type endloop_type = 5; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, bool skipws) : atf::parser::tokenizer< std::istream > (is, skipws, eof_type, nl_type, word_type) { add_keyword("var", var_type); add_keyword("loop", loop_type); add_keyword("endloop", endloop_type); } }; } namespace quotes { static const atf::parser::token_type eof_type = 0; static const atf::parser::token_type nl_type = 1; static const atf::parser::token_type word_type = 2; static const atf::parser::token_type dblquote_type = 3; class tokenizer : public atf::parser::tokenizer< std::istream > { public: tokenizer(std::istream& is, bool skipws) : atf::parser::tokenizer< std::istream > (is, skipws, eof_type, nl_type, word_type) { add_quote('"', dblquote_type); } }; } ATF_TEST_CASE(tokenizer_minimal_nows); ATF_TEST_CASE_HEAD(tokenizer_minimal_nows) { set_md_var("descr", "Tests the tokenizer class using a minimal parser " "and not skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_minimal_nows) { using namespace minimal; { std::istringstream iss(""); tokenizer mt(iss, false); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\n"); tokenizer mt(iss, false); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\n\n\n"); tokenizer mt(iss, false); EXPECT(mt, nl_type, "<>"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1"); tokenizer mt(iss, false); EXPECT(mt, word_type, "line 1"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\n"); tokenizer mt(iss, false); EXPECT(mt, word_type, "line 1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\nline 2"); tokenizer mt(iss, false); EXPECT(mt, word_type, "line 1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line 2"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\nline 2\nline 3\n"); tokenizer mt(iss, false); EXPECT(mt, word_type, "line 1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line 2"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line 3"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_minimal_ws); ATF_TEST_CASE_HEAD(tokenizer_minimal_ws) { set_md_var("descr", "Tests the tokenizer class using a minimal parser " "and skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_minimal_ws) { using namespace minimal; { std::istringstream iss(""); minimal::tokenizer mt(iss, true); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" \t "); tokenizer mt(iss, true); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\n"); tokenizer mt(iss, true); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" \t \n \t "); tokenizer mt(iss, true); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\n\n\n"); tokenizer mt(iss, true); EXPECT(mt, nl_type, "<>"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" \tline\t 1\t"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\n"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\nline 2"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "2"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("line 1\nline 2\nline 3\n"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "2"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "3"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" \t line \t 1\n\tline\t2\n line 3 \n"); tokenizer mt(iss, true); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "1"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "2"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, word_type, "line"); EXPECT(mt, word_type, "3"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_delims_nows); ATF_TEST_CASE_HEAD(tokenizer_delims_nows) { set_md_var("descr", "Tests the tokenizer class using a parser with some " "additional delimiters and not skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_delims_nows) { using namespace delims; { std::istringstream iss("+-="); tokenizer mt(iss, false); EXPECT(mt, plus_type, "+"); EXPECT(mt, minus_type, "-"); EXPECT(mt, equal_type, "="); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("+++"); tokenizer mt(iss, false); EXPECT(mt, plus_type, "+"); EXPECT(mt, plus_type, "+"); EXPECT(mt, plus_type, "+"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\n+\n++\n"); tokenizer mt(iss, false); EXPECT(mt, nl_type, "<>"); EXPECT(mt, plus_type, "+"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, plus_type, "+"); EXPECT(mt, plus_type, "+"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("foo+bar=baz"); tokenizer mt(iss, false); EXPECT(mt, word_type, "foo"); EXPECT(mt, plus_type, "+"); EXPECT(mt, word_type, "bar"); EXPECT(mt, equal_type, "="); EXPECT(mt, word_type, "baz"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" foo\t+\tbar = baz "); tokenizer mt(iss, false); EXPECT(mt, word_type, " foo\t"); EXPECT(mt, plus_type, "+"); EXPECT(mt, word_type, "\tbar "); EXPECT(mt, equal_type, "="); EXPECT(mt, word_type, " baz "); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_delims_ws); ATF_TEST_CASE_HEAD(tokenizer_delims_ws) { set_md_var("descr", "Tests the tokenizer class using a parser with some " "additional delimiters and skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_delims_ws) { using namespace delims; { std::istringstream iss(" foo\t+\tbar = baz "); tokenizer mt(iss, true); EXPECT(mt, word_type, "foo"); EXPECT(mt, plus_type, "+"); EXPECT(mt, word_type, "bar"); EXPECT(mt, equal_type, "="); EXPECT(mt, word_type, "baz"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_keywords_nows); ATF_TEST_CASE_HEAD(tokenizer_keywords_nows) { set_md_var("descr", "Tests the tokenizer class using a parser with some " "additional keywords and not skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_keywords_nows) { using namespace keywords; { std::istringstream iss("var"); tokenizer mt(iss, false); EXPECT(mt, var_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("va"); tokenizer mt(iss, false); EXPECT(mt, word_type, "va"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("vara"); tokenizer mt(iss, false); EXPECT(mt, word_type, "vara"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("var "); tokenizer mt(iss, false); EXPECT(mt, word_type, "var "); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("var\nloop\nendloop"); tokenizer mt(iss, false); EXPECT(mt, var_type, "var"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, loop_type, "loop"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, endloop_type, "endloop"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_keywords_ws); ATF_TEST_CASE_HEAD(tokenizer_keywords_ws) { set_md_var("descr", "Tests the tokenizer class using a parser with some " "additional keywords and not skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_keywords_ws) { using namespace keywords; { std::istringstream iss("var "); tokenizer mt(iss, true); EXPECT(mt, var_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" var \n\tloop\t\n \tendloop \t"); tokenizer mt(iss, true); EXPECT(mt, var_type, "var"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, loop_type, "loop"); EXPECT(mt, nl_type, "<>"); EXPECT(mt, endloop_type, "endloop"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("var loop endloop"); tokenizer mt(iss, true); EXPECT(mt, var_type, "var"); EXPECT(mt, loop_type, "loop"); EXPECT(mt, endloop_type, "endloop"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_quotes_nows); ATF_TEST_CASE_HEAD(tokenizer_quotes_nows) { set_md_var("descr", "Tests the tokenizer class using a parser with " "quoted strings and not skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_quotes_nows) { using namespace quotes; { std::istringstream iss("var"); tokenizer mt(iss, false); EXPECT(mt, word_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("\"var\""); tokenizer mt(iss, false); EXPECT(mt, word_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("var1\"var2\""); tokenizer mt(iss, false); EXPECT(mt, word_type, "var1"); EXPECT(mt, word_type, "var2"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss("var1\" var2 \""); tokenizer mt(iss, false); EXPECT(mt, word_type, "var1"); EXPECT(mt, word_type, " var2 "); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } ATF_TEST_CASE(tokenizer_quotes_ws); ATF_TEST_CASE_HEAD(tokenizer_quotes_ws) { set_md_var("descr", "Tests the tokenizer class using a parser with " "quoted strings and skipping whitespace"); } ATF_TEST_CASE_BODY(tokenizer_quotes_ws) { using namespace quotes; { std::istringstream iss(" var "); tokenizer mt(iss, true); EXPECT(mt, word_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" \"var\" "); tokenizer mt(iss, true); EXPECT(mt, word_type, "var"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" var1 \"var2\" "); tokenizer mt(iss, true); EXPECT(mt, word_type, "var1"); EXPECT(mt, word_type, "var2"); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } { std::istringstream iss(" var1 \" var2 \" "); tokenizer mt(iss, true); EXPECT(mt, word_type, "var1"); EXPECT(mt, word_type, " var2 "); EXPECT(mt, eof_type, "<>"); EXPECT(mt, eof_type, "<>"); } } // ------------------------------------------------------------------------ // Tests for the headers parser. // ------------------------------------------------------------------------ class header_reader { std::istream& m_is; public: header_reader(std::istream& is) : m_is(is) { } void read(void) { std::pair< size_t, atf::parser::headers_map > hml = atf::parser::read_headers(m_is, 1); atf::parser::validate_content_type(hml.second, "application/X-atf-headers-test", 1234); } std::vector< std::string > m_calls; }; ATF_TEST_CASE_WITHOUT_HEAD(headers_1); ATF_TEST_CASE_BODY(headers_1) { const char* input = "" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected a header name", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_2); ATF_TEST_CASE_BODY(headers_2) { const char* input = "Content-Type\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected `:'", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_3); ATF_TEST_CASE_BODY(headers_3) { const char* input = "Content-Type:\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected a textual value", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_4); ATF_TEST_CASE_BODY(headers_4) { const char* input = "Content-Type: application/X-atf-headers-test\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "2: Unexpected token `<>'; expected a header name", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_5); ATF_TEST_CASE_BODY(headers_5) { const char* input = "Content-Type: application/X-atf-headers-test;\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected an attribute name", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_6); ATF_TEST_CASE_BODY(headers_6) { const char* input = "Content-Type: application/X-atf-headers-test; version\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected `='", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_7); ATF_TEST_CASE_BODY(headers_7) { const char* input = "Content-Type: application/X-atf-headers-test; version=\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Unexpected token `<>'; expected word or quoted string", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_8); ATF_TEST_CASE_BODY(headers_8) { const char* input = "Content-Type: application/X-atf-headers-test; version=\"1234\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Missing double quotes before end of line", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_9); ATF_TEST_CASE_BODY(headers_9) { const char* input = "Content-Type: application/X-atf-headers-test; version=1234\"\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "1: Missing double quotes before end of line", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_10); ATF_TEST_CASE_BODY(headers_10) { const char* input = "Content-Type: application/X-atf-headers-test; version=1234\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "2: Unexpected token `<>'; expected a header name", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_11); ATF_TEST_CASE_BODY(headers_11) { const char* input = "Content-Type: application/X-atf-headers-test; version=\"1234\"\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "2: Unexpected token `<>'; expected a header name", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } ATF_TEST_CASE_WITHOUT_HEAD(headers_12); ATF_TEST_CASE_BODY(headers_12) { const char* input = "Content-Type: application/X-atf-headers-test; version=\"1234\"\n" "a b\n" "a-b:\n" "a-b: foo;\n" "a-b: foo; var\n" "a-b: foo; var=\n" "a-b: foo; var=\"a\n" "a-b: foo; var=a\"\n" "a-b: foo; var=\"a\";\n" "a-b: foo; var=\"a\"; second\n" "a-b: foo; var=\"a\"; second=\n" "a-b: foo; var=\"a\"; second=\"b\n" "a-b: foo; var=\"a\"; second=b\"\n" "a-b: foo; var=\"a\"; second=\"b\"\n" ; const char* exp_calls[] = { NULL }; const char* exp_errors[] = { "2: Unexpected token `b'; expected `:'", "3: Unexpected token `<>'; expected a textual value", "4: Unexpected token `<>'; expected an attribute name", "5: Unexpected token `<>'; expected `='", "6: Unexpected token `<>'; expected word or quoted string", "7: Missing double quotes before end of line", "8: Missing double quotes before end of line", "9: Unexpected token `<>'; expected an attribute name", "10: Unexpected token `<>'; expected `='", "11: Unexpected token `<>'; expected word or quoted string", "12: Missing double quotes before end of line", "13: Missing double quotes before end of line", NULL }; do_parser_test< header_reader >(input, exp_calls, exp_errors); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add test cases for the "parse_error" class. ATF_ADD_TEST_CASE(tcs, parse_error_to_string); // Add test cases for the "parse_errors" class. ATF_ADD_TEST_CASE(tcs, parse_errors_what); // Add test cases for the "token" class. ATF_ADD_TEST_CASE(tcs, token_getters); // Add test cases for the "tokenizer" class. ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_nows); ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_ws); ATF_ADD_TEST_CASE(tcs, tokenizer_delims_nows); ATF_ADD_TEST_CASE(tcs, tokenizer_delims_ws); ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_nows); ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_ws); ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_nows); ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_ws); // Add the tests for the headers parser. // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, headers_1); ATF_ADD_TEST_CASE(tcs, headers_2); ATF_ADD_TEST_CASE(tcs, headers_3); ATF_ADD_TEST_CASE(tcs, headers_4); ATF_ADD_TEST_CASE(tcs, headers_5); ATF_ADD_TEST_CASE(tcs, headers_6); ATF_ADD_TEST_CASE(tcs, headers_7); ATF_ADD_TEST_CASE(tcs, headers_8); ATF_ADD_TEST_CASE(tcs, headers_9); ATF_ADD_TEST_CASE(tcs, headers_10); ATF_ADD_TEST_CASE(tcs, headers_11); ATF_ADD_TEST_CASE(tcs, headers_12); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/application.hpp0000644000470500017500000000657712271526120022767 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_APPLICATION_HPP_) #define _ATF_CXX_APPLICATION_HPP_ #include #include #include #include namespace atf { namespace application { // ------------------------------------------------------------------------ // The "usage_error" class. // ------------------------------------------------------------------------ class usage_error : public std::runtime_error { char m_text[4096]; public: usage_error(const char*, ...) throw(); ~usage_error(void) throw(); const char* what(void) const throw(); }; // ------------------------------------------------------------------------ // The "option" class. // ------------------------------------------------------------------------ class option { char m_character; std::string m_argument; std::string m_description; friend class app; public: option(char, const std::string&, const std::string&); bool operator<(const option&) const; }; // ------------------------------------------------------------------------ // The "app" class. // ------------------------------------------------------------------------ class app { bool m_hflag; void process_options(void); void usage(std::ostream&); bool inited(void); protected: typedef std::set< option > options_set; int m_argc; char* const* m_argv; const char* m_argv0; const char* m_prog_name; std::string m_description; std::string m_manpage, m_global_manpage; const bool m_use_ui; options_set options(void); // To be redefined. virtual std::string specific_args(void) const; virtual options_set specific_options(void) const; virtual void process_option(int, const char*); virtual int main(void) = 0; public: app(const std::string&, const std::string&, const std::string&, bool = true); virtual ~app(void); int run(int, char* const*); }; } // namespace application } // namespace atf #endif // !defined(_ATF_CXX_APPLICATION_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/exceptions_test.cpp0000644000470500017500000001104512271526120023661 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include "../../atf-c/error.h" } #include #include #include "../macros.hpp" #include "exceptions.hpp" #include "sanity.hpp" // ------------------------------------------------------------------------ // The "test" error. // ------------------------------------------------------------------------ extern "C" { struct test_error_data { const char* m_msg; }; typedef struct test_error_data test_error_data_t; static void test_format(const atf_error_t err, char *buf, size_t buflen) { const test_error_data_t* data; PRE(atf_error_is(err, "test")); data = static_cast< const test_error_data_t * >(atf_error_data(err)); snprintf(buf, buflen, "Message: %s", data->m_msg); } static atf_error_t test_error(const char* msg) { atf_error_t err; test_error_data_t data; data.m_msg = msg; err = atf_error_new("test", &data, sizeof(data), test_format); return err; } } // extern // ------------------------------------------------------------------------ // Tests cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(throw_atf_error_libc); ATF_TEST_CASE_HEAD(throw_atf_error_libc) { set_md_var("descr", "Tests the throw_atf_error function when raising " "a libc error"); } ATF_TEST_CASE_BODY(throw_atf_error_libc) { try { atf::throw_atf_error(atf_libc_error(1, "System error 1")); } catch (const atf::system_error& e) { ATF_REQUIRE(e.code() == 1); ATF_REQUIRE(std::string(e.what()).find("System error 1") != std::string::npos); } catch (const std::exception& e) { ATF_FAIL(std::string("Got unexpected exception: ") + e.what()); } } ATF_TEST_CASE(throw_atf_error_no_memory); ATF_TEST_CASE_HEAD(throw_atf_error_no_memory) { set_md_var("descr", "Tests the throw_atf_error function when raising " "a no_memory error"); } ATF_TEST_CASE_BODY(throw_atf_error_no_memory) { try { atf::throw_atf_error(atf_no_memory_error()); } catch (const std::bad_alloc&) { } catch (const std::exception& e) { ATF_FAIL(std::string("Got unexpected exception: ") + e.what()); } } ATF_TEST_CASE(throw_atf_error_unknown); ATF_TEST_CASE_HEAD(throw_atf_error_unknown) { set_md_var("descr", "Tests the throw_atf_error function when raising " "an unknown error"); } ATF_TEST_CASE_BODY(throw_atf_error_unknown) { try { atf::throw_atf_error(test_error("The message")); } catch (const std::runtime_error& e) { const std::string msg = e.what(); ATF_REQUIRE(msg.find("The message") != std::string::npos); } catch (const std::exception& e) { ATF_FAIL(std::string("Got unexpected exception: ") + e.what()); } } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, throw_atf_error_libc); ATF_ADD_TEST_CASE(tcs, throw_atf_error_no_memory); ATF_ADD_TEST_CASE(tcs, throw_atf_error_unknown); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/exceptions.hpp0000644000470500017500000000517712271526120022640 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_EXCEPTIONS_HPP_) #define _ATF_CXX_EXCEPTIONS_HPP_ #include #include extern "C" { struct atf_error; } namespace atf { template< class T > class not_found_error : public std::runtime_error { T m_value; public: not_found_error(const std::string& message, const T& value) throw(); virtual ~not_found_error(void) throw(); const T& get_value(void) const throw(); }; template< class T > inline not_found_error< T >::not_found_error(const std::string& message, const T& value) throw() : std::runtime_error(message), m_value(value) { } template< class T > inline not_found_error< T >::~not_found_error(void) throw() { } template< class T > inline const T& not_found_error< T >::get_value(void) const throw() { return m_value; } class system_error : public std::runtime_error { int m_sys_err; mutable std::string m_message; public: system_error(const std::string&, const std::string&, int); ~system_error(void) throw(); int code(void) const throw(); const char* what(void) const throw(); }; void throw_atf_error(struct atf_error *); } // namespace atf #endif // !defined(_ATF_CXX_EXCEPTIONS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/env.cpp0000644000470500017500000000442712271526120021237 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include "../../atf-c/error.h" #include "../../atf-c/detail/env.h" } #include "env.hpp" #include "exceptions.hpp" #include "sanity.hpp" namespace impl = atf::env; #define IMPL_NAME "atf::env" // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ std::string impl::get(const std::string& name) { return atf_env_get(name.c_str()); } bool impl::has(const std::string& name) { return atf_env_has(name.c_str()); } void impl::set(const std::string& name, const std::string& val) { atf_error_t err = atf_env_set(name.c_str(), val.c_str()); if (atf_is_error(err)) throw_atf_error(err); } void impl::unset(const std::string& name) { atf_error_t err = atf_env_unset(name.c_str()); if (atf_is_error(err)) throw_atf_error(err); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/ui_test.cpp0000644000470500017500000002122612271526120022117 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "../macros.hpp" #include "env.hpp" #include "ui.hpp" // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ struct test { const char *tc; const char *tag; bool repeat; size_t col; const char *fmt; const char *result; } tests[] = { // // wo_tag // { "wo_tag", "", false, 0, "12345", "12345", }, { "wo_tag", "", false, 0, "12345 ", "12345", }, { "wo_tag", "", false, 0, "12345 7890", "12345 7890", }, { "wo_tag", "", false, 0, "12345 789012 45", "12345 789012 45", }, { "wo_tag", "", false, 0, "12345 789012 456", "12345 789012\n456", }, { "wo_tag", "", false, 0, "1234567890123456", "1234567890123456", }, // TODO(jmmv): Fix the code to pass this test... // { // "wo_tag", // "", // false, // 0, // " 2345678901234567", // "\n2345678901234567", // }, { "wo_tag", "", false, 0, "12345 789012345 78", "12345 789012345\n78", }, // // wo_tag_col // { "wo_tag_col", "", false, 10, "12345", " 12345", }, { "wo_tag_col", "", false, 10, "12345 7890", " 12345\n" " 7890", }, { "wo_tag_col", "", false, 10, "1 3 5 7 9", " 1 3 5\n" " 7 9", }, // // w_tag_no_repeat // { "w_tag_no_repeat", "1234: ", false, 0, "789012345", "1234: 789012345", }, { "w_tag_no_repeat", "1234: ", false, 0, "789 1234 56789", "1234: 789 1234\n" " 56789", }, { "w_tag_no_repeat", "1234: ", false, 0, "789012345", "1234: 789012345", }, { "w_tag_no_repeat", "1234: ", false, 0, "789012345 7890", "1234: 789012345\n" " 7890", }, // // w_tag_repeat // { "w_tag_repeat", "1234: ", true, 0, "789012345", "1234: 789012345", }, { "w_tag_repeat", "1234: ", true, 0, "789 1234 56789", "1234: 789 1234\n" "1234: 56789", }, { "w_tag_repeat", "1234: ", true, 0, "789012345", "1234: 789012345", }, { "w_tag_no_repeat", "1234: ", true, 0, "789012345 7890", "1234: 789012345\n" "1234: 7890", }, // // w_tag_col // { "w_tag_col", "1234:", false, 10, "1 3 5", "1234: 1 3 5", }, { "w_tag_col", "1234:", false, 10, "1 3 5 7 9", "1234: 1 3 5\n" " 7 9", }, { "w_tag_col", "1234:", true, 10, "1 3 5 7 9", "1234: 1 3 5\n" "1234: 7 9", }, // // paragraphs // { "paragraphs", "", false, 0, "1 3 5\n\n", "1 3 5" }, { "paragraphs", "", false, 0, "1 3 5\n2 4 6", "1 3 5\n\n2 4 6" }, { "paragraphs", "", false, 0, "1234 6789 123456\n2 4 6", "1234 6789\n123456\n\n2 4 6" }, { "paragraphs", "12: ", false, 0, "56789 123456\n2 4 6", "12: 56789\n 123456\n\n 2 4 6" }, { "paragraphs", "12: ", true, 0, "56789 123456\n2 4 6", "12: 56789\n12: 123456\n12: \n12: 2 4 6" }, { "paragraphs", "12:", false, 4, "56789 123456\n2 4 6", "12: 56789\n 123456\n\n 2 4 6" }, { "paragraphs", "12:", true, 4, "56789 123456\n2 4 6", "12: 56789\n12: 123456\n12:\n12: 2 4 6" }, // // end // { NULL, NULL, false, 0, NULL, NULL, }, }; static void run_tests(const char *tc) { struct test *t; std::cout << "Running tests for " << tc << "\n"; atf::env::set("COLUMNS", "15"); for (t = &tests[0]; t->tc != NULL; t++) { if (std::strcmp(t->tc, tc) == 0) { std::cout << "\n"; std::cout << "Testing with tag '" << t->tag << "', '" << (t->repeat ? "repeat" : "no repeat") << "', col " << t->col << "\n"; std::cout << "Input: >>>" << t->fmt << "<<<\n"; std::cout << "Expected output: >>>" << t->result << "<<<\n"; std::string result = atf::ui::format_text_with_tag(t->fmt, t->tag, t->repeat, t->col); std::cout << "Output : >>>" << result << "<<<\n"; ATF_REQUIRE_EQ(t->result, result); } } } ATF_TEST_CASE(wo_tag); ATF_TEST_CASE_HEAD(wo_tag) { set_md_var("descr", "Checks formatting without tags"); } ATF_TEST_CASE_BODY(wo_tag) { run_tests("wo_tag"); } ATF_TEST_CASE(wo_tag_col); ATF_TEST_CASE_HEAD(wo_tag_col) { set_md_var("descr", "Checks formatting without tags and with a non-zero " "starting column"); } ATF_TEST_CASE_BODY(wo_tag_col) { run_tests("wo_tag_col"); } ATF_TEST_CASE(w_tag_no_repeat); ATF_TEST_CASE_HEAD(w_tag_no_repeat) { set_md_var("descr", "Checks formatting with a tag"); } ATF_TEST_CASE_BODY(w_tag_no_repeat) { run_tests("w_tag_no_repeat"); } ATF_TEST_CASE(w_tag_repeat); ATF_TEST_CASE_HEAD(w_tag_repeat) { set_md_var("descr", "Checks formatting with a tag and repeating it on " "each line"); } ATF_TEST_CASE_BODY(w_tag_repeat) { run_tests("w_tag_repeat"); } ATF_TEST_CASE(w_tag_col); ATF_TEST_CASE_HEAD(w_tag_col) { set_md_var("descr", "Checks formatting with a tag and starting at a " "column greater than its length"); } ATF_TEST_CASE_BODY(w_tag_col) { run_tests("w_tag_col"); } ATF_TEST_CASE(paragraphs); ATF_TEST_CASE_HEAD(paragraphs) { set_md_var("descr", "Checks formatting a string that contains multiple " "paragraphs"); } ATF_TEST_CASE_BODY(paragraphs) { run_tests("paragraphs"); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, wo_tag); ATF_ADD_TEST_CASE(tcs, wo_tag_col); ATF_ADD_TEST_CASE(tcs, w_tag_no_repeat); ATF_ADD_TEST_CASE(tcs, w_tag_repeat); ATF_ADD_TEST_CASE(tcs, w_tag_col); ATF_ADD_TEST_CASE(tcs, paragraphs); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/text_test.cpp0000644000470500017500000002563512271526120022476 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include #include "../macros.hpp" #include "text.hpp" // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(duplicate); ATF_TEST_CASE_HEAD(duplicate) { set_md_var("descr", "Tests the duplicate function"); } ATF_TEST_CASE_BODY(duplicate) { using atf::text::duplicate; const char* orig = "foo"; char* copy = duplicate(orig); ATF_REQUIRE_EQ(std::strlen(copy), 3); ATF_REQUIRE(std::strcmp(copy, "foo") == 0); std::strcpy(copy, "bar"); ATF_REQUIRE(std::strcmp(copy, "bar") == 0); ATF_REQUIRE(std::strcmp(orig, "foo") == 0); } ATF_TEST_CASE(join); ATF_TEST_CASE_HEAD(join) { set_md_var("descr", "Tests the join function"); } ATF_TEST_CASE_BODY(join) { using atf::text::join; // First set of tests using a non-sorted collection, std::vector. { std::vector< std::string > words; std::string str; words.clear(); str = join(words, ","); ATF_REQUIRE_EQ(str, ""); words.clear(); words.push_back(""); str = join(words, ","); ATF_REQUIRE_EQ(str, ""); words.clear(); words.push_back(""); words.push_back(""); str = join(words, ","); ATF_REQUIRE_EQ(str, ","); words.clear(); words.push_back("foo"); words.push_back(""); words.push_back("baz"); str = join(words, ","); ATF_REQUIRE_EQ(str, "foo,,baz"); words.clear(); words.push_back("foo"); words.push_back("bar"); words.push_back("baz"); str = join(words, ","); ATF_REQUIRE_EQ(str, "foo,bar,baz"); } // Second set of tests using a sorted collection, std::set. { std::set< std::string > words; std::string str; words.clear(); str = join(words, ","); ATF_REQUIRE_EQ(str, ""); words.clear(); words.insert(""); str = join(words, ","); ATF_REQUIRE_EQ(str, ""); words.clear(); words.insert("foo"); words.insert(""); words.insert("baz"); str = join(words, ","); ATF_REQUIRE_EQ(str, ",baz,foo"); words.clear(); words.insert("foo"); words.insert("bar"); words.insert("baz"); str = join(words, ","); ATF_REQUIRE_EQ(str, "bar,baz,foo"); } } ATF_TEST_CASE(match); ATF_TEST_CASE_HEAD(match) { set_md_var("descr", "Tests the match function"); } ATF_TEST_CASE_BODY(match) { using atf::text::match; ATF_REQUIRE_THROW(std::runtime_error, match("", "[")); ATF_REQUIRE(match("", "")); ATF_REQUIRE(!match("foo", "")); ATF_REQUIRE(match("", ".*")); ATF_REQUIRE(match("", "[a-z]*")); ATF_REQUIRE(match("hello", "hello")); ATF_REQUIRE(match("hello", "[a-z]+")); ATF_REQUIRE(match("hello", "^[a-z]+$")); ATF_REQUIRE(!match("hello", "helooo")); ATF_REQUIRE(!match("hello", "[a-z]+5")); ATF_REQUIRE(!match("hello", "^ [a-z]+$")); } ATF_TEST_CASE(split); ATF_TEST_CASE_HEAD(split) { set_md_var("descr", "Tests the split function"); } ATF_TEST_CASE_BODY(split) { using atf::text::split; std::vector< std::string > words; words = split("", " "); ATF_REQUIRE_EQ(words.size(), 0); words = split(" ", " "); ATF_REQUIRE_EQ(words.size(), 0); words = split(" ", " "); ATF_REQUIRE_EQ(words.size(), 0); words = split("a b", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "a"); ATF_REQUIRE_EQ(words[1], "b"); words = split("a b c d", " "); ATF_REQUIRE_EQ(words.size(), 4); ATF_REQUIRE_EQ(words[0], "a"); ATF_REQUIRE_EQ(words[1], "b"); ATF_REQUIRE_EQ(words[2], "c"); ATF_REQUIRE_EQ(words[3], "d"); words = split("foo bar", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); words = split("foo bar baz foobar", " "); ATF_REQUIRE_EQ(words.size(), 4); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); ATF_REQUIRE_EQ(words[2], "baz"); ATF_REQUIRE_EQ(words[3], "foobar"); words = split(" foo bar", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); words = split("foo bar", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); words = split("foo bar ", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); words = split(" foo bar ", " "); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "foo"); ATF_REQUIRE_EQ(words[1], "bar"); } ATF_TEST_CASE(split_delims); ATF_TEST_CASE_HEAD(split_delims) { set_md_var("descr", "Tests the split function using different delimiters"); } ATF_TEST_CASE_BODY(split_delims) { using atf::text::split; std::vector< std::string > words; words = split("", "/"); ATF_REQUIRE_EQ(words.size(), 0); words = split(" ", "/"); ATF_REQUIRE_EQ(words.size(), 1); ATF_REQUIRE_EQ(words[0], " "); words = split(" ", "/"); ATF_REQUIRE_EQ(words.size(), 1); ATF_REQUIRE_EQ(words[0], " "); words = split("a/b", "/"); ATF_REQUIRE_EQ(words.size(), 2); ATF_REQUIRE_EQ(words[0], "a"); ATF_REQUIRE_EQ(words[1], "b"); words = split("aLONGDELIMbcdLONGDELIMef", "LONGDELIM"); ATF_REQUIRE_EQ(words.size(), 3); ATF_REQUIRE_EQ(words[0], "a"); ATF_REQUIRE_EQ(words[1], "bcd"); ATF_REQUIRE_EQ(words[2], "ef"); } ATF_TEST_CASE(trim); ATF_TEST_CASE_HEAD(trim) { set_md_var("descr", "Tests the trim function"); } ATF_TEST_CASE_BODY(trim) { using atf::text::trim; ATF_REQUIRE_EQ(trim(""), ""); ATF_REQUIRE_EQ(trim(" "), ""); ATF_REQUIRE_EQ(trim("\t"), ""); ATF_REQUIRE_EQ(trim(" foo"), "foo"); ATF_REQUIRE_EQ(trim("\t foo"), "foo"); ATF_REQUIRE_EQ(trim(" \tfoo"), "foo"); ATF_REQUIRE_EQ(trim("foo\t "), "foo"); ATF_REQUIRE_EQ(trim("foo \t"), "foo"); ATF_REQUIRE_EQ(trim("foo bar"), "foo bar"); ATF_REQUIRE_EQ(trim("\t foo bar"), "foo bar"); ATF_REQUIRE_EQ(trim(" \tfoo bar"), "foo bar"); ATF_REQUIRE_EQ(trim("foo bar\t "), "foo bar"); ATF_REQUIRE_EQ(trim("foo bar \t"), "foo bar"); } ATF_TEST_CASE(to_bool); ATF_TEST_CASE_HEAD(to_bool) { set_md_var("descr", "Tests the to_string function"); } ATF_TEST_CASE_BODY(to_bool) { using atf::text::to_bool; ATF_REQUIRE(to_bool("true")); ATF_REQUIRE(to_bool("TRUE")); ATF_REQUIRE(to_bool("yes")); ATF_REQUIRE(to_bool("YES")); ATF_REQUIRE(!to_bool("false")); ATF_REQUIRE(!to_bool("FALSE")); ATF_REQUIRE(!to_bool("no")); ATF_REQUIRE(!to_bool("NO")); ATF_REQUIRE_THROW(std::runtime_error, to_bool("")); ATF_REQUIRE_THROW(std::runtime_error, to_bool("tru")); ATF_REQUIRE_THROW(std::runtime_error, to_bool("true2")); ATF_REQUIRE_THROW(std::runtime_error, to_bool("fals")); ATF_REQUIRE_THROW(std::runtime_error, to_bool("false2")); } ATF_TEST_CASE(to_bytes); ATF_TEST_CASE_HEAD(to_bytes) { set_md_var("descr", "Tests the to_bytes function"); } ATF_TEST_CASE_BODY(to_bytes) { using atf::text::to_bytes; ATF_REQUIRE_EQ(0, to_bytes("0")); ATF_REQUIRE_EQ(12345, to_bytes("12345")); ATF_REQUIRE_EQ(2 * 1024, to_bytes("2k")); ATF_REQUIRE_EQ(4 * 1024 * 1024, to_bytes("4m")); ATF_REQUIRE_EQ(int64_t(8) * 1024 * 1024 * 1024, to_bytes("8g")); ATF_REQUIRE_EQ(int64_t(16) * 1024 * 1024 * 1024 * 1024, to_bytes("16t")); ATF_REQUIRE_THROW_RE(std::runtime_error, "Empty", to_bytes("")); ATF_REQUIRE_THROW_RE(std::runtime_error, "Unknown size unit 'd'", to_bytes("12d")); ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" ")); ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" k")); } ATF_TEST_CASE(to_string); ATF_TEST_CASE_HEAD(to_string) { set_md_var("descr", "Tests the to_string function"); } ATF_TEST_CASE_BODY(to_string) { using atf::text::to_string; ATF_REQUIRE_EQ(to_string('a'), "a"); ATF_REQUIRE_EQ(to_string("a"), "a"); ATF_REQUIRE_EQ(to_string(5), "5"); } ATF_TEST_CASE(to_type); ATF_TEST_CASE_HEAD(to_type) { set_md_var("descr", "Tests the to_type function"); } ATF_TEST_CASE_BODY(to_type) { using atf::text::to_type; ATF_REQUIRE_EQ(to_type< int >("0"), 0); ATF_REQUIRE_EQ(to_type< int >("1234"), 1234); ATF_REQUIRE_THROW(std::runtime_error, to_type< int >(" ")); ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("0 a")); ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("a")); ATF_REQUIRE_EQ(to_type< float >("0.5"), 0.5); ATF_REQUIRE_EQ(to_type< float >("1234.5"), 1234.5); ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("0.5 a")); ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("a")); ATF_REQUIRE_EQ(to_type< std::string >("a"), "a"); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, duplicate); ATF_ADD_TEST_CASE(tcs, join); ATF_ADD_TEST_CASE(tcs, match); ATF_ADD_TEST_CASE(tcs, split); ATF_ADD_TEST_CASE(tcs, split_delims); ATF_ADD_TEST_CASE(tcs, trim); ATF_ADD_TEST_CASE(tcs, to_bool); ATF_ADD_TEST_CASE(tcs, to_bytes); ATF_ADD_TEST_CASE(tcs, to_string); ATF_ADD_TEST_CASE(tcs, to_type); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/ui.hpp0000644000470500017500000000772212271526120021072 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_UI_HPP_) #define _ATF_CXX_UI_HPP_ #include namespace atf { namespace ui { //! //! \brief Formats an error message to fit on screen. //! //! Given the program's name and an error message, properly formats it to //! fit on screen. //! //! The program's name is not stored globally to prevent the usage of this //! function from inside the library. Making it a explicit parameter //! restricts its usage to the frontend. //! std::string format_error(const std::string&, const std::string&); //! //! \brief Formats an informational message to fit on screen. //! //! Given the program's name and an informational message, properly formats //! it to fit on screen. //! //! The program's name is not stored globally to prevent the usage of this //! function from inside the library. Making it a explicit parameter //! restricts its usage to the frontend. //! std::string format_info(const std::string&, const std::string&); //! //! \brief Formats a block of text to fit nicely on screen. //! //! Given a text, which is composed of multiple paragraphs separated by //! a single '\n' character, reformats it to fill on the current screen's //! width with proper line wrapping. //! //! This is just a special case of format_text_with_tag, provided for //! simplicity. //! std::string format_text(const std::string&); //! //! \brief Formats a block of text to fit nicely on screen, prepending a //! tag to it. //! //! Given a text, which is composed of multiple paragraphs separated by //! a single '\n' character, reformats it to fill on the current screen's //! width with proper line wrapping. The text is prepended with a tag; //! i.e. a word that is printed at the beginning of the first paragraph and //! optionally repeated at the beginning of each word. The last parameter //! specifies the column on which the text should start, and that position //! must be greater than the tag's length or 0, in which case it //! automatically takes the correct value. //! std::string format_text_with_tag(const std::string&, const std::string&, bool, size_t = 0); //! //! \brief Formats a warning message to fit on screen. //! //! Given the program's name and a warning message, properly formats it to //! fit on screen. //! //! The program's name is not stored globally to prevent the usage of this //! function from inside the library. Making it a explicit parameter //! restricts its usage to the frontend. //! std::string format_warning(const std::string&, const std::string&); } // namespace ui } // namespace atf #endif // !defined(_ATF_CXX_UI_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/text.hpp0000644000470500017500000001030612271526120021431 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_TEXT_HPP_) #define _ATF_CXX_TEXT_HPP_ extern "C" { #include } #include #include #include #include namespace atf { namespace text { //! //! \brief Duplicates a C string using the new[] allocator. //! //! Replaces the functionality of strdup by using the new[] allocator and //! thus allowing the resulting memory to be managed by utils::auto_array. //! char* duplicate(const char*); //! //! \brief Joins multiple words into a string. //! //! Joins a list of words into a string, separating them using the provided //! separator. Empty words are not omitted. //! template< class T > std::string join(const T& words, const std::string& separator) { std::string str; typename T::const_iterator iter = words.begin(); bool done = iter == words.end(); while (!done) { str += *iter; iter++; if (iter != words.end()) str += separator; else done = true; } return str; } //! //! \brief Checks if the string matches a regular expression. //! bool match(const std::string&, const std::string&); //! //! \brief Splits a string into words. //! //! Splits the given string into multiple words, all separated by the //! given delimiter. Multiple occurrences of the same delimiter are //! not condensed so that rejoining the words later on using the same //! delimiter results in the original string. //! std::vector< std::string > split(const std::string&, const std::string&); //! //! \brief Removes whitespace from the beginning and end of a string. //! std::string trim(const std::string&); //! //! \brief Converts a string to a boolean value. //! bool to_bool(const std::string&); //! //! \brief Converts the given string to a bytes size. //! int64_t to_bytes(std::string); //! //! \brief Changes the case of a string to lowercase. //! //! Returns a new string that is a lowercased version of the original //! one. //! std::string to_lower(const std::string&); //! //! \brief Converts the given object to a string. //! //! Returns a string with the representation of the given object. There //! must exist an operator<< method for that object. //! template< class T > std::string to_string(const T& ob) { std::ostringstream ss; ss << ob; return ss.str(); } //! //! \brief Converts the given string to another type. //! //! Attempts to convert the given string to the requested type. Throws //! an exception if the conversion failed. //! template< class T > T to_type(const std::string& str) { std::istringstream ss(str); T value; ss >> value; if (!ss.eof() || (ss.eof() && (ss.fail() || ss.bad()))) throw std::runtime_error("Cannot convert string to requested type"); return value; } } // namespace text } // namespace atf #endif // !defined(_ATF_CXX_TEXT_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/fs.hpp0000644000470500017500000002521512271526120021062 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_FS_HPP_) #define _ATF_CXX_FS_HPP_ extern "C" { #include } #include #include #include #include #include #include extern "C" { #include "../../atf-c/detail/fs.h" } namespace atf { namespace io { class systembuf; } // namespace io namespace fs { // ------------------------------------------------------------------------ // The "path" class. // ------------------------------------------------------------------------ //! //! \brief A class to represent a path to a file. //! //! The path class represents the route to a file or directory in the //! file system. All file manipulation operations use this class to //! represent their arguments as it takes care of normalizing user-provided //! strings and ensures they are valid. //! //! It is important to note that the file pointed to by a path need not //! exist. //! class path { //! //! \brief Internal representation of a path. //! atf_fs_path_t m_path; public: //! \brief Constructs a new path from a user-provided string. //! //! This constructor takes a string, either provided by the program's //! code or by the user and constructs a new path object. The string //! is normalized to not contain multiple delimiters together and to //! remove any trailing one. //! //! The input string cannot be empty. //! explicit path(const std::string&); //! //! \brief Copy constructor. //! path(const path&); //! //! \brief Copy constructor. //! path(const atf_fs_path_t *); //! //! \brief Destructor for the path class. //! ~path(void); //! //! \brief Returns a pointer to a C-style string representing this path. //! const char* c_str(void) const; //! //! \brief Returns a pointer to the implementation data. //! const atf_fs_path_t* c_path(void) const; //! //! \brief Returns a string representing this path. //! XXX Really needed? //! std::string str(void) const; //! //! \brief Returns the branch path of this path. //! //! Calculates and returns the branch path of this path. In other //! words, it returns what the standard ::dirname function would return. //! path branch_path(void) const; //! //! \brief Returns the leaf name of this path. //! //! Calculates and returns the leaf name of this path. In other words, //! it returns what the standard ::basename function would return. //! std::string leaf_name(void) const; //! //! \brief Checks whether this path is absolute or not. //! //! Returns a boolean indicating if this is an absolute path or not; //! i.e. if it starts with a slash. //! bool is_absolute(void) const; //! //! \brief Checks whether this path points to the root directory or not. //! //! Returns a boolean indicating if this is path points to the root //! directory or not. The checks made by this are extremely simple (so //! the results cannot always be trusted) but they are enough for our //! modest sanity-checking needs. I.e. "/../" could return false. //! bool is_root(void) const; //! //! \brief Converts the path to be absolute. //! //! \pre The path was not absolute. //! path to_absolute(void) const; //! //! \brief Assignment operator. //! path& operator=(const path&); //! //! \brief Checks if two paths are equal. //! bool operator==(const path&) const; //! //! \brief Checks if two paths are different. //! bool operator!=(const path&) const; //! //! \brief Concatenates a path with a string. //! //! Constructs a new path object that is the concatenation of the //! left-hand path with the right-hand string. The string is normalized //! before the concatenation, and a path delimiter is introduced between //! the two components if needed. //! path operator/(const std::string&) const; //! //! \brief Concatenates a path with another path. //! //! Constructs a new path object that is the concatenation of the //! left-hand path with the right-hand one. A path delimiter is //! introduced between the two components if needed. //! path operator/(const path&) const; //! //! \brief Checks if a path has to be sorted before another one //! lexicographically. //! bool operator<(const path&) const; }; // ------------------------------------------------------------------------ // The "file_info" class. // ------------------------------------------------------------------------ class directory; //! //! \brief A class that contains information about a file. //! //! The file_info class holds information about an specific file that //! exists in the file system. //! class file_info { atf_fs_stat_t m_stat; public: //! //! \brief The file's type. //! static const int blk_type; static const int chr_type; static const int dir_type; static const int fifo_type; static const int lnk_type; static const int reg_type; static const int sock_type; static const int wht_type; //! //! \brief Constructs a new file_info based on a given file. //! //! This constructor creates a new file_info object and fills it with //! the data returned by ::stat when run on the given file, which must //! exist. //! explicit file_info(const path&); //! //! \brief The copy constructor. //! file_info(const file_info&); //! //! \brief The destructor. //! ~file_info(void); //! //! \brief Returns the device containing the file. //! dev_t get_device(void) const; //! //! \brief Returns the file's inode. //! ino_t get_inode(void) const; //! //! \brief Returns the file's permissions. //! mode_t get_mode(void) const; //! //! \brief Returns the file's size. //! off_t get_size(void) const; //! //! \brief Returns the file's type. //! int get_type(void) const; //! //! \brief Returns whether the file is readable by its owner or not. //! bool is_owner_readable(void) const; //! //! \brief Returns whether the file is writable by its owner or not. //! bool is_owner_writable(void) const; //! //! \brief Returns whether the file is executable by its owner or not. //! bool is_owner_executable(void) const; //! //! \brief Returns whether the file is readable by the users belonging //! to its group or not. //! bool is_group_readable(void) const; //! //! \brief Returns whether the file is writable the users belonging to //! its group or not. //! bool is_group_writable(void) const; //! //! \brief Returns whether the file is executable by the users //! belonging to its group or not. //! bool is_group_executable(void) const; //! //! \brief Returns whether the file is readable by people different //! than the owner and those belonging to the group or not. //! bool is_other_readable(void) const; //! //! \brief Returns whether the file is write by people different //! than the owner and those belonging to the group or not. //! bool is_other_writable(void) const; //! //! \brief Returns whether the file is executable by people different //! than the owner and those belonging to the group or not. //! bool is_other_executable(void) const; }; // ------------------------------------------------------------------------ // The "directory" class. // ------------------------------------------------------------------------ //! //! \brief A class representing a file system directory. //! //! The directory class represents a group of files in the file system and //! corresponds to exactly one directory. //! class directory : public std::map< std::string, file_info > { public: //! //! \brief Constructs a new directory. //! //! Constructs a new directory object representing the given path. //! The directory must exist at creation time as the contents of the //! class are gathered from it. //! directory(const path&); //! //! \brief Returns the file names of the files in the directory. //! //! Returns the leaf names of all files contained in the directory. //! I.e. the keys of the directory map. //! std::set< std::string > names(void) const; }; // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ //! //! \brief Checks if the given path exists. //! bool exists(const path&); //! //! \brief Looks for the given program in the PATH. //! //! Given a program name (without slashes) looks for it in the path and //! returns its full path name if found, otherwise an empty path. //! bool have_prog_in_path(const std::string&); //! //! \brief Checks if the given path exists, is accessible and is executable. //! bool is_executable(const path&); //! //! \brief Removes a given file. //! void remove(const path&); //! //! \brief Removes an empty directory. //! void rmdir(const path&); } // namespace fs } // namespace atf #endif // !defined(_ATF_CXX_FS_HPP_) bind9-9.9.5.dfsg/unit/atf-src/atf-c++/detail/exceptions.cpp0000644000470500017500000001040312271526120022617 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include #include extern "C" { #include "../../atf-c/error.h" }; #include "exceptions.hpp" #include "sanity.hpp" // ------------------------------------------------------------------------ // The "system_error" type. // ------------------------------------------------------------------------ atf::system_error::system_error(const std::string& who, const std::string& message, int sys_err) : std::runtime_error(who + ": " + message), m_sys_err(sys_err) { } atf::system_error::~system_error(void) throw() { } int atf::system_error::code(void) const throw() { return m_sys_err; } const char* atf::system_error::what(void) const throw() { try { if (m_message.length() == 0) { m_message = std::string(std::runtime_error::what()) + ": "; m_message += ::strerror(m_sys_err); } return m_message.c_str(); } catch (...) { return "Unable to format system_error message"; } } // ------------------------------------------------------------------------ // Free functions. // ------------------------------------------------------------------------ static void throw_libc_error(atf_error_t err) { PRE(atf_error_is(err, "libc")); const int ecode = atf_libc_error_code(err); const std::string msg = atf_libc_error_msg(err); atf_error_free(err); throw atf::system_error("XXX", msg, ecode); } static void throw_no_memory_error(atf_error_t err) { PRE(atf_error_is(err, "no_memory")); atf_error_free(err); throw std::bad_alloc(); } static void throw_unknown_error(atf_error_t err) { PRE(atf_is_error(err)); static char buf[4096]; atf_error_format(err, buf, sizeof(buf)); atf_error_free(err); throw std::runtime_error(buf); } void atf::throw_atf_error(atf_error_t err) { static struct handler { const char* m_name; void (*m_func)(atf_error_t); } handlers[] = { { "libc", throw_libc_error }, { "no_memory", throw_no_memory_error }, { NULL, throw_unknown_error }, }; PRE(atf_is_error(err)); handler* h = handlers; while (h->m_name != NULL) { if (atf_error_is(err, h->m_name)) { h->m_func(err); UNREACHABLE; } else h++; } // XXX: I'm not sure that raising an "unknown" error is a wise thing // to do here. The C++ binding is supposed to have feature parity // with the C one, so all possible errors raised by the C library // should have their counterpart in the C++ library. Still, removing // this will require some code auditing that I can't afford at the // moment. INV(h->m_name == NULL && h->m_func != NULL); h->m_func(err); UNREACHABLE; } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/atf-c++-api.30000644000470500017500000004402512271526120020452 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2008 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd November 30, 2012 .Dt ATF-C++-API 3 .Os .Sh NAME .Nm atf-c++-api , .Nm ATF_ADD_TEST_CASE , .Nm ATF_CHECK_ERRNO , .Nm ATF_FAIL , .Nm ATF_INIT_TEST_CASES , .Nm ATF_PASS , .Nm ATF_REQUIRE , .Nm ATF_REQUIRE_EQ , .Nm ATF_REQUIRE_ERRNO , .Nm ATF_REQUIRE_IN , .Nm ATF_REQUIRE_MATCH , .Nm ATF_REQUIRE_NOT_IN , .Nm ATF_REQUIRE_THROW , .Nm ATF_REQUIRE_THROW_RE , .Nm ATF_SKIP , .Nm ATF_TEST_CASE , .Nm ATF_TEST_CASE_BODY , .Nm ATF_TEST_CASE_CLEANUP , .Nm ATF_TEST_CASE_HEAD , .Nm ATF_TEST_CASE_NAME , .Nm ATF_TEST_CASE_USE , .Nm ATF_TEST_CASE_WITH_CLEANUP , .Nm ATF_TEST_CASE_WITHOUT_HEAD , .Nm atf::utils::cat_file , .Nm atf::utils::compare_file , .Nm atf::utils::copy_file , .Nm atf::utils::create_file , .Nm atf::utils::file_exists , .Nm atf::utils::fork , .Nm atf::utils::grep_collection , .Nm atf::utils::grep_file , .Nm atf::utils::grep_string , .Nm atf::utils::redirect , .Nm atf::utils::wait .Nd C++ API to write ATF-based test programs .Sh SYNOPSIS .In atf-c++.hpp .Fn ATF_ADD_TEST_CASE "tcs" "name" .Fn ATF_CHECK_ERRNO "exp_errno" "bool_expression" .Fn ATF_FAIL "reason" .Fn ATF_INIT_TEST_CASES "tcs" .Fn ATF_PASS .Fn ATF_REQUIRE "expression" .Fn ATF_REQUIRE_EQ "expression_1" "expression_2" .Fn ATF_REQUIRE_ERRNO "exp_errno" "bool_expression" .Fn ATF_REQUIRE_IN "element" "collection" .Fn ATF_REQUIRE_MATCH "regexp" "string_expression" .Fn ATF_REQUIRE_NOT_IN "element" "collection" .Fn ATF_REQUIRE_THROW "expected_exception" "statement" .Fn ATF_REQUIRE_THROW_RE "expected_exception" "regexp" "statement" .Fn ATF_SKIP "reason" .Fn ATF_TEST_CASE "name" .Fn ATF_TEST_CASE_BODY "name" .Fn ATF_TEST_CASE_CLEANUP "name" .Fn ATF_TEST_CASE_HEAD "name" .Fn ATF_TEST_CASE_NAME "name" .Fn ATF_TEST_CASE_USE "name" .Fn ATF_TEST_CASE_WITH_CLEANUP "name" .Fn ATF_TEST_CASE_WITHOUT_HEAD "name" .Ft void .Fo atf::utils::cat_file .Fa "const std::string& path" .Fa "const std::string& prefix" .Fc .Ft bool .Fo atf::utils::compare_file .Fa "const std::string& path" .Fa "const std::string& contents" .Fc .Ft void .Fo atf::utils::copy_file .Fa "const std::string& source" .Fa "const std::string& destination" .Fc .Ft void .Fo atf::utils::create_file .Fa "const std::string& path" .Fa "const std::string& contents" .Fc .Ft void .Fo atf::utils::file_exists .Fa "const std::string& path" .Fc .Ft pid_t .Fo atf::utils::fork .Fa "void" .Fc .Ft bool .Fo atf::utils::grep_collection .Fa "const std::string& regexp" .Fa "const Collection& collection" .Fc .Ft bool .Fo atf::utils::grep_file .Fa "const std::string& regexp" .Fa "const std::string& path" .Fc .Ft bool .Fo atf::utils::grep_string .Fa "const std::string& regexp" .Fa "const std::string& path" .Fc .Ft void .Fo atf::utils::redirect .Fa "const int fd" .Fa "const std::string& path" .Fc .Ft void .Fo atf::utils::wait .Fa "const pid_t pid" .Fa "const int expected_exit_status" .Fa "const std::string& expected_stdout" .Fa "const std::string& expected_stderr" .Fc .Sh DESCRIPTION ATF provides a mostly-macro-based programming interface to implement test programs in C or C++. This interface is backed by a C++ implementation, but this fact is hidden from the developer as much as possible through the use of macros to simplify programming. However, the use of C++ is not hidden everywhere and while you can implement test cases without knowing anything at all about the object model underneath the provided calls, you might need some minimum notions of the language in very specific circumstances. .Pp C++-based test programs always follow this template: .Bd -literal -offset indent extern "C" { .Ns ... C-specific includes go here ... } .Ns ... C++-specific includes go here ... #include ATF_TEST_CASE(tc1); ATF_TEST_CASE_HEAD(tc1) { ... first test case's header ... } ATF_TEST_CASE_BODY(tc1) { ... first test case's body ... } ATF_TEST_CASE_WITH_CLEANUP(tc2); ATF_TEST_CASE_HEAD(tc2) { ... second test case's header ... } ATF_TEST_CASE_BODY(tc2) { ... second test case's body ... } ATF_TEST_CASE_CLEANUP(tc2) { ... second test case's cleanup ... } ATF_TEST_CASE(tc3); ATF_TEST_CASE_BODY(tc3) { ... third test case's body ... } .Ns ... additional test cases ... ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, tc1); ATF_ADD_TEST_CASE(tcs, tc2); ATF_ADD_TEST_CASE(tcs, tc3); ... add additional test cases ... } .Ed .Ss Definition of test cases Test cases have an identifier and are composed of three different parts: the header, the body and an optional cleanup routine, all of which are described in .Xr atf-test-case 4 . To define test cases, one can use the .Fn ATF_TEST_CASE , .Fn ATF_TEST_CASE_WITH_CLEANUP or the .Fn ATF_TEST_CASE_WITHOUT_HEAD macros, which take a single parameter specifiying the test case's name. .Fn ATF_TEST_CASE , requires to define a head and a body for the test case, .Fn ATF_TEST_CASE_WITH_CLEANUP requires to define a head, a body and a cleanup for the test case and .Fn ATF_TEST_CASE_WITHOUT_HEAD requires only a body for the test case. It is important to note that these .Em do not set the test case up for execution when the program is run. In order to do so, a later registration is needed through the .Fn ATF_ADD_TEST_CASE macro detailed in .Sx Program initialization . .Pp Later on, one must define the three parts of the body by means of three functions. Their headers are given by the .Fn ATF_TEST_CASE_HEAD , .Fn ATF_TEST_CASE_BODY and .Fn ATF_TEST_CASE_CLEANUP macros, all of which take the test case's name. Following each of these, a block of code is expected, surrounded by the opening and closing brackets. .Pp Additionally, the .Fn ATF_TEST_CASE_NAME macro can be used to obtain the name of the class corresponding to a particular test case, as the name is internally manged by the library to prevent clashes with other user identifiers. Similarly, the .Fn ATF_TEST_CASE_USE macro can be executed on a particular test case to mark it as "used" and thus prevent compiler warnings regarding unused symbols. Note that .Em you should never have to use these macros during regular operation. .Ss Program initialization The library provides a way to easily define the test program's .Fn main function. You should never define one on your own, but rely on the library to do it for you. This is done by using the .Fn ATF_INIT_TEST_CASES macro, which is passed the name of the list that will hold the test cases. This name can be whatever you want as long as it is a valid variable value. .Pp After the macro, you are supposed to provide the body of a function, which should only use the .Fn ATF_ADD_TEST_CASE macro to register the test cases the test program will execute. The first parameter of this macro matches the name you provided in the former call. .Ss Header definitions The test case's header can define the meta-data by using the .Fn set_md_var method, which takes two parameters: the first one specifies the meta-data variable to be set and the second one specifies its value. Both of them are strings. .Ss Configuration variables The test case has read-only access to the current configuration variables by means of the .Ft bool .Fn has_config_var and the .Ft std::string .Fn get_config_var methods, which can be called in any of the three parts of a test case. .Ss Access to the source directory It is possible to get the path to the test case's source directory from any of its three components by querying the .Sq srcdir configuration variable. .Ss Requiring programs Aside from the .Va require.progs meta-data variable available in the header only, one can also check for additional programs in the test case's body by using the .Fn require_prog function, which takes the base name or full path of a single binary. Relative paths are forbidden. If it is not found, the test case will be automatically skipped. .Ss Test case finalization The test case finalizes either when the body reaches its end, at which point the test is assumed to have .Em passed , or at any explicit call to .Fn ATF_PASS , .Fn ATF_FAIL or .Fn ATF_SKIP . These three macros terminate the execution of the test case immediately. The cleanup routine will be processed afterwards in a completely automated way, regardless of the test case's termination reason. .Pp .Fn ATF_PASS does not take any parameters. .Fn ATF_FAIL and .Fn ATF_SKIP take a single string that describes why the test case failed or was skipped, respectively. It is very important to provide a clear error message in both cases so that the user can quickly know why the test did not pass. .Ss Expectations Everything explained in the previous section changes when the test case expectations are redefined by the programmer. .Pp Each test case has an internal state called .Sq expect that describes what the test case expectations are at any point in time. The value of this property can change during execution by any of: .Bl -tag -width indent .It Fn expect_death "reason" Expects the test case to exit prematurely regardless of the nature of the exit. .It Fn expect_exit "exitcode" "reason" Expects the test case to exit cleanly. If .Va exitcode is not .Sq -1 , .Xr atf-run 1 will validate that the exit code of the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn expect_fail "reason" Any failure (be it fatal or non-fatal) raised in this mode is recorded. However, such failures do not report the test case as failed; instead, the test case finalizes cleanly and is reported as .Sq expected failure ; this report includes the provided .Fa reason as part of it. If no error is raised while running in this mode, then the test case is reported as .Sq failed . .Pp This mode is useful to reproduce actual known bugs in tests. Whenever the developer fixes the bug later on, the test case will start reporting a failure, signaling the developer that the test case must be adjusted to the new conditions. In this situation, it is useful, for example, to set .Fa reason as the bug number for tracking purposes. .It Fn expect_pass This is the normal mode of execution. In this mode, any failure is reported as such to the user and the test case is marked as .Sq failed . .It Fn expect_race "reason" Any failure or timeout during the execution of the test case will be considered as if a race condition has been triggered and reported as such. If no problems arise, the test will continue execution as usual. .It Fn expect_signal "signo" "reason" Expects the test case to terminate due to the reception of a signal. If .Va signo is not .Sq -1 , .Xr atf-run 1 will validate that the signal that terminated the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn expect_timeout "reason" Expects the test case to execute for longer than its timeout. .El .Ss Helper macros for common checks The library provides several macros that are very handy in multiple situations. These basically check some condition after executing a given statement or processing a given expression and, if the condition is not met, they automatically call .Fn ATF_FAIL with an appropriate error message. .Pp .Fn ATF_REQUIRE takes an expression and raises a failure if it evaluates to false. .Pp .Fn ATF_REQUIRE_EQ takes two expressions and raises a failure if the two do not evaluate to the same exact value. .Pp .Fn ATF_REQUIRE_IN takes an element and a collection and validates that the element is present in the collection. .Pp .Fn ATF_REQUIRE_MATCH takes a regular expression and a string and raises a failure if the regular expression does not match the string. .Pp .Fn ATF_REQUIRE_NOT_IN takes an element and a collection and validates that the element is not present in the collection. .Pp .Fn ATF_REQUIRE_THROW takes the name of an exception and a statement and raises a failure if the statement does not throw the specified exception. .Fn ATF_REQUIRE_THROW_RE takes the name of an exception, a regular expresion and a statement and raises a failure if the statement does not throw the specified exception and if the message of the exception does not match the regular expression. .Pp .Fn ATF_CHECK_ERRNO and .Fn ATF_REQUIRE_ERRNO take, first, the error code that the check is expecting to find in the .Va errno variable and, second, a boolean expression that, if evaluates to true, means that a call failed and .Va errno has to be checked against the first value. .Ss Utility functions The following functions are provided as part of the .Nm API to simplify the creation of a variety of tests. In particular, these are useful to write tests for command-line interfaces. .Pp .Ft void .Fo atf::utils::cat_file .Fa "const std::string& path" .Fa "const std::string& prefix" .Fc .Bd -offset indent Prints the contents of .Fa path to the standard output, prefixing every line with the string in .Fa prefix . .Ed .Pp .Ft bool .Fo atf::utils::compare_file .Fa "const std::string& path" .Fa "const std::string& contents" .Fc .Bd -offset indent Returns true if the given .Fa path matches exactly the expected inlined .Fa contents . .Ed .Pp .Ft void .Fo atf::utils::copy_file .Fa "const std::string& source" .Fa "const std::string& destination" .Fc .Bd -offset indent Copies the file .Fa source to .Fa destination . The permissions of the file are preserved during the code. .Ed .Pp .Ft void .Fo atf::utils::create_file .Fa "const std::string& path" .Fa "const std::string& contents" .Fc .Bd -offset indent Creates .Fa file with the text given in .Fa contents . .Ed .Pp .Ft void .Fo atf::utils::file_exists .Fa "const std::string& path" .Fc .Bd -offset indent Checks if .Fa path exists. .Ed .Pp .Ft pid_t .Fo atf::utils::fork .Fa "void" .Fc .Bd -offset indent Forks a process and redirects the standard output and standard error of the child to files for later validation with .Fn atf::utils::wait . Fails the test case if the fork fails, so this does not return an error. .Ed .Pp .Ft bool .Fo atf::utils::grep_collection .Fa "const std::string& regexp" .Fa "const Collection& collection" .Fc .Bd -offset indent Searches for the regular expression .Fa regexp in any of the strings contained in the .Fa collection . This is a template that accepts any one-dimensional container of strings. .Ed .Pp .Ft bool .Fo atf::utils::grep_file .Fa "const std::string& regexp" .Fa "const std::string& path" .Fc .Bd -offset indent Searches for the regular expression .Fa regexp in the file .Fa path . The variable arguments are used to construct the regular expression. .Ed .Pp .Ft bool .Fo atf::utils::grep_string .Fa "const std::string& regexp" .Fa "const std::string& str" .Fc .Bd -offset indent Searches for the regular expression .Fa regexp in the string .Fa str . .Ed .Ft void .Fo atf::utils::redirect .Fa "const int fd" .Fa "const std::string& path" .Fc .Bd -offset indent Redirects the given file descriptor .Fa fd to the file .Fa path . This function exits the process in case of an error and does not properly mark the test case as failed. As a result, it should only be used in subprocesses of the test case; specially those spawned by .Fn atf::utils::fork . .Ed .Pp .Ft void .Fo atf::utils::wait .Fa "const pid_t pid" .Fa "const int expected_exit_status" .Fa "const std::string& expected_stdout" .Fa "const std::string& expected_stderr" .Fc .Bd -offset indent Waits and validates the result of a subprocess spawned with .Fn atf::utils::wait . The validation involves checking that the subprocess exited cleanly and returned the code specified in .Fa expected_exit_status and that its standard output and standard error match the strings given in .Fa expected_stdout and .Fa expected_stderr . .Pp If any of the .Fa expected_stdout or .Fa expected_stderr strings are prefixed with .Sq save: , then they specify the name of the file into which to store the stdout or stderr of the subprocess, and no comparison is performed. .Ed .Sh EXAMPLES The following shows a complete test program with a single test case that validates the addition operator: .Bd -literal -offset indent #include ATF_TEST_CASE(addition); ATF_TEST_CASE_HEAD(addition) { set_md_var("descr", "Sample tests for the addition operator"); } ATF_TEST_CASE_BODY(addition) { ATF_REQUIRE_EQ(0 + 0, 0); ATF_REQUIRE_EQ(0 + 1, 1); ATF_REQUIRE_EQ(1 + 0, 1); ATF_REQUIRE_EQ(1 + 1, 2); ATF_REQUIRE_EQ(100 + 200, 300); } ATF_TEST_CASE(open_failure); ATF_TEST_CASE_HEAD(open_failure) { set_md_var("descr", "Sample tests for the open function"); } ATF_TEST_CASE_BODY(open_failure) { ATF_REQUIRE_ERRNO(ENOENT, open("non-existent", O_RDONLY) == -1); } ATF_TEST_CASE(known_bug); ATF_TEST_CASE_HEAD(known_bug) { set_md_var("descr", "Reproduces a known bug"); } ATF_TEST_CASE_BODY(known_bug) { expect_fail("See bug number foo/bar"); ATF_REQUIRE_EQ(3, 1 + 1); expect_pass(); ATF_REQUIRE_EQ(3, 1 + 2); } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, addition); ATF_ADD_TEST_CASE(tcs, open_failure); ATF_ADD_TEST_CASE(tcs, known_bug); } .Ed .Sh SEE ALSO .Xr atf-test-program 1 , .Xr atf-test-case 4 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-c++/build_test.cpp0000644000470500017500000001623612271526120021344 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2009 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "../atf-c/h_build.h" #include "build.hpp" #include "config.hpp" #include "macros.hpp" #include "detail/env.hpp" #include "detail/process.hpp" #include "detail/test_helpers.hpp" // ------------------------------------------------------------------------ // Auxiliary functions. // ------------------------------------------------------------------------ namespace atf { namespace config { void __reinit(void); } } template< class C > void print_col(const char* prefix, const C& c) { std::cout << prefix << ":"; for (typename C::const_iterator iter = c.begin(); iter != c.end(); iter++) std::cout << " '" << *iter << "'"; std::cout << "\n"; } static void print_array(const char* prefix, const char* const* a) { std::cout << prefix << ":"; for (; *a != NULL; a++) std::cout << " '" << *a << "'"; std::cout << "\n"; } static void verbose_set_env(const char *var, const char *val) { std::cout << "Setting " << var << " to '" << val << "'\n"; atf::env::set(var, val); } static bool equal_argvs(const atf::process::argv_array& aa, const char* const* array) { bool equal = true; atf::process::argv_array::size_type i = 0; while (equal && (i < aa.size() && array[i] != NULL)) { if (std::strcmp(aa[i], array[i]) != 0) equal = false; else i++; } if (equal && (i < aa.size() || array[i] != NULL)) equal = false; return equal; } static void check_equal_argvs(const atf::process::argv_array& aa, const char* const* array) { print_array("Expected arguments", array); print_col("Arguments returned", aa); if (!equal_argvs(aa, array)) ATF_FAIL("The constructed argv differs from the expected values"); } // ------------------------------------------------------------------------ // Internal test cases. // ------------------------------------------------------------------------ ATF_TEST_CASE(equal_argvs); ATF_TEST_CASE_HEAD(equal_argvs) { set_md_var("descr", "Tests the test case internal equal_argvs function"); } ATF_TEST_CASE_BODY(equal_argvs) { { const char* const array[] = { NULL }; const char* const argv[] = { NULL }; ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array)); } { const char* const array[] = { NULL }; const char* const argv[] = { "foo", NULL }; ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array)); } { const char* const array[] = { "foo", NULL }; const char* const argv[] = { NULL }; ATF_REQUIRE(!equal_argvs(atf::process::argv_array(argv), array)); } { const char* const array[] = { "foo", NULL }; const char* const argv[] = { "foo", NULL }; ATF_REQUIRE(equal_argvs(atf::process::argv_array(argv), array)); } } // ------------------------------------------------------------------------ // Test cases for the free functions. // ------------------------------------------------------------------------ ATF_TEST_CASE(c_o); ATF_TEST_CASE_HEAD(c_o) { set_md_var("descr", "Tests the c_o function"); } ATF_TEST_CASE_BODY(c_o) { for (struct c_o_test* test = c_o_tests; test->expargv[0] != NULL; test++) { std::cout << "> Test: " << test->msg << "\n"; verbose_set_env("ATF_BUILD_CC", test->cc); verbose_set_env("ATF_BUILD_CFLAGS", test->cflags); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); atf::config::__reinit(); atf::process::argv_array argv = atf::build::c_o(test->sfile, test->ofile, atf::process::argv_array(test->optargs)); check_equal_argvs(argv, test->expargv); } } ATF_TEST_CASE(cpp); ATF_TEST_CASE_HEAD(cpp) { set_md_var("descr", "Tests the cpp function"); } ATF_TEST_CASE_BODY(cpp) { for (struct cpp_test* test = cpp_tests; test->expargv[0] != NULL; test++) { std::cout << "> Test: " << test->msg << "\n"; verbose_set_env("ATF_BUILD_CPP", test->cpp); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); atf::config::__reinit(); atf::process::argv_array argv = atf::build::cpp(test->sfile, test->ofile, atf::process::argv_array(test->optargs)); check_equal_argvs(argv, test->expargv); } } ATF_TEST_CASE(cxx_o); ATF_TEST_CASE_HEAD(cxx_o) { set_md_var("descr", "Tests the cxx_o function"); } ATF_TEST_CASE_BODY(cxx_o) { for (struct cxx_o_test* test = cxx_o_tests; test->expargv[0] != NULL; test++) { std::cout << "> Test: " << test->msg << "\n"; verbose_set_env("ATF_BUILD_CXX", test->cxx); verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); atf::config::__reinit(); atf::process::argv_array argv = atf::build::cxx_o(test->sfile, test->ofile, atf::process::argv_array(test->optargs)); check_equal_argvs(argv, test->expargv); } } // ------------------------------------------------------------------------ // Tests cases for the header file. // ------------------------------------------------------------------------ HEADER_TC(include, "atf-c++/build.hpp"); // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add the internal test cases. ATF_ADD_TEST_CASE(tcs, equal_argvs); // Add the test cases for the free functions. ATF_ADD_TEST_CASE(tcs, c_o); ATF_ADD_TEST_CASE(tcs, cpp); ATF_ADD_TEST_CASE(tcs, cxx_o); // Add the test cases for the header file. ATF_ADD_TEST_CASE(tcs, include); } bind9-9.9.5.dfsg/unit/atf-src/atf-c++/config.hpp0000644000470500017500000000522712271526120020456 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_CONFIG_HPP_) #define _ATF_CXX_CONFIG_HPP_ #include #include namespace atf { namespace config { //! //! \brief Gets a build-time configuration variable's value. //! //! Given the name of a build-time configuration variable, returns its //! textual value. The user is free to override these by setting their //! corresponding environment variables. Therefore always use this //! interface to get the value of these variables. //! //! \pre The variable must exist. //! const std::string& get(const std::string&); //! //! \brief Returns all the build-time configuration variables. //! //! Returns a name to value map containing all build-time configuration //! variables. //! const std::map< std::string, std::string >& get_all(void); //! //! \brief Checks whether a build-time configuration variable exists. //! //! Given the name of a build-time configuration variable, checks //! whether it is defined and returns a boolean indicating this //! condition. The program only has to use this function to sanity-check //! a variable name provided by the user. Otherwise it can assume that //! the variables are defined. //! bool has(const std::string&); } // namespace config } // namespace atf #endif // !defined(_ATF_CXX_CONFIG_HPP_) bind9-9.9.5.dfsg/unit/atf-src/configure.ac0000644000470500017500000001743612271526120017653 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ----------------------------------------------------------------------- dnl Initialize the GNU build system. dnl ----------------------------------------------------------------------- AC_INIT([Automated Testing Framework], [0.17], [atf-devel@NetBSD.org], [atf], [http://code.google.com/p/kyua/wiki/ATF]) AC_PREREQ([2.65]) AC_COPYRIGHT([Copyright (c) 2007-2012 The NetBSD Foundation, Inc.]) AC_DEFINE([PACKAGE_COPYRIGHT], ["Copyright (c) 2007-2012 The NetBSD Foundation, Inc."], [Define to the copyright string applicable to this package.]) AC_CONFIG_AUX_DIR([admin]) AC_CONFIG_HEADERS([bconfig.h]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([atf-c.h]) AC_CONFIG_TESTDIR([bootstrap]) AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([1.9 check-news foreign subdir-objects -Wall]) LT_INIT AC_ARG_ENABLE(tools, AS_HELP_STRING([--enable-tools], [Enables the build of the deprecated ATF tools]), [case $enableval in yes|no) enable_tools=${enableval} ;; *) AC_MSG_ERROR([Invalid value passed to --enable-tools]) ;; esac], [enable_tools=no]) AC_SUBST([ENABLE_TOOLS], ${enable_tools}) AM_CONDITIONAL([ENABLE_TOOLS], [test "${enable_tools}" = yes]) dnl ----------------------------------------------------------------------- dnl Check for the C and C++ compilers and required features. dnl ----------------------------------------------------------------------- AC_LANG(C) AC_PROG_CC AM_PROG_CC_C_O dnl The C compiler check automatically aborts if the compiler does not work. dnl Nothing to do here. AC_LANG(C++) AC_PROG_CXX AC_CACHE_CHECK([whether the C++ compiler works], [atf_cv_prog_cxx_works], [AC_LANG_PUSH([C++]) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [atf_cv_prog_cxx_works=yes], [atf_cv_prog_cxx_works=no]) AC_LANG_POP]) if test "${atf_cv_prog_cxx_works}" = no; then AC_MSG_ERROR([C++ compiler cannot create executables]) fi KYUA_DEVELOPER_MODE([C,C++]) ATF_MODULE_APPLICATION ATF_MODULE_DEFS ATF_MODULE_ENV ATF_MODULE_FS ATF_MODULE_SANITY ATF_MODULE_SIGNALS AC_CHECK_TYPE([timer_t], [], [], [[#include ]]) ATF_RUNTIME_TOOL([ATF_BUILD_CC], [C compiler to use at runtime], [${CC}]) ATF_RUNTIME_TOOL([ATF_BUILD_CFLAGS], [C compiler flags to use at runtime], [${CFLAGS}]) ATF_RUNTIME_TOOL([ATF_BUILD_CPP], [C/C++ preprocessor to use at runtime], [${CPP}]) ATF_RUNTIME_TOOL([ATF_BUILD_CPPFLAGS], [C/C++ preprocessor flags to use at runtime], [${CPPFLAGS}]) ATF_RUNTIME_TOOL([ATF_BUILD_CXX], [C++ compiler to use at runtime], [${CXX}]) ATF_RUNTIME_TOOL([ATF_BUILD_CXXFLAGS], [C++ compiler flags to use at runtime], [${CXXFLAGS}]) dnl ----------------------------------------------------------------------- dnl Generation of files in srcdir. dnl ----------------------------------------------------------------------- dnl BSD make(1) doesn't deal with targets specified as './foo' well: they dnl need to be specified as 'foo'. The following hack is to workaround this dnl issue. if test "${srcdir}" = .; then target_srcdir= else target_srcdir="${srcdir}/" fi AC_SUBST([target_srcdir]) dnl ----------------------------------------------------------------------- dnl Architecture and machine checks. dnl ----------------------------------------------------------------------- atf_arch=`uname -p` atf_machine=`uname -m` AC_MSG_NOTICE([Machine type: ${atf_machine}, architecture: ${atf_arch}]) AC_SUBST(atf_arch, ${atf_arch}) AC_SUBST(atf_machine, ${atf_machine}) dnl ----------------------------------------------------------------------- dnl User-customizable variables. dnl ----------------------------------------------------------------------- AC_ARG_VAR([ATF_CONFSUBDIR], [Subdirectory of sysconfdir under which to look for files]) if test x"${ATF_CONFSUBDIR-unset}" = x"unset"; then ATF_CONFSUBDIR=atf else case ${ATF_CONFSUBDIR} in /*) AC_MSG_ERROR([ATF_CONFSUBDIR must hold a relative path]) ;; *) ;; esac fi if test x"${ATF_CONFSUBDIR}" = x""; then AC_SUBST(atf_confdir, \${sysconfdir}) else AC_SUBST(atf_confdir, \${sysconfdir}/${ATF_CONFSUBDIR}) fi AC_ARG_VAR([ATF_WORKDIR], [Default location to use for ATF work directories]) if test x"${ATF_WORKDIR}" = x""; then for t in /tmp /var/tmp; do if test -d ${t}; then ATF_WORKDIR=${t} break fi done if test x"${ATF_WORKDIR}" = x""; then AC_MSG_ERROR([Could not guess a value for ATF_WORKDIR]) fi else case ${ATF_WORKDIR} in /*) ;; *) AC_MSG_ERROR([ATF_WORKDIR must hold an absolute path]) ;; esac fi AC_SUBST(atf_aclocaldir, \${datadir}/aclocal) AC_SUBST(atf_cssdir, \${datadir}/examples/atf) AC_SUBST(atf_dtddir, \${datadir}/xml/atf) AC_SUBST(atf_egdir, \${datadir}/examples/atf) AC_SUBST(atf_pkgconfigdir, \${libdir}/pkgconfig) AC_SUBST(atf_xsldir, \${datadir}/xsl/atf) dnl ----------------------------------------------------------------------- dnl Check for the shell and portability problems. dnl ----------------------------------------------------------------------- AC_ARG_VAR([ATF_SHELL], [Location of the POSIX shell interpreter to use]) if test x"${ATF_SHELL}" = x""; then AC_PATH_PROGS(ATF_SHELL, [bash sh]) else case ${ATF_SHELL} in /*) ;; *) AC_MSG_ERROR([ATF_SHELL must hold an absolute path]) ;; esac fi if test x"${ATF_SHELL}" = x""; then AC_MSG_ERROR([No POSIX shell interpreter found; maybe set ATF_SHELL?]) fi dnl ----------------------------------------------------------------------- dnl Check for required tools. dnl ----------------------------------------------------------------------- AC_PATH_PROG([GDB], [gdb]) AC_PATH_PROG([KYUA], [kyua]) AM_CONDITIONAL([HAVE_KYUA], [test -n "${KYUA}"]) AC_PATH_PROG([GIT], [git]) dnl ----------------------------------------------------------------------- dnl Finally, generate output. dnl ----------------------------------------------------------------------- AC_OUTPUT([Makefile atf-c/defs.h]) if test ${enable_tools} = yes; then AC_MSG_WARN([Building the deprecated ATF tools (atf-run and atf-report);]) AC_MSG_WARN([please migrate to Kyua as soon as feasible.]) fi dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/INSTALL0000644000470500017500000001623512271526120016412 0ustar lamontlamontInstallation instructions Automated Testing Framework =========================================================================== Introduction ************ ATF uses the GNU Automake, GNU Autoconf and GNU Libtool utilities as its build system. These are used only when compiling the application from the source code package. If you want to install ATF from a binary package, you do not need to read this document. For the impatient: $ ./configure $ make Gain root privileges # make install Drop root privileges $ make installcheck Or alternatively, install as a regular user into your home directory: $ ./configure --prefix ~/local $ make $ make install $ make installcheck Dependencies ************ To build and use ATF successfully you need: * A standards-compliant C/C++ complier. For example, GNU GCC 2.95 will not work. * A POSIX shell interpreter. * A make(1) utility. If you are building ATF from the code on the repository, you will also need to have GNU autoconf, automake and libtool installed. Regenerating the build system ***************************** If you are building ATF from code extracted from the repository, you must first regenerate the files used by the build system. You will also need to do this if you modify configure.ac, Makefile.am or any of the other build system files. To do this, simply run: $ autoreconf -i -s For formal releases, no extra steps are needed. General build procedure *********************** To build and install the source package, you must follow these steps: 1. Configure the sources to adapt to your operating system. This is done using the 'configure' script located on the sources' top directory, and it is usually invoked without arguments unless you want to change the installation prefix. More details on this procedure are given on a later section. 2. Build the sources to generate the binaries and scripts. Simply run 'make' on the sources' top directory after configuring them. No problems should arise. 3. Install the program by running 'make install'. You may need to become root to issue this step. 4. Issue any manual installation steps that may be required. These are described later in their own section. 5. Check that the installed programs work by running 'make installcheck'. You do not need to be root to do this, even though some checks will not be run otherwise. Configuration flags ******************* The most common, standard flags given to 'configure' are: * --prefix=directory Possible values: Any path Default: /usr/local Specifies where the program (binaries and all associated files) will be installed. * --sysconfdir=directory Possible values: Any path Default: /usr/local/etc Specifies where the installed programs will look for configuration files. '/atf' will be appended to the given path unless ATF_CONFSUBDIR is redefined as explained later on. * --help Shows information about all available flags and exits immediately, without running any configuration tasks. The following environment variables are specific to ATF's 'configure' script: * ATF_BUILD_CC Possible values: empty, a absolute or relative path to a C compiler. Default: the value of CC as detected by the configure script. Specifies the C compiler that ATF will use at run time whenever the build-time-specific checks are used. * ATF_BUILD_CFLAGS Possible values: empty, a list of valid C compiler flags. Default: the value of CFLAGS as detected by the configure script. Specifies the C compiler flags that ATF will use at run time whenever the build-time-specific checks are used. * ATF_BUILD_CPP Possible values: empty, a absolute or relative path to a C/C++ preprocessor. Default: the value of CPP as detected by the configure script. Specifies the C/C++ preprocessor that ATF will use at run time whenever the build-time-specific checks are used. * ATF_BUILD_CPPFLAGS Possible values: empty, a list of valid C/C++ preprocessor flags. Default: the value of CPPFLAGS as detected by the configure script. Specifies the C/C++ preprocessor flags that ATF will use at run time whenever the build-time-specific checks are used. * ATF_BUILD_CXX Possible values: empty, a absolute or relative path to a C++ compiler. Default: the value of CXX as detected by the configure script. Specifies the C++ compiler that ATF will use at run time whenever the build-time-specific checks are used. * ATF_BUILD_CXXFLAGS Possible values: empty, a list of valid C++ compiler flags. Default: the value of CXXFLAGS as detected by the configure script. Specifies the C++ compiler flags that ATF will use at run time whenever the build-time-specific checks are used. * ATF_CONFSUBDIR Possible values: empty, a relative path. Default: atf. Specifies the subdirectory of the configuration directory (given by the --sysconfdir argument) under which ATF will search for its configuration files. * ATF_SHELL Possible values: empty, absolute path to a POSIX shell interpreter. Default: empty. Specifies the POSIX shell interpreter that ATF will use at run time to execute its scripts and the test programs written using the atf-sh library. If empty, the configure script will try to find a suitable interpreter for you. * ATF_WORKDIR Possible values: empty, an absolute path. Default: /tmp or /var/tmp, depending on availability. Specifies the directory that ATF will use to place its temporary files and work directories for test cases. This is just a default and can be overriden at run time. * GDB Possible values: empty, absolute path to GNU GDB. Default: empty. Specifies the path to the GNU GDB binary that atf-run will use to gather a stack trace of a crashing test program. If empty, the configure script will try to find a suitable binary for you. The following flags are specific to ATF's 'configure' script: * --enable-developer Possible values: yes, no Default: 'yes' in Git HEAD builds; 'no' in formal releases. Enables several features useful for development, such as the inclusion of debugging symbols in all objects or the enforcement of compilation warnings. The compiler will be executed with an exhaustive collection of warning detection features regardless of the value of this flag. However, such warnings are only fatal when --enable-developer is 'yes'. * --enable-tools Possible values: yes, no Default: no. Enables the build of the deprecated atf-config, atf-report, atf-run and atf-version tools. atf-report and atf-run have been superseded by Kyua, and atf-config and atf-version are unnecessary. Post-installation steps *********************** After installing ATF, you have to register the DTDs it provides into the system-wide XML catalog. See the comments at the top of the files in ${datadir}/share/xml/atf to see the correct public identifiers. This directory will typically be /usr/local/share/xml/atf or /usr/share/xml/atf. Failure to do so will lead to further errors when processing the XML files generated by atf-report. =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/AUTHORS0000644000470500017500000000220212271526120016416 0ustar lamontlamontAuthors and contributors Automated Testing Framework =========================================================================== * Julio Merino Main developer. He started the work on this project when he took part in the Google Summer of Code 2007 program as a student. * Martin Husemann Mentored this project during its development as part of the Google Summer of Code 2007 program. * Lukasz Strzygowski Participant of the Google Summer of Code 2008 program. Mentored by The NetBSD Foundation, he worked on the atfify NetBSD-SoC project and, as a side-effect, he contributed to the ATF source code. He developed the initial version of the atf-check utility and started the addition of the ATF_REQUIRE family of macros in the C interface. * Paul Goyette Implemented timestamping of test programs and test cases so that atf-report can provide timings for their execution. =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/TODO0000644000470500017500000001556012271526120016051 0ustar lamontlamontThings to do Automated Testing Framework =========================================================================== Last revised: November 30th, 2010 This document includes the list of things that need to be done in ATF that are most requested by the users. This information used to be available in an ad-hoc bug tracker but that proved to be a bad idea. I have collected all worthy comments in here. Please note that most work these days is going into Kyua (see http://code.google.com/p/kyua/). The ideas listed here apply to the components of ATF that have *not* been migrated to the new codebase yet. For bug reports or ideas that apply to the components that already have been migrated, please use the bug tracker in the URL above. Similarly, whenever a component is migrated, the ideas in this file should be revised and migrated to the new bug tracker where appropriate. --------------------------------------------------------------------------- Add build-time checks to atf-sh The 0.7 release introduced build-time tests to atf-c and atf-c++, but not to atf-sh. Expose the functionality to the shell interface. This will probably require writing an atf-build utility that exposes the C code and can be called from the shell. --------------------------------------------------------------------------- Revisit what to do when an Atffile lists a non-existent file --------------------------------------------------------------------------- Add ATF_CHECK* versions to atf-c++ to support non-fatal tests --------------------------------------------------------------------------- Implement race-condition tests gcooper: I would think that stress/negative tests would be of more value than race condition tests (they're similar, but not exactly the same in my mind). In particular, 1. Feed through as much data as possible to determine where reporting breaks down. 2. Feed through data quickly and terminate ASAP. The data should be captured. Terminate child applications with unexpected exit codes and signals (in particular, SIGCHLD, SIGPIPE, exit codes that terminate, etc). 3. Open up a file descriptor in the test application, don't close the file descriptor. 4. fork(2) a process; don't wait(2) for the application to complete. There are other scenarios that could be exercised, but these are the ones I could think of off the topic of my head. -- jmmv: 1. The thing is: how do you express any of this in a portable/abstract interface? How do you express that a test case "receives data"? What does that exactly mean? I don't think the framework should care about this: each test should be free to decide where its data is and how to deal with it. 2. Ditto. 3. Not sure I understand your request, but testing for "unexpected exit codes" is already supported. See wiki:DesignXFail for the feature design details. 4. What's the problem with this case? The test case exits right away after terminating the execution of its body; any open file descriptors, leaked memory, etc. die with it. 5. forking and not waiting for a subprocess was a problem already addressed. I kinda have an idea of what Antti means with "race condition tests", but every time I have tried to describe my understanding of matters I seem to be wrong. Would be nice to have a clear description of what this involves; in particular, what are the expectations from the framework and how should the feature be exposed. As of now, what I understand by "race condition test" is: a test case that exercises a race condition. The test case may finish without triggering the race, in which case it just exists with a successful status. Otherwise, if the race triggers, the test case gets stuck and times out. The result should be reported as an "expected failure" different from timeout. -- pooka: Yup. Plus some atf-wide mechanism for the operator to supply some kind of guideline if the test should try to trigger the race for a second or for an hour. -- jmmv: Alright. While mocking up some code for this, I think that your two requests are complementary. On the one hand, when you are talking about a "race condition" test you really mean an "expected race condition" test. Correct? If so, we need to extend the xfail mechanism to add one more case, which is to report any failures as a race condition error and, if there is no failure, report the test as successful. On the other hand, the atf-wide mechanism to support how long the test should run for can be thought as a "stress test" mechanism. I.e. run this test for X time / iterations and report its results regularly without involving xfail at all. So, with this in mind: * For a test that triggers an unfixed race condition, you set xfail to race mode and define the test as a stress test. Any failures are reported as expected failures. * For a test that verifies a supposedly-fixed race condition, you do *not* set xfail to race mode, and only set the test to stress test. Any failures are reported as real failures. These stress test cases implement a single iteration of the test and atf-run is in charge of running the test several times, stopping on the first failure. Does that make sense? --------------------------------------------------------------------------- Implement ATF_REQUIRE_ERRNO pooka: Most of the lines in tests against system functionality are: if (syscall(args) == -1) atf_tc_fail_errno("flop") Some shorthand would be helpful, like ATF_REQUIRE_ERRNO(syscall(args)) Also, a variant which allows arbitrary return value checks (e.g. "!= 0" or "< 124" or "!= size") would be nice. -- gcooper: There's a problem with this request; not all functions fail in the same way ... in particular compare the pthread family of functions (which return errno) vs many native syscalls. Furthermore, compare some fcntl-like syscalls vs other syscalls. One size fits all solutions may not be a wise idea in this case, so I think that the problem statement needs to be better defined, because the above request is too loose. FWIW, there's also a TEST macro in LTP, which tests for non-zero status, and sets an appropriate set of global variables for errnos and return codes, respectively. It was a good idea, but has been mostly abandoned because it's too difficult to define a success and failure in a universal manner, so I think that we need to be careful with what's implemented in ATF to not repeat the mistakes that others have made. -- jmmv: I think you've got a good point. This was mostly intended to simplify the handling of the stupid errno global variable. I think this is valuable to have, but maybe the macro/function name should be different because _ERRNO can be confusing. Probably something like an ATF_CHECK_LIBC / ATF_CHECK_PTHREAD approach would be more flexible and simple. =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/atf-config/0002755000470500017500000000000012276444014017377 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-config/integration_test.sh0000644000470500017500000001346712271526120023320 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # all_vars="atf_arch \ atf_build_cc \ atf_build_cflags \ atf_build_cpp \ atf_build_cppflags \ atf_build_cxx \ atf_build_cxxflags \ atf_confdir \ atf_includedir \ atf_libdir \ atf_libexecdir \ atf_machine \ atf_pkgdatadir \ atf_shell \ atf_workdir" all_vars_no=15 atf_test_case list_all list_all_head() { atf_set "descr" "Tests that at atf-config prints all expected" \ "variables, and not more" } list_all_body() { atf_check -s eq:0 -o save:stdout -e empty atf-config atf_check -s eq:0 -o empty -e empty \ test "$(wc -l stdout | awk '{ print $1 }')" = "${all_vars_no}" for v in ${all_vars}; do atf_check -s eq:0 -o ignore -e empty grep "${v}" stdout done } atf_test_case query_one query_one_head() { atf_set "descr" "Tests that querying a single variable works" } query_one_body() { for v in ${all_vars}; do atf_check -s eq:0 -o save:stdout -o match:"${v}" -e empty \ atf-config "${v}" atf_check -s eq:0 -o empty -e empty \ test "$(wc -l stdout | awk '{ print $1 }')" = 1 done } atf_test_case query_one_terse query_one_terse_head() { atf_set "descr" "Tests that querying a single variable in terse mode" \ "works" } query_one_terse_body() { for v in ${all_vars}; do atf_check -s eq:0 -o save:stdout -o match:"${v}" -e empty \ atf-config "${v}" atf_check -s eq:0 -o empty -e empty \ test "$(wc -l stdout | awk '{ print $1 }')" = 1 atf_check -s eq:0 -o save:stdout -e empty cut -d ' ' -f 3- stdout atf_check -s eq:0 -o empty -e empty mv stdout expout atf_check -s eq:0 -o file:expout -e empty atf-config -t "${v}" done } atf_test_case query_multiple query_multiple_head() { atf_set "descr" "Tests that querying multiple variables works" } query_multiple_body() { atf_check -s eq:0 -o save:stdout -o match:'atf_libexecdir' \ -o match:'atf_shell' -e empty atf-config atf_libexecdir atf_shell atf_check -s eq:0 -o empty -e empty \ test "$(wc -l stdout | awk '{ print $1 }')" = 2 } atf_test_case query_unknown query_unknown_head() { atf_set "descr" "Tests that querying an unknown variable delivers" \ "the correct error" } query_unknown_body() { atf_check -s eq:1 -o empty -e match:'Unknown variable.*non_existent' \ atf-config non_existent } atf_test_case query_mixture query_mixture_head() { atf_set "descr" "Tests that querying a known and an unknown variable" \ "delivers the correct error" } query_mixture_body() { for v in ${all_vars}; do atf_check -s eq:1 -o empty -e match:'Unknown variable.*non_existent' \ atf-config "${v}" non_existent atf_check -s eq:1 -o empty -e match:'Unknown variable.*non_existent' \ atf-config non_existent "${v}" done } atf_test_case override_env override_env_head() { atf_set "descr" "Tests that build-time variables can be overriden" \ "through their corresponding environment variables" } override_env_body() { for v in ${all_vars}; do V=$(echo ${v} | tr '[a-z]' '[A-Z]') atf_check -s eq:0 -o save:stdout -e empty -x "${V}=testval atf-config" atf_check -s eq:0 -o empty -e empty mv stdout all atf_check -s eq:0 -o save:stdout -e empty grep "^${v} : " all atf_check -s eq:0 -o empty -e empty mv stdout affected atf_check -s eq:0 -o save:stdout -e empty grep -v "^${v} : " all atf_check -s eq:0 -o empty -e empty mv stdout unaffected atf_check -s eq:0 -o empty -e empty \ test "$(wc -l affected | awk '{ print $1 }')" = 1 atf_check -s eq:0 -o empty -e empty \ test "$(wc -l unaffected | awk '{ print $1 }')" = \ "$((${all_vars_no} -1))" atf_check -s eq:0 -o ignore -e empty grep "^${v} : testval$" affected atf_check -s eq:1 -o empty -e empty grep ' : testval$' unaffected done } atf_init_test_cases() { atf_add_test_case list_all atf_add_test_case query_one atf_add_test_case query_one_terse atf_add_test_case query_multiple atf_add_test_case query_unknown atf_add_test_case query_mixture atf_add_test_case override_env } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-config/Atffile0000644000470500017500000000013612271526120020664 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: *_test bind9-9.9.5.dfsg/unit/atf-src/atf-config/atf-config.cpp0000644000470500017500000000757712271526120022130 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include #include extern "C" { #include "atf-c/defs.h" } #include "atf-c++/config.hpp" #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/sanity.hpp" class atf_config : public atf::application::app { static const char* m_description; bool m_tflag; void process_option(int, const char*); std::string specific_args(void) const; options_set specific_options(void) const; std::string format_var(const std::string&, const std::string&); public: atf_config(void); int main(void); }; const char* atf_config::m_description = "atf-config is a tool that queries the value of several " "installation-specific configuration values of the atf. " "It can be used by external tools to discover where specific " "internal atf files are installed."; atf_config::atf_config(void) : app(m_description, "atf-config(1)", "atf(7)"), m_tflag(false) { } void atf_config::process_option(int ch, const char* arg ATF_DEFS_ATTRIBUTE_UNUSED) { switch (ch) { case 't': m_tflag = true; break; default: UNREACHABLE; } } std::string atf_config::specific_args(void) const { return "[var1 [.. varN]]"; } atf_config::options_set atf_config::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('t', "", "Terse output: show values only")); return opts; } std::string atf_config::format_var(const std::string& name, const std::string& val) { std::string str; if (m_tflag) str = val; else str = name + " : " + val; return str; } int atf_config::main(void) { if (m_argc < 1) { std::map< std::string, std::string > cv = atf::config::get_all(); for (std::map< std::string, std::string >::const_iterator iter = cv.begin(); iter != cv.end(); iter++) std::cout << format_var((*iter).first, (*iter).second) << "\n"; } else { for (int i = 0; i < m_argc; i++) { if (!atf::config::has(m_argv[i])) throw std::runtime_error(std::string("Unknown variable `") + m_argv[i] + "'"); } for (int i = 0; i < m_argc; i++) { std::cout << format_var(m_argv[i], atf::config::get(m_argv[i])) << "\n"; } } return EXIT_SUCCESS; } int main(int argc, char* const* argv) { return atf_config().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/atf-config/Makefile.am.inc0000644000470500017500000000420512271526120022174 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # bin_PROGRAMS += atf-config/atf-config atf_config_atf_config_SOURCES = atf-config/atf-config.cpp atf_config_atf_config_LDADD = $(ATF_CXX_LIBS) dist_man_MANS += atf-config/atf-config.1 tests_atf_config_DATA = atf-config/Atffile \ atf-config/Kyuafile tests_atf_configdir = $(pkgtestsdir)/atf-config EXTRA_DIST += $(tests_atf_config_DATA) tests_atf_config_SCRIPTS = atf-config/integration_test CLEANFILES += atf-config/integration_test EXTRA_DIST += atf-config/integration_test.sh atf-config/integration_test: $(srcdir)/atf-config/integration_test.sh test -d atf-config || mkdir -p atf-config @src="$(srcdir)/atf-config/integration_test.sh"; \ dst="atf-config/integration_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-config/atf-config.10000644000470500017500000001426412271526120021475 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2007 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd March 14, 2009 .Dt ATF-CONFIG 1 .Os .Sh NAME .Nm atf-config .Nd queries static configuration information of ATF .Sh SYNOPSIS .Nm .Op Fl t .Op Ar var1 Op Ar .. varN .Nm .Fl h .Sh DESCRIPTION .Nm is a utility that queries static configuration information of ATF. Static configuration refers to all those values for settings that were built into the ATF binaries at build time. .Pp In the first synopsis form, .Nm will print variable-value pairs for all built-in static variables if no variable names are provided as arguments. If any is provided, it will only print the variable-value pairs for those variables. The output of the utility does not use the .Sq = symbol to separate the variable name from its corresponding value in an attempt to avoid sourcing the output in shell scripts or Makefiles. If you need to do that, the .Fl t flag allows you to query the value of individual variables without any surrounding text. .Pp In the second synopsis form, .Nm will print information about all supported options and their purpose. .Pp The following options are available: .Bl -tag -width flag .It Fl h Shows a short summary of all available options and their purpose. .It Fl t Changes the output of the utility to show the variable values, one per line, without the variable names. .El .Ss Static configuration variables The following list describes all the variables that are part of ATF's static configuration: .Bl -tag -width atfXbuildXcppflagsXX .It Va atf_arch The architecture name detected by ATF. This is derived from .Va atf_machine because it is a subset of it. Given that this name might be misdetected, it is provided to the user as a configuration variable so that he can fix its value temporarily until a real fix is incorporated into mainstream sources. .It Va atf_build_cc The C compiler used by the ATF checks that provide build-time tests. .It Va atf_build_cflags The C compiler flags used by the ATF checks that provide build-time tests. .It Va atf_build_cpp The C/C++ preprocessor used by the ATF checks that provide build-time tests. .It Va atf_build_cppflags The C/C++ preprocessor flags used by the ATF checks that provide build-time tests. .It Va atf_build_cxx The C++ compiler used by the ATF checks that provide build-time tests. .It Va atf_build_cxxflags The C++ compiler flags used by the ATF checks that provide build-time tests. .It Va atf_confdir The path to the directory that contains the system-wide configuration files for ATF. .It Va atf_includedir The path to the directory that contains the ATF header files. .It Va atf_libdir The path to the directory that contains the ATF libraries. .It Va atf_libexecdir The path to the directory that contains the auxiliary utilities of ATF, used internally by the public tools. .It Va atf_machine The machine type name detected by ATF. This should not be tunable but is provided for symmetry with .Va atf_arch . .It Va atf_pkgdatadir The path to the directory that contains the files that form the ATF's shell-scripting library. .It Va atf_shell The path to the shell interpreter that will be used by ATF. .It Va atf_workdir The path to the temporary directory that the utilities and the test programs will use to store temporary files in. .El .Sh ENVIRONMENT Every variable that is part of the static configuration can be overridden at run-time by defining an environment variable. This environment variable has the exact same name as the one shown by .Nm except that the name is all composed of uppercase letters. .Pp In general, empty values in the environment will be ignored unless otherwise noted below. .Pp The recognized environment variables are: .Bl -tag -width ATFXBUILDXCPPFLAGSXX .It Ev ATF_ARCH Overrides the built-in value of .Va atf_arch . .It Ev ATF_BUILD_CC Overrides the built-in value of .Va atf_build_cc . .It Ev ATF_BUILD_CFLAGS Overrides the built-in value of .Va atf_build_cflags . Empty values are allowed. .It Ev ATF_BUILD_CPP Overrides the built-in value of .Va atf_build_cpp . .It Ev ATF_BUILD_CPPFLAGS Overrides the built-in value of .Va atf_build_cppflags . Empty values are allowed. .It Ev ATF_BUILD_CXX Overrides the built-in value of .Va atf_build_cxx . .It Ev ATF_BUILD_CXXFLAGS Overrides the built-in value of .Va atf_build_cxxflags . Empty values are allowed. .It Ev ATF_CONFDIR Overrides the built-in value of .Va atf_confdir . .It Ev ATF_INCLUDEDIR Overrides the built-in value of .Va atf_includedir . .It Ev ATF_LIBDIR Overrides the built-in value of .Va atf_libdir . .It Ev ATF_LIBEXECDIR Overrides the built-in value of .Va atf_libexecdir . .It Ev ATF_MACHINE Overrides the built-in value of .Va atf_machine . .It Ev ATF_PKGDATADIR Overrides the built-in value of .Va atf_pkgdatadir . .It Ev ATF_SHELL Overrides the built-in value of .Va atf_shell . .It Ev ATF_WORKDIR Overrides the built-in value of .Va atf_workdir . .El .Sh SEE ALSO .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-config/Kyuafile0000644000470500017500000000012412271526120021060 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="integration_test"} bind9-9.9.5.dfsg/unit/atf-src/test-programs/0002755000470500017500000000000012271526120020163 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/test-programs/expect_test.sh0000644000470500017500000001324312271526120023047 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # check_result() { file="${1}"; shift atf_check -s eq:0 -o match:"${*}" -e empty cat "${file}" rm "${file}" } atf_test_case expect_pass expect_pass_body() { for h in $(get_helpers); do atf_check -s eq:0 -e ignore "${h}" -r result expect_pass_and_pass check_result result "passed" atf_check -s eq:1 -e ignore "${h}" -r result \ expect_pass_but_fail_requirement check_result result "failed: Some reason" # atf-sh does not support non-fatal failures yet; skip checks for # such conditions. case "${h}" in *sh_helpers*) continue ;; esac atf_check -s eq:1 -o empty -e match:"Some reason" \ "${h}" -r result expect_pass_but_fail_check check_result result "failed: 1 checks failed" done } atf_test_case expect_fail expect_fail_body() { for h in $(get_helpers c_helpers cpp_helpers); do atf_check -s eq:0 "${h}" -r result expect_fail_and_fail_requirement check_result result "expected_failure: Fail reason: The failure" atf_check -s eq:1 -e match:"Expected check failure: Fail first: abc" \ -e not-match:"And fail again" "${h}" -r result expect_fail_but_pass check_result result "failed: .*expecting a failure" # atf-sh does not support non-fatal failures yet; skip checks for # such conditions. case "${h}" in *sh_helpers*) continue ;; esac atf_check -s eq:0 -e match:"Expected check failure: Fail first: abc" \ -e match:"Expected check failure: And fail again: def" \ "${h}" -r result expect_fail_and_fail_check check_result result "expected_failure: And fail again: 2 checks" \ "failed as expected" done # atf-sh does not support non-fatal failures yet; skip checks for # such conditions. for h in $(get_helpers sh_helpers); do atf_check -s eq:0 -e ignore "${h}" -r result \ expect_fail_and_fail_requirement check_result result "expected_failure: Fail reason: The failure" atf_check -s eq:1 -e ignore "${h}" -r result expect_fail_but_pass check_result result "failed: .*expecting a failure" done } atf_test_case expect_exit expect_exit_body() { for h in $(get_helpers); do atf_check -s eq:0 -e ignore "${h}" -r result expect_exit_any_and_exit check_result result "expected_exit: Call will exit" atf_check -s eq:123 -e ignore "${h}" -r result expect_exit_code_and_exit check_result result "expected_exit\(123\): Call will exit" atf_check -s eq:1 -e ignore "${h}" -r result expect_exit_but_pass check_result result "failed: .*expected to exit" done } atf_test_case expect_signal expect_signal_body() { for h in $(get_helpers); do atf_check -s signal:9 -e ignore "${h}" -r result \ expect_signal_any_and_signal check_result result "expected_signal: Call will signal" atf_check -s signal:hup -e ignore "${h}" -r result \ expect_signal_no_and_signal check_result result "expected_signal\(1\): Call will signal" atf_check -s eq:1 -e ignore "${h}" -r result \ expect_signal_but_pass check_result result "failed: .*termination signal" done } atf_test_case expect_death expect_death_body() { for h in $(get_helpers); do atf_check -s eq:123 -e ignore "${h}" -r result expect_death_and_exit check_result result "expected_death: Exit case" atf_check -s signal:kill -e ignore "${h}" -r result \ expect_death_and_signal check_result result "expected_death: Signal case" atf_check -s eq:1 -e ignore "${h}" -r result expect_death_but_pass check_result result "failed: .*terminate abruptly" done } atf_test_case expect_timeout expect_timeout_body() { for h in $(get_helpers); do atf_check -s eq:1 -e ignore "${h}" -r result expect_timeout_but_pass check_result result "failed: Test case was expected to hang but it" \ "continued execution" done } atf_init_test_cases() { atf_add_test_case expect_pass atf_add_test_case expect_fail atf_add_test_case expect_exit atf_add_test_case expect_signal atf_add_test_case expect_death atf_add_test_case expect_timeout } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/sh_helpers.sh0000644000470500017500000002267312271526120022663 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # ------------------------------------------------------------------------- # Helper tests for "t_cleanup". # ------------------------------------------------------------------------- atf_test_case cleanup_pass cleanup cleanup_pass_head() { atf_set "descr" "Helper test case for the t_cleanup test program" } cleanup_pass_body() { touch $(atf_config_get tmpfile) } cleanup_pass_cleanup() { if [ $(atf_config_get cleanup no) = yes ]; then rm $(atf_config_get tmpfile) fi } atf_test_case cleanup_fail cleanup cleanup_fail_head() { atf_set "descr" "Helper test case for the t_cleanup test program" } cleanup_fail_body() { touch $(atf_config_get tmpfile) atf_fail "On purpose" } cleanup_fail_cleanup() { if [ $(atf_config_get cleanup no) = yes ]; then rm $(atf_config_get tmpfile) fi } atf_test_case cleanup_skip cleanup cleanup_skip_head() { atf_set "descr" "Helper test case for the t_cleanup test program" } cleanup_skip_body() { touch $(atf_config_get tmpfile) atf_skip "On purpose" } cleanup_skip_cleanup() { if [ $(atf_config_get cleanup no) = yes ]; then rm $(atf_config_get tmpfile) fi } atf_test_case cleanup_curdir cleanup cleanup_curdir_head() { atf_set "descr" "Helper test case for the t_cleanup test program" } cleanup_curdir_body() { echo 1234 >oldvalue } cleanup_curdir_cleanup() { test -f oldvalue && echo "Old value: $(cat oldvalue)" } atf_test_case cleanup_sigterm cleanup cleanup_sigterm_head() { atf_set "descr" "Helper test case for the t_cleanup test program" } cleanup_sigterm_body() { touch $(atf_config_get tmpfile) kill $$ touch $(atf_config_get tmpfile).no } cleanup_sigterm_cleanup() { rm $(atf_config_get tmpfile) } # ------------------------------------------------------------------------- # Helper tests for "t_config". # ------------------------------------------------------------------------- atf_test_case config_unset config_unset_head() { atf_set "descr" "Helper test case for the t_config test program" } config_unset_body() { if atf_config_has 'test'; then atf_fail "Test variable already defined" fi } atf_test_case config_empty config_empty_head() { atf_set "descr" "Helper test case for the t_config test program" } config_empty_body() { atf_check_equal "$(atf_config_get 'test')" "" } atf_test_case config_value config_value_head() { atf_set "descr" "Helper test case for the t_config test program" } config_value_body() { atf_check_equal "$(atf_config_get 'test')" "foo" } atf_test_case config_multi_value config_multi_value_head() { atf_set "descr" "Helper test case for the t_config test program" } config_multi_value_body() { atf_check_equal "$(atf_config_get 'test')" "foo bar" } # ------------------------------------------------------------------------- # Helper tests for "t_expect". # ------------------------------------------------------------------------- atf_test_case expect_pass_and_pass expect_pass_and_pass_body() { atf_expect_pass } atf_test_case expect_pass_but_fail_requirement expect_pass_but_fail_requirement_body() { atf_expect_pass atf_fail "Some reason" } atf_test_case expect_pass_but_fail_check expect_pass_but_fail_check_body() { atf_fail "Non-fatal failures not implemented" } atf_test_case expect_fail_and_fail_requirement expect_fail_and_fail_requirement_body() { atf_expect_fail "Fail reason" atf_fail "The failure" atf_expect_pass } atf_test_case expect_fail_and_fail_check expect_fail_and_fail_check_body() { atf_fail "Non-fatal failures not implemented" } atf_test_case expect_fail_but_pass expect_fail_but_pass_body() { atf_expect_fail "Fail first" atf_expect_pass } atf_test_case expect_exit_any_and_exit expect_exit_any_and_exit_body() { atf_expect_exit -1 "Call will exit" exit 0 } atf_test_case expect_exit_code_and_exit expect_exit_code_and_exit_body() { atf_expect_exit 123 "Call will exit" exit 123 } atf_test_case expect_exit_but_pass expect_exit_but_pass_body() { atf_expect_exit -1 "Call won't exit" } atf_test_case expect_signal_any_and_signal expect_signal_any_and_signal_body() { atf_expect_signal -1 "Call will signal" kill -9 $$ } atf_test_case expect_signal_no_and_signal expect_signal_no_and_signal_body() { atf_expect_signal 1 "Call will signal" kill -1 $$ } atf_test_case expect_signal_but_pass expect_signal_but_pass_body() { atf_expect_signal -1 "Call won't signal" } atf_test_case expect_death_and_exit expect_death_and_exit_body() { atf_expect_death "Exit case" exit 123 } atf_test_case expect_death_and_signal expect_death_and_signal_body() { atf_expect_death "Signal case" kill -9 $$ } atf_test_case expect_death_but_pass expect_death_but_pass_body() { atf_expect_death "Call won't die" } atf_test_case expect_timeout_and_hang expect_timeout_and_hang_head() { atf_set "timeout" "1" } expect_timeout_and_hang_body() { atf_expect_timeout "Will overrun" sleep 5 } atf_test_case expect_timeout_but_pass expect_timeout_but_pass_head() { atf_set "timeout" "1" } expect_timeout_but_pass_body() { atf_expect_timeout "Will just exit" } # ------------------------------------------------------------------------- # Helper tests for "t_meta_data". # ------------------------------------------------------------------------- atf_test_case metadata_no_descr metadata_no_descr_head() { : } metadata_no_descr_body() { : } atf_test_case metadata_no_head metadata_no_head_body() { : } # ------------------------------------------------------------------------- # Helper tests for "t_srcdir". # ------------------------------------------------------------------------- atf_test_case srcdir_exists srcdir_exists_head() { atf_set "descr" "Helper test case for the t_srcdir test program" } srcdir_exists_body() { [ -f "$(atf_get_srcdir)/datafile" ] || atf_fail "Cannot find datafile" } # ------------------------------------------------------------------------- # Helper tests for "t_result". # ------------------------------------------------------------------------- atf_test_case result_pass result_pass_body() { echo "msg" } atf_test_case result_fail result_fail_body() { echo "msg" atf_fail "Failure reason" } atf_test_case result_skip result_skip_body() { echo "msg" atf_skip "Skipped reason" } # ------------------------------------------------------------------------- # Main. # ------------------------------------------------------------------------- atf_init_test_cases() { # Add helper tests for t_cleanup. atf_add_test_case cleanup_pass atf_add_test_case cleanup_fail atf_add_test_case cleanup_skip atf_add_test_case cleanup_curdir atf_add_test_case cleanup_sigterm # Add helper tests for t_config. atf_add_test_case config_unset atf_add_test_case config_empty atf_add_test_case config_value atf_add_test_case config_multi_value # Add helper tests for t_expect. atf_add_test_case expect_pass_and_pass atf_add_test_case expect_pass_but_fail_requirement atf_add_test_case expect_pass_but_fail_check atf_add_test_case expect_fail_and_fail_requirement atf_add_test_case expect_fail_and_fail_check atf_add_test_case expect_fail_but_pass atf_add_test_case expect_exit_any_and_exit atf_add_test_case expect_exit_code_and_exit atf_add_test_case expect_exit_but_pass atf_add_test_case expect_signal_any_and_signal atf_add_test_case expect_signal_no_and_signal atf_add_test_case expect_signal_but_pass atf_add_test_case expect_death_and_exit atf_add_test_case expect_death_and_signal atf_add_test_case expect_death_but_pass atf_add_test_case expect_timeout_and_hang atf_add_test_case expect_timeout_but_pass # Add helper tests for t_meta_data. atf_add_test_case metadata_no_descr atf_add_test_case metadata_no_head # Add helper tests for t_srcdir. atf_add_test_case srcdir_exists # Add helper tests for t_result. atf_add_test_case result_pass atf_add_test_case result_fail atf_add_test_case result_skip } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/result_test.sh0000644000470500017500000001120212271526120023066 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case atf_run_warnings atf_run_warnings_head() { # The fact that this test case is in this test program is an abuse. atf_set "descr" "Tests that the test case prints a warning because" \ "it is not being run by atf-run" } atf_run_warnings_body() { unset __RUNNING_INSIDE_ATF_RUN srcdir="$(atf_get_srcdir)" for h in $(get_helpers); do atf_check -s eq:0 -o match:"passed" -e match:"WARNING.*atf-run" \ "${h}" -s "${srcdir}" result_pass done } atf_test_case result_on_stdout result_on_stdout_head() { atf_set "descr" "Tests that the test case result is printed on stdout" \ "by default" } result_on_stdout_body() { srcdir="$(atf_get_srcdir)" for h in $(get_helpers); do atf_check -s eq:0 -o match:"passed" -o match:"msg" \ -e ignore "${h}" -s "${srcdir}" result_pass atf_check -s eq:1 -o match:"failed: Failure reason" -o match:"msg" \ -e ignore "${h}" -s "${srcdir}" result_fail atf_check -s eq:0 -o match:"skipped: Skipped reason" -o match:"msg" \ -e ignore "${h}" -s "${srcdir}" result_skip done } atf_test_case result_to_file result_to_file_head() { atf_set "descr" "Tests that the test case result is sent to a file if -r" \ "is used" } result_to_file_body() { srcdir="$(atf_get_srcdir)" for h in $(get_helpers); do atf_check -s eq:0 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ -r resfile result_pass atf_check -o inline:"passed\n" cat resfile atf_check -s eq:1 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ -r resfile result_fail atf_check -o inline:"failed: Failure reason\n" cat resfile atf_check -s eq:0 -o inline:"msg\n" -e ignore "${h}" -s "${srcdir}" \ -r resfile result_skip atf_check -o inline:"skipped: Skipped reason\n" cat resfile done } atf_test_case result_to_file_fail result_to_file_fail_head() { atf_set "descr" "Tests controlled failure if the test program fails to" \ "create the results file" atf_set "require.user" "unprivileged" } result_to_file_fail_body() { mkdir dir chmod 444 dir srcdir="$(atf_get_srcdir)" for h in $(get_helpers c_helpers cpp_helpers); do atf_check -s signal -o ignore \ -e match:"FATAL ERROR: Cannot create.*'dir/resfile'" \ "${h}" -s "${srcdir}" -r dir/resfile result_pass done for h in $(get_helpers sh_helpers); do atf_check -s exit -o ignore \ -e match:"ERROR: Cannot create.*'dir/resfile'" \ "${h}" -s "${srcdir}" -r dir/resfile result_pass done } atf_test_case result_exception result_exception_head() { atf_set "descr" "Tests that an unhandled exception is correctly captured" } result_exception_body() { for h in $(get_helpers cpp_helpers); do atf_check -s exit:1 -o match:'failed: .*This is unhandled' \ "${h}" -s "${srcdir}" result_exception done } atf_init_test_cases() { atf_add_test_case atf_run_warnings atf_add_test_case result_on_stdout atf_add_test_case result_to_file atf_add_test_case result_to_file_fail atf_add_test_case result_exception } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/c_helpers.c0000644000470500017500000003267612271526120022307 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "atf-c/error.h" #include "atf-c/detail/env.h" #include "atf-c/detail/fs.h" #include "atf-c/detail/test_helpers.h" #include "atf-c/detail/text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void safe_remove(const char* path) { if (unlink(path) == -1) atf_tc_fail("unlink(2) of %s failed", path); } static void touch(const char *path) { int fd; fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0644); if (fd == -1) atf_tc_fail("Could not create file %s", path); close(fd); } /* --------------------------------------------------------------------- * Helper tests for "t_cleanup". * --------------------------------------------------------------------- */ ATF_TC_WITH_CLEANUP(cleanup_pass); ATF_TC_HEAD(cleanup_pass, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " "program"); } ATF_TC_BODY(cleanup_pass, tc) { touch(atf_tc_get_config_var(tc, "tmpfile")); } ATF_TC_CLEANUP(cleanup_pass, tc) { if (atf_tc_get_config_var_as_bool(tc, "cleanup")) safe_remove(atf_tc_get_config_var(tc, "tmpfile")); } ATF_TC_WITH_CLEANUP(cleanup_fail); ATF_TC_HEAD(cleanup_fail, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " "program"); } ATF_TC_BODY(cleanup_fail, tc) { touch(atf_tc_get_config_var(tc, "tmpfile")); atf_tc_fail("On purpose"); } ATF_TC_CLEANUP(cleanup_fail, tc) { if (atf_tc_get_config_var_as_bool(tc, "cleanup")) safe_remove(atf_tc_get_config_var(tc, "tmpfile")); } ATF_TC_WITH_CLEANUP(cleanup_skip); ATF_TC_HEAD(cleanup_skip, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " "program"); } ATF_TC_BODY(cleanup_skip, tc) { touch(atf_tc_get_config_var(tc, "tmpfile")); atf_tc_skip("On purpose"); } ATF_TC_CLEANUP(cleanup_skip, tc) { if (atf_tc_get_config_var_as_bool(tc, "cleanup")) safe_remove(atf_tc_get_config_var(tc, "tmpfile")); } ATF_TC_WITH_CLEANUP(cleanup_curdir); ATF_TC_HEAD(cleanup_curdir, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " "program"); } ATF_TC_BODY(cleanup_curdir, tc) { FILE *f; f = fopen("oldvalue", "w"); if (f == NULL) atf_tc_fail("Failed to create oldvalue file"); fprintf(f, "1234"); fclose(f); } ATF_TC_CLEANUP(cleanup_curdir, tc) { FILE *f; f = fopen("oldvalue", "r"); if (f != NULL) { int i; if (fscanf(f, "%d", &i) != 1) fprintf(stderr, "Failed to read old value\n"); else printf("Old value: %d", i); fclose(f); } } ATF_TC_WITH_CLEANUP(cleanup_sigterm); ATF_TC_HEAD(cleanup_sigterm, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_cleanup test " "program"); } ATF_TC_BODY(cleanup_sigterm, tc) { char *nofile; touch(atf_tc_get_config_var(tc, "tmpfile")); kill(getpid(), SIGTERM); RE(atf_text_format(&nofile, "%s.no", atf_tc_get_config_var(tc, "tmpfile"))); touch(nofile); free(nofile); } ATF_TC_CLEANUP(cleanup_sigterm, tc) { safe_remove(atf_tc_get_config_var(tc, "tmpfile")); } /* --------------------------------------------------------------------- * Helper tests for "t_config". * --------------------------------------------------------------------- */ ATF_TC(config_unset); ATF_TC_HEAD(config_unset, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " "program"); } ATF_TC_BODY(config_unset, tc) { ATF_REQUIRE(!atf_tc_has_config_var(tc, "test")); } ATF_TC(config_empty); ATF_TC_HEAD(config_empty, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " "program"); } ATF_TC_BODY(config_empty, tc) { ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); ATF_REQUIRE(strlen(atf_tc_get_config_var(tc, "test")) == 0); } ATF_TC(config_value); ATF_TC_HEAD(config_value, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " "program"); } ATF_TC_BODY(config_value, tc) { ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo") == 0); } ATF_TC(config_multi_value); ATF_TC_HEAD(config_multi_value, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_config test " "program"); } ATF_TC_BODY(config_multi_value, tc) { ATF_REQUIRE(atf_tc_has_config_var(tc, "test")); ATF_REQUIRE(strcmp(atf_tc_get_config_var(tc, "test"), "foo bar") == 0); } /* --------------------------------------------------------------------- * Helper tests for "t_expect". * --------------------------------------------------------------------- */ ATF_TC_WITHOUT_HEAD(expect_pass_and_pass); ATF_TC_BODY(expect_pass_and_pass, tc) { atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_requirement); ATF_TC_BODY(expect_pass_but_fail_requirement, tc) { atf_tc_expect_pass(); atf_tc_fail("Some reason"); } ATF_TC_WITHOUT_HEAD(expect_pass_but_fail_check); ATF_TC_BODY(expect_pass_but_fail_check, tc) { atf_tc_expect_pass(); atf_tc_fail_nonfatal("Some reason"); } ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_requirement); ATF_TC_BODY(expect_fail_and_fail_requirement, tc) { atf_tc_expect_fail("Fail %s", "reason"); atf_tc_fail("The failure"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(expect_fail_and_fail_check); ATF_TC_BODY(expect_fail_and_fail_check, tc) { atf_tc_expect_fail("Fail first"); atf_tc_fail_nonfatal("abc"); atf_tc_expect_pass(); atf_tc_expect_fail("And fail again"); atf_tc_fail_nonfatal("def"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(expect_fail_but_pass); ATF_TC_BODY(expect_fail_but_pass, tc) { atf_tc_expect_fail("Fail first"); atf_tc_fail_nonfatal("abc"); atf_tc_expect_pass(); atf_tc_expect_fail("Will not fail"); atf_tc_expect_pass(); atf_tc_expect_fail("And fail again"); atf_tc_fail_nonfatal("def"); atf_tc_expect_pass(); } ATF_TC_WITHOUT_HEAD(expect_exit_any_and_exit); ATF_TC_BODY(expect_exit_any_and_exit, tc) { atf_tc_expect_exit(-1, "Call will exit"); exit(EXIT_SUCCESS); } ATF_TC_WITHOUT_HEAD(expect_exit_code_and_exit); ATF_TC_BODY(expect_exit_code_and_exit, tc) { atf_tc_expect_exit(123, "Call will exit"); exit(123); } ATF_TC_WITHOUT_HEAD(expect_exit_but_pass); ATF_TC_BODY(expect_exit_but_pass, tc) { atf_tc_expect_exit(-1, "Call won't exit"); } ATF_TC_WITHOUT_HEAD(expect_signal_any_and_signal); ATF_TC_BODY(expect_signal_any_and_signal, tc) { atf_tc_expect_signal(-1, "Call will signal"); kill(getpid(), SIGKILL); } ATF_TC_WITHOUT_HEAD(expect_signal_no_and_signal); ATF_TC_BODY(expect_signal_no_and_signal, tc) { atf_tc_expect_signal(SIGHUP, "Call will signal"); kill(getpid(), SIGHUP); } ATF_TC_WITHOUT_HEAD(expect_signal_but_pass); ATF_TC_BODY(expect_signal_but_pass, tc) { atf_tc_expect_signal(-1, "Call won't signal"); } ATF_TC_WITHOUT_HEAD(expect_death_and_exit); ATF_TC_BODY(expect_death_and_exit, tc) { atf_tc_expect_death("Exit case"); exit(123); } ATF_TC_WITHOUT_HEAD(expect_death_and_signal); ATF_TC_BODY(expect_death_and_signal, tc) { atf_tc_expect_death("Signal case"); kill(getpid(), SIGKILL); } ATF_TC_WITHOUT_HEAD(expect_death_but_pass); ATF_TC_BODY(expect_death_but_pass, tc) { atf_tc_expect_death("Call won't die"); } ATF_TC(expect_timeout_and_hang); ATF_TC_HEAD(expect_timeout_and_hang, tc) { atf_tc_set_md_var(tc, "timeout", "1"); } ATF_TC_BODY(expect_timeout_and_hang, tc) { atf_tc_expect_timeout("Will overrun"); sleep(5); } ATF_TC(expect_timeout_but_pass); ATF_TC_HEAD(expect_timeout_but_pass, tc) { atf_tc_set_md_var(tc, "timeout", "1"); } ATF_TC_BODY(expect_timeout_but_pass, tc) { atf_tc_expect_timeout("Will just exit"); } /* --------------------------------------------------------------------- * Helper tests for "t_meta_data". * --------------------------------------------------------------------- */ ATF_TC_WITHOUT_HEAD(metadata_no_descr); ATF_TC_BODY(metadata_no_descr, tc) { } ATF_TC_WITHOUT_HEAD(metadata_no_head); ATF_TC_BODY(metadata_no_head, tc) { } /* --------------------------------------------------------------------- * Helper tests for "t_srcdir". * --------------------------------------------------------------------- */ ATF_TC(srcdir_exists); ATF_TC_HEAD(srcdir_exists, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_srcdir test " "program"); } ATF_TC_BODY(srcdir_exists, tc) { atf_fs_path_t p; bool b; RE(atf_fs_path_init_fmt(&p, "%s/datafile", atf_tc_get_config_var(tc, "srcdir"))); RE(atf_fs_exists(&p, &b)); atf_fs_path_fini(&p); if (!b) atf_tc_fail("Cannot find datafile"); } /* --------------------------------------------------------------------- * Helper tests for "t_result". * --------------------------------------------------------------------- */ ATF_TC_WITHOUT_HEAD(result_pass); ATF_TC_BODY(result_pass, tc) { printf("msg\n"); } ATF_TC_WITHOUT_HEAD(result_fail); ATF_TC_BODY(result_fail, tc) { printf("msg\n"); atf_tc_fail("Failure reason"); } ATF_TC_WITHOUT_HEAD(result_skip); ATF_TC_BODY(result_skip, tc) { printf("msg\n"); atf_tc_skip("Skipped reason"); } ATF_TC(result_newlines_fail); ATF_TC_HEAD(result_newlines_fail, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " "program"); } ATF_TC_BODY(result_newlines_fail, tc) { atf_tc_fail("First line\nSecond line"); } ATF_TC(result_newlines_skip); ATF_TC_HEAD(result_newlines_skip, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for the t_result test " "program"); } ATF_TC_BODY(result_newlines_skip, tc) { atf_tc_skip("First line\nSecond line"); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add helper tests for t_cleanup. */ ATF_TP_ADD_TC(tp, cleanup_pass); ATF_TP_ADD_TC(tp, cleanup_fail); ATF_TP_ADD_TC(tp, cleanup_skip); ATF_TP_ADD_TC(tp, cleanup_curdir); ATF_TP_ADD_TC(tp, cleanup_sigterm); /* Add helper tests for t_config. */ ATF_TP_ADD_TC(tp, config_unset); ATF_TP_ADD_TC(tp, config_empty); ATF_TP_ADD_TC(tp, config_value); ATF_TP_ADD_TC(tp, config_multi_value); /* Add helper tests for t_expect. */ ATF_TP_ADD_TC(tp, expect_pass_and_pass); ATF_TP_ADD_TC(tp, expect_pass_but_fail_requirement); ATF_TP_ADD_TC(tp, expect_pass_but_fail_check); ATF_TP_ADD_TC(tp, expect_fail_and_fail_requirement); ATF_TP_ADD_TC(tp, expect_fail_and_fail_check); ATF_TP_ADD_TC(tp, expect_fail_but_pass); ATF_TP_ADD_TC(tp, expect_exit_any_and_exit); ATF_TP_ADD_TC(tp, expect_exit_code_and_exit); ATF_TP_ADD_TC(tp, expect_exit_but_pass); ATF_TP_ADD_TC(tp, expect_signal_any_and_signal); ATF_TP_ADD_TC(tp, expect_signal_no_and_signal); ATF_TP_ADD_TC(tp, expect_signal_but_pass); ATF_TP_ADD_TC(tp, expect_death_and_exit); ATF_TP_ADD_TC(tp, expect_death_and_signal); ATF_TP_ADD_TC(tp, expect_death_but_pass); ATF_TP_ADD_TC(tp, expect_timeout_and_hang); ATF_TP_ADD_TC(tp, expect_timeout_but_pass); /* Add helper tests for t_meta_data. */ ATF_TP_ADD_TC(tp, metadata_no_descr); ATF_TP_ADD_TC(tp, metadata_no_head); /* Add helper tests for t_srcdir. */ ATF_TP_ADD_TC(tp, srcdir_exists); /* Add helper tests for t_result. */ ATF_TP_ADD_TC(tp, result_pass); ATF_TP_ADD_TC(tp, result_fail); ATF_TP_ADD_TC(tp, result_skip); ATF_TP_ADD_TC(tp, result_newlines_fail); ATF_TP_ADD_TC(tp, result_newlines_skip); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/test-programs/Atffile0000644000470500017500000000024112271526120021453 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: config_test tp: expect_test tp: meta_data_test tp: srcdir_test tp: result_test bind9-9.9.5.dfsg/unit/atf-src/test-programs/srcdir_test.sh0000644000470500017500000001120412271526120023040 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # create_files() { mkdir tmp touch tmp/datafile } atf_test_case default default_head() { atf_set "descr" "Checks that the program can find its files if" \ "executed from the same directory" } default_body() { create_files for hp in $(get_helpers); do h=${hp##*/} cp ${hp} tmp atf_check -s eq:0 -o ignore -e ignore -x \ "cd tmp && ./${h} srcdir_exists" atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res done } atf_test_case libtool libtool_head() { atf_set "descr" "Checks that the program can find its files if" \ "executed from the source directory and if it" \ "was built with libtool" } libtool_body() { create_files mkdir tmp/.libs for hp in $(get_helpers c_helpers cpp_helpers); do h=${hp##*/} cp ${hp} tmp cp ${hp} tmp/.libs atf_check -s eq:0 -o ignore -e ignore -x \ "cd tmp && ./.libs/${h} srcdir_exists" atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res done for hp in $(get_helpers c_helpers cpp_helpers); do h=${hp##*/} cp ${hp} tmp cp ${hp} tmp/.libs/lt-${h} atf_check -s eq:0 -o ignore -e ignore -x \ "cd tmp && ./.libs/lt-${h} srcdir_exists" atf_check -s eq:1 -o empty -e ignore "${hp}" -r res srcdir_exists atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res done } atf_test_case sflag sflag_head() { atf_set "descr" "Checks that the program can find its files when" \ "using the -s flag" } sflag_body() { create_files for hp in $(get_helpers); do h=${hp##*/} cp ${hp} tmp atf_check -s eq:0 -o ignore -e ignore -x \ "cd tmp && ./${h} -s $(pwd)/tmp \ srcdir_exists" atf_check -s eq:1 -o empty -e save:stderr "${hp}" -r res srcdir_exists atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res atf_check -s eq:0 -o ignore -e ignore \ "${hp}" -s "$(pwd)"/tmp srcdir_exists done } atf_test_case relative relative_head() { atf_set "descr" "Checks that passing a relative path through -s" \ "works" } relative_body() { create_files for hp in $(get_helpers); do h=${hp##*/} cp ${hp} tmp for p in tmp tmp/. ./tmp; do echo "Helper is: ${h}" echo "Using source directory: ${p}" atf_check -s eq:0 -o ignore -e ignore \ "./tmp/${h}" -s "${p}" srcdir_exists atf_check -s eq:1 -o empty -e save:stderr "${hp}" -r res \ srcdir_exists atf_check -s eq:0 -o ignore -e empty grep "Cannot find datafile" res atf_check -s eq:0 -o ignore -e ignore \ "${hp}" -s "${p}" srcdir_exists done done } atf_init_test_cases() { atf_add_test_case default atf_add_test_case libtool atf_add_test_case sflag atf_add_test_case relative } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/Makefile.am.inc0000644000470500017500000001031412271526120022764 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # tests_test_programs_DATA = test-programs/Atffile \ test-programs/Kyuafile tests_test_programsdir = $(pkgtestsdir)/test-programs EXTRA_DIST += $(tests_test_programs_DATA) tests_test_programs_PROGRAMS = test-programs/c_helpers test_programs_c_helpers_SOURCES = test-programs/c_helpers.c test_programs_c_helpers_LDADD = libatf-c.la tests_test_programs_PROGRAMS += test-programs/cpp_helpers test_programs_cpp_helpers_SOURCES = test-programs/cpp_helpers.cpp test_programs_cpp_helpers_LDADD = $(ATF_CXX_LIBS) common_sh = $(srcdir)/test-programs/common.sh EXTRA_DIST += test-programs/common.sh tests_test_programs_SCRIPTS = test-programs/sh_helpers CLEANFILES += test-programs/sh_helpers EXTRA_DIST += test-programs/sh_helpers.sh test-programs/sh_helpers: $(srcdir)/test-programs/sh_helpers.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/sh_helpers.sh $(common_sh)"; \ dst="test-programs/sh_helpers"; $(BUILD_SH_TP) tests_test_programs_SCRIPTS += test-programs/config_test CLEANFILES += test-programs/config_test EXTRA_DIST += test-programs/config_test.sh test-programs/config_test: $(srcdir)/test-programs/config_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/config_test.sh $(common_sh)"; \ dst="test-programs/config_test"; $(BUILD_SH_TP) tests_test_programs_SCRIPTS += test-programs/expect_test CLEANFILES += test-programs/expect_test EXTRA_DIST += test-programs/expect_test.sh test-programs/expect_test: $(srcdir)/test-programs/expect_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/expect_test.sh $(common_sh)"; \ dst="test-programs/expect_test"; $(BUILD_SH_TP) tests_test_programs_SCRIPTS += test-programs/meta_data_test CLEANFILES += test-programs/meta_data_test EXTRA_DIST += test-programs/meta_data_test.sh test-programs/meta_data_test: $(srcdir)/test-programs/meta_data_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/meta_data_test.sh $(common_sh)"; \ dst="test-programs/meta_data_test"; $(BUILD_SH_TP) tests_test_programs_SCRIPTS += test-programs/result_test CLEANFILES += test-programs/result_test EXTRA_DIST += test-programs/result_test.sh test-programs/result_test: $(srcdir)/test-programs/result_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/result_test.sh $(common_sh)"; \ dst="test-programs/result_test"; $(BUILD_SH_TP) tests_test_programs_SCRIPTS += test-programs/srcdir_test CLEANFILES += test-programs/srcdir_test EXTRA_DIST += test-programs/srcdir_test.sh test-programs/srcdir_test: $(srcdir)/test-programs/srcdir_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/srcdir_test.sh $(common_sh)"; \ dst="test-programs/srcdir_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/test-programs/cpp_helpers.cpp0000644000470500017500000002347512271526120023204 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // extern "C" { #include #include } #include #include #include #include #include "atf-c++/detail/fs.hpp" // ------------------------------------------------------------------------ // Helper tests for "t_config". // ------------------------------------------------------------------------ ATF_TEST_CASE(config_unset); ATF_TEST_CASE_HEAD(config_unset) { set_md_var("descr", "Helper test case for the t_config test program"); } ATF_TEST_CASE_BODY(config_unset) { ATF_REQUIRE(!has_config_var("test")); } ATF_TEST_CASE(config_empty); ATF_TEST_CASE_HEAD(config_empty) { set_md_var("descr", "Helper test case for the t_config test program"); } ATF_TEST_CASE_BODY(config_empty) { ATF_REQUIRE_EQ(get_config_var("test"), ""); } ATF_TEST_CASE(config_value); ATF_TEST_CASE_HEAD(config_value) { set_md_var("descr", "Helper test case for the t_config test program"); } ATF_TEST_CASE_BODY(config_value) { ATF_REQUIRE_EQ(get_config_var("test"), "foo"); } ATF_TEST_CASE(config_multi_value); ATF_TEST_CASE_HEAD(config_multi_value) { set_md_var("descr", "Helper test case for the t_config test program"); } ATF_TEST_CASE_BODY(config_multi_value) { ATF_REQUIRE_EQ(get_config_var("test"), "foo bar"); } // ------------------------------------------------------------------------ // Helper tests for "t_expect". // ------------------------------------------------------------------------ ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_and_pass); ATF_TEST_CASE_BODY(expect_pass_and_pass) { expect_pass(); } ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_but_fail_requirement); ATF_TEST_CASE_BODY(expect_pass_but_fail_requirement) { expect_pass(); fail("Some reason"); } ATF_TEST_CASE_WITHOUT_HEAD(expect_pass_but_fail_check); ATF_TEST_CASE_BODY(expect_pass_but_fail_check) { expect_pass(); fail_nonfatal("Some reason"); } ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_and_fail_requirement); ATF_TEST_CASE_BODY(expect_fail_and_fail_requirement) { expect_fail("Fail reason"); fail("The failure"); expect_pass(); } ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_and_fail_check); ATF_TEST_CASE_BODY(expect_fail_and_fail_check) { expect_fail("Fail first"); fail_nonfatal("abc"); expect_pass(); expect_fail("And fail again"); fail_nonfatal("def"); expect_pass(); } ATF_TEST_CASE_WITHOUT_HEAD(expect_fail_but_pass); ATF_TEST_CASE_BODY(expect_fail_but_pass) { expect_fail("Fail first"); fail_nonfatal("abc"); expect_pass(); expect_fail("Will not fail"); expect_pass(); expect_fail("And fail again"); fail_nonfatal("def"); expect_pass(); } ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_any_and_exit); ATF_TEST_CASE_BODY(expect_exit_any_and_exit) { expect_exit(-1, "Call will exit"); std::exit(EXIT_SUCCESS); } ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_code_and_exit); ATF_TEST_CASE_BODY(expect_exit_code_and_exit) { expect_exit(123, "Call will exit"); std::exit(123); } ATF_TEST_CASE_WITHOUT_HEAD(expect_exit_but_pass); ATF_TEST_CASE_BODY(expect_exit_but_pass) { expect_exit(-1, "Call won't exit"); } ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_any_and_signal); ATF_TEST_CASE_BODY(expect_signal_any_and_signal) { expect_signal(-1, "Call will signal"); ::kill(getpid(), SIGKILL); } ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_no_and_signal); ATF_TEST_CASE_BODY(expect_signal_no_and_signal) { expect_signal(SIGHUP, "Call will signal"); ::kill(getpid(), SIGHUP); } ATF_TEST_CASE_WITHOUT_HEAD(expect_signal_but_pass); ATF_TEST_CASE_BODY(expect_signal_but_pass) { expect_signal(-1, "Call won't signal"); } ATF_TEST_CASE_WITHOUT_HEAD(expect_death_and_exit); ATF_TEST_CASE_BODY(expect_death_and_exit) { expect_death("Exit case"); std::exit(123); } ATF_TEST_CASE_WITHOUT_HEAD(expect_death_and_signal); ATF_TEST_CASE_BODY(expect_death_and_signal) { expect_death("Signal case"); kill(getpid(), SIGKILL); } ATF_TEST_CASE_WITHOUT_HEAD(expect_death_but_pass); ATF_TEST_CASE_BODY(expect_death_but_pass) { expect_death("Call won't die"); } ATF_TEST_CASE(expect_timeout_and_hang); ATF_TEST_CASE_HEAD(expect_timeout_and_hang) { set_md_var("timeout", "1"); } ATF_TEST_CASE_BODY(expect_timeout_and_hang) { expect_timeout("Will overrun"); ::sleep(5); } ATF_TEST_CASE(expect_timeout_but_pass); ATF_TEST_CASE_HEAD(expect_timeout_but_pass) { set_md_var("timeout", "1"); } ATF_TEST_CASE_BODY(expect_timeout_but_pass) { expect_timeout("Will just exit"); } // ------------------------------------------------------------------------ // Helper tests for "t_meta_data". // ------------------------------------------------------------------------ ATF_TEST_CASE(metadata_no_descr); ATF_TEST_CASE_HEAD(metadata_no_descr) { } ATF_TEST_CASE_BODY(metadata_no_descr) { } ATF_TEST_CASE_WITHOUT_HEAD(metadata_no_head); ATF_TEST_CASE_BODY(metadata_no_head) { } // ------------------------------------------------------------------------ // Helper tests for "t_srcdir". // ------------------------------------------------------------------------ ATF_TEST_CASE(srcdir_exists); ATF_TEST_CASE_HEAD(srcdir_exists) { set_md_var("descr", "Helper test case for the t_srcdir test program"); } ATF_TEST_CASE_BODY(srcdir_exists) { if (!atf::fs::exists(atf::fs::path(get_config_var("srcdir")) / "datafile")) ATF_FAIL("Cannot find datafile"); } // ------------------------------------------------------------------------ // Helper tests for "t_result". // ------------------------------------------------------------------------ ATF_TEST_CASE(result_pass); ATF_TEST_CASE_HEAD(result_pass) { } ATF_TEST_CASE_BODY(result_pass) { std::cout << "msg\n"; } ATF_TEST_CASE(result_fail); ATF_TEST_CASE_HEAD(result_fail) { } ATF_TEST_CASE_BODY(result_fail) { std::cout << "msg\n"; ATF_FAIL("Failure reason"); } ATF_TEST_CASE(result_skip); ATF_TEST_CASE_HEAD(result_skip) { } ATF_TEST_CASE_BODY(result_skip) { std::cout << "msg\n"; ATF_SKIP("Skipped reason"); } ATF_TEST_CASE(result_newlines_fail); ATF_TEST_CASE_HEAD(result_newlines_fail) { set_md_var("descr", "Helper test case for the t_result test program"); } ATF_TEST_CASE_BODY(result_newlines_fail) { ATF_FAIL("First line\nSecond line"); } ATF_TEST_CASE(result_newlines_skip); ATF_TEST_CASE_HEAD(result_newlines_skip) { set_md_var("descr", "Helper test case for the t_result test program"); } ATF_TEST_CASE_BODY(result_newlines_skip) { ATF_SKIP("First line\nSecond line"); } ATF_TEST_CASE(result_exception); ATF_TEST_CASE_HEAD(result_exception) { } ATF_TEST_CASE_BODY(result_exception) { throw std::runtime_error("This is unhandled"); } // ------------------------------------------------------------------------ // Main. // ------------------------------------------------------------------------ ATF_INIT_TEST_CASES(tcs) { // Add helper tests for t_config. ATF_ADD_TEST_CASE(tcs, config_unset); ATF_ADD_TEST_CASE(tcs, config_empty); ATF_ADD_TEST_CASE(tcs, config_value); ATF_ADD_TEST_CASE(tcs, config_multi_value); // Add helper tests for t_expect. ATF_ADD_TEST_CASE(tcs, expect_pass_and_pass); ATF_ADD_TEST_CASE(tcs, expect_pass_but_fail_requirement); ATF_ADD_TEST_CASE(tcs, expect_pass_but_fail_check); ATF_ADD_TEST_CASE(tcs, expect_fail_and_fail_requirement); ATF_ADD_TEST_CASE(tcs, expect_fail_and_fail_check); ATF_ADD_TEST_CASE(tcs, expect_fail_but_pass); ATF_ADD_TEST_CASE(tcs, expect_exit_any_and_exit); ATF_ADD_TEST_CASE(tcs, expect_exit_code_and_exit); ATF_ADD_TEST_CASE(tcs, expect_exit_but_pass); ATF_ADD_TEST_CASE(tcs, expect_signal_any_and_signal); ATF_ADD_TEST_CASE(tcs, expect_signal_no_and_signal); ATF_ADD_TEST_CASE(tcs, expect_signal_but_pass); ATF_ADD_TEST_CASE(tcs, expect_death_and_exit); ATF_ADD_TEST_CASE(tcs, expect_death_and_signal); ATF_ADD_TEST_CASE(tcs, expect_death_but_pass); ATF_ADD_TEST_CASE(tcs, expect_timeout_and_hang); ATF_ADD_TEST_CASE(tcs, expect_timeout_but_pass); // Add helper tests for t_meta_data. ATF_ADD_TEST_CASE(tcs, metadata_no_descr); ATF_ADD_TEST_CASE(tcs, metadata_no_head); // Add helper tests for t_srcdir. ATF_ADD_TEST_CASE(tcs, srcdir_exists); // Add helper tests for t_result. ATF_ADD_TEST_CASE(tcs, result_pass); ATF_ADD_TEST_CASE(tcs, result_fail); ATF_ADD_TEST_CASE(tcs, result_skip); ATF_ADD_TEST_CASE(tcs, result_newlines_fail); ATF_ADD_TEST_CASE(tcs, result_newlines_skip); ATF_ADD_TEST_CASE(tcs, result_exception); } bind9-9.9.5.dfsg/unit/atf-src/test-programs/config_test.sh0000644000470500017500000000467112271526120023031 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case vflag vflag_head() { atf_set "descr" "Tests that the -v flag works correctly to set" \ "configuration variables" } vflag_body() { for h in $(get_helpers); do atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ -r resfile config_unset atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ -r resfile -v 'test=' config_empty atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) \ -r resfile -v 'test=foo' config_value atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile atf_check -s eq:0 -o ignore -e ignore -x ${h} -s $(atf_get_srcdir) \ -r resfile -v \'test=foo bar\' config_multi_value atf_check -s eq:0 -o ignore -e empty grep 'passed' resfile done } atf_init_test_cases() { atf_add_test_case vflag } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/Kyuafile0000644000470500017500000000034612271526120021660 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="config_test"} atf_test_program{name="expect_test"} atf_test_program{name="meta_data_test"} atf_test_program{name="srcdir_test"} atf_test_program{name="result_test"} bind9-9.9.5.dfsg/unit/atf-src/test-programs/meta_data_test.sh0000644000470500017500000000431212271526120023473 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2010 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case no_descr no_descr_head() { atf_set "descr" "Tests that the description may not be present" } no_descr_body() { for h in $(get_helpers); do atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) -l atf_check -s eq:0 -o match:passed -e ignore ${h} -s $(atf_get_srcdir) \ metadata_no_descr done } atf_test_case no_head no_head_head() { atf_set "descr" "Tests that the head may not be present" } no_head_body() { for h in $(get_helpers); do atf_check -s eq:0 -o ignore -e ignore ${h} -s $(atf_get_srcdir) -l atf_check -s eq:0 -o match:passed -e ignore ${h} -s $(atf_get_srcdir) \ metadata_no_head done } atf_init_test_cases() { atf_add_test_case no_descr atf_add_test_case no_head } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/test-programs/common.sh0000644000470500017500000000317512271526120022013 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2008 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # get_helpers() { srcdir=$(atf_get_srcdir) if [ ${#} -eq 0 ]; then set -- c_helpers cpp_helpers sh_helpers fi for h_name in "${@}"; do echo ${srcdir}/${h_name} done } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/COPYING0000644000470500017500000001061512271526120016410 0ustar lamontlamontRedistribution terms Automated Testing Framework =========================================================================== License ******* Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 The NetBSD Foundation, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright 2011, 2012 Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Relicensed code *************** The following code snippets have been taken from other projects. Even though they were not originally licensed under the terms above, the original authors have agreed to relicense their work so that this project can be distributed under a single license. This section is put here just to clarify this fact. * configure.ac, Makefile.am: The original versions were derived from the ones in the XML Catalog Manager project, version 2.2. Author: Julio Merino * atf-c/ui.c: The format_paragraph and format_text functions were derived form the ones in the Monotone project, revision 3a0982da308228d796df35f98d787c5cff2bb5b6. Author: Julio Merino * atf-c++/detail/io.hpp, atf-c++/detail/io.cpp, atf-c++/detail/io_test.cpp: These files were derived from the file_handle, systembuf, pipe and pistream classes and tests found in the Boost.Process library. Author: Julio Merino * admin/check-style.sh, admin/check-style-common.awk, admin/check-style-cpp.awk, admin/check-style-shell.awk: These files, except the first one, were first implemented in the Buildtool project. They were later adapted to be part of Boost.Process and, during that process, the shell script was created. Author: Julio Merino =========================================================================== vim: filetype=text:textwidth=75:expandtab:shiftwidth=2:softtabstop=2 bind9-9.9.5.dfsg/unit/atf-src/Makefile.in0000644000470500017500000113160212271526120017423 0ustar lamontlamont# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = atf-sh/atf-sh$(EXEEXT) $(am__EXEEXT_1) libexec_PROGRAMS = atf-sh/atf-check$(EXEEXT) DIST_COMMON = README $(am__configure_deps) $(atf_c_HEADERS) \ $(atf_c___HEADERS) $(dist_man_MANS) $(include_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/admin/Makefile.am.inc \ $(srcdir)/atf-c++/Makefile.am.inc \ $(srcdir)/atf-c++/detail/Makefile.am.inc \ $(srcdir)/atf-c/Makefile.am.inc \ $(srcdir)/atf-c/detail/Makefile.am.inc \ $(srcdir)/atf-config/Makefile.am.inc \ $(srcdir)/atf-report/Makefile.am.inc \ $(srcdir)/atf-run/Makefile.am.inc \ $(srcdir)/atf-sh/Makefile.am.inc \ $(srcdir)/atf-version/Makefile.am.inc $(srcdir)/bconfig.h.in \ $(srcdir)/bootstrap/Makefile.am.inc \ $(srcdir)/doc/Makefile.am.inc \ $(srcdir)/test-programs/Makefile.am.inc \ $(top_srcdir)/admin/compile $(top_srcdir)/admin/config.guess \ $(top_srcdir)/admin/config.sub $(top_srcdir)/admin/depcomp \ $(top_srcdir)/admin/install-sh $(top_srcdir)/admin/ltmain.sh \ $(top_srcdir)/admin/missing $(top_srcdir)/atf-c/defs.h.in \ $(top_srcdir)/configure AUTHORS COPYING INSTALL NEWS TODO \ admin/compile admin/config.guess admin/config.sub \ admin/depcomp admin/install-sh admin/ltmain.sh admin/missing tests_atf_c_PROGRAMS = atf-c/atf_c_test$(EXEEXT) \ atf-c/build_test$(EXEEXT) atf-c/check_test$(EXEEXT) \ atf-c/config_test$(EXEEXT) atf-c/error_test$(EXEEXT) \ atf-c/macros_test$(EXEEXT) atf-c/tc_test$(EXEEXT) \ atf-c/tp_test$(EXEEXT) atf-c/utils_test$(EXEEXT) tests_atf_c_detail_PROGRAMS = atf-c/detail/dynstr_test$(EXEEXT) \ atf-c/detail/env_test$(EXEEXT) atf-c/detail/fs_test$(EXEEXT) \ atf-c/detail/list_test$(EXEEXT) atf-c/detail/map_test$(EXEEXT) \ atf-c/detail/process_helpers$(EXEEXT) \ atf-c/detail/process_test$(EXEEXT) \ atf-c/detail/sanity_test$(EXEEXT) \ atf-c/detail/text_test$(EXEEXT) \ atf-c/detail/user_test$(EXEEXT) tests_atf_c___PROGRAMS = atf-c++/atf_c++_test$(EXEEXT) \ atf-c++/build_test$(EXEEXT) atf-c++/check_test$(EXEEXT) \ atf-c++/config_test$(EXEEXT) atf-c++/macros_test$(EXEEXT) \ atf-c++/tests_test$(EXEEXT) atf-c++/utils_test$(EXEEXT) tests_atf_c___detail_PROGRAMS = \ atf-c++/detail/application_test$(EXEEXT) \ atf-c++/detail/auto_array_test$(EXEEXT) \ atf-c++/detail/env_test$(EXEEXT) \ atf-c++/detail/exceptions_test$(EXEEXT) \ atf-c++/detail/expand_test$(EXEEXT) \ atf-c++/detail/fs_test$(EXEEXT) \ atf-c++/detail/parser_test$(EXEEXT) \ atf-c++/detail/process_test$(EXEEXT) \ atf-c++/detail/sanity_test$(EXEEXT) \ atf-c++/detail/text_test$(EXEEXT) \ atf-c++/detail/ui_test$(EXEEXT) check_PROGRAMS = bootstrap/h_app_empty$(EXEEXT) \ bootstrap/h_app_opts_args$(EXEEXT) \ bootstrap/h_tp_basic_c$(EXEEXT) \ bootstrap/h_tp_basic_cpp$(EXEEXT) @ENABLE_TOOLS_TRUE@am__append_1 = doc/atf.7 @ENABLE_TOOLS_TRUE@am__append_2 = doc/atf.7 @ENABLE_TOOLS_TRUE@am__append_3 = doc/atf.7.in @ENABLE_TOOLS_TRUE@am__append_4 = doc/atf-formats.5 \ @ENABLE_TOOLS_TRUE@ atf-report/atf-report.1 \ @ENABLE_TOOLS_TRUE@ atf-config/atf-config.1 atf-run/atf-run.1 \ @ENABLE_TOOLS_TRUE@ atf-version/atf-version.1 tests_test_programs_PROGRAMS = test-programs/c_helpers$(EXEEXT) \ test-programs/cpp_helpers$(EXEEXT) @ENABLE_TOOLS_TRUE@am__append_5 = atf-report/atf-report \ @ENABLE_TOOLS_TRUE@ atf-config/atf-config atf-run/atf-run \ @ENABLE_TOOLS_TRUE@ atf-version/atf-version @ENABLE_TOOLS_TRUE@am__append_6 = $(css_DATA) $(dtd_DATA) $(xsl_DATA) \ @ENABLE_TOOLS_TRUE@ $(tests_atf_report_DATA) \ @ENABLE_TOOLS_TRUE@ atf-report/integration_test.sh \ @ENABLE_TOOLS_TRUE@ $(tests_atf_config_DATA) \ @ENABLE_TOOLS_TRUE@ atf-config/integration_test.sh \ @ENABLE_TOOLS_TRUE@ $(tests_atf_run_DATA) \ @ENABLE_TOOLS_TRUE@ atf-run/integration_test.sh $(hooks_DATA) \ @ENABLE_TOOLS_TRUE@ $(eg_DATA) atf-version/generate-revision.sh @ENABLE_TOOLS_TRUE@tests_atf_report_PROGRAMS = \ @ENABLE_TOOLS_TRUE@ atf-report/fail_helper$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-report/misc_helpers$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-report/pass_helper$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-report/reader_test$(EXEEXT) @ENABLE_TOOLS_TRUE@am__append_7 = atf-report/integration_test \ @ENABLE_TOOLS_TRUE@ atf-config/integration_test \ @ENABLE_TOOLS_TRUE@ atf-run/integration_test \ @ENABLE_TOOLS_TRUE@ atf-version/revision.h \ @ENABLE_TOOLS_TRUE@ atf-version/revision.h.stamp \ @ENABLE_TOOLS_TRUE@ installcheck.fifo installcheck.log @ENABLE_TOOLS_TRUE@tests_atf_run_PROGRAMS = \ @ENABLE_TOOLS_TRUE@ atf-run/atffile_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/bad_metadata_helper$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/config_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/expect_helpers$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/fs_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/io_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/misc_helpers$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/pass_helper$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/several_tcs_helper$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/requirements_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/signals_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/test_program_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/user_test$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/zero_tcs_helper$(EXEEXT) @ENABLE_TOOLS_TRUE@am__append_8 = atf-version/revision.h @ENABLE_TOOLS_TRUE@am__append_9 = atf-version/revision.h.stamp \ @ENABLE_TOOLS_TRUE@ installcheck-atf @ENABLE_TOOLS_TRUE@am__append_10 = installcheck-atf @ENABLE_TOOLS_FALSE@@HAVE_KYUA_TRUE@am__append_11 = installcheck-kyua @ENABLE_TOOLS_TRUE@am__append_12 = Atffile subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler-flags.m4 \ $(top_srcdir)/m4/cxx-std-funcs.m4 \ $(top_srcdir)/m4/developer-mode.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/module-application.m4 \ $(top_srcdir)/m4/module-defs.m4 $(top_srcdir)/m4/module-env.m4 \ $(top_srcdir)/m4/module-fs.m4 \ $(top_srcdir)/m4/module-sanity.m4 \ $(top_srcdir)/m4/module-signals.m4 \ $(top_srcdir)/m4/runtime-tool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = bconfig.h CONFIG_CLEAN_FILES = atf-c/defs.h CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(tests_atf_cdir)" \ "$(DESTDIR)$(tests_atf_c__dir)" \ "$(DESTDIR)$(tests_atf_c___detaildir)" \ "$(DESTDIR)$(tests_atf_c_detaildir)" \ "$(DESTDIR)$(tests_atf_reportdir)" \ "$(DESTDIR)$(tests_atf_rundir)" \ "$(DESTDIR)$(tests_test_programsdir)" \ "$(DESTDIR)$(tests_atf_cdir)" "$(DESTDIR)$(tests_atf_c__dir)" \ "$(DESTDIR)$(tests_atf_configdir)" \ "$(DESTDIR)$(tests_atf_reportdir)" \ "$(DESTDIR)$(tests_atf_rundir)" "$(DESTDIR)$(tests_atf_shdir)" \ "$(DESTDIR)$(tests_test_programsdir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man4dir)" \ "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" \ "$(DESTDIR)$(atf_aclocaldir)" \ "$(DESTDIR)$(atf_c__dirpkgconfigdir)" \ "$(DESTDIR)$(atf_cpkgconfigdir)" "$(DESTDIR)$(atf_shdir)" \ "$(DESTDIR)$(atf_shpkgconfigdir)" "$(DESTDIR)$(cssdir)" \ "$(DESTDIR)$(docdir)" "$(DESTDIR)$(dtddir)" \ "$(DESTDIR)$(egdir)" "$(DESTDIR)$(hooksdir)" \ "$(DESTDIR)$(pkgtestsdir)" "$(DESTDIR)$(tests_atf_cdir)" \ "$(DESTDIR)$(tests_atf_c__dir)" \ "$(DESTDIR)$(tests_atf_c___detaildir)" \ "$(DESTDIR)$(tests_atf_c_detaildir)" \ "$(DESTDIR)$(tests_atf_configdir)" \ "$(DESTDIR)$(tests_atf_reportdir)" \ "$(DESTDIR)$(tests_atf_rundir)" "$(DESTDIR)$(tests_atf_shdir)" \ "$(DESTDIR)$(tests_test_programsdir)" "$(DESTDIR)$(xsldir)" \ "$(DESTDIR)$(atf_cdir)" "$(DESTDIR)$(atf_c__dir)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) atf_c___detail_libtest_helpers_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_atf_c___detail_libtest_helpers_la_OBJECTS = \ atf-c++/detail/test_helpers.lo atf_c___detail_libtest_helpers_la_OBJECTS = \ $(am_atf_c___detail_libtest_helpers_la_OBJECTS) atf_c_detail_libtest_helpers_la_LIBADD = am_atf_c_detail_libtest_helpers_la_OBJECTS = \ atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo atf_c_detail_libtest_helpers_la_OBJECTS = \ $(am_atf_c_detail_libtest_helpers_la_OBJECTS) libatf_c___la_DEPENDENCIES = libatf-c.la am_libatf_c___la_OBJECTS = atf-c++/build.lo atf-c++/check.lo \ atf-c++/config.lo atf-c++/tests.lo atf-c++/utils.lo \ atf-c++/detail/application.lo atf-c++/detail/env.lo \ atf-c++/detail/exceptions.lo atf-c++/detail/expand.lo \ atf-c++/detail/fs.lo atf-c++/detail/parser.lo \ atf-c++/detail/process.lo atf-c++/detail/text.lo \ atf-c++/detail/ui.lo libatf_c___la_OBJECTS = $(am_libatf_c___la_OBJECTS) libatf_c___la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libatf_c___la_LDFLAGS) $(LDFLAGS) -o $@ libatf_c_la_LIBADD = am_libatf_c_la_OBJECTS = atf-c/libatf_c_la-build.lo \ atf-c/libatf_c_la-check.lo atf-c/libatf_c_la-config.lo \ atf-c/libatf_c_la-error.lo atf-c/libatf_c_la-tc.lo \ atf-c/libatf_c_la-tp.lo atf-c/libatf_c_la-utils.lo \ atf-c/detail/libatf_c_la-dynstr.lo \ atf-c/detail/libatf_c_la-env.lo atf-c/detail/libatf_c_la-fs.lo \ atf-c/detail/libatf_c_la-list.lo \ atf-c/detail/libatf_c_la-map.lo \ atf-c/detail/libatf_c_la-process.lo \ atf-c/detail/libatf_c_la-sanity.lo \ atf-c/detail/libatf_c_la-text.lo \ atf-c/detail/libatf_c_la-tp_main.lo \ atf-c/detail/libatf_c_la-user.lo nodist_libatf_c_la_OBJECTS = libatf_c_la_OBJECTS = $(am_libatf_c_la_OBJECTS) \ $(nodist_libatf_c_la_OBJECTS) libatf_c_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libatf_c_la_LDFLAGS) $(LDFLAGS) -o $@ @ENABLE_TOOLS_TRUE@am__EXEEXT_1 = atf-report/atf-report$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-config/atf-config$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf-run$(EXEEXT) \ @ENABLE_TOOLS_TRUE@ atf-version/atf-version$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(tests_atf_c_PROGRAMS) \ $(tests_atf_c___PROGRAMS) $(tests_atf_c___detail_PROGRAMS) \ $(tests_atf_c_detail_PROGRAMS) $(tests_atf_report_PROGRAMS) \ $(tests_atf_run_PROGRAMS) $(tests_test_programs_PROGRAMS) am_atf_c___atf_c___test_OBJECTS = atf-c++/atf_c++_test.$(OBJEXT) atf_c___atf_c___test_OBJECTS = $(am_atf_c___atf_c___test_OBJECTS) atf_c___atf_c___test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___build_test_OBJECTS = atf-c++/build_test.$(OBJEXT) atf_c___build_test_OBJECTS = $(am_atf_c___build_test_OBJECTS) atf_c___build_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___check_test_OBJECTS = atf-c++/check_test.$(OBJEXT) atf_c___check_test_OBJECTS = $(am_atf_c___check_test_OBJECTS) atf_c___check_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___config_test_OBJECTS = atf-c++/config_test.$(OBJEXT) atf_c___config_test_OBJECTS = $(am_atf_c___config_test_OBJECTS) atf_c___config_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___detail_application_test_OBJECTS = \ atf-c++/detail/application_test.$(OBJEXT) atf_c___detail_application_test_OBJECTS = \ $(am_atf_c___detail_application_test_OBJECTS) atf_c___detail_application_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_auto_array_test_OBJECTS = \ atf-c++/detail/auto_array_test.$(OBJEXT) atf_c___detail_auto_array_test_OBJECTS = \ $(am_atf_c___detail_auto_array_test_OBJECTS) atf_c___detail_auto_array_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_env_test_OBJECTS = \ atf-c++/detail/env_test.$(OBJEXT) atf_c___detail_env_test_OBJECTS = \ $(am_atf_c___detail_env_test_OBJECTS) atf_c___detail_env_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_exceptions_test_OBJECTS = \ atf-c++/detail/exceptions_test.$(OBJEXT) atf_c___detail_exceptions_test_OBJECTS = \ $(am_atf_c___detail_exceptions_test_OBJECTS) atf_c___detail_exceptions_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_expand_test_OBJECTS = \ atf-c++/detail/expand_test.$(OBJEXT) atf_c___detail_expand_test_OBJECTS = \ $(am_atf_c___detail_expand_test_OBJECTS) atf_c___detail_expand_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_fs_test_OBJECTS = atf-c++/detail/fs_test.$(OBJEXT) atf_c___detail_fs_test_OBJECTS = $(am_atf_c___detail_fs_test_OBJECTS) atf_c___detail_fs_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_parser_test_OBJECTS = \ atf-c++/detail/parser_test.$(OBJEXT) atf_c___detail_parser_test_OBJECTS = \ $(am_atf_c___detail_parser_test_OBJECTS) atf_c___detail_parser_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_process_test_OBJECTS = \ atf-c++/detail/process_test.$(OBJEXT) atf_c___detail_process_test_OBJECTS = \ $(am_atf_c___detail_process_test_OBJECTS) atf_c___detail_process_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_sanity_test_OBJECTS = \ atf-c++/detail/sanity_test.$(OBJEXT) atf_c___detail_sanity_test_OBJECTS = \ $(am_atf_c___detail_sanity_test_OBJECTS) atf_c___detail_sanity_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_text_test_OBJECTS = \ atf-c++/detail/text_test.$(OBJEXT) atf_c___detail_text_test_OBJECTS = \ $(am_atf_c___detail_text_test_OBJECTS) atf_c___detail_text_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___detail_ui_test_OBJECTS = atf-c++/detail/ui_test.$(OBJEXT) atf_c___detail_ui_test_OBJECTS = $(am_atf_c___detail_ui_test_OBJECTS) atf_c___detail_ui_test_DEPENDENCIES = \ atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) am_atf_c___macros_test_OBJECTS = atf-c++/macros_test.$(OBJEXT) atf_c___macros_test_OBJECTS = $(am_atf_c___macros_test_OBJECTS) atf_c___macros_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___tests_test_OBJECTS = atf-c++/tests_test.$(OBJEXT) atf_c___tests_test_OBJECTS = $(am_atf_c___tests_test_OBJECTS) atf_c___tests_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c___utils_test_OBJECTS = atf-c++/utils_test.$(OBJEXT) atf_c___utils_test_OBJECTS = $(am_atf_c___utils_test_OBJECTS) atf_c___utils_test_DEPENDENCIES = atf-c++/detail/libtest_helpers.la \ $(ATF_CXX_LIBS) am_atf_c_atf_c_test_OBJECTS = atf-c/atf_c_test.$(OBJEXT) atf_c_atf_c_test_OBJECTS = $(am_atf_c_atf_c_test_OBJECTS) atf_c_atf_c_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_build_test_OBJECTS = atf-c/build_test.$(OBJEXT) atf_c_build_test_OBJECTS = $(am_atf_c_build_test_OBJECTS) atf_c_build_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_check_test_OBJECTS = atf-c/check_test.$(OBJEXT) atf_c_check_test_OBJECTS = $(am_atf_c_check_test_OBJECTS) atf_c_check_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_config_test_OBJECTS = atf-c/config_test.$(OBJEXT) atf_c_config_test_OBJECTS = $(am_atf_c_config_test_OBJECTS) atf_c_config_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_dynstr_test_OBJECTS = \ atf-c/detail/dynstr_test.$(OBJEXT) atf_c_detail_dynstr_test_OBJECTS = \ $(am_atf_c_detail_dynstr_test_OBJECTS) atf_c_detail_dynstr_test_DEPENDENCIES = \ atf-c/detail/libtest_helpers.la libatf-c.la am_atf_c_detail_env_test_OBJECTS = atf-c/detail/env_test.$(OBJEXT) atf_c_detail_env_test_OBJECTS = $(am_atf_c_detail_env_test_OBJECTS) atf_c_detail_env_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_fs_test_OBJECTS = atf-c/detail/fs_test.$(OBJEXT) atf_c_detail_fs_test_OBJECTS = $(am_atf_c_detail_fs_test_OBJECTS) atf_c_detail_fs_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_list_test_OBJECTS = atf-c/detail/list_test.$(OBJEXT) atf_c_detail_list_test_OBJECTS = $(am_atf_c_detail_list_test_OBJECTS) atf_c_detail_list_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_map_test_OBJECTS = atf-c/detail/map_test.$(OBJEXT) atf_c_detail_map_test_OBJECTS = $(am_atf_c_detail_map_test_OBJECTS) atf_c_detail_map_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_process_helpers_OBJECTS = \ atf-c/detail/process_helpers.$(OBJEXT) atf_c_detail_process_helpers_OBJECTS = \ $(am_atf_c_detail_process_helpers_OBJECTS) atf_c_detail_process_helpers_LDADD = $(LDADD) am_atf_c_detail_process_test_OBJECTS = \ atf-c/detail/process_test.$(OBJEXT) atf_c_detail_process_test_OBJECTS = \ $(am_atf_c_detail_process_test_OBJECTS) atf_c_detail_process_test_DEPENDENCIES = \ atf-c/detail/libtest_helpers.la libatf-c.la am_atf_c_detail_sanity_test_OBJECTS = \ atf-c/detail/sanity_test.$(OBJEXT) atf_c_detail_sanity_test_OBJECTS = \ $(am_atf_c_detail_sanity_test_OBJECTS) atf_c_detail_sanity_test_DEPENDENCIES = \ atf-c/detail/libtest_helpers.la libatf-c.la am_atf_c_detail_text_test_OBJECTS = atf-c/detail/text_test.$(OBJEXT) atf_c_detail_text_test_OBJECTS = $(am_atf_c_detail_text_test_OBJECTS) atf_c_detail_text_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_detail_user_test_OBJECTS = atf-c/detail/user_test.$(OBJEXT) atf_c_detail_user_test_OBJECTS = $(am_atf_c_detail_user_test_OBJECTS) atf_c_detail_user_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_error_test_OBJECTS = atf-c/error_test.$(OBJEXT) atf_c_error_test_OBJECTS = $(am_atf_c_error_test_OBJECTS) atf_c_error_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_macros_test_OBJECTS = atf-c/macros_test.$(OBJEXT) atf_c_macros_test_OBJECTS = $(am_atf_c_macros_test_OBJECTS) atf_c_macros_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_tc_test_OBJECTS = atf-c/tc_test.$(OBJEXT) atf_c_tc_test_OBJECTS = $(am_atf_c_tc_test_OBJECTS) atf_c_tc_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_tp_test_OBJECTS = atf-c/tp_test.$(OBJEXT) atf_c_tp_test_OBJECTS = $(am_atf_c_tp_test_OBJECTS) atf_c_tp_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am_atf_c_utils_test_OBJECTS = atf-c/utils_test.$(OBJEXT) atf_c_utils_test_OBJECTS = $(am_atf_c_utils_test_OBJECTS) atf_c_utils_test_DEPENDENCIES = atf-c/detail/libtest_helpers.la \ libatf-c.la am__atf_config_atf_config_SOURCES_DIST = atf-config/atf-config.cpp @ENABLE_TOOLS_TRUE@am_atf_config_atf_config_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-config/atf-config.$(OBJEXT) atf_config_atf_config_OBJECTS = $(am_atf_config_atf_config_OBJECTS) @ENABLE_TOOLS_TRUE@atf_config_atf_config_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_report_atf_report_SOURCES_DIST = atf-report/atf-report.cpp \ atf-report/reader.cpp atf-report/reader.hpp @ENABLE_TOOLS_TRUE@am_atf_report_atf_report_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-report/atf-report.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-report/reader.$(OBJEXT) atf_report_atf_report_OBJECTS = $(am_atf_report_atf_report_OBJECTS) @ENABLE_TOOLS_TRUE@atf_report_atf_report_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_report_fail_helper_SOURCES_DIST = atf-report/fail_helper.cpp @ENABLE_TOOLS_TRUE@am_atf_report_fail_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-report/fail_helper.$(OBJEXT) atf_report_fail_helper_OBJECTS = $(am_atf_report_fail_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_report_fail_helper_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_report_misc_helpers_SOURCES_DIST = \ atf-report/misc_helpers.cpp @ENABLE_TOOLS_TRUE@am_atf_report_misc_helpers_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-report/misc_helpers.$(OBJEXT) atf_report_misc_helpers_OBJECTS = \ $(am_atf_report_misc_helpers_OBJECTS) @ENABLE_TOOLS_TRUE@atf_report_misc_helpers_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_report_pass_helper_SOURCES_DIST = atf-report/pass_helper.cpp @ENABLE_TOOLS_TRUE@am_atf_report_pass_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-report/pass_helper.$(OBJEXT) atf_report_pass_helper_OBJECTS = $(am_atf_report_pass_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_report_pass_helper_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_report_reader_test_SOURCES_DIST = atf-report/reader_test.cpp \ atf-report/reader.cpp @ENABLE_TOOLS_TRUE@am_atf_report_reader_test_OBJECTS = atf-report/atf_report_reader_test-reader_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-report/atf_report_reader_test-reader.$(OBJEXT) atf_report_reader_test_OBJECTS = $(am_atf_report_reader_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_report_reader_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ atf-c++/detail/libtest_helpers.la \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_atf_run_SOURCES_DIST = atf-run/atf-run.cpp \ atf-run/atffile.cpp atf-run/atffile.hpp atf-run/config.cpp \ atf-run/config.hpp atf-run/fs.cpp atf-run/fs.hpp \ atf-run/io.cpp atf-run/io.hpp atf-run/requirements.cpp \ atf-run/requirements.hpp atf-run/signals.cpp \ atf-run/signals.hpp atf-run/test-program.cpp \ atf-run/test-program.hpp atf-run/timer.cpp atf-run/timer.hpp \ atf-run/user.cpp atf-run/user.hpp @ENABLE_TOOLS_TRUE@am_atf_run_atf_run_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-atf-run.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-atffile.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-config.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-fs.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-io.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-requirements.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-signals.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-test-program.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-timer.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atf_run-user.$(OBJEXT) atf_run_atf_run_OBJECTS = $(am_atf_run_atf_run_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_atf_run_DEPENDENCIES = $(ATF_CXX_LIBS) am__atf_run_atffile_test_SOURCES_DIST = atf-run/atffile_test.cpp \ atf-run/atffile.cpp @ENABLE_TOOLS_TRUE@am_atf_run_atffile_test_OBJECTS = atf-run/atf_run_atffile_test-atffile_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_atffile_test-atffile.$(OBJEXT) atf_run_atffile_test_OBJECTS = $(am_atf_run_atffile_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_atffile_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ atf-c++/detail/libtest_helpers.la \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_bad_metadata_helper_SOURCES_DIST = \ atf-run/bad_metadata_helper.c @ENABLE_TOOLS_TRUE@am_atf_run_bad_metadata_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/bad_metadata_helper.$(OBJEXT) atf_run_bad_metadata_helper_OBJECTS = \ $(am_atf_run_bad_metadata_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_bad_metadata_helper_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ libatf-c.la am__atf_run_config_test_SOURCES_DIST = atf-run/config_test.cpp \ atf-run/config.cpp @ENABLE_TOOLS_TRUE@am_atf_run_config_test_OBJECTS = atf-run/atf_run_config_test-config_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_config_test-config.$(OBJEXT) atf_run_config_test_OBJECTS = $(am_atf_run_config_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_config_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ atf-c++/detail/libtest_helpers.la \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_expect_helpers_SOURCES_DIST = atf-run/expect_helpers.c @ENABLE_TOOLS_TRUE@am_atf_run_expect_helpers_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/expect_helpers.$(OBJEXT) atf_run_expect_helpers_OBJECTS = $(am_atf_run_expect_helpers_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_expect_helpers_DEPENDENCIES = libatf-c.la am__atf_run_fs_test_SOURCES_DIST = atf-run/fs_test.cpp atf-run/fs.cpp \ atf-run/user.cpp @ENABLE_TOOLS_TRUE@am_atf_run_fs_test_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/fs_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/fs.$(OBJEXT) atf-run/user.$(OBJEXT) atf_run_fs_test_OBJECTS = $(am_atf_run_fs_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_fs_test_DEPENDENCIES = $(ATF_CXX_LIBS) am__atf_run_io_test_SOURCES_DIST = atf-run/io_test.cpp atf-run/io.cpp \ atf-run/signals.cpp @ENABLE_TOOLS_TRUE@am_atf_run_io_test_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/io_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/io.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/signals.$(OBJEXT) atf_run_io_test_OBJECTS = $(am_atf_run_io_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_io_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ atf-c++/detail/libtest_helpers.la \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_misc_helpers_SOURCES_DIST = atf-run/misc_helpers.cpp @ENABLE_TOOLS_TRUE@am_atf_run_misc_helpers_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/misc_helpers.$(OBJEXT) atf_run_misc_helpers_OBJECTS = $(am_atf_run_misc_helpers_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_misc_helpers_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_pass_helper_SOURCES_DIST = atf-run/pass_helper.cpp @ENABLE_TOOLS_TRUE@am_atf_run_pass_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/pass_helper.$(OBJEXT) atf_run_pass_helper_OBJECTS = $(am_atf_run_pass_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_pass_helper_DEPENDENCIES = $(ATF_CXX_LIBS) am__atf_run_requirements_test_SOURCES_DIST = \ atf-run/requirements_test.cpp atf-run/requirements.cpp \ atf-run/user.cpp @ENABLE_TOOLS_TRUE@am_atf_run_requirements_test_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/requirements_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/requirements.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/user.$(OBJEXT) atf_run_requirements_test_OBJECTS = \ $(am_atf_run_requirements_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_requirements_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_several_tcs_helper_SOURCES_DIST = \ atf-run/several_tcs_helper.c @ENABLE_TOOLS_TRUE@am_atf_run_several_tcs_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/several_tcs_helper.$(OBJEXT) atf_run_several_tcs_helper_OBJECTS = \ $(am_atf_run_several_tcs_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_several_tcs_helper_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ libatf-c.la am__atf_run_signals_test_SOURCES_DIST = atf-run/signals_test.cpp \ atf-run/signals.cpp @ENABLE_TOOLS_TRUE@am_atf_run_signals_test_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/signals_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/signals.$(OBJEXT) atf_run_signals_test_OBJECTS = $(am_atf_run_signals_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_signals_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_test_program_test_SOURCES_DIST = \ atf-run/test_program_test.cpp atf-run/fs.cpp atf-run/io.cpp \ atf-run/requirements.cpp atf-run/signals.cpp \ atf-run/test-program.cpp atf-run/timer.cpp atf-run/user.cpp @ENABLE_TOOLS_TRUE@am_atf_run_test_program_test_OBJECTS = atf-run/atf_run_test_program_test-test_program_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-fs.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-io.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-requirements.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-signals.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-test-program.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-timer.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/atf_run_test_program_test-user.$(OBJEXT) atf_run_test_program_test_OBJECTS = \ $(am_atf_run_test_program_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_test_program_test_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ atf-c++/detail/libtest_helpers.la \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am__atf_run_user_test_SOURCES_DIST = atf-run/user_test.cpp \ atf-run/user.cpp @ENABLE_TOOLS_TRUE@am_atf_run_user_test_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/user_test.$(OBJEXT) \ @ENABLE_TOOLS_TRUE@ atf-run/user.$(OBJEXT) atf_run_user_test_OBJECTS = $(am_atf_run_user_test_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_user_test_DEPENDENCIES = $(ATF_CXX_LIBS) am__atf_run_zero_tcs_helper_SOURCES_DIST = atf-run/zero_tcs_helper.c @ENABLE_TOOLS_TRUE@am_atf_run_zero_tcs_helper_OBJECTS = \ @ENABLE_TOOLS_TRUE@ atf-run/zero_tcs_helper.$(OBJEXT) atf_run_zero_tcs_helper_OBJECTS = \ $(am_atf_run_zero_tcs_helper_OBJECTS) @ENABLE_TOOLS_TRUE@atf_run_zero_tcs_helper_DEPENDENCIES = libatf-c.la am_atf_sh_atf_check_OBJECTS = atf-sh/atf-check.$(OBJEXT) atf_sh_atf_check_OBJECTS = $(am_atf_sh_atf_check_OBJECTS) atf_sh_atf_check_DEPENDENCIES = $(ATF_CXX_LIBS) am_atf_sh_atf_sh_OBJECTS = atf-sh/atf-sh.$(OBJEXT) atf_sh_atf_sh_OBJECTS = $(am_atf_sh_atf_sh_OBJECTS) atf_sh_atf_sh_DEPENDENCIES = $(ATF_CXX_LIBS) am__atf_version_atf_version_SOURCES_DIST = \ atf-version/atf-version.cpp @ENABLE_TOOLS_TRUE@am_atf_version_atf_version_OBJECTS = atf-version/atf_version_atf_version-atf-version.$(OBJEXT) nodist_atf_version_atf_version_OBJECTS = atf_version_atf_version_OBJECTS = \ $(am_atf_version_atf_version_OBJECTS) \ $(nodist_atf_version_atf_version_OBJECTS) @ENABLE_TOOLS_TRUE@atf_version_atf_version_DEPENDENCIES = \ @ENABLE_TOOLS_TRUE@ $(ATF_CXX_LIBS) am_bootstrap_h_app_empty_OBJECTS = bootstrap/h_app_empty.$(OBJEXT) bootstrap_h_app_empty_OBJECTS = $(am_bootstrap_h_app_empty_OBJECTS) bootstrap_h_app_empty_DEPENDENCIES = $(ATF_CXX_LIBS) am_bootstrap_h_app_opts_args_OBJECTS = \ bootstrap/h_app_opts_args.$(OBJEXT) bootstrap_h_app_opts_args_OBJECTS = \ $(am_bootstrap_h_app_opts_args_OBJECTS) bootstrap_h_app_opts_args_DEPENDENCIES = $(ATF_CXX_LIBS) am_bootstrap_h_tp_basic_c_OBJECTS = bootstrap/h_tp_basic_c.$(OBJEXT) bootstrap_h_tp_basic_c_OBJECTS = $(am_bootstrap_h_tp_basic_c_OBJECTS) bootstrap_h_tp_basic_c_DEPENDENCIES = libatf-c.la am_bootstrap_h_tp_basic_cpp_OBJECTS = \ bootstrap/h_tp_basic_cpp.$(OBJEXT) bootstrap_h_tp_basic_cpp_OBJECTS = \ $(am_bootstrap_h_tp_basic_cpp_OBJECTS) bootstrap_h_tp_basic_cpp_DEPENDENCIES = $(ATF_CXX_LIBS) am_test_programs_c_helpers_OBJECTS = \ test-programs/c_helpers.$(OBJEXT) test_programs_c_helpers_OBJECTS = \ $(am_test_programs_c_helpers_OBJECTS) test_programs_c_helpers_DEPENDENCIES = libatf-c.la am_test_programs_cpp_helpers_OBJECTS = \ test-programs/cpp_helpers.$(OBJEXT) test_programs_cpp_helpers_OBJECTS = \ $(am_test_programs_cpp_helpers_OBJECTS) test_programs_cpp_helpers_DEPENDENCIES = $(ATF_CXX_LIBS) SCRIPTS = $(tests_atf_c_SCRIPTS) $(tests_atf_c___SCRIPTS) \ $(tests_atf_config_SCRIPTS) $(tests_atf_report_SCRIPTS) \ $(tests_atf_run_SCRIPTS) $(tests_atf_sh_SCRIPTS) \ $(tests_test_programs_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/admin/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(atf_c___detail_libtest_helpers_la_SOURCES) \ $(atf_c_detail_libtest_helpers_la_SOURCES) \ $(libatf_c___la_SOURCES) $(libatf_c_la_SOURCES) \ $(nodist_libatf_c_la_SOURCES) $(atf_c___atf_c___test_SOURCES) \ $(atf_c___build_test_SOURCES) $(atf_c___check_test_SOURCES) \ $(atf_c___config_test_SOURCES) \ $(atf_c___detail_application_test_SOURCES) \ $(atf_c___detail_auto_array_test_SOURCES) \ $(atf_c___detail_env_test_SOURCES) \ $(atf_c___detail_exceptions_test_SOURCES) \ $(atf_c___detail_expand_test_SOURCES) \ $(atf_c___detail_fs_test_SOURCES) \ $(atf_c___detail_parser_test_SOURCES) \ $(atf_c___detail_process_test_SOURCES) \ $(atf_c___detail_sanity_test_SOURCES) \ $(atf_c___detail_text_test_SOURCES) \ $(atf_c___detail_ui_test_SOURCES) \ $(atf_c___macros_test_SOURCES) $(atf_c___tests_test_SOURCES) \ $(atf_c___utils_test_SOURCES) $(atf_c_atf_c_test_SOURCES) \ $(atf_c_build_test_SOURCES) $(atf_c_check_test_SOURCES) \ $(atf_c_config_test_SOURCES) \ $(atf_c_detail_dynstr_test_SOURCES) \ $(atf_c_detail_env_test_SOURCES) \ $(atf_c_detail_fs_test_SOURCES) \ $(atf_c_detail_list_test_SOURCES) \ $(atf_c_detail_map_test_SOURCES) \ $(atf_c_detail_process_helpers_SOURCES) \ $(atf_c_detail_process_test_SOURCES) \ $(atf_c_detail_sanity_test_SOURCES) \ $(atf_c_detail_text_test_SOURCES) \ $(atf_c_detail_user_test_SOURCES) $(atf_c_error_test_SOURCES) \ $(atf_c_macros_test_SOURCES) $(atf_c_tc_test_SOURCES) \ $(atf_c_tp_test_SOURCES) $(atf_c_utils_test_SOURCES) \ $(atf_config_atf_config_SOURCES) \ $(atf_report_atf_report_SOURCES) \ $(atf_report_fail_helper_SOURCES) \ $(atf_report_misc_helpers_SOURCES) \ $(atf_report_pass_helper_SOURCES) \ $(atf_report_reader_test_SOURCES) $(atf_run_atf_run_SOURCES) \ $(atf_run_atffile_test_SOURCES) \ $(atf_run_bad_metadata_helper_SOURCES) \ $(atf_run_config_test_SOURCES) \ $(atf_run_expect_helpers_SOURCES) $(atf_run_fs_test_SOURCES) \ $(atf_run_io_test_SOURCES) $(atf_run_misc_helpers_SOURCES) \ $(atf_run_pass_helper_SOURCES) \ $(atf_run_requirements_test_SOURCES) \ $(atf_run_several_tcs_helper_SOURCES) \ $(atf_run_signals_test_SOURCES) \ $(atf_run_test_program_test_SOURCES) \ $(atf_run_user_test_SOURCES) \ $(atf_run_zero_tcs_helper_SOURCES) $(atf_sh_atf_check_SOURCES) \ $(atf_sh_atf_sh_SOURCES) $(atf_version_atf_version_SOURCES) \ $(nodist_atf_version_atf_version_SOURCES) \ $(bootstrap_h_app_empty_SOURCES) \ $(bootstrap_h_app_opts_args_SOURCES) \ $(bootstrap_h_tp_basic_c_SOURCES) \ $(bootstrap_h_tp_basic_cpp_SOURCES) \ $(test_programs_c_helpers_SOURCES) \ $(test_programs_cpp_helpers_SOURCES) DIST_SOURCES = $(atf_c___detail_libtest_helpers_la_SOURCES) \ $(atf_c_detail_libtest_helpers_la_SOURCES) \ $(libatf_c___la_SOURCES) $(libatf_c_la_SOURCES) \ $(atf_c___atf_c___test_SOURCES) $(atf_c___build_test_SOURCES) \ $(atf_c___check_test_SOURCES) $(atf_c___config_test_SOURCES) \ $(atf_c___detail_application_test_SOURCES) \ $(atf_c___detail_auto_array_test_SOURCES) \ $(atf_c___detail_env_test_SOURCES) \ $(atf_c___detail_exceptions_test_SOURCES) \ $(atf_c___detail_expand_test_SOURCES) \ $(atf_c___detail_fs_test_SOURCES) \ $(atf_c___detail_parser_test_SOURCES) \ $(atf_c___detail_process_test_SOURCES) \ $(atf_c___detail_sanity_test_SOURCES) \ $(atf_c___detail_text_test_SOURCES) \ $(atf_c___detail_ui_test_SOURCES) \ $(atf_c___macros_test_SOURCES) $(atf_c___tests_test_SOURCES) \ $(atf_c___utils_test_SOURCES) $(atf_c_atf_c_test_SOURCES) \ $(atf_c_build_test_SOURCES) $(atf_c_check_test_SOURCES) \ $(atf_c_config_test_SOURCES) \ $(atf_c_detail_dynstr_test_SOURCES) \ $(atf_c_detail_env_test_SOURCES) \ $(atf_c_detail_fs_test_SOURCES) \ $(atf_c_detail_list_test_SOURCES) \ $(atf_c_detail_map_test_SOURCES) \ $(atf_c_detail_process_helpers_SOURCES) \ $(atf_c_detail_process_test_SOURCES) \ $(atf_c_detail_sanity_test_SOURCES) \ $(atf_c_detail_text_test_SOURCES) \ $(atf_c_detail_user_test_SOURCES) $(atf_c_error_test_SOURCES) \ $(atf_c_macros_test_SOURCES) $(atf_c_tc_test_SOURCES) \ $(atf_c_tp_test_SOURCES) $(atf_c_utils_test_SOURCES) \ $(am__atf_config_atf_config_SOURCES_DIST) \ $(am__atf_report_atf_report_SOURCES_DIST) \ $(am__atf_report_fail_helper_SOURCES_DIST) \ $(am__atf_report_misc_helpers_SOURCES_DIST) \ $(am__atf_report_pass_helper_SOURCES_DIST) \ $(am__atf_report_reader_test_SOURCES_DIST) \ $(am__atf_run_atf_run_SOURCES_DIST) \ $(am__atf_run_atffile_test_SOURCES_DIST) \ $(am__atf_run_bad_metadata_helper_SOURCES_DIST) \ $(am__atf_run_config_test_SOURCES_DIST) \ $(am__atf_run_expect_helpers_SOURCES_DIST) \ $(am__atf_run_fs_test_SOURCES_DIST) \ $(am__atf_run_io_test_SOURCES_DIST) \ $(am__atf_run_misc_helpers_SOURCES_DIST) \ $(am__atf_run_pass_helper_SOURCES_DIST) \ $(am__atf_run_requirements_test_SOURCES_DIST) \ $(am__atf_run_several_tcs_helper_SOURCES_DIST) \ $(am__atf_run_signals_test_SOURCES_DIST) \ $(am__atf_run_test_program_test_SOURCES_DIST) \ $(am__atf_run_user_test_SOURCES_DIST) \ $(am__atf_run_zero_tcs_helper_SOURCES_DIST) \ $(atf_sh_atf_check_SOURCES) $(atf_sh_atf_sh_SOURCES) \ $(am__atf_version_atf_version_SOURCES_DIST) \ $(bootstrap_h_app_empty_SOURCES) \ $(bootstrap_h_app_opts_args_SOURCES) \ $(bootstrap_h_tp_basic_c_SOURCES) \ $(bootstrap_h_tp_basic_cpp_SOURCES) \ $(test_programs_c_helpers_SOURCES) \ $(test_programs_cpp_helpers_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 man3dir = $(mandir)/man3 man4dir = $(mandir)/man4 man5dir = $(mandir)/man5 man7dir = $(mandir)/man7 NROFF = nroff MANS = $(dist_man_MANS) $(man_MANS) DATA = $(atf_aclocal_DATA) $(atf_c__dirpkgconfig_DATA) \ $(atf_cpkgconfig_DATA) $(atf_sh_DATA) $(atf_shpkgconfig_DATA) \ $(css_DATA) $(doc_DATA) $(dtd_DATA) $(eg_DATA) $(hooks_DATA) \ $(noinst_DATA) $(pkgtests_DATA) $(tests_atf_c_DATA) \ $(tests_atf_c___DATA) $(tests_atf_c___detail_DATA) \ $(tests_atf_c_detail_DATA) $(tests_atf_config_DATA) \ $(tests_atf_report_DATA) $(tests_atf_run_DATA) \ $(tests_atf_sh_DATA) $(tests_test_programs_DATA) $(xsl_DATA) HEADERS = $(atf_c_HEADERS) $(atf_c___HEADERS) $(include_HEADERS) ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ ATF_BUILD_CC = @ATF_BUILD_CC@ ATF_BUILD_CFLAGS = @ATF_BUILD_CFLAGS@ ATF_BUILD_CPP = @ATF_BUILD_CPP@ ATF_BUILD_CPPFLAGS = @ATF_BUILD_CPPFLAGS@ ATF_BUILD_CXX = @ATF_BUILD_CXX@ ATF_BUILD_CXXFLAGS = @ATF_BUILD_CXXFLAGS@ ATF_CONFSUBDIR = @ATF_CONFSUBDIR@ ATF_SHELL = @ATF_SHELL@ ATF_WORKDIR = @ATF_WORKDIR@ ATTRIBUTE_FORMAT_PRINTF = @ATTRIBUTE_FORMAT_PRINTF@ ATTRIBUTE_NORETURN = @ATTRIBUTE_NORETURN@ ATTRIBUTE_UNUSED = @ATTRIBUTE_UNUSED@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_TOOLS = @ENABLE_TOOLS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GDB = @GDB@ GIT = @GIT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KYUA = @KYUA@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ atf_aclocaldir = @atf_aclocaldir@ atf_arch = @atf_arch@ atf_confdir = @atf_confdir@ atf_cssdir = @atf_cssdir@ atf_dtddir = @atf_dtddir@ atf_egdir = @atf_egdir@ atf_machine = @atf_machine@ atf_pkgconfigdir = @atf_pkgconfigdir@ atf_xsldir = @atf_xsldir@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_srcdir = @target_srcdir@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ atf_aclocal_DATA = atf-c/atf-common.m4 atf-c/atf-c.m4 \ atf-c++/atf-c++.m4 atf-sh/atf-sh.m4 BUILT_SOURCES = $(am__append_8) CLEANFILES = atf-c/atf-c.pc atf-c/pkg_config_test atf-c++/atf-c++.pc \ atf-c++/pkg_config_test atf-sh/atf-sh.pc atf-sh/misc_helpers \ atf-sh/atf_check_test atf-sh/atf-check_test atf-sh/config_test \ atf-sh/integration_test atf-sh/normalize_test atf-sh/tc_test \ atf-sh/tp_test bootstrap/h_tp_basic_sh \ bootstrap/h_tp_atf_check_sh bootstrap/h_tp_fail \ bootstrap/h_tp_pass $(am__append_2) test-programs/sh_helpers \ test-programs/config_test test-programs/expect_test \ test-programs/meta_data_test test-programs/result_test \ test-programs/srcdir_test $(am__append_7) EXTRA_DIST = admin/check-style-common.awk admin/check-style-c.awk \ admin/check-style-cpp.awk admin/check-style-man.awk \ admin/check-style-shell.awk admin/check-style.sh \ atf-c/atf-common.m4 atf-c/atf-c.m4 atf-c/atf-c.pc.in \ $(tests_atf_c_DATA) atf-c/pkg_config_test.sh \ $(tests_atf_c_detail_DATA) atf-c++/atf-c++.m4 \ atf-c++/atf-c++.pc.in $(tests_atf_c___DATA) \ atf-c++/pkg_config_test.sh $(tests_atf_c___detail_DATA) \ $(atf_sh_DATA) atf-sh/atf-sh.m4 atf-sh/atf-sh.pc.in \ $(tests_atf_sh_DATA) atf-sh/misc_helpers.sh \ atf-sh/atf_check_test.sh atf-sh/atf-check_test.sh \ atf-sh/config_test.sh atf-sh/integration_test.sh \ atf-sh/normalize_test.sh atf-sh/tc_test.sh atf-sh/tp_test.sh \ bootstrap/h_tp_basic_sh.sh bootstrap/h_tp_atf_check_sh.sh \ bootstrap/h_tp_fail.sh bootstrap/h_tp_pass.sh \ bootstrap/testsuite bootstrap/package.m4 \ bootstrap/testsuite.at $(testsuite_incs) $(am__append_3) \ $(tests_test_programs_DATA) test-programs/common.sh \ test-programs/sh_helpers.sh test-programs/config_test.sh \ test-programs/expect_test.sh test-programs/meta_data_test.sh \ test-programs/result_test.sh test-programs/srcdir_test.sh \ $(am__append_6) $(doc_DATA) INSTALL README $(pkgtests_DATA) dist_man_MANS = atf-c/atf-c-api.3 atf-c++/atf-c++-api.3 \ atf-sh/atf-check.1 atf-sh/atf-sh.1 atf-sh/atf-sh-api.3 \ doc/atf-test-case.4 doc/atf-test-program.1 $(am__append_4) include_HEADERS = atf-c.h atf-c++.hpp lib_LTLIBRARIES = libatf-c.la libatf-c++.la man_MANS = $(am__append_1) noinst_DATA = INSTALL README noinst_LTLIBRARIES = atf-c/detail/libtest_helpers.la \ atf-c++/detail/libtest_helpers.la INSTALLCHECK_TARGETS = installcheck-bootstrap $(am__append_10) \ $(am__append_11) PHONY_TARGETS = check-style installcheck-bootstrap $(am__append_9) \ installcheck-kyua clean-all release release-test ACLOCAL_AMFLAGS = -I m4 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-tools libatf_c_la_SOURCES = atf-c/build.c atf-c/build.h atf-c/check.c \ atf-c/check.h atf-c/config.c atf-c/config.h atf-c/error.c \ atf-c/error.h atf-c/error_fwd.h atf-c/macros.h atf-c/tc.c \ atf-c/tc.h atf-c/tp.c atf-c/tp.h atf-c/utils.c atf-c/utils.h \ atf-c/detail/dynstr.c atf-c/detail/dynstr.h atf-c/detail/env.c \ atf-c/detail/env.h atf-c/detail/fs.c atf-c/detail/fs.h \ atf-c/detail/list.c atf-c/detail/list.h atf-c/detail/map.c \ atf-c/detail/map.h atf-c/detail/process.c \ atf-c/detail/process.h atf-c/detail/sanity.c \ atf-c/detail/sanity.h atf-c/detail/text.c atf-c/detail/text.h \ atf-c/detail/tp_main.c atf-c/detail/user.c atf-c/detail/user.h nodist_libatf_c_la_SOURCES = atf-c/defs.h libatf_c_la_CPPFLAGS = "-DATF_ARCH=\"$(atf_arch)\"" \ "-DATF_BUILD_CC=\"$(ATF_BUILD_CC)\"" \ "-DATF_BUILD_CFLAGS=\"$(ATF_BUILD_CFLAGS)\"" \ "-DATF_BUILD_CPP=\"$(ATF_BUILD_CPP)\"" \ "-DATF_BUILD_CPPFLAGS=\"$(ATF_BUILD_CPPFLAGS)\"" \ "-DATF_BUILD_CXX=\"$(ATF_BUILD_CXX)\"" \ "-DATF_BUILD_CXXFLAGS=\"$(ATF_BUILD_CXXFLAGS)\"" \ "-DATF_CONFDIR=\"$(atf_confdir)\"" \ "-DATF_INCLUDEDIR=\"$(includedir)\"" \ "-DATF_LIBDIR=\"$(libdir)\"" \ "-DATF_LIBEXECDIR=\"$(libexecdir)\"" \ "-DATF_MACHINE=\"$(atf_machine)\"" \ "-DATF_M4=\"$(ATF_M4)\"" \ "-DATF_PKGDATADIR=\"$(pkgdatadir)\"" \ "-DATF_SHELL=\"$(ATF_SHELL)\"" \ "-DATF_WORKDIR=\"$(ATF_WORKDIR)\"" \ -I$(srcdir)/atf-c libatf_c_la_LDFLAGS = -version-info 0:0:0 atf_c_HEADERS = atf-c/build.h \ atf-c/check.h \ atf-c/config.h \ atf-c/defs.h \ atf-c/error.h \ atf-c/error_fwd.h \ atf-c/macros.h \ atf-c/tc.h \ atf-c/tp.h \ atf-c/utils.h atf_cdir = $(includedir)/atf-c atf_cpkgconfigdir = $(atf_pkgconfigdir) atf_cpkgconfig_DATA = atf-c/atf-c.pc tests_atf_c_DATA = atf-c/Atffile \ atf-c/Kyuafile \ atf-c/macros_h_test.c \ atf-c/unused_test.c tests_atf_cdir = $(pkgtestsdir)/atf-c atf_c_atf_c_test_SOURCES = atf-c/atf_c_test.c atf_c_atf_c_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_build_test_SOURCES = atf-c/build_test.c atf-c/h_build.h atf_c_build_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_check_test_SOURCES = atf-c/check_test.c atf_c_check_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_config_test_SOURCES = atf-c/config_test.c atf_c_config_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_error_test_SOURCES = atf-c/error_test.c atf_c_error_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_macros_test_SOURCES = atf-c/macros_test.c atf_c_macros_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_SCRIPTS = atf-c/pkg_config_test atf_c_tc_test_SOURCES = atf-c/tc_test.c atf_c_tc_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_tp_test_SOURCES = atf-c/tp_test.c atf_c_tp_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_utils_test_SOURCES = atf-c/utils_test.c atf-c/h_build.h atf_c_utils_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_DATA = atf-c/detail/Atffile \ atf-c/detail/Kyuafile tests_atf_c_detaildir = $(pkgtestsdir)/atf-c/detail atf_c_detail_libtest_helpers_la_SOURCES = atf-c/detail/test_helpers.c \ atf-c/detail/test_helpers.h atf_c_detail_libtest_helpers_la_CPPFLAGS = -I$(srcdir)/atf-c atf_c_detail_dynstr_test_SOURCES = atf-c/detail/dynstr_test.c atf_c_detail_dynstr_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_env_test_SOURCES = atf-c/detail/env_test.c atf_c_detail_env_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_fs_test_SOURCES = atf-c/detail/fs_test.c atf_c_detail_fs_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_list_test_SOURCES = atf-c/detail/list_test.c atf_c_detail_list_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_map_test_SOURCES = atf-c/detail/map_test.c atf_c_detail_map_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_process_helpers_SOURCES = atf-c/detail/process_helpers.c atf_c_detail_process_test_SOURCES = atf-c/detail/process_test.c atf_c_detail_process_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_sanity_test_SOURCES = atf-c/detail/sanity_test.c atf_c_detail_sanity_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_text_test_SOURCES = atf-c/detail/text_test.c atf_c_detail_text_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la atf_c_detail_user_test_SOURCES = atf-c/detail/user_test.c atf_c_detail_user_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la ATF_CXX_LIBS = libatf-c++.la libatf-c.la libatf_c___la_LIBADD = libatf-c.la libatf_c___la_SOURCES = atf-c++/build.cpp atf-c++/build.hpp \ atf-c++/check.cpp atf-c++/check.hpp atf-c++/config.cpp \ atf-c++/config.hpp atf-c++/macros.hpp atf-c++/noncopyable.hpp \ atf-c++/tests.cpp atf-c++/tests.hpp atf-c++/utils.cpp \ atf-c++/utils.hpp atf-c++/detail/application.cpp \ atf-c++/detail/application.hpp atf-c++/detail/auto_array.hpp \ atf-c++/detail/env.cpp atf-c++/detail/env.hpp \ atf-c++/detail/exceptions.cpp atf-c++/detail/exceptions.hpp \ atf-c++/detail/expand.cpp atf-c++/detail/expand.hpp \ atf-c++/detail/fs.cpp atf-c++/detail/fs.hpp \ atf-c++/detail/parser.cpp atf-c++/detail/parser.hpp \ atf-c++/detail/process.cpp atf-c++/detail/process.hpp \ atf-c++/detail/sanity.hpp atf-c++/detail/text.cpp \ atf-c++/detail/text.hpp atf-c++/detail/ui.cpp \ atf-c++/detail/ui.hpp libatf_c___la_LDFLAGS = -version-info 0:0:0 atf_c___HEADERS = atf-c++/build.hpp \ atf-c++/check.hpp \ atf-c++/config.hpp \ atf-c++/macros.hpp \ atf-c++/noncopyable.hpp \ atf-c++/tests.hpp \ atf-c++/utils.hpp atf_c__dir = $(includedir)/atf-c++ atf_c__dirpkgconfigdir = $(atf_pkgconfigdir) atf_c__dirpkgconfig_DATA = atf-c++/atf-c++.pc tests_atf_c___DATA = atf-c++/Atffile \ atf-c++/Kyuafile \ atf-c++/macros_hpp_test.cpp \ atf-c++/unused_test.cpp tests_atf_c__dir = $(pkgtestsdir)/atf-c++ atf_c___atf_c___test_SOURCES = atf-c++/atf_c++_test.cpp atf_c___atf_c___test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___build_test_SOURCES = atf-c++/build_test.cpp atf-c/h_build.h atf_c___build_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___check_test_SOURCES = atf-c++/check_test.cpp atf_c___check_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___config_test_SOURCES = atf-c++/config_test.cpp atf_c___config_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___macros_test_SOURCES = atf-c++/macros_test.cpp atf_c___macros_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___SCRIPTS = atf-c++/pkg_config_test atf_c___tests_test_SOURCES = atf-c++/tests_test.cpp atf_c___tests_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___utils_test_SOURCES = atf-c++/utils_test.cpp atf_c___utils_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) tests_atf_c___detail_DATA = atf-c++/detail/Atffile \ atf-c++/detail/Kyuafile tests_atf_c___detaildir = $(pkgtestsdir)/atf-c++/detail atf_c___detail_libtest_helpers_la_SOURCES = atf-c++/detail/test_helpers.cpp \ atf-c++/detail/test_helpers.hpp atf_c___detail_application_test_SOURCES = atf-c++/detail/application_test.cpp atf_c___detail_application_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_auto_array_test_SOURCES = atf-c++/detail/auto_array_test.cpp atf_c___detail_auto_array_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_env_test_SOURCES = atf-c++/detail/env_test.cpp atf_c___detail_env_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_exceptions_test_SOURCES = atf-c++/detail/exceptions_test.cpp atf_c___detail_exceptions_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_expand_test_SOURCES = atf-c++/detail/expand_test.cpp atf_c___detail_expand_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_fs_test_SOURCES = atf-c++/detail/fs_test.cpp atf_c___detail_fs_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_parser_test_SOURCES = atf-c++/detail/parser_test.cpp atf_c___detail_parser_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_process_test_SOURCES = atf-c++/detail/process_test.cpp atf_c___detail_process_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_sanity_test_SOURCES = atf-c++/detail/sanity_test.cpp atf_c___detail_sanity_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_text_test_SOURCES = atf-c++/detail/text_test.cpp atf_c___detail_text_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_c___detail_ui_test_SOURCES = atf-c++/detail/ui_test.cpp atf_c___detail_ui_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) atf_sh_atf_check_SOURCES = atf-sh/atf-check.cpp atf_sh_atf_check_LDADD = $(ATF_CXX_LIBS) atf_sh_atf_sh_SOURCES = atf-sh/atf-sh.cpp atf_sh_atf_sh_LDADD = $(ATF_CXX_LIBS) atf_sh_DATA = atf-sh/libatf-sh.subr atf_shdir = $(pkgdatadir) atf_shpkgconfigdir = $(atf_pkgconfigdir) atf_shpkgconfig_DATA = atf-sh/atf-sh.pc tests_atf_sh_DATA = atf-sh/Atffile \ atf-sh/Kyuafile tests_atf_shdir = $(pkgtestsdir)/atf-sh tests_atf_sh_SCRIPTS = atf-sh/misc_helpers atf-sh/atf_check_test \ atf-sh/atf-check_test atf-sh/config_test \ atf-sh/integration_test atf-sh/normalize_test atf-sh/tc_test \ atf-sh/tp_test bootstrap_h_app_empty_SOURCES = bootstrap/h_app_empty.cpp bootstrap_h_app_empty_LDADD = $(ATF_CXX_LIBS) bootstrap_h_app_opts_args_SOURCES = bootstrap/h_app_opts_args.cpp bootstrap_h_app_opts_args_LDADD = $(ATF_CXX_LIBS) bootstrap_h_tp_basic_c_SOURCES = bootstrap/h_tp_basic_c.c bootstrap_h_tp_basic_c_LDADD = libatf-c.la bootstrap_h_tp_basic_cpp_SOURCES = bootstrap/h_tp_basic_cpp.cpp bootstrap_h_tp_basic_cpp_LDADD = $(ATF_CXX_LIBS) check_SCRIPTS = bootstrap/h_tp_basic_sh bootstrap/h_tp_atf_check_sh \ bootstrap/h_tp_fail bootstrap/h_tp_pass DISTCLEANFILES = \ bootstrap/atconfig \ testsuite.lineno \ testsuite.log testsuite_incs = $(srcdir)/bootstrap/t_application_help.at \ $(srcdir)/bootstrap/t_application_opts_args.at \ $(srcdir)/bootstrap/t_atf_config.at \ $(srcdir)/bootstrap/t_atf_run.at \ $(srcdir)/bootstrap/t_subr_atf_check.at \ $(srcdir)/bootstrap/t_test_program_compare.at \ $(srcdir)/bootstrap/t_test_program_filter.at \ $(srcdir)/bootstrap/t_test_program_list.at \ $(srcdir)/bootstrap/t_test_program_run.at tests_test_programs_DATA = test-programs/Atffile \ test-programs/Kyuafile tests_test_programsdir = $(pkgtestsdir)/test-programs test_programs_c_helpers_SOURCES = test-programs/c_helpers.c test_programs_c_helpers_LDADD = libatf-c.la test_programs_cpp_helpers_SOURCES = test-programs/cpp_helpers.cpp test_programs_cpp_helpers_LDADD = $(ATF_CXX_LIBS) common_sh = $(srcdir)/test-programs/common.sh tests_test_programs_SCRIPTS = test-programs/sh_helpers \ test-programs/config_test test-programs/expect_test \ test-programs/meta_data_test test-programs/result_test \ test-programs/srcdir_test @ENABLE_TOOLS_TRUE@atf_report_atf_report_SOURCES = atf-report/atf-report.cpp \ @ENABLE_TOOLS_TRUE@ atf-report/reader.cpp \ @ENABLE_TOOLS_TRUE@ atf-report/reader.hpp @ENABLE_TOOLS_TRUE@atf_report_atf_report_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@cssdir = $(atf_cssdir) @ENABLE_TOOLS_TRUE@css_DATA = atf-report/tests-results.css @ENABLE_TOOLS_TRUE@dtddir = $(atf_dtddir) @ENABLE_TOOLS_TRUE@dtd_DATA = atf-report/tests-results.dtd @ENABLE_TOOLS_TRUE@xsldir = $(atf_xsldir) @ENABLE_TOOLS_TRUE@xsl_DATA = atf-report/tests-results.xsl @ENABLE_TOOLS_TRUE@tests_atf_report_DATA = atf-report/Atffile \ @ENABLE_TOOLS_TRUE@ atf-report/Kyuafile @ENABLE_TOOLS_TRUE@tests_atf_reportdir = $(pkgtestsdir)/atf-report @ENABLE_TOOLS_TRUE@atf_report_fail_helper_SOURCES = atf-report/fail_helper.cpp @ENABLE_TOOLS_TRUE@atf_report_fail_helper_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_report_misc_helpers_SOURCES = atf-report/misc_helpers.cpp @ENABLE_TOOLS_TRUE@atf_report_misc_helpers_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_report_pass_helper_SOURCES = atf-report/pass_helper.cpp @ENABLE_TOOLS_TRUE@atf_report_pass_helper_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@tests_atf_report_SCRIPTS = atf-report/integration_test @ENABLE_TOOLS_TRUE@atf_report_reader_test_SOURCES = atf-report/reader_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-report/reader.cpp @ENABLE_TOOLS_TRUE@atf_report_reader_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail @ENABLE_TOOLS_TRUE@atf_report_reader_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_config_atf_config_SOURCES = atf-config/atf-config.cpp @ENABLE_TOOLS_TRUE@atf_config_atf_config_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@tests_atf_config_DATA = atf-config/Atffile \ @ENABLE_TOOLS_TRUE@ atf-config/Kyuafile @ENABLE_TOOLS_TRUE@tests_atf_configdir = $(pkgtestsdir)/atf-config @ENABLE_TOOLS_TRUE@tests_atf_config_SCRIPTS = atf-config/integration_test @ENABLE_TOOLS_TRUE@atf_run_atf_run_CPPFLAGS = "-DGDB=\"$(GDB)\"" @ENABLE_TOOLS_TRUE@atf_run_atf_run_SOURCES = atf-run/atf-run.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/atffile.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/atffile.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/config.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/config.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/fs.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/fs.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/io.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/io.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/requirements.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/requirements.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/signals.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/signals.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/test-program.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/test-program.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/timer.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/timer.hpp \ @ENABLE_TOOLS_TRUE@ atf-run/user.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/user.hpp @ENABLE_TOOLS_TRUE@atf_run_atf_run_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@tests_atf_run_DATA = atf-run/Atffile \ @ENABLE_TOOLS_TRUE@ atf-run/Kyuafile @ENABLE_TOOLS_TRUE@tests_atf_rundir = $(pkgtestsdir)/atf-run @ENABLE_TOOLS_TRUE@atf_run_atffile_test_SOURCES = atf-run/atffile_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/atffile.cpp @ENABLE_TOOLS_TRUE@atf_run_atffile_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail @ENABLE_TOOLS_TRUE@atf_run_atffile_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_bad_metadata_helper_SOURCES = atf-run/bad_metadata_helper.c @ENABLE_TOOLS_TRUE@atf_run_bad_metadata_helper_LDADD = libatf-c.la @ENABLE_TOOLS_TRUE@atf_run_config_test_SOURCES = atf-run/config_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/config.cpp @ENABLE_TOOLS_TRUE@atf_run_config_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail @ENABLE_TOOLS_TRUE@atf_run_config_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_expect_helpers_SOURCES = atf-run/expect_helpers.c @ENABLE_TOOLS_TRUE@atf_run_expect_helpers_LDADD = libatf-c.la @ENABLE_TOOLS_TRUE@atf_run_fs_test_SOURCES = atf-run/fs_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/fs.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/user.cpp @ENABLE_TOOLS_TRUE@atf_run_fs_test_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_io_test_SOURCES = atf-run/io_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/io.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/signals.cpp @ENABLE_TOOLS_TRUE@atf_run_io_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_misc_helpers_SOURCES = atf-run/misc_helpers.cpp @ENABLE_TOOLS_TRUE@atf_run_misc_helpers_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_pass_helper_SOURCES = atf-run/pass_helper.cpp @ENABLE_TOOLS_TRUE@atf_run_pass_helper_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_several_tcs_helper_SOURCES = atf-run/several_tcs_helper.c @ENABLE_TOOLS_TRUE@atf_run_several_tcs_helper_LDADD = libatf-c.la @ENABLE_TOOLS_TRUE@atf_run_requirements_test_SOURCES = atf-run/requirements_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/requirements.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/user.cpp @ENABLE_TOOLS_TRUE@atf_run_requirements_test_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_signals_test_SOURCES = atf-run/signals_test.cpp atf-run/signals.cpp @ENABLE_TOOLS_TRUE@atf_run_signals_test_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_test_program_test_SOURCES = atf-run/test_program_test.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/fs.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/io.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/requirements.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/signals.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/test-program.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/timer.cpp \ @ENABLE_TOOLS_TRUE@ atf-run/user.cpp @ENABLE_TOOLS_TRUE@atf_run_test_program_test_CPPFLAGS = -I$(srcdir)/atf-c++/detail @ENABLE_TOOLS_TRUE@atf_run_test_program_test_LDADD = atf-c++/detail/libtest_helpers.la $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_user_test_SOURCES = atf-run/user_test.cpp atf-run/user.cpp @ENABLE_TOOLS_TRUE@atf_run_user_test_LDADD = $(ATF_CXX_LIBS) @ENABLE_TOOLS_TRUE@atf_run_zero_tcs_helper_SOURCES = atf-run/zero_tcs_helper.c @ENABLE_TOOLS_TRUE@atf_run_zero_tcs_helper_LDADD = libatf-c.la @ENABLE_TOOLS_TRUE@tests_atf_run_SCRIPTS = atf-run/integration_test @ENABLE_TOOLS_TRUE@hooksdir = $(pkgdatadir) @ENABLE_TOOLS_TRUE@hooks_DATA = atf-run/share/atf-run.hooks @ENABLE_TOOLS_TRUE@egdir = $(atf_egdir) @ENABLE_TOOLS_TRUE@eg_DATA = atf-run/sample/atf-run.hooks \ @ENABLE_TOOLS_TRUE@ atf-run/sample/common.conf @ENABLE_TOOLS_TRUE@atf_version_atf_version_SOURCES = atf-version/atf-version.cpp @ENABLE_TOOLS_TRUE@nodist_atf_version_atf_version_SOURCES = atf-version/revision.h @ENABLE_TOOLS_TRUE@atf_version_atf_version_CPPFLAGS = -Iatf-version @ENABLE_TOOLS_TRUE@atf_version_atf_version_LDADD = $(ATF_CXX_LIBS) # # Top-level distfile documents. # doc_DATA = AUTHORS COPYING NEWS README # # Supporting logic to run our custom testsuite. # TESTS_ENVIRONMENT = PATH=$(prefix)/bin:$${PATH} \ PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig testsdir = $(exec_prefix)/tests pkgtestsdir = $(testsdir)/$(PACKAGE) pkgtests_DATA = Kyuafile $(am__append_12) BUILD_SH_TP = \ echo "Creating $${dst}"; \ echo "\#! $(bindir)/atf-sh" >$${dst}; \ cat $${src} >>$${dst}; \ chmod +x $${dst} all: $(BUILT_SOURCES) bconfig.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/admin/Makefile.am.inc $(srcdir)/atf-c/Makefile.am.inc $(srcdir)/atf-c/detail/Makefile.am.inc $(srcdir)/atf-c++/Makefile.am.inc $(srcdir)/atf-c++/detail/Makefile.am.inc $(srcdir)/atf-sh/Makefile.am.inc $(srcdir)/bootstrap/Makefile.am.inc $(srcdir)/doc/Makefile.am.inc $(srcdir)/test-programs/Makefile.am.inc $(srcdir)/atf-report/Makefile.am.inc $(srcdir)/atf-config/Makefile.am.inc $(srcdir)/atf-run/Makefile.am.inc $(srcdir)/atf-version/Makefile.am.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/admin/Makefile.am.inc $(srcdir)/atf-c/Makefile.am.inc $(srcdir)/atf-c/detail/Makefile.am.inc $(srcdir)/atf-c++/Makefile.am.inc $(srcdir)/atf-c++/detail/Makefile.am.inc $(srcdir)/atf-sh/Makefile.am.inc $(srcdir)/bootstrap/Makefile.am.inc $(srcdir)/doc/Makefile.am.inc $(srcdir)/test-programs/Makefile.am.inc $(srcdir)/atf-report/Makefile.am.inc $(srcdir)/atf-config/Makefile.am.inc $(srcdir)/atf-run/Makefile.am.inc $(srcdir)/atf-version/Makefile.am.inc: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): bconfig.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/bconfig.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status bconfig.h $(srcdir)/bconfig.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f bconfig.h stamp-h1 atf-c/defs.h: $(top_builddir)/config.status $(top_srcdir)/atf-c/defs.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } atf-c++/detail/$(am__dirstamp): @$(MKDIR_P) atf-c++/detail @: > atf-c++/detail/$(am__dirstamp) atf-c++/detail/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-c++/detail/$(DEPDIR) @: > atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/test_helpers.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/libtest_helpers.la: $(atf_c___detail_libtest_helpers_la_OBJECTS) $(atf_c___detail_libtest_helpers_la_DEPENDENCIES) $(EXTRA_atf_c___detail_libtest_helpers_la_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) $(CXXLINK) $(atf_c___detail_libtest_helpers_la_OBJECTS) $(atf_c___detail_libtest_helpers_la_LIBADD) $(LIBS) atf-c/detail/$(am__dirstamp): @$(MKDIR_P) atf-c/detail @: > atf-c/detail/$(am__dirstamp) atf-c/detail/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-c/detail/$(DEPDIR) @: > atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo: \ atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libtest_helpers.la: $(atf_c_detail_libtest_helpers_la_OBJECTS) $(atf_c_detail_libtest_helpers_la_DEPENDENCIES) $(EXTRA_atf_c_detail_libtest_helpers_la_DEPENDENCIES) atf-c/detail/$(am__dirstamp) $(LINK) $(atf_c_detail_libtest_helpers_la_OBJECTS) $(atf_c_detail_libtest_helpers_la_LIBADD) $(LIBS) atf-c++/$(am__dirstamp): @$(MKDIR_P) atf-c++ @: > atf-c++/$(am__dirstamp) atf-c++/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-c++/$(DEPDIR) @: > atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/build.lo: atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/check.lo: atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/config.lo: atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/tests.lo: atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/utils.lo: atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/application.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/env.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/exceptions.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/expand.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/fs.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/parser.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/process.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/text.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/ui.lo: atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) libatf-c++.la: $(libatf_c___la_OBJECTS) $(libatf_c___la_DEPENDENCIES) $(EXTRA_libatf_c___la_DEPENDENCIES) $(libatf_c___la_LINK) -rpath $(libdir) $(libatf_c___la_OBJECTS) $(libatf_c___la_LIBADD) $(LIBS) atf-c/$(am__dirstamp): @$(MKDIR_P) atf-c @: > atf-c/$(am__dirstamp) atf-c/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-c/$(DEPDIR) @: > atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-build.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-check.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-config.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-error.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-tc.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-tp.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/libatf_c_la-utils.lo: atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-dynstr.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-env.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-fs.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-list.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-map.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-process.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-sanity.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-text.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-tp_main.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/libatf_c_la-user.lo: atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) libatf-c.la: $(libatf_c_la_OBJECTS) $(libatf_c_la_DEPENDENCIES) $(EXTRA_libatf_c_la_DEPENDENCIES) $(libatf_c_la_LINK) -rpath $(libdir) $(libatf_c_la_OBJECTS) $(libatf_c_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ } \ ; done uninstall-libexecPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files clean-libexecPROGRAMS: @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_cPROGRAMS: $(tests_atf_c_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_c_PROGRAMS)'; test -n "$(tests_atf_cdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_cdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_cdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_cdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_cdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_cPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c_PROGRAMS)'; test -n "$(tests_atf_cdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_cdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_cdir)" && rm -f $$files clean-tests_atf_cPROGRAMS: @list='$(tests_atf_c_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_c__PROGRAMS: $(tests_atf_c___PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_c___PROGRAMS)'; test -n "$(tests_atf_c__dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c__dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c__dir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_c__dir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_c__dir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_c__PROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c___PROGRAMS)'; test -n "$(tests_atf_c__dir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_c__dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_c__dir)" && rm -f $$files clean-tests_atf_c__PROGRAMS: @list='$(tests_atf_c___PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_c___detailPROGRAMS: $(tests_atf_c___detail_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_c___detail_PROGRAMS)'; test -n "$(tests_atf_c___detaildir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c___detaildir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c___detaildir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_c___detaildir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_c___detaildir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_c___detailPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c___detail_PROGRAMS)'; test -n "$(tests_atf_c___detaildir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_c___detaildir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_c___detaildir)" && rm -f $$files clean-tests_atf_c___detailPROGRAMS: @list='$(tests_atf_c___detail_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_c_detailPROGRAMS: $(tests_atf_c_detail_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_c_detail_PROGRAMS)'; test -n "$(tests_atf_c_detaildir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c_detaildir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c_detaildir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_c_detaildir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_c_detaildir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_c_detailPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c_detail_PROGRAMS)'; test -n "$(tests_atf_c_detaildir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_c_detaildir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_c_detaildir)" && rm -f $$files clean-tests_atf_c_detailPROGRAMS: @list='$(tests_atf_c_detail_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_reportPROGRAMS: $(tests_atf_report_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_report_PROGRAMS)'; test -n "$(tests_atf_reportdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_reportdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_reportdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_reportdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_reportdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_reportPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_report_PROGRAMS)'; test -n "$(tests_atf_reportdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_reportdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_reportdir)" && rm -f $$files clean-tests_atf_reportPROGRAMS: @list='$(tests_atf_report_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_atf_runPROGRAMS: $(tests_atf_run_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_atf_run_PROGRAMS)'; test -n "$(tests_atf_rundir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_rundir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_rundir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_atf_rundir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_atf_rundir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_runPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_run_PROGRAMS)'; test -n "$(tests_atf_rundir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_atf_rundir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_atf_rundir)" && rm -f $$files clean-tests_atf_runPROGRAMS: @list='$(tests_atf_run_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-tests_test_programsPROGRAMS: $(tests_test_programs_PROGRAMS) @$(NORMAL_INSTALL) @list='$(tests_test_programs_PROGRAMS)'; test -n "$(tests_test_programsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_test_programsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_test_programsdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tests_test_programsdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tests_test_programsdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_test_programsPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(tests_test_programs_PROGRAMS)'; test -n "$(tests_test_programsdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(tests_test_programsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tests_test_programsdir)" && rm -f $$files clean-tests_test_programsPROGRAMS: @list='$(tests_test_programs_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list atf-c++/atf_c++_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/atf_c++_test$(EXEEXT): $(atf_c___atf_c___test_OBJECTS) $(atf_c___atf_c___test_DEPENDENCIES) $(EXTRA_atf_c___atf_c___test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/atf_c++_test$(EXEEXT) $(CXXLINK) $(atf_c___atf_c___test_OBJECTS) $(atf_c___atf_c___test_LDADD) $(LIBS) atf-c++/build_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/build_test$(EXEEXT): $(atf_c___build_test_OBJECTS) $(atf_c___build_test_DEPENDENCIES) $(EXTRA_atf_c___build_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/build_test$(EXEEXT) $(CXXLINK) $(atf_c___build_test_OBJECTS) $(atf_c___build_test_LDADD) $(LIBS) atf-c++/check_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/check_test$(EXEEXT): $(atf_c___check_test_OBJECTS) $(atf_c___check_test_DEPENDENCIES) $(EXTRA_atf_c___check_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/check_test$(EXEEXT) $(CXXLINK) $(atf_c___check_test_OBJECTS) $(atf_c___check_test_LDADD) $(LIBS) atf-c++/config_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/config_test$(EXEEXT): $(atf_c___config_test_OBJECTS) $(atf_c___config_test_DEPENDENCIES) $(EXTRA_atf_c___config_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/config_test$(EXEEXT) $(CXXLINK) $(atf_c___config_test_OBJECTS) $(atf_c___config_test_LDADD) $(LIBS) atf-c++/detail/application_test.$(OBJEXT): \ atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/application_test$(EXEEXT): $(atf_c___detail_application_test_OBJECTS) $(atf_c___detail_application_test_DEPENDENCIES) $(EXTRA_atf_c___detail_application_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/application_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_application_test_OBJECTS) $(atf_c___detail_application_test_LDADD) $(LIBS) atf-c++/detail/auto_array_test.$(OBJEXT): \ atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/auto_array_test$(EXEEXT): $(atf_c___detail_auto_array_test_OBJECTS) $(atf_c___detail_auto_array_test_DEPENDENCIES) $(EXTRA_atf_c___detail_auto_array_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/auto_array_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_auto_array_test_OBJECTS) $(atf_c___detail_auto_array_test_LDADD) $(LIBS) atf-c++/detail/env_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/env_test$(EXEEXT): $(atf_c___detail_env_test_OBJECTS) $(atf_c___detail_env_test_DEPENDENCIES) $(EXTRA_atf_c___detail_env_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/env_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_env_test_OBJECTS) $(atf_c___detail_env_test_LDADD) $(LIBS) atf-c++/detail/exceptions_test.$(OBJEXT): \ atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/exceptions_test$(EXEEXT): $(atf_c___detail_exceptions_test_OBJECTS) $(atf_c___detail_exceptions_test_DEPENDENCIES) $(EXTRA_atf_c___detail_exceptions_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/exceptions_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_exceptions_test_OBJECTS) $(atf_c___detail_exceptions_test_LDADD) $(LIBS) atf-c++/detail/expand_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/expand_test$(EXEEXT): $(atf_c___detail_expand_test_OBJECTS) $(atf_c___detail_expand_test_DEPENDENCIES) $(EXTRA_atf_c___detail_expand_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/expand_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_expand_test_OBJECTS) $(atf_c___detail_expand_test_LDADD) $(LIBS) atf-c++/detail/fs_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/fs_test$(EXEEXT): $(atf_c___detail_fs_test_OBJECTS) $(atf_c___detail_fs_test_DEPENDENCIES) $(EXTRA_atf_c___detail_fs_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/fs_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_fs_test_OBJECTS) $(atf_c___detail_fs_test_LDADD) $(LIBS) atf-c++/detail/parser_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/parser_test$(EXEEXT): $(atf_c___detail_parser_test_OBJECTS) $(atf_c___detail_parser_test_DEPENDENCIES) $(EXTRA_atf_c___detail_parser_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/parser_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_parser_test_OBJECTS) $(atf_c___detail_parser_test_LDADD) $(LIBS) atf-c++/detail/process_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/process_test$(EXEEXT): $(atf_c___detail_process_test_OBJECTS) $(atf_c___detail_process_test_DEPENDENCIES) $(EXTRA_atf_c___detail_process_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/process_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_process_test_OBJECTS) $(atf_c___detail_process_test_LDADD) $(LIBS) atf-c++/detail/sanity_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/sanity_test$(EXEEXT): $(atf_c___detail_sanity_test_OBJECTS) $(atf_c___detail_sanity_test_DEPENDENCIES) $(EXTRA_atf_c___detail_sanity_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/sanity_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_sanity_test_OBJECTS) $(atf_c___detail_sanity_test_LDADD) $(LIBS) atf-c++/detail/text_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/text_test$(EXEEXT): $(atf_c___detail_text_test_OBJECTS) $(atf_c___detail_text_test_DEPENDENCIES) $(EXTRA_atf_c___detail_text_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/text_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_text_test_OBJECTS) $(atf_c___detail_text_test_LDADD) $(LIBS) atf-c++/detail/ui_test.$(OBJEXT): atf-c++/detail/$(am__dirstamp) \ atf-c++/detail/$(DEPDIR)/$(am__dirstamp) atf-c++/detail/ui_test$(EXEEXT): $(atf_c___detail_ui_test_OBJECTS) $(atf_c___detail_ui_test_DEPENDENCIES) $(EXTRA_atf_c___detail_ui_test_DEPENDENCIES) atf-c++/detail/$(am__dirstamp) @rm -f atf-c++/detail/ui_test$(EXEEXT) $(CXXLINK) $(atf_c___detail_ui_test_OBJECTS) $(atf_c___detail_ui_test_LDADD) $(LIBS) atf-c++/macros_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/macros_test$(EXEEXT): $(atf_c___macros_test_OBJECTS) $(atf_c___macros_test_DEPENDENCIES) $(EXTRA_atf_c___macros_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/macros_test$(EXEEXT) $(CXXLINK) $(atf_c___macros_test_OBJECTS) $(atf_c___macros_test_LDADD) $(LIBS) atf-c++/tests_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/tests_test$(EXEEXT): $(atf_c___tests_test_OBJECTS) $(atf_c___tests_test_DEPENDENCIES) $(EXTRA_atf_c___tests_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/tests_test$(EXEEXT) $(CXXLINK) $(atf_c___tests_test_OBJECTS) $(atf_c___tests_test_LDADD) $(LIBS) atf-c++/utils_test.$(OBJEXT): atf-c++/$(am__dirstamp) \ atf-c++/$(DEPDIR)/$(am__dirstamp) atf-c++/utils_test$(EXEEXT): $(atf_c___utils_test_OBJECTS) $(atf_c___utils_test_DEPENDENCIES) $(EXTRA_atf_c___utils_test_DEPENDENCIES) atf-c++/$(am__dirstamp) @rm -f atf-c++/utils_test$(EXEEXT) $(CXXLINK) $(atf_c___utils_test_OBJECTS) $(atf_c___utils_test_LDADD) $(LIBS) atf-c/atf_c_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/atf_c_test$(EXEEXT): $(atf_c_atf_c_test_OBJECTS) $(atf_c_atf_c_test_DEPENDENCIES) $(EXTRA_atf_c_atf_c_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/atf_c_test$(EXEEXT) $(LINK) $(atf_c_atf_c_test_OBJECTS) $(atf_c_atf_c_test_LDADD) $(LIBS) atf-c/build_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/build_test$(EXEEXT): $(atf_c_build_test_OBJECTS) $(atf_c_build_test_DEPENDENCIES) $(EXTRA_atf_c_build_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/build_test$(EXEEXT) $(LINK) $(atf_c_build_test_OBJECTS) $(atf_c_build_test_LDADD) $(LIBS) atf-c/check_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/check_test$(EXEEXT): $(atf_c_check_test_OBJECTS) $(atf_c_check_test_DEPENDENCIES) $(EXTRA_atf_c_check_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/check_test$(EXEEXT) $(LINK) $(atf_c_check_test_OBJECTS) $(atf_c_check_test_LDADD) $(LIBS) atf-c/config_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/config_test$(EXEEXT): $(atf_c_config_test_OBJECTS) $(atf_c_config_test_DEPENDENCIES) $(EXTRA_atf_c_config_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/config_test$(EXEEXT) $(LINK) $(atf_c_config_test_OBJECTS) $(atf_c_config_test_LDADD) $(LIBS) atf-c/detail/dynstr_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/dynstr_test$(EXEEXT): $(atf_c_detail_dynstr_test_OBJECTS) $(atf_c_detail_dynstr_test_DEPENDENCIES) $(EXTRA_atf_c_detail_dynstr_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/dynstr_test$(EXEEXT) $(LINK) $(atf_c_detail_dynstr_test_OBJECTS) $(atf_c_detail_dynstr_test_LDADD) $(LIBS) atf-c/detail/env_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/env_test$(EXEEXT): $(atf_c_detail_env_test_OBJECTS) $(atf_c_detail_env_test_DEPENDENCIES) $(EXTRA_atf_c_detail_env_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/env_test$(EXEEXT) $(LINK) $(atf_c_detail_env_test_OBJECTS) $(atf_c_detail_env_test_LDADD) $(LIBS) atf-c/detail/fs_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/fs_test$(EXEEXT): $(atf_c_detail_fs_test_OBJECTS) $(atf_c_detail_fs_test_DEPENDENCIES) $(EXTRA_atf_c_detail_fs_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/fs_test$(EXEEXT) $(LINK) $(atf_c_detail_fs_test_OBJECTS) $(atf_c_detail_fs_test_LDADD) $(LIBS) atf-c/detail/list_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/list_test$(EXEEXT): $(atf_c_detail_list_test_OBJECTS) $(atf_c_detail_list_test_DEPENDENCIES) $(EXTRA_atf_c_detail_list_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/list_test$(EXEEXT) $(LINK) $(atf_c_detail_list_test_OBJECTS) $(atf_c_detail_list_test_LDADD) $(LIBS) atf-c/detail/map_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/map_test$(EXEEXT): $(atf_c_detail_map_test_OBJECTS) $(atf_c_detail_map_test_DEPENDENCIES) $(EXTRA_atf_c_detail_map_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/map_test$(EXEEXT) $(LINK) $(atf_c_detail_map_test_OBJECTS) $(atf_c_detail_map_test_LDADD) $(LIBS) atf-c/detail/process_helpers.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/process_helpers$(EXEEXT): $(atf_c_detail_process_helpers_OBJECTS) $(atf_c_detail_process_helpers_DEPENDENCIES) $(EXTRA_atf_c_detail_process_helpers_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/process_helpers$(EXEEXT) $(LINK) $(atf_c_detail_process_helpers_OBJECTS) $(atf_c_detail_process_helpers_LDADD) $(LIBS) atf-c/detail/process_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/process_test$(EXEEXT): $(atf_c_detail_process_test_OBJECTS) $(atf_c_detail_process_test_DEPENDENCIES) $(EXTRA_atf_c_detail_process_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/process_test$(EXEEXT) $(LINK) $(atf_c_detail_process_test_OBJECTS) $(atf_c_detail_process_test_LDADD) $(LIBS) atf-c/detail/sanity_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/sanity_test$(EXEEXT): $(atf_c_detail_sanity_test_OBJECTS) $(atf_c_detail_sanity_test_DEPENDENCIES) $(EXTRA_atf_c_detail_sanity_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/sanity_test$(EXEEXT) $(LINK) $(atf_c_detail_sanity_test_OBJECTS) $(atf_c_detail_sanity_test_LDADD) $(LIBS) atf-c/detail/text_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/text_test$(EXEEXT): $(atf_c_detail_text_test_OBJECTS) $(atf_c_detail_text_test_DEPENDENCIES) $(EXTRA_atf_c_detail_text_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/text_test$(EXEEXT) $(LINK) $(atf_c_detail_text_test_OBJECTS) $(atf_c_detail_text_test_LDADD) $(LIBS) atf-c/detail/user_test.$(OBJEXT): atf-c/detail/$(am__dirstamp) \ atf-c/detail/$(DEPDIR)/$(am__dirstamp) atf-c/detail/user_test$(EXEEXT): $(atf_c_detail_user_test_OBJECTS) $(atf_c_detail_user_test_DEPENDENCIES) $(EXTRA_atf_c_detail_user_test_DEPENDENCIES) atf-c/detail/$(am__dirstamp) @rm -f atf-c/detail/user_test$(EXEEXT) $(LINK) $(atf_c_detail_user_test_OBJECTS) $(atf_c_detail_user_test_LDADD) $(LIBS) atf-c/error_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/error_test$(EXEEXT): $(atf_c_error_test_OBJECTS) $(atf_c_error_test_DEPENDENCIES) $(EXTRA_atf_c_error_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/error_test$(EXEEXT) $(LINK) $(atf_c_error_test_OBJECTS) $(atf_c_error_test_LDADD) $(LIBS) atf-c/macros_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/macros_test$(EXEEXT): $(atf_c_macros_test_OBJECTS) $(atf_c_macros_test_DEPENDENCIES) $(EXTRA_atf_c_macros_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/macros_test$(EXEEXT) $(LINK) $(atf_c_macros_test_OBJECTS) $(atf_c_macros_test_LDADD) $(LIBS) atf-c/tc_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/tc_test$(EXEEXT): $(atf_c_tc_test_OBJECTS) $(atf_c_tc_test_DEPENDENCIES) $(EXTRA_atf_c_tc_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/tc_test$(EXEEXT) $(LINK) $(atf_c_tc_test_OBJECTS) $(atf_c_tc_test_LDADD) $(LIBS) atf-c/tp_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/tp_test$(EXEEXT): $(atf_c_tp_test_OBJECTS) $(atf_c_tp_test_DEPENDENCIES) $(EXTRA_atf_c_tp_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/tp_test$(EXEEXT) $(LINK) $(atf_c_tp_test_OBJECTS) $(atf_c_tp_test_LDADD) $(LIBS) atf-c/utils_test.$(OBJEXT): atf-c/$(am__dirstamp) \ atf-c/$(DEPDIR)/$(am__dirstamp) atf-c/utils_test$(EXEEXT): $(atf_c_utils_test_OBJECTS) $(atf_c_utils_test_DEPENDENCIES) $(EXTRA_atf_c_utils_test_DEPENDENCIES) atf-c/$(am__dirstamp) @rm -f atf-c/utils_test$(EXEEXT) $(LINK) $(atf_c_utils_test_OBJECTS) $(atf_c_utils_test_LDADD) $(LIBS) atf-config/$(am__dirstamp): @$(MKDIR_P) atf-config @: > atf-config/$(am__dirstamp) atf-config/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-config/$(DEPDIR) @: > atf-config/$(DEPDIR)/$(am__dirstamp) atf-config/atf-config.$(OBJEXT): atf-config/$(am__dirstamp) \ atf-config/$(DEPDIR)/$(am__dirstamp) atf-config/atf-config$(EXEEXT): $(atf_config_atf_config_OBJECTS) $(atf_config_atf_config_DEPENDENCIES) $(EXTRA_atf_config_atf_config_DEPENDENCIES) atf-config/$(am__dirstamp) @rm -f atf-config/atf-config$(EXEEXT) $(CXXLINK) $(atf_config_atf_config_OBJECTS) $(atf_config_atf_config_LDADD) $(LIBS) atf-report/$(am__dirstamp): @$(MKDIR_P) atf-report @: > atf-report/$(am__dirstamp) atf-report/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-report/$(DEPDIR) @: > atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/atf-report.$(OBJEXT): atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/reader.$(OBJEXT): atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/atf-report$(EXEEXT): $(atf_report_atf_report_OBJECTS) $(atf_report_atf_report_DEPENDENCIES) $(EXTRA_atf_report_atf_report_DEPENDENCIES) atf-report/$(am__dirstamp) @rm -f atf-report/atf-report$(EXEEXT) $(CXXLINK) $(atf_report_atf_report_OBJECTS) $(atf_report_atf_report_LDADD) $(LIBS) atf-report/fail_helper.$(OBJEXT): atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/fail_helper$(EXEEXT): $(atf_report_fail_helper_OBJECTS) $(atf_report_fail_helper_DEPENDENCIES) $(EXTRA_atf_report_fail_helper_DEPENDENCIES) atf-report/$(am__dirstamp) @rm -f atf-report/fail_helper$(EXEEXT) $(CXXLINK) $(atf_report_fail_helper_OBJECTS) $(atf_report_fail_helper_LDADD) $(LIBS) atf-report/misc_helpers.$(OBJEXT): atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/misc_helpers$(EXEEXT): $(atf_report_misc_helpers_OBJECTS) $(atf_report_misc_helpers_DEPENDENCIES) $(EXTRA_atf_report_misc_helpers_DEPENDENCIES) atf-report/$(am__dirstamp) @rm -f atf-report/misc_helpers$(EXEEXT) $(CXXLINK) $(atf_report_misc_helpers_OBJECTS) $(atf_report_misc_helpers_LDADD) $(LIBS) atf-report/pass_helper.$(OBJEXT): atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/pass_helper$(EXEEXT): $(atf_report_pass_helper_OBJECTS) $(atf_report_pass_helper_DEPENDENCIES) $(EXTRA_atf_report_pass_helper_DEPENDENCIES) atf-report/$(am__dirstamp) @rm -f atf-report/pass_helper$(EXEEXT) $(CXXLINK) $(atf_report_pass_helper_OBJECTS) $(atf_report_pass_helper_LDADD) $(LIBS) atf-report/atf_report_reader_test-reader_test.$(OBJEXT): \ atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/atf_report_reader_test-reader.$(OBJEXT): \ atf-report/$(am__dirstamp) \ atf-report/$(DEPDIR)/$(am__dirstamp) atf-report/reader_test$(EXEEXT): $(atf_report_reader_test_OBJECTS) $(atf_report_reader_test_DEPENDENCIES) $(EXTRA_atf_report_reader_test_DEPENDENCIES) atf-report/$(am__dirstamp) @rm -f atf-report/reader_test$(EXEEXT) $(CXXLINK) $(atf_report_reader_test_OBJECTS) $(atf_report_reader_test_LDADD) $(LIBS) atf-run/$(am__dirstamp): @$(MKDIR_P) atf-run @: > atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-run/$(DEPDIR) @: > atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-atf-run.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-atffile.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-config.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-fs.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-io.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-requirements.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-signals.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-test-program.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-timer.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atf_run-user.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf-run$(EXEEXT): $(atf_run_atf_run_OBJECTS) $(atf_run_atf_run_DEPENDENCIES) $(EXTRA_atf_run_atf_run_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/atf-run$(EXEEXT) $(CXXLINK) $(atf_run_atf_run_OBJECTS) $(atf_run_atf_run_LDADD) $(LIBS) atf-run/atf_run_atffile_test-atffile_test.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_atffile_test-atffile.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atffile_test$(EXEEXT): $(atf_run_atffile_test_OBJECTS) $(atf_run_atffile_test_DEPENDENCIES) $(EXTRA_atf_run_atffile_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/atffile_test$(EXEEXT) $(CXXLINK) $(atf_run_atffile_test_OBJECTS) $(atf_run_atffile_test_LDADD) $(LIBS) atf-run/bad_metadata_helper.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/bad_metadata_helper$(EXEEXT): $(atf_run_bad_metadata_helper_OBJECTS) $(atf_run_bad_metadata_helper_DEPENDENCIES) $(EXTRA_atf_run_bad_metadata_helper_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/bad_metadata_helper$(EXEEXT) $(LINK) $(atf_run_bad_metadata_helper_OBJECTS) $(atf_run_bad_metadata_helper_LDADD) $(LIBS) atf-run/atf_run_config_test-config_test.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_config_test-config.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/config_test$(EXEEXT): $(atf_run_config_test_OBJECTS) $(atf_run_config_test_DEPENDENCIES) $(EXTRA_atf_run_config_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/config_test$(EXEEXT) $(CXXLINK) $(atf_run_config_test_OBJECTS) $(atf_run_config_test_LDADD) $(LIBS) atf-run/expect_helpers.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/expect_helpers$(EXEEXT): $(atf_run_expect_helpers_OBJECTS) $(atf_run_expect_helpers_DEPENDENCIES) $(EXTRA_atf_run_expect_helpers_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/expect_helpers$(EXEEXT) $(LINK) $(atf_run_expect_helpers_OBJECTS) $(atf_run_expect_helpers_LDADD) $(LIBS) atf-run/fs_test.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/fs.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/user.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/fs_test$(EXEEXT): $(atf_run_fs_test_OBJECTS) $(atf_run_fs_test_DEPENDENCIES) $(EXTRA_atf_run_fs_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/fs_test$(EXEEXT) $(CXXLINK) $(atf_run_fs_test_OBJECTS) $(atf_run_fs_test_LDADD) $(LIBS) atf-run/io_test.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/io.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/signals.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/io_test$(EXEEXT): $(atf_run_io_test_OBJECTS) $(atf_run_io_test_DEPENDENCIES) $(EXTRA_atf_run_io_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/io_test$(EXEEXT) $(CXXLINK) $(atf_run_io_test_OBJECTS) $(atf_run_io_test_LDADD) $(LIBS) atf-run/misc_helpers.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/misc_helpers$(EXEEXT): $(atf_run_misc_helpers_OBJECTS) $(atf_run_misc_helpers_DEPENDENCIES) $(EXTRA_atf_run_misc_helpers_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/misc_helpers$(EXEEXT) $(CXXLINK) $(atf_run_misc_helpers_OBJECTS) $(atf_run_misc_helpers_LDADD) $(LIBS) atf-run/pass_helper.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/pass_helper$(EXEEXT): $(atf_run_pass_helper_OBJECTS) $(atf_run_pass_helper_DEPENDENCIES) $(EXTRA_atf_run_pass_helper_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/pass_helper$(EXEEXT) $(CXXLINK) $(atf_run_pass_helper_OBJECTS) $(atf_run_pass_helper_LDADD) $(LIBS) atf-run/requirements_test.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/requirements.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/requirements_test$(EXEEXT): $(atf_run_requirements_test_OBJECTS) $(atf_run_requirements_test_DEPENDENCIES) $(EXTRA_atf_run_requirements_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/requirements_test$(EXEEXT) $(CXXLINK) $(atf_run_requirements_test_OBJECTS) $(atf_run_requirements_test_LDADD) $(LIBS) atf-run/several_tcs_helper.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/several_tcs_helper$(EXEEXT): $(atf_run_several_tcs_helper_OBJECTS) $(atf_run_several_tcs_helper_DEPENDENCIES) $(EXTRA_atf_run_several_tcs_helper_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/several_tcs_helper$(EXEEXT) $(LINK) $(atf_run_several_tcs_helper_OBJECTS) $(atf_run_several_tcs_helper_LDADD) $(LIBS) atf-run/signals_test.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/signals_test$(EXEEXT): $(atf_run_signals_test_OBJECTS) $(atf_run_signals_test_DEPENDENCIES) $(EXTRA_atf_run_signals_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/signals_test$(EXEEXT) $(CXXLINK) $(atf_run_signals_test_OBJECTS) $(atf_run_signals_test_LDADD) $(LIBS) atf-run/atf_run_test_program_test-test_program_test.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-fs.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-io.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-requirements.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-signals.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-test-program.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-timer.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/atf_run_test_program_test-user.$(OBJEXT): \ atf-run/$(am__dirstamp) atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/test_program_test$(EXEEXT): $(atf_run_test_program_test_OBJECTS) $(atf_run_test_program_test_DEPENDENCIES) $(EXTRA_atf_run_test_program_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/test_program_test$(EXEEXT) $(CXXLINK) $(atf_run_test_program_test_OBJECTS) $(atf_run_test_program_test_LDADD) $(LIBS) atf-run/user_test.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/user_test$(EXEEXT): $(atf_run_user_test_OBJECTS) $(atf_run_user_test_DEPENDENCIES) $(EXTRA_atf_run_user_test_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/user_test$(EXEEXT) $(CXXLINK) $(atf_run_user_test_OBJECTS) $(atf_run_user_test_LDADD) $(LIBS) atf-run/zero_tcs_helper.$(OBJEXT): atf-run/$(am__dirstamp) \ atf-run/$(DEPDIR)/$(am__dirstamp) atf-run/zero_tcs_helper$(EXEEXT): $(atf_run_zero_tcs_helper_OBJECTS) $(atf_run_zero_tcs_helper_DEPENDENCIES) $(EXTRA_atf_run_zero_tcs_helper_DEPENDENCIES) atf-run/$(am__dirstamp) @rm -f atf-run/zero_tcs_helper$(EXEEXT) $(LINK) $(atf_run_zero_tcs_helper_OBJECTS) $(atf_run_zero_tcs_helper_LDADD) $(LIBS) atf-sh/$(am__dirstamp): @$(MKDIR_P) atf-sh @: > atf-sh/$(am__dirstamp) atf-sh/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-sh/$(DEPDIR) @: > atf-sh/$(DEPDIR)/$(am__dirstamp) atf-sh/atf-check.$(OBJEXT): atf-sh/$(am__dirstamp) \ atf-sh/$(DEPDIR)/$(am__dirstamp) atf-sh/atf-check$(EXEEXT): $(atf_sh_atf_check_OBJECTS) $(atf_sh_atf_check_DEPENDENCIES) $(EXTRA_atf_sh_atf_check_DEPENDENCIES) atf-sh/$(am__dirstamp) @rm -f atf-sh/atf-check$(EXEEXT) $(CXXLINK) $(atf_sh_atf_check_OBJECTS) $(atf_sh_atf_check_LDADD) $(LIBS) atf-sh/atf-sh.$(OBJEXT): atf-sh/$(am__dirstamp) \ atf-sh/$(DEPDIR)/$(am__dirstamp) atf-sh/atf-sh$(EXEEXT): $(atf_sh_atf_sh_OBJECTS) $(atf_sh_atf_sh_DEPENDENCIES) $(EXTRA_atf_sh_atf_sh_DEPENDENCIES) atf-sh/$(am__dirstamp) @rm -f atf-sh/atf-sh$(EXEEXT) $(CXXLINK) $(atf_sh_atf_sh_OBJECTS) $(atf_sh_atf_sh_LDADD) $(LIBS) atf-version/$(am__dirstamp): @$(MKDIR_P) atf-version @: > atf-version/$(am__dirstamp) atf-version/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) atf-version/$(DEPDIR) @: > atf-version/$(DEPDIR)/$(am__dirstamp) atf-version/atf_version_atf_version-atf-version.$(OBJEXT): \ atf-version/$(am__dirstamp) \ atf-version/$(DEPDIR)/$(am__dirstamp) atf-version/atf-version$(EXEEXT): $(atf_version_atf_version_OBJECTS) $(atf_version_atf_version_DEPENDENCIES) $(EXTRA_atf_version_atf_version_DEPENDENCIES) atf-version/$(am__dirstamp) @rm -f atf-version/atf-version$(EXEEXT) $(CXXLINK) $(atf_version_atf_version_OBJECTS) $(atf_version_atf_version_LDADD) $(LIBS) bootstrap/$(am__dirstamp): @$(MKDIR_P) bootstrap @: > bootstrap/$(am__dirstamp) bootstrap/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) bootstrap/$(DEPDIR) @: > bootstrap/$(DEPDIR)/$(am__dirstamp) bootstrap/h_app_empty.$(OBJEXT): bootstrap/$(am__dirstamp) \ bootstrap/$(DEPDIR)/$(am__dirstamp) bootstrap/h_app_empty$(EXEEXT): $(bootstrap_h_app_empty_OBJECTS) $(bootstrap_h_app_empty_DEPENDENCIES) $(EXTRA_bootstrap_h_app_empty_DEPENDENCIES) bootstrap/$(am__dirstamp) @rm -f bootstrap/h_app_empty$(EXEEXT) $(CXXLINK) $(bootstrap_h_app_empty_OBJECTS) $(bootstrap_h_app_empty_LDADD) $(LIBS) bootstrap/h_app_opts_args.$(OBJEXT): bootstrap/$(am__dirstamp) \ bootstrap/$(DEPDIR)/$(am__dirstamp) bootstrap/h_app_opts_args$(EXEEXT): $(bootstrap_h_app_opts_args_OBJECTS) $(bootstrap_h_app_opts_args_DEPENDENCIES) $(EXTRA_bootstrap_h_app_opts_args_DEPENDENCIES) bootstrap/$(am__dirstamp) @rm -f bootstrap/h_app_opts_args$(EXEEXT) $(CXXLINK) $(bootstrap_h_app_opts_args_OBJECTS) $(bootstrap_h_app_opts_args_LDADD) $(LIBS) bootstrap/h_tp_basic_c.$(OBJEXT): bootstrap/$(am__dirstamp) \ bootstrap/$(DEPDIR)/$(am__dirstamp) bootstrap/h_tp_basic_c$(EXEEXT): $(bootstrap_h_tp_basic_c_OBJECTS) $(bootstrap_h_tp_basic_c_DEPENDENCIES) $(EXTRA_bootstrap_h_tp_basic_c_DEPENDENCIES) bootstrap/$(am__dirstamp) @rm -f bootstrap/h_tp_basic_c$(EXEEXT) $(LINK) $(bootstrap_h_tp_basic_c_OBJECTS) $(bootstrap_h_tp_basic_c_LDADD) $(LIBS) bootstrap/h_tp_basic_cpp.$(OBJEXT): bootstrap/$(am__dirstamp) \ bootstrap/$(DEPDIR)/$(am__dirstamp) bootstrap/h_tp_basic_cpp$(EXEEXT): $(bootstrap_h_tp_basic_cpp_OBJECTS) $(bootstrap_h_tp_basic_cpp_DEPENDENCIES) $(EXTRA_bootstrap_h_tp_basic_cpp_DEPENDENCIES) bootstrap/$(am__dirstamp) @rm -f bootstrap/h_tp_basic_cpp$(EXEEXT) $(CXXLINK) $(bootstrap_h_tp_basic_cpp_OBJECTS) $(bootstrap_h_tp_basic_cpp_LDADD) $(LIBS) test-programs/$(am__dirstamp): @$(MKDIR_P) test-programs @: > test-programs/$(am__dirstamp) test-programs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test-programs/$(DEPDIR) @: > test-programs/$(DEPDIR)/$(am__dirstamp) test-programs/c_helpers.$(OBJEXT): test-programs/$(am__dirstamp) \ test-programs/$(DEPDIR)/$(am__dirstamp) test-programs/c_helpers$(EXEEXT): $(test_programs_c_helpers_OBJECTS) $(test_programs_c_helpers_DEPENDENCIES) $(EXTRA_test_programs_c_helpers_DEPENDENCIES) test-programs/$(am__dirstamp) @rm -f test-programs/c_helpers$(EXEEXT) $(LINK) $(test_programs_c_helpers_OBJECTS) $(test_programs_c_helpers_LDADD) $(LIBS) test-programs/cpp_helpers.$(OBJEXT): test-programs/$(am__dirstamp) \ test-programs/$(DEPDIR)/$(am__dirstamp) test-programs/cpp_helpers$(EXEEXT): $(test_programs_cpp_helpers_OBJECTS) $(test_programs_cpp_helpers_DEPENDENCIES) $(EXTRA_test_programs_cpp_helpers_DEPENDENCIES) test-programs/$(am__dirstamp) @rm -f test-programs/cpp_helpers$(EXEEXT) $(CXXLINK) $(test_programs_cpp_helpers_OBJECTS) $(test_programs_cpp_helpers_LDADD) $(LIBS) install-tests_atf_cSCRIPTS: $(tests_atf_c_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_c_SCRIPTS)'; test -n "$(tests_atf_cdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_cdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_cdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_cdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_cdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_cSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c_SCRIPTS)'; test -n "$(tests_atf_cdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_cdir)'; $(am__uninstall_files_from_dir) install-tests_atf_c__SCRIPTS: $(tests_atf_c___SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_c___SCRIPTS)'; test -n "$(tests_atf_c__dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c__dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c__dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_c__dir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_c__dir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_c__SCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c___SCRIPTS)'; test -n "$(tests_atf_c__dir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_c__dir)'; $(am__uninstall_files_from_dir) install-tests_atf_configSCRIPTS: $(tests_atf_config_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_config_SCRIPTS)'; test -n "$(tests_atf_configdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_configdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_configdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_configdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_configdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_configSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_config_SCRIPTS)'; test -n "$(tests_atf_configdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_configdir)'; $(am__uninstall_files_from_dir) install-tests_atf_reportSCRIPTS: $(tests_atf_report_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_report_SCRIPTS)'; test -n "$(tests_atf_reportdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_reportdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_reportdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_reportdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_reportdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_reportSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_report_SCRIPTS)'; test -n "$(tests_atf_reportdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_reportdir)'; $(am__uninstall_files_from_dir) install-tests_atf_runSCRIPTS: $(tests_atf_run_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_run_SCRIPTS)'; test -n "$(tests_atf_rundir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_rundir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_rundir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_rundir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_rundir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_runSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_run_SCRIPTS)'; test -n "$(tests_atf_rundir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_rundir)'; $(am__uninstall_files_from_dir) install-tests_atf_shSCRIPTS: $(tests_atf_sh_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_atf_sh_SCRIPTS)'; test -n "$(tests_atf_shdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_shdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_shdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_atf_shdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_atf_shdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_atf_shSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_atf_sh_SCRIPTS)'; test -n "$(tests_atf_shdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_atf_shdir)'; $(am__uninstall_files_from_dir) install-tests_test_programsSCRIPTS: $(tests_test_programs_SCRIPTS) @$(NORMAL_INSTALL) @list='$(tests_test_programs_SCRIPTS)'; test -n "$(tests_test_programsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_test_programsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_test_programsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(tests_test_programsdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(tests_test_programsdir)$$dir" || exit $$?; \ } \ ; done uninstall-tests_test_programsSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(tests_test_programs_SCRIPTS)'; test -n "$(tests_test_programsdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(tests_test_programsdir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f atf-c++/*.$(OBJEXT) -rm -f atf-c++/*.lo -rm -f atf-c++/detail/*.$(OBJEXT) -rm -f atf-c++/detail/*.lo -rm -f atf-c/*.$(OBJEXT) -rm -f atf-c/*.lo -rm -f atf-c/detail/*.$(OBJEXT) -rm -f atf-c/detail/*.lo -rm -f atf-config/*.$(OBJEXT) -rm -f atf-report/*.$(OBJEXT) -rm -f atf-run/*.$(OBJEXT) -rm -f atf-sh/*.$(OBJEXT) -rm -f atf-version/*.$(OBJEXT) -rm -f bootstrap/*.$(OBJEXT) -rm -f test-programs/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/atf_c++_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/build.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/build_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/check.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/check_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/config_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/macros_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/tests.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/tests_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/$(DEPDIR)/utils_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/application_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/auto_array_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/env_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/exceptions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/exceptions_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/expand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/expand_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/fs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/fs_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/parser_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/process.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/process_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/sanity_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/test_helpers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/text_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/ui.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c++/detail/$(DEPDIR)/ui_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/atf_c_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/build_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/check_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/config_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/error_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-build.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-check.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-tc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-tp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/libatf_c_la-utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/macros_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/tc_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/tp_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/$(DEPDIR)/utils_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/atf_c_detail_libtest_helpers_la-test_helpers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/dynstr_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/env_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/fs_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-dynstr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-fs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-process.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-sanity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-tp_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/libatf_c_la-user.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/list_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/map_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/process_helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/process_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/sanity_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/text_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-c/detail/$(DEPDIR)/user_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-config/$(DEPDIR)/atf-config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/atf-report.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/atf_report_reader_test-reader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/fail_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/misc_helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/pass_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-report/$(DEPDIR)/reader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-fs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-signals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atf_run-user.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_config_test-config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_config_test-config_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/atf_run_test_program_test-user.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/bad_metadata_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/expect_helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/fs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/fs_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/io_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/misc_helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/pass_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/requirements.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/requirements_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/several_tcs_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/signals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/signals_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/user.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/user_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-run/$(DEPDIR)/zero_tcs_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-sh/$(DEPDIR)/atf-check.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-sh/$(DEPDIR)/atf-sh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@bootstrap/$(DEPDIR)/h_app_empty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@bootstrap/$(DEPDIR)/h_app_opts_args.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@bootstrap/$(DEPDIR)/h_tp_basic_c.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@bootstrap/$(DEPDIR)/h_tp_basic_cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test-programs/$(DEPDIR)/c_helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test-programs/$(DEPDIR)/cpp_helpers.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo: atf-c/detail/test_helpers.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_c_detail_libtest_helpers_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/atf_c_detail_libtest_helpers_la-test_helpers.Tpo -c -o atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo `test -f 'atf-c/detail/test_helpers.c' || echo '$(srcdir)/'`atf-c/detail/test_helpers.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/atf_c_detail_libtest_helpers_la-test_helpers.Tpo atf-c/detail/$(DEPDIR)/atf_c_detail_libtest_helpers_la-test_helpers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/test_helpers.c' object='atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_c_detail_libtest_helpers_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/atf_c_detail_libtest_helpers_la-test_helpers.lo `test -f 'atf-c/detail/test_helpers.c' || echo '$(srcdir)/'`atf-c/detail/test_helpers.c atf-c/libatf_c_la-build.lo: atf-c/build.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-build.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-build.Tpo -c -o atf-c/libatf_c_la-build.lo `test -f 'atf-c/build.c' || echo '$(srcdir)/'`atf-c/build.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-build.Tpo atf-c/$(DEPDIR)/libatf_c_la-build.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/build.c' object='atf-c/libatf_c_la-build.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-build.lo `test -f 'atf-c/build.c' || echo '$(srcdir)/'`atf-c/build.c atf-c/libatf_c_la-check.lo: atf-c/check.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-check.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-check.Tpo -c -o atf-c/libatf_c_la-check.lo `test -f 'atf-c/check.c' || echo '$(srcdir)/'`atf-c/check.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-check.Tpo atf-c/$(DEPDIR)/libatf_c_la-check.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/check.c' object='atf-c/libatf_c_la-check.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-check.lo `test -f 'atf-c/check.c' || echo '$(srcdir)/'`atf-c/check.c atf-c/libatf_c_la-config.lo: atf-c/config.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-config.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-config.Tpo -c -o atf-c/libatf_c_la-config.lo `test -f 'atf-c/config.c' || echo '$(srcdir)/'`atf-c/config.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-config.Tpo atf-c/$(DEPDIR)/libatf_c_la-config.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/config.c' object='atf-c/libatf_c_la-config.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-config.lo `test -f 'atf-c/config.c' || echo '$(srcdir)/'`atf-c/config.c atf-c/libatf_c_la-error.lo: atf-c/error.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-error.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-error.Tpo -c -o atf-c/libatf_c_la-error.lo `test -f 'atf-c/error.c' || echo '$(srcdir)/'`atf-c/error.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-error.Tpo atf-c/$(DEPDIR)/libatf_c_la-error.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/error.c' object='atf-c/libatf_c_la-error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-error.lo `test -f 'atf-c/error.c' || echo '$(srcdir)/'`atf-c/error.c atf-c/libatf_c_la-tc.lo: atf-c/tc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-tc.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-tc.Tpo -c -o atf-c/libatf_c_la-tc.lo `test -f 'atf-c/tc.c' || echo '$(srcdir)/'`atf-c/tc.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-tc.Tpo atf-c/$(DEPDIR)/libatf_c_la-tc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/tc.c' object='atf-c/libatf_c_la-tc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-tc.lo `test -f 'atf-c/tc.c' || echo '$(srcdir)/'`atf-c/tc.c atf-c/libatf_c_la-tp.lo: atf-c/tp.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-tp.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-tp.Tpo -c -o atf-c/libatf_c_la-tp.lo `test -f 'atf-c/tp.c' || echo '$(srcdir)/'`atf-c/tp.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-tp.Tpo atf-c/$(DEPDIR)/libatf_c_la-tp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/tp.c' object='atf-c/libatf_c_la-tp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-tp.lo `test -f 'atf-c/tp.c' || echo '$(srcdir)/'`atf-c/tp.c atf-c/libatf_c_la-utils.lo: atf-c/utils.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/libatf_c_la-utils.lo -MD -MP -MF atf-c/$(DEPDIR)/libatf_c_la-utils.Tpo -c -o atf-c/libatf_c_la-utils.lo `test -f 'atf-c/utils.c' || echo '$(srcdir)/'`atf-c/utils.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/$(DEPDIR)/libatf_c_la-utils.Tpo atf-c/$(DEPDIR)/libatf_c_la-utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/utils.c' object='atf-c/libatf_c_la-utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/libatf_c_la-utils.lo `test -f 'atf-c/utils.c' || echo '$(srcdir)/'`atf-c/utils.c atf-c/detail/libatf_c_la-dynstr.lo: atf-c/detail/dynstr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-dynstr.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-dynstr.Tpo -c -o atf-c/detail/libatf_c_la-dynstr.lo `test -f 'atf-c/detail/dynstr.c' || echo '$(srcdir)/'`atf-c/detail/dynstr.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-dynstr.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-dynstr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/dynstr.c' object='atf-c/detail/libatf_c_la-dynstr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-dynstr.lo `test -f 'atf-c/detail/dynstr.c' || echo '$(srcdir)/'`atf-c/detail/dynstr.c atf-c/detail/libatf_c_la-env.lo: atf-c/detail/env.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-env.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-env.Tpo -c -o atf-c/detail/libatf_c_la-env.lo `test -f 'atf-c/detail/env.c' || echo '$(srcdir)/'`atf-c/detail/env.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-env.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-env.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/env.c' object='atf-c/detail/libatf_c_la-env.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-env.lo `test -f 'atf-c/detail/env.c' || echo '$(srcdir)/'`atf-c/detail/env.c atf-c/detail/libatf_c_la-fs.lo: atf-c/detail/fs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-fs.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-fs.Tpo -c -o atf-c/detail/libatf_c_la-fs.lo `test -f 'atf-c/detail/fs.c' || echo '$(srcdir)/'`atf-c/detail/fs.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-fs.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-fs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/fs.c' object='atf-c/detail/libatf_c_la-fs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-fs.lo `test -f 'atf-c/detail/fs.c' || echo '$(srcdir)/'`atf-c/detail/fs.c atf-c/detail/libatf_c_la-list.lo: atf-c/detail/list.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-list.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-list.Tpo -c -o atf-c/detail/libatf_c_la-list.lo `test -f 'atf-c/detail/list.c' || echo '$(srcdir)/'`atf-c/detail/list.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-list.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/list.c' object='atf-c/detail/libatf_c_la-list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-list.lo `test -f 'atf-c/detail/list.c' || echo '$(srcdir)/'`atf-c/detail/list.c atf-c/detail/libatf_c_la-map.lo: atf-c/detail/map.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-map.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-map.Tpo -c -o atf-c/detail/libatf_c_la-map.lo `test -f 'atf-c/detail/map.c' || echo '$(srcdir)/'`atf-c/detail/map.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-map.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-map.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/map.c' object='atf-c/detail/libatf_c_la-map.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-map.lo `test -f 'atf-c/detail/map.c' || echo '$(srcdir)/'`atf-c/detail/map.c atf-c/detail/libatf_c_la-process.lo: atf-c/detail/process.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-process.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-process.Tpo -c -o atf-c/detail/libatf_c_la-process.lo `test -f 'atf-c/detail/process.c' || echo '$(srcdir)/'`atf-c/detail/process.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-process.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-process.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/process.c' object='atf-c/detail/libatf_c_la-process.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-process.lo `test -f 'atf-c/detail/process.c' || echo '$(srcdir)/'`atf-c/detail/process.c atf-c/detail/libatf_c_la-sanity.lo: atf-c/detail/sanity.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-sanity.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-sanity.Tpo -c -o atf-c/detail/libatf_c_la-sanity.lo `test -f 'atf-c/detail/sanity.c' || echo '$(srcdir)/'`atf-c/detail/sanity.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-sanity.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-sanity.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/sanity.c' object='atf-c/detail/libatf_c_la-sanity.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-sanity.lo `test -f 'atf-c/detail/sanity.c' || echo '$(srcdir)/'`atf-c/detail/sanity.c atf-c/detail/libatf_c_la-text.lo: atf-c/detail/text.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-text.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-text.Tpo -c -o atf-c/detail/libatf_c_la-text.lo `test -f 'atf-c/detail/text.c' || echo '$(srcdir)/'`atf-c/detail/text.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-text.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-text.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/text.c' object='atf-c/detail/libatf_c_la-text.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-text.lo `test -f 'atf-c/detail/text.c' || echo '$(srcdir)/'`atf-c/detail/text.c atf-c/detail/libatf_c_la-tp_main.lo: atf-c/detail/tp_main.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-tp_main.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-tp_main.Tpo -c -o atf-c/detail/libatf_c_la-tp_main.lo `test -f 'atf-c/detail/tp_main.c' || echo '$(srcdir)/'`atf-c/detail/tp_main.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-tp_main.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-tp_main.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/tp_main.c' object='atf-c/detail/libatf_c_la-tp_main.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-tp_main.lo `test -f 'atf-c/detail/tp_main.c' || echo '$(srcdir)/'`atf-c/detail/tp_main.c atf-c/detail/libatf_c_la-user.lo: atf-c/detail/user.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atf-c/detail/libatf_c_la-user.lo -MD -MP -MF atf-c/detail/$(DEPDIR)/libatf_c_la-user.Tpo -c -o atf-c/detail/libatf_c_la-user.lo `test -f 'atf-c/detail/user.c' || echo '$(srcdir)/'`atf-c/detail/user.c @am__fastdepCC_TRUE@ $(am__mv) atf-c/detail/$(DEPDIR)/libatf_c_la-user.Tpo atf-c/detail/$(DEPDIR)/libatf_c_la-user.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='atf-c/detail/user.c' object='atf-c/detail/libatf_c_la-user.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libatf_c_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atf-c/detail/libatf_c_la-user.lo `test -f 'atf-c/detail/user.c' || echo '$(srcdir)/'`atf-c/detail/user.c .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< atf-report/atf_report_reader_test-reader_test.o: atf-report/reader_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-report/atf_report_reader_test-reader_test.o -MD -MP -MF atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Tpo -c -o atf-report/atf_report_reader_test-reader_test.o `test -f 'atf-report/reader_test.cpp' || echo '$(srcdir)/'`atf-report/reader_test.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Tpo atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-report/reader_test.cpp' object='atf-report/atf_report_reader_test-reader_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-report/atf_report_reader_test-reader_test.o `test -f 'atf-report/reader_test.cpp' || echo '$(srcdir)/'`atf-report/reader_test.cpp atf-report/atf_report_reader_test-reader_test.obj: atf-report/reader_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-report/atf_report_reader_test-reader_test.obj -MD -MP -MF atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Tpo -c -o atf-report/atf_report_reader_test-reader_test.obj `if test -f 'atf-report/reader_test.cpp'; then $(CYGPATH_W) 'atf-report/reader_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-report/reader_test.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Tpo atf-report/$(DEPDIR)/atf_report_reader_test-reader_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-report/reader_test.cpp' object='atf-report/atf_report_reader_test-reader_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-report/atf_report_reader_test-reader_test.obj `if test -f 'atf-report/reader_test.cpp'; then $(CYGPATH_W) 'atf-report/reader_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-report/reader_test.cpp'; fi` atf-report/atf_report_reader_test-reader.o: atf-report/reader.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-report/atf_report_reader_test-reader.o -MD -MP -MF atf-report/$(DEPDIR)/atf_report_reader_test-reader.Tpo -c -o atf-report/atf_report_reader_test-reader.o `test -f 'atf-report/reader.cpp' || echo '$(srcdir)/'`atf-report/reader.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-report/$(DEPDIR)/atf_report_reader_test-reader.Tpo atf-report/$(DEPDIR)/atf_report_reader_test-reader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-report/reader.cpp' object='atf-report/atf_report_reader_test-reader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-report/atf_report_reader_test-reader.o `test -f 'atf-report/reader.cpp' || echo '$(srcdir)/'`atf-report/reader.cpp atf-report/atf_report_reader_test-reader.obj: atf-report/reader.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-report/atf_report_reader_test-reader.obj -MD -MP -MF atf-report/$(DEPDIR)/atf_report_reader_test-reader.Tpo -c -o atf-report/atf_report_reader_test-reader.obj `if test -f 'atf-report/reader.cpp'; then $(CYGPATH_W) 'atf-report/reader.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-report/reader.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-report/$(DEPDIR)/atf_report_reader_test-reader.Tpo atf-report/$(DEPDIR)/atf_report_reader_test-reader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-report/reader.cpp' object='atf-report/atf_report_reader_test-reader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_report_reader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-report/atf_report_reader_test-reader.obj `if test -f 'atf-report/reader.cpp'; then $(CYGPATH_W) 'atf-report/reader.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-report/reader.cpp'; fi` atf-run/atf_run_atf_run-atf-run.o: atf-run/atf-run.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-atf-run.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Tpo -c -o atf-run/atf_run_atf_run-atf-run.o `test -f 'atf-run/atf-run.cpp' || echo '$(srcdir)/'`atf-run/atf-run.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atf-run.cpp' object='atf-run/atf_run_atf_run-atf-run.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-atf-run.o `test -f 'atf-run/atf-run.cpp' || echo '$(srcdir)/'`atf-run/atf-run.cpp atf-run/atf_run_atf_run-atf-run.obj: atf-run/atf-run.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-atf-run.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Tpo -c -o atf-run/atf_run_atf_run-atf-run.obj `if test -f 'atf-run/atf-run.cpp'; then $(CYGPATH_W) 'atf-run/atf-run.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atf-run.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-atf-run.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atf-run.cpp' object='atf-run/atf_run_atf_run-atf-run.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-atf-run.obj `if test -f 'atf-run/atf-run.cpp'; then $(CYGPATH_W) 'atf-run/atf-run.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atf-run.cpp'; fi` atf-run/atf_run_atf_run-atffile.o: atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-atffile.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Tpo -c -o atf-run/atf_run_atf_run-atffile.o `test -f 'atf-run/atffile.cpp' || echo '$(srcdir)/'`atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile.cpp' object='atf-run/atf_run_atf_run-atffile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-atffile.o `test -f 'atf-run/atffile.cpp' || echo '$(srcdir)/'`atf-run/atffile.cpp atf-run/atf_run_atf_run-atffile.obj: atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-atffile.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Tpo -c -o atf-run/atf_run_atf_run-atffile.obj `if test -f 'atf-run/atffile.cpp'; then $(CYGPATH_W) 'atf-run/atffile.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-atffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile.cpp' object='atf-run/atf_run_atf_run-atffile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-atffile.obj `if test -f 'atf-run/atffile.cpp'; then $(CYGPATH_W) 'atf-run/atffile.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile.cpp'; fi` atf-run/atf_run_atf_run-config.o: atf-run/config.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-config.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-config.Tpo -c -o atf-run/atf_run_atf_run-config.o `test -f 'atf-run/config.cpp' || echo '$(srcdir)/'`atf-run/config.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-config.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-config.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config.cpp' object='atf-run/atf_run_atf_run-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-config.o `test -f 'atf-run/config.cpp' || echo '$(srcdir)/'`atf-run/config.cpp atf-run/atf_run_atf_run-config.obj: atf-run/config.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-config.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-config.Tpo -c -o atf-run/atf_run_atf_run-config.obj `if test -f 'atf-run/config.cpp'; then $(CYGPATH_W) 'atf-run/config.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-config.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-config.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config.cpp' object='atf-run/atf_run_atf_run-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-config.obj `if test -f 'atf-run/config.cpp'; then $(CYGPATH_W) 'atf-run/config.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config.cpp'; fi` atf-run/atf_run_atf_run-fs.o: atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-fs.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-fs.Tpo -c -o atf-run/atf_run_atf_run-fs.o `test -f 'atf-run/fs.cpp' || echo '$(srcdir)/'`atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-fs.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-fs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/fs.cpp' object='atf-run/atf_run_atf_run-fs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-fs.o `test -f 'atf-run/fs.cpp' || echo '$(srcdir)/'`atf-run/fs.cpp atf-run/atf_run_atf_run-fs.obj: atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-fs.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-fs.Tpo -c -o atf-run/atf_run_atf_run-fs.obj `if test -f 'atf-run/fs.cpp'; then $(CYGPATH_W) 'atf-run/fs.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/fs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-fs.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-fs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/fs.cpp' object='atf-run/atf_run_atf_run-fs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-fs.obj `if test -f 'atf-run/fs.cpp'; then $(CYGPATH_W) 'atf-run/fs.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/fs.cpp'; fi` atf-run/atf_run_atf_run-io.o: atf-run/io.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-io.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-io.Tpo -c -o atf-run/atf_run_atf_run-io.o `test -f 'atf-run/io.cpp' || echo '$(srcdir)/'`atf-run/io.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-io.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/io.cpp' object='atf-run/atf_run_atf_run-io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-io.o `test -f 'atf-run/io.cpp' || echo '$(srcdir)/'`atf-run/io.cpp atf-run/atf_run_atf_run-io.obj: atf-run/io.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-io.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-io.Tpo -c -o atf-run/atf_run_atf_run-io.obj `if test -f 'atf-run/io.cpp'; then $(CYGPATH_W) 'atf-run/io.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/io.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-io.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/io.cpp' object='atf-run/atf_run_atf_run-io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-io.obj `if test -f 'atf-run/io.cpp'; then $(CYGPATH_W) 'atf-run/io.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/io.cpp'; fi` atf-run/atf_run_atf_run-requirements.o: atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-requirements.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Tpo -c -o atf-run/atf_run_atf_run-requirements.o `test -f 'atf-run/requirements.cpp' || echo '$(srcdir)/'`atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/requirements.cpp' object='atf-run/atf_run_atf_run-requirements.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-requirements.o `test -f 'atf-run/requirements.cpp' || echo '$(srcdir)/'`atf-run/requirements.cpp atf-run/atf_run_atf_run-requirements.obj: atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-requirements.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Tpo -c -o atf-run/atf_run_atf_run-requirements.obj `if test -f 'atf-run/requirements.cpp'; then $(CYGPATH_W) 'atf-run/requirements.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/requirements.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-requirements.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/requirements.cpp' object='atf-run/atf_run_atf_run-requirements.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-requirements.obj `if test -f 'atf-run/requirements.cpp'; then $(CYGPATH_W) 'atf-run/requirements.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/requirements.cpp'; fi` atf-run/atf_run_atf_run-signals.o: atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-signals.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-signals.Tpo -c -o atf-run/atf_run_atf_run-signals.o `test -f 'atf-run/signals.cpp' || echo '$(srcdir)/'`atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-signals.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-signals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/signals.cpp' object='atf-run/atf_run_atf_run-signals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-signals.o `test -f 'atf-run/signals.cpp' || echo '$(srcdir)/'`atf-run/signals.cpp atf-run/atf_run_atf_run-signals.obj: atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-signals.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-signals.Tpo -c -o atf-run/atf_run_atf_run-signals.obj `if test -f 'atf-run/signals.cpp'; then $(CYGPATH_W) 'atf-run/signals.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/signals.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-signals.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-signals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/signals.cpp' object='atf-run/atf_run_atf_run-signals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-signals.obj `if test -f 'atf-run/signals.cpp'; then $(CYGPATH_W) 'atf-run/signals.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/signals.cpp'; fi` atf-run/atf_run_atf_run-test-program.o: atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-test-program.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Tpo -c -o atf-run/atf_run_atf_run-test-program.o `test -f 'atf-run/test-program.cpp' || echo '$(srcdir)/'`atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test-program.cpp' object='atf-run/atf_run_atf_run-test-program.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-test-program.o `test -f 'atf-run/test-program.cpp' || echo '$(srcdir)/'`atf-run/test-program.cpp atf-run/atf_run_atf_run-test-program.obj: atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-test-program.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Tpo -c -o atf-run/atf_run_atf_run-test-program.obj `if test -f 'atf-run/test-program.cpp'; then $(CYGPATH_W) 'atf-run/test-program.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test-program.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-test-program.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test-program.cpp' object='atf-run/atf_run_atf_run-test-program.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-test-program.obj `if test -f 'atf-run/test-program.cpp'; then $(CYGPATH_W) 'atf-run/test-program.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test-program.cpp'; fi` atf-run/atf_run_atf_run-timer.o: atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-timer.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-timer.Tpo -c -o atf-run/atf_run_atf_run-timer.o `test -f 'atf-run/timer.cpp' || echo '$(srcdir)/'`atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-timer.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-timer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/timer.cpp' object='atf-run/atf_run_atf_run-timer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-timer.o `test -f 'atf-run/timer.cpp' || echo '$(srcdir)/'`atf-run/timer.cpp atf-run/atf_run_atf_run-timer.obj: atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-timer.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-timer.Tpo -c -o atf-run/atf_run_atf_run-timer.obj `if test -f 'atf-run/timer.cpp'; then $(CYGPATH_W) 'atf-run/timer.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/timer.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-timer.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-timer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/timer.cpp' object='atf-run/atf_run_atf_run-timer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-timer.obj `if test -f 'atf-run/timer.cpp'; then $(CYGPATH_W) 'atf-run/timer.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/timer.cpp'; fi` atf-run/atf_run_atf_run-user.o: atf-run/user.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-user.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-user.Tpo -c -o atf-run/atf_run_atf_run-user.o `test -f 'atf-run/user.cpp' || echo '$(srcdir)/'`atf-run/user.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-user.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/user.cpp' object='atf-run/atf_run_atf_run-user.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-user.o `test -f 'atf-run/user.cpp' || echo '$(srcdir)/'`atf-run/user.cpp atf-run/atf_run_atf_run-user.obj: atf-run/user.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atf_run-user.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atf_run-user.Tpo -c -o atf-run/atf_run_atf_run-user.obj `if test -f 'atf-run/user.cpp'; then $(CYGPATH_W) 'atf-run/user.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/user.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atf_run-user.Tpo atf-run/$(DEPDIR)/atf_run_atf_run-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/user.cpp' object='atf-run/atf_run_atf_run-user.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atf_run_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atf_run-user.obj `if test -f 'atf-run/user.cpp'; then $(CYGPATH_W) 'atf-run/user.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/user.cpp'; fi` atf-run/atf_run_atffile_test-atffile_test.o: atf-run/atffile_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atffile_test-atffile_test.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Tpo -c -o atf-run/atf_run_atffile_test-atffile_test.o `test -f 'atf-run/atffile_test.cpp' || echo '$(srcdir)/'`atf-run/atffile_test.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Tpo atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile_test.cpp' object='atf-run/atf_run_atffile_test-atffile_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atffile_test-atffile_test.o `test -f 'atf-run/atffile_test.cpp' || echo '$(srcdir)/'`atf-run/atffile_test.cpp atf-run/atf_run_atffile_test-atffile_test.obj: atf-run/atffile_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atffile_test-atffile_test.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Tpo -c -o atf-run/atf_run_atffile_test-atffile_test.obj `if test -f 'atf-run/atffile_test.cpp'; then $(CYGPATH_W) 'atf-run/atffile_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile_test.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Tpo atf-run/$(DEPDIR)/atf_run_atffile_test-atffile_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile_test.cpp' object='atf-run/atf_run_atffile_test-atffile_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atffile_test-atffile_test.obj `if test -f 'atf-run/atffile_test.cpp'; then $(CYGPATH_W) 'atf-run/atffile_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile_test.cpp'; fi` atf-run/atf_run_atffile_test-atffile.o: atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atffile_test-atffile.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Tpo -c -o atf-run/atf_run_atffile_test-atffile.o `test -f 'atf-run/atffile.cpp' || echo '$(srcdir)/'`atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Tpo atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile.cpp' object='atf-run/atf_run_atffile_test-atffile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atffile_test-atffile.o `test -f 'atf-run/atffile.cpp' || echo '$(srcdir)/'`atf-run/atffile.cpp atf-run/atf_run_atffile_test-atffile.obj: atf-run/atffile.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_atffile_test-atffile.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Tpo -c -o atf-run/atf_run_atffile_test-atffile.obj `if test -f 'atf-run/atffile.cpp'; then $(CYGPATH_W) 'atf-run/atffile.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Tpo atf-run/$(DEPDIR)/atf_run_atffile_test-atffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/atffile.cpp' object='atf-run/atf_run_atffile_test-atffile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_atffile_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_atffile_test-atffile.obj `if test -f 'atf-run/atffile.cpp'; then $(CYGPATH_W) 'atf-run/atffile.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/atffile.cpp'; fi` atf-run/atf_run_config_test-config_test.o: atf-run/config_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_config_test-config_test.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_config_test-config_test.Tpo -c -o atf-run/atf_run_config_test-config_test.o `test -f 'atf-run/config_test.cpp' || echo '$(srcdir)/'`atf-run/config_test.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_config_test-config_test.Tpo atf-run/$(DEPDIR)/atf_run_config_test-config_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config_test.cpp' object='atf-run/atf_run_config_test-config_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_config_test-config_test.o `test -f 'atf-run/config_test.cpp' || echo '$(srcdir)/'`atf-run/config_test.cpp atf-run/atf_run_config_test-config_test.obj: atf-run/config_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_config_test-config_test.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_config_test-config_test.Tpo -c -o atf-run/atf_run_config_test-config_test.obj `if test -f 'atf-run/config_test.cpp'; then $(CYGPATH_W) 'atf-run/config_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config_test.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_config_test-config_test.Tpo atf-run/$(DEPDIR)/atf_run_config_test-config_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config_test.cpp' object='atf-run/atf_run_config_test-config_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_config_test-config_test.obj `if test -f 'atf-run/config_test.cpp'; then $(CYGPATH_W) 'atf-run/config_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config_test.cpp'; fi` atf-run/atf_run_config_test-config.o: atf-run/config.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_config_test-config.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_config_test-config.Tpo -c -o atf-run/atf_run_config_test-config.o `test -f 'atf-run/config.cpp' || echo '$(srcdir)/'`atf-run/config.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_config_test-config.Tpo atf-run/$(DEPDIR)/atf_run_config_test-config.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config.cpp' object='atf-run/atf_run_config_test-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_config_test-config.o `test -f 'atf-run/config.cpp' || echo '$(srcdir)/'`atf-run/config.cpp atf-run/atf_run_config_test-config.obj: atf-run/config.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_config_test-config.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_config_test-config.Tpo -c -o atf-run/atf_run_config_test-config.obj `if test -f 'atf-run/config.cpp'; then $(CYGPATH_W) 'atf-run/config.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_config_test-config.Tpo atf-run/$(DEPDIR)/atf_run_config_test-config.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/config.cpp' object='atf-run/atf_run_config_test-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_config_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_config_test-config.obj `if test -f 'atf-run/config.cpp'; then $(CYGPATH_W) 'atf-run/config.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/config.cpp'; fi` atf-run/atf_run_test_program_test-test_program_test.o: atf-run/test_program_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-test_program_test.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Tpo -c -o atf-run/atf_run_test_program_test-test_program_test.o `test -f 'atf-run/test_program_test.cpp' || echo '$(srcdir)/'`atf-run/test_program_test.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test_program_test.cpp' object='atf-run/atf_run_test_program_test-test_program_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-test_program_test.o `test -f 'atf-run/test_program_test.cpp' || echo '$(srcdir)/'`atf-run/test_program_test.cpp atf-run/atf_run_test_program_test-test_program_test.obj: atf-run/test_program_test.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-test_program_test.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Tpo -c -o atf-run/atf_run_test_program_test-test_program_test.obj `if test -f 'atf-run/test_program_test.cpp'; then $(CYGPATH_W) 'atf-run/test_program_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test_program_test.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-test_program_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test_program_test.cpp' object='atf-run/atf_run_test_program_test-test_program_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-test_program_test.obj `if test -f 'atf-run/test_program_test.cpp'; then $(CYGPATH_W) 'atf-run/test_program_test.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test_program_test.cpp'; fi` atf-run/atf_run_test_program_test-fs.o: atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-fs.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Tpo -c -o atf-run/atf_run_test_program_test-fs.o `test -f 'atf-run/fs.cpp' || echo '$(srcdir)/'`atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/fs.cpp' object='atf-run/atf_run_test_program_test-fs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-fs.o `test -f 'atf-run/fs.cpp' || echo '$(srcdir)/'`atf-run/fs.cpp atf-run/atf_run_test_program_test-fs.obj: atf-run/fs.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-fs.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Tpo -c -o atf-run/atf_run_test_program_test-fs.obj `if test -f 'atf-run/fs.cpp'; then $(CYGPATH_W) 'atf-run/fs.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/fs.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-fs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/fs.cpp' object='atf-run/atf_run_test_program_test-fs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-fs.obj `if test -f 'atf-run/fs.cpp'; then $(CYGPATH_W) 'atf-run/fs.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/fs.cpp'; fi` atf-run/atf_run_test_program_test-io.o: atf-run/io.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-io.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-io.Tpo -c -o atf-run/atf_run_test_program_test-io.o `test -f 'atf-run/io.cpp' || echo '$(srcdir)/'`atf-run/io.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-io.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/io.cpp' object='atf-run/atf_run_test_program_test-io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-io.o `test -f 'atf-run/io.cpp' || echo '$(srcdir)/'`atf-run/io.cpp atf-run/atf_run_test_program_test-io.obj: atf-run/io.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-io.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-io.Tpo -c -o atf-run/atf_run_test_program_test-io.obj `if test -f 'atf-run/io.cpp'; then $(CYGPATH_W) 'atf-run/io.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/io.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-io.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/io.cpp' object='atf-run/atf_run_test_program_test-io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-io.obj `if test -f 'atf-run/io.cpp'; then $(CYGPATH_W) 'atf-run/io.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/io.cpp'; fi` atf-run/atf_run_test_program_test-requirements.o: atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-requirements.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Tpo -c -o atf-run/atf_run_test_program_test-requirements.o `test -f 'atf-run/requirements.cpp' || echo '$(srcdir)/'`atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/requirements.cpp' object='atf-run/atf_run_test_program_test-requirements.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-requirements.o `test -f 'atf-run/requirements.cpp' || echo '$(srcdir)/'`atf-run/requirements.cpp atf-run/atf_run_test_program_test-requirements.obj: atf-run/requirements.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-requirements.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Tpo -c -o atf-run/atf_run_test_program_test-requirements.obj `if test -f 'atf-run/requirements.cpp'; then $(CYGPATH_W) 'atf-run/requirements.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/requirements.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-requirements.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/requirements.cpp' object='atf-run/atf_run_test_program_test-requirements.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-requirements.obj `if test -f 'atf-run/requirements.cpp'; then $(CYGPATH_W) 'atf-run/requirements.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/requirements.cpp'; fi` atf-run/atf_run_test_program_test-signals.o: atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-signals.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Tpo -c -o atf-run/atf_run_test_program_test-signals.o `test -f 'atf-run/signals.cpp' || echo '$(srcdir)/'`atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/signals.cpp' object='atf-run/atf_run_test_program_test-signals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-signals.o `test -f 'atf-run/signals.cpp' || echo '$(srcdir)/'`atf-run/signals.cpp atf-run/atf_run_test_program_test-signals.obj: atf-run/signals.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-signals.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Tpo -c -o atf-run/atf_run_test_program_test-signals.obj `if test -f 'atf-run/signals.cpp'; then $(CYGPATH_W) 'atf-run/signals.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/signals.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-signals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/signals.cpp' object='atf-run/atf_run_test_program_test-signals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-signals.obj `if test -f 'atf-run/signals.cpp'; then $(CYGPATH_W) 'atf-run/signals.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/signals.cpp'; fi` atf-run/atf_run_test_program_test-test-program.o: atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-test-program.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Tpo -c -o atf-run/atf_run_test_program_test-test-program.o `test -f 'atf-run/test-program.cpp' || echo '$(srcdir)/'`atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test-program.cpp' object='atf-run/atf_run_test_program_test-test-program.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-test-program.o `test -f 'atf-run/test-program.cpp' || echo '$(srcdir)/'`atf-run/test-program.cpp atf-run/atf_run_test_program_test-test-program.obj: atf-run/test-program.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-test-program.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Tpo -c -o atf-run/atf_run_test_program_test-test-program.obj `if test -f 'atf-run/test-program.cpp'; then $(CYGPATH_W) 'atf-run/test-program.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test-program.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-test-program.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/test-program.cpp' object='atf-run/atf_run_test_program_test-test-program.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-test-program.obj `if test -f 'atf-run/test-program.cpp'; then $(CYGPATH_W) 'atf-run/test-program.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/test-program.cpp'; fi` atf-run/atf_run_test_program_test-timer.o: atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-timer.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Tpo -c -o atf-run/atf_run_test_program_test-timer.o `test -f 'atf-run/timer.cpp' || echo '$(srcdir)/'`atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/timer.cpp' object='atf-run/atf_run_test_program_test-timer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-timer.o `test -f 'atf-run/timer.cpp' || echo '$(srcdir)/'`atf-run/timer.cpp atf-run/atf_run_test_program_test-timer.obj: atf-run/timer.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-timer.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Tpo -c -o atf-run/atf_run_test_program_test-timer.obj `if test -f 'atf-run/timer.cpp'; then $(CYGPATH_W) 'atf-run/timer.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/timer.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-timer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/timer.cpp' object='atf-run/atf_run_test_program_test-timer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-timer.obj `if test -f 'atf-run/timer.cpp'; then $(CYGPATH_W) 'atf-run/timer.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/timer.cpp'; fi` atf-run/atf_run_test_program_test-user.o: atf-run/user.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-user.o -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-user.Tpo -c -o atf-run/atf_run_test_program_test-user.o `test -f 'atf-run/user.cpp' || echo '$(srcdir)/'`atf-run/user.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-user.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/user.cpp' object='atf-run/atf_run_test_program_test-user.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-user.o `test -f 'atf-run/user.cpp' || echo '$(srcdir)/'`atf-run/user.cpp atf-run/atf_run_test_program_test-user.obj: atf-run/user.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-run/atf_run_test_program_test-user.obj -MD -MP -MF atf-run/$(DEPDIR)/atf_run_test_program_test-user.Tpo -c -o atf-run/atf_run_test_program_test-user.obj `if test -f 'atf-run/user.cpp'; then $(CYGPATH_W) 'atf-run/user.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/user.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-run/$(DEPDIR)/atf_run_test_program_test-user.Tpo atf-run/$(DEPDIR)/atf_run_test_program_test-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-run/user.cpp' object='atf-run/atf_run_test_program_test-user.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_run_test_program_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-run/atf_run_test_program_test-user.obj `if test -f 'atf-run/user.cpp'; then $(CYGPATH_W) 'atf-run/user.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-run/user.cpp'; fi` atf-version/atf_version_atf_version-atf-version.o: atf-version/atf-version.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_version_atf_version_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-version/atf_version_atf_version-atf-version.o -MD -MP -MF atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Tpo -c -o atf-version/atf_version_atf_version-atf-version.o `test -f 'atf-version/atf-version.cpp' || echo '$(srcdir)/'`atf-version/atf-version.cpp @am__fastdepCXX_TRUE@ $(am__mv) atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Tpo atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-version/atf-version.cpp' object='atf-version/atf_version_atf_version-atf-version.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_version_atf_version_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-version/atf_version_atf_version-atf-version.o `test -f 'atf-version/atf-version.cpp' || echo '$(srcdir)/'`atf-version/atf-version.cpp atf-version/atf_version_atf_version-atf-version.obj: atf-version/atf-version.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_version_atf_version_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT atf-version/atf_version_atf_version-atf-version.obj -MD -MP -MF atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Tpo -c -o atf-version/atf_version_atf_version-atf-version.obj `if test -f 'atf-version/atf-version.cpp'; then $(CYGPATH_W) 'atf-version/atf-version.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-version/atf-version.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Tpo atf-version/$(DEPDIR)/atf_version_atf_version-atf-version.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='atf-version/atf-version.cpp' object='atf-version/atf_version_atf_version-atf-version.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(atf_version_atf_version_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o atf-version/atf_version_atf_version-atf-version.obj `if test -f 'atf-version/atf-version.cpp'; then $(CYGPATH_W) 'atf-version/atf-version.cpp'; else $(CYGPATH_W) '$(srcdir)/atf-version/atf-version.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf atf-c/.libs atf-c/_libs -rm -rf atf-c++/.libs atf-c++/_libs -rm -rf atf-c++/detail/.libs atf-c++/detail/_libs -rm -rf atf-c/detail/.libs atf-c/detail/_libs -rm -rf atf-config/.libs atf-config/_libs -rm -rf atf-report/.libs atf-report/_libs -rm -rf atf-run/.libs atf-run/_libs -rm -rf atf-sh/.libs atf-sh/_libs -rm -rf atf-version/.libs atf-version/_libs -rm -rf bootstrap/.libs bootstrap/_libs -rm -rf test-programs/.libs test-programs/_libs distclean-libtool: -rm -f libtool config.lt install-man1: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS) $(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man3: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS) $(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-man4: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS) $(man_MANS)'; \ test -n "$(man4dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man4dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man4dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.4[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^4][0-9a-z]*$$,4,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man4dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man4dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man4dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man4dir)" || exit $$?; }; \ done; } uninstall-man4: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man4dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.4[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^4][0-9a-z]*$$,4,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man4dir)'; $(am__uninstall_files_from_dir) install-man5: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS) $(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-man7: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS) $(man_MANS)'; \ test -n "$(man7dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man7dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man7dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.7[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man7dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \ done; } uninstall-man7: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man7dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.7[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir) install-atf_aclocalDATA: $(atf_aclocal_DATA) @$(NORMAL_INSTALL) @list='$(atf_aclocal_DATA)'; test -n "$(atf_aclocaldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_aclocaldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_aclocaldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atf_aclocaldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atf_aclocaldir)" || exit $$?; \ done uninstall-atf_aclocalDATA: @$(NORMAL_UNINSTALL) @list='$(atf_aclocal_DATA)'; test -n "$(atf_aclocaldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_aclocaldir)'; $(am__uninstall_files_from_dir) install-atf_c__dirpkgconfigDATA: $(atf_c__dirpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(atf_c__dirpkgconfig_DATA)'; test -n "$(atf_c__dirpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_c__dirpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_c__dirpkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atf_c__dirpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atf_c__dirpkgconfigdir)" || exit $$?; \ done uninstall-atf_c__dirpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(atf_c__dirpkgconfig_DATA)'; test -n "$(atf_c__dirpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_c__dirpkgconfigdir)'; $(am__uninstall_files_from_dir) install-atf_cpkgconfigDATA: $(atf_cpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(atf_cpkgconfig_DATA)'; test -n "$(atf_cpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_cpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_cpkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atf_cpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atf_cpkgconfigdir)" || exit $$?; \ done uninstall-atf_cpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(atf_cpkgconfig_DATA)'; test -n "$(atf_cpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_cpkgconfigdir)'; $(am__uninstall_files_from_dir) install-atf_shDATA: $(atf_sh_DATA) @$(NORMAL_INSTALL) @list='$(atf_sh_DATA)'; test -n "$(atf_shdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_shdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_shdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atf_shdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atf_shdir)" || exit $$?; \ done uninstall-atf_shDATA: @$(NORMAL_UNINSTALL) @list='$(atf_sh_DATA)'; test -n "$(atf_shdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_shdir)'; $(am__uninstall_files_from_dir) install-atf_shpkgconfigDATA: $(atf_shpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(atf_shpkgconfig_DATA)'; test -n "$(atf_shpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_shpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_shpkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atf_shpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atf_shpkgconfigdir)" || exit $$?; \ done uninstall-atf_shpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(atf_shpkgconfig_DATA)'; test -n "$(atf_shpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_shpkgconfigdir)'; $(am__uninstall_files_from_dir) install-cssDATA: $(css_DATA) @$(NORMAL_INSTALL) @list='$(css_DATA)'; test -n "$(cssdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(cssdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(cssdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cssdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(cssdir)" || exit $$?; \ done uninstall-cssDATA: @$(NORMAL_UNINSTALL) @list='$(css_DATA)'; test -n "$(cssdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(cssdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-dtdDATA: $(dtd_DATA) @$(NORMAL_INSTALL) @list='$(dtd_DATA)'; test -n "$(dtddir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dtddir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dtddir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dtddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dtddir)" || exit $$?; \ done uninstall-dtdDATA: @$(NORMAL_UNINSTALL) @list='$(dtd_DATA)'; test -n "$(dtddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dtddir)'; $(am__uninstall_files_from_dir) install-egDATA: $(eg_DATA) @$(NORMAL_INSTALL) @list='$(eg_DATA)'; test -n "$(egdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(egdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(egdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(egdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(egdir)" || exit $$?; \ done uninstall-egDATA: @$(NORMAL_UNINSTALL) @list='$(eg_DATA)'; test -n "$(egdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(egdir)'; $(am__uninstall_files_from_dir) install-hooksDATA: $(hooks_DATA) @$(NORMAL_INSTALL) @list='$(hooks_DATA)'; test -n "$(hooksdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(hooksdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(hooksdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(hooksdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(hooksdir)" || exit $$?; \ done uninstall-hooksDATA: @$(NORMAL_UNINSTALL) @list='$(hooks_DATA)'; test -n "$(hooksdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(hooksdir)'; $(am__uninstall_files_from_dir) install-pkgtestsDATA: $(pkgtests_DATA) @$(NORMAL_INSTALL) @list='$(pkgtests_DATA)'; test -n "$(pkgtestsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgtestsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgtestsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgtestsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgtestsdir)" || exit $$?; \ done uninstall-pkgtestsDATA: @$(NORMAL_UNINSTALL) @list='$(pkgtests_DATA)'; test -n "$(pkgtestsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgtestsdir)'; $(am__uninstall_files_from_dir) install-tests_atf_cDATA: $(tests_atf_c_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_c_DATA)'; test -n "$(tests_atf_cdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_cdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_cdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_cdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_cdir)" || exit $$?; \ done uninstall-tests_atf_cDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c_DATA)'; test -n "$(tests_atf_cdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_cdir)'; $(am__uninstall_files_from_dir) install-tests_atf_c__DATA: $(tests_atf_c___DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_c___DATA)'; test -n "$(tests_atf_c__dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c__dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c__dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_c__dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_c__dir)" || exit $$?; \ done uninstall-tests_atf_c__DATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c___DATA)'; test -n "$(tests_atf_c__dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_c__dir)'; $(am__uninstall_files_from_dir) install-tests_atf_c___detailDATA: $(tests_atf_c___detail_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_c___detail_DATA)'; test -n "$(tests_atf_c___detaildir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c___detaildir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c___detaildir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_c___detaildir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_c___detaildir)" || exit $$?; \ done uninstall-tests_atf_c___detailDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c___detail_DATA)'; test -n "$(tests_atf_c___detaildir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_c___detaildir)'; $(am__uninstall_files_from_dir) install-tests_atf_c_detailDATA: $(tests_atf_c_detail_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_c_detail_DATA)'; test -n "$(tests_atf_c_detaildir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_c_detaildir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_c_detaildir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_c_detaildir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_c_detaildir)" || exit $$?; \ done uninstall-tests_atf_c_detailDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_c_detail_DATA)'; test -n "$(tests_atf_c_detaildir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_c_detaildir)'; $(am__uninstall_files_from_dir) install-tests_atf_configDATA: $(tests_atf_config_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_config_DATA)'; test -n "$(tests_atf_configdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_configdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_configdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_configdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_configdir)" || exit $$?; \ done uninstall-tests_atf_configDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_config_DATA)'; test -n "$(tests_atf_configdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_configdir)'; $(am__uninstall_files_from_dir) install-tests_atf_reportDATA: $(tests_atf_report_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_report_DATA)'; test -n "$(tests_atf_reportdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_reportdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_reportdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_reportdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_reportdir)" || exit $$?; \ done uninstall-tests_atf_reportDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_report_DATA)'; test -n "$(tests_atf_reportdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_reportdir)'; $(am__uninstall_files_from_dir) install-tests_atf_runDATA: $(tests_atf_run_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_run_DATA)'; test -n "$(tests_atf_rundir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_rundir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_rundir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_rundir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_rundir)" || exit $$?; \ done uninstall-tests_atf_runDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_run_DATA)'; test -n "$(tests_atf_rundir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_rundir)'; $(am__uninstall_files_from_dir) install-tests_atf_shDATA: $(tests_atf_sh_DATA) @$(NORMAL_INSTALL) @list='$(tests_atf_sh_DATA)'; test -n "$(tests_atf_shdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_atf_shdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_atf_shdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_atf_shdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_atf_shdir)" || exit $$?; \ done uninstall-tests_atf_shDATA: @$(NORMAL_UNINSTALL) @list='$(tests_atf_sh_DATA)'; test -n "$(tests_atf_shdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_atf_shdir)'; $(am__uninstall_files_from_dir) install-tests_test_programsDATA: $(tests_test_programs_DATA) @$(NORMAL_INSTALL) @list='$(tests_test_programs_DATA)'; test -n "$(tests_test_programsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tests_test_programsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tests_test_programsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tests_test_programsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tests_test_programsdir)" || exit $$?; \ done uninstall-tests_test_programsDATA: @$(NORMAL_UNINSTALL) @list='$(tests_test_programs_DATA)'; test -n "$(tests_test_programsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tests_test_programsdir)'; $(am__uninstall_files_from_dir) install-xslDATA: $(xsl_DATA) @$(NORMAL_INSTALL) @list='$(xsl_DATA)'; test -n "$(xsldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xsldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xsldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xsldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xsldir)" || exit $$?; \ done uninstall-xslDATA: @$(NORMAL_UNINSTALL) @list='$(xsl_DATA)'; test -n "$(xsldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xsldir)'; $(am__uninstall_files_from_dir) install-atf_cHEADERS: $(atf_c_HEADERS) @$(NORMAL_INSTALL) @list='$(atf_c_HEADERS)'; test -n "$(atf_cdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_cdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_cdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(atf_cdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(atf_cdir)" || exit $$?; \ done uninstall-atf_cHEADERS: @$(NORMAL_UNINSTALL) @list='$(atf_c_HEADERS)'; test -n "$(atf_cdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_cdir)'; $(am__uninstall_files_from_dir) install-atf_c__HEADERS: $(atf_c___HEADERS) @$(NORMAL_INSTALL) @list='$(atf_c___HEADERS)'; test -n "$(atf_c__dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atf_c__dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atf_c__dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(atf_c__dir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(atf_c__dir)" || exit $$?; \ done uninstall-atf_c__HEADERS: @$(NORMAL_UNINSTALL) @list='$(atf_c___HEADERS)'; test -n "$(atf_c__dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atf_c__dir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) bconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) bconfig.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) bconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) bconfig.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) @case `sed 15q $(srcdir)/NEWS` in \ *"$(VERSION)"*) : ;; \ *) \ echo "NEWS not updated; not releasing" 1>&2; \ exit 1;; \ esac @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \ $(HEADERS) bconfig.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(tests_atf_cdir)" "$(DESTDIR)$(tests_atf_c__dir)" "$(DESTDIR)$(tests_atf_c___detaildir)" "$(DESTDIR)$(tests_atf_c_detaildir)" "$(DESTDIR)$(tests_atf_reportdir)" "$(DESTDIR)$(tests_atf_rundir)" "$(DESTDIR)$(tests_test_programsdir)" "$(DESTDIR)$(tests_atf_cdir)" "$(DESTDIR)$(tests_atf_c__dir)" "$(DESTDIR)$(tests_atf_configdir)" "$(DESTDIR)$(tests_atf_reportdir)" "$(DESTDIR)$(tests_atf_rundir)" "$(DESTDIR)$(tests_atf_shdir)" "$(DESTDIR)$(tests_test_programsdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man4dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(atf_aclocaldir)" "$(DESTDIR)$(atf_c__dirpkgconfigdir)" "$(DESTDIR)$(atf_cpkgconfigdir)" "$(DESTDIR)$(atf_shdir)" "$(DESTDIR)$(atf_shpkgconfigdir)" "$(DESTDIR)$(cssdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(dtddir)" "$(DESTDIR)$(egdir)" "$(DESTDIR)$(hooksdir)" "$(DESTDIR)$(pkgtestsdir)" "$(DESTDIR)$(tests_atf_cdir)" "$(DESTDIR)$(tests_atf_c__dir)" "$(DESTDIR)$(tests_atf_c___detaildir)" "$(DESTDIR)$(tests_atf_c_detaildir)" "$(DESTDIR)$(tests_atf_configdir)" "$(DESTDIR)$(tests_atf_reportdir)" "$(DESTDIR)$(tests_atf_rundir)" "$(DESTDIR)$(tests_atf_shdir)" "$(DESTDIR)$(tests_test_programsdir)" "$(DESTDIR)$(xsldir)" "$(DESTDIR)$(atf_cdir)" "$(DESTDIR)$(atf_c__dir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f atf-c++/$(DEPDIR)/$(am__dirstamp) -rm -f atf-c++/$(am__dirstamp) -rm -f atf-c++/detail/$(DEPDIR)/$(am__dirstamp) -rm -f atf-c++/detail/$(am__dirstamp) -rm -f atf-c/$(DEPDIR)/$(am__dirstamp) -rm -f atf-c/$(am__dirstamp) -rm -f atf-c/detail/$(DEPDIR)/$(am__dirstamp) -rm -f atf-c/detail/$(am__dirstamp) -rm -f atf-config/$(DEPDIR)/$(am__dirstamp) -rm -f atf-config/$(am__dirstamp) -rm -f atf-report/$(DEPDIR)/$(am__dirstamp) -rm -f atf-report/$(am__dirstamp) -rm -f atf-run/$(DEPDIR)/$(am__dirstamp) -rm -f atf-run/$(am__dirstamp) -rm -f atf-sh/$(DEPDIR)/$(am__dirstamp) -rm -f atf-sh/$(am__dirstamp) -rm -f atf-version/$(DEPDIR)/$(am__dirstamp) -rm -f atf-version/$(am__dirstamp) -rm -f bootstrap/$(DEPDIR)/$(am__dirstamp) -rm -f bootstrap/$(am__dirstamp) -rm -f test-programs/$(DEPDIR)/$(am__dirstamp) -rm -f test-programs/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ clean-noinstLTLIBRARIES clean-tests_atf_cPROGRAMS \ clean-tests_atf_c__PROGRAMS clean-tests_atf_c___detailPROGRAMS \ clean-tests_atf_c_detailPROGRAMS \ clean-tests_atf_reportPROGRAMS clean-tests_atf_runPROGRAMS \ clean-tests_test_programsPROGRAMS mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf atf-c++/$(DEPDIR) atf-c++/detail/$(DEPDIR) atf-c/$(DEPDIR) atf-c/detail/$(DEPDIR) atf-config/$(DEPDIR) atf-report/$(DEPDIR) atf-run/$(DEPDIR) atf-sh/$(DEPDIR) atf-version/$(DEPDIR) bootstrap/$(DEPDIR) test-programs/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-local distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-atf_aclocalDATA install-atf_cHEADERS \ install-atf_c__HEADERS install-atf_c__dirpkgconfigDATA \ install-atf_cpkgconfigDATA install-atf_shDATA \ install-atf_shpkgconfigDATA install-cssDATA install-docDATA \ install-dtdDATA install-egDATA install-hooksDATA \ install-includeHEADERS install-man install-pkgtestsDATA \ install-tests_atf_cDATA install-tests_atf_cPROGRAMS \ install-tests_atf_cSCRIPTS install-tests_atf_c__DATA \ install-tests_atf_c__PROGRAMS install-tests_atf_c__SCRIPTS \ install-tests_atf_c___detailDATA \ install-tests_atf_c___detailPROGRAMS \ install-tests_atf_c_detailDATA \ install-tests_atf_c_detailPROGRAMS \ install-tests_atf_configDATA install-tests_atf_configSCRIPTS \ install-tests_atf_reportDATA install-tests_atf_reportPROGRAMS \ install-tests_atf_reportSCRIPTS install-tests_atf_runDATA \ install-tests_atf_runPROGRAMS install-tests_atf_runSCRIPTS \ install-tests_atf_shDATA install-tests_atf_shSCRIPTS \ install-tests_test_programsDATA \ install-tests_test_programsPROGRAMS \ install-tests_test_programsSCRIPTS install-xslDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES \ install-libexecPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-man3 install-man4 install-man5 \ install-man7 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: installcheck-local maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf atf-c++/$(DEPDIR) atf-c++/detail/$(DEPDIR) atf-c/$(DEPDIR) atf-c/detail/$(DEPDIR) atf-config/$(DEPDIR) atf-report/$(DEPDIR) atf-run/$(DEPDIR) atf-sh/$(DEPDIR) atf-version/$(DEPDIR) bootstrap/$(DEPDIR) test-programs/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-atf_aclocalDATA uninstall-atf_cHEADERS \ uninstall-atf_c__HEADERS uninstall-atf_c__dirpkgconfigDATA \ uninstall-atf_cpkgconfigDATA uninstall-atf_shDATA \ uninstall-atf_shpkgconfigDATA uninstall-binPROGRAMS \ uninstall-cssDATA uninstall-docDATA uninstall-dtdDATA \ uninstall-egDATA uninstall-hooksDATA uninstall-includeHEADERS \ uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ uninstall-man uninstall-pkgtestsDATA uninstall-tests_atf_cDATA \ uninstall-tests_atf_cPROGRAMS uninstall-tests_atf_cSCRIPTS \ uninstall-tests_atf_c__DATA uninstall-tests_atf_c__PROGRAMS \ uninstall-tests_atf_c__SCRIPTS \ uninstall-tests_atf_c___detailDATA \ uninstall-tests_atf_c___detailPROGRAMS \ uninstall-tests_atf_c_detailDATA \ uninstall-tests_atf_c_detailPROGRAMS \ uninstall-tests_atf_configDATA \ uninstall-tests_atf_configSCRIPTS \ uninstall-tests_atf_reportDATA \ uninstall-tests_atf_reportPROGRAMS \ uninstall-tests_atf_reportSCRIPTS uninstall-tests_atf_runDATA \ uninstall-tests_atf_runPROGRAMS uninstall-tests_atf_runSCRIPTS \ uninstall-tests_atf_shDATA uninstall-tests_atf_shSCRIPTS \ uninstall-tests_test_programsDATA \ uninstall-tests_test_programsPROGRAMS \ uninstall-tests_test_programsSCRIPTS uninstall-xslDATA uninstall-man: uninstall-man1 uninstall-man3 uninstall-man4 \ uninstall-man5 uninstall-man7 .MAKE: all check check-am install install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-cscope \ clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \ clean-libtool clean-noinstLTLIBRARIES \ clean-tests_atf_cPROGRAMS clean-tests_atf_c__PROGRAMS \ clean-tests_atf_c___detailPROGRAMS \ clean-tests_atf_c_detailPROGRAMS \ clean-tests_atf_reportPROGRAMS clean-tests_atf_runPROGRAMS \ clean-tests_test_programsPROGRAMS cscope cscopelist ctags dist \ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am \ install-atf_aclocalDATA install-atf_cHEADERS \ install-atf_c__HEADERS install-atf_c__dirpkgconfigDATA \ install-atf_cpkgconfigDATA install-atf_shDATA \ install-atf_shpkgconfigDATA install-binPROGRAMS \ install-cssDATA install-data install-data-am install-docDATA \ install-dtdDATA install-dvi install-dvi-am install-egDATA \ install-exec install-exec-am install-hooksDATA install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-libexecPROGRAMS \ install-man install-man1 install-man3 install-man4 \ install-man5 install-man7 install-pdf install-pdf-am \ install-pkgtestsDATA install-ps install-ps-am install-strip \ install-tests_atf_cDATA install-tests_atf_cPROGRAMS \ install-tests_atf_cSCRIPTS install-tests_atf_c__DATA \ install-tests_atf_c__PROGRAMS install-tests_atf_c__SCRIPTS \ install-tests_atf_c___detailDATA \ install-tests_atf_c___detailPROGRAMS \ install-tests_atf_c_detailDATA \ install-tests_atf_c_detailPROGRAMS \ install-tests_atf_configDATA install-tests_atf_configSCRIPTS \ install-tests_atf_reportDATA install-tests_atf_reportPROGRAMS \ install-tests_atf_reportSCRIPTS install-tests_atf_runDATA \ install-tests_atf_runPROGRAMS install-tests_atf_runSCRIPTS \ install-tests_atf_shDATA install-tests_atf_shSCRIPTS \ install-tests_test_programsDATA \ install-tests_test_programsPROGRAMS \ install-tests_test_programsSCRIPTS install-xslDATA \ installcheck installcheck-am installcheck-local installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-atf_aclocalDATA uninstall-atf_cHEADERS \ uninstall-atf_c__HEADERS uninstall-atf_c__dirpkgconfigDATA \ uninstall-atf_cpkgconfigDATA uninstall-atf_shDATA \ uninstall-atf_shpkgconfigDATA uninstall-binPROGRAMS \ uninstall-cssDATA uninstall-docDATA uninstall-dtdDATA \ uninstall-egDATA uninstall-hooksDATA uninstall-includeHEADERS \ uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ uninstall-man uninstall-man1 uninstall-man3 uninstall-man4 \ uninstall-man5 uninstall-man7 uninstall-pkgtestsDATA \ uninstall-tests_atf_cDATA uninstall-tests_atf_cPROGRAMS \ uninstall-tests_atf_cSCRIPTS uninstall-tests_atf_c__DATA \ uninstall-tests_atf_c__PROGRAMS uninstall-tests_atf_c__SCRIPTS \ uninstall-tests_atf_c___detailDATA \ uninstall-tests_atf_c___detailPROGRAMS \ uninstall-tests_atf_c_detailDATA \ uninstall-tests_atf_c_detailPROGRAMS \ uninstall-tests_atf_configDATA \ uninstall-tests_atf_configSCRIPTS \ uninstall-tests_atf_reportDATA \ uninstall-tests_atf_reportPROGRAMS \ uninstall-tests_atf_reportSCRIPTS uninstall-tests_atf_runDATA \ uninstall-tests_atf_runPROGRAMS uninstall-tests_atf_runSCRIPTS \ uninstall-tests_atf_shDATA uninstall-tests_atf_shSCRIPTS \ uninstall-tests_test_programsDATA \ uninstall-tests_test_programsPROGRAMS \ uninstall-tests_test_programsSCRIPTS uninstall-xslDATA dist-hook: check-style check-style: $(srcdir)/admin/check-style.sh # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 # XXX For some reason, the nodist line above does not work as expected. # Work this problem around. dist-hook: kill-defs-h kill-defs-h: rm -f $(distdir)/atf-c/defs.h atf-c/atf-c.pc: $(srcdir)/atf-c/atf-c.pc.in Makefile test -d atf-c || mkdir -p atf-c sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__CC__#$(CC)#g' \ -e 's#__INCLUDEDIR__#$(includedir)#g' \ -e 's#__LIBDIR__#$(libdir)#g' \ <$(srcdir)/atf-c/atf-c.pc.in >atf-c/atf-c.pc.tmp mv atf-c/atf-c.pc.tmp atf-c/atf-c.pc atf-c/pkg_config_test: $(srcdir)/atf-c/pkg_config_test.sh test -d atf-c || mkdir -p atf-c @src="$(srcdir)/atf-c/pkg_config_test.sh"; \ dst="atf-c/pkg_config_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 atf-c++/atf-c++.pc: $(srcdir)/atf-c++/atf-c++.pc.in Makefile test -d atf-c++ || mkdir -p atf-c++ sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__CXX__#$(CXX)#g' \ -e 's#__INCLUDEDIR__#$(includedir)#g' \ -e 's#__LIBDIR__#$(libdir)#g' \ <$(srcdir)/atf-c++/atf-c++.pc.in >atf-c++/atf-c++.pc.tmp mv atf-c++/atf-c++.pc.tmp atf-c++/atf-c++.pc atf-c++/pkg_config_test: $(srcdir)/atf-c++/pkg_config_test.sh test -d atf-c++ || mkdir -p atf-c++ @src="$(srcdir)/atf-c++/pkg_config_test.sh"; \ dst="atf-c++/pkg_config_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 atf-sh/atf-sh.pc: $(srcdir)/atf-sh/atf-sh.pc.in Makefile test -d atf-sh || mkdir -p atf-sh sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__EXEC_PREFIX__#$(exec_prefix)#g' \ <$(srcdir)/atf-sh/atf-sh.pc.in >atf-sh/atf-sh.pc.tmp mv atf-sh/atf-sh.pc.tmp atf-sh/atf-sh.pc atf-sh/misc_helpers: $(srcdir)/atf-sh/misc_helpers.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/misc_helpers.sh"; \ dst="atf-sh/misc_helpers"; $(BUILD_SH_TP) atf-sh/atf_check_test: $(srcdir)/atf-sh/atf_check_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/atf_check_test.sh"; \ dst="atf-sh/atf_check_test"; $(BUILD_SH_TP) atf-sh/atf-check_test: $(srcdir)/atf-sh/atf-check_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/atf-check_test.sh"; \ dst="atf-sh/atf-check_test"; $(BUILD_SH_TP) atf-sh/config_test: $(srcdir)/atf-sh/config_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/config_test.sh"; \ dst="atf-sh/config_test"; $(BUILD_SH_TP) atf-sh/integration_test: $(srcdir)/atf-sh/integration_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/integration_test.sh"; \ dst="atf-sh/integration_test"; $(BUILD_SH_TP) atf-sh/normalize_test: $(srcdir)/atf-sh/normalize_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/normalize_test.sh"; \ dst="atf-sh/normalize_test"; $(BUILD_SH_TP) atf-sh/tc_test: $(srcdir)/atf-sh/tc_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/tc_test.sh"; \ dst="atf-sh/tc_test"; $(BUILD_SH_TP) atf-sh/tp_test: $(srcdir)/atf-sh/tp_test.sh test -d atf-sh || mkdir -p atf-sh @src="$(srcdir)/atf-sh/tp_test.sh"; \ dst="atf-sh/tp_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bootstrap/h_tp_basic_sh: $(srcdir)/bootstrap/h_tp_basic_sh.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_basic_sh.sh; dst=$@; $(BUILD_SH_TP) bootstrap/h_tp_atf_check_sh: \ $(srcdir)/bootstrap/h_tp_atf_check_sh.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_atf_check_sh.sh; dst=$@; $(BUILD_SH_TP) bootstrap/h_tp_fail: $(srcdir)/bootstrap/h_tp_fail.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_fail.sh; dst=$@; $(BUILD_SH_TP) bootstrap/h_tp_pass: $(srcdir)/bootstrap/h_tp_pass.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_pass.sh; dst=$@; $(BUILD_SH_TP) distclean-local: -rm -rf testsuite.dir @target_srcdir@bootstrap/package.m4: $(top_srcdir)/configure.ac { \ echo '# Signature of the current package.'; \ echo 'm4_define(AT_PACKAGE_NAME, @PACKAGE_NAME@)'; \ echo 'm4_define(AT_PACKAGE_TARNAME, @PACKAGE_TARNAME@)'; \ echo 'm4_define(AT_PACKAGE_VERSION, @PACKAGE_VERSION@)'; \ echo 'm4_define(AT_PACKAGE_STRING, @PACKAGE_STRING@)'; \ echo 'm4_define(AT_PACKAGE_BUGREPORT, @PACKAGE_BUGREPORT@)'; \ echo 'm4_define(ENABLE_TOOLS, @ENABLE_TOOLS@)'; \ } >$(srcdir)/bootstrap/package.m4 @target_srcdir@bootstrap/testsuite: $(srcdir)/bootstrap/testsuite.at \ $(testsuite_incs) \ @target_srcdir@bootstrap/package.m4 autom4te --language=Autotest -I $(srcdir) \ -I $(srcdir)/bootstrap \ $(srcdir)/bootstrap/testsuite.at -o $@.tmp mv $@.tmp $@ installcheck-bootstrap: @target_srcdir@bootstrap/testsuite check $(TESTS_ENVIRONMENT) $(srcdir)/bootstrap/testsuite # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@doc/atf.7: $(srcdir)/doc/atf.7.in @ENABLE_TOOLS_TRUE@ test -d doc || mkdir -p doc @ENABLE_TOOLS_TRUE@ sed -e 's#__DOCDIR__#$(docdir)#g' \ @ENABLE_TOOLS_TRUE@ -e 's#__TESTSDIR__#$(testsdir)#g' \ @ENABLE_TOOLS_TRUE@ <$(srcdir)/doc/atf.7.in >doc/atf.7.tmp @ENABLE_TOOLS_TRUE@ mv doc/atf.7.tmp doc/atf.7 # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 test-programs/sh_helpers: $(srcdir)/test-programs/sh_helpers.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/sh_helpers.sh $(common_sh)"; \ dst="test-programs/sh_helpers"; $(BUILD_SH_TP) test-programs/config_test: $(srcdir)/test-programs/config_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/config_test.sh $(common_sh)"; \ dst="test-programs/config_test"; $(BUILD_SH_TP) test-programs/expect_test: $(srcdir)/test-programs/expect_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/expect_test.sh $(common_sh)"; \ dst="test-programs/expect_test"; $(BUILD_SH_TP) test-programs/meta_data_test: $(srcdir)/test-programs/meta_data_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/meta_data_test.sh $(common_sh)"; \ dst="test-programs/meta_data_test"; $(BUILD_SH_TP) test-programs/result_test: $(srcdir)/test-programs/result_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/result_test.sh $(common_sh)"; \ dst="test-programs/result_test"; $(BUILD_SH_TP) test-programs/srcdir_test: $(srcdir)/test-programs/srcdir_test.sh test -d test-programs || mkdir -p test-programs @src="$(srcdir)/test-programs/srcdir_test.sh $(common_sh)"; \ dst="test-programs/srcdir_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@atf-report/integration_test: $(srcdir)/atf-report/integration_test.sh @ENABLE_TOOLS_TRUE@ test -d atf-report || mkdir -p atf-report @ENABLE_TOOLS_TRUE@ @src="$(srcdir)/atf-report/integration_test.sh"; \ @ENABLE_TOOLS_TRUE@ dst="atf-report/integration_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@atf-config/integration_test: $(srcdir)/atf-config/integration_test.sh @ENABLE_TOOLS_TRUE@ test -d atf-config || mkdir -p atf-config @ENABLE_TOOLS_TRUE@ @src="$(srcdir)/atf-config/integration_test.sh"; \ @ENABLE_TOOLS_TRUE@ dst="atf-config/integration_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@atf-run/integration_test: $(srcdir)/atf-run/integration_test.sh @ENABLE_TOOLS_TRUE@ test -d atf-run || mkdir -p atf-run @ENABLE_TOOLS_TRUE@ @src="$(srcdir)/atf-run/integration_test.sh"; \ @ENABLE_TOOLS_TRUE@ dst="atf-run/integration_test"; $(BUILD_SH_TP) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@atf-version/revision.h: atf-version/revision.h.stamp @ENABLE_TOOLS_TRUE@ @test -d atf-version || mkdir -p atf-version @ENABLE_TOOLS_TRUE@ @cmp -s atf-version/revision.h atf-version/revision.h.stamp || \ @ENABLE_TOOLS_TRUE@ cp -p atf-version/revision.h.stamp atf-version/revision.h @ENABLE_TOOLS_TRUE@atf-version/revision.h.stamp: @ENABLE_TOOLS_TRUE@ @test -d atf-version || mkdir -p atf-version @ENABLE_TOOLS_TRUE@ @$(top_srcdir)/atf-version/generate-revision.sh \ @ENABLE_TOOLS_TRUE@ -g "$(GIT)" -r $(top_srcdir) -o atf-version/revision.h.stamp \ @ENABLE_TOOLS_TRUE@ -v $(PACKAGE_VERSION) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 @ENABLE_TOOLS_TRUE@installcheck-atf: @ENABLE_TOOLS_TRUE@ logfile=$$(pwd)/installcheck.log; \ @ENABLE_TOOLS_TRUE@ fifofile=$$(pwd)/installcheck.fifo; \ @ENABLE_TOOLS_TRUE@ cd $(pkgtestsdir); \ @ENABLE_TOOLS_TRUE@ rm -f $${fifofile}; \ @ENABLE_TOOLS_TRUE@ mkfifo $${fifofile}; \ @ENABLE_TOOLS_TRUE@ cat $${fifofile} | tee $${logfile} | $(TESTS_ENVIRONMENT) atf-report & \ @ENABLE_TOOLS_TRUE@ $(TESTS_ENVIRONMENT) atf-run >>$${fifofile}; \ @ENABLE_TOOLS_TRUE@ res=$${?}; \ @ENABLE_TOOLS_TRUE@ wait; \ @ENABLE_TOOLS_TRUE@ rm $${fifofile}; \ @ENABLE_TOOLS_TRUE@ echo; \ @ENABLE_TOOLS_TRUE@ echo "The verbatim output of atf-run has been saved to" \ @ENABLE_TOOLS_TRUE@ "installcheck.log; exit was $${res}"; \ @ENABLE_TOOLS_TRUE@ test $${res} -eq 0 @HAVE_KYUA_TRUE@installcheck-kyua: @HAVE_KYUA_TRUE@ cd $(pkgtestsdir) && $(TESTS_ENVIRONMENT) $(KYUA) test installcheck-local: $(INSTALLCHECK_TARGETS) # # Custom targets. # dist-hook: forbid-dist @ENABLE_TOOLS_TRUE@forbid-dist: @ENABLE_TOOLS_TRUE@ @true @ENABLE_TOOLS_FALSE@forbid-dist: @ENABLE_TOOLS_FALSE@ @echo "Sorry; cannot make dist without the tools enabled." @ENABLE_TOOLS_FALSE@ @echo "Please reconfigure with --enable-tools." @ENABLE_TOOLS_FALSE@ @false clean-all: GIT="$(GIT)" $(SH) $(srcdir)/admin/clean-all.sh release: $(SH) $(srcdir)/admin/release.sh $(PACKAGE_VERSION) $(DIST_ARCHIVES) release-test: $(SH) $(srcdir)/admin/release-test.sh $(DIST_ARCHIVES) .PHONY: $(PHONY_TARGETS) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bind9-9.9.5.dfsg/unit/atf-src/atf-c/0002755000470500017500000000000012276444014016354 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-c/check_test.c0000644000470500017500000004014212271526120020625 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "atf-c/check.h" #include "atf-c/config.h" #include "detail/fs.h" #include "detail/map.h" #include "detail/process.h" #include "detail/test_helpers.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void do_exec(const atf_tc_t *tc, const char *helper_name, atf_check_result_t *r) { atf_fs_path_t process_helpers; const char *argv[3]; get_process_helpers_path(tc, false, &process_helpers); argv[0] = atf_fs_path_cstring(&process_helpers); argv[1] = helper_name; argv[2] = NULL; printf("Executing %s %s\n", argv[0], argv[1]); RE(atf_check_exec_array(argv, r)); atf_fs_path_fini(&process_helpers); } static void do_exec_with_arg(const atf_tc_t *tc, const char *helper_name, const char *arg, atf_check_result_t *r) { atf_fs_path_t process_helpers; const char *argv[4]; get_process_helpers_path(tc, false, &process_helpers); argv[0] = atf_fs_path_cstring(&process_helpers); argv[1] = helper_name; argv[2] = arg; argv[3] = NULL; printf("Executing %s %s %s\n", argv[0], argv[1], argv[2]); RE(atf_check_exec_array(argv, r)); atf_fs_path_fini(&process_helpers); } static void check_line(int fd, const char *exp) { char *line = atf_utils_readline(fd); ATF_CHECK(line != NULL); ATF_CHECK_STREQ_MSG(exp, line, "read: '%s', expected: '%s'", line, exp); free(line); } /* --------------------------------------------------------------------- * Helper test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(h_build_c_o_ok); ATF_TC_HEAD(h_build_c_o_ok, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_c_o"); } ATF_TC_BODY(h_build_c_o_ok, tc) { FILE *sfile; bool success; ATF_REQUIRE((sfile = fopen("test.c", "w")) != NULL); fprintf(sfile, "#include \n"); fclose(sfile); RE(atf_check_build_c_o("test.c", "test.o", NULL, &success)); ATF_REQUIRE(success); } ATF_TC(h_build_c_o_fail); ATF_TC_HEAD(h_build_c_o_fail, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_c_o"); } ATF_TC_BODY(h_build_c_o_fail, tc) { FILE *sfile; bool success; ATF_REQUIRE((sfile = fopen("test.c", "w")) != NULL); fprintf(sfile, "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"); fclose(sfile); RE(atf_check_build_c_o("test.c", "test.o", NULL, &success)); ATF_REQUIRE(!success); } ATF_TC(h_build_cpp_ok); ATF_TC_HEAD(h_build_cpp_ok, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_cpp"); } ATF_TC_BODY(h_build_cpp_ok, tc) { FILE *sfile; bool success; atf_fs_path_t test_p; RE(atf_fs_path_init_fmt(&test_p, "test.p")); ATF_REQUIRE((sfile = fopen("test.c", "w")) != NULL); fprintf(sfile, "#define A foo\n"); fprintf(sfile, "#define B bar\n"); fprintf(sfile, "A B\n"); fclose(sfile); RE(atf_check_build_cpp("test.c", atf_fs_path_cstring(&test_p), NULL, &success)); ATF_REQUIRE(success); atf_fs_path_fini(&test_p); } ATF_TC(h_build_cpp_fail); ATF_TC_HEAD(h_build_cpp_fail, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_cpp"); } ATF_TC_BODY(h_build_cpp_fail, tc) { FILE *sfile; bool success; ATF_REQUIRE((sfile = fopen("test.c", "w")) != NULL); fprintf(sfile, "#include \"./non-existent.h\"\n"); fclose(sfile); RE(atf_check_build_cpp("test.c", "test.p", NULL, &success)); ATF_REQUIRE(!success); } ATF_TC(h_build_cxx_o_ok); ATF_TC_HEAD(h_build_cxx_o_ok, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_cxx_o"); } ATF_TC_BODY(h_build_cxx_o_ok, tc) { FILE *sfile; bool success; ATF_REQUIRE((sfile = fopen("test.cpp", "w")) != NULL); fprintf(sfile, "#include \n"); fclose(sfile); RE(atf_check_build_cxx_o("test.cpp", "test.o", NULL, &success)); ATF_REQUIRE(success); } ATF_TC(h_build_cxx_o_fail); ATF_TC_HEAD(h_build_cxx_o_fail, tc) { atf_tc_set_md_var(tc, "descr", "Helper test case for build_cxx_o"); } ATF_TC_BODY(h_build_cxx_o_fail, tc) { FILE *sfile; bool success; ATF_REQUIRE((sfile = fopen("test.cpp", "w")) != NULL); fprintf(sfile, "void foo(void) { int a = UNDEFINED_SYMBOL; }\n"); fclose(sfile); RE(atf_check_build_cxx_o("test.cpp", "test.o", NULL, &success)); ATF_REQUIRE(!success); } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ static void init_and_run_h_tc(atf_tc_t *tc, const atf_tc_pack_t *tcpack, const char *outname, const char *errname) { const char *const config[] = { NULL }; RE(atf_tc_init_pack(tc, tcpack, config)); run_h_tc(tc, outname, errname, "result"); atf_tc_fini(tc); } ATF_TC(build_c_o); ATF_TC_HEAD(build_c_o, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_check_build_c_o " "function"); } ATF_TC_BODY(build_c_o, tc) { init_and_run_h_tc(&ATF_TC_NAME(h_build_c_o_ok), &ATF_TC_PACK_NAME(h_build_c_o_ok), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o test.o", "stdout")); ATF_CHECK(atf_utils_grep_file("-c test.c", "stdout")); init_and_run_h_tc(&ATF_TC_NAME(h_build_c_o_fail), &ATF_TC_PACK_NAME(h_build_c_o_fail), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o test.o", "stdout")); ATF_CHECK(atf_utils_grep_file("-c test.c", "stdout")); ATF_CHECK(atf_utils_grep_file("test.c", "stderr")); ATF_CHECK(atf_utils_grep_file("UNDEFINED_SYMBOL", "stderr")); } ATF_TC(build_cpp); ATF_TC_HEAD(build_cpp, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_check_build_cpp " "function"); } ATF_TC_BODY(build_cpp, tc) { init_and_run_h_tc(&ATF_TC_NAME(h_build_cpp_ok), &ATF_TC_PACK_NAME(h_build_cpp_ok), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o.*test.p", "stdout")); ATF_CHECK(atf_utils_grep_file("test.c", "stdout")); ATF_CHECK(atf_utils_grep_file("foo bar", "test.p")); init_and_run_h_tc(&ATF_TC_NAME(h_build_cpp_fail), &ATF_TC_PACK_NAME(h_build_cpp_fail), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o test.p", "stdout")); ATF_CHECK(atf_utils_grep_file("test.c", "stdout")); ATF_CHECK(atf_utils_grep_file("test.c", "stderr")); ATF_CHECK(atf_utils_grep_file("non-existent.h", "stderr")); } ATF_TC(build_cxx_o); ATF_TC_HEAD(build_cxx_o, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_check_build_cxx_o " "function"); } ATF_TC_BODY(build_cxx_o, tc) { init_and_run_h_tc(&ATF_TC_NAME(h_build_cxx_o_ok), &ATF_TC_PACK_NAME(h_build_cxx_o_ok), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o test.o", "stdout")); ATF_CHECK(atf_utils_grep_file("-c test.cpp", "stdout")); init_and_run_h_tc(&ATF_TC_NAME(h_build_cxx_o_fail), &ATF_TC_PACK_NAME(h_build_cxx_o_fail), "stdout", "stderr"); ATF_CHECK(atf_utils_grep_file("-o test.o", "stdout")); ATF_CHECK(atf_utils_grep_file("-c test.cpp", "stdout")); ATF_CHECK(atf_utils_grep_file("test.cpp", "stderr")); ATF_CHECK(atf_utils_grep_file("UNDEFINED_SYMBOL", "stderr")); } ATF_TC(exec_array); ATF_TC_HEAD(exec_array, tc) { atf_tc_set_md_var(tc, "descr", "Checks that atf_check_exec_array " "works properly"); } ATF_TC_BODY(exec_array, tc) { atf_fs_path_t process_helpers; atf_check_result_t result; get_process_helpers_path(tc, false, &process_helpers); const char *argv[4]; argv[0] = atf_fs_path_cstring(&process_helpers); argv[1] = "echo"; argv[2] = "test-message"; argv[3] = NULL; RE(atf_check_exec_array(argv, &result)); ATF_CHECK(atf_check_result_exited(&result)); ATF_CHECK(atf_check_result_exitcode(&result) == EXIT_SUCCESS); { const char *path = atf_check_result_stdout(&result); int fd = open(path, O_RDONLY); ATF_CHECK(fd != -1); check_line(fd, "test-message"); close(fd); } atf_check_result_fini(&result); atf_fs_path_fini(&process_helpers); } ATF_TC(exec_cleanup); ATF_TC_HEAD(exec_cleanup, tc) { atf_tc_set_md_var(tc, "descr", "Checks that atf_check_exec_array " "properly cleans up the temporary files it creates"); } ATF_TC_BODY(exec_cleanup, tc) { atf_fs_path_t out, err; atf_check_result_t result; bool exists; do_exec(tc, "exit-success", &result); RE(atf_fs_path_init_fmt(&out, "%s", atf_check_result_stdout(&result))); RE(atf_fs_path_init_fmt(&err, "%s", atf_check_result_stderr(&result))); RE(atf_fs_exists(&out, &exists)); ATF_CHECK(exists); RE(atf_fs_exists(&err, &exists)); ATF_CHECK(exists); atf_check_result_fini(&result); RE(atf_fs_exists(&out, &exists)); ATF_CHECK(!exists); RE(atf_fs_exists(&err, &exists)); ATF_CHECK(!exists); atf_fs_path_fini(&err); atf_fs_path_fini(&out); } ATF_TC(exec_exitstatus); ATF_TC_HEAD(exec_exitstatus, tc) { atf_tc_set_md_var(tc, "descr", "Checks that atf_check_exec_array " "properly captures the exit status of the executed " "command"); } ATF_TC_BODY(exec_exitstatus, tc) { { atf_check_result_t result; do_exec(tc, "exit-success", &result); ATF_CHECK(atf_check_result_exited(&result)); ATF_CHECK(!atf_check_result_signaled(&result)); ATF_CHECK(atf_check_result_exitcode(&result) == EXIT_SUCCESS); atf_check_result_fini(&result); } { atf_check_result_t result; do_exec(tc, "exit-failure", &result); ATF_CHECK(atf_check_result_exited(&result)); ATF_CHECK(!atf_check_result_signaled(&result)); ATF_CHECK(atf_check_result_exitcode(&result) == EXIT_FAILURE); atf_check_result_fini(&result); } { atf_check_result_t result; do_exec(tc, "exit-signal", &result); ATF_CHECK(!atf_check_result_exited(&result)); ATF_CHECK(atf_check_result_signaled(&result)); ATF_CHECK(atf_check_result_termsig(&result) == SIGKILL); atf_check_result_fini(&result); } } ATF_TC(exec_stdout_stderr); ATF_TC_HEAD(exec_stdout_stderr, tc) { atf_tc_set_md_var(tc, "descr", "Checks that atf_check_exec_array " "properly captures the stdout and stderr streams " "of the child process"); } ATF_TC_BODY(exec_stdout_stderr, tc) { atf_check_result_t result1, result2; const char *out1, *out2; const char *err1, *err2; do_exec_with_arg(tc, "stdout-stderr", "result1", &result1); ATF_CHECK(atf_check_result_exited(&result1)); ATF_CHECK(atf_check_result_exitcode(&result1) == EXIT_SUCCESS); do_exec_with_arg(tc, "stdout-stderr", "result2", &result2); ATF_CHECK(atf_check_result_exited(&result2)); ATF_CHECK(atf_check_result_exitcode(&result2) == EXIT_SUCCESS); out1 = atf_check_result_stdout(&result1); out2 = atf_check_result_stdout(&result2); err1 = atf_check_result_stderr(&result1); err2 = atf_check_result_stderr(&result2); ATF_CHECK(strstr(out1, "check.XXXXXX") == NULL); ATF_CHECK(strstr(out2, "check.XXXXXX") == NULL); ATF_CHECK(strstr(err1, "check.XXXXXX") == NULL); ATF_CHECK(strstr(err2, "check.XXXXXX") == NULL); ATF_CHECK(strstr(out1, "/check") != NULL); ATF_CHECK(strstr(out2, "/check") != NULL); ATF_CHECK(strstr(err1, "/check") != NULL); ATF_CHECK(strstr(err2, "/check") != NULL); ATF_CHECK(strstr(out1, "/stdout") != NULL); ATF_CHECK(strstr(out2, "/stdout") != NULL); ATF_CHECK(strstr(err1, "/stderr") != NULL); ATF_CHECK(strstr(err2, "/stderr") != NULL); ATF_CHECK(strcmp(out1, out2) != 0); ATF_CHECK(strcmp(err1, err2) != 0); #define CHECK_LINES(path, outname, resname) \ do { \ int fd = open(path, O_RDONLY); \ ATF_CHECK(fd != -1); \ check_line(fd, "Line 1 to " outname " for " resname); \ check_line(fd, "Line 2 to " outname " for " resname); \ close(fd); \ } while (false) CHECK_LINES(out1, "stdout", "result1"); CHECK_LINES(out2, "stdout", "result2"); CHECK_LINES(err1, "stderr", "result1"); CHECK_LINES(err2, "stderr", "result2"); #undef CHECK_LINES atf_check_result_fini(&result2); atf_check_result_fini(&result1); } ATF_TC(exec_umask); ATF_TC_HEAD(exec_umask, tc) { atf_tc_set_md_var(tc, "descr", "Checks that atf_check_exec_array " "correctly reports an error if the umask is too " "restrictive to create temporary files"); } ATF_TC_BODY(exec_umask, tc) { atf_check_result_t result; atf_fs_path_t process_helpers; const char *argv[3]; get_process_helpers_path(tc, false, &process_helpers); argv[0] = atf_fs_path_cstring(&process_helpers); argv[1] = "exit-success"; argv[2] = NULL; umask(0222); atf_error_t err = atf_check_exec_array(argv, &result); ATF_CHECK(atf_is_error(err)); ATF_CHECK(atf_error_is(err, "invalid_umask")); atf_error_free(err); atf_fs_path_fini(&process_helpers); } ATF_TC(exec_unknown); ATF_TC_HEAD(exec_unknown, tc) { atf_tc_set_md_var(tc, "descr", "Checks that running a non-existing " "binary is handled correctly"); } ATF_TC_BODY(exec_unknown, tc) { char buf[1024]; snprintf(buf, sizeof(buf), "%s/non-existent", atf_config_get("atf_workdir")); const char *argv[2]; argv[0] = buf; argv[1] = NULL; atf_check_result_t result; RE(atf_check_exec_array(argv, &result)); ATF_CHECK(atf_check_result_exited(&result)); ATF_CHECK(atf_check_result_exitcode(&result) == 127); atf_check_result_fini(&result); } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/check.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the test cases for the free functions. */ ATF_TP_ADD_TC(tp, build_c_o); ATF_TP_ADD_TC(tp, build_cpp); ATF_TP_ADD_TC(tp, build_cxx_o); ATF_TP_ADD_TC(tp, exec_array); ATF_TP_ADD_TC(tp, exec_cleanup); ATF_TP_ADD_TC(tp, exec_exitstatus); ATF_TP_ADD_TC(tp, exec_stdout_stderr); ATF_TP_ADD_TC(tp, exec_umask); ATF_TP_ADD_TC(tp, exec_unknown); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/build.c0000644000470500017500000001531712271526120017616 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2009 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "atf-c/build.h" #include "atf-c/config.h" #include "atf-c/error.h" #include "detail/sanity.h" #include "detail/text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static atf_error_t append_config_var(const char *var, atf_list_t *argv) { atf_error_t err; atf_list_t words; err = atf_text_split(atf_config_get(var), " ", &words); if (atf_is_error(err)) goto out; atf_list_append_list(argv, &words); out: return err; } static atf_error_t append_arg1(const char *arg, atf_list_t *argv) { return atf_list_append(argv, strdup(arg), true); } static atf_error_t append_arg2(const char *flag, const char *arg, atf_list_t *argv) { atf_error_t err; err = append_arg1(flag, argv); if (!atf_is_error(err)) err = append_arg1(arg, argv); return err; } static atf_error_t append_optargs(const char *const optargs[], atf_list_t *argv) { atf_error_t err; err = atf_no_error(); while (*optargs != NULL && !atf_is_error(err)) { err = append_arg1(strdup(*optargs), argv); optargs++; } return err; } static atf_error_t append_src_out(const char *src, const char *obj, atf_list_t *argv) { atf_error_t err; err = append_arg2("-o", obj, argv); if (atf_is_error(err)) goto out; err = append_arg1("-c", argv); if (atf_is_error(err)) goto out; err = append_arg1(src, argv); out: return err; } static atf_error_t list_to_array(const atf_list_t *l, char ***ap) { atf_error_t err; char **a; a = (char **)malloc((atf_list_size(l) + 1) * sizeof(char *)); if (a == NULL) err = atf_no_memory_error(); else { char **aiter; atf_list_citer_t liter; aiter = a; atf_list_for_each_c(liter, l) { *aiter = strdup((const char *)atf_list_citer_data(liter)); aiter++; } *aiter = NULL; err = atf_no_error(); } *ap = a; /* Shut up warnings in the caller about uninitialized *ap. */ return err; } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_build_c_o(const char *sfile, const char *ofile, const char *const optargs[], char ***argv) { atf_error_t err; atf_list_t argv_list; err = atf_list_init(&argv_list); if (atf_is_error(err)) goto out; err = append_config_var("atf_build_cc", &argv_list); if (atf_is_error(err)) goto out_list; err = append_config_var("atf_build_cppflags", &argv_list); if (atf_is_error(err)) goto out_list; err = append_config_var("atf_build_cflags", &argv_list); if (atf_is_error(err)) goto out_list; if (optargs != NULL) { err = append_optargs(optargs, &argv_list); if (atf_is_error(err)) goto out_list; } err = append_src_out(sfile, ofile, &argv_list); if (atf_is_error(err)) goto out_list; err = list_to_array(&argv_list, argv); if (atf_is_error(err)) goto out_list; out_list: atf_list_fini(&argv_list); out: return err; } atf_error_t atf_build_cpp(const char *sfile, const char *ofile, const char *const optargs[], char ***argv) { atf_error_t err; atf_list_t argv_list; err = atf_list_init(&argv_list); if (atf_is_error(err)) goto out; err = append_config_var("atf_build_cpp", &argv_list); if (atf_is_error(err)) goto out_list; err = append_config_var("atf_build_cppflags", &argv_list); if (atf_is_error(err)) goto out_list; if (optargs != NULL) { err = append_optargs(optargs, &argv_list); if (atf_is_error(err)) goto out_list; } err = append_arg2("-o", ofile, &argv_list); if (atf_is_error(err)) goto out_list; err = append_arg1(sfile, &argv_list); if (atf_is_error(err)) goto out_list; err = list_to_array(&argv_list, argv); if (atf_is_error(err)) goto out_list; out_list: atf_list_fini(&argv_list); out: return err; } atf_error_t atf_build_cxx_o(const char *sfile, const char *ofile, const char *const optargs[], char ***argv) { atf_error_t err; atf_list_t argv_list; err = atf_list_init(&argv_list); if (atf_is_error(err)) goto out; err = append_config_var("atf_build_cxx", &argv_list); if (atf_is_error(err)) goto out_list; err = append_config_var("atf_build_cppflags", &argv_list); if (atf_is_error(err)) goto out_list; err = append_config_var("atf_build_cxxflags", &argv_list); if (atf_is_error(err)) goto out_list; if (optargs != NULL) { err = append_optargs(optargs, &argv_list); if (atf_is_error(err)) goto out_list; } err = append_src_out(sfile, ofile, &argv_list); if (atf_is_error(err)) goto out_list; err = list_to_array(&argv_list, argv); if (atf_is_error(err)) goto out_list; out_list: atf_list_fini(&argv_list); out: return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/utils.h0000644000470500017500000000441112271526120017655 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_UTILS_H) #define ATF_C_UTILS_H #include #include #include void atf_utils_cat_file(const char *, const char *); bool atf_utils_compare_file(const char *, const char *); void atf_utils_copy_file(const char *, const char *); void atf_utils_create_file(const char *, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(2, 3); bool atf_utils_file_exists(const char *); pid_t atf_utils_fork(void); void atf_utils_free_charpp(char **); bool atf_utils_grep_file(const char *, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 3); bool atf_utils_grep_string(const char *, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 3); char *atf_utils_readline(int); void atf_utils_redirect(const int, const char *); void atf_utils_wait(const pid_t, const int, const char *, const char *); #endif /* ATF_C_UTILS_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/config.c0000644000470500017500000001125412271526120017760 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/config.h" #include "detail/env.h" #include "detail/sanity.h" static bool initialized = false; static struct var { const char *name; const char *default_value; const char *value; bool can_be_empty; } vars[] = { { "atf_arch", ATF_ARCH, NULL, false, }, { "atf_build_cc", ATF_BUILD_CC, NULL, false, }, { "atf_build_cflags", ATF_BUILD_CFLAGS, NULL, true, }, { "atf_build_cpp", ATF_BUILD_CPP, NULL, false, }, { "atf_build_cppflags", ATF_BUILD_CPPFLAGS, NULL, true, }, { "atf_build_cxx", ATF_BUILD_CXX, NULL, false, }, { "atf_build_cxxflags", ATF_BUILD_CXXFLAGS, NULL, true, }, { "atf_confdir", ATF_CONFDIR, NULL, false, }, { "atf_includedir", ATF_INCLUDEDIR, NULL, false, }, { "atf_libdir", ATF_LIBDIR, NULL, false, }, { "atf_libexecdir", ATF_LIBEXECDIR, NULL, false, }, { "atf_machine", ATF_MACHINE, NULL, false, }, { "atf_pkgdatadir", ATF_PKGDATADIR, NULL, false, }, { "atf_shell", ATF_SHELL, NULL, false, }, { "atf_workdir", ATF_WORKDIR, NULL, false, }, { NULL, NULL, NULL, false, }, }; /* Only used for unit testing, so this prototype is private. */ void __atf_config_reinit(void); /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static char * string_to_upper(const char *str) { char *uc; uc = (char *)malloc(strlen(str) + 1); if (uc != NULL) { char *ucptr = uc; while (*str != '\0') { *ucptr = toupper((int)*str); str++; ucptr++; } *ucptr = '\0'; } return uc; } static void initialize_var(struct var *var, const char *envname) { PRE(var->value == NULL); if (atf_env_has(envname)) { const char *val = atf_env_get(envname); if (strlen(val) > 0 || var->can_be_empty) var->value = val; else var->value = var->default_value; } else var->value = var->default_value; POST(var->value != NULL); } static void initialize(void) { struct var *var; PRE(!initialized); for (var = vars; var->name != NULL; var++) { char *envname; envname = string_to_upper(var->name); initialize_var(var, envname); free(envname); } initialized = true; } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ const char * atf_config_get(const char *name) { const struct var *var; const char *value; if (!initialized) { initialize(); INV(initialized); } value = NULL; for (var = vars; value == NULL && var->name != NULL; var++) if (strcmp(var->name, name) == 0) value = var->value; INV(value != NULL); return value; } void __atf_config_reinit(void) { struct var *var; initialized = false; for (var = vars; var->name != NULL; var++) var->value = NULL; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/macros_h_test.c0000644000470500017500000001000012271526120021331 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include void atf_require_inside_if(void); void atf_require_equal_inside_if(void); void atf_check_errno_semicolons(void); void atf_require_errno_semicolons(void); void atf_require_inside_if(void) { /* Make sure that ATF_REQUIRE can be used inside an if statement that * does not have braces. Earlier versions of it generated an error * if there was an else clause because they confused the compiler * by defining an unprotected nested if. */ if (true) ATF_REQUIRE(true); else ATF_REQUIRE(true); } void atf_require_equal_inside_if(void) { /* Make sure that ATF_REQUIRE_EQUAL can be used inside an if statement * that does not have braces. Earlier versions of it generated an * error if there was an else clause because they confused the * compiler by defining an unprotected nested if. */ if (true) ATF_REQUIRE_EQ(true, true); else ATF_REQUIRE_EQ(true, true); } void atf_check_errno_semicolons(void) { /* Check that ATF_CHECK_ERRNO does not contain a semicolon that would * cause an empty-statement that confuses some compilers. */ ATF_CHECK_ERRNO(1, 1 == 1); ATF_CHECK_ERRNO(2, 2 == 2); } void atf_require_errno_semicolons(void) { /* Check that ATF_REQUIRE_ERRNO does not contain a semicolon that would * cause an empty-statement that confuses some compilers. */ ATF_REQUIRE_ERRNO(1, 1 == 1); ATF_REQUIRE_ERRNO(2, 2 == 2); } /* Test case names should not be expanded during instatiation so that they * can have the exact same name as macros. */ #define TEST_MACRO_1 invalid + name #define TEST_MACRO_2 invalid + name #define TEST_MACRO_3 invalid + name ATF_TC(TEST_MACRO_1); ATF_TC_HEAD(TEST_MACRO_1, tc) { if (tc != NULL) {} } ATF_TC_BODY(TEST_MACRO_1, tc) { if (tc != NULL) {} } atf_tc_t *test_name_1 = &ATF_TC_NAME(TEST_MACRO_1); void (*head_1)(atf_tc_t *) = ATF_TC_HEAD_NAME(TEST_MACRO_1); void (*body_1)(const atf_tc_t *) = ATF_TC_BODY_NAME(TEST_MACRO_1); ATF_TC_WITH_CLEANUP(TEST_MACRO_2); ATF_TC_HEAD(TEST_MACRO_2, tc) { if (tc != NULL) {} } ATF_TC_BODY(TEST_MACRO_2, tc) { if (tc != NULL) {} } ATF_TC_CLEANUP(TEST_MACRO_2, tc) { if (tc != NULL) {} } atf_tc_t *test_name_2 = &ATF_TC_NAME(TEST_MACRO_2); void (*head_2)(atf_tc_t *) = ATF_TC_HEAD_NAME(TEST_MACRO_2); void (*body_2)(const atf_tc_t *) = ATF_TC_BODY_NAME(TEST_MACRO_2); void (*cleanup_2)(const atf_tc_t *) = ATF_TC_CLEANUP_NAME(TEST_MACRO_2); ATF_TC_WITHOUT_HEAD(TEST_MACRO_3); ATF_TC_BODY(TEST_MACRO_3, tc) { if (tc != NULL) {} } atf_tc_t *test_name_3 = &ATF_TC_NAME(TEST_MACRO_3); void (*body_3)(const atf_tc_t *) = ATF_TC_BODY_NAME(TEST_MACRO_3); bind9-9.9.5.dfsg/unit/atf-src/atf-c/error_fwd.h0000644000470500017500000000333312271526120020510 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_ERROR_FWD_H) #define ATF_C_ERROR_FWD_H /* --------------------------------------------------------------------- * The "atf_error" type. * --------------------------------------------------------------------- */ struct atf_error; typedef struct atf_error *atf_error_t; #endif /* ATF_C_ERROR_FWD_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/utils.c0000644000470500017500000002770412271526120017662 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "atf-c/utils.h" #include #include #include #include #include #include #include #include #include #include #include #include "detail/dynstr.h" /** Searches for a regexp in a string. * * \param regex The regexp to look for. * \param str The string in which to look for the expression. * * \return True if there is a match; false otherwise. */ static bool grep_string(const char *regex, const char *str) { int res; regex_t preg; printf("Looking for '%s' in '%s'\n", regex, str); ATF_REQUIRE(regcomp(&preg, regex, REG_EXTENDED) == 0); res = regexec(&preg, str, 0, NULL, 0); ATF_REQUIRE(res == 0 || res == REG_NOMATCH); regfree(&preg); return res == 0; } /** Prints the contents of a file to stdout. * * \param name The name of the file to be printed. * \param prefix An string to be prepended to every line of the printed * file. */ void atf_utils_cat_file(const char *name, const char *prefix) { const int fd = open(name, O_RDONLY); ATF_REQUIRE_MSG(fd != -1, "Cannot open %s", name); char buffer[1024]; ssize_t count; bool continued = false; while ((count = read(fd, buffer, sizeof(buffer) - 1)) > 0) { buffer[count] = '\0'; if (!continued) printf("%s", prefix); char *iter = buffer; char *end; while ((end = strchr(iter, '\n')) != NULL) { *end = '\0'; printf("%s\n", iter); iter = end + 1; if (iter != buffer + count) printf("%s", prefix); else continued = false; } if (iter < buffer + count) { printf("%s", iter); continued = true; } } ATF_REQUIRE(count == 0); } /** Compares a file against the given golden contents. * * \param name Name of the file to be compared. * \param contents Expected contents of the file. * * \return True if the file matches the contents; false otherwise. */ bool atf_utils_compare_file(const char *name, const char *contents) { const int fd = open(name, O_RDONLY); ATF_REQUIRE_MSG(fd != -1, "Cannot open %s", name); const char *pos = contents; ssize_t remaining = strlen(contents); char buffer[1024]; ssize_t count; while ((count = read(fd, buffer, sizeof(buffer))) > 0 && count <= remaining) { if (memcmp(pos, buffer, count) != 0) { close(fd); return false; } remaining -= count; pos += count; } close(fd); return count == 0 && remaining == 0; } /** Copies a file. * * \param source Path to the source file. * \param destination Path to the destination file. */ void atf_utils_copy_file(const char *source, const char *destination) { const int input = open(source, O_RDONLY); ATF_REQUIRE_MSG(input != -1, "Failed to open source file during " "copy (%s)", source); const int output = open(destination, O_WRONLY | O_CREAT | O_TRUNC, 0777); ATF_REQUIRE_MSG(output != -1, "Failed to open destination file during " "copy (%s)", destination); char buffer[1024]; ssize_t length; while ((length = read(input, buffer, sizeof(buffer))) > 0) ATF_REQUIRE_MSG(write(output, buffer, length) == length, "Failed to write to %s during copy", destination); ATF_REQUIRE_MSG(length != -1, "Failed to read from %s during copy", source); struct stat sb; ATF_REQUIRE_MSG(fstat(input, &sb) != -1, "Failed to stat source file %s during copy", source); ATF_REQUIRE_MSG(fchmod(output, sb.st_mode) != -1, "Failed to chmod destination file %s during copy", destination); close(output); close(input); } /** Creates a file. * * \param name Name of the file to create. * \param contents Text to write into the created file. * \param ... Positional parameters to the contents. */ void atf_utils_create_file(const char *name, const char *contents, ...) { va_list ap; atf_dynstr_t formatted; atf_error_t error; va_start(ap, contents); error = atf_dynstr_init_ap(&formatted, contents, ap); va_end(ap); ATF_REQUIRE(!atf_is_error(error)); const int fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0644); ATF_REQUIRE_MSG(fd != -1, "Cannot create file %s", name); ATF_REQUIRE(write(fd, atf_dynstr_cstring(&formatted), atf_dynstr_length(&formatted)) != -1); close(fd); atf_dynstr_fini(&formatted); } /** Checks if a file exists. * * \param path Location of the file to check for. * * \return True if the file exists, false otherwise. */ bool atf_utils_file_exists(const char *path) { const int ret = access(path, F_OK); if (ret == -1) { if (errno != ENOENT) atf_tc_fail("Failed to check the existence of %s: %s", path, strerror(errno)); else return false; } else return true; } /** Spawns a subprocess and redirects its output to files. * * Use the atf_utils_wait() function to wait for the completion of the spawned * subprocess and validate its exit conditions. * * \return 0 in the new child; the PID of the new child in the parent. Does * not return in error conditions. */ pid_t atf_utils_fork(void) { const pid_t pid = fork(); if (pid == -1) atf_tc_fail("fork failed"); if (pid == 0) { atf_utils_redirect(STDOUT_FILENO, "atf_utils_fork_out.txt"); atf_utils_redirect(STDERR_FILENO, "atf_utils_fork_err.txt"); } return pid; } /** Frees an dynamically-allocated "argv" array. * * \param argv A dynamically-allocated array of dynamically-allocated * strings. */ void atf_utils_free_charpp(char **argv) { char **ptr; for (ptr = argv; *ptr != NULL; ptr++) free(*ptr); free(argv); } /** Searches for a regexp in a file. * * \param regex The regexp to look for. * \param file The file in which to look for the expression. * \param ... Positional parameters to the regex. * * \return True if there is a match; false otherwise. */ bool atf_utils_grep_file(const char *regex, const char *file, ...) { int fd; va_list ap; atf_dynstr_t formatted; atf_error_t error; va_start(ap, file); error = atf_dynstr_init_ap(&formatted, regex, ap); va_end(ap); ATF_REQUIRE(!atf_is_error(error)); ATF_REQUIRE((fd = open(file, O_RDONLY)) != -1); bool found = false; char *line = NULL; while (!found && (line = atf_utils_readline(fd)) != NULL) { found = grep_string(atf_dynstr_cstring(&formatted), line); free(line); } close(fd); atf_dynstr_fini(&formatted); return found; } /** Searches for a regexp in a string. * * \param regex The regexp to look for. * \param str The string in which to look for the expression. * \param ... Positional parameters to the regex. * * \return True if there is a match; false otherwise. */ bool atf_utils_grep_string(const char *regex, const char *str, ...) { bool res; va_list ap; atf_dynstr_t formatted; atf_error_t error; va_start(ap, str); error = atf_dynstr_init_ap(&formatted, regex, ap); va_end(ap); ATF_REQUIRE(!atf_is_error(error)); res = grep_string(atf_dynstr_cstring(&formatted), str); atf_dynstr_fini(&formatted); return res; } /** Reads a line of arbitrary length. * * \param fd The descriptor from which to read the line. * * \return A pointer to the read line, which must be released with free(), or * NULL if there was nothing to read from the file. */ char * atf_utils_readline(const int fd) { char ch; ssize_t cnt; atf_dynstr_t temp; atf_error_t error; error = atf_dynstr_init(&temp); ATF_REQUIRE(!atf_is_error(error)); while ((cnt = read(fd, &ch, sizeof(ch))) == sizeof(ch) && ch != '\n') { error = atf_dynstr_append_fmt(&temp, "%c", ch); ATF_REQUIRE(!atf_is_error(error)); } ATF_REQUIRE(cnt != -1); if (cnt == 0 && atf_dynstr_length(&temp) == 0) { atf_dynstr_fini(&temp); return NULL; } else return atf_dynstr_fini_disown(&temp); } /** Redirects a file descriptor to a file. * * \param target_fd The file descriptor to be replaced. * \param name The name of the file to direct the descriptor to. * * \pre Should only be called from the process spawned by fork_for_testing * because this exits uncontrolledly. * \post Terminates execution if the redirection fails. */ void atf_utils_redirect(const int target_fd, const char *name) { if (target_fd == STDOUT_FILENO) fflush(stdout); else if (target_fd == STDERR_FILENO) fflush(stderr); const int new_fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (new_fd == -1) err(EXIT_FAILURE, "Cannot create %s", name); if (new_fd != target_fd) { if (dup2(new_fd, target_fd) == -1) err(EXIT_FAILURE, "Cannot redirect to fd %d", target_fd); } close(new_fd); } /** Waits for a subprocess and validates its exit condition. * * \param pid The process to be waited for. Must have been started by * testutils_fork(). * \param exitstatus Expected exit status. * \param expout Expected contents of stdout. * \param experr Expected contents of stderr. */ void atf_utils_wait(const pid_t pid, const int exitstatus, const char *expout, const char *experr) { int status; ATF_REQUIRE(waitpid(pid, &status, 0) != -1); atf_utils_cat_file("atf_utils_fork_out.txt", "subprocess stdout: "); atf_utils_cat_file("atf_utils_fork_err.txt", "subprocess stderr: "); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(exitstatus, WEXITSTATUS(status)); const char *save_prefix = "save:"; const size_t save_prefix_length = strlen(save_prefix); if (strlen(expout) > save_prefix_length && strncmp(expout, save_prefix, save_prefix_length) == 0) { atf_utils_copy_file("atf_utils_fork_out.txt", expout + save_prefix_length); } else { ATF_REQUIRE(atf_utils_compare_file("atf_utils_fork_out.txt", expout)); } if (strlen(experr) > save_prefix_length && strncmp(experr, save_prefix, save_prefix_length) == 0) { atf_utils_copy_file("atf_utils_fork_err.txt", experr + save_prefix_length); } else { ATF_REQUIRE(atf_utils_compare_file("atf_utils_fork_err.txt", experr)); } ATF_REQUIRE(unlink("atf_utils_fork_out.txt") != -1); ATF_REQUIRE(unlink("atf_utils_fork_err.txt") != -1); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/atf-c-api.30000644000470500017500000005120112271526120020170 0ustar lamontlamont.\" .\" Automated Testing Framework (atf) .\" .\" Copyright (c) 2008 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND .\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, .\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE .\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER .\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .Dd November 30, 2012 .Dt ATF-C-API 3 .Os .Sh NAME .Nm atf-c-api , .Nm ATF_CHECK , .Nm ATF_CHECK_MSG , .Nm ATF_CHECK_EQ , .Nm ATF_CHECK_EQ_MSG , .Nm ATF_CHECK_MATCH , .Nm ATF_CHECK_MATCH_MSG , .Nm ATF_CHECK_STREQ , .Nm ATF_CHECK_STREQ_MSG , .Nm ATF_CHECK_ERRNO , .Nm ATF_REQUIRE , .Nm ATF_REQUIRE_MSG , .Nm ATF_REQUIRE_EQ , .Nm ATF_REQUIRE_EQ_MSG , .Nm ATF_REQUIRE_MATCH , .Nm ATF_REQUIRE_MATCH_MSG , .Nm ATF_REQUIRE_STREQ , .Nm ATF_REQUIRE_STREQ_MSG , .Nm ATF_REQUIRE_ERRNO , .Nm ATF_TC , .Nm ATF_TC_BODY , .Nm ATF_TC_BODY_NAME , .Nm ATF_TC_CLEANUP , .Nm ATF_TC_CLEANUP_NAME , .Nm ATF_TC_HEAD , .Nm ATF_TC_HEAD_NAME , .Nm ATF_TC_NAME , .Nm ATF_TC_WITH_CLEANUP , .Nm ATF_TC_WITHOUT_HEAD , .Nm ATF_TP_ADD_TC , .Nm ATF_TP_ADD_TCS , .Nm atf_tc_get_config_var , .Nm atf_tc_get_config_var_wd , .Nm atf_tc_get_config_var_as_bool , .Nm atf_tc_get_config_var_as_bool_wd , .Nm atf_tc_get_config_var_as_long , .Nm atf_tc_get_config_var_as_long_wd , .Nm atf_no_error , .Nm atf_tc_expect_death , .Nm atf_tc_expect_exit , .Nm atf_tc_expect_fail , .Nm atf_tc_expect_pass , .Nm atf_tc_expect_signal , .Nm atf_tc_expect_timeout , .Nm atf_tc_fail , .Nm atf_tc_fail_nonfatal , .Nm atf_tc_pass , .Nm atf_tc_skip , .Nm atf_utils_cat_file , .Nm atf_utils_compare_file , .Nm atf_utils_copy_file , .Nm atf_utils_create_file , .Nm atf_utils_file_exists , .Nm atf_utils_fork , .Nm atf_utils_free_charpp , .Nm atf_utils_grep_file , .Nm atf_utils_grep_string , .Nm atf_utils_readline , .Nm atf_utils_redirect , .Nm atf_utils_wait .Nd C API to write ATF-based test programs .Sh SYNOPSIS .In atf-c.h .Fn ATF_CHECK "expression" .Fn ATF_CHECK_MSG "expression" "fail_msg_fmt" ... .Fn ATF_CHECK_EQ "expression_1" "expression_2" .Fn ATF_CHECK_EQ_MSG "expression_1" "expression_2" "fail_msg_fmt" ... .Fn ATF_CHECK_MATCH "regexp" "string" .Fn ATF_CHECK_MATCH_MSG "regexp" "string" "fail_msg_fmt" ... .Fn ATF_CHECK_STREQ "string_1" "string_2" .Fn ATF_CHECK_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ... .Fn ATF_CHECK_ERRNO "exp_errno" "bool_expression" .Fn ATF_REQUIRE "expression" .Fn ATF_REQUIRE_MSG "expression" "fail_msg_fmt" ... .Fn ATF_REQUIRE_EQ "expression_1" "expression_2" .Fn ATF_REQUIRE_EQ_MSG "expression_1" "expression_2" "fail_msg_fmt" ... .Fn ATF_REQUIRE_MATCH "regexp" "string" .Fn ATF_REQUIRE_MATCH_MSG "regexp" "string" "fail_msg_fmt" ... .Fn ATF_REQUIRE_STREQ "string_1" "string_2" .Fn ATF_REQUIRE_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ... .Fn ATF_REQUIRE_ERRNO "exp_errno" "bool_expression" .Fn ATF_TC "name" .Fn ATF_TC_BODY "name" "tc" .Fn ATF_TC_BODY_NAME "name" .Fn ATF_TC_CLEANUP "name" "tc" .Fn ATF_TC_CLEANUP_NAME "name" .Fn ATF_TC_HEAD "name" "tc" .Fn ATF_TC_HEAD_NAME "name" .Fn ATF_TC_NAME "name" .Fn ATF_TC_WITH_CLEANUP "name" .Fn ATF_TC_WITHOUT_HEAD "name" .Fn ATF_TP_ADD_TC "tp_name" "tc_name" .Fn ATF_TP_ADD_TCS "tp_name" .Fn atf_tc_get_config_var "tc" "varname" .Fn atf_tc_get_config_var_wd "tc" "variable_name" "default_value" .Fn atf_tc_get_config_var_as_bool "tc" "variable_name" .Fn atf_tc_get_config_var_as_bool_wd "tc" "variable_name" "default_value" .Fn atf_tc_get_config_var_as_long "tc" "variable_name" .Fn atf_tc_get_config_var_as_long_wd "tc" "variable_name" "default_value" .Fn atf_no_error .Fn atf_tc_expect_death "reason" "..." .Fn atf_tc_expect_exit "exitcode" "reason" "..." .Fn atf_tc_expect_fail "reason" "..." .Fn atf_tc_expect_pass .Fn atf_tc_expect_signal "signo" "reason" "..." .Fn atf_tc_expect_timeout "reason" "..." .Fn atf_tc_fail "reason" .Fn atf_tc_fail_nonfatal "reason" .Fn atf_tc_pass .Fn atf_tc_skip "reason" .Ft void .Fo atf_utils_cat_file .Fa "const char *file" .Fa "const char *prefix" .Fc .Ft bool .Fo atf_utils_compare_file .Fa "const char *file" .Fa "const char *contents" .Fc .Ft void .Fo atf_utils_copy_file .Fa "const char *source" .Fa "const char *destination" .Fc .Ft void .Fo atf_utils_create_file .Fa "const char *file" .Fa "const char *contents" .Fa "..." .Fc .Ft void .Fo atf_utils_file_exists .Fa "const char *file" .Fc .Ft pid_t .Fo atf_utils_fork .Fa "void" .Fc .Ft void .Fo atf_utils_free_charpp .Fa "char **argv" .Fc .Ft bool .Fo atf_utils_grep_file .Fa "const char *regexp" .Fa "const char *file" .Fa "..." .Fc .Ft bool .Fo atf_utils_grep_string .Fa "const char *regexp" .Fa "const char *str" .Fa "..." .Fc .Ft char * .Fo atf_utils_readline .Fa "int fd" .Fc .Ft void .Fo atf_utils_redirect .Fa "const int fd" .Fa "const char *file" .Fc .Ft void .Fo atf_utils_wait .Fa "const pid_t pid" .Fa "const int expected_exit_status" .Fa "const char *expected_stdout" .Fa "const char *expected_stderr" .Fc .Sh DESCRIPTION The ATF .Pp C-based test programs always follow this template: .Bd -literal -offset indent .Ns ... C-specific includes go here ... #include ATF_TC(tc1); ATF_TC_HEAD(tc1, tc) { ... first test case's header ... } ATF_TC_BODY(tc1, tc) { ... first test case's body ... } ATF_TC_WITH_CLEANUP(tc2); ATF_TC_HEAD(tc2, tc) { ... second test case's header ... } ATF_TC_BODY(tc2, tc) { ... second test case's body ... } ATF_TC_CLEANUP(tc2, tc) { ... second test case's cleanup ... } ATF_TC_WITHOUT_HEAD(tc3); ATF_TC_BODY(tc3, tc) { ... third test case's body ... } .Ns ... additional test cases ... ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tcs, tc1); ATF_TP_ADD_TC(tcs, tc2); ATF_TP_ADD_TC(tcs, tc3); ... add additional test cases ... return atf_no_error(); } .Ed .Ss Definition of test cases Test cases have an identifier and are composed of three different parts: the header, the body and an optional cleanup routine, all of which are described in .Xr atf-test-case 4 . To define test cases, one can use the .Fn ATF_TC , .Fn ATF_TC_WITH_CLEANUP or the .Fn ATF_TC_WITHOUT_HEAD macros, which take a single parameter specifiying the test case's name. .Fn ATF_TC , requires to define a head and a body for the test case, .Fn ATF_TC_WITH_CLEANUP requires to define a head, a body and a cleanup for the test case and .Fn ATF_TC_WITHOUT_HEAD requires only a body for the test case. It is important to note that these .Em do not set the test case up for execution when the program is run. In order to do so, a later registration is needed with the .Fn ATF_TP_ADD_TC macro detailed in .Sx Program initialization . .Pp Later on, one must define the three parts of the body by means of three functions. Their headers are given by the .Fn ATF_TC_HEAD , .Fn ATF_TC_BODY and .Fn ATF_TC_CLEANUP macros, all of which take the test case name provided to the .Fn ATF_TC .Fn ATF_TC_WITH_CLEANUP , or .Fn ATF_TC_WITHOUT_HEAD macros and the name of the variable that will hold a pointer to the test case data. Following each of these, a block of code is expected, surrounded by the opening and closing brackets. .Ss Program initialization The library provides a way to easily define the test program's .Fn main function. You should never define one on your own, but rely on the library to do it for you. This is done by using the .Fn ATF_TP_ADD_TCS macro, which is passed the name of the object that will hold the test cases; i.e. the test program instance. This name can be whatever you want as long as it is a valid variable identifier. .Pp After the macro, you are supposed to provide the body of a function, which should only use the .Fn ATF_TP_ADD_TC macro to register the test cases the test program will execute and return a success error code. The first parameter of this macro matches the name you provided in the former call. The success status can be returned using the .Fn atf_no_error function. .Ss Header definitions The test case's header can define the meta-data by using the .Fn atf_tc_set_md_var method, which takes three parameters: the first one points to the test case data, the second one specifies the meta-data variable to be set and the third one specifies its value. Both of them are strings. .Ss Configuration variables The test case has read-only access to the current configuration variables by means of the .Ft bool .Fn atf_tc_has_config_var , .Ft const char * .Fn atf_tc_get_config_var , .Ft const char * .Fn atf_tc_get_config_var_wd , .Ft bool .Fn atf_tc_get_config_var_as_bool , .Ft bool .Fn atf_tc_get_config_var_as_bool_wd , .Ft long .Fn atf_tc_get_config_var_as_long , and the .Ft long .Fn atf_tc_get_config_var_as_long_wd functions, which can be called in any of the three parts of a test case. .Pp The .Sq _wd variants take a default value for the variable which is returned if the variable is not defined. The other functions without the .Sq _wd suffix .Em require the variable to be defined. .Ss Access to the source directory It is possible to get the path to the test case's source directory from any of its three components by querying the .Sq srcdir configuration variable. .Ss Requiring programs Aside from the .Va require.progs meta-data variable available in the header only, one can also check for additional programs in the test case's body by using the .Fn atf_tc_require_prog function, which takes the base name or full path of a single binary. Relative paths are forbidden. If it is not found, the test case will be automatically skipped. .Ss Test case finalization The test case finalizes either when the body reaches its end, at which point the test is assumed to have .Em passed , unless any non-fatal errors were raised using .Fn atf_tc_fail_nonfatal , or at any explicit call to .Fn atf_tc_pass , .Fn atf_tc_fail or .Fn atf_tc_skip . These three functions terminate the execution of the test case immediately. The cleanup routine will be processed afterwards in a completely automated way, regardless of the test case's termination reason. .Pp .Fn atf_tc_pass does not take any parameters. .Fn atf_tc_fail , .Fn atf_tc_fail_nonfatal and .Fn atf_tc_skip take a format string and a variable list of parameters, which describe, in a user-friendly manner, why the test case failed or was skipped, respectively. It is very important to provide a clear error message in both cases so that the user can quickly know why the test did not pass. .Ss Expectations Everything explained in the previous section changes when the test case expectations are redefined by the programmer. .Pp Each test case has an internal state called .Sq expect that describes what the test case expectations are at any point in time. The value of this property can change during execution by any of: .Bl -tag -width indent .It Fn atf_tc_expect_death "reason" "..." Expects the test case to exit prematurely regardless of the nature of the exit. .It Fn atf_tc_expect_exit "exitcode" "reason" "..." Expects the test case to exit cleanly. If .Va exitcode is not .Sq -1 , .Xr atf-run 1 will validate that the exit code of the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn atf_tc_expect_fail "reason" "..." Any failure (be it fatal or non-fatal) raised in this mode is recorded. However, such failures do not report the test case as failed; instead, the test case finalizes cleanly and is reported as .Sq expected failure ; this report includes the provided .Fa reason as part of it. If no error is raised while running in this mode, then the test case is reported as .Sq failed . .Pp This mode is useful to reproduce actual known bugs in tests. Whenever the developer fixes the bug later on, the test case will start reporting a failure, signaling the developer that the test case must be adjusted to the new conditions. In this situation, it is useful, for example, to set .Fa reason as the bug number for tracking purposes. .It Fn atf_tc_expect_pass This is the normal mode of execution. In this mode, any failure is reported as such to the user and the test case is marked as .Sq failed . .It Fn atf_tc_expect_signal "signo" "reason" "..." Expects the test case to terminate due to the reception of a signal. If .Va signo is not .Sq -1 , .Xr atf-run 1 will validate that the signal that terminated the test case matches the one provided in this call. Otherwise, the exact value will be ignored. .It Fn atf_tc_expect_timeout "reason" "..." Expects the test case to execute for longer than its timeout. .El .Ss Helper macros for common checks The library provides several macros that are very handy in multiple situations. These basically check some condition after executing a given statement or processing a given expression and, if the condition is not met, they report the test case as failed. .Pp The .Sq REQUIRE variant of the macros immediately abort the test case as soon as an error condition is detected by calling the .Fn atf_tc_fail function. Use this variant whenever it makes no sense to continue the execution of a test case when the checked condition is not met. The .Sq CHECK variant, on the other hand, reports a failure as soon as it is encountered using the .Fn atf_tc_fail_nonfatal function, but the execution of the test case continues as if nothing had happened. Use this variant whenever the checked condition is important as a result of the test case, but there are other conditions that can be subsequently checked on the same run without aborting. .Pp Additionally, the .Sq MSG variants take an extra set of parameters to explicitly specify the failure message. This failure message is formatted according to the .Xr printf 3 formatters. .Pp .Fn ATF_CHECK , .Fn ATF_CHECK_MSG , .Fn ATF_REQUIRE and .Fn ATF_REQUIRE_MSG take an expression and fail if the expression evaluates to false. .Pp .Fn ATF_CHECK_EQ , .Fn ATF_CHECK_EQ_MSG , .Fn ATF_REQUIRE_EQ and .Fn ATF_REQUIRE_EQ_MSG take two expressions and fail if the two evaluated values are not equal. .Pp .Fn ATF_CHECK_MATCH , .Fn ATF_CHECK_MATCH_MSG , .Fn ATF_REQUIRE_MATCH and .Fn ATF_REQUIRE_MATCH_MSG take a regular expression and a string and fail if the regular expression does not match the given string. Note that the regular expression is not anchored, so it will match anywhere in the string. .Pp .Fn ATF_CHECK_STREQ , .Fn ATF_CHECK_STREQ_MSG , .Fn ATF_REQUIRE_STREQ and .Fn ATF_REQUIRE_STREQ_MSG take two strings and fail if the two are not equal character by character. .Pp .Fn ATF_CHECK_ERRNO and .Fn ATF_REQUIRE_ERRNO take, first, the error code that the check is expecting to find in the .Va errno variable and, second, a boolean expression that, if evaluates to true, means that a call failed and .Va errno has to be checked against the first value. .Ss Utility functions The following functions are provided as part of the .Nm API to simplify the creation of a variety of tests. In particular, these are useful to write tests for command-line interfaces. .Pp .Ft void .Fo atf_utils_cat_file .Fa "const char *file" .Fa "const char *prefix" .Fc .Bd -offset indent Prints the contents of .Fa file to the standard output, prefixing every line with the string in .Fa prefix . .Ed .Pp .Ft bool .Fo atf_utils_compare_file .Fa "const char *file" .Fa "const char *contents" .Fc .Bd -offset indent Returns true if the given .Fa file matches exactly the expected inlined .Fa contents . .Ed .Pp .Ft void .Fo atf_utils_copy_file .Fa "const char *source" .Fa "const char *destination" .Fc .Bd -offset indent Copies the file .Fa source to .Fa destination . The permissions of the file are preserved during the code. .Ed .Pp .Ft void .Fo atf_utils_create_file .Fa "const char *file" .Fa "const char *contents" .Fa "..." .Fc .Bd -offset indent Creates .Fa file with the text given in .Fa contents , which is a formatting string that uses the rest of the variable arguments. .Ed .Pp .Ft void .Fo atf_utils_file_exists .Fa "const char *file" .Fc .Bd -offset indent Checks if .Fa file exists. .Ed .Pp .Ft pid_t .Fo atf_utils_fork .Fa "void" .Fc .Bd -offset indent Forks a process and redirects the standard output and standard error of the child to files for later validation with .Fn atf_utils_wait . Fails the test case if the fork fails, so this does not return an error. .Ed .Pp .Ft void .Fo atf_utils_free_charpp .Fa "char **argv" .Fc .Bd -offset indent Frees a dynamically-allocated array of dynamically-allocated strings. .Ed .Pp .Ft bool .Fo atf_utils_grep_file .Fa "const char *regexp" .Fa "const char *file" .Fa "..." .Fc .Bd -offset indent Searches for the .Fa regexp , which is a formatting string representing the regular expression, in the .Fa file . The variable arguments are used to construct the regular expression. .Ed .Pp .Ft bool .Fo atf_utils_grep_string .Fa "const char *regexp" .Fa "const char *str" .Fa "..." .Fc .Bd -offset indent Searches for the .Fa regexp , which is a formatting string representing the regular expression, in the literal string .Fa str . The variable arguments are used to construct the regular expression. .Ed .Pp .Ft char * .Fo atf_utils_readline .Fa "int fd" .Fc .Bd -offset indent Reads a line from the file descriptor .Fa fd . The line, if any, is returned as a dynamically-allocated buffer that must be released with .Xr free 3 . If there was nothing to read, returns .Sq NULL . .Ed .Pp .Ft void .Fo atf_utils_redirect .Fa "const int fd" .Fa "const char *file" .Fc .Bd -offset indent Redirects the given file descriptor .Fa fd to .Fa file . This function exits the process in case of an error and does not properly mark the test case as failed. As a result, it should only be used in subprocesses of the test case; specially those spawned by .Fn atf_utils_fork . .Ed .Pp .Ft void .Fo atf_utils_wait .Fa "const pid_t pid" .Fa "const int expected_exit_status" .Fa "const char *expected_stdout" .Fa "const char *expected_stderr" .Fc .Bd -offset indent Waits and validates the result of a subprocess spawned with .Fn atf_utils_wait . The validation involves checking that the subprocess exited cleanly and returned the code specified in .Fa expected_exit_status and that its standard output and standard error match the strings given in .Fa expected_stdout and .Fa expected_stderr . .Pp If any of the .Fa expected_stdout or .Fa expected_stderr strings are prefixed with .Sq save: , then they specify the name of the file into which to store the stdout or stderr of the subprocess, and no comparison is performed. .Ed .Sh EXAMPLES The following shows a complete test program with a single test case that validates the addition operator: .Bd -literal -offset indent #include ATF_TC(addition); ATF_TC_HEAD(addition, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the addition operator"); } ATF_TC_BODY(addition, tc) { ATF_CHECK_EQ(0 + 0, 0); ATF_CHECK_EQ(0 + 1, 1); ATF_CHECK_EQ(1 + 0, 1); ATF_CHECK_EQ(1 + 1, 2); ATF_CHECK_EQ(100 + 200, 300); } ATF_TC(string_formatting); ATF_TC_HEAD(string_formatting, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the snprintf"); } ATF_TC_BODY(string_formatting, tc) { char buf[1024]; snprintf(buf, sizeof(buf), "a %s", "string"); ATF_CHECK_STREQ_MSG("a string", buf, "%s is not working"); } ATF_TC(open_failure); ATF_TC_HEAD(open_failure, tc) { atf_tc_set_md_var(tc, "descr", "Sample tests for the open function"); } ATF_TC_BODY(open_failure, tc) { ATF_CHECK_ERRNO(ENOENT, open("non-existent", O_RDONLY) == -1); } ATF_TC(known_bug); ATF_TC_HEAD(known_bug, tc) { atf_tc_set_md_var(tc, "descr", "Reproduces a known bug"); } ATF_TC_BODY(known_bug, tc) { atf_tc_expect_fail("See bug number foo/bar"); ATF_CHECK_EQ(3, 1 + 1); atf_tc_expect_pass(); ATF_CHECK_EQ(3, 1 + 2); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, addition); ATF_TP_ADD_TC(tp, string_formatting); ATF_TP_ADD_TC(tp, open_failure); ATF_TP_ADD_TC(tp, known_bug); return atf_no_error(); } .Ed .Sh SEE ALSO .Xr atf-test-program 1 , .Xr atf-test-case 4 , .Xr atf 7 bind9-9.9.5.dfsg/unit/atf-src/atf-c/tc.h0000644000470500017500000001266112271526120017131 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_TC_H) #define ATF_C_TC_H #include #include #include #include struct atf_tc; typedef void (*atf_tc_head_t)(struct atf_tc *); typedef void (*atf_tc_body_t)(const struct atf_tc *); typedef void (*atf_tc_cleanup_t)(const struct atf_tc *); /* --------------------------------------------------------------------- * The "atf_tc_pack" type. * --------------------------------------------------------------------- */ /* For static initialization only. */ struct atf_tc_pack { const char *m_ident; const char *const *m_config; atf_tc_head_t m_head; atf_tc_body_t m_body; atf_tc_cleanup_t m_cleanup; }; typedef const struct atf_tc_pack atf_tc_pack_t; /* --------------------------------------------------------------------- * The "atf_tc" type. * --------------------------------------------------------------------- */ struct atf_tc_impl; struct atf_tc { struct atf_tc_impl *pimpl; }; typedef struct atf_tc atf_tc_t; /* Constructors/destructors. */ atf_error_t atf_tc_init(atf_tc_t *, const char *, atf_tc_head_t, atf_tc_body_t, atf_tc_cleanup_t, const char *const *); atf_error_t atf_tc_init_pack(atf_tc_t *, atf_tc_pack_t *, const char *const *); void atf_tc_fini(atf_tc_t *); /* Getters. */ const char *atf_tc_get_ident(const atf_tc_t *); const char *atf_tc_get_config_var(const atf_tc_t *, const char *); const char *atf_tc_get_config_var_wd(const atf_tc_t *, const char *, const char *); bool atf_tc_get_config_var_as_bool(const atf_tc_t *, const char *); bool atf_tc_get_config_var_as_bool_wd(const atf_tc_t *, const char *, const bool); long atf_tc_get_config_var_as_long(const atf_tc_t *, const char *); long atf_tc_get_config_var_as_long_wd(const atf_tc_t *, const char *, const long); const char *atf_tc_get_md_var(const atf_tc_t *, const char *); char **atf_tc_get_md_vars(const atf_tc_t *); bool atf_tc_has_config_var(const atf_tc_t *, const char *); bool atf_tc_has_md_var(const atf_tc_t *, const char *); /* Modifiers. */ atf_error_t atf_tc_set_md_var(atf_tc_t *, const char *, const char *, ...); /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_tc_run(const atf_tc_t *, const char *); atf_error_t atf_tc_cleanup(const atf_tc_t *); /* To be run from test case bodies only. */ void atf_tc_fail(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2) ATF_DEFS_ATTRIBUTE_NORETURN; void atf_tc_fail_nonfatal(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2); void atf_tc_pass(void) ATF_DEFS_ATTRIBUTE_NORETURN; void atf_tc_require_prog(const char *); void atf_tc_skip(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2) ATF_DEFS_ATTRIBUTE_NORETURN; void atf_tc_expect_pass(void); void atf_tc_expect_fail(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2); void atf_tc_expect_exit(const int, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(2, 3); void atf_tc_expect_signal(const int, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(2, 3); void atf_tc_expect_death(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2); void atf_tc_expect_timeout(const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(1, 2); /* To be run from test case bodies only; internal to macros.h. */ void atf_tc_fail_check(const char *, const size_t, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(3, 4); void atf_tc_fail_requirement(const char *, const size_t, const char *, ...) ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(3, 4) ATF_DEFS_ATTRIBUTE_NORETURN; void atf_tc_check_errno(const char *, const size_t, const int, const char *, const bool); void atf_tc_require_errno(const char *, const size_t, const int, const char *, const bool); #endif /* ATF_C_TC_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/tc.c0000644000470500017500000007625012271526120017130 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c/error.h" #include "atf-c/tc.h" #include "detail/env.h" #include "detail/fs.h" #include "detail/map.h" #include "detail/sanity.h" #include "detail/text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ enum expect_type { EXPECT_PASS, EXPECT_FAIL, EXPECT_EXIT, EXPECT_SIGNAL, EXPECT_DEATH, EXPECT_TIMEOUT, }; struct context { const atf_tc_t *tc; const char *resfile; size_t fail_count; enum expect_type expect; atf_dynstr_t expect_reason; size_t expect_previous_fail_count; size_t expect_fail_count; int expect_exitcode; int expect_signo; }; static void context_init(struct context *, const atf_tc_t *, const char *); static void check_fatal_error(atf_error_t); static void report_fatal_error(const char *, ...) ATF_DEFS_ATTRIBUTE_NORETURN; static atf_error_t write_resfile(const int, const char *, const int, const atf_dynstr_t *); static void create_resfile(const char *, const char *, const int, atf_dynstr_t *); static void error_in_expect(struct context *, const char *, ...) ATF_DEFS_ATTRIBUTE_NORETURN; static void validate_expect(struct context *); static void expected_failure(struct context *, atf_dynstr_t *) ATF_DEFS_ATTRIBUTE_NORETURN; static void fail_requirement(struct context *, atf_dynstr_t *) ATF_DEFS_ATTRIBUTE_NORETURN; static void fail_check(struct context *, atf_dynstr_t *); static void pass(struct context *) ATF_DEFS_ATTRIBUTE_NORETURN; static void skip(struct context *, atf_dynstr_t *) ATF_DEFS_ATTRIBUTE_NORETURN; static void format_reason_ap(atf_dynstr_t *, const char *, const size_t, const char *, va_list); static void format_reason_fmt(atf_dynstr_t *, const char *, const size_t, const char *, ...); static void errno_test(struct context *, const char *, const size_t, const int, const char *, const bool, void (*)(struct context *, atf_dynstr_t *)); static atf_error_t check_prog_in_dir(const char *, void *); static atf_error_t check_prog(struct context *, const char *); static void context_init(struct context *ctx, const atf_tc_t *tc, const char *resfile) { ctx->tc = tc; ctx->resfile = resfile; ctx->fail_count = 0; ctx->expect = EXPECT_PASS; check_fatal_error(atf_dynstr_init(&ctx->expect_reason)); ctx->expect_previous_fail_count = 0; ctx->expect_fail_count = 0; ctx->expect_exitcode = 0; ctx->expect_signo = 0; } static void check_fatal_error(atf_error_t err) { if (atf_is_error(err)) { char buf[1024]; atf_error_format(err, buf, sizeof(buf)); fprintf(stderr, "FATAL ERROR: %s\n", buf); atf_error_free(err); abort(); } } static void report_fatal_error(const char *msg, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, msg); vfprintf(stderr, msg, ap); va_end(ap); fprintf(stderr, "\n"); abort(); } /** Writes to a results file. * * The results file is supposed to be already open. * * This function returns an error code instead of exiting in case of error * because the caller needs to clean up the reason object before terminating. */ static atf_error_t write_resfile(const int fd, const char *result, const int arg, const atf_dynstr_t *reason) { static char NL[] = "\n", CS[] = ": "; char buf[64]; const char *r; struct iovec iov[5]; ssize_t ret; int count = 0; INV(arg == -1 || reason != NULL); #define UNCONST(a) ((void *)(unsigned long)(const void *)(a)) iov[count].iov_base = UNCONST(result); iov[count++].iov_len = strlen(result); if (reason != NULL) { if (arg != -1) { iov[count].iov_base = buf; iov[count++].iov_len = snprintf(buf, sizeof(buf), "(%d)", arg); } iov[count].iov_base = CS; iov[count++].iov_len = sizeof(CS) - 1; r = atf_dynstr_cstring(reason); iov[count].iov_base = UNCONST(r); iov[count++].iov_len = strlen(r); } #undef UNCONST iov[count].iov_base = NL; iov[count++].iov_len = sizeof(NL) - 1; while ((ret = writev(fd, iov, count)) == -1 && errno == EINTR) continue; /* Retry. */ if (ret != -1) return atf_no_error(); return atf_libc_error( errno, "Failed to write results file; result %s, reason %s", result, reason == NULL ? "null" : atf_dynstr_cstring(reason)); } /** Creates a results file. * * The input reason is released in all cases. * * An error in this function is considered to be fatal, hence why it does * not return any error code. */ static void create_resfile(const char *resfile, const char *result, const int arg, atf_dynstr_t *reason) { atf_error_t err; if (strcmp("/dev/stdout", resfile) == 0) { err = write_resfile(STDOUT_FILENO, result, arg, reason); } else if (strcmp("/dev/stderr", resfile) == 0) { err = write_resfile(STDERR_FILENO, result, arg, reason); } else { const int fd = open(resfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd == -1) { err = atf_libc_error(errno, "Cannot create results file '%s'", resfile); } else { err = write_resfile(fd, result, arg, reason); close(fd); } } if (reason != NULL) atf_dynstr_fini(reason); check_fatal_error(err); } /** Fails a test case if validate_expect fails. */ static void error_in_expect(struct context *ctx, const char *fmt, ...) { atf_dynstr_t reason; va_list ap; va_start(ap, fmt); format_reason_ap(&reason, NULL, 0, fmt, ap); va_end(ap); ctx->expect = EXPECT_PASS; /* Ensure fail_requirement really fails. */ fail_requirement(ctx, &reason); } /** Ensures that the "expect" state is correct. * * Call this function before modifying the current value of expect. */ static void validate_expect(struct context *ctx) { if (ctx->expect == EXPECT_DEATH) { error_in_expect(ctx, "Test case was expected to terminate abruptly " "but it continued execution"); } else if (ctx->expect == EXPECT_EXIT) { error_in_expect(ctx, "Test case was expected to exit cleanly but it " "continued execution"); } else if (ctx->expect == EXPECT_FAIL) { if (ctx->expect_fail_count == ctx->expect_previous_fail_count) error_in_expect(ctx, "Test case was expecting a failure but none " "were raised"); else INV(ctx->expect_fail_count > ctx->expect_previous_fail_count); } else if (ctx->expect == EXPECT_PASS) { /* Nothing to validate. */ } else if (ctx->expect == EXPECT_SIGNAL) { error_in_expect(ctx, "Test case was expected to receive a termination " "signal but it continued execution"); } else if (ctx->expect == EXPECT_TIMEOUT) { error_in_expect(ctx, "Test case was expected to hang but it continued " "execution"); } else UNREACHABLE; } static void expected_failure(struct context *ctx, atf_dynstr_t *reason) { check_fatal_error(atf_dynstr_prepend_fmt(reason, "%s: ", atf_dynstr_cstring(&ctx->expect_reason))); create_resfile(ctx->resfile, "expected_failure", -1, reason); exit(EXIT_SUCCESS); } static void fail_requirement(struct context *ctx, atf_dynstr_t *reason) { if (ctx->expect == EXPECT_FAIL) { expected_failure(ctx, reason); } else if (ctx->expect == EXPECT_PASS) { create_resfile(ctx->resfile, "failed", -1, reason); exit(EXIT_FAILURE); } else { error_in_expect(ctx, "Test case raised a failure but was not " "expecting one; reason was %s", atf_dynstr_cstring(reason)); } UNREACHABLE; } static void fail_check(struct context *ctx, atf_dynstr_t *reason) { if (ctx->expect == EXPECT_FAIL) { fprintf(stderr, "*** Expected check failure: %s: %s\n", atf_dynstr_cstring(&ctx->expect_reason), atf_dynstr_cstring(reason)); ctx->expect_fail_count++; } else if (ctx->expect == EXPECT_PASS) { fprintf(stderr, "*** Check failed: %s\n", atf_dynstr_cstring(reason)); ctx->fail_count++; } else { error_in_expect(ctx, "Test case raised a failure but was not " "expecting one; reason was %s", atf_dynstr_cstring(reason)); } atf_dynstr_fini(reason); } static void pass(struct context *ctx) { if (ctx->expect == EXPECT_FAIL) { error_in_expect(ctx, "Test case was expecting a failure but got " "a pass instead"); } else if (ctx->expect == EXPECT_PASS) { create_resfile(ctx->resfile, "passed", -1, NULL); exit(EXIT_SUCCESS); } else { error_in_expect(ctx, "Test case asked to explicitly pass but was " "not expecting such condition"); } UNREACHABLE; } static void skip(struct context *ctx, atf_dynstr_t *reason) { if (ctx->expect == EXPECT_PASS) { create_resfile(ctx->resfile, "skipped", -1, reason); exit(EXIT_SUCCESS); } else { error_in_expect(ctx, "Can only skip a test case when running in " "expect pass mode"); } UNREACHABLE; } /** Formats a failure/skip reason message. * * The formatted reason is stored in out_reason. out_reason is initialized * in this function and is supposed to be released by the caller. In general, * the reason will eventually be fed to create_resfile, which will release * it. * * Errors in this function are fatal. Rationale being: reasons are used to * create results files; if we can't format the reason correctly, the result * of the test program will be bogus. So it's better to just exit with a * fatal error. */ static void format_reason_ap(atf_dynstr_t *out_reason, const char *source_file, const size_t source_line, const char *reason, va_list ap) { atf_error_t err; if (source_file != NULL) { err = atf_dynstr_init_fmt(out_reason, "%s:%zd: ", source_file, source_line); } else { PRE(source_line == 0); err = atf_dynstr_init(out_reason); } if (!atf_is_error(err)) { va_list ap2; va_copy(ap2, ap); err = atf_dynstr_append_ap(out_reason, reason, ap2); va_end(ap2); } check_fatal_error(err); } static void format_reason_fmt(atf_dynstr_t *out_reason, const char *source_file, const size_t source_line, const char *reason, ...) { va_list ap; va_start(ap, reason); format_reason_ap(out_reason, source_file, source_line, reason, ap); va_end(ap); } static void errno_test(struct context *ctx, const char *file, const size_t line, const int exp_errno, const char *expr_str, const bool expr_result, void (*fail_func)(struct context *, atf_dynstr_t *)) { const int actual_errno = errno; if (expr_result) { if (exp_errno != actual_errno) { atf_dynstr_t reason; format_reason_fmt(&reason, file, line, "Expected errno %d, got %d, " "in %s", exp_errno, actual_errno, expr_str); fail_func(ctx, &reason); } } else { atf_dynstr_t reason; format_reason_fmt(&reason, file, line, "Expected true value in %s", expr_str); fail_func(ctx, &reason); } } struct prog_found_pair { const char *prog; bool found; }; static atf_error_t check_prog_in_dir(const char *dir, void *data) { struct prog_found_pair *pf = data; atf_error_t err; if (pf->found) err = atf_no_error(); else { atf_fs_path_t p; err = atf_fs_path_init_fmt(&p, "%s/%s", dir, pf->prog); if (atf_is_error(err)) goto out_p; err = atf_fs_eaccess(&p, atf_fs_access_x); if (!atf_is_error(err)) pf->found = true; else { atf_error_free(err); INV(!pf->found); err = atf_no_error(); } out_p: atf_fs_path_fini(&p); } return err; } static atf_error_t check_prog(struct context *ctx, const char *prog) { atf_error_t err; atf_fs_path_t p; err = atf_fs_path_init_fmt(&p, "%s", prog); if (atf_is_error(err)) goto out; if (atf_fs_path_is_absolute(&p)) { err = atf_fs_eaccess(&p, atf_fs_access_x); if (atf_is_error(err)) { atf_dynstr_t reason; atf_error_free(err); atf_fs_path_fini(&p); format_reason_fmt(&reason, NULL, 0, "The required program %s could " "not be found", prog); skip(ctx, &reason); } } else { const char *path = atf_env_get("PATH"); struct prog_found_pair pf; atf_fs_path_t bp; err = atf_fs_path_branch_path(&p, &bp); if (atf_is_error(err)) goto out_p; if (strcmp(atf_fs_path_cstring(&bp), ".") != 0) { atf_fs_path_fini(&bp); atf_fs_path_fini(&p); report_fatal_error("Relative paths are not allowed when searching " "for a program (%s)", prog); UNREACHABLE; } pf.prog = prog; pf.found = false; err = atf_text_for_each_word(path, ":", check_prog_in_dir, &pf); if (atf_is_error(err)) goto out_bp; if (!pf.found) { atf_dynstr_t reason; atf_fs_path_fini(&bp); atf_fs_path_fini(&p); format_reason_fmt(&reason, NULL, 0, "The required program %s could " "not be found in the PATH", prog); fail_requirement(ctx, &reason); } out_bp: atf_fs_path_fini(&bp); } out_p: atf_fs_path_fini(&p); out: return err; } /* --------------------------------------------------------------------- * The "atf_tc" type. * --------------------------------------------------------------------- */ struct atf_tc_impl { const char *m_ident; atf_map_t m_vars; atf_map_t m_config; atf_tc_head_t m_head; atf_tc_body_t m_body; atf_tc_cleanup_t m_cleanup; }; /* * Constructors/destructors. */ atf_error_t atf_tc_init(atf_tc_t *tc, const char *ident, atf_tc_head_t head, atf_tc_body_t body, atf_tc_cleanup_t cleanup, const char *const *config) { atf_error_t err; tc->pimpl = malloc(sizeof(struct atf_tc_impl)); if (tc->pimpl == NULL) { err = atf_no_memory_error(); goto err; } tc->pimpl->m_ident = ident; tc->pimpl->m_head = head; tc->pimpl->m_body = body; tc->pimpl->m_cleanup = cleanup; err = atf_map_init_charpp(&tc->pimpl->m_config, config); if (atf_is_error(err)) goto err; err = atf_map_init(&tc->pimpl->m_vars); if (atf_is_error(err)) goto err_vars; err = atf_tc_set_md_var(tc, "ident", ident); if (atf_is_error(err)) goto err_map; if (cleanup != NULL) { err = atf_tc_set_md_var(tc, "has.cleanup", "true"); if (atf_is_error(err)) goto err_map; } /* XXX Should the head be able to return error codes? */ if (tc->pimpl->m_head != NULL) tc->pimpl->m_head(tc); if (strcmp(atf_tc_get_md_var(tc, "ident"), ident) != 0) { report_fatal_error("Test case head modified the read-only 'ident' " "property"); UNREACHABLE; } INV(!atf_is_error(err)); return err; err_map: atf_map_fini(&tc->pimpl->m_vars); err_vars: atf_map_fini(&tc->pimpl->m_config); err: return err; } atf_error_t atf_tc_init_pack(atf_tc_t *tc, const atf_tc_pack_t *pack, const char *const *config) { return atf_tc_init(tc, pack->m_ident, pack->m_head, pack->m_body, pack->m_cleanup, config); } void atf_tc_fini(atf_tc_t *tc) { atf_map_fini(&tc->pimpl->m_vars); free(tc->pimpl); } /* * Getters. */ const char * atf_tc_get_ident(const atf_tc_t *tc) { return tc->pimpl->m_ident; } const char * atf_tc_get_config_var(const atf_tc_t *tc, const char *name) { const char *val; atf_map_citer_t iter; PRE(atf_tc_has_config_var(tc, name)); iter = atf_map_find_c(&tc->pimpl->m_config, name); val = atf_map_citer_data(iter); INV(val != NULL); return val; } const char * atf_tc_get_config_var_wd(const atf_tc_t *tc, const char *name, const char *defval) { const char *val; if (!atf_tc_has_config_var(tc, name)) val = defval; else val = atf_tc_get_config_var(tc, name); return val; } bool atf_tc_get_config_var_as_bool(const atf_tc_t *tc, const char *name) { bool val; const char *strval; atf_error_t err; strval = atf_tc_get_config_var(tc, name); err = atf_text_to_bool(strval, &val); if (atf_is_error(err)) { atf_error_free(err); atf_tc_fail("Configuration variable %s does not have a valid " "boolean value; found %s", name, strval); } return val; } bool atf_tc_get_config_var_as_bool_wd(const atf_tc_t *tc, const char *name, const bool defval) { bool val; if (!atf_tc_has_config_var(tc, name)) val = defval; else val = atf_tc_get_config_var_as_bool(tc, name); return val; } long atf_tc_get_config_var_as_long(const atf_tc_t *tc, const char *name) { long val; const char *strval; atf_error_t err; strval = atf_tc_get_config_var(tc, name); err = atf_text_to_long(strval, &val); if (atf_is_error(err)) { atf_error_free(err); atf_tc_fail("Configuration variable %s does not have a valid " "long value; found %s", name, strval); } return val; } long atf_tc_get_config_var_as_long_wd(const atf_tc_t *tc, const char *name, const long defval) { long val; if (!atf_tc_has_config_var(tc, name)) val = defval; else val = atf_tc_get_config_var_as_long(tc, name); return val; } const char * atf_tc_get_md_var(const atf_tc_t *tc, const char *name) { const char *val; atf_map_citer_t iter; PRE(atf_tc_has_md_var(tc, name)); iter = atf_map_find_c(&tc->pimpl->m_vars, name); val = atf_map_citer_data(iter); INV(val != NULL); return val; } char ** atf_tc_get_md_vars(const atf_tc_t *tc) { return atf_map_to_charpp(&tc->pimpl->m_vars); } bool atf_tc_has_config_var(const atf_tc_t *tc, const char *name) { atf_map_citer_t end, iter; iter = atf_map_find_c(&tc->pimpl->m_config, name); end = atf_map_end_c(&tc->pimpl->m_config); return !atf_equal_map_citer_map_citer(iter, end); } bool atf_tc_has_md_var(const atf_tc_t *tc, const char *name) { atf_map_citer_t end, iter; iter = atf_map_find_c(&tc->pimpl->m_vars, name); end = atf_map_end_c(&tc->pimpl->m_vars); return !atf_equal_map_citer_map_citer(iter, end); } /* * Modifiers. */ atf_error_t atf_tc_set_md_var(atf_tc_t *tc, const char *name, const char *fmt, ...) { atf_error_t err; char *value; va_list ap; va_start(ap, fmt); err = atf_text_format_ap(&value, fmt, ap); va_end(ap); if (!atf_is_error(err)) err = atf_map_insert(&tc->pimpl->m_vars, name, value, true); else free(value); return err; } /* --------------------------------------------------------------------- * Free functions, as they should be publicly but they can't. * --------------------------------------------------------------------- */ static void _atf_tc_fail(struct context *, const char *, va_list) ATF_DEFS_ATTRIBUTE_NORETURN; static void _atf_tc_fail_nonfatal(struct context *, const char *, va_list); static void _atf_tc_fail_check(struct context *, const char *, const size_t, const char *, va_list); static void _atf_tc_fail_requirement(struct context *, const char *, const size_t, const char *, va_list) ATF_DEFS_ATTRIBUTE_NORETURN; static void _atf_tc_pass(struct context *) ATF_DEFS_ATTRIBUTE_NORETURN; static void _atf_tc_require_prog(struct context *, const char *); static void _atf_tc_skip(struct context *, const char *, va_list) ATF_DEFS_ATTRIBUTE_NORETURN; static void _atf_tc_check_errno(struct context *, const char *, const size_t, const int, const char *, const bool); static void _atf_tc_require_errno(struct context *, const char *, const size_t, const int, const char *, const bool); static void _atf_tc_expect_pass(struct context *); static void _atf_tc_expect_fail(struct context *, const char *, va_list); static void _atf_tc_expect_exit(struct context *, const int, const char *, va_list); static void _atf_tc_expect_signal(struct context *, const int, const char *, va_list); static void _atf_tc_expect_death(struct context *, const char *, va_list); static void _atf_tc_fail(struct context *ctx, const char *fmt, va_list ap) { va_list ap2; atf_dynstr_t reason; va_copy(ap2, ap); format_reason_ap(&reason, NULL, 0, fmt, ap2); va_end(ap2); fail_requirement(ctx, &reason); UNREACHABLE; } static void _atf_tc_fail_nonfatal(struct context *ctx, const char *fmt, va_list ap) { va_list ap2; atf_dynstr_t reason; va_copy(ap2, ap); format_reason_ap(&reason, NULL, 0, fmt, ap2); va_end(ap2); fail_check(ctx, &reason); } static void _atf_tc_fail_check(struct context *ctx, const char *file, const size_t line, const char *fmt, va_list ap) { va_list ap2; atf_dynstr_t reason; va_copy(ap2, ap); format_reason_ap(&reason, file, line, fmt, ap2); va_end(ap2); fail_check(ctx, &reason); } static void _atf_tc_fail_requirement(struct context *ctx, const char *file, const size_t line, const char *fmt, va_list ap) { va_list ap2; atf_dynstr_t reason; va_copy(ap2, ap); format_reason_ap(&reason, file, line, fmt, ap2); va_end(ap2); fail_requirement(ctx, &reason); UNREACHABLE; } static void _atf_tc_pass(struct context *ctx) { pass(ctx); UNREACHABLE; } static void _atf_tc_require_prog(struct context *ctx, const char *prog) { check_fatal_error(check_prog(ctx, prog)); } static void _atf_tc_skip(struct context *ctx, const char *fmt, va_list ap) { atf_dynstr_t reason; va_list ap2; va_copy(ap2, ap); format_reason_ap(&reason, NULL, 0, fmt, ap2); va_end(ap2); skip(ctx, &reason); } static void _atf_tc_check_errno(struct context *ctx, const char *file, const size_t line, const int exp_errno, const char *expr_str, const bool expr_result) { errno_test(ctx, file, line, exp_errno, expr_str, expr_result, fail_check); } static void _atf_tc_require_errno(struct context *ctx, const char *file, const size_t line, const int exp_errno, const char *expr_str, const bool expr_result) { errno_test(ctx, file, line, exp_errno, expr_str, expr_result, fail_requirement); } static void _atf_tc_expect_pass(struct context *ctx) { validate_expect(ctx); ctx->expect = EXPECT_PASS; } static void _atf_tc_expect_fail(struct context *ctx, const char *reason, va_list ap) { va_list ap2; validate_expect(ctx); ctx->expect = EXPECT_FAIL; atf_dynstr_fini(&ctx->expect_reason); va_copy(ap2, ap); check_fatal_error(atf_dynstr_init_ap(&ctx->expect_reason, reason, ap2)); va_end(ap2); ctx->expect_previous_fail_count = ctx->expect_fail_count; } static void _atf_tc_expect_exit(struct context *ctx, const int exitcode, const char *reason, va_list ap) { va_list ap2; atf_dynstr_t formatted; validate_expect(ctx); ctx->expect = EXPECT_EXIT; va_copy(ap2, ap); check_fatal_error(atf_dynstr_init_ap(&formatted, reason, ap2)); va_end(ap2); create_resfile(ctx->resfile, "expected_exit", exitcode, &formatted); } static void _atf_tc_expect_signal(struct context *ctx, const int signo, const char *reason, va_list ap) { va_list ap2; atf_dynstr_t formatted; validate_expect(ctx); ctx->expect = EXPECT_SIGNAL; va_copy(ap2, ap); check_fatal_error(atf_dynstr_init_ap(&formatted, reason, ap2)); va_end(ap2); create_resfile(ctx->resfile, "expected_signal", signo, &formatted); } static void _atf_tc_expect_death(struct context *ctx, const char *reason, va_list ap) { va_list ap2; atf_dynstr_t formatted; validate_expect(ctx); ctx->expect = EXPECT_DEATH; va_copy(ap2, ap); check_fatal_error(atf_dynstr_init_ap(&formatted, reason, ap2)); va_end(ap2); create_resfile(ctx->resfile, "expected_death", -1, &formatted); } static void _atf_tc_expect_timeout(struct context *ctx, const char *reason, va_list ap) { va_list ap2; atf_dynstr_t formatted; validate_expect(ctx); ctx->expect = EXPECT_TIMEOUT; va_copy(ap2, ap); check_fatal_error(atf_dynstr_init_ap(&formatted, reason, ap2)); va_end(ap2); create_resfile(ctx->resfile, "expected_timeout", -1, &formatted); } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ static struct context Current; atf_error_t atf_tc_run(const atf_tc_t *tc, const char *resfile) { context_init(&Current, tc, resfile); tc->pimpl->m_body(tc); validate_expect(&Current); if (Current.fail_count > 0) { atf_dynstr_t reason; format_reason_fmt(&reason, NULL, 0, "%d checks failed; see output for " "more details", Current.fail_count); fail_requirement(&Current, &reason); } else if (Current.expect_fail_count > 0) { atf_dynstr_t reason; format_reason_fmt(&reason, NULL, 0, "%d checks failed as expected; " "see output for more details", Current.expect_fail_count); expected_failure(&Current, &reason); } else { pass(&Current); } UNREACHABLE; return atf_no_error(); } atf_error_t atf_tc_cleanup(const atf_tc_t *tc) { if (tc->pimpl->m_cleanup != NULL) tc->pimpl->m_cleanup(tc); return atf_no_error(); /* XXX */ } /* --------------------------------------------------------------------- * Free functions that depend on Current. * --------------------------------------------------------------------- */ /* * All the functions below provide delegates to other internal functions * (prefixed by _) that take the current test case as an argument to * prevent them from accessing global state. This is to keep the side- * effects of the internal functions clearer and easier to understand. * * The public API should never have hid the fact that it needs access to * the current test case (other than maybe in the macros), but changing it * is hard. TODO: Revisit in the future. */ void atf_tc_fail(const char *fmt, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, fmt); _atf_tc_fail(&Current, fmt, ap); va_end(ap); } void atf_tc_fail_nonfatal(const char *fmt, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, fmt); _atf_tc_fail_nonfatal(&Current, fmt, ap); va_end(ap); } void atf_tc_fail_check(const char *file, const size_t line, const char *fmt, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, fmt); _atf_tc_fail_check(&Current, file, line, fmt, ap); va_end(ap); } void atf_tc_fail_requirement(const char *file, const size_t line, const char *fmt, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, fmt); _atf_tc_fail_requirement(&Current, file, line, fmt, ap); va_end(ap); } void atf_tc_pass(void) { PRE(Current.tc != NULL); _atf_tc_pass(&Current); } void atf_tc_require_prog(const char *prog) { PRE(Current.tc != NULL); _atf_tc_require_prog(&Current, prog); } void atf_tc_skip(const char *fmt, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, fmt); _atf_tc_skip(&Current, fmt, ap); va_end(ap); } void atf_tc_check_errno(const char *file, const size_t line, const int exp_errno, const char *expr_str, const bool expr_result) { PRE(Current.tc != NULL); _atf_tc_check_errno(&Current, file, line, exp_errno, expr_str, expr_result); } void atf_tc_require_errno(const char *file, const size_t line, const int exp_errno, const char *expr_str, const bool expr_result) { PRE(Current.tc != NULL); _atf_tc_require_errno(&Current, file, line, exp_errno, expr_str, expr_result); } void atf_tc_expect_pass(void) { PRE(Current.tc != NULL); _atf_tc_expect_pass(&Current); } void atf_tc_expect_fail(const char *reason, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, reason); _atf_tc_expect_fail(&Current, reason, ap); va_end(ap); } void atf_tc_expect_exit(const int exitcode, const char *reason, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, reason); _atf_tc_expect_exit(&Current, exitcode, reason, ap); va_end(ap); } void atf_tc_expect_signal(const int signo, const char *reason, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, reason); _atf_tc_expect_signal(&Current, signo, reason, ap); va_end(ap); } void atf_tc_expect_death(const char *reason, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, reason); _atf_tc_expect_death(&Current, reason, ap); va_end(ap); } void atf_tc_expect_timeout(const char *reason, ...) { va_list ap; PRE(Current.tc != NULL); va_start(ap, reason); _atf_tc_expect_timeout(&Current, reason, ap); va_end(ap); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/defs.h.in0000644000470500017500000000324512271526120020047 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_DEFS_H) #define ATF_C_DEFS_H #define ATF_DEFS_ATTRIBUTE_FORMAT_PRINTF(a, b) @ATTRIBUTE_FORMAT_PRINTF@ #define ATF_DEFS_ATTRIBUTE_NORETURN @ATTRIBUTE_NORETURN@ #define ATF_DEFS_ATTRIBUTE_UNUSED @ATTRIBUTE_UNUSED@ #endif /* !defined(ATF_C_DEFS_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/error_test.c0000644000470500017500000002261312271526120020704 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c/error.h" #include "detail/test_helpers.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void test_format(const atf_error_t err ATF_DEFS_ATTRIBUTE_UNUSED, char *buf, size_t buflen) { snprintf(buf, buflen, "Test formatting function"); } /* --------------------------------------------------------------------- * Tests for the "atf_error" type. * --------------------------------------------------------------------- */ ATF_TC(error_new); ATF_TC_HEAD(error_new, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of an error " "object"); } ATF_TC_BODY(error_new, tc) { atf_error_t err; int data; err = atf_error_new("test_error", NULL, 0, NULL); ATF_REQUIRE(atf_error_is(err, "test_error")); ATF_REQUIRE(!atf_error_is(err, "unknown_error")); ATF_REQUIRE(atf_error_data(err) == NULL); atf_error_free(err); data = 5; err = atf_error_new("test_data_error", &data, sizeof(data), NULL); ATF_REQUIRE(atf_error_is(err, "test_data_error")); ATF_REQUIRE(!atf_error_is(err, "unknown_error")); ATF_REQUIRE(atf_error_data(err) != NULL); ATF_REQUIRE_EQ(*((const int *)atf_error_data(err)), 5); atf_error_free(err); } ATF_TC(error_new_wo_memory); ATF_TC_HEAD(error_new_wo_memory, tc) { atf_tc_set_md_var(tc, "descr", "Checks that an unavailable memory error " "raised when constructing an error object " "is properly converted to the no_memory " "static error type"); } ATF_TC_BODY(error_new_wo_memory, tc) { atf_error_t err; void *invalid; invalid = (void *)1; err = atf_error_new("test_error", invalid, SIZE_MAX, NULL); ATF_REQUIRE(atf_error_is(err, "no_memory")); ATF_REQUIRE(atf_error_data(err) == NULL); atf_error_free(err); } ATF_TC(no_error); ATF_TC_HEAD(no_error, tc) { atf_tc_set_md_var(tc, "descr", "Checks that constructing a non-error " "object works"); } ATF_TC_BODY(no_error, tc) { atf_error_t err; err = atf_no_error(); ATF_REQUIRE(!atf_is_error(err)); } ATF_TC(is_error); ATF_TC_HEAD(is_error, tc) { atf_tc_set_md_var(tc, "descr", "Checks the is_error method to determine " "if an error object holds success or an error"); } ATF_TC_BODY(is_error, tc) { atf_error_t err; err = atf_no_error(); ATF_REQUIRE(!atf_is_error(err)); err = atf_error_new("test_error", NULL, 0, NULL); ATF_REQUIRE(atf_is_error(err)); atf_error_free(err); } ATF_TC(format); ATF_TC_HEAD(format, tc) { atf_tc_set_md_var(tc, "descr", "Checks the default formatting function " "and the ability to change it"); } ATF_TC_BODY(format, tc) { atf_error_t err; char buf[1024]; printf("Testing default formatting function\n"); err = atf_error_new("test_error", NULL, 0, NULL); atf_error_format(err, buf, sizeof(buf)); printf("Error string is: %s\n", buf); ATF_REQUIRE(strcmp(buf, "Error 'test_error'") == 0); atf_error_free(err); printf("Testing custom formatting function\n"); err = atf_error_new("test_error", NULL, 0, test_format); atf_error_format(err, buf, sizeof(buf)); printf("Error string is: %s\n", buf); ATF_REQUIRE(strcmp(buf, "Test formatting function") == 0); atf_error_free(err); } /* --------------------------------------------------------------------- * Tests for the "libc" error. * --------------------------------------------------------------------- */ ATF_TC(libc_new); ATF_TC_HEAD(libc_new, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of libc errors"); } ATF_TC_BODY(libc_new, tc) { atf_error_t err; err = atf_libc_error(ENOMEM, "Test message 1"); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOMEM); ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 1") == 0); atf_error_free(err); err = atf_libc_error(EPERM, "%s message %d", "Test", 2); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), EPERM); ATF_REQUIRE(strcmp(atf_libc_error_msg(err), "Test message 2") == 0); atf_error_free(err); } ATF_TC(libc_format); ATF_TC_HEAD(libc_format, tc) { atf_tc_set_md_var(tc, "descr", "Checks the formatting of libc errors"); } ATF_TC_BODY(libc_format, tc) { atf_error_t err; char buf[1024]; err = atf_libc_error(ENOMEM, "Test message 1"); atf_error_format(err, buf, sizeof(buf)); ATF_REQUIRE(strstr(buf, strerror(ENOMEM)) != NULL); ATF_REQUIRE(strstr(buf, "Test message 1") != NULL); atf_error_free(err); err = atf_libc_error(EPERM, "Test message 2"); atf_error_format(err, buf, sizeof(buf)); ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL); ATF_REQUIRE(strstr(buf, "Test message 2") != NULL); atf_error_free(err); err = atf_libc_error(EPERM, "%s message %d", "Test", 3); atf_error_format(err, buf, sizeof(buf)); ATF_REQUIRE(strstr(buf, strerror(EPERM)) != NULL); ATF_REQUIRE(strstr(buf, "Test message 3") != NULL); atf_error_free(err); } /* --------------------------------------------------------------------- * Tests for the "no_memory" error. * --------------------------------------------------------------------- */ ATF_TC(no_memory_new); ATF_TC_HEAD(no_memory_new, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory " "errors"); } ATF_TC_BODY(no_memory_new, tc) { atf_error_t err; err = atf_no_memory_error(); ATF_REQUIRE(atf_error_is(err, "no_memory")); ATF_REQUIRE(atf_error_data(err) == NULL); atf_error_free(err); } ATF_TC(no_memory_format); ATF_TC_HEAD(no_memory_format, tc) { atf_tc_set_md_var(tc, "descr", "Checks the formatting of no_memory " "errors"); } ATF_TC_BODY(no_memory_format, tc) { atf_error_t err; char buf[1024]; err = atf_no_memory_error(); atf_error_format(err, buf, sizeof(buf)); ATF_REQUIRE(strcmp(buf, "Not enough memory") == 0); atf_error_free(err); } ATF_TC(no_memory_twice); ATF_TC_HEAD(no_memory_twice, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of no_memory " "errors multiple times, as this error is initialized " "statically"); } ATF_TC_BODY(no_memory_twice, tc) { { atf_error_t err = atf_no_memory_error(); ATF_REQUIRE(atf_error_is(err, "no_memory")); ATF_REQUIRE(atf_error_data(err) == NULL); atf_error_free(err); } { atf_error_t err = atf_no_memory_error(); ATF_REQUIRE(atf_error_is(err, "no_memory")); ATF_REQUIRE(atf_error_data(err) == NULL); atf_error_free(err); } } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/error.h"); HEADER_TC(include_fwd, "atf-c/error_fwd.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the tests for the "atf_error" type. */ ATF_TP_ADD_TC(tp, error_new); ATF_TP_ADD_TC(tp, error_new_wo_memory); ATF_TP_ADD_TC(tp, no_error); ATF_TP_ADD_TC(tp, is_error); ATF_TP_ADD_TC(tp, format); /* Add the tests for the "libc" error. */ ATF_TP_ADD_TC(tp, libc_new); ATF_TP_ADD_TC(tp, libc_format); /* Add the tests for the "no_memory" error. */ ATF_TP_ADD_TC(tp, no_memory_new); ATF_TP_ADD_TC(tp, no_memory_format); ATF_TP_ADD_TC(tp, no_memory_twice); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); ATF_TP_ADD_TC(tp, include_fwd); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/Atffile0000644000470500017500000000036112271526120017641 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: detail tp: atf_c_test tp: build_test tp: check_test tp: config_test tp: error_test tp: macros_test tp: pkg_config_test tp: tc_test tp: tp_test tp: utils_test bind9-9.9.5.dfsg/unit/atf-src/atf-c/pkg_config_test.sh0000644000470500017500000001065012271526120022047 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2008 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The following tests assume that the atf-c.pc file is installed in a # directory that is known by pkg-config. Otherwise they will fail, # and you will be required to adjust PKG_CONFIG_PATH accordingly. # # It would be possible to bypass this requirement by setting the path # explicitly during the tests, but then this would not do a real check # to ensure that the installation is working. require_pc() { pkg-config ${1} || atf_fail "pkg-config could not locate ${1}.pc;" \ "maybe need to set PKG_CONFIG_PATH?" } check_version() { atf_check -s eq:0 -o save:stdout -e empty -x \ "atf-version | head -n 1 | cut -d ' ' -f 4" ver1=$(cat stdout) echo "Version reported by atf-version: ${ver1}" atf_check -s eq:0 -o save:stdout -e empty pkg-config --modversion "${1}" ver2=$(cat stdout) echo "Version reported by pkg-config: ${ver2}" atf_check_equal ${ver1} ${ver2} } atf_test_case version version_head() { atf_set "descr" "Checks that the version in atf-c is correct" atf_set "require.progs" "pkg-config" } version_body() { require_pc "atf-c" check_version "atf-c" } atf_test_case build build_head() { atf_set "descr" "Checks that a test program can be built against" \ "the C library based on the pkg-config information" atf_set "require.progs" "pkg-config" } build_body() { require_pc "atf-c" atf_check -s eq:0 -o save:stdout -e empty pkg-config --variable=cc atf-c cc=$(cat stdout) echo "Compiler is: ${cxx}" atf_require_prog ${cxx} cat >tp.c < #include ATF_TC(tc); ATF_TC_HEAD(tc, tc) { atf_tc_set_md_var(tc, "descr", "A test case"); } ATF_TC_BODY(tc, tc) { printf("Running\n"); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, tc); return atf_no_error(); } EOF atf_check -s eq:0 -o save:stdout -e empty pkg-config --cflags atf-c cflags=$(cat stdout) echo "CFLAGS are: ${cflags}" atf_check -s eq:0 -o save:stdout -e empty \ pkg-config --libs-only-L --libs-only-other atf-c ldflags=$(cat stdout) atf_check -s eq:0 -o save:stdout -e empty pkg-config --libs-only-l atf-c libs=$(cat stdout) echo "LDFLAGS are: ${ldflags}" echo "LIBS are: ${libs}" atf_check -s eq:0 -o empty -e empty ${cc} ${cflags} -o tp.o -c tp.c atf_check -s eq:0 -o empty -e empty ${cc} ${ldflags} -o tp tp.o ${libs} libpath= for f in ${ldflags}; do case ${f} in -L*) dir=$(echo ${f} | sed -e 's,^-L,,') if [ -z "${libpath}" ]; then libpath="${dir}" else libpath="${libpath}:${dir}" fi ;; *) ;; esac done atf_check -s eq:0 -o empty -e empty test -x tp atf_check -s eq:0 -o match:'Running' -e empty -x \ "LD_LIBRARY_PATH=${libpath} ./tp tc" } atf_init_test_cases() { atf_add_test_case version atf_add_test_case build } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/atf-c/build_test.c0000644000470500017500000001713112271526120020651 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2009 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/build.h" #include "atf-c/config.h" #include "atf-c/utils.h" #include "detail/env.h" #include "detail/test_helpers.h" #include "h_build.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ void __atf_config_reinit(void); static bool equal_arrays(const char *const *exp_array, char **actual_array) { bool equal; if (*exp_array == NULL && *actual_array == NULL) equal = true; else if (*exp_array == NULL || *actual_array == NULL) equal = false; else { equal = true; while (*actual_array != NULL) { if (*exp_array == NULL || strcmp(*exp_array, *actual_array) != 0) { equal = false; break; } exp_array++; actual_array++; } } return equal; } static void check_equal_array(const char *const *exp_array, char **actual_array) { { const char *const *exp_ptr; printf("Expected arguments:"); for (exp_ptr = exp_array; *exp_ptr != NULL; exp_ptr++) printf(" '%s'", *exp_ptr); printf("\n"); } { char **actual_ptr; printf("Returned arguments:"); for (actual_ptr = actual_array; *actual_ptr != NULL; actual_ptr++) printf(" '%s'", *actual_ptr); printf("\n"); } if (!equal_arrays(exp_array, actual_array)) atf_tc_fail_nonfatal("The constructed argv differs from the " "expected values"); } static void verbose_set_env(const char *var, const char *val) { printf("Setting %s to '%s'\n", var, val); RE(atf_env_set(var, val)); } /* --------------------------------------------------------------------- * Internal test cases. * --------------------------------------------------------------------- */ ATF_TC(equal_arrays); ATF_TC_HEAD(equal_arrays, tc) { atf_tc_set_md_var(tc, "descr", "Tests the test case internal " "equal_arrays function"); } ATF_TC_BODY(equal_arrays, tc) { { const char *const exp[] = { NULL }; char *actual[] = { NULL }; ATF_CHECK(equal_arrays(exp, actual)); } { const char *const exp[] = { NULL }; char *actual[2] = { strdup("foo"), NULL }; ATF_CHECK(!equal_arrays(exp, actual)); free(actual[0]); } { const char *const exp[] = { "foo", NULL }; char *actual[] = { NULL }; ATF_CHECK(!equal_arrays(exp, actual)); } { const char *const exp[] = { "foo", NULL }; char *actual[2] = { strdup("foo"), NULL }; ATF_CHECK(equal_arrays(exp, actual)); free(actual[0]); } } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(c_o); ATF_TC_HEAD(c_o, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_build_c_o function"); } ATF_TC_BODY(c_o, tc) { struct c_o_test *test; for (test = c_o_tests; test->expargv[0] != NULL; test++) { printf("> Test: %s\n", test->msg); verbose_set_env("ATF_BUILD_CC", test->cc); verbose_set_env("ATF_BUILD_CFLAGS", test->cflags); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); __atf_config_reinit(); { char **argv; if (test->hasoptargs) RE(atf_build_c_o(test->sfile, test->ofile, test->optargs, &argv)); else RE(atf_build_c_o(test->sfile, test->ofile, NULL, &argv)); check_equal_array(test->expargv, argv); atf_utils_free_charpp(argv); } } } ATF_TC(cpp); ATF_TC_HEAD(cpp, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_build_cpp function"); } ATF_TC_BODY(cpp, tc) { struct cpp_test *test; for (test = cpp_tests; test->expargv[0] != NULL; test++) { printf("> Test: %s\n", test->msg); verbose_set_env("ATF_BUILD_CPP", test->cpp); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); __atf_config_reinit(); { char **argv; if (test->hasoptargs) RE(atf_build_cpp(test->sfile, test->ofile, test->optargs, &argv)); else RE(atf_build_cpp(test->sfile, test->ofile, NULL, &argv)); check_equal_array(test->expargv, argv); atf_utils_free_charpp(argv); } } } ATF_TC(cxx_o); ATF_TC_HEAD(cxx_o, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_build_cxx_o function"); } ATF_TC_BODY(cxx_o, tc) { struct cxx_o_test *test; for (test = cxx_o_tests; test->expargv[0] != NULL; test++) { printf("> Test: %s\n", test->msg); verbose_set_env("ATF_BUILD_CXX", test->cxx); verbose_set_env("ATF_BUILD_CXXFLAGS", test->cxxflags); verbose_set_env("ATF_BUILD_CPPFLAGS", test->cppflags); __atf_config_reinit(); { char **argv; if (test->hasoptargs) RE(atf_build_cxx_o(test->sfile, test->ofile, test->optargs, &argv)); else RE(atf_build_cxx_o(test->sfile, test->ofile, NULL, &argv)); check_equal_array(test->expargv, argv); atf_utils_free_charpp(argv); } } } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/build.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the internal test cases. */ ATF_TP_ADD_TC(tp, equal_arrays); /* Add the test cases for the free functions. */ ATF_TP_ADD_TC(tp, c_o); ATF_TP_ADD_TC(tp, cpp); ATF_TP_ADD_TC(tp, cxx_o); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/unused_test.c0000644000470500017500000000360412271526120021055 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include ATF_TC(this_is_used); ATF_TC_HEAD(this_is_used, tc) { atf_tc_set_md_var(tc, "descr", "A test case that is not referenced"); } ATF_TC_BODY(this_is_used, tc) { } ATF_TC(this_is_unused); ATF_TC_HEAD(this_is_unused, tc) { atf_tc_set_md_var(tc, "descr", "A test case that is referenced"); } ATF_TC_BODY(this_is_unused, tc) { } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, this_is_used); /* ATF_TP_ADD_TC(tp, this_is_unused); */ return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/atf-c.pc.in0000644000470500017500000000033212271526120020265 0ustar lamontlamont# ATF pkg-config file cc=__CC__ includedir=__INCLUDEDIR__ libdir=__LIBDIR__ Name: atf-c Description: Automated Testing Framework (C binding) Version: __ATF_VERSION__ Cflags: -I${includedir} Libs: -L${libdir} -latf-c bind9-9.9.5.dfsg/unit/atf-src/atf-c/error.c0000644000470500017500000001436212271526120017647 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/error.h" #include "detail/sanity.h" /* Theoretically, there can only be a single error intance at any given * point in time, because errors are raised at one point and must be * handled immediately. If another error has to be raised during the * handling process, something else has to be done with the previous * error. * * This is per-thread information and will break threaded tests, but we * currently do not have any threading support; therefore, this is fine. */ static bool error_on_flight = false; /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void error_format(const atf_error_t err, char *buf, size_t buflen) { PRE(err != NULL); snprintf(buf, buflen, "Error '%s'", err->m_type); } static bool error_init(atf_error_t err, const char *type, void *data, size_t datalen, void (*format)(const atf_error_t, char *, size_t)) { bool ok; PRE(data != NULL || datalen == 0); PRE(datalen != 0 || data == NULL); err->m_free = false; err->m_type = type; err->m_format = (format == NULL) ? error_format : format; ok = true; if (data == NULL) { err->m_data = NULL; } else { err->m_data = malloc(datalen); if (err->m_data == NULL) { ok = false; } else memcpy(err->m_data, data, datalen); } return ok; } /* --------------------------------------------------------------------- * The "atf_error" type. * --------------------------------------------------------------------- */ atf_error_t atf_error_new(const char *type, void *data, size_t datalen, void (*format)(const atf_error_t, char *, size_t)) { atf_error_t err; PRE(!error_on_flight); PRE(data != NULL || datalen == 0); PRE(datalen != 0 || data == NULL); err = malloc(sizeof(*err)); if (err == NULL) err = atf_no_memory_error(); else { if (!error_init(err, type, data, datalen, format)) { free(err); err = atf_no_memory_error(); } else { err->m_free = true; error_on_flight = true; } } INV(err != NULL); POST(error_on_flight); return err; } void atf_error_free(atf_error_t err) { bool freeit; PRE(error_on_flight); PRE(err != NULL); freeit = err->m_free; if (err->m_data != NULL) free(err->m_data); if (freeit) free(err); error_on_flight = false; } atf_error_t atf_no_error(void) { return NULL; } bool atf_is_error(const atf_error_t err) { return err != NULL; } bool atf_error_is(const atf_error_t err, const char *type) { PRE(err != NULL); return strcmp(err->m_type, type) == 0; } const void * atf_error_data(const atf_error_t err) { PRE(err != NULL); return err->m_data; } void atf_error_format(const atf_error_t err, char *buf, size_t buflen) { PRE(err != NULL); err->m_format(err, buf, buflen); } /* --------------------------------------------------------------------- * Common error types. * --------------------------------------------------------------------- */ /* * The "libc" error. */ struct atf_libc_error_data { int m_errno; char m_what[4096]; }; typedef struct atf_libc_error_data atf_libc_error_data_t; static void libc_format(const atf_error_t err, char *buf, size_t buflen) { const atf_libc_error_data_t *data; PRE(atf_error_is(err, "libc")); data = atf_error_data(err); snprintf(buf, buflen, "%s: %s", data->m_what, strerror(data->m_errno)); } atf_error_t atf_libc_error(int syserrno, const char *fmt, ...) { atf_error_t err; atf_libc_error_data_t data; va_list ap; data.m_errno = syserrno; va_start(ap, fmt); vsnprintf(data.m_what, sizeof(data.m_what), fmt, ap); va_end(ap); err = atf_error_new("libc", &data, sizeof(data), libc_format); return err; } int atf_libc_error_code(const atf_error_t err) { const struct atf_libc_error_data *data; PRE(atf_error_is(err, "libc")); data = atf_error_data(err); return data->m_errno; } const char * atf_libc_error_msg(const atf_error_t err) { const struct atf_libc_error_data *data; PRE(atf_error_is(err, "libc")); data = atf_error_data(err); return data->m_what; } /* * The "no_memory" error. */ static struct atf_error no_memory_error; static void no_memory_format(const atf_error_t err, char *buf, size_t buflen) { PRE(atf_error_is(err, "no_memory")); snprintf(buf, buflen, "Not enough memory"); } atf_error_t atf_no_memory_error(void) { PRE(!error_on_flight); error_init(&no_memory_error, "no_memory", NULL, 0, no_memory_format); error_on_flight = true; return &no_memory_error; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/config_test.c0000644000470500017500000001226512271526120021022 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "atf-c/config.h" #include "detail/env.h" #include "detail/test_helpers.h" static const char *test_value = "env-value"; static struct varnames { const char *lc; const char *uc; bool can_be_empty; } all_vars[] = { { "atf_arch", "ATF_ARCH", false }, { "atf_build_cc", "ATF_BUILD_CC", false }, { "atf_build_cflags", "ATF_BUILD_CFLAGS", true }, { "atf_build_cpp", "ATF_BUILD_CPP", false }, { "atf_build_cppflags", "ATF_BUILD_CPPFLAGS", true }, { "atf_build_cxx", "ATF_BUILD_CXX", false }, { "atf_build_cxxflags", "ATF_BUILD_CXXFLAGS", true }, { "atf_confdir", "ATF_CONFDIR", false }, { "atf_includedir", "ATF_INCLUDEDIR", false }, { "atf_libdir", "ATF_LIBDIR", false }, { "atf_libexecdir", "ATF_LIBEXECDIR", false }, { "atf_machine", "ATF_MACHINE", false }, { "atf_pkgdatadir", "ATF_PKGDATADIR", false }, { "atf_shell", "ATF_SHELL", false }, { "atf_workdir", "ATF_WORKDIR", false }, { NULL, NULL, false } }; /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ void __atf_config_reinit(void); static void unset_all(void) { const struct varnames *v; for (v = all_vars; v->lc != NULL; v++) RE(atf_env_unset(v->uc)); } static void compare_one(const char *var, const char *expvalue) { const struct varnames *v; printf("Checking that %s is set to %s\n", var, expvalue); for (v = all_vars; v->lc != NULL; v++) { if (strcmp(v->lc, var) == 0) ATF_CHECK_STREQ(atf_config_get(v->lc), test_value); else ATF_CHECK(strcmp(atf_config_get(v->lc), test_value) != 0); } } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(get); ATF_TC_HEAD(get, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_config_get function"); } ATF_TC_BODY(get, tc) { const struct varnames *v; /* Unset all known environment variables and make sure the built-in * values do not match the bogus value we will use for testing. */ unset_all(); __atf_config_reinit(); for (v = all_vars; v->lc != NULL; v++) ATF_CHECK(strcmp(atf_config_get(v->lc), test_value) != 0); /* Test the behavior of empty values. */ for (v = all_vars; v->lc != NULL; v++) { unset_all(); if (strcmp(atf_config_get(v->lc), "") != 0) { RE(atf_env_set(v->uc, "")); __atf_config_reinit(); if (v->can_be_empty) ATF_CHECK(strlen(atf_config_get(v->lc)) == 0); else ATF_CHECK(strlen(atf_config_get(v->lc)) > 0); } } /* Check if every variable is recognized individually. */ for (v = all_vars; v->lc != NULL; v++) { unset_all(); RE(atf_env_set(v->uc, test_value)); __atf_config_reinit(); compare_one(v->lc, test_value); } } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/config.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, get); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/tp.h0000644000470500017500000000502512271526120017142 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_TP_H) #define ATF_C_TP_H #include #include struct atf_tc; /* --------------------------------------------------------------------- * The "atf_tp" type. * --------------------------------------------------------------------- */ struct atf_tp_impl; struct atf_tp { struct atf_tp_impl *pimpl; }; typedef struct atf_tp atf_tp_t; /* Constructors/destructors. */ atf_error_t atf_tp_init(atf_tp_t *, const char *const *); void atf_tp_fini(atf_tp_t *); /* Getters. */ char **atf_tp_get_config(const atf_tp_t *); bool atf_tp_has_tc(const atf_tp_t *, const char *); const struct atf_tc *atf_tp_get_tc(const atf_tp_t *, const char *); const struct atf_tc *const *atf_tp_get_tcs(const atf_tp_t *); /* Modifiers. */ atf_error_t atf_tp_add_tc(atf_tp_t *, struct atf_tc *); /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_tp_run(const atf_tp_t *, const char *, const char *); atf_error_t atf_tp_cleanup(const atf_tp_t *, const char *); #endif /* ATF_C_TP_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/check.c0000644000470500017500000002746212271526120017600 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "atf-c/build.h" #include "atf-c/check.h" #include "atf-c/config.h" #include "atf-c/defs.h" #include "atf-c/error.h" #include "atf-c/utils.h" #include "detail/dynstr.h" #include "detail/fs.h" #include "detail/list.h" #include "detail/process.h" #include "detail/sanity.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static atf_error_t create_tmpdir(atf_fs_path_t *dir) { atf_error_t err; err = atf_fs_path_init_fmt(dir, "%s/check.XXXXXX", atf_config_get("atf_workdir")); if (atf_is_error(err)) goto out; err = atf_fs_mkdtemp(dir); if (atf_is_error(err)) { atf_fs_path_fini(dir); goto out; } INV(!atf_is_error(err)); out: return err; } static void cleanup_tmpdir(const atf_fs_path_t *dir, const atf_fs_path_t *outfile, const atf_fs_path_t *errfile) { { atf_error_t err = atf_fs_unlink(outfile); if (atf_is_error(err)) { INV(atf_error_is(err, "libc") && atf_libc_error_code(err) == ENOENT); atf_error_free(err); } else INV(!atf_is_error(err)); } { atf_error_t err = atf_fs_unlink(errfile); if (atf_is_error(err)) { INV(atf_error_is(err, "libc") && atf_libc_error_code(err) == ENOENT); atf_error_free(err); } else INV(!atf_is_error(err)); } { atf_error_t err = atf_fs_rmdir(dir); INV(!atf_is_error(err)); } } static int const_execvp(const char *file, const char *const *argv) { #define UNCONST(a) ((void *)(unsigned long)(const void *)(a)) return execvp(file, UNCONST(argv)); #undef UNCONST } static atf_error_t init_sb(const atf_fs_path_t *path, atf_process_stream_t *sb) { atf_error_t err; if (path == NULL) err = atf_process_stream_init_inherit(sb); else err = atf_process_stream_init_redirect_path(sb, path); return err; } static atf_error_t init_sbs(const atf_fs_path_t *outfile, atf_process_stream_t *outsb, const atf_fs_path_t *errfile, atf_process_stream_t *errsb) { atf_error_t err; err = init_sb(outfile, outsb); if (atf_is_error(err)) goto out; err = init_sb(errfile, errsb); if (atf_is_error(err)) { atf_process_stream_fini(outsb); goto out; } out: return err; } struct exec_data { const char *const *m_argv; }; static void exec_child(void *) ATF_DEFS_ATTRIBUTE_NORETURN; static void exec_child(void *v) { struct exec_data *ea = v; const_execvp(ea->m_argv[0], ea->m_argv); fprintf(stderr, "execvp(%s) failed: %s\n", ea->m_argv[0], strerror(errno)); exit(127); } static atf_error_t fork_and_wait(const char *const *argv, const atf_fs_path_t *outfile, const atf_fs_path_t *errfile, atf_process_status_t *status) { atf_error_t err; atf_process_child_t child; atf_process_stream_t outsb, errsb; struct exec_data ea = { argv }; err = init_sbs(outfile, &outsb, errfile, &errsb); if (atf_is_error(err)) goto out; err = atf_process_fork(&child, exec_child, &outsb, &errsb, &ea); if (atf_is_error(err)) goto out_sbs; err = atf_process_child_wait(&child, status); out_sbs: atf_process_stream_fini(&errsb); atf_process_stream_fini(&outsb); out: return err; } static void update_success_from_status(const char *progname, const atf_process_status_t *status, bool *success) { bool s = atf_process_status_exited(status) && atf_process_status_exitstatus(status) == EXIT_SUCCESS; if (atf_process_status_exited(status)) { if (atf_process_status_exitstatus(status) == EXIT_SUCCESS) INV(s); else { INV(!s); fprintf(stderr, "%s failed with exit code %d\n", progname, atf_process_status_exitstatus(status)); } } else if (atf_process_status_signaled(status)) { INV(!s); fprintf(stderr, "%s failed due to signal %d%s\n", progname, atf_process_status_termsig(status), atf_process_status_coredump(status) ? " (core dumped)" : ""); } else { INV(!s); fprintf(stderr, "%s failed due to unknown reason\n", progname); } *success = s; } static atf_error_t array_to_list(const char *const *a, atf_list_t *l) { atf_error_t err; err = atf_list_init(l); if (atf_is_error(err)) goto out; while (*a != NULL) { char *item = strdup(*a); if (item == NULL) { err = atf_no_memory_error(); goto out; } err = atf_list_append(l, item, true); if (atf_is_error(err)) goto out; a++; } out: return err; } static void print_array(const char *const *array, const char *pfx) { const char *const *ptr; printf("%s", pfx); for (ptr = array; *ptr != NULL; ptr++) printf(" %s", *ptr); printf("\n"); } static atf_error_t check_build_run(const char *const *argv, bool *success) { atf_error_t err; atf_process_status_t status; print_array(argv, ">"); err = fork_and_wait(argv, NULL, NULL, &status); if (atf_is_error(err)) goto out; update_success_from_status(argv[0], &status, success); atf_process_status_fini(&status); INV(!atf_is_error(err)); out: return err; } /* --------------------------------------------------------------------- * The "atf_check_result" type. * --------------------------------------------------------------------- */ struct atf_check_result_impl { atf_list_t m_argv; atf_fs_path_t m_dir; atf_fs_path_t m_stdout; atf_fs_path_t m_stderr; atf_process_status_t m_status; }; static atf_error_t atf_check_result_init(atf_check_result_t *r, const char *const *argv, const atf_fs_path_t *dir) { atf_error_t err; r->pimpl = malloc(sizeof(struct atf_check_result_impl)); if (r->pimpl == NULL) return atf_no_memory_error(); err = array_to_list(argv, &r->pimpl->m_argv); if (atf_is_error(err)) goto out; err = atf_fs_path_copy(&r->pimpl->m_dir, dir); if (atf_is_error(err)) goto err_argv; err = atf_fs_path_init_fmt(&r->pimpl->m_stdout, "%s/stdout", atf_fs_path_cstring(dir)); if (atf_is_error(err)) goto err_dir; err = atf_fs_path_init_fmt(&r->pimpl->m_stderr, "%s/stderr", atf_fs_path_cstring(dir)); if (atf_is_error(err)) goto err_stdout; INV(!atf_is_error(err)); goto out; err_stdout: atf_fs_path_fini(&r->pimpl->m_stdout); err_dir: atf_fs_path_fini(&r->pimpl->m_dir); err_argv: atf_list_fini(&r->pimpl->m_argv); out: return err; } void atf_check_result_fini(atf_check_result_t *r) { atf_process_status_fini(&r->pimpl->m_status); cleanup_tmpdir(&r->pimpl->m_dir, &r->pimpl->m_stdout, &r->pimpl->m_stderr); atf_fs_path_fini(&r->pimpl->m_stdout); atf_fs_path_fini(&r->pimpl->m_stderr); atf_fs_path_fini(&r->pimpl->m_dir); atf_list_fini(&r->pimpl->m_argv); free(r->pimpl); } const char * atf_check_result_stdout(const atf_check_result_t *r) { return atf_fs_path_cstring(&r->pimpl->m_stdout); } const char * atf_check_result_stderr(const atf_check_result_t *r) { return atf_fs_path_cstring(&r->pimpl->m_stderr); } bool atf_check_result_exited(const atf_check_result_t *r) { return atf_process_status_exited(&r->pimpl->m_status); } int atf_check_result_exitcode(const atf_check_result_t *r) { return atf_process_status_exitstatus(&r->pimpl->m_status); } bool atf_check_result_signaled(const atf_check_result_t *r) { return atf_process_status_signaled(&r->pimpl->m_status); } int atf_check_result_termsig(const atf_check_result_t *r) { return atf_process_status_termsig(&r->pimpl->m_status); } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ /* XXX: This function shouldn't be in this module. It messes with stdout * and stderr, and it provides a very high-end interface. This belongs, * probably, somewhere related to test cases (such as in the tc module). */ atf_error_t atf_check_build_c_o(const char *sfile, const char *ofile, const char *const optargs[], bool *success) { atf_error_t err; char **argv; err = atf_build_c_o(sfile, ofile, optargs, &argv); if (atf_is_error(err)) goto out; err = check_build_run((const char *const *)argv, success); atf_utils_free_charpp(argv); out: return err; } atf_error_t atf_check_build_cpp(const char *sfile, const char *ofile, const char *const optargs[], bool *success) { atf_error_t err; char **argv; err = atf_build_cpp(sfile, ofile, optargs, &argv); if (atf_is_error(err)) goto out; err = check_build_run((const char *const *)argv, success); atf_utils_free_charpp(argv); out: return err; } atf_error_t atf_check_build_cxx_o(const char *sfile, const char *ofile, const char *const optargs[], bool *success) { atf_error_t err; char **argv; err = atf_build_cxx_o(sfile, ofile, optargs, &argv); if (atf_is_error(err)) goto out; err = check_build_run((const char *const *)argv, success); atf_utils_free_charpp(argv); out: return err; } atf_error_t atf_check_exec_array(const char *const *argv, atf_check_result_t *r) { atf_error_t err; atf_fs_path_t dir; err = create_tmpdir(&dir); if (atf_is_error(err)) goto out; err = atf_check_result_init(r, argv, &dir); if (atf_is_error(err)) { atf_error_t err2 = atf_fs_rmdir(&dir); INV(!atf_is_error(err2)); goto out; } err = fork_and_wait(argv, &r->pimpl->m_stdout, &r->pimpl->m_stderr, &r->pimpl->m_status); if (atf_is_error(err)) { atf_check_result_fini(r); goto out; } INV(!atf_is_error(err)); atf_fs_path_fini(&dir); out: return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/Makefile.am.inc0000644000470500017500000001433512271526120021156 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # lib_LTLIBRARIES += libatf-c.la libatf_c_la_SOURCES = atf-c/build.c \ atf-c/build.h \ atf-c/check.c \ atf-c/check.h \ atf-c/config.c \ atf-c/config.h \ atf-c/error.c \ atf-c/error.h \ atf-c/error_fwd.h \ atf-c/macros.h \ atf-c/tc.c \ atf-c/tc.h \ atf-c/tp.c \ atf-c/tp.h \ atf-c/utils.c \ atf-c/utils.h nodist_libatf_c_la_SOURCES = atf-c/defs.h libatf_c_la_CPPFLAGS = "-DATF_ARCH=\"$(atf_arch)\"" \ "-DATF_BUILD_CC=\"$(ATF_BUILD_CC)\"" \ "-DATF_BUILD_CFLAGS=\"$(ATF_BUILD_CFLAGS)\"" \ "-DATF_BUILD_CPP=\"$(ATF_BUILD_CPP)\"" \ "-DATF_BUILD_CPPFLAGS=\"$(ATF_BUILD_CPPFLAGS)\"" \ "-DATF_BUILD_CXX=\"$(ATF_BUILD_CXX)\"" \ "-DATF_BUILD_CXXFLAGS=\"$(ATF_BUILD_CXXFLAGS)\"" \ "-DATF_CONFDIR=\"$(atf_confdir)\"" \ "-DATF_INCLUDEDIR=\"$(includedir)\"" \ "-DATF_LIBDIR=\"$(libdir)\"" \ "-DATF_LIBEXECDIR=\"$(libexecdir)\"" \ "-DATF_MACHINE=\"$(atf_machine)\"" \ "-DATF_M4=\"$(ATF_M4)\"" \ "-DATF_PKGDATADIR=\"$(pkgdatadir)\"" \ "-DATF_SHELL=\"$(ATF_SHELL)\"" \ "-DATF_WORKDIR=\"$(ATF_WORKDIR)\"" \ -I$(srcdir)/atf-c libatf_c_la_LDFLAGS = -version-info 0:0:0 # XXX For some reason, the nodist line above does not work as expected. # Work this problem around. dist-hook: kill-defs-h kill-defs-h: rm -f $(distdir)/atf-c/defs.h include_HEADERS += atf-c.h atf_c_HEADERS = atf-c/build.h \ atf-c/check.h \ atf-c/config.h \ atf-c/defs.h \ atf-c/error.h \ atf-c/error_fwd.h \ atf-c/macros.h \ atf-c/tc.h \ atf-c/tp.h \ atf-c/utils.h atf_cdir = $(includedir)/atf-c dist_man_MANS += atf-c/atf-c-api.3 atf_aclocal_DATA += atf-c/atf-common.m4 atf-c/atf-c.m4 EXTRA_DIST += atf-c/atf-common.m4 atf-c/atf-c.m4 atf_cpkgconfigdir = $(atf_pkgconfigdir) atf_cpkgconfig_DATA = atf-c/atf-c.pc CLEANFILES += atf-c/atf-c.pc EXTRA_DIST += atf-c/atf-c.pc.in atf-c/atf-c.pc: $(srcdir)/atf-c/atf-c.pc.in Makefile test -d atf-c || mkdir -p atf-c sed -e 's#__ATF_VERSION__#$(PACKAGE_VERSION)#g' \ -e 's#__CC__#$(CC)#g' \ -e 's#__INCLUDEDIR__#$(includedir)#g' \ -e 's#__LIBDIR__#$(libdir)#g' \ <$(srcdir)/atf-c/atf-c.pc.in >atf-c/atf-c.pc.tmp mv atf-c/atf-c.pc.tmp atf-c/atf-c.pc tests_atf_c_DATA = atf-c/Atffile \ atf-c/Kyuafile \ atf-c/macros_h_test.c \ atf-c/unused_test.c tests_atf_cdir = $(pkgtestsdir)/atf-c EXTRA_DIST += $(tests_atf_c_DATA) tests_atf_c_PROGRAMS = atf-c/atf_c_test atf_c_atf_c_test_SOURCES = atf-c/atf_c_test.c atf_c_atf_c_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/build_test atf_c_build_test_SOURCES = atf-c/build_test.c atf-c/h_build.h atf_c_build_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/check_test atf_c_check_test_SOURCES = atf-c/check_test.c atf_c_check_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/config_test atf_c_config_test_SOURCES = atf-c/config_test.c atf_c_config_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/error_test atf_c_error_test_SOURCES = atf-c/error_test.c atf_c_error_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/macros_test atf_c_macros_test_SOURCES = atf-c/macros_test.c atf_c_macros_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_SCRIPTS = atf-c/pkg_config_test CLEANFILES += atf-c/pkg_config_test EXTRA_DIST += atf-c/pkg_config_test.sh atf-c/pkg_config_test: $(srcdir)/atf-c/pkg_config_test.sh test -d atf-c || mkdir -p atf-c @src="$(srcdir)/atf-c/pkg_config_test.sh"; \ dst="atf-c/pkg_config_test"; $(BUILD_SH_TP) tests_atf_c_PROGRAMS += atf-c/tc_test atf_c_tc_test_SOURCES = atf-c/tc_test.c atf_c_tc_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/tp_test atf_c_tp_test_SOURCES = atf-c/tp_test.c atf_c_tp_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_PROGRAMS += atf-c/utils_test atf_c_utils_test_SOURCES = atf-c/utils_test.c atf-c/h_build.h atf_c_utils_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la include atf-c/detail/Makefile.am.inc # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-c/tp.c0000644000470500017500000001200612271526120017132 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/error.h" #include "atf-c/tc.h" #include "atf-c/tp.h" #include "detail/fs.h" #include "detail/map.h" #include "detail/sanity.h" struct atf_tp_impl { atf_list_t m_tcs; atf_map_t m_config; }; /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static const atf_tc_t * find_tc(const atf_tp_t *tp, const char *ident) { const atf_tc_t *tc; atf_list_citer_t iter; tc = NULL; atf_list_for_each_c(iter, &tp->pimpl->m_tcs) { const atf_tc_t *tc2; tc2 = atf_list_citer_data(iter); if (strcmp(atf_tc_get_ident(tc2), ident) == 0) { tc = tc2; break; } } return tc; } /* --------------------------------------------------------------------- * The "atf_tp" type. * --------------------------------------------------------------------- */ /* * Constructors/destructors. */ atf_error_t atf_tp_init(atf_tp_t *tp, const char *const *config) { atf_error_t err; PRE(config != NULL); tp->pimpl = malloc(sizeof(struct atf_tp_impl)); if (tp->pimpl == NULL) return atf_no_memory_error(); err = atf_list_init(&tp->pimpl->m_tcs); if (atf_is_error(err)) goto out; err = atf_map_init_charpp(&tp->pimpl->m_config, config); if (atf_is_error(err)) { atf_list_fini(&tp->pimpl->m_tcs); goto out; } INV(!atf_is_error(err)); out: return err; } void atf_tp_fini(atf_tp_t *tp) { atf_list_iter_t iter; atf_map_fini(&tp->pimpl->m_config); atf_list_for_each(iter, &tp->pimpl->m_tcs) { atf_tc_t *tc = atf_list_iter_data(iter); atf_tc_fini(tc); } atf_list_fini(&tp->pimpl->m_tcs); free(tp->pimpl); } /* * Getters. */ char ** atf_tp_get_config(const atf_tp_t *tp) { return atf_map_to_charpp(&tp->pimpl->m_config); } bool atf_tp_has_tc(const atf_tp_t *tp, const char *id) { const atf_tc_t *tc = find_tc(tp, id); return tc != NULL; } const atf_tc_t * atf_tp_get_tc(const atf_tp_t *tp, const char *id) { const atf_tc_t *tc = find_tc(tp, id); PRE(tc != NULL); return tc; } const atf_tc_t *const * atf_tp_get_tcs(const atf_tp_t *tp) { const atf_tc_t **array; atf_list_citer_t iter; size_t i; array = malloc(sizeof(atf_tc_t *) * (atf_list_size(&tp->pimpl->m_tcs) + 1)); if (array == NULL) goto out; i = 0; atf_list_for_each_c(iter, &tp->pimpl->m_tcs) { array[i] = atf_list_citer_data(iter); if (array[i] == NULL) { free(array); array = NULL; goto out; } i++; } array[i] = NULL; out: return array; } /* * Modifiers. */ atf_error_t atf_tp_add_tc(atf_tp_t *tp, atf_tc_t *tc) { atf_error_t err; PRE(find_tc(tp, atf_tc_get_ident(tc)) == NULL); err = atf_list_append(&tp->pimpl->m_tcs, tc, false); POST(find_tc(tp, atf_tc_get_ident(tc)) != NULL); return err; } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_tp_run(const atf_tp_t *tp, const char *tcname, const char *resfile) { const atf_tc_t *tc; tc = find_tc(tp, tcname); PRE(tc != NULL); return atf_tc_run(tc, resfile); } atf_error_t atf_tp_cleanup(const atf_tp_t *tp, const char *tcname) { const atf_tc_t *tc; tc = find_tc(tp, tcname); PRE(tc != NULL); return atf_tc_cleanup(tc); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/config.h0000644000470500017500000000306412271526120017765 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_CONFIG_H) #define ATF_C_CONFIG_H #include const char *atf_config_get(const char *); #endif /* !defined(ATF_C_CONFIG_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/atf_c_test.c0000644000470500017500000000371412271526120020630 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "detail/test_helpers.h" /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/Kyuafile0000644000470500017500000000065712271526120020050 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="atf_c_test"} atf_test_program{name="build_test"} atf_test_program{name="check_test"} atf_test_program{name="config_test"} atf_test_program{name="error_test"} atf_test_program{name="macros_test"} atf_test_program{name="pkg_config_test"} atf_test_program{name="tc_test"} atf_test_program{name="tp_test"} atf_test_program{name="utils_test"} include("detail/Kyuafile") bind9-9.9.5.dfsg/unit/atf-src/atf-c/tp_test.c0000644000470500017500000000660212271526120020176 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "detail/test_helpers.h" ATF_TC(getopt); ATF_TC_HEAD(getopt, tc) { atf_tc_set_md_var(tc, "descr", "Checks if getopt(3) global state is " "reset by the test program driver so that test cases can use " "getopt(3) again"); } ATF_TC_BODY(getopt, tc) { /* Provide an option that is unknown to the test program driver and * one that is, together with an argument that would be swallowed by * the test program option if it were recognized. */ int argc = 4; char arg1[] = "progname"; char arg2[] = "-Z"; char arg3[] = "-s"; char arg4[] = "foo"; char *const argv[] = { arg1, arg2, arg3, arg4, NULL }; int ch; bool zflag; /* Given that this obviously is a test program, and that we used the * same driver to start, we can test getopt(3) right here without doing * any fancy stuff. */ zflag = false; while ((ch = getopt(argc, argv, ":Z")) != -1) { switch (ch) { case 'Z': zflag = true; break; case '?': default: if (optopt != 's') atf_tc_fail("Unexpected unknown option -%c found", optopt); } } ATF_REQUIRE(zflag); ATF_REQUIRE_EQ_MSG(1, argc - optind, "Invalid number of arguments left " "after the call to getopt(3)"); ATF_CHECK_STREQ_MSG("foo", argv[optind], "The non-option argument is " "invalid"); } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/tp.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, getopt); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/error.h0000644000470500017500000000513312271526120017650 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_ERROR_H) #define ATF_C_ERROR_H #include #include #include /* --------------------------------------------------------------------- * The "atf_error" type. * --------------------------------------------------------------------- */ struct atf_error { bool m_free; const char *m_type; void *m_data; void (*m_format)(struct atf_error *, char *, size_t); }; atf_error_t atf_error_new(const char *, void *, size_t, void (*)(const atf_error_t, char *, size_t)); void atf_error_free(atf_error_t); atf_error_t atf_no_error(void); bool atf_is_error(const atf_error_t); bool atf_error_is(const atf_error_t, const char *); const void *atf_error_data(const atf_error_t); void atf_error_format(const atf_error_t, char *, size_t); /* --------------------------------------------------------------------- * Common error types. * --------------------------------------------------------------------- */ atf_error_t atf_libc_error(int, const char *, ...); int atf_libc_error_code(const atf_error_t); const char *atf_libc_error_msg(const atf_error_t); atf_error_t atf_no_memory_error(void); #endif /* ATF_C_ERROR_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/macros_test.c0000644000470500017500000007602012271526120021040 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include "detail/fs.h" #include "detail/process.h" #include "detail/test_helpers.h" #include "detail/text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void create_ctl_file(const char *name) { atf_fs_path_t p; RE(atf_fs_path_init_fmt(&p, "%s", name)); ATF_REQUIRE(open(atf_fs_path_cstring(&p), O_CREAT | O_WRONLY | O_TRUNC, 0644) != -1); atf_fs_path_fini(&p); } static bool exists(const char *p) { bool b; atf_fs_path_t pp; RE(atf_fs_path_init_fmt(&pp, "%s", p)); RE(atf_fs_exists(&pp, &b)); atf_fs_path_fini(&pp); return b; } static void init_and_run_h_tc(const char *name, void (*head)(atf_tc_t *), void (*body)(const atf_tc_t *)) { atf_tc_t tc; const char *const config[] = { NULL }; RE(atf_tc_init(&tc, name, head, body, NULL, config)); run_h_tc(&tc, "output", "error", "result"); atf_tc_fini(&tc); } /* --------------------------------------------------------------------- * Helper test cases. * --------------------------------------------------------------------- */ #define H_DEF(id, macro) \ ATF_TC_HEAD(h_ ## id, tc) \ { \ atf_tc_set_md_var(tc, "descr", "Helper test case"); \ } \ ATF_TC_BODY(h_ ## id, tc) \ { \ create_ctl_file("before"); \ macro; \ create_ctl_file("after"); \ } #define H_CHECK_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_ ## id) #define H_CHECK_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_ ## id) #define H_CHECK(id, condition) \ H_DEF(check_ ## id, ATF_CHECK(condition)) #define H_CHECK_MSG_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_msg_ ## id) #define H_CHECK_MSG_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_msg_ ## id) #define H_CHECK_MSG(id, condition, msg) \ H_DEF(check_msg_ ## id, ATF_CHECK_MSG(condition, msg)) #define H_CHECK_EQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_eq_ ## id) #define H_CHECK_EQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_eq_ ## id) #define H_CHECK_EQ(id, v1, v2) \ H_DEF(check_eq_ ## id, ATF_CHECK_EQ(v1, v2)) #define H_CHECK_STREQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_streq_ ## id) #define H_CHECK_STREQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_streq_ ## id) #define H_CHECK_STREQ(id, v1, v2) \ H_DEF(check_streq_ ## id, ATF_CHECK_STREQ(v1, v2)) #define H_CHECK_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_match_ ## id) #define H_CHECK_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_match_ ## id) #define H_CHECK_MATCH(id, v1, v2) \ H_DEF(check_match_ ## id, ATF_CHECK_MATCH(v1, v2)) #define H_CHECK_EQ_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_check_eq_msg_ ## id) #define H_CHECK_EQ_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_check_eq_msg_ ## id) #define H_CHECK_EQ_MSG(id, v1, v2, msg) \ H_DEF(check_eq_msg_ ## id, ATF_CHECK_EQ_MSG(v1, v2, msg)) #define H_CHECK_STREQ_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_check_streq_msg_ ## id) #define H_CHECK_STREQ_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_check_streq_msg_ ## id) #define H_CHECK_STREQ_MSG(id, v1, v2, msg) \ H_DEF(check_streq_msg_ ## id, ATF_CHECK_STREQ_MSG(v1, v2, msg)) #define H_CHECK_MATCH_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_check_match_msg_ ## id) #define H_CHECK_MATCH_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_check_match_msg_ ## id) #define H_CHECK_MATCH_MSG(id, v1, v2, msg) \ H_DEF(check_match_msg_ ## id, ATF_CHECK_MATCH_MSG(v1, v2, msg)) #define H_CHECK_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_errno_ ## id) #define H_CHECK_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_errno_ ## id) #define H_CHECK_ERRNO(id, exp_errno, bool_expr) \ H_DEF(check_errno_ ## id, ATF_CHECK_ERRNO(exp_errno, bool_expr)) #define H_REQUIRE_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_ ## id) #define H_REQUIRE_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_ ## id) #define H_REQUIRE(id, condition) \ H_DEF(require_ ## id, ATF_REQUIRE(condition)) #define H_REQUIRE_MSG_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_msg_ ## id) #define H_REQUIRE_MSG_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_msg_ ## id) #define H_REQUIRE_MSG(id, condition, msg) \ H_DEF(require_msg_ ## id, ATF_REQUIRE_MSG(condition, msg)) #define H_REQUIRE_EQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_eq_ ## id) #define H_REQUIRE_EQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_eq_ ## id) #define H_REQUIRE_EQ(id, v1, v2) \ H_DEF(require_eq_ ## id, ATF_REQUIRE_EQ(v1, v2)) #define H_REQUIRE_STREQ_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_streq_ ## id) #define H_REQUIRE_STREQ_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_streq_ ## id) #define H_REQUIRE_STREQ(id, v1, v2) \ H_DEF(require_streq_ ## id, ATF_REQUIRE_STREQ(v1, v2)) #define H_REQUIRE_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_match_ ## id) #define H_REQUIRE_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_match_ ## id) #define H_REQUIRE_MATCH(id, v1, v2) \ H_DEF(require_match_ ## id, ATF_REQUIRE_MATCH(v1, v2)) #define H_REQUIRE_EQ_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_require_eq_msg_ ## id) #define H_REQUIRE_EQ_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_require_eq_msg_ ## id) #define H_REQUIRE_EQ_MSG(id, v1, v2, msg) \ H_DEF(require_eq_msg_ ## id, ATF_REQUIRE_EQ_MSG(v1, v2, msg)) #define H_REQUIRE_STREQ_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_require_streq_msg_ ## id) #define H_REQUIRE_STREQ_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_require_streq_msg_ ## id) #define H_REQUIRE_STREQ_MSG(id, v1, v2, msg) \ H_DEF(require_streq_msg_ ## id, ATF_REQUIRE_STREQ_MSG(v1, v2, msg)) #define H_REQUIRE_MATCH_MSG_HEAD_NAME(id) \ ATF_TC_HEAD_NAME(h_require_match_msg_ ## id) #define H_REQUIRE_MATCH_MSG_BODY_NAME(id) \ ATF_TC_BODY_NAME(h_require_match_msg_ ## id) #define H_REQUIRE_MATCH_MSG(id, v1, v2, msg) \ H_DEF(require_match_msg_ ## id, ATF_REQUIRE_MATCH_MSG(v1, v2, msg)) #define H_REQUIRE_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_errno_ ## id) #define H_REQUIRE_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_errno_ ## id) #define H_REQUIRE_ERRNO(id, exp_errno, bool_expr) \ H_DEF(require_errno_ ## id, ATF_REQUIRE_ERRNO(exp_errno, bool_expr)) /* --------------------------------------------------------------------- * Test cases for the ATF_{CHECK,REQUIRE}_ERRNO macros. * --------------------------------------------------------------------- */ static int errno_fail_stub(const int raised_errno) { errno = raised_errno; return -1; } static int errno_ok_stub(void) { return 0; } H_CHECK_ERRNO(no_error, -1, errno_ok_stub() == -1); H_CHECK_ERRNO(errno_ok, 2, errno_fail_stub(2) == -1); H_CHECK_ERRNO(errno_fail, 3, errno_fail_stub(4) == -1); H_REQUIRE_ERRNO(no_error, -1, errno_ok_stub() == -1); H_REQUIRE_ERRNO(errno_ok, 2, errno_fail_stub(2) == -1); H_REQUIRE_ERRNO(errno_fail, 3, errno_fail_stub(4) == -1); ATF_TC(check_errno); ATF_TC_HEAD(check_errno, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_ERRNO macro"); } ATF_TC_BODY(check_errno, tc) { struct test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); bool ok; const char *exp_regex; } *t, tests[] = { { H_CHECK_ERRNO_HEAD_NAME(no_error), H_CHECK_ERRNO_BODY_NAME(no_error), false, "Expected true value in errno_ok_stub\\(\\) == -1" }, { H_CHECK_ERRNO_HEAD_NAME(errno_ok), H_CHECK_ERRNO_BODY_NAME(errno_ok), true, NULL }, { H_CHECK_ERRNO_HEAD_NAME(errno_fail), H_CHECK_ERRNO_BODY_NAME(errno_fail), false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" }, { NULL, NULL, false, NULL } }; for (t = &tests[0]; t->head != NULL; t++) { init_and_run_h_tc("h_check_errno", t->head, t->body); ATF_REQUIRE(exists("before")); ATF_REQUIRE(exists("after")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); } else { ATF_REQUIRE(atf_utils_grep_file("^failed", "result")); ATF_REQUIRE(atf_utils_grep_file( "macros_test.c:[0-9]+: %s$", "error", t->exp_regex)); } ATF_REQUIRE(unlink("before") != -1); ATF_REQUIRE(unlink("after") != -1); } } ATF_TC(require_errno); ATF_TC_HEAD(require_errno, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_ERRNO macro"); } ATF_TC_BODY(require_errno, tc) { struct test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); bool ok; const char *exp_regex; } *t, tests[] = { { H_REQUIRE_ERRNO_HEAD_NAME(no_error), H_REQUIRE_ERRNO_BODY_NAME(no_error), false, "Expected true value in errno_ok_stub\\(\\) == -1" }, { H_REQUIRE_ERRNO_HEAD_NAME(errno_ok), H_REQUIRE_ERRNO_BODY_NAME(errno_ok), true, NULL }, { H_REQUIRE_ERRNO_HEAD_NAME(errno_fail), H_REQUIRE_ERRNO_BODY_NAME(errno_fail), false, "Expected errno 3, got 4, in errno_fail_stub\\(4\\) == -1" }, { NULL, NULL, false, NULL } }; for (t = &tests[0]; t->head != NULL; t++) { init_and_run_h_tc("h_require_errno", t->head, t->body); ATF_REQUIRE(exists("before")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); ATF_REQUIRE(exists("after")); } else { ATF_REQUIRE(atf_utils_grep_file( "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->exp_regex)); ATF_REQUIRE(!exists("after")); } ATF_REQUIRE(unlink("before") != -1); if (t->ok) ATF_REQUIRE(unlink("after") != -1); } } /* --------------------------------------------------------------------- * Test cases for the ATF_CHECK and ATF_CHECK_MSG macros. * --------------------------------------------------------------------- */ H_CHECK(0, 0); H_CHECK(1, 1); H_CHECK_MSG(0, 0, "expected a false value"); H_CHECK_MSG(1, 1, "expected a true value"); ATF_TC(check); ATF_TC_HEAD(check, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK and " "ATF_CHECK_MSG macros"); } ATF_TC_BODY(check, tc) { struct test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); bool value; const char *msg; bool ok; } *t, tests[] = { { H_CHECK_HEAD_NAME(0), H_CHECK_BODY_NAME(0), 0, "0 not met", false }, { H_CHECK_HEAD_NAME(1), H_CHECK_BODY_NAME(1), 1, "1 not met", true }, { H_CHECK_MSG_HEAD_NAME(0), H_CHECK_MSG_BODY_NAME(0), 0, "expected a false value", false }, { H_CHECK_MSG_HEAD_NAME(1), H_CHECK_MSG_BODY_NAME(1), 1, "expected a true value", true }, { NULL, NULL, false, NULL, false } }; for (t = &tests[0]; t->head != NULL; t++) { printf("Checking with a %d value\n", t->value); init_and_run_h_tc("h_check", t->head, t->body); ATF_REQUIRE(exists("before")); ATF_REQUIRE(exists("after")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); } else { ATF_REQUIRE(atf_utils_grep_file("^failed", "result")); ATF_REQUIRE(atf_utils_grep_file("Check failed: .*" "macros_test.c:[0-9]+: %s$", "error", t->msg)); } ATF_REQUIRE(unlink("before") != -1); ATF_REQUIRE(unlink("after") != -1); } } /* --------------------------------------------------------------------- * Test cases for the ATF_CHECK_*EQ_ macros. * --------------------------------------------------------------------- */ struct check_eq_test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); const char *v1; const char *v2; const char *msg; bool ok; }; static void do_check_eq_tests(const struct check_eq_test *tests) { const struct check_eq_test *t; for (t = &tests[0]; t->head != NULL; t++) { printf("Checking with %s, %s and expecting %s\n", t->v1, t->v2, t->ok ? "true" : "false"); init_and_run_h_tc("h_check", t->head, t->body); ATF_CHECK(exists("before")); ATF_CHECK(exists("after")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); } else { ATF_REQUIRE(atf_utils_grep_file("^failed", "result")); ATF_CHECK(atf_utils_grep_file("Check failed: .*" "macros_test.c:[0-9]+: %s$", "error", t->msg)); } ATF_CHECK(unlink("before") != -1); ATF_CHECK(unlink("after") != -1); } } H_CHECK_EQ(1_1, 1, 1); H_CHECK_EQ(1_2, 1, 2); H_CHECK_EQ(2_1, 2, 1); H_CHECK_EQ(2_2, 2, 2); H_CHECK_EQ_MSG(1_1, 1, 1, "1 does not match 1"); H_CHECK_EQ_MSG(1_2, 1, 2, "1 does not match 2"); H_CHECK_EQ_MSG(2_1, 2, 1, "2 does not match 1"); H_CHECK_EQ_MSG(2_2, 2, 2, "2 does not match 2"); ATF_TC(check_eq); ATF_TC_HEAD(check_eq, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_EQ and " "ATF_CHECK_EQ_MSG macros"); } ATF_TC_BODY(check_eq, tc) { struct check_eq_test tests[] = { { H_CHECK_EQ_HEAD_NAME(1_1), H_CHECK_EQ_BODY_NAME(1_1), "1", "1", "1 != 1", true }, { H_CHECK_EQ_HEAD_NAME(1_2), H_CHECK_EQ_BODY_NAME(1_2), "1", "2", "1 != 2", false }, { H_CHECK_EQ_HEAD_NAME(2_1), H_CHECK_EQ_BODY_NAME(2_1), "2", "1", "2 != 1", false }, { H_CHECK_EQ_HEAD_NAME(2_2), H_CHECK_EQ_BODY_NAME(2_2), "2", "2", "2 != 2", true }, { H_CHECK_EQ_MSG_HEAD_NAME(1_1), H_CHECK_EQ_MSG_BODY_NAME(1_1), "1", "1", "1 != 1: 1 does not match 1", true }, { H_CHECK_EQ_MSG_HEAD_NAME(1_2), H_CHECK_EQ_MSG_BODY_NAME(1_2), "1", "2", "1 != 2: 1 does not match 2", false }, { H_CHECK_EQ_MSG_HEAD_NAME(2_1), H_CHECK_EQ_MSG_BODY_NAME(2_1), "2", "1", "2 != 1: 2 does not match 1", false }, { H_CHECK_EQ_MSG_HEAD_NAME(2_2), H_CHECK_EQ_MSG_BODY_NAME(2_2), "2", "2", "2 != 2: 2 does not match 2", true }, { NULL, NULL, 0, 0, "", false } }; do_check_eq_tests(tests); } H_CHECK_STREQ(1_1, "1", "1"); H_CHECK_STREQ(1_2, "1", "2"); H_CHECK_STREQ(2_1, "2", "1"); H_CHECK_STREQ(2_2, "2", "2"); H_CHECK_STREQ_MSG(1_1, "1", "1", "1 does not match 1"); H_CHECK_STREQ_MSG(1_2, "1", "2", "1 does not match 2"); H_CHECK_STREQ_MSG(2_1, "2", "1", "2 does not match 1"); H_CHECK_STREQ_MSG(2_2, "2", "2", "2 does not match 2"); #define CHECK_STREQ_VAR1 "5" #define CHECK_STREQ_VAR2 "9" const char *check_streq_var1 = CHECK_STREQ_VAR1; const char *check_streq_var2 = CHECK_STREQ_VAR2; H_CHECK_STREQ(vars, check_streq_var1, check_streq_var2); ATF_TC(check_streq); ATF_TC_HEAD(check_streq, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_STREQ and " "ATF_CHECK_STREQ_MSG macros"); } ATF_TC_BODY(check_streq, tc) { struct check_eq_test tests[] = { { H_CHECK_STREQ_HEAD_NAME(1_1), H_CHECK_STREQ_BODY_NAME(1_1), "1", "1", "\"1\" != \"1\" \\(1 != 1\\)", true }, { H_CHECK_STREQ_HEAD_NAME(1_2), H_CHECK_STREQ_BODY_NAME(1_2), "1", "2", "\"1\" != \"2\" \\(1 != 2\\)", false }, { H_CHECK_STREQ_HEAD_NAME(2_1), H_CHECK_STREQ_BODY_NAME(2_1), "2", "1", "\"2\" != \"1\" \\(2 != 1\\)", false }, { H_CHECK_STREQ_HEAD_NAME(2_2), H_CHECK_STREQ_BODY_NAME(2_2), "2", "2", "\"2\" != \"2\" \\(2 != 2\\)", true }, { H_CHECK_STREQ_MSG_HEAD_NAME(1_1), H_CHECK_STREQ_MSG_BODY_NAME(1_1), "1", "1", "\"1\" != \"1\" \\(1 != 1\\): 1 does not match 1", true }, { H_CHECK_STREQ_MSG_HEAD_NAME(1_2), H_CHECK_STREQ_MSG_BODY_NAME(1_2), "1", "2", "\"1\" != \"2\" \\(1 != 2\\): 1 does not match 2", false }, { H_CHECK_STREQ_MSG_HEAD_NAME(2_1), H_CHECK_STREQ_MSG_BODY_NAME(2_1), "2", "1", "\"2\" != \"1\" \\(2 != 1\\): 2 does not match 1", false }, { H_CHECK_STREQ_MSG_HEAD_NAME(2_2), H_CHECK_STREQ_MSG_BODY_NAME(2_2), "2", "2", "\"2\" != \"2\" \\(2 != 2\\): 2 does not match 2", true }, { H_CHECK_STREQ_HEAD_NAME(vars), H_CHECK_STREQ_BODY_NAME(vars), check_streq_var1, check_streq_var2, "check_streq_var1 != check_streq_var2 \\(" CHECK_STREQ_VAR1 " != " CHECK_STREQ_VAR2 "\\)", false }, { NULL, NULL, 0, 0, "", false } }; do_check_eq_tests(tests); } /* --------------------------------------------------------------------- * Test cases for the ATF_CHECK_MATCH and ATF_CHECK_MATCH_MSG macros. * --------------------------------------------------------------------- */ H_CHECK_MATCH(yes, "hello [a-z]+", "abc hello world"); H_CHECK_MATCH(no, "hello [a-z]+", "abc hello WORLD"); H_CHECK_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase"); H_CHECK_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase"); ATF_TC(check_match); ATF_TC_HEAD(check_match, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_MATCH and " "ATF_CHECK_MATCH_MSG macros"); } ATF_TC_BODY(check_match, tc) { struct check_eq_test tests[] = { { H_CHECK_MATCH_HEAD_NAME(yes), H_CHECK_MATCH_BODY_NAME(yes), "hello [a-z]+", "abc hello world", "", true }, { H_CHECK_MATCH_HEAD_NAME(no), H_CHECK_MATCH_BODY_NAME(no), "hello [a-z]+", "abc hello WORLD", "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false }, { H_CHECK_MATCH_MSG_HEAD_NAME(yes), H_CHECK_MATCH_MSG_BODY_NAME(yes), "hello [a-z]+", "abc hello world", "", true }, { H_CHECK_MATCH_MSG_HEAD_NAME(no), H_CHECK_MATCH_MSG_BODY_NAME(no), "hello [a-z]+", "abc hello WORLD", "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase", false }, { NULL, NULL, 0, 0, "", false } }; do_check_eq_tests(tests); } /* --------------------------------------------------------------------- * Test cases for the ATF_REQUIRE and ATF_REQUIRE_MSG macros. * --------------------------------------------------------------------- */ H_REQUIRE(0, 0); H_REQUIRE(1, 1); H_REQUIRE_MSG(0, 0, "expected a false value"); H_REQUIRE_MSG(1, 1, "expected a true value"); ATF_TC(require); ATF_TC_HEAD(require, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE and " "ATF_REQUIRE_MSG macros"); } ATF_TC_BODY(require, tc) { struct test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); bool value; const char *msg; bool ok; } *t, tests[] = { { H_REQUIRE_HEAD_NAME(0), H_REQUIRE_BODY_NAME(0), 0, "0 not met", false }, { H_REQUIRE_HEAD_NAME(1), H_REQUIRE_BODY_NAME(1), 1, "1 not met", true }, { H_REQUIRE_MSG_HEAD_NAME(0), H_REQUIRE_MSG_BODY_NAME(0), 0, "expected a false value", false }, { H_REQUIRE_MSG_HEAD_NAME(1), H_REQUIRE_MSG_BODY_NAME(1), 1, "expected a true value", true }, { NULL, NULL, false, NULL, false } }; for (t = &tests[0]; t->head != NULL; t++) { printf("Checking with a %d value\n", t->value); init_and_run_h_tc("h_require", t->head, t->body); ATF_REQUIRE(exists("before")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); ATF_REQUIRE(exists("after")); } else { ATF_REQUIRE(atf_utils_grep_file( "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg)); ATF_REQUIRE(!exists("after")); } ATF_REQUIRE(unlink("before") != -1); if (t->ok) ATF_REQUIRE(unlink("after") != -1); } } /* --------------------------------------------------------------------- * Test cases for the ATF_REQUIRE_*EQ_ macros. * --------------------------------------------------------------------- */ struct require_eq_test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); const char *v1; const char *v2; const char *msg; bool ok; }; static void do_require_eq_tests(const struct require_eq_test *tests) { const struct require_eq_test *t; for (t = &tests[0]; t->head != NULL; t++) { printf("Checking with %s, %s and expecting %s\n", t->v1, t->v2, t->ok ? "true" : "false"); init_and_run_h_tc("h_require", t->head, t->body); ATF_REQUIRE(exists("before")); if (t->ok) { ATF_REQUIRE(atf_utils_grep_file("^passed", "result")); ATF_REQUIRE(exists("after")); } else { ATF_REQUIRE(atf_utils_grep_file("^failed: .*macros_test.c" ":[0-9]+: %s$", "result", t->msg)); ATF_REQUIRE(!exists("after")); } ATF_REQUIRE(unlink("before") != -1); if (t->ok) ATF_REQUIRE(unlink("after") != -1); } } H_REQUIRE_EQ(1_1, 1, 1); H_REQUIRE_EQ(1_2, 1, 2); H_REQUIRE_EQ(2_1, 2, 1); H_REQUIRE_EQ(2_2, 2, 2); H_REQUIRE_EQ_MSG(1_1, 1, 1, "1 does not match 1"); H_REQUIRE_EQ_MSG(1_2, 1, 2, "1 does not match 2"); H_REQUIRE_EQ_MSG(2_1, 2, 1, "2 does not match 1"); H_REQUIRE_EQ_MSG(2_2, 2, 2, "2 does not match 2"); ATF_TC(require_eq); ATF_TC_HEAD(require_eq, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_EQ and " "ATF_REQUIRE_EQ_MSG macros"); } ATF_TC_BODY(require_eq, tc) { struct require_eq_test tests[] = { { H_REQUIRE_EQ_HEAD_NAME(1_1), H_REQUIRE_EQ_BODY_NAME(1_1), "1", "1", "1 != 1", true }, { H_REQUIRE_EQ_HEAD_NAME(1_2), H_REQUIRE_EQ_BODY_NAME(1_2), "1", "2", "1 != 2", false }, { H_REQUIRE_EQ_HEAD_NAME(2_1), H_REQUIRE_EQ_BODY_NAME(2_1), "2", "1", "2 != 1", false }, { H_REQUIRE_EQ_HEAD_NAME(2_2), H_REQUIRE_EQ_BODY_NAME(2_2), "2", "2", "2 != 2", true }, { H_REQUIRE_EQ_MSG_HEAD_NAME(1_1), H_REQUIRE_EQ_MSG_BODY_NAME(1_1), "1", "1", "1 != 1: 1 does not match 1", true }, { H_REQUIRE_EQ_MSG_HEAD_NAME(1_2), H_REQUIRE_EQ_MSG_BODY_NAME(1_2), "1", "2", "1 != 2: 1 does not match 2", false }, { H_REQUIRE_EQ_MSG_HEAD_NAME(2_1), H_REQUIRE_EQ_MSG_BODY_NAME(2_1), "2", "1", "2 != 1: 2 does not match 1", false }, { H_REQUIRE_EQ_MSG_HEAD_NAME(2_2), H_REQUIRE_EQ_MSG_BODY_NAME(2_2), "2", "2", "2 != 2: 2 does not match 2", true }, { NULL, NULL, 0, 0, "", false } }; do_require_eq_tests(tests); } H_REQUIRE_STREQ(1_1, "1", "1"); H_REQUIRE_STREQ(1_2, "1", "2"); H_REQUIRE_STREQ(2_1, "2", "1"); H_REQUIRE_STREQ(2_2, "2", "2"); H_REQUIRE_STREQ_MSG(1_1, "1", "1", "1 does not match 1"); H_REQUIRE_STREQ_MSG(1_2, "1", "2", "1 does not match 2"); H_REQUIRE_STREQ_MSG(2_1, "2", "1", "2 does not match 1"); H_REQUIRE_STREQ_MSG(2_2, "2", "2", "2 does not match 2"); #define REQUIRE_STREQ_VAR1 "5" #define REQUIRE_STREQ_VAR2 "9" const char *require_streq_var1 = REQUIRE_STREQ_VAR1; const char *require_streq_var2 = REQUIRE_STREQ_VAR2; H_REQUIRE_STREQ(vars, require_streq_var1, require_streq_var2); ATF_TC(require_streq); ATF_TC_HEAD(require_streq, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_STREQ and " "ATF_REQUIRE_STREQ_MSG macros"); } ATF_TC_BODY(require_streq, tc) { struct require_eq_test tests[] = { { H_REQUIRE_STREQ_HEAD_NAME(1_1), H_REQUIRE_STREQ_BODY_NAME(1_1), "1", "1", "\"1\" != \"1\" \\(1 != 1\\)", true }, { H_REQUIRE_STREQ_HEAD_NAME(1_2), H_REQUIRE_STREQ_BODY_NAME(1_2), "1", "2", "\"1\" != \"2\" \\(1 != 2\\)", false }, { H_REQUIRE_STREQ_HEAD_NAME(2_1), H_REQUIRE_STREQ_BODY_NAME(2_1), "2", "1", "\"2\" != \"1\" \\(2 != 1\\)", false }, { H_REQUIRE_STREQ_HEAD_NAME(2_2), H_REQUIRE_STREQ_BODY_NAME(2_2), "2", "2", "\"2\" != \"2\" \\(2 != 2\\)", true }, { H_REQUIRE_STREQ_MSG_HEAD_NAME(1_1), H_REQUIRE_STREQ_MSG_BODY_NAME(1_1), "1", "1", "\"1\" != \"1\" \\(1 != 1\\): 1 does not match 1", true }, { H_REQUIRE_STREQ_MSG_HEAD_NAME(1_2), H_REQUIRE_STREQ_MSG_BODY_NAME(1_2), "1", "2", "\"1\" != \"2\" \\(1 != 2\\): 1 does not match 2", false }, { H_REQUIRE_STREQ_MSG_HEAD_NAME(2_1), H_REQUIRE_STREQ_MSG_BODY_NAME(2_1), "2", "1", "\"2\" != \"1\" \\(2 != 1\\): 2 does not match 1", false }, { H_REQUIRE_STREQ_MSG_HEAD_NAME(2_2), H_REQUIRE_STREQ_MSG_BODY_NAME(2_2), "2", "2", "\"2\" != \"2\" \\(2 != 2\\): 2 does not match 2", true }, { H_REQUIRE_STREQ_HEAD_NAME(vars), H_REQUIRE_STREQ_BODY_NAME(vars), require_streq_var1, require_streq_var2, "require_streq_var1 != require_streq_var2 \\(" REQUIRE_STREQ_VAR1 " != " REQUIRE_STREQ_VAR2 "\\)", false }, { NULL, NULL, 0, 0, "", false } }; do_require_eq_tests(tests); } /* --------------------------------------------------------------------- * Test cases for the ATF_REQUIRE_MATCH and ATF_REQUIRE_MATCH_MSG macros. * --------------------------------------------------------------------- */ H_REQUIRE_MATCH(yes, "hello [a-z]+", "abc hello world"); H_REQUIRE_MATCH(no, "hello [a-z]+", "abc hello WORLD"); H_REQUIRE_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase"); H_REQUIRE_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase"); ATF_TC(require_match); ATF_TC_HEAD(require_match, tc) { atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_MATCH and " "ATF_REQUIRE_MATCH_MSG macros"); } ATF_TC_BODY(require_match, tc) { struct require_eq_test tests[] = { { H_REQUIRE_MATCH_HEAD_NAME(yes), H_REQUIRE_MATCH_BODY_NAME(yes), "hello [a-z]+", "abc hello world", "", true }, { H_REQUIRE_MATCH_HEAD_NAME(no), H_REQUIRE_MATCH_BODY_NAME(no), "hello [a-z]+", "abc hello WORLD", "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false }, { H_REQUIRE_MATCH_MSG_HEAD_NAME(yes), H_REQUIRE_MATCH_MSG_BODY_NAME(yes), "hello [a-z]+", "abc hello world", "", true }, { H_REQUIRE_MATCH_MSG_HEAD_NAME(no), H_REQUIRE_MATCH_MSG_BODY_NAME(no), "hello [a-z]+", "abc hello WORLD", "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase", false }, { NULL, NULL, 0, 0, "", false } }; do_require_eq_tests(tests); } /* --------------------------------------------------------------------- * Miscellaneous test cases covering several macros. * --------------------------------------------------------------------- */ static bool aux_bool(const char *fmt ATF_DEFS_ATTRIBUTE_UNUSED) { return false; } static const char * aux_str(const char *fmt ATF_DEFS_ATTRIBUTE_UNUSED) { return "foo"; } H_CHECK(msg, aux_bool("%d")); H_REQUIRE(msg, aux_bool("%d")); H_CHECK_STREQ(msg, aux_str("%d"), ""); H_REQUIRE_STREQ(msg, aux_str("%d"), ""); ATF_TC(msg_embedded_fmt); ATF_TC_HEAD(msg_embedded_fmt, tc) { atf_tc_set_md_var(tc, "descr", "Tests that format strings passed " "as part of the automatically-generated messages " "do not get expanded"); } ATF_TC_BODY(msg_embedded_fmt, tc) { struct test { void (*head)(atf_tc_t *); void (*body)(const atf_tc_t *); bool fatal; const char *msg; } *t, tests[] = { { H_CHECK_HEAD_NAME(msg), H_CHECK_BODY_NAME(msg), false, "aux_bool\\(\"%d\"\\) not met" }, { H_REQUIRE_HEAD_NAME(msg), H_REQUIRE_BODY_NAME(msg), true, "aux_bool\\(\"%d\"\\) not met" }, { H_CHECK_STREQ_HEAD_NAME(msg), H_CHECK_STREQ_BODY_NAME(msg), false, "aux_str\\(\"%d\"\\) != \"\" \\(foo != \\)" }, { H_REQUIRE_STREQ_HEAD_NAME(msg), H_REQUIRE_STREQ_BODY_NAME(msg), true, "aux_str\\(\"%d\"\\) != \"\" \\(foo != \\)" }, { NULL, NULL, false, NULL } }; for (t = &tests[0]; t->head != NULL; t++) { printf("Checking with an expected '%s' message\n", t->msg); init_and_run_h_tc("h_check", t->head, t->body); if (t->fatal) { bool matched = atf_utils_grep_file( "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg); ATF_CHECK_MSG(matched, "couldn't find error string in result"); } else { bool matched = atf_utils_grep_file("Check failed: .*" "macros_test.c:[0-9]+: %s$", "error", t->msg); ATF_CHECK_MSG(matched, "couldn't find error string in output"); } } } /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/macros.h"); BUILD_TC(use, "macros_h_test.c", "Tests that the macros provided by the atf-c/macros.h file " "do not cause syntax errors when used", "Build of macros_h_test.c failed; some macros in atf-c/macros.h " "are broken"); BUILD_TC_FAIL(detect_unused_tests, "unused_test.c", "Tests that defining an unused test case raises a warning (and thus " "an error)", "Build of unused_test.c passed; unused test cases are not properly " "detected"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, check); ATF_TP_ADD_TC(tp, check_eq); ATF_TP_ADD_TC(tp, check_streq); ATF_TP_ADD_TC(tp, check_errno); ATF_TP_ADD_TC(tp, check_match); ATF_TP_ADD_TC(tp, require); ATF_TP_ADD_TC(tp, require_eq); ATF_TP_ADD_TC(tp, require_streq); ATF_TP_ADD_TC(tp, require_errno); ATF_TP_ADD_TC(tp, require_match); ATF_TP_ADD_TC(tp, msg_embedded_fmt); /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); ATF_TP_ADD_TC(tp, use); ATF_TP_ADD_TC(tp, detect_unused_tests); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/0002755000470500017500000000000012276444014017616 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/process_helpers.c0000644000470500017500000000617712271526120023165 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include /* NO_CHECK_STYLE */ #include #include #include #include #include static int h_echo(const char *msg) { printf("%s\n", msg); return EXIT_SUCCESS; } static int h_exit_failure(void) { return EXIT_FAILURE; } static int h_exit_signal(void) { kill(getpid(), SIGKILL); assert(0); /* NO_CHECK_STYLE */ return EXIT_FAILURE; } static int h_exit_success(void) { return EXIT_SUCCESS; } static int h_stdout_stderr(const char *id) { fprintf(stdout, "Line 1 to stdout for %s\n", id); fprintf(stdout, "Line 2 to stdout for %s\n", id); fprintf(stderr, "Line 1 to stderr for %s\n", id); fprintf(stderr, "Line 2 to stderr for %s\n", id); return EXIT_SUCCESS; } static void check_args(const int argc, const char *const argv[], const int required) { if (argc < required) { fprintf(stderr, "Usage: %s helper-name [args]\n", argv[0]); exit(EXIT_FAILURE); } } int main(int argc, const char *const argv[]) { int exitcode; check_args(argc, argv, 2); if (strcmp(argv[1], "echo") == 0) { check_args(argc, argv, 3); exitcode = h_echo(argv[2]); } else if (strcmp(argv[1], "exit-failure") == 0) exitcode = h_exit_failure(); else if (strcmp(argv[1], "exit-signal") == 0) exitcode = h_exit_signal(); else if (strcmp(argv[1], "exit-success") == 0) exitcode = h_exit_success(); else if (strcmp(argv[1], "stdout-stderr") == 0) { check_args(argc, argv, 3); exitcode = h_stdout_stderr(argv[2]); } else { fprintf(stderr, "%s: Unknown helper %s\n", argv[0], argv[1]); exitcode = EXIT_FAILURE; } return exitcode; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/dynstr.c0000644000470500017500000002063312271526120021301 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "atf-c/error.h" #include "dynstr.h" #include "sanity.h" #include "text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static atf_error_t resize(atf_dynstr_t *ad, size_t newsize) { char *newdata; atf_error_t err; PRE(newsize > ad->m_datasize); newdata = (char *)malloc(newsize); if (newdata == NULL) { err = atf_no_memory_error(); } else { strcpy(newdata, ad->m_data); free(ad->m_data); ad->m_data = newdata; ad->m_datasize = newsize; err = atf_no_error(); } return err; } static atf_error_t prepend_or_append(atf_dynstr_t *ad, const char *fmt, va_list ap, bool prepend) { char *aux; atf_error_t err; size_t newlen; va_list ap2; va_copy(ap2, ap); err = atf_text_format_ap(&aux, fmt, ap2); va_end(ap2); if (atf_is_error(err)) goto out; newlen = ad->m_length + strlen(aux); if (newlen + sizeof(char) > ad->m_datasize) { err = resize(ad, newlen + sizeof(char)); if (atf_is_error(err)) goto out_free; } if (prepend) { memmove(ad->m_data + strlen(aux), ad->m_data, ad->m_length + 1); memcpy(ad->m_data, aux, strlen(aux)); } else strcpy(ad->m_data + ad->m_length, aux); ad->m_length = newlen; err = atf_no_error(); out_free: free(aux); out: return err; } /* --------------------------------------------------------------------- * The "atf_dynstr" type. * --------------------------------------------------------------------- */ /* * Constants. */ const size_t atf_dynstr_npos = SIZE_MAX; /* * Constructors and destructors. */ atf_error_t atf_dynstr_init(atf_dynstr_t *ad) { atf_error_t err; ad->m_data = (char *)malloc(sizeof(char)); if (ad->m_data == NULL) { err = atf_no_memory_error(); goto out; } ad->m_data[0] = '\0'; ad->m_datasize = 1; ad->m_length = 0; err = atf_no_error(); out: return err; } atf_error_t atf_dynstr_init_ap(atf_dynstr_t *ad, const char *fmt, va_list ap) { atf_error_t err; ad->m_datasize = strlen(fmt) + 1; ad->m_length = 0; do { va_list ap2; int ret; ad->m_datasize *= 2; ad->m_data = (char *)malloc(ad->m_datasize); if (ad->m_data == NULL) { err = atf_no_memory_error(); goto out; } va_copy(ap2, ap); ret = vsnprintf(ad->m_data, ad->m_datasize, fmt, ap2); va_end(ap2); if (ret < 0) { free(ad->m_data); err = atf_libc_error(errno, "Cannot format string"); goto out; } INV(ret >= 0); if ((size_t)ret >= ad->m_datasize) { free(ad->m_data); ad->m_data = NULL; } ad->m_length = ret; } while (ad->m_length >= ad->m_datasize); err = atf_no_error(); out: POST(atf_is_error(err) || ad->m_data != NULL); return err; } atf_error_t atf_dynstr_init_fmt(atf_dynstr_t *ad, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_dynstr_init_ap(ad, fmt, ap); va_end(ap); return err; } atf_error_t atf_dynstr_init_raw(atf_dynstr_t *ad, const void *mem, size_t memlen) { atf_error_t err; if (memlen >= SIZE_MAX - 1) { err = atf_no_memory_error(); goto out; } ad->m_data = (char *)malloc(memlen + 1); if (ad->m_data == NULL) { err = atf_no_memory_error(); goto out; } ad->m_datasize = memlen + 1; memcpy(ad->m_data, mem, memlen); ad->m_data[memlen] = '\0'; ad->m_length = strlen(ad->m_data); INV(ad->m_length <= memlen); err = atf_no_error(); out: return err; } atf_error_t atf_dynstr_init_rep(atf_dynstr_t *ad, size_t len, char ch) { atf_error_t err; if (len == SIZE_MAX) { err = atf_no_memory_error(); goto out; } ad->m_datasize = (len + 1) * sizeof(char); ad->m_data = (char *)malloc(ad->m_datasize); if (ad->m_data == NULL) { err = atf_no_memory_error(); goto out; } memset(ad->m_data, ch, len); ad->m_data[len] = '\0'; ad->m_length = len; err = atf_no_error(); out: return err; } atf_error_t atf_dynstr_init_substr(atf_dynstr_t *ad, const atf_dynstr_t *src, size_t beg, size_t end) { if (beg > src->m_length) beg = src->m_length; if (end == atf_dynstr_npos || end > src->m_length) end = src->m_length; return atf_dynstr_init_raw(ad, src->m_data + beg, end - beg); } atf_error_t atf_dynstr_copy(atf_dynstr_t *dest, const atf_dynstr_t *src) { atf_error_t err; dest->m_data = (char *)malloc(src->m_datasize); if (dest->m_data == NULL) err = atf_no_memory_error(); else { memcpy(dest->m_data, src->m_data, src->m_datasize); dest->m_datasize = src->m_datasize; dest->m_length = src->m_length; err = atf_no_error(); } return err; } void atf_dynstr_fini(atf_dynstr_t *ad) { INV(ad->m_data != NULL); free(ad->m_data); } char * atf_dynstr_fini_disown(atf_dynstr_t *ad) { INV(ad->m_data != NULL); return ad->m_data; } /* * Getters. */ const char * atf_dynstr_cstring(const atf_dynstr_t *ad) { return ad->m_data; } size_t atf_dynstr_length(const atf_dynstr_t *ad) { return ad->m_length; } size_t atf_dynstr_rfind_ch(const atf_dynstr_t *ad, char ch) { size_t pos; for (pos = ad->m_length; pos > 0 && ad->m_data[pos - 1] != ch; pos--) ; return pos == 0 ? atf_dynstr_npos : pos - 1; } /* * Modifiers. */ atf_error_t atf_dynstr_append_ap(atf_dynstr_t *ad, const char *fmt, va_list ap) { atf_error_t err; va_list ap2; va_copy(ap2, ap); err = prepend_or_append(ad, fmt, ap2, false); va_end(ap2); return err; } atf_error_t atf_dynstr_append_fmt(atf_dynstr_t *ad, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = prepend_or_append(ad, fmt, ap, false); va_end(ap); return err; } void atf_dynstr_clear(atf_dynstr_t *ad) { ad->m_data[0] = '\0'; ad->m_length = 0; } atf_error_t atf_dynstr_prepend_ap(atf_dynstr_t *ad, const char *fmt, va_list ap) { atf_error_t err; va_list ap2; va_copy(ap2, ap); err = prepend_or_append(ad, fmt, ap2, true); va_end(ap2); return err; } atf_error_t atf_dynstr_prepend_fmt(atf_dynstr_t *ad, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = prepend_or_append(ad, fmt, ap, true); va_end(ap); return err; } /* * Operators. */ bool atf_equal_dynstr_cstring(const atf_dynstr_t *ad, const char *str) { return strcmp(ad->m_data, str) == 0; } bool atf_equal_dynstr_dynstr(const atf_dynstr_t *s1, const atf_dynstr_t *s2) { return strcmp(s1->m_data, s2->m_data) == 0; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/fs.h0000644000470500017500000001222312271526120020367 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_FS_H) #define ATF_C_FS_H #include #include #include #include #include #include "dynstr.h" /* --------------------------------------------------------------------- * The "atf_fs_path" type. * --------------------------------------------------------------------- */ struct atf_fs_path { atf_dynstr_t m_data; }; typedef struct atf_fs_path atf_fs_path_t; /* Constructors/destructors. */ atf_error_t atf_fs_path_init_ap(atf_fs_path_t *, const char *, va_list); atf_error_t atf_fs_path_init_fmt(atf_fs_path_t *, const char *, ...); atf_error_t atf_fs_path_copy(atf_fs_path_t *, const atf_fs_path_t *); void atf_fs_path_fini(atf_fs_path_t *); /* Getters. */ atf_error_t atf_fs_path_branch_path(const atf_fs_path_t *, atf_fs_path_t *); const char *atf_fs_path_cstring(const atf_fs_path_t *); atf_error_t atf_fs_path_leaf_name(const atf_fs_path_t *, atf_dynstr_t *); bool atf_fs_path_is_absolute(const atf_fs_path_t *); bool atf_fs_path_is_root(const atf_fs_path_t *); /* Modifiers. */ atf_error_t atf_fs_path_append_ap(atf_fs_path_t *, const char *, va_list); atf_error_t atf_fs_path_append_fmt(atf_fs_path_t *, const char *, ...); atf_error_t atf_fs_path_append_path(atf_fs_path_t *, const atf_fs_path_t *); atf_error_t atf_fs_path_to_absolute(const atf_fs_path_t *, atf_fs_path_t *); /* Operators. */ bool atf_equal_fs_path_fs_path(const atf_fs_path_t *, const atf_fs_path_t *); /* --------------------------------------------------------------------- * The "atf_fs_stat" type. * --------------------------------------------------------------------- */ struct atf_fs_stat { int m_type; struct stat m_sb; }; typedef struct atf_fs_stat atf_fs_stat_t; /* Constants. */ extern const int atf_fs_stat_blk_type; extern const int atf_fs_stat_chr_type; extern const int atf_fs_stat_dir_type; extern const int atf_fs_stat_fifo_type; extern const int atf_fs_stat_lnk_type; extern const int atf_fs_stat_reg_type; extern const int atf_fs_stat_sock_type; extern const int atf_fs_stat_wht_type; /* Constructors/destructors. */ atf_error_t atf_fs_stat_init(atf_fs_stat_t *, const atf_fs_path_t *); void atf_fs_stat_copy(atf_fs_stat_t *, const atf_fs_stat_t *); void atf_fs_stat_fini(atf_fs_stat_t *); /* Getters. */ dev_t atf_fs_stat_get_device(const atf_fs_stat_t *); ino_t atf_fs_stat_get_inode(const atf_fs_stat_t *); mode_t atf_fs_stat_get_mode(const atf_fs_stat_t *); off_t atf_fs_stat_get_size(const atf_fs_stat_t *); int atf_fs_stat_get_type(const atf_fs_stat_t *); bool atf_fs_stat_is_owner_readable(const atf_fs_stat_t *); bool atf_fs_stat_is_owner_writable(const atf_fs_stat_t *); bool atf_fs_stat_is_owner_executable(const atf_fs_stat_t *); bool atf_fs_stat_is_group_readable(const atf_fs_stat_t *); bool atf_fs_stat_is_group_writable(const atf_fs_stat_t *); bool atf_fs_stat_is_group_executable(const atf_fs_stat_t *); bool atf_fs_stat_is_other_readable(const atf_fs_stat_t *); bool atf_fs_stat_is_other_writable(const atf_fs_stat_t *); bool atf_fs_stat_is_other_executable(const atf_fs_stat_t *); /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ extern const int atf_fs_access_f; extern const int atf_fs_access_r; extern const int atf_fs_access_w; extern const int atf_fs_access_x; atf_error_t atf_fs_eaccess(const atf_fs_path_t *, int); atf_error_t atf_fs_exists(const atf_fs_path_t *, bool *); atf_error_t atf_fs_getcwd(atf_fs_path_t *); atf_error_t atf_fs_mkdtemp(atf_fs_path_t *); atf_error_t atf_fs_mkstemp(atf_fs_path_t *, int *); atf_error_t atf_fs_rmdir(const atf_fs_path_t *); atf_error_t atf_fs_unlink(const atf_fs_path_t *); #endif /* !defined(ATF_C_FS_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/user_test.c0000644000470500017500000001050612271526120021771 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "test_helpers.h" #include "user.h" /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(euid); ATF_TC_HEAD(euid, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_user_euid function"); } ATF_TC_BODY(euid, tc) { ATF_REQUIRE_EQ(atf_user_euid(), geteuid()); } ATF_TC(is_member_of_group); ATF_TC_HEAD(is_member_of_group, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_member_of_group " "function"); } ATF_TC_BODY(is_member_of_group, tc) { gid_t gids[NGROUPS_MAX]; gid_t g, maxgid; int ngids; const gid_t maxgid_limit = 1 << 16; { int i; ngids = getgroups(NGROUPS_MAX, gids); if (ngids == -1) atf_tc_fail("Call to getgroups failed"); maxgid = 0; for (i = 0; i < ngids; i++) { printf("User group %d is %u\n", i, gids[i]); if (maxgid < gids[i]) maxgid = gids[i]; } printf("User belongs to %d groups\n", ngids); printf("Last GID is %u\n", maxgid); } if (maxgid > maxgid_limit) { printf("Test truncated from %u groups to %u to keep the run time " "reasonable enough\n", maxgid, maxgid_limit); maxgid = maxgid_limit; } for (g = 0; g < maxgid; g++) { bool found = false; int i; for (i = 0; !found && i < ngids; i++) { if (gids[i] == g) found = true; } if (found) { printf("Checking if user belongs to group %d\n", g); ATF_REQUIRE(atf_user_is_member_of_group(g)); } else { printf("Checking if user does not belong to group %d\n", g); ATF_REQUIRE(!atf_user_is_member_of_group(g)); } } } ATF_TC(is_root); ATF_TC_HEAD(is_root, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_root function"); } ATF_TC_BODY(is_root, tc) { if (geteuid() == 0) ATF_REQUIRE(atf_user_is_root()); else ATF_REQUIRE(!atf_user_is_root()); } ATF_TC(is_unprivileged); ATF_TC_HEAD(is_unprivileged, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_user_is_unprivileged " "function"); } ATF_TC_BODY(is_unprivileged, tc) { if (geteuid() != 0) ATF_REQUIRE(atf_user_is_unprivileged()); else ATF_REQUIRE(!atf_user_is_unprivileged()); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, euid); ATF_TP_ADD_TC(tp, is_member_of_group); ATF_TP_ADD_TC(tp, is_root); ATF_TP_ADD_TC(tp, is_unprivileged); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/sanity.h0000644000470500017500000000442212271526120021270 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_SANITY_H) #define ATF_C_SANITY_H void atf_sanity_inv(const char *, int, const char *); void atf_sanity_pre(const char *, int, const char *); void atf_sanity_post(const char *, int, const char *); #if !defined(NDEBUG) #define INV(x) \ do { \ if (!(x)) \ atf_sanity_inv(__FILE__, __LINE__, #x); \ } while (0) #define PRE(x) \ do { \ if (!(x)) \ atf_sanity_pre(__FILE__, __LINE__, #x); \ } while (0) #define POST(x) \ do { \ if (!(x)) \ atf_sanity_post(__FILE__, __LINE__, #x); \ } while (0) #else /* defined(NDEBUG) */ #define INV(x) \ do { \ (void)(x); \ } while (0) #define PRE(x) \ do { \ (void)(x); \ } while (0) #define POST(x) \ do { \ (void)(x); \ } while (0) #endif /* !defined(NDEBUG) */ #define UNREACHABLE INV(0) #endif /* ATF_C_SANITY_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/text.h0000644000470500017500000000403312271526120020743 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_TEXT_H) #define ATF_C_TEXT_H #include #include #include #include "list.h" atf_error_t atf_text_for_each_word(const char *, const char *, atf_error_t (*)(const char *, void *), void *); atf_error_t atf_text_format(char **, const char *, ...); atf_error_t atf_text_format_ap(char **, const char *, va_list); atf_error_t atf_text_split(const char *, const char *, atf_list_t *); atf_error_t atf_text_to_bool(const char *, bool *); atf_error_t atf_text_to_long(const char *, long *); #endif /* ATF_C_TEXT_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/map_test.c0000644000470500017500000002747112271526120021601 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "atf-c/utils.h" #include "map.h" #include "test_helpers.h" /* --------------------------------------------------------------------- * Tests for the "atf_map" type. * --------------------------------------------------------------------- */ /* * Constructors and destructors. */ ATF_TC(map_init); ATF_TC_HEAD(map_init, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_init function"); } ATF_TC_BODY(map_init, tc) { atf_map_t map; RE(atf_map_init(&map)); ATF_REQUIRE_EQ(atf_map_size(&map), 0); atf_map_fini(&map); } ATF_TC_WITHOUT_HEAD(map_init_charpp_null); ATF_TC_BODY(map_init_charpp_null, tc) { atf_map_t map; RE(atf_map_init_charpp(&map, NULL)); ATF_REQUIRE_EQ(atf_map_size(&map), 0); atf_map_fini(&map); } ATF_TC_WITHOUT_HEAD(map_init_charpp_empty); ATF_TC_BODY(map_init_charpp_empty, tc) { const char *const array[] = { NULL }; atf_map_t map; RE(atf_map_init_charpp(&map, array)); ATF_REQUIRE_EQ(atf_map_size(&map), 0); atf_map_fini(&map); } ATF_TC_WITHOUT_HEAD(map_init_charpp_some); ATF_TC_BODY(map_init_charpp_some, tc) { const char *const array[] = { "K1", "V1", "K2", "V2", NULL }; atf_map_t map; atf_map_citer_t iter; RE(atf_map_init_charpp(&map, array)); ATF_REQUIRE_EQ(atf_map_size(&map), 2); iter = atf_map_find_c(&map, "K1"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); iter = atf_map_find_c(&map, "K2"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); atf_map_fini(&map); } ATF_TC_WITHOUT_HEAD(map_init_charpp_short); ATF_TC_BODY(map_init_charpp_short, tc) { const char *const array[] = { "K1", "V1", "K2", NULL }; atf_map_t map; atf_error_t err = atf_map_init_charpp(&map, array); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); } /* * Getters. */ ATF_TC(find); ATF_TC_HEAD(find, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find function"); } ATF_TC_BODY(find, tc) { atf_map_t map; char val1[] = "V1"; char val2[] = "V2"; atf_map_iter_t iter; RE(atf_map_init(&map)); RE(atf_map_insert(&map, "K1", val1, false)); RE(atf_map_insert(&map, "K2", val2, false)); iter = atf_map_find(&map, "K0"); ATF_REQUIRE(atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); iter = atf_map_find(&map, "K1"); ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V1") == 0); strcpy(atf_map_iter_data(iter), "Z1"); iter = atf_map_find(&map, "K1"); ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "Z1") == 0); iter = atf_map_find(&map, "K2"); ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K2") == 0); ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V2") == 0); atf_map_fini(&map); } ATF_TC(find_c); ATF_TC_HEAD(find_c, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find_c function"); } ATF_TC_BODY(find_c, tc) { atf_map_t map; char val1[] = "V1"; char val2[] = "V2"; atf_map_citer_t iter; RE(atf_map_init(&map)); RE(atf_map_insert(&map, "K1", val1, false)); RE(atf_map_insert(&map, "K2", val2, false)); iter = atf_map_find_c(&map, "K0"); ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); iter = atf_map_find_c(&map, "K1"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); iter = atf_map_find_c(&map, "K2"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); atf_map_fini(&map); } ATF_TC_WITHOUT_HEAD(to_charpp_empty); ATF_TC_BODY(to_charpp_empty, tc) { atf_map_t map; char **array; RE(atf_map_init(&map)); ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); atf_map_fini(&map); ATF_CHECK_EQ(NULL, array[0]); atf_utils_free_charpp(array); } ATF_TC_WITHOUT_HEAD(to_charpp_some); ATF_TC_BODY(to_charpp_some, tc) { atf_map_t map; char **array; char s1[] = "one"; char s2[] = "two"; char s3[] = "three"; RE(atf_map_init(&map)); RE(atf_map_insert(&map, "K1", s1, false)); RE(atf_map_insert(&map, "K2", s2, false)); RE(atf_map_insert(&map, "K3", s3, false)); ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); atf_map_fini(&map); ATF_CHECK_STREQ("K1", array[0]); ATF_CHECK_STREQ("one", array[1]); ATF_CHECK_STREQ("K2", array[2]); ATF_CHECK_STREQ("two", array[3]); ATF_CHECK_STREQ("K3", array[4]); ATF_CHECK_STREQ("three", array[5]); ATF_CHECK_EQ(NULL, array[6]); atf_utils_free_charpp(array); } /* * Modifiers. */ ATF_TC(map_insert); ATF_TC_HEAD(map_insert, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_insert function"); } ATF_TC_BODY(map_insert, tc) { atf_map_t map; char buf[] = "1st test string"; char buf2[] = "2nd test string"; const char *ptr; atf_map_citer_t iter; RE(atf_map_init(&map)); printf("Inserting some values\n"); ATF_REQUIRE_EQ(atf_map_size(&map), 0); RE(atf_map_insert(&map, "K1", buf, false)); ATF_REQUIRE_EQ(atf_map_size(&map), 1); RE(atf_map_insert(&map, "K2", buf, false)); ATF_REQUIRE_EQ(atf_map_size(&map), 2); RE(atf_map_insert(&map, "K3", buf, false)); ATF_REQUIRE_EQ(atf_map_size(&map), 3); printf("Replacing a value\n"); iter = atf_map_find_c(&map, "K3"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ptr = atf_map_citer_data(iter); ATF_REQUIRE_EQ(ptr, buf); RE(atf_map_insert(&map, "K3", buf2, false)); ATF_REQUIRE_EQ(atf_map_size(&map), 3); iter = atf_map_find_c(&map, "K3"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); ptr = atf_map_citer_data(iter); ATF_REQUIRE_EQ(ptr, buf2); atf_map_fini(&map); } /* * Macros. */ ATF_TC(map_for_each); ATF_TC_HEAD(map_for_each, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each macro"); } ATF_TC_BODY(map_for_each, tc) { atf_map_t map; atf_map_iter_t iter; size_t count, i, size; char keys[10][5]; int nums[10]; printf("Iterating over empty map\n"); RE(atf_map_init(&map)); count = 0; atf_map_for_each(iter, &map) { count++; printf("Item count is now %zd\n", count); } ATF_REQUIRE_EQ(count, 0); atf_map_fini(&map); for (size = 0; size <= 10; size++) { printf("Iterating over map of %zd elements\n", size); RE(atf_map_init(&map)); for (i = 0; i < size; i++) { nums[i] = i + 1; snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); RE(atf_map_insert(&map, keys[i], &nums[i], false)); } count = 0; atf_map_for_each(iter, &map) { printf("Retrieved item: %d\n", *(int *)atf_map_iter_data(iter)); count++; } ATF_REQUIRE_EQ(count, size); atf_map_fini(&map); } } ATF_TC(map_for_each_c); ATF_TC_HEAD(map_for_each_c, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each_c macro"); } ATF_TC_BODY(map_for_each_c, tc) { atf_map_t map; atf_map_citer_t iter; size_t count, i, size; char keys[10][5]; int nums[10]; printf("Iterating over empty map\n"); RE(atf_map_init(&map)); count = 0; atf_map_for_each_c(iter, &map) { count++; printf("Item count is now %zd\n", count); } ATF_REQUIRE_EQ(count, 0); atf_map_fini(&map); for (size = 0; size <= 10; size++) { printf("Iterating over map of %zd elements\n", size); RE(atf_map_init(&map)); for (i = 0; i < size; i++) { nums[i] = i + 1; snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); RE(atf_map_insert(&map, keys[i], &nums[i], false)); } count = 0; atf_map_for_each_c(iter, &map) { printf("Retrieved item: %d\n", *(const int *)atf_map_citer_data(iter)); count++; } ATF_REQUIRE_EQ(count, size); atf_map_fini(&map); } } /* * Other. */ ATF_TC(stable_keys); ATF_TC_HEAD(stable_keys, tc) { atf_tc_set_md_var(tc, "descr", "Checks that the keys do not change " "even if their original values do"); } ATF_TC_BODY(stable_keys, tc) { atf_map_t map; atf_map_citer_t iter; char key[] = "K1"; RE(atf_map_init(&map)); RE(atf_map_insert(&map, key, strdup("test-value"), true)); iter = atf_map_find_c(&map, "K1"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); iter = atf_map_find_c(&map, "K2"); ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); strcpy(key, "K2"); iter = atf_map_find_c(&map, "K1"); ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); iter = atf_map_find_c(&map, "K2"); ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); atf_map_fini(&map); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Constructors and destructors. */ ATF_TP_ADD_TC(tp, map_init); ATF_TP_ADD_TC(tp, map_init_charpp_null); ATF_TP_ADD_TC(tp, map_init_charpp_empty); ATF_TP_ADD_TC(tp, map_init_charpp_some); ATF_TP_ADD_TC(tp, map_init_charpp_short); /* Getters. */ ATF_TP_ADD_TC(tp, find); ATF_TP_ADD_TC(tp, find_c); ATF_TP_ADD_TC(tp, to_charpp_empty); ATF_TP_ADD_TC(tp, to_charpp_some); /* Modifiers. */ ATF_TP_ADD_TC(tp, map_insert); /* Macros. */ ATF_TP_ADD_TC(tp, map_for_each); ATF_TP_ADD_TC(tp, map_for_each_c); /* Other. */ ATF_TP_ADD_TC(tp, stable_keys); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/map.c0000644000470500017500000002142312271526120020531 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "atf-c/error.h" #include "atf-c/utils.h" #include "map.h" #include "sanity.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ struct map_entry { char *m_key; void *m_value; bool m_managed; }; static struct map_entry * new_entry(const char *key, void *value, bool managed) { struct map_entry *me; me = (struct map_entry *)malloc(sizeof(*me)); if (me != NULL) { me->m_key = strdup(key); if (me->m_key == NULL) { free(me); me = NULL; } else { me->m_value = value; me->m_managed = managed; } } return me; } /* --------------------------------------------------------------------- * The "atf_map_citer" type. * --------------------------------------------------------------------- */ /* * Getters. */ const char * atf_map_citer_key(const atf_map_citer_t citer) { const struct map_entry *me = citer.m_entry; PRE(me != NULL); return me->m_key; } const void * atf_map_citer_data(const atf_map_citer_t citer) { const struct map_entry *me = citer.m_entry; PRE(me != NULL); return me->m_value; } atf_map_citer_t atf_map_citer_next(const atf_map_citer_t citer) { atf_map_citer_t newciter; newciter = citer; newciter.m_listiter = atf_list_citer_next(citer.m_listiter); newciter.m_entry = ((const struct map_entry *) atf_list_citer_data(newciter.m_listiter)); return newciter; } bool atf_equal_map_citer_map_citer(const atf_map_citer_t i1, const atf_map_citer_t i2) { return i1.m_map == i2.m_map && i1.m_entry == i2.m_entry; } /* --------------------------------------------------------------------- * The "atf_map_iter" type. * --------------------------------------------------------------------- */ /* * Getters. */ const char * atf_map_iter_key(const atf_map_iter_t iter) { const struct map_entry *me = iter.m_entry; PRE(me != NULL); return me->m_key; } void * atf_map_iter_data(const atf_map_iter_t iter) { const struct map_entry *me = iter.m_entry; PRE(me != NULL); return me->m_value; } atf_map_iter_t atf_map_iter_next(const atf_map_iter_t iter) { atf_map_iter_t newiter; newiter = iter; newiter.m_listiter = atf_list_iter_next(iter.m_listiter); newiter.m_entry = ((struct map_entry *) atf_list_iter_data(newiter.m_listiter)); return newiter; } bool atf_equal_map_iter_map_iter(const atf_map_iter_t i1, const atf_map_iter_t i2) { return i1.m_map == i2.m_map && i1.m_entry == i2.m_entry; } /* --------------------------------------------------------------------- * The "atf_map" type. * --------------------------------------------------------------------- */ /* * Constructors and destructors. */ atf_error_t atf_map_init(atf_map_t *m) { return atf_list_init(&m->m_list); } atf_error_t atf_map_init_charpp(atf_map_t *m, const char *const *array) { atf_error_t err; const char *const *ptr = array; err = atf_map_init(m); if (array != NULL) { while (!atf_is_error(err) && *ptr != NULL) { const char *key, *value; key = *ptr; INV(key != NULL); ptr++; if ((value = *ptr) == NULL) { err = atf_libc_error(EINVAL, "List too short; no value for " "key '%s' provided", key); /* XXX: Not really libc_error */ break; } ptr++; err = atf_map_insert(m, key, strdup(value), true); } } if (atf_is_error(err)) atf_map_fini(m); return err; } void atf_map_fini(atf_map_t *m) { atf_list_iter_t iter; atf_list_for_each(iter, &m->m_list) { struct map_entry *me = atf_list_iter_data(iter); if (me->m_managed) free(me->m_value); free(me->m_key); free(me); } atf_list_fini(&m->m_list); } /* * Getters. */ atf_map_iter_t atf_map_begin(atf_map_t *m) { atf_map_iter_t iter; iter.m_map = m; iter.m_listiter = atf_list_begin(&m->m_list); iter.m_entry = atf_list_iter_data(iter.m_listiter); return iter; } atf_map_citer_t atf_map_begin_c(const atf_map_t *m) { atf_map_citer_t citer; citer.m_map = m; citer.m_listiter = atf_list_begin_c(&m->m_list); citer.m_entry = atf_list_citer_data(citer.m_listiter); return citer; } atf_map_iter_t atf_map_end(atf_map_t *m) { atf_map_iter_t iter; iter.m_map = m; iter.m_entry = NULL; iter.m_listiter = atf_list_end(&m->m_list); return iter; } atf_map_citer_t atf_map_end_c(const atf_map_t *m) { atf_map_citer_t iter; iter.m_map = m; iter.m_entry = NULL; iter.m_listiter = atf_list_end_c(&m->m_list); return iter; } atf_map_iter_t atf_map_find(atf_map_t *m, const char *key) { atf_list_iter_t iter; atf_list_for_each(iter, &m->m_list) { struct map_entry *me = atf_list_iter_data(iter); if (strcmp(me->m_key, key) == 0) { atf_map_iter_t i; i.m_map = m; i.m_entry = me; i.m_listiter = iter; return i; } } return atf_map_end(m); } atf_map_citer_t atf_map_find_c(const atf_map_t *m, const char *key) { atf_list_citer_t iter; atf_list_for_each_c(iter, &m->m_list) { const struct map_entry *me = atf_list_citer_data(iter); if (strcmp(me->m_key, key) == 0) { atf_map_citer_t i; i.m_map = m; i.m_entry = me; i.m_listiter = iter; return i; } } return atf_map_end_c(m); } size_t atf_map_size(const atf_map_t *m) { return atf_list_size(&m->m_list); } char ** atf_map_to_charpp(const atf_map_t *l) { char **array; atf_map_citer_t iter; size_t i; array = malloc(sizeof(char *) * (atf_map_size(l) * 2 + 1)); if (array == NULL) goto out; i = 0; atf_map_for_each_c(iter, l) { array[i] = strdup(atf_map_citer_key(iter)); if (array[i] == NULL) { atf_utils_free_charpp(array); array = NULL; goto out; } array[i + 1] = strdup((const char *)atf_map_citer_data(iter)); if (array[i + 1] == NULL) { atf_utils_free_charpp(array); array = NULL; goto out; } i += 2; } array[i] = NULL; out: return array; } /* * Modifiers. */ atf_error_t atf_map_insert(atf_map_t *m, const char *key, void *value, bool managed) { struct map_entry *me; atf_error_t err; atf_map_iter_t iter; iter = atf_map_find(m, key); if (atf_equal_map_iter_map_iter(iter, atf_map_end(m))) { me = new_entry(key, value, managed); if (me == NULL) err = atf_no_memory_error(); else { err = atf_list_append(&m->m_list, me, false); if (atf_is_error(err)) { if (managed) free(value); free(me); } } } else { me = iter.m_entry; if (me->m_managed) free(me->m_value); INV(strcmp(me->m_key, key) == 0); me->m_value = value; me->m_managed = managed; err = atf_no_error(); } return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/dynstr.h0000644000470500017500000000630212271526120021303 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_DYNSTR_H) #define ATF_C_DYNSTR_H #include #include #include #include /* --------------------------------------------------------------------- * The "atf_dynstr" type. * --------------------------------------------------------------------- */ struct atf_dynstr { char *m_data; size_t m_datasize; size_t m_length; }; typedef struct atf_dynstr atf_dynstr_t; /* Constants */ extern const size_t atf_dynstr_npos; /* Constructors and destructors */ atf_error_t atf_dynstr_init(atf_dynstr_t *); atf_error_t atf_dynstr_init_ap(atf_dynstr_t *, const char *, va_list); atf_error_t atf_dynstr_init_fmt(atf_dynstr_t *, const char *, ...); atf_error_t atf_dynstr_init_raw(atf_dynstr_t *, const void *, size_t); atf_error_t atf_dynstr_init_rep(atf_dynstr_t *, size_t, char); atf_error_t atf_dynstr_init_substr(atf_dynstr_t *, const atf_dynstr_t *, size_t, size_t); atf_error_t atf_dynstr_copy(atf_dynstr_t *, const atf_dynstr_t *); void atf_dynstr_fini(atf_dynstr_t *); char *atf_dynstr_fini_disown(atf_dynstr_t *); /* Getters */ const char *atf_dynstr_cstring(const atf_dynstr_t *); size_t atf_dynstr_length(const atf_dynstr_t *); size_t atf_dynstr_rfind_ch(const atf_dynstr_t *, char); /* Modifiers */ atf_error_t atf_dynstr_append_ap(atf_dynstr_t *, const char *, va_list); atf_error_t atf_dynstr_append_fmt(atf_dynstr_t *, const char *, ...); void atf_dynstr_clear(atf_dynstr_t *); atf_error_t atf_dynstr_prepend_ap(atf_dynstr_t *, const char *, va_list); atf_error_t atf_dynstr_prepend_fmt(atf_dynstr_t *, const char *, ...); /* Operators */ bool atf_equal_dynstr_cstring(const atf_dynstr_t *, const char *); bool atf_equal_dynstr_dynstr(const atf_dynstr_t *, const atf_dynstr_t *); #endif /* ATF_C_DYNSTR_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/env.c0000644000470500017500000000576412271526120020556 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include "atf-c/error.h" #include "env.h" #include "sanity.h" #include "text.h" const char * atf_env_get(const char *name) { const char* val = getenv(name); PRE(val != NULL); return val; } bool atf_env_has(const char *name) { return getenv(name) != NULL; } atf_error_t atf_env_set(const char *name, const char *val) { atf_error_t err; #if defined(HAVE_SETENV) if (setenv(name, val, 1) == -1) err = atf_libc_error(errno, "Cannot set environment variable " "'%s' to '%s'", name, val); else err = atf_no_error(); #elif defined(HAVE_PUTENV) char *buf; err = atf_text_format(&buf, "%s=%s", name, val); if (!atf_is_error(err)) { if (putenv(buf) == -1) err = atf_libc_error(errno, "Cannot set environment variable " "'%s' to '%s'", name, val); free(buf); } #else # error "Don't know how to set an environment variable." #endif return err; } atf_error_t atf_env_unset(const char *name) { atf_error_t err; #if defined(HAVE_UNSETENV) unsetenv(name); err = atf_no_error(); #elif defined(HAVE_PUTENV) char *buf; err = atf_text_format(&buf, "%s=", name); if (!atf_is_error(err)) { if (putenv(buf) == -1) err = atf_libc_error(errno, "Cannot unset environment variable" " '%s'", name); free(buf); } #else # error "Don't know how to unset an environment variable." #endif return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/test_helpers.c0000644000470500017500000001103112271526120022447 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/build.h" #include "atf-c/check.h" #include "atf-c/config.h" #include "atf-c/error.h" #include "atf-c/macros.h" #include "dynstr.h" #include "fs.h" #include "process.h" #include "test_helpers.h" static void build_check_c_o_aux(const char *path, const char *failmsg, const bool expect_pass) { bool success; atf_dynstr_t iflag; const char *optargs[4]; RE(atf_dynstr_init_fmt(&iflag, "-I%s", atf_config_get("atf_includedir"))); optargs[0] = atf_dynstr_cstring(&iflag); optargs[1] = "-Wall"; optargs[2] = "-Werror"; optargs[3] = NULL; RE(atf_check_build_c_o(path, "test.o", optargs, &success)); atf_dynstr_fini(&iflag); if ((expect_pass && !success) || (!expect_pass && success)) atf_tc_fail("%s", failmsg); } void build_check_c_o(const atf_tc_t *tc, const char *sfile, const char *failmsg, const bool expect_pass) { atf_fs_path_t path; RE(atf_fs_path_init_fmt(&path, "%s/%s", atf_tc_get_config_var(tc, "srcdir"), sfile)); build_check_c_o_aux(atf_fs_path_cstring(&path), failmsg, expect_pass); atf_fs_path_fini(&path); } void header_check(const char *hdrname) { FILE *srcfile; char failmsg[128]; srcfile = fopen("test.c", "w"); ATF_REQUIRE(srcfile != NULL); fprintf(srcfile, "#include <%s>\n", hdrname); fclose(srcfile); snprintf(failmsg, sizeof(failmsg), "Header check failed; %s is not self-contained", hdrname); build_check_c_o_aux("test.c", failmsg, true); } void get_process_helpers_path(const atf_tc_t *tc, const bool is_detail, atf_fs_path_t *path) { RE(atf_fs_path_init_fmt(path, "%s/%sprocess_helpers", atf_tc_get_config_var(tc, "srcdir"), is_detail ? "" : "detail/")); } struct run_h_tc_data { atf_tc_t *m_tc; const char *m_resname; }; static void run_h_tc_child(void *v) { struct run_h_tc_data *data = (struct run_h_tc_data *)v; RE(atf_tc_run(data->m_tc, data->m_resname)); } /* TODO: Investigate if it's worth to add this functionality as part of * the public API. I.e. a function to easily run a test case body in a * subprocess. */ void run_h_tc(atf_tc_t *tc, const char *outname, const char *errname, const char *resname) { atf_fs_path_t outpath, errpath; atf_process_stream_t outb, errb; atf_process_child_t child; atf_process_status_t status; RE(atf_fs_path_init_fmt(&outpath, outname)); RE(atf_fs_path_init_fmt(&errpath, errname)); struct run_h_tc_data data = { tc, resname }; RE(atf_process_stream_init_redirect_path(&outb, &outpath)); RE(atf_process_stream_init_redirect_path(&errb, &errpath)); RE(atf_process_fork(&child, run_h_tc_child, &outb, &errb, &data)); atf_process_stream_fini(&errb); atf_process_stream_fini(&outb); RE(atf_process_child_wait(&child, &status)); ATF_CHECK(atf_process_status_exited(&status)); atf_process_status_fini(&status); atf_fs_path_fini(&errpath); atf_fs_path_fini(&outpath); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/user.c0000644000470500017500000000437112271526120020735 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "sanity.h" #include "user.h" /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ uid_t atf_user_euid(void) { return geteuid(); } bool atf_user_is_member_of_group(gid_t gid) { static gid_t groups[NGROUPS_MAX]; static int ngroups = -1; bool found; int i; if (ngroups == -1) { ngroups = getgroups(NGROUPS_MAX, groups); INV(ngroups >= 0); } found = false; for (i = 0; !found && i < ngroups; i++) if (groups[i] == gid) found = true; return found; } bool atf_user_is_root(void) { return geteuid() == 0; } bool atf_user_is_unprivileged(void) { return geteuid() != 0; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/Atffile0000644000470500017500000000031712271526120021104 0ustar lamontlamontContent-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: dynstr_test tp: env_test tp: fs_test tp: list_test tp: map_test tp: process_test tp: sanity_test tp: text_test tp: user_test bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/fs_test.c0000644000470500017500000007507612271526120021440 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "fs.h" #include "test_helpers.h" #include "user.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static void create_dir(const char *p, int mode) { int ret; ret = mkdir(p, mode); if (ret == -1) atf_tc_fail("Could not create helper directory %s", p); } static void create_file(const char *p, int mode) { int fd; fd = open(p, O_CREAT | O_WRONLY | O_TRUNC, mode); if (fd == -1) atf_tc_fail("Could not create helper file %s", p); close(fd); } static bool exists(const atf_fs_path_t *p) { return access(atf_fs_path_cstring(p), F_OK) == 0; } static atf_error_t mkstemp_discard_fd(atf_fs_path_t *p) { int fd; atf_error_t err = atf_fs_mkstemp(p, &fd); if (!atf_is_error(err)) close(fd); return err; } /* --------------------------------------------------------------------- * Test cases for the "atf_fs_path" type. * --------------------------------------------------------------------- */ ATF_TC(path_normalize); ATF_TC_HEAD(path_normalize, tc) { atf_tc_set_md_var(tc, "descr", "Tests the path's normalization"); } ATF_TC_BODY(path_normalize, tc) { struct test { const char *in; const char *out; } tests[] = { { ".", ".", }, { "..", "..", }, { "/", "/", }, { "//", "/", }, /* NO_CHECK_STYLE */ { "///", "/", }, /* NO_CHECK_STYLE */ { "foo", "foo", }, { "foo/", "foo", }, { "foo/bar", "foo/bar", }, { "foo/bar/", "foo/bar", }, { "/foo", "/foo", }, { "/foo/bar", "/foo/bar", }, { "/foo/bar/", "/foo/bar", }, { "///foo", "/foo", }, /* NO_CHECK_STYLE */ { "///foo///bar", "/foo/bar", }, /* NO_CHECK_STYLE */ { "///foo///bar///", "/foo/bar", }, /* NO_CHECK_STYLE */ { NULL, NULL } }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p; printf("Input : >%s<\n", t->in); printf("Expected output: >%s<\n", t->out); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); printf("Output : >%s<\n", atf_fs_path_cstring(&p)); ATF_REQUIRE(strcmp(atf_fs_path_cstring(&p), t->out) == 0); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_copy); ATF_TC_HEAD(path_copy, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_copy constructor"); } ATF_TC_BODY(path_copy, tc) { atf_fs_path_t str, str2; RE(atf_fs_path_init_fmt(&str, "foo")); RE(atf_fs_path_copy(&str2, &str)); ATF_REQUIRE(atf_equal_fs_path_fs_path(&str, &str2)); RE(atf_fs_path_append_fmt(&str2, "bar")); ATF_REQUIRE(!atf_equal_fs_path_fs_path(&str, &str2)); atf_fs_path_fini(&str2); atf_fs_path_fini(&str); } ATF_TC(path_is_absolute); ATF_TC_HEAD(path_is_absolute, tc) { atf_tc_set_md_var(tc, "descr", "Tests the path::is_absolute function"); } ATF_TC_BODY(path_is_absolute, tc) { struct test { const char *in; bool abs; } tests[] = { { "/", true }, { "////", true }, /* NO_CHECK_STYLE */ { "////a", true }, /* NO_CHECK_STYLE */ { "//a//", true }, /* NO_CHECK_STYLE */ { "a////", false }, /* NO_CHECK_STYLE */ { "../foo", false }, { NULL, false }, }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p; printf("Input : %s\n", t->in); printf("Expected result: %s\n", t->abs ? "true" : "false"); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); printf("Result : %s\n", atf_fs_path_is_absolute(&p) ? "true" : "false"); if (t->abs) ATF_REQUIRE(atf_fs_path_is_absolute(&p)); else ATF_REQUIRE(!atf_fs_path_is_absolute(&p)); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_is_root); ATF_TC_HEAD(path_is_root, tc) { atf_tc_set_md_var(tc, "descr", "Tests the path::is_root function"); } ATF_TC_BODY(path_is_root, tc) { struct test { const char *in; bool root; } tests[] = { { "/", true }, { "////", true }, /* NO_CHECK_STYLE */ { "////a", false }, /* NO_CHECK_STYLE */ { "//a//", false }, /* NO_CHECK_STYLE */ { "a////", false }, /* NO_CHECK_STYLE */ { "../foo", false }, { NULL, false }, }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p; printf("Input : %s\n", t->in); printf("Expected result: %s\n", t->root ? "true" : "false"); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); printf("Result : %s\n", atf_fs_path_is_root(&p) ? "true" : "false"); if (t->root) ATF_REQUIRE(atf_fs_path_is_root(&p)); else ATF_REQUIRE(!atf_fs_path_is_root(&p)); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_branch_path); ATF_TC_HEAD(path_branch_path, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_branch_path " "function"); } ATF_TC_BODY(path_branch_path, tc) { struct test { const char *in; const char *branch; } tests[] = { { ".", "." }, { "foo", "." }, { "foo/bar", "foo" }, { "/foo", "/" }, { "/foo/bar", "/foo" }, { NULL, NULL }, }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p, bp; printf("Input : %s\n", t->in); printf("Expected output: %s\n", t->branch); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); RE(atf_fs_path_branch_path(&p, &bp)); printf("Output : %s\n", atf_fs_path_cstring(&bp)); ATF_REQUIRE(strcmp(atf_fs_path_cstring(&bp), t->branch) == 0); atf_fs_path_fini(&bp); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_leaf_name); ATF_TC_HEAD(path_leaf_name, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_leaf_name " "function"); } ATF_TC_BODY(path_leaf_name, tc) { struct test { const char *in; const char *leaf; } tests[] = { { ".", "." }, { "foo", "foo" }, { "foo/bar", "bar" }, { "/foo", "foo" }, { "/foo/bar", "bar" }, { NULL, NULL }, }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p; atf_dynstr_t ln; printf("Input : %s\n", t->in); printf("Expected output: %s\n", t->leaf); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); RE(atf_fs_path_leaf_name(&p, &ln)); printf("Output : %s\n", atf_dynstr_cstring(&ln)); ATF_REQUIRE(atf_equal_dynstr_cstring(&ln, t->leaf)); atf_dynstr_fini(&ln); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_append); ATF_TC_HEAD(path_append, tc) { atf_tc_set_md_var(tc, "descr", "Tests the concatenation of multiple " "paths"); } ATF_TC_BODY(path_append, tc) { struct test { const char *in; const char *ap; const char *out; } tests[] = { { "foo", "bar", "foo/bar" }, { "foo/", "/bar", "foo/bar" }, { "foo/", "/bar/baz", "foo/bar/baz" }, { "foo/", "///bar///baz", "foo/bar/baz" }, /* NO_CHECK_STYLE */ { NULL, NULL, NULL } }; struct test *t; for (t = &tests[0]; t->in != NULL; t++) { atf_fs_path_t p; printf("Input : >%s<\n", t->in); printf("Append : >%s<\n", t->ap); printf("Expected output: >%s<\n", t->out); RE(atf_fs_path_init_fmt(&p, "%s", t->in)); RE(atf_fs_path_append_fmt(&p, "%s", t->ap)); printf("Output : >%s<\n", atf_fs_path_cstring(&p)); ATF_REQUIRE(strcmp(atf_fs_path_cstring(&p), t->out) == 0); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_to_absolute); ATF_TC_HEAD(path_to_absolute, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_to_absolute " "function"); } ATF_TC_BODY(path_to_absolute, tc) { const char *names[] = { ".", "dir", NULL }; const char **n; ATF_REQUIRE(mkdir("dir", 0755) != -1); for (n = names; *n != NULL; n++) { atf_fs_path_t p, p2; atf_fs_stat_t st1, st2; RE(atf_fs_path_init_fmt(&p, "%s", *n)); RE(atf_fs_stat_init(&st1, &p)); printf("Relative path: %s\n", atf_fs_path_cstring(&p)); RE(atf_fs_path_to_absolute(&p, &p2)); printf("Absolute path: %s\n", atf_fs_path_cstring(&p2)); ATF_REQUIRE(atf_fs_path_is_absolute(&p2)); RE(atf_fs_stat_init(&st2, &p2)); ATF_REQUIRE_EQ(atf_fs_stat_get_device(&st1), atf_fs_stat_get_device(&st2)); ATF_REQUIRE_EQ(atf_fs_stat_get_inode(&st1), atf_fs_stat_get_inode(&st2)); atf_fs_stat_fini(&st2); atf_fs_stat_fini(&st1); atf_fs_path_fini(&p2); atf_fs_path_fini(&p); printf("\n"); } } ATF_TC(path_equal); ATF_TC_HEAD(path_equal, tc) { atf_tc_set_md_var(tc, "descr", "Tests the equality operators for paths"); } ATF_TC_BODY(path_equal, tc) { atf_fs_path_t p1, p2; RE(atf_fs_path_init_fmt(&p1, "foo")); RE(atf_fs_path_init_fmt(&p2, "foo")); ATF_REQUIRE(atf_equal_fs_path_fs_path(&p1, &p2)); atf_fs_path_fini(&p2); RE(atf_fs_path_init_fmt(&p2, "bar")); ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2)); atf_fs_path_fini(&p2); atf_fs_path_fini(&p1); } /* --------------------------------------------------------------------- * Test cases for the "atf_fs_stat" type. * --------------------------------------------------------------------- */ ATF_TC(stat_mode); ATF_TC_HEAD(stat_mode, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_get_mode function " "and, indirectly, the constructor"); } ATF_TC_BODY(stat_mode, tc) { atf_fs_path_t p; atf_fs_stat_t st; create_file("f1", 0400); create_file("f2", 0644); RE(atf_fs_path_init_fmt(&p, "f1")); RE(atf_fs_stat_init(&st, &p)); ATF_CHECK_EQ(0400, atf_fs_stat_get_mode(&st)); atf_fs_stat_fini(&st); atf_fs_path_fini(&p); RE(atf_fs_path_init_fmt(&p, "f2")); RE(atf_fs_stat_init(&st, &p)); ATF_CHECK_EQ(0644, atf_fs_stat_get_mode(&st)); atf_fs_stat_fini(&st); atf_fs_path_fini(&p); } ATF_TC(stat_type); ATF_TC_HEAD(stat_type, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_get_type function " "and, indirectly, the constructor"); } ATF_TC_BODY(stat_type, tc) { atf_fs_path_t p; atf_fs_stat_t st; create_dir("dir", 0755); create_file("reg", 0644); RE(atf_fs_path_init_fmt(&p, "dir")); RE(atf_fs_stat_init(&st, &p)); ATF_REQUIRE_EQ(atf_fs_stat_get_type(&st), atf_fs_stat_dir_type); atf_fs_stat_fini(&st); atf_fs_path_fini(&p); RE(atf_fs_path_init_fmt(&p, "reg")); RE(atf_fs_stat_init(&st, &p)); ATF_REQUIRE_EQ(atf_fs_stat_get_type(&st), atf_fs_stat_reg_type); atf_fs_stat_fini(&st); atf_fs_path_fini(&p); } ATF_TC(stat_perms); ATF_TC_HEAD(stat_perms, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_is_* functions"); } ATF_TC_BODY(stat_perms, tc) { atf_fs_path_t p; atf_fs_stat_t st; create_file("reg", 0); RE(atf_fs_path_init_fmt(&p, "reg")); #define perms(ur, uw, ux, gr, gw, gx, othr, othw, othx) \ { \ RE(atf_fs_stat_init(&st, &p)); \ ATF_REQUIRE(atf_fs_stat_is_owner_readable(&st) == ur); \ ATF_REQUIRE(atf_fs_stat_is_owner_writable(&st) == uw); \ ATF_REQUIRE(atf_fs_stat_is_owner_executable(&st) == ux); \ ATF_REQUIRE(atf_fs_stat_is_group_readable(&st) == gr); \ ATF_REQUIRE(atf_fs_stat_is_group_writable(&st) == gw); \ ATF_REQUIRE(atf_fs_stat_is_group_executable(&st) == gx); \ ATF_REQUIRE(atf_fs_stat_is_other_readable(&st) == othr); \ ATF_REQUIRE(atf_fs_stat_is_other_writable(&st) == othw); \ ATF_REQUIRE(atf_fs_stat_is_other_executable(&st) == othx); \ atf_fs_stat_fini(&st); \ } chmod("reg", 0000); perms(false, false, false, false, false, false, false, false, false); chmod("reg", 0001); perms(false, false, false, false, false, false, false, false, true); chmod("reg", 0010); perms(false, false, false, false, false, true, false, false, false); chmod("reg", 0100); perms(false, false, true, false, false, false, false, false, false); chmod("reg", 0002); perms(false, false, false, false, false, false, false, true, false); chmod("reg", 0020); perms(false, false, false, false, true, false, false, false, false); chmod("reg", 0200); perms(false, true, false, false, false, false, false, false, false); chmod("reg", 0004); perms(false, false, false, false, false, false, true, false, false); chmod("reg", 0040); perms(false, false, false, true, false, false, false, false, false); chmod("reg", 0400); perms(true, false, false, false, false, false, false, false, false); chmod("reg", 0644); perms(true, true, false, true, false, false, true, false, false); chmod("reg", 0755); perms(true, true, true, true, false, true, true, false, true); chmod("reg", 0777); perms(true, true, true, true, true, true, true, true, true); #undef perms atf_fs_path_fini(&p); } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(exists); ATF_TC_HEAD(exists, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_exists function"); } ATF_TC_BODY(exists, tc) { atf_error_t err; atf_fs_path_t pdir, pfile; bool b; RE(atf_fs_path_init_fmt(&pdir, "dir")); RE(atf_fs_path_init_fmt(&pfile, "dir/file")); create_dir(atf_fs_path_cstring(&pdir), 0755); create_file(atf_fs_path_cstring(&pfile), 0644); printf("Checking existence of a directory\n"); RE(atf_fs_exists(&pdir, &b)); ATF_REQUIRE(b); printf("Checking existence of a file\n"); RE(atf_fs_exists(&pfile, &b)); ATF_REQUIRE(b); /* XXX: This should probably be a separate test case to let the user * be aware that some tests were skipped because privileges were not * correct. */ if (!atf_user_is_root()) { printf("Checking existence of a file inside a directory without " "permissions\n"); ATF_REQUIRE(chmod(atf_fs_path_cstring(&pdir), 0000) != -1); err = atf_fs_exists(&pfile, &b); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE(chmod(atf_fs_path_cstring(&pdir), 0755) != -1); atf_error_free(err); } printf("Checking existence of a non-existent file\n"); ATF_REQUIRE(unlink(atf_fs_path_cstring(&pfile)) != -1); RE(atf_fs_exists(&pfile, &b)); ATF_REQUIRE(!b); atf_fs_path_fini(&pfile); atf_fs_path_fini(&pdir); } ATF_TC(eaccess); ATF_TC_HEAD(eaccess, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_eaccess function"); } ATF_TC_BODY(eaccess, tc) { const int modes[] = { atf_fs_access_f, atf_fs_access_r, atf_fs_access_w, atf_fs_access_x, 0 }; const int *m; struct tests { mode_t fmode; int amode; int uerror; int rerror; } tests[] = { { 0000, atf_fs_access_r, EACCES, 0 }, { 0000, atf_fs_access_w, EACCES, 0 }, { 0000, atf_fs_access_x, EACCES, EACCES }, { 0001, atf_fs_access_r, EACCES, 0 }, { 0001, atf_fs_access_w, EACCES, 0 }, { 0001, atf_fs_access_x, EACCES, 0 }, { 0002, atf_fs_access_r, EACCES, 0 }, { 0002, atf_fs_access_w, EACCES, 0 }, { 0002, atf_fs_access_x, EACCES, EACCES }, { 0004, atf_fs_access_r, EACCES, 0 }, { 0004, atf_fs_access_w, EACCES, 0 }, { 0004, atf_fs_access_x, EACCES, EACCES }, { 0010, atf_fs_access_r, EACCES, 0 }, { 0010, atf_fs_access_w, EACCES, 0 }, { 0010, atf_fs_access_x, 0, 0 }, { 0020, atf_fs_access_r, EACCES, 0 }, { 0020, atf_fs_access_w, 0, 0 }, { 0020, atf_fs_access_x, EACCES, EACCES }, { 0040, atf_fs_access_r, 0, 0 }, { 0040, atf_fs_access_w, EACCES, 0 }, { 0040, atf_fs_access_x, EACCES, EACCES }, { 0100, atf_fs_access_r, EACCES, 0 }, { 0100, atf_fs_access_w, EACCES, 0 }, { 0100, atf_fs_access_x, 0, 0 }, { 0200, atf_fs_access_r, EACCES, 0 }, { 0200, atf_fs_access_w, 0, 0 }, { 0200, atf_fs_access_x, EACCES, EACCES }, { 0400, atf_fs_access_r, 0, 0 }, { 0400, atf_fs_access_w, EACCES, 0 }, { 0400, atf_fs_access_x, EACCES, EACCES }, { 0, 0, 0, 0 } }; struct tests *t; atf_fs_path_t p; atf_error_t err; RE(atf_fs_path_init_fmt(&p, "the-file")); printf("Non-existent file checks\n"); for (m = &modes[0]; *m != 0; m++) { err = atf_fs_eaccess(&p, *m); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOENT); atf_error_free(err); } create_file(atf_fs_path_cstring(&p), 0000); ATF_REQUIRE(chown(atf_fs_path_cstring(&p), geteuid(), getegid()) != -1); for (t = &tests[0]; t->amode != 0; t++) { const int experr = atf_user_is_root() ? t->rerror : t->uerror; printf("\n"); printf("File mode : %04o\n", (unsigned int)t->fmode); printf("Access mode : 0x%02x\n", t->amode); ATF_REQUIRE(chmod(atf_fs_path_cstring(&p), t->fmode) != -1); /* First, existence check. */ err = atf_fs_eaccess(&p, atf_fs_access_f); ATF_REQUIRE(!atf_is_error(err)); /* Now do the specific test case. */ printf("Expected error: %d\n", experr); err = atf_fs_eaccess(&p, t->amode); if (atf_is_error(err)) { if (atf_error_is(err, "libc")) printf("Error : %d\n", atf_libc_error_code(err)); else printf("Error : Non-libc error\n"); } else printf("Error : None\n"); if (experr == 0) { ATF_REQUIRE(!atf_is_error(err)); } else { ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), experr); atf_error_free(err); } } atf_fs_path_fini(&p); } ATF_TC(getcwd); ATF_TC_HEAD(getcwd, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_getcwd function"); } ATF_TC_BODY(getcwd, tc) { atf_fs_path_t cwd1, cwd2; create_dir ("root", 0755); RE(atf_fs_getcwd(&cwd1)); ATF_REQUIRE(chdir("root") != -1); RE(atf_fs_getcwd(&cwd2)); RE(atf_fs_path_append_fmt(&cwd1, "root")); ATF_REQUIRE(atf_equal_fs_path_fs_path(&cwd1, &cwd2)); atf_fs_path_fini(&cwd2); atf_fs_path_fini(&cwd1); } ATF_TC(rmdir_empty); ATF_TC_HEAD(rmdir_empty, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function"); } ATF_TC_BODY(rmdir_empty, tc) { atf_fs_path_t p; RE(atf_fs_path_init_fmt(&p, "test-dir")); ATF_REQUIRE(mkdir("test-dir", 0755) != -1); ATF_REQUIRE(exists(&p)); RE(atf_fs_rmdir(&p)); ATF_REQUIRE(!exists(&p)); atf_fs_path_fini(&p); } ATF_TC(rmdir_enotempty); ATF_TC_HEAD(rmdir_enotempty, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function"); } ATF_TC_BODY(rmdir_enotempty, tc) { atf_fs_path_t p; atf_error_t err; RE(atf_fs_path_init_fmt(&p, "test-dir")); ATF_REQUIRE(mkdir("test-dir", 0755) != -1); ATF_REQUIRE(exists(&p)); create_file("test-dir/foo", 0644); err = atf_fs_rmdir(&p); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOTEMPTY); atf_error_free(err); atf_fs_path_fini(&p); } ATF_TC(rmdir_eperm); ATF_TC_HEAD(rmdir_eperm, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function"); } ATF_TC_BODY(rmdir_eperm, tc) { atf_fs_path_t p; atf_error_t err; RE(atf_fs_path_init_fmt(&p, "test-dir/foo")); ATF_REQUIRE(mkdir("test-dir", 0755) != -1); ATF_REQUIRE(mkdir("test-dir/foo", 0755) != -1); ATF_REQUIRE(chmod("test-dir", 0555) != -1); ATF_REQUIRE(exists(&p)); err = atf_fs_rmdir(&p); if (atf_user_is_root()) { ATF_REQUIRE(!atf_is_error(err)); } else { ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_REQUIRE_EQ(atf_libc_error_code(err), EACCES); atf_error_free(err); } atf_fs_path_fini(&p); } ATF_TC(mkdtemp_ok); ATF_TC_HEAD(mkdtemp_ok, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function, " "successful execution"); } ATF_TC_BODY(mkdtemp_ok, tc) { atf_fs_path_t p1, p2; atf_fs_stat_t s1, s2; RE(atf_fs_path_init_fmt(&p1, "testdir.XXXXXX")); RE(atf_fs_path_init_fmt(&p2, "testdir.XXXXXX")); RE(atf_fs_mkdtemp(&p1)); RE(atf_fs_mkdtemp(&p2)); ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2)); ATF_REQUIRE(exists(&p1)); ATF_REQUIRE(exists(&p2)); RE(atf_fs_stat_init(&s1, &p1)); ATF_REQUIRE_EQ(atf_fs_stat_get_type(&s1), atf_fs_stat_dir_type); ATF_REQUIRE( atf_fs_stat_is_owner_readable(&s1)); ATF_REQUIRE( atf_fs_stat_is_owner_writable(&s1)); ATF_REQUIRE( atf_fs_stat_is_owner_executable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_group_readable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_group_writable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_group_executable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_other_readable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_other_writable(&s1)); ATF_REQUIRE(!atf_fs_stat_is_other_executable(&s1)); RE(atf_fs_stat_init(&s2, &p2)); ATF_REQUIRE_EQ(atf_fs_stat_get_type(&s2), atf_fs_stat_dir_type); ATF_REQUIRE( atf_fs_stat_is_owner_readable(&s2)); ATF_REQUIRE( atf_fs_stat_is_owner_writable(&s2)); ATF_REQUIRE( atf_fs_stat_is_owner_executable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_group_readable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_group_writable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_group_executable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_other_readable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_other_writable(&s2)); ATF_REQUIRE(!atf_fs_stat_is_other_executable(&s2)); atf_fs_stat_fini(&s2); atf_fs_stat_fini(&s1); atf_fs_path_fini(&p2); atf_fs_path_fini(&p1); } ATF_TC(mkdtemp_err); ATF_TC_HEAD(mkdtemp_err, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function, " "error conditions"); atf_tc_set_md_var(tc, "require.user", "unprivileged"); } ATF_TC_BODY(mkdtemp_err, tc) { atf_error_t err; atf_fs_path_t p; ATF_REQUIRE(mkdir("dir", 0555) != -1); RE(atf_fs_path_init_fmt(&p, "dir/testdir.XXXXXX")); err = atf_fs_mkdtemp(&p); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_CHECK_EQ(atf_libc_error_code(err), EACCES); atf_error_free(err); ATF_CHECK(!exists(&p)); ATF_CHECK(strcmp(atf_fs_path_cstring(&p), "dir/testdir.XXXXXX") == 0); atf_fs_path_fini(&p); } static void do_umask_check(atf_error_t (*const mk_func)(atf_fs_path_t *), atf_fs_path_t *path, const mode_t test_mask, const char *str_mask, const char *exp_name) { char buf[1024]; int old_umask; atf_error_t err; printf("Creating temporary %s with umask %s\n", exp_name, str_mask); old_umask = umask(test_mask); err = mk_func(path); (void)umask(old_umask); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "invalid_umask")); atf_error_format(err, buf, sizeof(buf)); ATF_CHECK(strstr(buf, exp_name) != NULL); ATF_CHECK(strstr(buf, str_mask) != NULL); atf_error_free(err); } ATF_TC(mkdtemp_umask); ATF_TC_HEAD(mkdtemp_umask, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function " "causing an error due to a too strict umask"); } ATF_TC_BODY(mkdtemp_umask, tc) { atf_fs_path_t p; RE(atf_fs_path_init_fmt(&p, "testdir.XXXXXX")); do_umask_check(atf_fs_mkdtemp, &p, 00100, "00100", "directory"); do_umask_check(atf_fs_mkdtemp, &p, 00200, "00200", "directory"); do_umask_check(atf_fs_mkdtemp, &p, 00400, "00400", "directory"); do_umask_check(atf_fs_mkdtemp, &p, 00500, "00500", "directory"); do_umask_check(atf_fs_mkdtemp, &p, 00600, "00600", "directory"); atf_fs_path_fini(&p); } ATF_TC(mkstemp_ok); ATF_TC_HEAD(mkstemp_ok, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function, " "successful execution"); } ATF_TC_BODY(mkstemp_ok, tc) { int fd1, fd2; atf_fs_path_t p1, p2; atf_fs_stat_t s1, s2; RE(atf_fs_path_init_fmt(&p1, "testfile.XXXXXX")); RE(atf_fs_path_init_fmt(&p2, "testfile.XXXXXX")); fd1 = fd2 = -1; RE(atf_fs_mkstemp(&p1, &fd1)); RE(atf_fs_mkstemp(&p2, &fd2)); ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2)); ATF_REQUIRE(exists(&p1)); ATF_REQUIRE(exists(&p2)); ATF_CHECK(fd1 != -1); ATF_CHECK(fd2 != -1); ATF_CHECK(write(fd1, "foo", 3) == 3); ATF_CHECK(write(fd2, "bar", 3) == 3); close(fd1); close(fd2); RE(atf_fs_stat_init(&s1, &p1)); ATF_CHECK_EQ(atf_fs_stat_get_type(&s1), atf_fs_stat_reg_type); ATF_CHECK( atf_fs_stat_is_owner_readable(&s1)); ATF_CHECK( atf_fs_stat_is_owner_writable(&s1)); ATF_CHECK(!atf_fs_stat_is_owner_executable(&s1)); ATF_CHECK(!atf_fs_stat_is_group_readable(&s1)); ATF_CHECK(!atf_fs_stat_is_group_writable(&s1)); ATF_CHECK(!atf_fs_stat_is_group_executable(&s1)); ATF_CHECK(!atf_fs_stat_is_other_readable(&s1)); ATF_CHECK(!atf_fs_stat_is_other_writable(&s1)); ATF_CHECK(!atf_fs_stat_is_other_executable(&s1)); RE(atf_fs_stat_init(&s2, &p2)); ATF_CHECK_EQ(atf_fs_stat_get_type(&s2), atf_fs_stat_reg_type); ATF_CHECK( atf_fs_stat_is_owner_readable(&s2)); ATF_CHECK( atf_fs_stat_is_owner_writable(&s2)); ATF_CHECK(!atf_fs_stat_is_owner_executable(&s2)); ATF_CHECK(!atf_fs_stat_is_group_readable(&s2)); ATF_CHECK(!atf_fs_stat_is_group_writable(&s2)); ATF_CHECK(!atf_fs_stat_is_group_executable(&s2)); ATF_CHECK(!atf_fs_stat_is_other_readable(&s2)); ATF_CHECK(!atf_fs_stat_is_other_writable(&s2)); ATF_CHECK(!atf_fs_stat_is_other_executable(&s2)); atf_fs_stat_fini(&s2); atf_fs_stat_fini(&s1); atf_fs_path_fini(&p2); atf_fs_path_fini(&p1); } ATF_TC(mkstemp_err); ATF_TC_HEAD(mkstemp_err, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function, " "error conditions"); atf_tc_set_md_var(tc, "require.user", "unprivileged"); } ATF_TC_BODY(mkstemp_err, tc) { int fd; atf_error_t err; atf_fs_path_t p; ATF_REQUIRE(mkdir("dir", 0555) != -1); RE(atf_fs_path_init_fmt(&p, "dir/testfile.XXXXXX")); fd = 1234; err = atf_fs_mkstemp(&p, &fd); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "libc")); ATF_CHECK_EQ(atf_libc_error_code(err), EACCES); atf_error_free(err); ATF_CHECK(!exists(&p)); ATF_CHECK(strcmp(atf_fs_path_cstring(&p), "dir/testfile.XXXXXX") == 0); ATF_CHECK_EQ(fd, 1234); atf_fs_path_fini(&p); } ATF_TC(mkstemp_umask); ATF_TC_HEAD(mkstemp_umask, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function " "causing an error due to a too strict umask"); } ATF_TC_BODY(mkstemp_umask, tc) { atf_fs_path_t p; RE(atf_fs_path_init_fmt(&p, "testfile.XXXXXX")); do_umask_check(mkstemp_discard_fd, &p, 00100, "00100", "regular file"); do_umask_check(mkstemp_discard_fd, &p, 00200, "00200", "regular file"); do_umask_check(mkstemp_discard_fd, &p, 00400, "00400", "regular file"); atf_fs_path_fini(&p); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the tests for the "atf_fs_path" type. */ ATF_TP_ADD_TC(tp, path_normalize); ATF_TP_ADD_TC(tp, path_copy); ATF_TP_ADD_TC(tp, path_is_absolute); ATF_TP_ADD_TC(tp, path_is_root); ATF_TP_ADD_TC(tp, path_branch_path); ATF_TP_ADD_TC(tp, path_leaf_name); ATF_TP_ADD_TC(tp, path_append); ATF_TP_ADD_TC(tp, path_to_absolute); ATF_TP_ADD_TC(tp, path_equal); /* Add the tests for the "atf_fs_stat" type. */ ATF_TP_ADD_TC(tp, stat_mode); ATF_TP_ADD_TC(tp, stat_type); ATF_TP_ADD_TC(tp, stat_perms); /* Add the tests for the free functions. */ ATF_TP_ADD_TC(tp, eaccess); ATF_TP_ADD_TC(tp, exists); ATF_TP_ADD_TC(tp, getcwd); ATF_TP_ADD_TC(tp, rmdir_empty); ATF_TP_ADD_TC(tp, rmdir_enotempty); ATF_TP_ADD_TC(tp, rmdir_eperm); ATF_TP_ADD_TC(tp, mkdtemp_ok); ATF_TP_ADD_TC(tp, mkdtemp_err); ATF_TP_ADD_TC(tp, mkdtemp_umask); ATF_TP_ADD_TC(tp, mkstemp_ok); ATF_TP_ADD_TC(tp, mkstemp_err); ATF_TP_ADD_TC(tp, mkstemp_umask); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/dynstr_test.c0000644000470500017500000004143512271526120022343 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "dynstr.h" #include "test_helpers.h" /* --------------------------------------------------------------------- * Tests for the "atf_dynstr" type. * --------------------------------------------------------------------- */ /* * Constructors and destructors. */ ATF_TC(init); ATF_TC_HEAD(init, tc) { atf_tc_set_md_var(tc, "descr", "Checks the empty constructor"); } ATF_TC_BODY(init, tc) { atf_dynstr_t str; RE(atf_dynstr_init(&str)); ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); } static void init_fmt(atf_dynstr_t *str, const char *fmt, ...) { va_list ap; va_start(ap, fmt); RE(atf_dynstr_init_ap(str, fmt, ap)); va_end(ap); } ATF_TC(init_ap); ATF_TC_HEAD(init_ap, tc) { atf_tc_set_md_var(tc, "descr", "Checks the formatted constructor using " "a va_list argument"); } ATF_TC_BODY(init_ap, tc) { atf_dynstr_t str; init_fmt(&str, "String 1"); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0); atf_dynstr_fini(&str); init_fmt(&str, "String %d", 2); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0); atf_dynstr_fini(&str); init_fmt(&str, "%s %d", "String", 3); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 3") == 0); atf_dynstr_fini(&str); init_fmt(&str, "%s%s%s%s%s%s%s", "This ", "should ", "be ", "a ", "large ", "string ", "aaaabbbbccccdddd"); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "This should be a large string " "aaaabbbbccccdddd") == 0); atf_dynstr_fini(&str); } ATF_TC(init_fmt); ATF_TC_HEAD(init_fmt, tc) { atf_tc_set_md_var(tc, "descr", "Checks the formatted constructor using " "a variable list of parameters"); } ATF_TC_BODY(init_fmt, tc) { atf_dynstr_t str; RE(atf_dynstr_init_fmt(&str, "String 1")); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_fmt(&str, "String %d", 2)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_fmt(&str, "%s %d", "String", 3)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 3") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_fmt(&str, "%s%s%s%s%s%s%s", "This ", "should ", "be ", "a ", "large ", "string ", "aaaabbbbccccdddd")); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "This should be a large string " "aaaabbbbccccdddd") == 0); atf_dynstr_fini(&str); } ATF_TC(init_raw); ATF_TC_HEAD(init_raw, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of a string " "using a raw memory pointer"); } ATF_TC_BODY(init_raw, tc) { const char *src = "String 1, String 2"; atf_dynstr_t str; RE(atf_dynstr_init_raw(&str, src, 0)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, src, 8)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, src + 10, 8)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_raw(&str, "String\0Lost", 11)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String") == 0); atf_dynstr_fini(&str); { atf_error_t err = atf_dynstr_init_raw(&str, "NULL", SIZE_MAX - 1); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "no_memory")); atf_error_free(err); } } ATF_TC(init_rep); ATF_TC_HEAD(init_rep, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of a string by " "repeating characters"); } ATF_TC_BODY(init_rep, tc) { const size_t maxlen = 8192; char buf[maxlen + 1]; size_t i; buf[0] = '\0'; for (i = 0; i < maxlen; i++) { atf_dynstr_t str; RE(atf_dynstr_init_rep(&str, i, 'a')); if (strcmp(atf_dynstr_cstring(&str), buf) != 0) { fprintf(stderr, "Failed at iteration %zd\n", i); atf_tc_fail("Failed to construct dynstr by repeating %zd " "times the '%c' character", i, 'a'); } atf_dynstr_fini(&str); strcat(buf, "a"); } { atf_dynstr_t str; atf_error_t err; err = atf_dynstr_init_rep(&str, SIZE_MAX, 'a'); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "no_memory")); atf_error_free(err); err = atf_dynstr_init_rep(&str, SIZE_MAX - 1, 'a'); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "no_memory")); atf_error_free(err); } } ATF_TC(init_substr); ATF_TC_HEAD(init_substr, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of a string " "using a substring of another one"); } ATF_TC_BODY(init_substr, tc) { atf_dynstr_t src; atf_dynstr_t str; RE(atf_dynstr_init_fmt(&src, "Str 1, Str 2")); RE(atf_dynstr_init_substr(&str, &src, 0, 0)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_substr(&str, &src, 0, atf_dynstr_npos)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1, Str 2") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_substr(&str, &src, 0, 100)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1, Str 2") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_substr(&str, &src, 0, 5)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_substr(&str, &src, 100, atf_dynstr_npos)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_substr(&str, &src, 7, atf_dynstr_npos)); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 2") == 0); atf_dynstr_fini(&str); atf_dynstr_fini(&src); } ATF_TC(copy); ATF_TC_HEAD(copy, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_dynstr_copy constructor"); } ATF_TC_BODY(copy, tc) { atf_dynstr_t str, str2; RE(atf_dynstr_init_fmt(&str, "Test string")); RE(atf_dynstr_copy(&str2, &str)); ATF_REQUIRE(atf_equal_dynstr_dynstr(&str, &str2)); RE(atf_dynstr_append_fmt(&str2, " non-shared text")); ATF_REQUIRE(!atf_equal_dynstr_dynstr(&str, &str2)); atf_dynstr_fini(&str2); atf_dynstr_fini(&str); } ATF_TC(fini_disown); ATF_TC_HEAD(fini_disown, tc) { atf_tc_set_md_var(tc, "descr", "Checks grabbing ownership of the " "internal plain C string"); } ATF_TC_BODY(fini_disown, tc) { const char *cstr; char *cstr2; atf_dynstr_t str; RE(atf_dynstr_init_fmt(&str, "Test string 1")); cstr = atf_dynstr_cstring(&str); cstr2 = atf_dynstr_fini_disown(&str); ATF_REQUIRE_EQ(cstr, cstr2); free(cstr2); } /* * Getters. */ ATF_TC(cstring); ATF_TC_HEAD(cstring, tc) { atf_tc_set_md_var(tc, "descr", "Checks the method to obtain a plain C " "string"); } ATF_TC_BODY(cstring, tc) { const char *cstr; atf_dynstr_t str; RE(atf_dynstr_init_fmt(&str, "Test string 1")); cstr = atf_dynstr_cstring(&str); ATF_REQUIRE(cstr != NULL); ATF_REQUIRE(strcmp(cstr, "Test string 1") == 0); atf_dynstr_fini(&str); RE(atf_dynstr_init_fmt(&str, "Test string 2")); cstr = atf_dynstr_cstring(&str); ATF_REQUIRE(cstr != NULL); ATF_REQUIRE(strcmp(cstr, "Test string 2") == 0); atf_dynstr_fini(&str); } ATF_TC(length); ATF_TC_HEAD(length, tc) { atf_tc_set_md_var(tc, "descr", "Checks the method to obtain the length"); } ATF_TC_BODY(length, tc) { size_t i; for (i = 0; i < 8192; i++) { atf_dynstr_t str; RE(atf_dynstr_init_rep(&str, i, 'a')); ATF_REQUIRE_EQ(atf_dynstr_length(&str), i); atf_dynstr_fini(&str); } } ATF_TC(rfind_ch); ATF_TC_HEAD(rfind_ch, tc) { atf_tc_set_md_var(tc, "descr", "Checks the method to locate the first " "occurrence of a character starting from the end"); } ATF_TC_BODY(rfind_ch, tc) { atf_dynstr_t str; RE(atf_dynstr_init_fmt(&str, "Foo1/Bar2/,.Baz")); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '\0'), atf_dynstr_npos); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '0'), atf_dynstr_npos); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'b'), atf_dynstr_npos); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'F'), 0); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '/'), 9); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'a'), 13); ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'z'), 14); atf_dynstr_fini(&str); } /* * Modifiers. */ static void check_append(atf_error_t (*append)(atf_dynstr_t *, const char *, ...)) { const size_t maxlen = 8192; char buf[maxlen + 1]; size_t i; atf_dynstr_t str; printf("Appending with plain string\n"); buf[0] = '\0'; RE(atf_dynstr_init(&str)); for (i = 0; i < maxlen; i++) { if (strcmp(atf_dynstr_cstring(&str), buf) != 0) { fprintf(stderr, "Failed at iteration %zd\n", i); atf_tc_fail("Failed to append character at iteration %zd", i); } RE(append(&str, "a")); strcat(buf, "a"); } atf_dynstr_fini(&str); printf("Appending with formatted string\n"); buf[0] = '\0'; RE(atf_dynstr_init(&str)); for (i = 0; i < maxlen; i++) { if (strcmp(atf_dynstr_cstring(&str), buf) != 0) { fprintf(stderr, "Failed at iteration %zd\n", i); atf_tc_fail("Failed to append character at iteration %zd", i); } RE(append(&str, "%s", "a")); strcat(buf, "a"); } atf_dynstr_fini(&str); } static atf_error_t append_ap_aux(atf_dynstr_t *str, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_dynstr_append_ap(str, fmt, ap); va_end(ap); return err; } ATF_TC(append_ap); ATF_TC_HEAD(append_ap, tc) { atf_tc_set_md_var(tc, "descr", "Checks that appending a string to " "another one works"); } ATF_TC_BODY(append_ap, tc) { check_append(append_ap_aux); } ATF_TC(append_fmt); ATF_TC_HEAD(append_fmt, tc) { atf_tc_set_md_var(tc, "descr", "Checks that appending a string to " "another one works"); } ATF_TC_BODY(append_fmt, tc) { check_append(atf_dynstr_append_fmt); } ATF_TC(clear); ATF_TC_HEAD(clear, tc) { atf_tc_set_md_var(tc, "descr", "Checks clearing a string"); } ATF_TC_BODY(clear, tc) { atf_dynstr_t str; printf("Clear an empty string\n"); RE(atf_dynstr_init(&str)); atf_dynstr_clear(&str); ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); printf("Clear a non-empty string\n"); RE(atf_dynstr_init_fmt(&str, "Not empty")); ATF_REQUIRE_EQ(atf_dynstr_length(&str), strlen("Not empty")); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Not empty") == 0); atf_dynstr_clear(&str); ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0); ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0); atf_dynstr_fini(&str); } static void check_prepend(atf_error_t (*prepend)(atf_dynstr_t *, const char *, ...)) { const size_t maxlen = 8192; char buf[maxlen + 1]; size_t i; atf_dynstr_t str; printf("Prepending with plain string\n"); buf[0] = '\0'; RE(atf_dynstr_init(&str)); for (i = 0; i < maxlen; i++) { if (strcmp(atf_dynstr_cstring(&str), buf) != 0) { fprintf(stderr, "Failed at iteration %zd\n", i); atf_tc_fail("Failed to prepend character at iteration %zd", i); } memmove(buf + 1, buf, i + 1); if (i % 2 == 0) { RE(prepend(&str, "%s", "a")); buf[0] = 'a'; } else { RE(prepend(&str, "%s", "b")); buf[0] = 'b'; } } atf_dynstr_fini(&str); printf("Prepending with formatted string\n"); buf[0] = '\0'; RE(atf_dynstr_init(&str)); for (i = 0; i < maxlen; i++) { if (strcmp(atf_dynstr_cstring(&str), buf) != 0) { fprintf(stderr, "Failed at iteration %zd\n", i); atf_tc_fail("Failed to prepend character at iteration %zd", i); } memmove(buf + 1, buf, i + 1); if (i % 2 == 0) { RE(prepend(&str, "%s", "a")); buf[0] = 'a'; } else { RE(prepend(&str, "%s", "b")); buf[0] = 'b'; } } atf_dynstr_fini(&str); } static atf_error_t prepend_ap_aux(atf_dynstr_t *str, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_dynstr_prepend_ap(str, fmt, ap); va_end(ap); return err; } ATF_TC(prepend_ap); ATF_TC_HEAD(prepend_ap, tc) { atf_tc_set_md_var(tc, "descr", "Checks that prepending a string to " "another one works"); } ATF_TC_BODY(prepend_ap, tc) { check_prepend(prepend_ap_aux); } ATF_TC(prepend_fmt); ATF_TC_HEAD(prepend_fmt, tc) { atf_tc_set_md_var(tc, "descr", "Checks that prepending a string to " "another one works"); } ATF_TC_BODY(prepend_fmt, tc) { check_prepend(atf_dynstr_prepend_fmt); } /* * Operators. */ ATF_TC(equal_cstring); ATF_TC_HEAD(equal_cstring, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_equal_dynstr_cstring " "function"); } ATF_TC_BODY(equal_cstring, tc) { atf_dynstr_t str; RE(atf_dynstr_init(&str)); ATF_REQUIRE( atf_equal_dynstr_cstring(&str, "")); ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Test")); atf_dynstr_fini(&str); RE(atf_dynstr_init_fmt(&str, "Test")); ATF_REQUIRE( atf_equal_dynstr_cstring(&str, "Test")); ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "")); ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Tes")); ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Test ")); atf_dynstr_fini(&str); } ATF_TC(equal_dynstr); ATF_TC_HEAD(equal_dynstr, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_equal_dynstr_dynstr " "function"); } ATF_TC_BODY(equal_dynstr, tc) { atf_dynstr_t str, str2; RE(atf_dynstr_init(&str)); RE(atf_dynstr_init_fmt(&str2, "Test")); ATF_REQUIRE( atf_equal_dynstr_dynstr(&str, &str)); ATF_REQUIRE(!atf_equal_dynstr_dynstr(&str, &str2)); atf_dynstr_fini(&str2); atf_dynstr_fini(&str); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Constructors and destructors. */ ATF_TP_ADD_TC(tp, init); ATF_TP_ADD_TC(tp, init_ap); ATF_TP_ADD_TC(tp, init_fmt); ATF_TP_ADD_TC(tp, init_raw); ATF_TP_ADD_TC(tp, init_rep); ATF_TP_ADD_TC(tp, init_substr); ATF_TP_ADD_TC(tp, copy); ATF_TP_ADD_TC(tp, fini_disown); /* Getters. */ ATF_TP_ADD_TC(tp, cstring); ATF_TP_ADD_TC(tp, length); ATF_TP_ADD_TC(tp, rfind_ch); /* Modifiers. */ ATF_TP_ADD_TC(tp, append_ap); ATF_TP_ADD_TC(tp, append_fmt); ATF_TP_ADD_TC(tp, clear); ATF_TP_ADD_TC(tp, prepend_ap); ATF_TP_ADD_TC(tp, prepend_fmt); /* Operators. */ ATF_TP_ADD_TC(tp, equal_cstring); ATF_TP_ADD_TC(tp, equal_dynstr); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/list.h0000644000470500017500000001001212271526120020724 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_LIST_H) #define ATF_C_LIST_H #include #include #include #include /* --------------------------------------------------------------------- * The "atf_list_citer" type. * --------------------------------------------------------------------- */ struct atf_list_citer { const struct atf_list *m_list; const void *m_entry; }; typedef struct atf_list_citer atf_list_citer_t; /* Getters. */ const void *atf_list_citer_data(const atf_list_citer_t); atf_list_citer_t atf_list_citer_next(const atf_list_citer_t); /* Operators. */ bool atf_equal_list_citer_list_citer(const atf_list_citer_t, const atf_list_citer_t); /* --------------------------------------------------------------------- * The "atf_list_iter" type. * --------------------------------------------------------------------- */ struct atf_list_iter { struct atf_list *m_list; void *m_entry; }; typedef struct atf_list_iter atf_list_iter_t; /* Getters. */ void *atf_list_iter_data(const atf_list_iter_t); atf_list_iter_t atf_list_iter_next(const atf_list_iter_t); /* Operators. */ bool atf_equal_list_iter_list_iter(const atf_list_iter_t, const atf_list_iter_t); /* --------------------------------------------------------------------- * The "atf_list" type. * --------------------------------------------------------------------- */ struct atf_list { void *m_begin; void *m_end; size_t m_size; }; typedef struct atf_list atf_list_t; /* Constructors and destructors */ atf_error_t atf_list_init(atf_list_t *); void atf_list_fini(atf_list_t *); /* Getters. */ atf_list_iter_t atf_list_begin(atf_list_t *); atf_list_citer_t atf_list_begin_c(const atf_list_t *); atf_list_iter_t atf_list_end(atf_list_t *); atf_list_citer_t atf_list_end_c(const atf_list_t *); void *atf_list_index(atf_list_t *, const size_t); const void *atf_list_index_c(const atf_list_t *, const size_t); size_t atf_list_size(const atf_list_t *); char **atf_list_to_charpp(const atf_list_t *); /* Modifiers. */ atf_error_t atf_list_append(atf_list_t *, void *, bool); void atf_list_append_list(atf_list_t *, atf_list_t *); /* Macros. */ #define atf_list_for_each(iter, list) \ for (iter = atf_list_begin(list); \ !atf_equal_list_iter_list_iter((iter), atf_list_end(list)); \ iter = atf_list_iter_next(iter)) #define atf_list_for_each_c(iter, list) \ for (iter = atf_list_begin_c(list); \ !atf_equal_list_citer_list_citer((iter), atf_list_end_c(list)); \ iter = atf_list_citer_next(iter)) #endif /* ATF_C_LIST_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/user.h0000644000470500017500000000367112271526120020744 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_USER_H) #define ATF_C_USER_H #include #include /* TODO: Would be nice to have an atf_user_t type and transform all of * the functions below to methods. */ /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ uid_t atf_user_euid(void); bool atf_user_is_member_of_group(gid_t); bool atf_user_is_root(void); bool atf_user_is_unprivileged(void); #endif /* !defined(ATF_C_USER_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/list_test.c0000644000470500017500000002244412271526120021772 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "atf-c/utils.h" #include "list.h" #include "test_helpers.h" /* --------------------------------------------------------------------- * Tests for the "atf_list" type. * --------------------------------------------------------------------- */ /* * Constructors and destructors. */ ATF_TC(list_init); ATF_TC_HEAD(list_init, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_init function"); } ATF_TC_BODY(list_init, tc) { atf_list_t list; RE(atf_list_init(&list)); ATF_REQUIRE_EQ(atf_list_size(&list), 0); atf_list_fini(&list); } /* * Getters. */ ATF_TC(list_index); ATF_TC_HEAD(list_index, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_index function"); } ATF_TC_BODY(list_index, tc) { atf_list_t list; int i1 = 1; int i2 = 5; int i3 = 9; RE(atf_list_init(&list)); RE(atf_list_append(&list, &i1, false)); RE(atf_list_append(&list, &i2, false)); RE(atf_list_append(&list, &i3, false)); ATF_CHECK_EQ(*(int *)atf_list_index(&list, 0), 1); ATF_CHECK_EQ(*(int *)atf_list_index(&list, 1), 5); ATF_CHECK_EQ(*(int *)atf_list_index(&list, 2), 9); atf_list_fini(&list); } ATF_TC(list_index_c); ATF_TC_HEAD(list_index_c, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_index_c function"); } ATF_TC_BODY(list_index_c, tc) { atf_list_t list; int i1 = 1; int i2 = 5; int i3 = 9; RE(atf_list_init(&list)); RE(atf_list_append(&list, &i1, false)); RE(atf_list_append(&list, &i2, false)); RE(atf_list_append(&list, &i3, false)); ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 0), 1); ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 1), 5); ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 2), 9); atf_list_fini(&list); } ATF_TC_WITHOUT_HEAD(list_to_charpp_empty); ATF_TC_BODY(list_to_charpp_empty, tc) { atf_list_t list; char **array; RE(atf_list_init(&list)); ATF_REQUIRE((array = atf_list_to_charpp(&list)) != NULL); atf_list_fini(&list); ATF_CHECK_EQ(NULL, array[0]); atf_utils_free_charpp(array); } ATF_TC_WITHOUT_HEAD(list_to_charpp_some); ATF_TC_BODY(list_to_charpp_some, tc) { atf_list_t list; char **array; char s1[] = "one"; char s2[] = "two"; char s3[] = "three"; RE(atf_list_init(&list)); RE(atf_list_append(&list, s1, false)); RE(atf_list_append(&list, s2, false)); RE(atf_list_append(&list, s3, false)); ATF_REQUIRE((array = atf_list_to_charpp(&list)) != NULL); atf_list_fini(&list); ATF_CHECK_STREQ("one", array[0]); ATF_CHECK_STREQ("two", array[1]); ATF_CHECK_STREQ("three", array[2]); ATF_CHECK_EQ(NULL, array[3]); atf_utils_free_charpp(array); } /* * Modifiers. */ ATF_TC(list_append); ATF_TC_HEAD(list_append, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_append function"); } ATF_TC_BODY(list_append, tc) { atf_list_t list; size_t i; char buf[] = "Test string"; RE(atf_list_init(&list)); for (i = 0; i < 1024; i++) { ATF_REQUIRE_EQ(atf_list_size(&list), i); RE(atf_list_append(&list, buf, false)); } atf_list_fini(&list); } ATF_TC(list_append_list); ATF_TC_HEAD(list_append_list, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_append_list " "function"); } ATF_TC_BODY(list_append_list, tc) { { atf_list_t l1, l2; RE(atf_list_init(&l1)); RE(atf_list_init(&l2)); atf_list_append_list(&l1, &l2); ATF_CHECK_EQ(atf_list_size(&l1), 0); atf_list_fini(&l1); } { atf_list_t l1, l2; int item = 5; RE(atf_list_init(&l1)); RE(atf_list_append(&l1, &item, false)); RE(atf_list_init(&l2)); atf_list_append_list(&l1, &l2); ATF_CHECK_EQ(atf_list_size(&l1), 1); ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item); atf_list_fini(&l1); } { atf_list_t l1, l2; int item = 5; RE(atf_list_init(&l1)); RE(atf_list_init(&l2)); RE(atf_list_append(&l2, &item, false)); atf_list_append_list(&l1, &l2); ATF_CHECK_EQ(atf_list_size(&l1), 1); ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item); atf_list_fini(&l1); } { atf_list_t l1, l2; int item1 = 5; int item2 = 9; RE(atf_list_init(&l1)); RE(atf_list_append(&l1, &item1, false)); RE(atf_list_init(&l2)); RE(atf_list_append(&l2, &item2, false)); atf_list_append_list(&l1, &l2); ATF_CHECK_EQ(atf_list_size(&l1), 2); ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item1); ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 1), item2); atf_list_fini(&l1); } { atf_list_t l1, l2; atf_list_citer_t end1, end2; RE(atf_list_init(&l1)); RE(atf_list_init(&l2)); end1 = atf_list_end_c(&l1); end2 = atf_list_end_c(&l2); /* XXX Shouldn't query m_entry here. */ ATF_CHECK(end1.m_entry != end2.m_entry); atf_list_append_list(&l1, &l2); ATF_CHECK(atf_list_end_c(&l1).m_entry == end2.m_entry); atf_list_fini(&l1); } } /* * Macros. */ ATF_TC(list_for_each); ATF_TC_HEAD(list_for_each, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_for_each macro"); } ATF_TC_BODY(list_for_each, tc) { atf_list_t list; atf_list_iter_t iter; size_t count, i, size; int nums[10]; printf("Iterating over empty list\n"); RE(atf_list_init(&list)); count = 0; atf_list_for_each(iter, &list) { count++; printf("Item count is now %zd\n", count); } ATF_REQUIRE_EQ(count, 0); atf_list_fini(&list); for (size = 0; size <= 10; size++) { printf("Iterating over list of %zd elements\n", size); RE(atf_list_init(&list)); for (i = 0; i < size; i++) { nums[i] = i + 1; RE(atf_list_append(&list, &nums[i], false)); } count = 0; atf_list_for_each(iter, &list) { printf("Retrieved item: %d\n", *(int *)atf_list_iter_data(iter)); count++; } ATF_REQUIRE_EQ(count, size); atf_list_fini(&list); } } ATF_TC(list_for_each_c); ATF_TC_HEAD(list_for_each_c, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_list_for_each_c macro"); } ATF_TC_BODY(list_for_each_c, tc) { atf_list_t list; atf_list_citer_t iter; size_t count, i, size; int nums[10]; printf("Iterating over empty list\n"); RE(atf_list_init(&list)); count = 0; atf_list_for_each_c(iter, &list) { count++; printf("Item count is now %zd\n", count); } ATF_REQUIRE_EQ(count, 0); atf_list_fini(&list); for (size = 0; size <= 10; size++) { printf("Iterating over list of %zd elements\n", size); RE(atf_list_init(&list)); for (i = 0; i < size; i++) { nums[i] = i + 1; RE(atf_list_append(&list, &nums[i], false)); } count = 0; atf_list_for_each_c(iter, &list) { printf("Retrieved item: %d\n", *(const int *)atf_list_citer_data(iter)); count++; } ATF_REQUIRE_EQ(count, size); atf_list_fini(&list); } } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Constructors and destructors. */ ATF_TP_ADD_TC(tp, list_init); /* Getters. */ ATF_TP_ADD_TC(tp, list_index); ATF_TP_ADD_TC(tp, list_index_c); ATF_TP_ADD_TC(tp, list_to_charpp_empty); ATF_TP_ADD_TC(tp, list_to_charpp_some); /* Modifiers. */ ATF_TP_ADD_TC(tp, list_append); ATF_TP_ADD_TC(tp, list_append_list); /* Macros. */ ATF_TP_ADD_TC(tp, list_for_each); ATF_TP_ADD_TC(tp, list_for_each_c); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/process_test.c0000644000470500017500000010076512271526120022500 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "atf-c/defs.h" #include "process.h" #include "sanity.h" #include "test_helpers.h" atf_error_t atf_process_status_init(atf_process_status_t *, int); /* --------------------------------------------------------------------- * Auxiliary functions for testing of 'atf_process_fork'. * --------------------------------------------------------------------- */ /* * Testing of atf_process_fork is quite messy. We want to be able to test * all the possible combinations of stdout and stderr behavior to ensure * that the streams are manipulated correctly. * * To do this, the do_fork function is a wrapper for atf_process_fork that * issues stream-specific hooks before fork, while the child is running and * after the child terminates. We then provide test cases that just call * do_fork with different hooks. * * The hooks are described by base_stream, and we then have one *_stream * type for ever possible stream behavior. */ enum out_type { stdout_type, stderr_type }; struct base_stream { void (*init)(void *); void (*process)(void *, atf_process_child_t *); void (*fini)(void *); /* m_sb is initialized by subclasses that need it, but all consumers * must use m_sb_ptr, which may or may not point to m_sb. This allows * us to test the interface with a NULL value, which triggers a * default behavior. */ atf_process_stream_t m_sb; atf_process_stream_t *m_sb_ptr; enum out_type m_type; }; #define BASE_STREAM(ihook, phook, fhook, type) \ { .init = ihook, \ .process = phook, \ .fini = fhook, \ .m_type = type } static void check_file(const enum out_type type) { switch (type) { case stdout_type: ATF_CHECK(atf_utils_grep_file("stdout: msg", "stdout")); ATF_CHECK(!atf_utils_grep_file("stderr: msg", "stdout")); break; case stderr_type: ATF_CHECK(atf_utils_grep_file("stderr: msg", "stderr")); ATF_CHECK(!atf_utils_grep_file("stdout: msg", "stderr")); break; default: UNREACHABLE; } } struct capture_stream { struct base_stream m_base; char *m_msg; }; #define CAPTURE_STREAM(type) \ { .m_base = BASE_STREAM(capture_stream_init, \ capture_stream_process, \ capture_stream_fini, \ type) } static void capture_stream_init(void *v) { struct capture_stream *s = v; s->m_base.m_sb_ptr = &s->m_base.m_sb; RE(atf_process_stream_init_capture(&s->m_base.m_sb)); s->m_msg = NULL; } static void capture_stream_process(void *v, atf_process_child_t *c) { struct capture_stream *s = v; switch (s->m_base.m_type) { case stdout_type: s->m_msg = atf_utils_readline(atf_process_child_stdout(c)); break; case stderr_type: s->m_msg = atf_utils_readline(atf_process_child_stderr(c)); break; default: UNREACHABLE; } } static void capture_stream_fini(void *v) { struct capture_stream *s = v; switch (s->m_base.m_type) { case stdout_type: ATF_CHECK(atf_utils_grep_string("stdout: msg", s->m_msg)); ATF_CHECK(!atf_utils_grep_string("stderr: msg", s->m_msg)); break; case stderr_type: ATF_CHECK(!atf_utils_grep_string("stdout: msg", s->m_msg)); ATF_CHECK(atf_utils_grep_string("stderr: msg", s->m_msg)); break; default: UNREACHABLE; } free(s->m_msg); atf_process_stream_fini(&s->m_base.m_sb); } struct connect_stream { struct base_stream m_base; int m_fd; }; #define CONNECT_STREAM(type) \ { .m_base = BASE_STREAM(connect_stream_init, \ NULL, \ connect_stream_fini, \ type) } static void connect_stream_init(void *v) { struct connect_stream *s = v; int src_fd; switch (s->m_base.m_type) { case stdout_type: src_fd = STDOUT_FILENO; s->m_fd = open("stdout", O_WRONLY | O_CREAT | O_TRUNC, 0644); break; case stderr_type: src_fd = STDERR_FILENO; s->m_fd = open("stderr", O_WRONLY | O_CREAT | O_TRUNC, 0644); break; default: UNREACHABLE; src_fd = -1; } ATF_REQUIRE(s->m_fd != -1); s->m_base.m_sb_ptr = &s->m_base.m_sb; RE(atf_process_stream_init_connect(&s->m_base.m_sb, src_fd, s->m_fd)); } static void connect_stream_fini(void *v) { struct connect_stream *s = v; ATF_REQUIRE(close(s->m_fd) != -1); atf_process_stream_fini(&s->m_base.m_sb); check_file(s->m_base.m_type); } struct inherit_stream { struct base_stream m_base; int m_fd; int m_old_fd; }; #define INHERIT_STREAM(type) \ { .m_base = BASE_STREAM(inherit_stream_init, \ NULL, \ inherit_stream_fini, \ type) } static void inherit_stream_init(void *v) { struct inherit_stream *s = v; const char *name; s->m_base.m_sb_ptr = &s->m_base.m_sb; RE(atf_process_stream_init_inherit(&s->m_base.m_sb)); switch (s->m_base.m_type) { case stdout_type: s->m_fd = STDOUT_FILENO; name = "stdout"; break; case stderr_type: s->m_fd = STDERR_FILENO; name = "stderr"; break; default: UNREACHABLE; name = NULL; } s->m_old_fd = dup(s->m_fd); ATF_REQUIRE(s->m_old_fd != -1); ATF_REQUIRE(close(s->m_fd) != -1); ATF_REQUIRE_EQ(open(name, O_WRONLY | O_CREAT | O_TRUNC, 0644), s->m_fd); } static void inherit_stream_fini(void *v) { struct inherit_stream *s = v; ATF_REQUIRE(dup2(s->m_old_fd, s->m_fd) != -1); ATF_REQUIRE(close(s->m_old_fd) != -1); atf_process_stream_fini(&s->m_base.m_sb); check_file(s->m_base.m_type); } #define default_stream inherit_stream #define DEFAULT_STREAM(type) \ { .m_base = BASE_STREAM(default_stream_init, \ NULL, \ default_stream_fini, \ type) } static void default_stream_init(void *v) { struct inherit_stream *s = v; inherit_stream_init(v); s->m_base.m_sb_ptr = NULL; } static void default_stream_fini(void *v) { inherit_stream_fini(v); } struct redirect_fd_stream { struct base_stream m_base; int m_fd; }; #define REDIRECT_FD_STREAM(type) \ { .m_base = BASE_STREAM(redirect_fd_stream_init, \ NULL, \ redirect_fd_stream_fini, \ type) } static void redirect_fd_stream_init(void *v) { struct redirect_fd_stream *s = v; switch (s->m_base.m_type) { case stdout_type: s->m_fd = open("stdout", O_WRONLY | O_CREAT | O_TRUNC, 0644); break; case stderr_type: s->m_fd = open("stderr", O_WRONLY | O_CREAT | O_TRUNC, 0644); break; default: UNREACHABLE; } ATF_REQUIRE(s->m_fd != -1); s->m_base.m_sb_ptr = &s->m_base.m_sb; RE(atf_process_stream_init_redirect_fd(&s->m_base.m_sb, s->m_fd)); } static void redirect_fd_stream_fini(void *v) { struct redirect_fd_stream *s = v; ATF_REQUIRE(close(s->m_fd) != -1); atf_process_stream_fini(&s->m_base.m_sb); check_file(s->m_base.m_type); } struct redirect_path_stream { struct base_stream m_base; atf_fs_path_t m_path; }; #define REDIRECT_PATH_STREAM(type) \ { .m_base = BASE_STREAM(redirect_path_stream_init, \ NULL, \ redirect_path_stream_fini, \ type) } static void redirect_path_stream_init(void *v) { struct redirect_path_stream *s = v; switch (s->m_base.m_type) { case stdout_type: RE(atf_fs_path_init_fmt(&s->m_path, "stdout")); break; case stderr_type: RE(atf_fs_path_init_fmt(&s->m_path, "stderr")); break; default: UNREACHABLE; } s->m_base.m_sb_ptr = &s->m_base.m_sb; RE(atf_process_stream_init_redirect_path(&s->m_base.m_sb, &s->m_path)); } static void redirect_path_stream_fini(void *v) { struct redirect_path_stream *s = v; atf_process_stream_fini(&s->m_base.m_sb); atf_fs_path_fini(&s->m_path); check_file(s->m_base.m_type); } static void child_print(void *) ATF_DEFS_ATTRIBUTE_NORETURN; struct child_print_data { const char *m_msg; }; static void child_print(void *v) { struct child_print_data *cpd = v; fprintf(stdout, "stdout: %s\n", cpd->m_msg); fprintf(stderr, "stderr: %s\n", cpd->m_msg); exit(EXIT_SUCCESS); } static void do_fork(const struct base_stream *outfs, void *out, const struct base_stream *errfs, void *err) { atf_process_child_t child; atf_process_status_t status; struct child_print_data cpd = { "msg" }; outfs->init(out); errfs->init(err); RE(atf_process_fork(&child, child_print, outfs->m_sb_ptr, errfs->m_sb_ptr, &cpd)); if (outfs->process != NULL) outfs->process(out, &child); if (errfs->process != NULL) errfs->process(err, &child); RE(atf_process_child_wait(&child, &status)); outfs->fini(out); errfs->fini(err); atf_process_status_fini(&status); } /* --------------------------------------------------------------------- * Test cases for the "stream" type. * --------------------------------------------------------------------- */ ATF_TC(stream_init_capture); ATF_TC_HEAD(stream_init_capture, tc) { atf_tc_set_md_var(tc, "descr", "Tests the " "atf_process_stream_init_capture function"); } ATF_TC_BODY(stream_init_capture, tc) { atf_process_stream_t sb; RE(atf_process_stream_init_capture(&sb)); ATF_CHECK_EQ(atf_process_stream_type(&sb), atf_process_stream_type_capture); atf_process_stream_fini(&sb); } ATF_TC(stream_init_connect); ATF_TC_HEAD(stream_init_connect, tc) { atf_tc_set_md_var(tc, "descr", "Tests the " "atf_process_stream_init_connect function"); } ATF_TC_BODY(stream_init_connect, tc) { atf_process_stream_t sb; RE(atf_process_stream_init_connect(&sb, 1, 2)); ATF_CHECK_EQ(atf_process_stream_type(&sb), atf_process_stream_type_connect); atf_process_stream_fini(&sb); } ATF_TC(stream_init_inherit); ATF_TC_HEAD(stream_init_inherit, tc) { atf_tc_set_md_var(tc, "descr", "Tests the " "atf_process_stream_init_inherit function"); } ATF_TC_BODY(stream_init_inherit, tc) { atf_process_stream_t sb; RE(atf_process_stream_init_inherit(&sb)); ATF_CHECK_EQ(atf_process_stream_type(&sb), atf_process_stream_type_inherit); atf_process_stream_fini(&sb); } ATF_TC(stream_init_redirect_fd); ATF_TC_HEAD(stream_init_redirect_fd, tc) { atf_tc_set_md_var(tc, "descr", "Tests the " "atf_process_stream_init_redirect_fd function"); } ATF_TC_BODY(stream_init_redirect_fd, tc) { atf_process_stream_t sb; RE(atf_process_stream_init_redirect_fd(&sb, 1)); ATF_CHECK_EQ(atf_process_stream_type(&sb), atf_process_stream_type_redirect_fd); atf_process_stream_fini(&sb); } ATF_TC(stream_init_redirect_path); ATF_TC_HEAD(stream_init_redirect_path, tc) { atf_tc_set_md_var(tc, "descr", "Tests the " "atf_process_stream_init_redirect_path function"); } ATF_TC_BODY(stream_init_redirect_path, tc) { atf_process_stream_t sb; atf_fs_path_t path; RE(atf_fs_path_init_fmt(&path, "foo")); RE(atf_process_stream_init_redirect_path(&sb, &path)); ATF_CHECK_EQ(atf_process_stream_type(&sb), atf_process_stream_type_redirect_path); atf_process_stream_fini(&sb); atf_fs_path_fini(&path); } /* --------------------------------------------------------------------- * Test cases for the "status" type. * --------------------------------------------------------------------- */ static void child_exit_success(void) ATF_DEFS_ATTRIBUTE_NORETURN; static void child_exit_failure(void) ATF_DEFS_ATTRIBUTE_NORETURN; static void child_sigkill(void) ATF_DEFS_ATTRIBUTE_NORETURN; static void child_sigquit(void) ATF_DEFS_ATTRIBUTE_NORETURN; static void child_sigterm(void) ATF_DEFS_ATTRIBUTE_NORETURN; void child_exit_success(void) { exit(EXIT_SUCCESS); } void child_exit_failure(void) { exit(EXIT_FAILURE); } void child_sigkill(void) { kill(getpid(), SIGKILL); abort(); } void child_sigquit(void) { kill(getpid(), SIGQUIT); abort(); } void child_sigterm(void) { kill(getpid(), SIGTERM); abort(); } static int fork_and_wait_child(void (*child_func)(void)) { pid_t pid; int status; pid = fork(); ATF_REQUIRE(pid != -1); if (pid == 0) { status = 0; /* Silence compiler warnings */ child_func(); UNREACHABLE; } else { ATF_REQUIRE(waitpid(pid, &status, 0) != 0); } return status; } ATF_TC(status_exited); ATF_TC_HEAD(status_exited, tc) { atf_tc_set_md_var(tc, "descr", "Tests the status type for processes " "that exit cleanly"); } ATF_TC_BODY(status_exited, tc) { { const int rawstatus = fork_and_wait_child(child_exit_success); atf_process_status_t s; RE(atf_process_status_init(&s, rawstatus)); ATF_CHECK(atf_process_status_exited(&s)); ATF_CHECK_EQ(atf_process_status_exitstatus(&s), EXIT_SUCCESS); ATF_CHECK(!atf_process_status_signaled(&s)); atf_process_status_fini(&s); } { const int rawstatus = fork_and_wait_child(child_exit_failure); atf_process_status_t s; RE(atf_process_status_init(&s, rawstatus)); ATF_CHECK(atf_process_status_exited(&s)); ATF_CHECK_EQ(atf_process_status_exitstatus(&s), EXIT_FAILURE); ATF_CHECK(!atf_process_status_signaled(&s)); atf_process_status_fini(&s); } } ATF_TC(status_signaled); ATF_TC_HEAD(status_signaled, tc) { atf_tc_set_md_var(tc, "descr", "Tests the status type for processes " "that end due to a signal"); } ATF_TC_BODY(status_signaled, tc) { { const int rawstatus = fork_and_wait_child(child_sigkill); atf_process_status_t s; RE(atf_process_status_init(&s, rawstatus)); ATF_CHECK(!atf_process_status_exited(&s)); ATF_CHECK(atf_process_status_signaled(&s)); ATF_CHECK_EQ(atf_process_status_termsig(&s), SIGKILL); ATF_CHECK(!atf_process_status_coredump(&s)); atf_process_status_fini(&s); } { const int rawstatus = fork_and_wait_child(child_sigterm); atf_process_status_t s; RE(atf_process_status_init(&s, rawstatus)); ATF_CHECK(!atf_process_status_exited(&s)); ATF_CHECK(atf_process_status_signaled(&s)); ATF_CHECK_EQ(atf_process_status_termsig(&s), SIGTERM); ATF_CHECK(!atf_process_status_coredump(&s)); atf_process_status_fini(&s); } } ATF_TC(status_coredump); ATF_TC_HEAD(status_coredump, tc) { atf_tc_set_md_var(tc, "descr", "Tests the status type for processes " "that crash"); } ATF_TC_BODY(status_coredump, tc) { struct rlimit rl; rl.rlim_cur = RLIM_INFINITY; rl.rlim_max = RLIM_INFINITY; if (setrlimit(RLIMIT_CORE, &rl) == -1) atf_tc_skip("Cannot unlimit the core file size; check limits " "manually"); const int rawstatus = fork_and_wait_child(child_sigquit); atf_process_status_t s; RE(atf_process_status_init(&s, rawstatus)); ATF_CHECK(!atf_process_status_exited(&s)); ATF_CHECK(atf_process_status_signaled(&s)); ATF_CHECK_EQ(atf_process_status_termsig(&s), SIGQUIT); ATF_CHECK(atf_process_status_coredump(&s)); atf_process_status_fini(&s); } /* --------------------------------------------------------------------- * Test cases for the "child" type. * --------------------------------------------------------------------- */ static void child_report_pid(void *) ATF_DEFS_ATTRIBUTE_NORETURN; static void child_report_pid(void *v ATF_DEFS_ATTRIBUTE_UNUSED) { const pid_t pid = getpid(); if (write(STDOUT_FILENO, &pid, sizeof(pid)) != sizeof(pid)) abort(); fprintf(stderr, "Reporting %d to parent\n", (int)getpid()); exit(EXIT_SUCCESS); } ATF_TC(child_pid); ATF_TC_HEAD(child_pid, tc) { atf_tc_set_md_var(tc, "descr", "Tests the correctness of the pid " "stored in the child type"); } ATF_TC_BODY(child_pid, tc) { atf_process_stream_t outsb, errsb; atf_process_child_t child; atf_process_status_t status; pid_t pid; RE(atf_process_stream_init_capture(&outsb)); RE(atf_process_stream_init_inherit(&errsb)); RE(atf_process_fork(&child, child_report_pid, &outsb, &errsb, NULL)); ATF_CHECK_EQ(read(atf_process_child_stdout(&child), &pid, sizeof(pid)), sizeof(pid)); printf("Expected PID: %d\n", (int)atf_process_child_pid(&child)); printf("Actual PID: %d\n", (int)pid); ATF_CHECK_EQ(atf_process_child_pid(&child), pid); RE(atf_process_child_wait(&child, &status)); atf_process_status_fini(&status); atf_process_stream_fini(&outsb); atf_process_stream_fini(&errsb); } static void child_loop(void *v ATF_DEFS_ATTRIBUTE_UNUSED) { for (;;) sleep(1); } static void nop_signal(int sig ATF_DEFS_ATTRIBUTE_UNUSED) { } static void child_spawn_loop_and_wait_eintr(void *v ATF_DEFS_ATTRIBUTE_UNUSED) { atf_process_child_t child; atf_process_status_t status; struct sigaction sighup, old_sighup; #define RE_ABORT(expr) \ do { \ atf_error_t _aux_err = expr; \ if (atf_is_error(_aux_err)) { \ atf_error_free(_aux_err); \ abort(); \ } \ } while (0) { atf_process_stream_t outsb, errsb; RE_ABORT(atf_process_stream_init_capture(&outsb)); RE_ABORT(atf_process_stream_init_inherit(&errsb)); RE_ABORT(atf_process_fork(&child, child_loop, &outsb, &errsb, NULL)); atf_process_stream_fini(&outsb); atf_process_stream_fini(&errsb); } sighup.sa_handler = nop_signal; sigemptyset(&sighup.sa_mask); sighup.sa_flags = 0; if (sigaction(SIGHUP, &sighup, &old_sighup) == -1) abort(); printf("waiting\n"); fflush(stdout); fprintf(stderr, "Child entering wait(2)\n"); atf_error_t err = atf_process_child_wait(&child, &status); fprintf(stderr, "Child's wait(2) terminated\n"); if (!atf_is_error(err)) { fprintf(stderr, "wait completed successfully (not interrupted)\n"); abort(); } if (!atf_error_is(err, "libc")) { fprintf(stderr, "wait did not raise libc_error\n"); abort(); } if (atf_libc_error_code(err) != EINTR) { fprintf(stderr, "libc_error is not EINTR\n"); abort(); } atf_error_free(err); sigaction(SIGHUP, &old_sighup, NULL); fprintf(stderr, "Child is killing subchild\n"); kill(atf_process_child_pid(&child), SIGTERM); RE_ABORT(atf_process_child_wait(&child, &status)); atf_process_status_fini(&status); #undef RE_ABORT exit(EXIT_SUCCESS); } ATF_TC(child_wait_eintr); ATF_TC_HEAD(child_wait_eintr, tc) { atf_tc_set_md_var(tc, "descr", "Tests the interruption of the wait " "method by an external signal, and the return of " "an EINTR error"); atf_tc_set_md_var(tc, "timeout", "30"); } ATF_TC_BODY(child_wait_eintr, tc) { atf_process_child_t child; atf_process_status_t status; { atf_process_stream_t outsb, errsb; RE(atf_process_stream_init_capture(&outsb)); RE(atf_process_stream_init_inherit(&errsb)); RE(atf_process_fork(&child, child_spawn_loop_and_wait_eintr, &outsb, &errsb, NULL)); atf_process_stream_fini(&outsb); atf_process_stream_fini(&errsb); } { /* Wait until the child process performs the wait call. This is * racy, because the message we get from it is sent *before* * doing the real system call... but I can't figure any other way * to do this. */ char buf[16]; printf("Waiting for child to issue wait(2)\n"); ATF_REQUIRE(read(atf_process_child_stdout(&child), buf, sizeof(buf)) > 0); sleep(1); } printf("Interrupting child's wait(2) call\n"); kill(atf_process_child_pid(&child), SIGHUP); printf("Waiting for child's completion\n"); RE(atf_process_child_wait(&child, &status)); ATF_REQUIRE(atf_process_status_exited(&status)); ATF_REQUIRE_EQ(atf_process_status_exitstatus(&status), EXIT_SUCCESS); atf_process_status_fini(&status); } /* --------------------------------------------------------------------- * Tests cases for the free functions. * --------------------------------------------------------------------- */ static void do_exec(const atf_tc_t *tc, const char *helper_name, atf_process_status_t *s, void (*prehook)(void)) { atf_fs_path_t process_helpers; const char *argv[3]; get_process_helpers_path(tc, true, &process_helpers); argv[0] = atf_fs_path_cstring(&process_helpers); argv[1] = helper_name; argv[2] = NULL; printf("Executing %s %s\n", argv[0], argv[1]); RE(atf_process_exec_array(s, &process_helpers, argv, NULL, NULL, prehook)); atf_fs_path_fini(&process_helpers); } static void check_line(int fd, const char *exp) { char *line = atf_utils_readline(fd); ATF_CHECK(line != NULL); ATF_CHECK_STREQ_MSG(exp, line, "read: '%s', expected: '%s'", line, exp); free(line); } ATF_TC(exec_failure); ATF_TC_HEAD(exec_failure, tc) { atf_tc_set_md_var(tc, "descr", "Tests execing a command"); } ATF_TC_BODY(exec_failure, tc) { atf_process_status_t status; do_exec(tc, "exit-failure", &status, NULL); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), EXIT_FAILURE); atf_process_status_fini(&status); } ATF_TC(exec_list); ATF_TC_HEAD(exec_list, tc) { atf_tc_set_md_var(tc, "descr", "Tests execing a command"); } ATF_TC_BODY(exec_list, tc) { atf_fs_path_t process_helpers; atf_list_t argv; atf_process_status_t status; RE(atf_list_init(&argv)); get_process_helpers_path(tc, true, &process_helpers); atf_list_append(&argv, strdup(atf_fs_path_cstring(&process_helpers)), true); atf_list_append(&argv, strdup("echo"), true); atf_list_append(&argv, strdup("test-message"), true); { atf_fs_path_t outpath; atf_process_stream_t outsb; RE(atf_fs_path_init_fmt(&outpath, "stdout")); RE(atf_process_stream_init_redirect_path(&outsb, &outpath)); RE(atf_process_exec_list(&status, &process_helpers, &argv, &outsb, NULL, NULL)); atf_process_stream_fini(&outsb); atf_fs_path_fini(&outpath); } atf_list_fini(&argv); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), EXIT_SUCCESS); { int fd = open("stdout", O_RDONLY); ATF_CHECK(fd != -1); check_line(fd, "test-message"); close(fd); } atf_process_status_fini(&status); atf_fs_path_fini(&process_helpers); } static void exit_early(void) { exit(80); } ATF_TC(exec_prehook); ATF_TC_HEAD(exec_prehook, tc) { atf_tc_set_md_var(tc, "descr", "Tests execing a command with a prehook"); } ATF_TC_BODY(exec_prehook, tc) { atf_process_status_t status; do_exec(tc, "exit-success", &status, exit_early); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), 80); atf_process_status_fini(&status); } ATF_TC(exec_success); ATF_TC_HEAD(exec_success, tc) { atf_tc_set_md_var(tc, "descr", "Tests execing a command"); } ATF_TC_BODY(exec_success, tc) { atf_process_status_t status; do_exec(tc, "exit-success", &status, NULL); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), EXIT_SUCCESS); atf_process_status_fini(&status); } static const int exit_v_null = 1; static const int exit_v_notnull = 2; static void child_cookie(void *v) { if (v == NULL) exit(exit_v_null); else exit(exit_v_notnull); UNREACHABLE; } ATF_TC(fork_cookie); ATF_TC_HEAD(fork_cookie, tc) { atf_tc_set_md_var(tc, "descr", "Tests forking a child, with " "a null and non-null data cookie"); } ATF_TC_BODY(fork_cookie, tc) { atf_process_stream_t outsb, errsb; RE(atf_process_stream_init_inherit(&outsb)); RE(atf_process_stream_init_inherit(&errsb)); { atf_process_child_t child; atf_process_status_t status; RE(atf_process_fork(&child, child_cookie, &outsb, &errsb, NULL)); RE(atf_process_child_wait(&child, &status)); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), exit_v_null); atf_process_status_fini(&status); } { atf_process_child_t child; atf_process_status_t status; int dummy_int; RE(atf_process_fork(&child, child_cookie, &outsb, &errsb, &dummy_int)); RE(atf_process_child_wait(&child, &status)); ATF_CHECK(atf_process_status_exited(&status)); ATF_CHECK_EQ(atf_process_status_exitstatus(&status), exit_v_notnull); atf_process_status_fini(&status); } atf_process_stream_fini(&errsb); atf_process_stream_fini(&outsb); } #define TC_FORK_STREAMS(outlc, outuc, errlc, erruc) \ ATF_TC(fork_out_ ## outlc ## _err_ ## errlc); \ ATF_TC_HEAD(fork_out_ ## outlc ## _err_ ## errlc, tc) \ { \ atf_tc_set_md_var(tc, "descr", "Tests forking a child, with " \ "stdout " #outlc " and stderr " #errlc); \ } \ ATF_TC_BODY(fork_out_ ## outlc ## _err_ ## errlc, tc) \ { \ struct outlc ## _stream out = outuc ## _STREAM(stdout_type); \ struct errlc ## _stream err = erruc ## _STREAM(stderr_type); \ do_fork(&out.m_base, &out, &err.m_base, &err); \ } TC_FORK_STREAMS(capture, CAPTURE, capture, CAPTURE); TC_FORK_STREAMS(capture, CAPTURE, connect, CONNECT); TC_FORK_STREAMS(capture, CAPTURE, default, DEFAULT); TC_FORK_STREAMS(capture, CAPTURE, inherit, INHERIT); TC_FORK_STREAMS(capture, CAPTURE, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(capture, CAPTURE, redirect_path, REDIRECT_PATH); TC_FORK_STREAMS(connect, CONNECT, capture, CAPTURE); TC_FORK_STREAMS(connect, CONNECT, connect, CONNECT); TC_FORK_STREAMS(connect, CONNECT, default, DEFAULT); TC_FORK_STREAMS(connect, CONNECT, inherit, INHERIT); TC_FORK_STREAMS(connect, CONNECT, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(connect, CONNECT, redirect_path, REDIRECT_PATH); TC_FORK_STREAMS(default, DEFAULT, capture, CAPTURE); TC_FORK_STREAMS(default, DEFAULT, connect, CONNECT); TC_FORK_STREAMS(default, DEFAULT, default, DEFAULT); TC_FORK_STREAMS(default, DEFAULT, inherit, INHERIT); TC_FORK_STREAMS(default, DEFAULT, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(default, DEFAULT, redirect_path, REDIRECT_PATH); TC_FORK_STREAMS(inherit, INHERIT, capture, CAPTURE); TC_FORK_STREAMS(inherit, INHERIT, connect, CONNECT); TC_FORK_STREAMS(inherit, INHERIT, default, DEFAULT); TC_FORK_STREAMS(inherit, INHERIT, inherit, INHERIT); TC_FORK_STREAMS(inherit, INHERIT, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(inherit, INHERIT, redirect_path, REDIRECT_PATH); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, capture, CAPTURE); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, connect, CONNECT); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, default, DEFAULT); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, inherit, INHERIT); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(redirect_fd, REDIRECT_FD, redirect_path, REDIRECT_PATH); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, capture, CAPTURE); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, connect, CONNECT); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, default, DEFAULT); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, inherit, INHERIT); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, redirect_fd, REDIRECT_FD); TC_FORK_STREAMS(redirect_path, REDIRECT_PATH, redirect_path, REDIRECT_PATH); #undef TC_FORK_STREAMS /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the tests for the "stream" type. */ ATF_TP_ADD_TC(tp, stream_init_capture); ATF_TP_ADD_TC(tp, stream_init_connect); ATF_TP_ADD_TC(tp, stream_init_inherit); ATF_TP_ADD_TC(tp, stream_init_redirect_fd); ATF_TP_ADD_TC(tp, stream_init_redirect_path); /* Add the tests for the "status" type. */ ATF_TP_ADD_TC(tp, status_exited); ATF_TP_ADD_TC(tp, status_signaled); ATF_TP_ADD_TC(tp, status_coredump); /* Add the tests for the "child" type. */ ATF_TP_ADD_TC(tp, child_pid); ATF_TP_ADD_TC(tp, child_wait_eintr); /* Add the tests for the free functions. */ ATF_TP_ADD_TC(tp, exec_failure); ATF_TP_ADD_TC(tp, exec_list); ATF_TP_ADD_TC(tp, exec_prehook); ATF_TP_ADD_TC(tp, exec_success); ATF_TP_ADD_TC(tp, fork_cookie); ATF_TP_ADD_TC(tp, fork_out_capture_err_capture); ATF_TP_ADD_TC(tp, fork_out_capture_err_connect); ATF_TP_ADD_TC(tp, fork_out_capture_err_default); ATF_TP_ADD_TC(tp, fork_out_capture_err_inherit); ATF_TP_ADD_TC(tp, fork_out_capture_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_capture_err_redirect_path); ATF_TP_ADD_TC(tp, fork_out_connect_err_capture); ATF_TP_ADD_TC(tp, fork_out_connect_err_connect); ATF_TP_ADD_TC(tp, fork_out_connect_err_default); ATF_TP_ADD_TC(tp, fork_out_connect_err_inherit); ATF_TP_ADD_TC(tp, fork_out_connect_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_connect_err_redirect_path); ATF_TP_ADD_TC(tp, fork_out_default_err_capture); ATF_TP_ADD_TC(tp, fork_out_default_err_connect); ATF_TP_ADD_TC(tp, fork_out_default_err_default); ATF_TP_ADD_TC(tp, fork_out_default_err_inherit); ATF_TP_ADD_TC(tp, fork_out_default_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_default_err_redirect_path); ATF_TP_ADD_TC(tp, fork_out_inherit_err_capture); ATF_TP_ADD_TC(tp, fork_out_inherit_err_connect); ATF_TP_ADD_TC(tp, fork_out_inherit_err_default); ATF_TP_ADD_TC(tp, fork_out_inherit_err_inherit); ATF_TP_ADD_TC(tp, fork_out_inherit_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_inherit_err_redirect_path); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_capture); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_connect); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_default); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_inherit); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_redirect_fd_err_redirect_path); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_capture); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_connect); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_default); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_inherit); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_redirect_fd); ATF_TP_ADD_TC(tp, fork_out_redirect_path_err_redirect_path); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/sanity.c0000644000470500017500000000501512271526120021262 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include #include #include "sanity.h" static void fail(const char *fmt, ...) { va_list ap; char buf[4096]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); warnx("%s", buf); warnx("%s", ""); warnx("This is probably a bug in this application or one of the " "libraries it uses. If you believe this problem is caused " "by, or is related to " PACKAGE_STRING ", please report it " "to " PACKAGE_BUGREPORT " and provide as many detatils as " "possible describing how you got to this condition."); abort(); } void atf_sanity_inv(const char *file, int line, const char *cond) { fail("Invariant check failed at %s:%d: %s", file, line, cond); } void atf_sanity_pre(const char *file, int line, const char *cond) { fail("Precondition check failed at %s:%d: %s", file, line, cond); } void atf_sanity_post(const char *file, int line, const char *cond) { fail("Postcondition check failed at %s:%d: %s", file, line, cond); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/tp_main.c0000644000470500017500000003510412271526120021404 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include #include #include #include #include "atf-c/error.h" #include "atf-c/tc.h" #include "atf-c/tp.h" #include "atf-c/utils.h" #include "dynstr.h" #include "env.h" #include "fs.h" #include "map.h" #include "sanity.h" #if defined(HAVE_GNU_GETOPT) # define GETOPT_POSIX "+" #else # define GETOPT_POSIX "" #endif static const char *progname = NULL; /* This prototype is provided by macros.h during instantiation of the test * program, so it can be kept private. Don't know if that's the best idea * though. */ int atf_tp_main(int, char **, atf_error_t (*)(atf_tp_t *)); enum tc_part { BODY, CLEANUP, }; /* --------------------------------------------------------------------- * The "usage" and "user" error types. * --------------------------------------------------------------------- */ #define FREE_FORM_ERROR(name) \ struct name ## _error_data { \ char m_what[2048]; \ }; \ \ static \ void \ name ## _format(const atf_error_t err, char *buf, size_t buflen) \ { \ const struct name ## _error_data *data; \ \ PRE(atf_error_is(err, #name)); \ \ data = atf_error_data(err); \ snprintf(buf, buflen, "%s", data->m_what); \ } \ \ static \ atf_error_t \ name ## _error(const char *fmt, ...) \ { \ atf_error_t err; \ struct name ## _error_data data; \ va_list ap; \ \ va_start(ap, fmt); \ vsnprintf(data.m_what, sizeof(data.m_what), fmt, ap); \ va_end(ap); \ \ err = atf_error_new(#name, &data, sizeof(data), name ## _format); \ \ return err; \ } FREE_FORM_ERROR(usage); FREE_FORM_ERROR(user); /* --------------------------------------------------------------------- * Printing functions. * --------------------------------------------------------------------- */ static void print_error(const atf_error_t err) { char buf[4096]; PRE(atf_is_error(err)); atf_error_format(err, buf, sizeof(buf)); fprintf(stderr, "%s: ERROR: %s\n", progname, buf); if (atf_error_is(err, "usage")) fprintf(stderr, "%s: See atf-test-program(1) for usage details.\n", progname); } static void print_warning(const char *message) { fprintf(stderr, "%s: WARNING: %s\n", progname, message); } /* --------------------------------------------------------------------- * Options handling. * --------------------------------------------------------------------- */ struct params { bool m_do_list; atf_fs_path_t m_srcdir; char *m_tcname; enum tc_part m_tcpart; atf_fs_path_t m_resfile; atf_map_t m_config; }; static atf_error_t argv0_to_dir(const char *argv0, atf_fs_path_t *dir) { atf_error_t err; atf_fs_path_t temp; err = atf_fs_path_init_fmt(&temp, "%s", argv0); if (atf_is_error(err)) goto out; err = atf_fs_path_branch_path(&temp, dir); atf_fs_path_fini(&temp); out: return err; } static atf_error_t params_init(struct params *p, const char *argv0) { atf_error_t err; p->m_do_list = false; p->m_tcname = NULL; p->m_tcpart = BODY; err = argv0_to_dir(argv0, &p->m_srcdir); if (atf_is_error(err)) return err; err = atf_fs_path_init_fmt(&p->m_resfile, "/dev/stdout"); if (atf_is_error(err)) { atf_fs_path_fini(&p->m_srcdir); return err; } err = atf_map_init(&p->m_config); if (atf_is_error(err)) { atf_fs_path_fini(&p->m_resfile); atf_fs_path_fini(&p->m_srcdir); return err; } return err; } static void params_fini(struct params *p) { atf_map_fini(&p->m_config); atf_fs_path_fini(&p->m_resfile); atf_fs_path_fini(&p->m_srcdir); if (p->m_tcname != NULL) free(p->m_tcname); } static atf_error_t parse_vflag(char *arg, atf_map_t *config) { atf_error_t err; char *split; split = strchr(arg, '='); if (split == NULL) { err = usage_error("-v requires an argument of the form var=value"); goto out; } *split = '\0'; split++; err = atf_map_insert(config, arg, split, false); out: return err; } static atf_error_t replace_path_param(atf_fs_path_t *param, const char *value) { atf_error_t err; atf_fs_path_t temp; err = atf_fs_path_init_fmt(&temp, "%s", value); if (!atf_is_error(err)) { atf_fs_path_fini(param); *param = temp; } return err; } /* --------------------------------------------------------------------- * Test case listing. * --------------------------------------------------------------------- */ static void list_tcs(const atf_tp_t *tp) { const atf_tc_t *const *tcs; const atf_tc_t *const *tcsptr; printf("Content-Type: application/X-atf-tp; version=\"1\"\n\n"); tcs = atf_tp_get_tcs(tp); INV(tcs != NULL); /* Should be checked. */ for (tcsptr = tcs; *tcsptr != NULL; tcsptr++) { const atf_tc_t *tc = *tcsptr; char **vars = atf_tc_get_md_vars(tc); char **ptr; INV(vars != NULL); /* Should be checked. */ if (tcsptr != tcs) /* Not first. */ printf("\n"); for (ptr = vars; *ptr != NULL; ptr += 2) { if (strcmp(*ptr, "ident") == 0) { printf("ident: %s\n", *(ptr + 1)); break; } } for (ptr = vars; *ptr != NULL; ptr += 2) { if (strcmp(*ptr, "ident") != 0) { printf("%s: %s\n", *ptr, *(ptr + 1)); } } atf_utils_free_charpp(vars); } } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ static atf_error_t handle_tcarg(const char *tcarg, char **tcname, enum tc_part *tcpart) { atf_error_t err; err = atf_no_error(); *tcname = strdup(tcarg); if (*tcname == NULL) { err = atf_no_memory_error(); goto out; } char *delim = strchr(*tcname, ':'); if (delim != NULL) { *delim = '\0'; delim++; if (strcmp(delim, "body") == 0) { *tcpart = BODY; } else if (strcmp(delim, "cleanup") == 0) { *tcpart = CLEANUP; } else { err = usage_error("Invalid test case part `%s'", delim); goto out; } } out: return err; } static atf_error_t process_params(int argc, char **argv, struct params *p) { atf_error_t err; int ch; int old_opterr; err = params_init(p, argv[0]); if (atf_is_error(err)) goto out; old_opterr = opterr; opterr = 0; while (!atf_is_error(err) && (ch = getopt(argc, argv, GETOPT_POSIX ":lr:s:v:")) != -1) { switch (ch) { case 'l': p->m_do_list = true; break; case 'r': err = replace_path_param(&p->m_resfile, optarg); break; case 's': err = replace_path_param(&p->m_srcdir, optarg); break; case 'v': err = parse_vflag(optarg, &p->m_config); break; case ':': err = usage_error("Option -%c requires an argument.", optopt); break; case '?': default: err = usage_error("Unknown option -%c.", optopt); } } argc -= optind; argv += optind; /* Clear getopt state just in case the test wants to use it. */ opterr = old_opterr; optind = 1; #if defined(HAVE_OPTRESET) optreset = 1; #endif if (!atf_is_error(err)) { if (p->m_do_list) { if (argc > 0) err = usage_error("Cannot provide test case names with -l"); } else { if (argc == 0) err = usage_error("Must provide a test case name"); else if (argc == 1) err = handle_tcarg(argv[0], &p->m_tcname, &p->m_tcpart); else if (argc > 1) { err = usage_error("Cannot provide more than one test case " "name"); } } } if (atf_is_error(err)) params_fini(p); out: return err; } static atf_error_t srcdir_strip_libtool(atf_fs_path_t *srcdir) { atf_error_t err; atf_fs_path_t parent; err = atf_fs_path_branch_path(srcdir, &parent); if (atf_is_error(err)) goto out; atf_fs_path_fini(srcdir); *srcdir = parent; INV(!atf_is_error(err)); out: return err; } static atf_error_t handle_srcdir(struct params *p) { atf_error_t err; atf_dynstr_t leafname; atf_fs_path_t exe, srcdir; bool b; err = atf_fs_path_copy(&srcdir, &p->m_srcdir); if (atf_is_error(err)) goto out; if (!atf_fs_path_is_absolute(&srcdir)) { atf_fs_path_t srcdirabs; err = atf_fs_path_to_absolute(&srcdir, &srcdirabs); if (atf_is_error(err)) goto out_srcdir; atf_fs_path_fini(&srcdir); srcdir = srcdirabs; } err = atf_fs_path_leaf_name(&srcdir, &leafname); if (atf_is_error(err)) goto out_srcdir; else { const bool libs = atf_equal_dynstr_cstring(&leafname, ".libs"); atf_dynstr_fini(&leafname); if (libs) { err = srcdir_strip_libtool(&srcdir); if (atf_is_error(err)) goto out; } } err = atf_fs_path_copy(&exe, &srcdir); if (atf_is_error(err)) goto out_srcdir; err = atf_fs_path_append_fmt(&exe, "%s", progname); if (atf_is_error(err)) goto out_exe; err = atf_fs_exists(&exe, &b); if (!atf_is_error(err)) { if (b) { err = atf_map_insert(&p->m_config, "srcdir", strdup(atf_fs_path_cstring(&srcdir)), true); } else { err = user_error("Cannot find the test program in the source " "directory `%s'", atf_fs_path_cstring(&srcdir)); } } out_exe: atf_fs_path_fini(&exe); out_srcdir: atf_fs_path_fini(&srcdir); out: return err; } static atf_error_t run_tc(const atf_tp_t *tp, struct params *p, int *exitcode) { atf_error_t err; err = atf_no_error(); if (!atf_tp_has_tc(tp, p->m_tcname)) { err = usage_error("Unknown test case `%s'", p->m_tcname); goto out; } if (!atf_env_has("__RUNNING_INSIDE_ATF_RUN") || strcmp(atf_env_get( "__RUNNING_INSIDE_ATF_RUN"), "internal-yes-value") != 0) { print_warning("Running test cases without atf-run(1) is unsupported"); print_warning("No isolation nor timeout control is being applied; you " "may get unexpected failures; see atf-test-case(4)"); } switch (p->m_tcpart) { case BODY: err = atf_tp_run(tp, p->m_tcname, atf_fs_path_cstring(&p->m_resfile)); if (atf_is_error(err)) { /* TODO: Handle error */ *exitcode = EXIT_FAILURE; atf_error_free(err); } else { *exitcode = EXIT_SUCCESS; } break; case CLEANUP: err = atf_tp_cleanup(tp, p->m_tcname); if (atf_is_error(err)) { /* TODO: Handle error */ *exitcode = EXIT_FAILURE; atf_error_free(err); } else { *exitcode = EXIT_SUCCESS; } break; default: UNREACHABLE; } INV(!atf_is_error(err)); out: return err; } static atf_error_t controlled_main(int argc, char **argv, atf_error_t (*add_tcs_hook)(atf_tp_t *), int *exitcode) { atf_error_t err; struct params p; atf_tp_t tp; char **raw_config; err = process_params(argc, argv, &p); if (atf_is_error(err)) goto out; err = handle_srcdir(&p); if (atf_is_error(err)) goto out_p; raw_config = atf_map_to_charpp(&p.m_config); if (raw_config == NULL) { err = atf_no_memory_error(); goto out_p; } err = atf_tp_init(&tp, (const char* const*)raw_config); atf_utils_free_charpp(raw_config); if (atf_is_error(err)) goto out_p; err = add_tcs_hook(&tp); if (atf_is_error(err)) goto out_tp; if (p.m_do_list) { list_tcs(&tp); INV(!atf_is_error(err)); *exitcode = EXIT_SUCCESS; } else { err = run_tc(&tp, &p, exitcode); } out_tp: atf_tp_fini(&tp); out_p: params_fini(&p); out: return err; } int atf_tp_main(int argc, char **argv, atf_error_t (*add_tcs_hook)(atf_tp_t *)) { atf_error_t err; int exitcode; progname = strrchr(argv[0], '/'); if (progname == NULL) progname = argv[0]; else progname++; /* Libtool workaround: if running from within the source tree (binaries * that are not installed yet), skip the "lt-" prefix added to files in * the ".libs" directory to show the real (not temporary) name. */ if (strncmp(progname, "lt-", 3) == 0) progname += 3; exitcode = EXIT_FAILURE; /* Silence GCC warning. */ err = controlled_main(argc, argv, add_tcs_hook, &exitcode); if (atf_is_error(err)) { print_error(err); atf_error_free(err); exitcode = EXIT_FAILURE; } return exitcode; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/process.c0000644000470500017500000004113612271526120021435 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c/error.h" #include "process.h" #include "sanity.h" /* This prototype is not in the header file because this is a private * function; however, we need to access it during testing. */ atf_error_t atf_process_status_init(atf_process_status_t *, int); /* --------------------------------------------------------------------- * The "stream_prepare" auxiliary type. * --------------------------------------------------------------------- */ struct stream_prepare { const atf_process_stream_t *m_sb; bool m_pipefds_ok; int m_pipefds[2]; }; typedef struct stream_prepare stream_prepare_t; static atf_error_t stream_prepare_init(stream_prepare_t *sp, const atf_process_stream_t *sb) { atf_error_t err; const int type = atf_process_stream_type(sb); sp->m_sb = sb; sp->m_pipefds_ok = false; if (type == atf_process_stream_type_capture) { if (pipe(sp->m_pipefds) == -1) err = atf_libc_error(errno, "Failed to create pipe"); else { err = atf_no_error(); sp->m_pipefds_ok = true; } } else err = atf_no_error(); return err; } static void stream_prepare_fini(stream_prepare_t *sp) { if (sp->m_pipefds_ok) { close(sp->m_pipefds[0]); close(sp->m_pipefds[1]); } } /* --------------------------------------------------------------------- * The "atf_process_stream" type. * --------------------------------------------------------------------- */ const int atf_process_stream_type_capture = 1; const int atf_process_stream_type_connect = 2; const int atf_process_stream_type_inherit = 3; const int atf_process_stream_type_redirect_fd = 4; const int atf_process_stream_type_redirect_path = 5; static bool stream_is_valid(const atf_process_stream_t *sb) { return (sb->m_type == atf_process_stream_type_capture) || (sb->m_type == atf_process_stream_type_connect) || (sb->m_type == atf_process_stream_type_inherit) || (sb->m_type == atf_process_stream_type_redirect_fd) || (sb->m_type == atf_process_stream_type_redirect_path); } atf_error_t atf_process_stream_init_capture(atf_process_stream_t *sb) { sb->m_type = atf_process_stream_type_capture; POST(stream_is_valid(sb)); return atf_no_error(); } atf_error_t atf_process_stream_init_connect(atf_process_stream_t *sb, const int src_fd, const int tgt_fd) { PRE(src_fd >= 0); PRE(tgt_fd >= 0); PRE(src_fd != tgt_fd); sb->m_type = atf_process_stream_type_connect; sb->m_src_fd = src_fd; sb->m_tgt_fd = tgt_fd; POST(stream_is_valid(sb)); return atf_no_error(); } atf_error_t atf_process_stream_init_inherit(atf_process_stream_t *sb) { sb->m_type = atf_process_stream_type_inherit; POST(stream_is_valid(sb)); return atf_no_error(); } atf_error_t atf_process_stream_init_redirect_fd(atf_process_stream_t *sb, const int fd) { sb->m_type = atf_process_stream_type_redirect_fd; sb->m_fd = fd; POST(stream_is_valid(sb)); return atf_no_error(); } atf_error_t atf_process_stream_init_redirect_path(atf_process_stream_t *sb, const atf_fs_path_t *path) { sb->m_type = atf_process_stream_type_redirect_path; sb->m_path = path; POST(stream_is_valid(sb)); return atf_no_error(); } void atf_process_stream_fini(atf_process_stream_t *sb) { PRE(stream_is_valid(sb)); } int atf_process_stream_type(const atf_process_stream_t *sb) { PRE(stream_is_valid(sb)); return sb->m_type; } /* --------------------------------------------------------------------- * The "atf_process_status" type. * --------------------------------------------------------------------- */ atf_error_t atf_process_status_init(atf_process_status_t *s, int status) { s->m_status = status; return atf_no_error(); } void atf_process_status_fini(atf_process_status_t *s ATF_DEFS_ATTRIBUTE_UNUSED) { } bool atf_process_status_exited(const atf_process_status_t *s) { int mutable_status = s->m_status; return WIFEXITED(mutable_status); } int atf_process_status_exitstatus(const atf_process_status_t *s) { PRE(atf_process_status_exited(s)); int mutable_status = s->m_status; return WEXITSTATUS(mutable_status); } bool atf_process_status_signaled(const atf_process_status_t *s) { int mutable_status = s->m_status; return WIFSIGNALED(mutable_status); } int atf_process_status_termsig(const atf_process_status_t *s) { PRE(atf_process_status_signaled(s)); int mutable_status = s->m_status; return WTERMSIG(mutable_status); } bool atf_process_status_coredump(const atf_process_status_t *s) { PRE(atf_process_status_signaled(s)); #if defined(WCOREDUMP) int mutable_status = s->m_status; return WCOREDUMP(mutable_status); #else return false; #endif } /* --------------------------------------------------------------------- * The "atf_process_child" type. * --------------------------------------------------------------------- */ static atf_error_t atf_process_child_init(atf_process_child_t *c) { c->m_pid = 0; c->m_stdout = -1; c->m_stderr = -1; return atf_no_error(); } static void atf_process_child_fini(atf_process_child_t *c) { if (c->m_stdout != -1) close(c->m_stdout); if (c->m_stderr != -1) close(c->m_stderr); } atf_error_t atf_process_child_wait(atf_process_child_t *c, atf_process_status_t *s) { atf_error_t err; int status; if (waitpid(c->m_pid, &status, 0) == -1) err = atf_libc_error(errno, "Failed waiting for process %d", c->m_pid); else { atf_process_child_fini(c); err = atf_process_status_init(s, status); } return err; } pid_t atf_process_child_pid(const atf_process_child_t *c) { return c->m_pid; } int atf_process_child_stdout(atf_process_child_t *c) { PRE(c->m_stdout != -1); return c->m_stdout; } int atf_process_child_stderr(atf_process_child_t *c) { PRE(c->m_stderr != -1); return c->m_stderr; } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ static atf_error_t safe_dup(const int oldfd, const int newfd) { atf_error_t err; if (oldfd != newfd) { if (dup2(oldfd, newfd) == -1) { err = atf_libc_error(errno, "Could not allocate file descriptor"); } else { close(oldfd); err = atf_no_error(); } } else err = atf_no_error(); return err; } static atf_error_t child_connect(const stream_prepare_t *sp, int procfd) { atf_error_t err; const int type = atf_process_stream_type(sp->m_sb); if (type == atf_process_stream_type_capture) { close(sp->m_pipefds[0]); err = safe_dup(sp->m_pipefds[1], procfd); } else if (type == atf_process_stream_type_connect) { if (dup2(sp->m_sb->m_tgt_fd, sp->m_sb->m_src_fd) == -1) err = atf_libc_error(errno, "Cannot connect descriptor %d to %d", sp->m_sb->m_tgt_fd, sp->m_sb->m_src_fd); else err = atf_no_error(); } else if (type == atf_process_stream_type_inherit) { err = atf_no_error(); } else if (type == atf_process_stream_type_redirect_fd) { err = safe_dup(sp->m_sb->m_fd, procfd); } else if (type == atf_process_stream_type_redirect_path) { int aux = open(atf_fs_path_cstring(sp->m_sb->m_path), O_WRONLY | O_CREAT | O_TRUNC, 0644); if (aux == -1) err = atf_libc_error(errno, "Could not create %s", atf_fs_path_cstring(sp->m_sb->m_path)); else { err = safe_dup(aux, procfd); if (atf_is_error(err)) close(aux); } } else { UNREACHABLE; err = atf_no_error(); } return err; } static void parent_connect(const stream_prepare_t *sp, int *fd) { const int type = atf_process_stream_type(sp->m_sb); if (type == atf_process_stream_type_capture) { close(sp->m_pipefds[1]); *fd = sp->m_pipefds[0]; } else if (type == atf_process_stream_type_connect) { /* Do nothing. */ } else if (type == atf_process_stream_type_inherit) { /* Do nothing. */ } else if (type == atf_process_stream_type_redirect_fd) { /* Do nothing. */ } else if (type == atf_process_stream_type_redirect_path) { /* Do nothing. */ } else { UNREACHABLE; } } static atf_error_t do_parent(atf_process_child_t *c, const pid_t pid, const stream_prepare_t *outsp, const stream_prepare_t *errsp) { atf_error_t err; err = atf_process_child_init(c); if (atf_is_error(err)) goto out; c->m_pid = pid; parent_connect(outsp, &c->m_stdout); parent_connect(errsp, &c->m_stderr); out: return err; } static void do_child(void (*)(void *), void *, const stream_prepare_t *, const stream_prepare_t *) ATF_DEFS_ATTRIBUTE_NORETURN; static void do_child(void (*start)(void *), void *v, const stream_prepare_t *outsp, const stream_prepare_t *errsp) { atf_error_t err; err = child_connect(outsp, STDOUT_FILENO); if (atf_is_error(err)) goto out; err = child_connect(errsp, STDERR_FILENO); if (atf_is_error(err)) goto out; start(v); UNREACHABLE; out: if (atf_is_error(err)) { char buf[1024]; atf_error_format(err, buf, sizeof(buf)); fprintf(stderr, "Unhandled error: %s\n", buf); atf_error_free(err); exit(EXIT_FAILURE); } else exit(EXIT_SUCCESS); } static atf_error_t fork_with_streams(atf_process_child_t *c, void (*start)(void *), const atf_process_stream_t *outsb, const atf_process_stream_t *errsb, void *v) { atf_error_t err; stream_prepare_t outsp; stream_prepare_t errsp; pid_t pid; err = stream_prepare_init(&outsp, outsb); if (atf_is_error(err)) goto out; err = stream_prepare_init(&errsp, errsb); if (atf_is_error(err)) goto err_outpipe; pid = fork(); if (pid == -1) { err = atf_libc_error(errno, "Failed to fork"); goto err_errpipe; } if (pid == 0) { do_child(start, v, &outsp, &errsp); UNREACHABLE; abort(); err = atf_no_error(); } else { err = do_parent(c, pid, &outsp, &errsp); if (atf_is_error(err)) goto err_errpipe; } goto out; err_errpipe: stream_prepare_fini(&errsp); err_outpipe: stream_prepare_fini(&outsp); out: return err; } static atf_error_t init_stream_w_default(const atf_process_stream_t *usersb, atf_process_stream_t *inheritsb, const atf_process_stream_t **realsb) { atf_error_t err; if (usersb == NULL) { err = atf_process_stream_init_inherit(inheritsb); if (!atf_is_error(err)) *realsb = inheritsb; } else { err = atf_no_error(); *realsb = usersb; } return err; } atf_error_t atf_process_fork(atf_process_child_t *c, void (*start)(void *), const atf_process_stream_t *outsb, const atf_process_stream_t *errsb, void *v) { atf_error_t err; atf_process_stream_t inherit_outsb, inherit_errsb; const atf_process_stream_t *real_outsb, *real_errsb; real_outsb = NULL; /* Shut up GCC warning. */ err = init_stream_w_default(outsb, &inherit_outsb, &real_outsb); if (atf_is_error(err)) goto out; real_errsb = NULL; /* Shut up GCC warning. */ err = init_stream_w_default(errsb, &inherit_errsb, &real_errsb); if (atf_is_error(err)) goto out_out; err = fork_with_streams(c, start, real_outsb, real_errsb, v); if (errsb == NULL) atf_process_stream_fini(&inherit_errsb); out_out: if (outsb == NULL) atf_process_stream_fini(&inherit_outsb); out: return err; } static int const_execvp(const char *file, const char *const *argv) { #define UNCONST(a) ((void *)(unsigned long)(const void *)(a)) return execvp(file, UNCONST(argv)); #undef UNCONST } static atf_error_t list_to_array(const atf_list_t *l, const char ***ap) { atf_error_t err; const char **a; a = (const char **)malloc((atf_list_size(l) + 1) * sizeof(const char *)); if (a == NULL) err = atf_no_memory_error(); else { const char **aiter; atf_list_citer_t liter; aiter = a; atf_list_for_each_c(liter, l) { *aiter = (const char *)atf_list_citer_data(liter); aiter++; } *aiter = NULL; err = atf_no_error(); *ap = a; } return err; } struct exec_args { const atf_fs_path_t *m_prog; const char *const *m_argv; void (*m_prehook)(void); }; static void do_exec(void *v) { struct exec_args *ea = v; if (ea->m_prehook != NULL) ea->m_prehook(); const int ret = const_execvp(atf_fs_path_cstring(ea->m_prog), ea->m_argv); const int errnocopy = errno; INV(ret == -1); fprintf(stderr, "exec(%s) failed: %s\n", atf_fs_path_cstring(ea->m_prog), strerror(errnocopy)); exit(EXIT_FAILURE); } atf_error_t atf_process_exec_array(atf_process_status_t *s, const atf_fs_path_t *prog, const char *const *argv, const atf_process_stream_t *outsb, const atf_process_stream_t *errsb, void (*prehook)(void)) { atf_error_t err; atf_process_child_t c; struct exec_args ea = { prog, argv, prehook }; PRE(outsb == NULL || atf_process_stream_type(outsb) != atf_process_stream_type_capture); PRE(errsb == NULL || atf_process_stream_type(errsb) != atf_process_stream_type_capture); err = atf_process_fork(&c, do_exec, outsb, errsb, &ea); if (atf_is_error(err)) goto out; again: err = atf_process_child_wait(&c, s); if (atf_is_error(err)) { INV(atf_error_is(err, "libc") && atf_libc_error_code(err) == EINTR); atf_error_free(err); goto again; } out: return err; } atf_error_t atf_process_exec_list(atf_process_status_t *s, const atf_fs_path_t *prog, const atf_list_t *argv, const atf_process_stream_t *outsb, const atf_process_stream_t *errsb, void (*prehook)(void)) { atf_error_t err; const char **argv2; PRE(outsb == NULL || atf_process_stream_type(outsb) != atf_process_stream_type_capture); PRE(errsb == NULL || atf_process_stream_type(errsb) != atf_process_stream_type_capture); argv2 = NULL; /* Silence GCC warning. */ err = list_to_array(argv, &argv2); if (atf_is_error(err)) goto out; err = atf_process_exec_array(s, prog, argv2, outsb, errsb, prehook); free(argv2); out: return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/sanity_test.c0000644000470500017500000001322212271526120022320 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include #include #include #include #include #include #include "dynstr.h" #include "process.h" #include "sanity.h" #include "test_helpers.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ enum type { inv, pre, post, unreachable }; struct test_data { enum type m_type; bool m_cond; }; static void do_test_child(void *) ATF_DEFS_ATTRIBUTE_NORETURN; static void do_test_child(void *v) { struct test_data *td = v; switch (td->m_type) { case inv: INV(td->m_cond); break; case pre: PRE(td->m_cond); break; case post: POST(td->m_cond); break; case unreachable: if (!td->m_cond) UNREACHABLE; break; } exit(EXIT_SUCCESS); } static void do_test(enum type t, bool cond) { atf_process_child_t child; atf_process_status_t status; int nlines; char *lines[3]; { atf_process_stream_t outsb, errsb; struct test_data td = { t, cond }; RE(atf_process_stream_init_inherit(&outsb)); RE(atf_process_stream_init_capture(&errsb)); RE(atf_process_fork(&child, do_test_child, &outsb, &errsb, &td)); atf_process_stream_fini(&errsb); atf_process_stream_fini(&outsb); } nlines = 0; while (nlines < 3 && (lines[nlines] = atf_utils_readline(atf_process_child_stderr(&child))) != NULL) nlines++; ATF_REQUIRE(nlines == 0 || nlines == 3); RE(atf_process_child_wait(&child, &status)); if (!cond) { ATF_REQUIRE(atf_process_status_signaled(&status)); ATF_REQUIRE(atf_process_status_termsig(&status) == SIGABRT); } else { ATF_REQUIRE(atf_process_status_exited(&status)); ATF_REQUIRE(atf_process_status_exitstatus(&status) == EXIT_SUCCESS); } atf_process_status_fini(&status); if (!cond) { switch (t) { case inv: ATF_REQUIRE(atf_utils_grep_string("Invariant", lines[0])); break; case pre: ATF_REQUIRE(atf_utils_grep_string("Precondition", lines[0])); break; case post: ATF_REQUIRE(atf_utils_grep_string("Postcondition", lines[0])); break; case unreachable: ATF_REQUIRE(atf_utils_grep_string("Invariant", lines[0])); break; } ATF_REQUIRE(atf_utils_grep_string(__FILE__, lines[0])); ATF_REQUIRE(atf_utils_grep_string(PACKAGE_BUGREPORT, lines[2])); } while (nlines > 0) { nlines--; free(lines[nlines]); } } static void require_ndebug(void) { #if defined(NDEBUG) atf_tc_skip("Sanity checks not available; code built with -DNDEBUG"); #endif } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(inv); ATF_TC_HEAD(inv, tc) { atf_tc_set_md_var(tc, "descr", "Tests the INV macro"); } ATF_TC_BODY(inv, tc) { require_ndebug(); do_test(inv, false); do_test(inv, true); } ATF_TC(pre); ATF_TC_HEAD(pre, tc) { atf_tc_set_md_var(tc, "descr", "Tests the PRE macro"); } ATF_TC_BODY(pre, tc) { require_ndebug(); do_test(pre, false); do_test(pre, true); } ATF_TC(post); ATF_TC_HEAD(post, tc) { atf_tc_set_md_var(tc, "descr", "Tests the POST macro"); } ATF_TC_BODY(post, tc) { require_ndebug(); do_test(post, false); do_test(post, true); } ATF_TC(unreachable); ATF_TC_HEAD(unreachable, tc) { atf_tc_set_md_var(tc, "descr", "Tests the UNREACHABLE macro"); } ATF_TC_BODY(unreachable, tc) { require_ndebug(); do_test(unreachable, false); do_test(unreachable, true); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, inv); ATF_TP_ADD_TC(tp, pre); ATF_TP_ADD_TC(tp, post); ATF_TP_ADD_TC(tp, unreachable); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/env_test.c0000644000470500017500000000664512271526120021614 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "env.h" #include "test_helpers.h" #include "text.h" /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(has); ATF_TC_HEAD(has, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_env_has function"); } ATF_TC_BODY(has, tc) { ATF_REQUIRE(atf_env_has("PATH")); ATF_REQUIRE(!atf_env_has("_UNDEFINED_VARIABLE_")); } ATF_TC(get); ATF_TC_HEAD(get, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_env_get function"); } ATF_TC_BODY(get, tc) { const char *val; ATF_REQUIRE(atf_env_has("PATH")); val = atf_env_get("PATH"); ATF_REQUIRE(strlen(val) > 0); ATF_REQUIRE(strchr(val, ':') != NULL); } ATF_TC(set); ATF_TC_HEAD(set, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_env_set function"); } ATF_TC_BODY(set, tc) { char *oldval; ATF_REQUIRE(atf_env_has("PATH")); RE(atf_text_format(&oldval, "%s", atf_env_get("PATH"))); RE(atf_env_set("PATH", "foo-bar")); ATF_REQUIRE(strcmp(atf_env_get("PATH"), oldval) != 0); ATF_REQUIRE(strcmp(atf_env_get("PATH"), "foo-bar") == 0); free(oldval); ATF_REQUIRE(!atf_env_has("_UNDEFINED_VARIABLE_")); RE(atf_env_set("_UNDEFINED_VARIABLE_", "foo2-bar2")); ATF_REQUIRE(strcmp(atf_env_get("_UNDEFINED_VARIABLE_"), "foo2-bar2") == 0); } ATF_TC(unset); ATF_TC_HEAD(unset, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_env_unset function"); } ATF_TC_BODY(unset, tc) { ATF_REQUIRE(atf_env_has("PATH")); RE(atf_env_unset("PATH")); ATF_REQUIRE(!atf_env_has("PATH")); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, has); ATF_TP_ADD_TC(tp, get); ATF_TP_ADD_TC(tp, set); ATF_TP_ADD_TC(tp, unset); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/text_test.c0000644000470500017500000002502512271526120022001 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "sanity.h" #include "test_helpers.h" #include "text.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ #define REQUIRE_ERROR(exp) \ do { \ atf_error_t err = exp; \ ATF_REQUIRE(atf_is_error(err)); \ atf_error_free(err); \ } while (0) static size_t array_size(const char *words[]) { size_t count; const char **word; count = 0; for (word = words; *word != NULL; word++) count++; return count; } static void check_split(const char *str, const char *delim, const char *words[]) { atf_list_t list; const char **word; size_t i; printf("Splitting '%s' with delimiter '%s'\n", str, delim); CE(atf_text_split(str, delim, &list)); printf("Expecting %zd words\n", array_size(words)); ATF_CHECK_EQ(atf_list_size(&list), array_size(words)); for (word = words, i = 0; *word != NULL; word++, i++) { printf("Word at position %zd should be '%s'\n", i, words[i]); ATF_CHECK_STREQ((const char *)atf_list_index_c(&list, i), words[i]); } atf_list_fini(&list); } static atf_error_t word_acum(const char *word, void *data) { char *acum = data; strcat(acum, word); return atf_no_error(); } static atf_error_t word_count(const char *word ATF_DEFS_ATTRIBUTE_UNUSED, void *data) { size_t *counter = data; (*counter)++; return atf_no_error(); } struct fail_at { int failpos; int curpos; }; static atf_error_t word_fail_at(const char *word ATF_DEFS_ATTRIBUTE_UNUSED, void *data) { struct fail_at *fa = data; atf_error_t err; if (fa->failpos == fa->curpos) err = atf_no_memory_error(); /* Just a random error. */ else { fa->curpos++; err = atf_no_error(); } return err; } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ ATF_TC(for_each_word); ATF_TC_HEAD(for_each_word, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_text_for_each_word" "function"); } ATF_TC_BODY(for_each_word, tc) { size_t cnt; char acum[1024]; cnt = 0; strcpy(acum, ""); RE(atf_text_for_each_word("1 2 3", " ", word_count, &cnt)); RE(atf_text_for_each_word("1 2 3", " ", word_acum, acum)); ATF_REQUIRE(cnt == 3); ATF_REQUIRE(strcmp(acum, "123") == 0); cnt = 0; strcpy(acum, ""); RE(atf_text_for_each_word("1 2 3", ".", word_count, &cnt)); RE(atf_text_for_each_word("1 2 3", ".", word_acum, acum)); ATF_REQUIRE(cnt == 1); ATF_REQUIRE(strcmp(acum, "1 2 3") == 0); cnt = 0; strcpy(acum, ""); RE(atf_text_for_each_word("1 2 3 4 5", " ", word_count, &cnt)); RE(atf_text_for_each_word("1 2 3 4 5", " ", word_acum, acum)); ATF_REQUIRE(cnt == 5); ATF_REQUIRE(strcmp(acum, "12345") == 0); cnt = 0; strcpy(acum, ""); RE(atf_text_for_each_word("1 2.3.4 5", " .", word_count, &cnt)); RE(atf_text_for_each_word("1 2.3.4 5", " .", word_acum, acum)); ATF_REQUIRE(cnt == 5); ATF_REQUIRE(strcmp(acum, "12345") == 0); { struct fail_at fa; fa.failpos = 3; fa.curpos = 0; atf_error_t err = atf_text_for_each_word("a b c d e", " ", word_fail_at, &fa); ATF_REQUIRE(atf_is_error(err)); ATF_REQUIRE(atf_error_is(err, "no_memory")); ATF_REQUIRE(fa.curpos == 3); atf_error_free(err); } } ATF_TC(format); ATF_TC_HEAD(format, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of free-form " "strings using a variable parameters list"); } ATF_TC_BODY(format, tc) { char *str; atf_error_t err; err = atf_text_format(&str, "%s %s %d", "Test", "string", 1); ATF_REQUIRE(!atf_is_error(err)); ATF_REQUIRE(strcmp(str, "Test string 1") == 0); free(str); } static void format_ap(char **dest, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_text_format_ap(dest, fmt, ap); va_end(ap); ATF_REQUIRE(!atf_is_error(err)); } ATF_TC(format_ap); ATF_TC_HEAD(format_ap, tc) { atf_tc_set_md_var(tc, "descr", "Checks the construction of free-form " "strings using a va_list argument"); } ATF_TC_BODY(format_ap, tc) { char *str; format_ap(&str, "%s %s %d", "Test", "string", 1); ATF_REQUIRE(strcmp(str, "Test string 1") == 0); free(str); } ATF_TC(split); ATF_TC_HEAD(split, tc) { atf_tc_set_md_var(tc, "descr", "Checks the split function"); } ATF_TC_BODY(split, tc) { { const char *words[] = { NULL }; check_split("", " ", words); } { const char *words[] = { NULL }; check_split(" ", " ", words); } { const char *words[] = { NULL }; check_split(" ", " ", words); } { const char *words[] = { "a", "b", NULL }; check_split("a b", " ", words); } { const char *words[] = { "a", "b", "c", "d", NULL }; check_split("a b c d", " ", words); } { const char *words[] = { "foo", "bar", NULL }; check_split("foo bar", " ", words); } { const char *words[] = { "foo", "bar", "baz", "foobar", NULL }; check_split("foo bar baz foobar", " ", words); } { const char *words[] = { "foo", "bar", NULL }; check_split(" foo bar", " ", words); } { const char *words[] = { "foo", "bar", NULL }; check_split("foo bar", " ", words); } { const char *words[] = { "foo", "bar", NULL }; check_split("foo bar ", " ", words); } { const char *words[] = { "foo", "bar", NULL }; check_split(" foo bar ", " ", words); } } ATF_TC(split_delims); ATF_TC_HEAD(split_delims, tc) { atf_tc_set_md_var(tc, "descr", "Checks the split function using " "different delimiters"); } ATF_TC_BODY(split_delims, tc) { { const char *words[] = { NULL }; check_split("", "/", words); } { const char *words[] = { " ", NULL }; check_split(" ", "/", words); } { const char *words[] = { " ", NULL }; check_split(" ", "/", words); } { const char *words[] = { "a", "b", NULL }; check_split("a/b", "/", words); } { const char *words[] = { "a", "bcd", "ef", NULL }; check_split("aLONGDELIMbcdLONGDELIMef", "LONGDELIM", words); } } ATF_TC(to_bool); ATF_TC_HEAD(to_bool, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_text_to_bool function"); } ATF_TC_BODY(to_bool, tc) { bool b; RE(atf_text_to_bool("true", &b)); ATF_REQUIRE(b); RE(atf_text_to_bool("TRUE", &b)); ATF_REQUIRE(b); RE(atf_text_to_bool("yes", &b)); ATF_REQUIRE(b); RE(atf_text_to_bool("YES", &b)); ATF_REQUIRE(b); RE(atf_text_to_bool("false", &b)); ATF_REQUIRE(!b); RE(atf_text_to_bool("FALSE", &b)); ATF_REQUIRE(!b); RE(atf_text_to_bool("no", &b)); ATF_REQUIRE(!b); RE(atf_text_to_bool("NO", &b)); ATF_REQUIRE(!b); b = false; REQUIRE_ERROR(atf_text_to_bool("", &b)); ATF_REQUIRE(!b); b = true; REQUIRE_ERROR(atf_text_to_bool("", &b)); ATF_REQUIRE(b); b = false; REQUIRE_ERROR(atf_text_to_bool("tru", &b)); ATF_REQUIRE(!b); b = true; REQUIRE_ERROR(atf_text_to_bool("tru", &b)); ATF_REQUIRE(b); b = false; REQUIRE_ERROR(atf_text_to_bool("true2", &b)); ATF_REQUIRE(!b); b = true; REQUIRE_ERROR(atf_text_to_bool("true2", &b)); ATF_REQUIRE(b); b = false; REQUIRE_ERROR(atf_text_to_bool("fals", &b)); ATF_REQUIRE(!b); b = true; REQUIRE_ERROR(atf_text_to_bool("fals", &b)); ATF_REQUIRE(b); b = false; REQUIRE_ERROR(atf_text_to_bool("false2", &b)); ATF_REQUIRE(!b); b = true; REQUIRE_ERROR(atf_text_to_bool("false2", &b)); ATF_REQUIRE(b); } ATF_TC(to_long); ATF_TC_HEAD(to_long, tc) { atf_tc_set_md_var(tc, "descr", "Checks the atf_text_to_long function"); } ATF_TC_BODY(to_long, tc) { long l; RE(atf_text_to_long("0", &l)); ATF_REQUIRE_EQ(l, 0); RE(atf_text_to_long("-5", &l)); ATF_REQUIRE_EQ(l, -5); RE(atf_text_to_long("5", &l)); ATF_REQUIRE_EQ(l, 5); RE(atf_text_to_long("123456789", &l)); ATF_REQUIRE_EQ(l, 123456789); l = 1212; REQUIRE_ERROR(atf_text_to_long("", &l)); ATF_REQUIRE_EQ(l, 1212); REQUIRE_ERROR(atf_text_to_long("foo", &l)); ATF_REQUIRE_EQ(l, 1212); REQUIRE_ERROR(atf_text_to_long("1234x", &l)); ATF_REQUIRE_EQ(l, 1212); } /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, for_each_word); ATF_TP_ADD_TC(tp, format); ATF_TP_ADD_TC(tp, format_ap); ATF_TP_ADD_TC(tp, split); ATF_TP_ADD_TC(tp, split_delims); ATF_TP_ADD_TC(tp, to_bool); ATF_TP_ADD_TC(tp, to_long); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/Makefile.am.inc0000644000470500017500000001077712271526120022426 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # libatf_c_la_SOURCES += atf-c/detail/dynstr.c \ atf-c/detail/dynstr.h \ atf-c/detail/env.c \ atf-c/detail/env.h \ atf-c/detail/fs.c \ atf-c/detail/fs.h \ atf-c/detail/list.c \ atf-c/detail/list.h \ atf-c/detail/map.c \ atf-c/detail/map.h \ atf-c/detail/process.c \ atf-c/detail/process.h \ atf-c/detail/sanity.c \ atf-c/detail/sanity.h \ atf-c/detail/text.c \ atf-c/detail/text.h \ atf-c/detail/tp_main.c \ atf-c/detail/user.c \ atf-c/detail/user.h tests_atf_c_detail_DATA = atf-c/detail/Atffile \ atf-c/detail/Kyuafile tests_atf_c_detaildir = $(pkgtestsdir)/atf-c/detail EXTRA_DIST += $(tests_atf_c_detail_DATA) noinst_LTLIBRARIES += atf-c/detail/libtest_helpers.la atf_c_detail_libtest_helpers_la_SOURCES = atf-c/detail/test_helpers.c \ atf-c/detail/test_helpers.h atf_c_detail_libtest_helpers_la_CPPFLAGS = -I$(srcdir)/atf-c tests_atf_c_detail_PROGRAMS = atf-c/detail/dynstr_test atf_c_detail_dynstr_test_SOURCES = atf-c/detail/dynstr_test.c atf_c_detail_dynstr_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/env_test atf_c_detail_env_test_SOURCES = atf-c/detail/env_test.c atf_c_detail_env_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/fs_test atf_c_detail_fs_test_SOURCES = atf-c/detail/fs_test.c atf_c_detail_fs_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/list_test atf_c_detail_list_test_SOURCES = atf-c/detail/list_test.c atf_c_detail_list_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/map_test atf_c_detail_map_test_SOURCES = atf-c/detail/map_test.c atf_c_detail_map_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/process_helpers atf_c_detail_process_helpers_SOURCES = atf-c/detail/process_helpers.c tests_atf_c_detail_PROGRAMS += atf-c/detail/process_test atf_c_detail_process_test_SOURCES = atf-c/detail/process_test.c atf_c_detail_process_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/sanity_test atf_c_detail_sanity_test_SOURCES = atf-c/detail/sanity_test.c atf_c_detail_sanity_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/text_test atf_c_detail_text_test_SOURCES = atf-c/detail/text_test.c atf_c_detail_text_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la tests_atf_c_detail_PROGRAMS += atf-c/detail/user_test atf_c_detail_user_test_SOURCES = atf-c/detail/user_test.c atf_c_detail_user_test_LDADD = atf-c/detail/libtest_helpers.la libatf-c.la # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/test_helpers.h0000644000470500017500000000562112271526120022464 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(TESTS_ATF_ATF_C_TEST_HELPERS_H) # error "Cannot include test_helpers.h more than once." #else # define TESTS_ATF_ATF_C_TEST_HELPERS_H #endif #include #include "atf-c/error_fwd.h" struct atf_dynstr; struct atf_fs_path; #define CE(stm) ATF_CHECK(!atf_is_error(stm)) #define RE(stm) ATF_REQUIRE(!atf_is_error(stm)) #define HEADER_TC(name, hdrname) \ ATF_TC(name); \ ATF_TC_HEAD(name, tc) \ { \ atf_tc_set_md_var(tc, "descr", "Tests that the " hdrname " file can " \ "be included on its own, without any prerequisites"); \ } \ ATF_TC_BODY(name, tc) \ { \ header_check(hdrname); \ } #define BUILD_TC(name, sfile, descr, failmsg) \ ATF_TC(name); \ ATF_TC_HEAD(name, tc) \ { \ atf_tc_set_md_var(tc, "descr", descr); \ } \ ATF_TC_BODY(name, tc) \ { \ build_check_c_o(tc, sfile, failmsg, true); \ } #define BUILD_TC_FAIL(name, sfile, descr, failmsg) \ ATF_TC(name); \ ATF_TC_HEAD(name, tc) \ { \ atf_tc_set_md_var(tc, "descr", descr); \ } \ ATF_TC_BODY(name, tc) \ { \ build_check_c_o(tc, sfile, failmsg, false); \ } void build_check_c_o(const atf_tc_t *, const char *, const char *, const bool); void header_check(const char *); void get_process_helpers_path(const atf_tc_t *, const bool, struct atf_fs_path *); bool read_line(int, struct atf_dynstr *); void run_h_tc(atf_tc_t *, const char *, const char *, const char *); bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/fs.c0000644000470500017500000005116612271526120020373 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2007 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(HAVE_CONFIG_H) #include "bconfig.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "atf-c/defs.h" #include "atf-c/error.h" #include "fs.h" #include "sanity.h" #include "text.h" #include "user.h" /* --------------------------------------------------------------------- * Prototypes for auxiliary functions. * --------------------------------------------------------------------- */ static bool check_umask(const mode_t, const mode_t); static atf_error_t copy_contents(const atf_fs_path_t *, char **); static mode_t current_umask(void); static atf_error_t do_mkdtemp(char *); static atf_error_t normalize(atf_dynstr_t *, char *); static atf_error_t normalize_ap(atf_dynstr_t *, const char *, va_list); static void replace_contents(atf_fs_path_t *, const char *); static const char *stat_type_to_string(const int); /* --------------------------------------------------------------------- * The "invalid_umask" error type. * --------------------------------------------------------------------- */ struct invalid_umask_error_data { /* One of atf_fs_stat_*_type. */ int m_type; /* The original path causing the error. */ /* XXX: Ideally this would be an atf_fs_path_t, but if we create it * from the error constructor, we cannot delete the path later on. * Can't remember why atf_error_new does not take a hook for * deletion. */ char m_path[1024]; /* The umask that caused the error. */ mode_t m_umask; }; typedef struct invalid_umask_error_data invalid_umask_error_data_t; static void invalid_umask_format(const atf_error_t err, char *buf, size_t buflen) { const invalid_umask_error_data_t *data; PRE(atf_error_is(err, "invalid_umask")); data = atf_error_data(err); snprintf(buf, buflen, "Could not create the temporary %s %s because " "it will not have enough access rights due to the current " "umask %05o", stat_type_to_string(data->m_type), data->m_path, (unsigned int)data->m_umask); } static atf_error_t invalid_umask_error(const atf_fs_path_t *path, const int type, const mode_t failing_mask) { atf_error_t err; invalid_umask_error_data_t data; data.m_type = type; strncpy(data.m_path, atf_fs_path_cstring(path), sizeof(data.m_path)); data.m_path[sizeof(data.m_path) - 1] = '\0'; data.m_umask = failing_mask; err = atf_error_new("invalid_umask", &data, sizeof(data), invalid_umask_format); return err; } /* --------------------------------------------------------------------- * The "unknown_file_type" error type. * --------------------------------------------------------------------- */ struct unknown_type_error_data { const char *m_path; int m_type; }; typedef struct unknown_type_error_data unknown_type_error_data_t; static void unknown_type_format(const atf_error_t err, char *buf, size_t buflen) { const unknown_type_error_data_t *data; PRE(atf_error_is(err, "unknown_type")); data = atf_error_data(err); snprintf(buf, buflen, "Unknown file type %d of %s", data->m_type, data->m_path); } static atf_error_t unknown_type_error(const char *path, int type) { atf_error_t err; unknown_type_error_data_t data; data.m_path = path; data.m_type = type; err = atf_error_new("unknown_type", &data, sizeof(data), unknown_type_format); return err; } /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ static bool check_umask(const mode_t exp_mode, const mode_t min_mode) { const mode_t actual_mode = (~current_umask() & exp_mode); return (actual_mode & min_mode) == min_mode; } static atf_error_t copy_contents(const atf_fs_path_t *p, char **buf) { atf_error_t err; char *str; str = (char *)malloc(atf_dynstr_length(&p->m_data) + 1); if (str == NULL) err = atf_no_memory_error(); else { strcpy(str, atf_dynstr_cstring(&p->m_data)); *buf = str; err = atf_no_error(); } return err; } static mode_t current_umask(void) { const mode_t current = umask(0); (void)umask(current); return current; } static atf_error_t do_mkdtemp(char *tmpl) { atf_error_t err; PRE(strstr(tmpl, "XXXXXX") != NULL); if (mkdtemp(tmpl) == NULL) err = atf_libc_error(errno, "Cannot create temporary directory " "with template '%s'", tmpl); else err = atf_no_error(); return err; } static atf_error_t do_mkstemp(char *tmpl, int *fdout) { atf_error_t err; PRE(strstr(tmpl, "XXXXXX") != NULL); *fdout = mkstemp(tmpl); if (*fdout == -1) err = atf_libc_error(errno, "Cannot create temporary file " "with template '%s'", tmpl); else err = atf_no_error(); return err; } static atf_error_t normalize(atf_dynstr_t *d, char *p) { const char *ptr; char *last; atf_error_t err; bool first; PRE(strlen(p) > 0); PRE(atf_dynstr_length(d) == 0); if (p[0] == '/') err = atf_dynstr_append_fmt(d, "/"); else err = atf_no_error(); first = true; last = NULL; /* Silence GCC warning. */ ptr = strtok_r(p, "/", &last); while (!atf_is_error(err) && ptr != NULL) { if (strlen(ptr) > 0) { err = atf_dynstr_append_fmt(d, "%s%s", first ? "" : "/", ptr); first = false; } ptr = strtok_r(NULL, "/", &last); } return err; } static atf_error_t normalize_ap(atf_dynstr_t *d, const char *p, va_list ap) { char *str; atf_error_t err; va_list ap2; err = atf_dynstr_init(d); if (atf_is_error(err)) goto out; va_copy(ap2, ap); err = atf_text_format_ap(&str, p, ap2); va_end(ap2); if (atf_is_error(err)) atf_dynstr_fini(d); else { err = normalize(d, str); free(str); } out: return err; } static void replace_contents(atf_fs_path_t *p, const char *buf) { atf_error_t err; PRE(atf_dynstr_length(&p->m_data) == strlen(buf)); atf_dynstr_clear(&p->m_data); err = atf_dynstr_append_fmt(&p->m_data, "%s", buf); INV(!atf_is_error(err)); } static const char * stat_type_to_string(const int type) { const char *str; if (type == atf_fs_stat_blk_type) str = "block device"; else if (type == atf_fs_stat_chr_type) str = "character device"; else if (type == atf_fs_stat_dir_type) str = "directory"; else if (type == atf_fs_stat_fifo_type) str = "named pipe"; else if (type == atf_fs_stat_lnk_type) str = "symbolic link"; else if (type == atf_fs_stat_reg_type) str = "regular file"; else if (type == atf_fs_stat_sock_type) str = "socket"; else if (type == atf_fs_stat_wht_type) str = "whiteout"; else { UNREACHABLE; str = NULL; } return str; } /* --------------------------------------------------------------------- * The "atf_fs_path" type. * --------------------------------------------------------------------- */ /* * Constructors/destructors. */ atf_error_t atf_fs_path_init_ap(atf_fs_path_t *p, const char *fmt, va_list ap) { atf_error_t err; va_list ap2; va_copy(ap2, ap); err = normalize_ap(&p->m_data, fmt, ap2); va_end(ap2); return err; } atf_error_t atf_fs_path_init_fmt(atf_fs_path_t *p, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_fs_path_init_ap(p, fmt, ap); va_end(ap); return err; } atf_error_t atf_fs_path_copy(atf_fs_path_t *dest, const atf_fs_path_t *src) { return atf_dynstr_copy(&dest->m_data, &src->m_data); } void atf_fs_path_fini(atf_fs_path_t *p) { atf_dynstr_fini(&p->m_data); } /* * Getters. */ atf_error_t atf_fs_path_branch_path(const atf_fs_path_t *p, atf_fs_path_t *bp) { const size_t endpos = atf_dynstr_rfind_ch(&p->m_data, '/'); atf_error_t err; if (endpos == atf_dynstr_npos) err = atf_fs_path_init_fmt(bp, "."); else if (endpos == 0) err = atf_fs_path_init_fmt(bp, "/"); else err = atf_dynstr_init_substr(&bp->m_data, &p->m_data, 0, endpos); #if defined(HAVE_CONST_DIRNAME) INV(atf_equal_dynstr_cstring(&bp->m_data, dirname(atf_dynstr_cstring(&p->m_data)))); #endif /* defined(HAVE_CONST_DIRNAME) */ return err; } const char * atf_fs_path_cstring(const atf_fs_path_t *p) { return atf_dynstr_cstring(&p->m_data); } atf_error_t atf_fs_path_leaf_name(const atf_fs_path_t *p, atf_dynstr_t *ln) { size_t begpos = atf_dynstr_rfind_ch(&p->m_data, '/'); atf_error_t err; if (begpos == atf_dynstr_npos) begpos = 0; else begpos++; err = atf_dynstr_init_substr(ln, &p->m_data, begpos, atf_dynstr_npos); #if defined(HAVE_CONST_BASENAME) INV(atf_equal_dynstr_cstring(ln, basename(atf_dynstr_cstring(&p->m_data)))); #endif /* defined(HAVE_CONST_BASENAME) */ return err; } bool atf_fs_path_is_absolute(const atf_fs_path_t *p) { return atf_dynstr_cstring(&p->m_data)[0] == '/'; } bool atf_fs_path_is_root(const atf_fs_path_t *p) { return atf_equal_dynstr_cstring(&p->m_data, "/"); } /* * Modifiers. */ atf_error_t atf_fs_path_append_ap(atf_fs_path_t *p, const char *fmt, va_list ap) { atf_dynstr_t aux; atf_error_t err; va_list ap2; va_copy(ap2, ap); err = normalize_ap(&aux, fmt, ap2); va_end(ap2); if (!atf_is_error(err)) { const char *auxstr = atf_dynstr_cstring(&aux); const bool needslash = auxstr[0] != '/'; err = atf_dynstr_append_fmt(&p->m_data, "%s%s", needslash ? "/" : "", auxstr); atf_dynstr_fini(&aux); } return err; } atf_error_t atf_fs_path_append_fmt(atf_fs_path_t *p, const char *fmt, ...) { va_list ap; atf_error_t err; va_start(ap, fmt); err = atf_fs_path_append_ap(p, fmt, ap); va_end(ap); return err; } atf_error_t atf_fs_path_append_path(atf_fs_path_t *p, const atf_fs_path_t *p2) { return atf_fs_path_append_fmt(p, "%s", atf_dynstr_cstring(&p2->m_data)); } atf_error_t atf_fs_path_to_absolute(const atf_fs_path_t *p, atf_fs_path_t *pa) { atf_error_t err; PRE(!atf_fs_path_is_absolute(p)); err = atf_fs_getcwd(pa); if (atf_is_error(err)) goto out; err = atf_fs_path_append_path(pa, p); if (atf_is_error(err)) atf_fs_path_fini(pa); out: return err; } /* * Operators. */ bool atf_equal_fs_path_fs_path(const atf_fs_path_t *p1, const atf_fs_path_t *p2) { return atf_equal_dynstr_dynstr(&p1->m_data, &p2->m_data); } /* --------------------------------------------------------------------- * The "atf_fs_path" type. * --------------------------------------------------------------------- */ /* * Constants. */ const int atf_fs_stat_blk_type = 1; const int atf_fs_stat_chr_type = 2; const int atf_fs_stat_dir_type = 3; const int atf_fs_stat_fifo_type = 4; const int atf_fs_stat_lnk_type = 5; const int atf_fs_stat_reg_type = 6; const int atf_fs_stat_sock_type = 7; const int atf_fs_stat_wht_type = 8; /* * Constructors/destructors. */ atf_error_t atf_fs_stat_init(atf_fs_stat_t *st, const atf_fs_path_t *p) { atf_error_t err; const char *pstr = atf_fs_path_cstring(p); if (lstat(pstr, &st->m_sb) == -1) { err = atf_libc_error(errno, "Cannot get information of %s; " "lstat(2) failed", pstr); } else { int type = st->m_sb.st_mode & S_IFMT; err = atf_no_error(); switch (type) { case S_IFBLK: st->m_type = atf_fs_stat_blk_type; break; case S_IFCHR: st->m_type = atf_fs_stat_chr_type; break; case S_IFDIR: st->m_type = atf_fs_stat_dir_type; break; case S_IFIFO: st->m_type = atf_fs_stat_fifo_type; break; case S_IFLNK: st->m_type = atf_fs_stat_lnk_type; break; case S_IFREG: st->m_type = atf_fs_stat_reg_type; break; case S_IFSOCK: st->m_type = atf_fs_stat_sock_type; break; #if defined(S_IFWHT) case S_IFWHT: st->m_type = atf_fs_stat_wht_type; break; #endif default: err = unknown_type_error(pstr, type); } } return err; } void atf_fs_stat_copy(atf_fs_stat_t *dest, const atf_fs_stat_t *src) { dest->m_type = src->m_type; dest->m_sb = src->m_sb; } void atf_fs_stat_fini(atf_fs_stat_t *st ATF_DEFS_ATTRIBUTE_UNUSED) { } /* * Getters. */ dev_t atf_fs_stat_get_device(const atf_fs_stat_t *st) { return st->m_sb.st_dev; } ino_t atf_fs_stat_get_inode(const atf_fs_stat_t *st) { return st->m_sb.st_ino; } mode_t atf_fs_stat_get_mode(const atf_fs_stat_t *st) { return st->m_sb.st_mode & ~S_IFMT; } off_t atf_fs_stat_get_size(const atf_fs_stat_t *st) { return st->m_sb.st_size; } int atf_fs_stat_get_type(const atf_fs_stat_t *st) { return st->m_type; } bool atf_fs_stat_is_owner_readable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IRUSR; } bool atf_fs_stat_is_owner_writable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IWUSR; } bool atf_fs_stat_is_owner_executable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IXUSR; } bool atf_fs_stat_is_group_readable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IRGRP; } bool atf_fs_stat_is_group_writable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IWGRP; } bool atf_fs_stat_is_group_executable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IXGRP; } bool atf_fs_stat_is_other_readable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IROTH; } bool atf_fs_stat_is_other_writable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IWOTH; } bool atf_fs_stat_is_other_executable(const atf_fs_stat_t *st) { return st->m_sb.st_mode & S_IXOTH; } /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ const int atf_fs_access_f = 1 << 0; const int atf_fs_access_r = 1 << 1; const int atf_fs_access_w = 1 << 2; const int atf_fs_access_x = 1 << 3; /* * An implementation of access(2) but using the effective user value * instead of the real one. Also avoids false positives for root when * asking for execute permissions, which appear in SunOS. */ atf_error_t atf_fs_eaccess(const atf_fs_path_t *p, int mode) { atf_error_t err; struct stat st; bool ok; PRE(mode & atf_fs_access_f || mode & atf_fs_access_r || mode & atf_fs_access_w || mode & atf_fs_access_x); if (lstat(atf_fs_path_cstring(p), &st) == -1) { err = atf_libc_error(errno, "Cannot get information from file %s", atf_fs_path_cstring(p)); goto out; } err = atf_no_error(); /* Early return if we are only checking for existence and the file * exists (stat call returned). */ if (mode & atf_fs_access_f) goto out; ok = false; if (atf_user_is_root()) { if (!ok && !(mode & atf_fs_access_x)) { /* Allow root to read/write any file. */ ok = true; } if (!ok && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) { /* Allow root to execute the file if any of its execution bits * are set. */ ok = true; } } else { if (!ok && (atf_user_euid() == st.st_uid)) { ok = ((mode & atf_fs_access_r) && (st.st_mode & S_IRUSR)) || ((mode & atf_fs_access_w) && (st.st_mode & S_IWUSR)) || ((mode & atf_fs_access_x) && (st.st_mode & S_IXUSR)); } if (!ok && atf_user_is_member_of_group(st.st_gid)) { ok = ((mode & atf_fs_access_r) && (st.st_mode & S_IRGRP)) || ((mode & atf_fs_access_w) && (st.st_mode & S_IWGRP)) || ((mode & atf_fs_access_x) && (st.st_mode & S_IXGRP)); } if (!ok && ((atf_user_euid() != st.st_uid) && !atf_user_is_member_of_group(st.st_gid))) { ok = ((mode & atf_fs_access_r) && (st.st_mode & S_IROTH)) || ((mode & atf_fs_access_w) && (st.st_mode & S_IWOTH)) || ((mode & atf_fs_access_x) && (st.st_mode & S_IXOTH)); } } if (!ok) err = atf_libc_error(EACCES, "Access check failed"); out: return err; } atf_error_t atf_fs_exists(const atf_fs_path_t *p, bool *b) { atf_error_t err; err = atf_fs_eaccess(p, atf_fs_access_f); if (atf_is_error(err)) { if (atf_error_is(err, "libc") && atf_libc_error_code(err) == ENOENT) { atf_error_free(err); err = atf_no_error(); *b = false; } } else *b = true; return err; } atf_error_t atf_fs_getcwd(atf_fs_path_t *p) { atf_error_t err; char *cwd; #if defined(HAVE_GETCWD_DYN) cwd = getcwd(NULL, 0); #else cwd = getcwd(NULL, MAXPATHLEN); #endif if (cwd == NULL) { err = atf_libc_error(errno, "Cannot determine current directory"); goto out; } err = atf_fs_path_init_fmt(p, "%s", cwd); free(cwd); out: return err; } atf_error_t atf_fs_mkdtemp(atf_fs_path_t *p) { atf_error_t err; char *buf; if (!check_umask(S_IRWXU, S_IRWXU)) { err = invalid_umask_error(p, atf_fs_stat_dir_type, current_umask()); goto out; } err = copy_contents(p, &buf); if (atf_is_error(err)) goto out; err = do_mkdtemp(buf); if (atf_is_error(err)) goto out_buf; replace_contents(p, buf); INV(!atf_is_error(err)); out_buf: free(buf); out: return err; } atf_error_t atf_fs_mkstemp(atf_fs_path_t *p, int *fdout) { atf_error_t err; char *buf; int fd; if (!check_umask(S_IRWXU, S_IRWXU)) { err = invalid_umask_error(p, atf_fs_stat_reg_type, current_umask()); goto out; } err = copy_contents(p, &buf); if (atf_is_error(err)) goto out; err = do_mkstemp(buf, &fd); if (atf_is_error(err)) goto out_buf; replace_contents(p, buf); *fdout = fd; INV(!atf_is_error(err)); out_buf: free(buf); out: return err; } atf_error_t atf_fs_rmdir(const atf_fs_path_t *p) { atf_error_t err; if (rmdir(atf_fs_path_cstring(p))) { if (errno == EEXIST) { /* Some operating systems (e.g. OpenSolaris 200906) return * EEXIST instead of ENOTEMPTY for non-empty directories. * Homogenize the return value so that callers don't need * to bother about differences in operating systems. */ errno = ENOTEMPTY; } err = atf_libc_error(errno, "Cannot remove directory"); } else err = atf_no_error(); return err; } atf_error_t atf_fs_unlink(const atf_fs_path_t *p) { atf_error_t err; const char *path; path = atf_fs_path_cstring(p); if (unlink(path) != 0) err = atf_libc_error(errno, "Cannot unlink file: '%s'", path); else err = atf_no_error(); return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/Kyuafile0000644000470500017500000000055012271526120021302 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") atf_test_program{name="dynstr_test"} atf_test_program{name="env_test"} atf_test_program{name="fs_test"} atf_test_program{name="list_test"} atf_test_program{name="map_test"} atf_test_program{name="process_test"} atf_test_program{name="sanity_test"} atf_test_program{name="text_test"} atf_test_program{name="user_test"} bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/list.c0000644000470500017500000002045212271526120020730 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "atf-c/error.h" #include "atf-c/utils.h" #include "list.h" #include "sanity.h" /* --------------------------------------------------------------------- * Auxiliary functions. * --------------------------------------------------------------------- */ struct list_entry { struct list_entry *m_prev; struct list_entry *m_next; void *m_object; bool m_managed; }; static atf_list_citer_t entry_to_citer(const atf_list_t *l, const struct list_entry *le) { atf_list_citer_t iter; iter.m_list = l; iter.m_entry = le; return iter; } static atf_list_iter_t entry_to_iter(atf_list_t *l, struct list_entry *le) { atf_list_iter_t iter; iter.m_list = l; iter.m_entry = le; return iter; } static struct list_entry * new_entry(void *object, bool managed) { struct list_entry *le; le = (struct list_entry *)malloc(sizeof(*le)); if (le != NULL) { le->m_prev = le->m_next = NULL; le->m_object = object; le->m_managed = managed; } else free(object); return le; } static void delete_entry(struct list_entry *le) { if (le->m_managed) free(le->m_object); free(le); } static struct list_entry * new_entry_and_link(void *object, bool managed, struct list_entry *prev, struct list_entry *next) { struct list_entry *le; le = new_entry(object, managed); if (le != NULL) { le->m_prev = prev; le->m_next = next; prev->m_next = le; next->m_prev = le; } return le; } /* --------------------------------------------------------------------- * The "atf_list_citer" type. * --------------------------------------------------------------------- */ /* * Getters. */ const void * atf_list_citer_data(const atf_list_citer_t citer) { const struct list_entry *le = citer.m_entry; PRE(le != NULL); return le->m_object; } atf_list_citer_t atf_list_citer_next(const atf_list_citer_t citer) { const struct list_entry *le = citer.m_entry; atf_list_citer_t newciter; PRE(le != NULL); newciter = citer; newciter.m_entry = le->m_next; return newciter; } bool atf_equal_list_citer_list_citer(const atf_list_citer_t i1, const atf_list_citer_t i2) { return i1.m_list == i2.m_list && i1.m_entry == i2.m_entry; } /* --------------------------------------------------------------------- * The "atf_list_iter" type. * --------------------------------------------------------------------- */ /* * Getters. */ void * atf_list_iter_data(const atf_list_iter_t iter) { const struct list_entry *le = iter.m_entry; PRE(le != NULL); return le->m_object; } atf_list_iter_t atf_list_iter_next(const atf_list_iter_t iter) { const struct list_entry *le = iter.m_entry; atf_list_iter_t newiter; PRE(le != NULL); newiter = iter; newiter.m_entry = le->m_next; return newiter; } bool atf_equal_list_iter_list_iter(const atf_list_iter_t i1, const atf_list_iter_t i2) { return i1.m_list == i2.m_list && i1.m_entry == i2.m_entry; } /* --------------------------------------------------------------------- * The "atf_list" type. * --------------------------------------------------------------------- */ /* * Constructors and destructors. */ atf_error_t atf_list_init(atf_list_t *l) { struct list_entry *lebeg, *leend; lebeg = new_entry(NULL, false); if (lebeg == NULL) { return atf_no_memory_error(); } leend = new_entry(NULL, false); if (leend == NULL) { free(lebeg); return atf_no_memory_error(); } lebeg->m_next = leend; lebeg->m_prev = NULL; leend->m_next = NULL; leend->m_prev = lebeg; l->m_size = 0; l->m_begin = lebeg; l->m_end = leend; return atf_no_error(); } void atf_list_fini(atf_list_t *l) { struct list_entry *le; size_t freed; le = (struct list_entry *)l->m_begin; freed = 0; while (le != NULL) { struct list_entry *lenext; lenext = le->m_next; delete_entry(le); le = lenext; freed++; } INV(freed == l->m_size + 2); } /* * Getters. */ atf_list_iter_t atf_list_begin(atf_list_t *l) { struct list_entry *le = l->m_begin; return entry_to_iter(l, le->m_next); } atf_list_citer_t atf_list_begin_c(const atf_list_t *l) { const struct list_entry *le = l->m_begin; return entry_to_citer(l, le->m_next); } atf_list_iter_t atf_list_end(atf_list_t *l) { return entry_to_iter(l, l->m_end); } atf_list_citer_t atf_list_end_c(const atf_list_t *l) { return entry_to_citer(l, l->m_end); } void * atf_list_index(atf_list_t *list, const size_t idx) { atf_list_iter_t iter; PRE(idx < atf_list_size(list)); iter = atf_list_begin(list); { size_t pos = 0; while (pos < idx && !atf_equal_list_iter_list_iter((iter), atf_list_end(list))) { iter = atf_list_iter_next(iter); pos++; } } return atf_list_iter_data(iter); } const void * atf_list_index_c(const atf_list_t *list, const size_t idx) { atf_list_citer_t iter; PRE(idx < atf_list_size(list)); iter = atf_list_begin_c(list); { size_t pos = 0; while (pos < idx && !atf_equal_list_citer_list_citer((iter), atf_list_end_c(list))) { iter = atf_list_citer_next(iter); pos++; } } return atf_list_citer_data(iter); } size_t atf_list_size(const atf_list_t *l) { return l->m_size; } char ** atf_list_to_charpp(const atf_list_t *l) { char **array; atf_list_citer_t iter; size_t i; array = malloc(sizeof(char *) * (atf_list_size(l) + 1)); if (array == NULL) goto out; i = 0; atf_list_for_each_c(iter, l) { array[i] = strdup((const char *)atf_list_citer_data(iter)); if (array[i] == NULL) { atf_utils_free_charpp(array); array = NULL; goto out; } i++; } array[i] = NULL; out: return array; } /* * Modifiers. */ atf_error_t atf_list_append(atf_list_t *l, void *data, bool managed) { struct list_entry *le, *next, *prev; atf_error_t err; next = (struct list_entry *)l->m_end; prev = next->m_prev; le = new_entry_and_link(data, managed, prev, next); if (le == NULL) err = atf_no_memory_error(); else { l->m_size++; err = atf_no_error(); } return err; } void atf_list_append_list(atf_list_t *l, atf_list_t *src) { struct list_entry *e1, *e2, *ghost1, *ghost2; ghost1 = (struct list_entry *)l->m_end; ghost2 = (struct list_entry *)src->m_begin; e1 = ghost1->m_prev; e2 = ghost2->m_next; delete_entry(ghost1); delete_entry(ghost2); e1->m_next = e2; e2->m_prev = e1; l->m_end = src->m_end; l->m_size += src->m_size; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/text.c0000644000470500017500000001114212271526120020735 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "atf-c/error.h" #include "dynstr.h" #include "sanity.h" #include "text.h" atf_error_t atf_text_for_each_word(const char *instr, const char *sep, atf_error_t (*func)(const char *, void *), void *data) { atf_error_t err; char *str, *str2, *last; str = strdup(instr); if (str == NULL) { err = atf_no_memory_error(); goto out; } err = atf_no_error(); str2 = strtok_r(str, sep, &last); while (str2 != NULL && !atf_is_error(err)) { err = func(str2, data); str2 = strtok_r(NULL, sep, &last); } free(str); out: return err; } atf_error_t atf_text_format(char **dest, const char *fmt, ...) { atf_error_t err; va_list ap; va_start(ap, fmt); err = atf_text_format_ap(dest, fmt, ap); va_end(ap); return err; } atf_error_t atf_text_format_ap(char **dest, const char *fmt, va_list ap) { atf_error_t err; atf_dynstr_t tmp; va_list ap2; va_copy(ap2, ap); err = atf_dynstr_init_ap(&tmp, fmt, ap2); va_end(ap2); if (!atf_is_error(err)) *dest = atf_dynstr_fini_disown(&tmp); return err; } atf_error_t atf_text_split(const char *str, const char *delim, atf_list_t *words) { atf_error_t err; const char *end; const char *iter; err = atf_list_init(words); if (atf_is_error(err)) goto err; end = str + strlen(str); INV(*end == '\0'); iter = str; while (iter < end) { const char *ptr; INV(iter != NULL); ptr = strstr(iter, delim); if (ptr == NULL) ptr = end; INV(ptr >= iter); if (ptr > iter) { atf_dynstr_t word; err = atf_dynstr_init_raw(&word, iter, ptr - iter); if (atf_is_error(err)) goto err_list; err = atf_list_append(words, atf_dynstr_fini_disown(&word), true); if (atf_is_error(err)) goto err_list; } iter = ptr + strlen(delim); } INV(!atf_is_error(err)); return err; err_list: atf_list_fini(words); err: return err; } atf_error_t atf_text_to_bool(const char *str, bool *b) { atf_error_t err; if (strcasecmp(str, "yes") == 0 || strcasecmp(str, "true") == 0) { *b = true; err = atf_no_error(); } else if (strcasecmp(str, "no") == 0 || strcasecmp(str, "false") == 0) { *b = false; err = atf_no_error(); } else { /* XXX Not really a libc error. */ err = atf_libc_error(EINVAL, "Cannot convert string '%s' " "to boolean", str); } return err; } atf_error_t atf_text_to_long(const char *str, long *l) { atf_error_t err; char *endptr; long tmp; errno = 0; tmp = strtol(str, &endptr, 10); if (str[0] == '\0' || *endptr != '\0') err = atf_libc_error(EINVAL, "'%s' is not a number", str); else if (errno == ERANGE || (tmp == LONG_MAX || tmp == LONG_MIN)) err = atf_libc_error(ERANGE, "'%s' is out of range", str); else { *l = tmp; err = atf_no_error(); } return err; } bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/process.h0000644000470500017500000001252712271526120021444 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_PROCESS_H) #define ATF_C_PROCESS_H #include #include #include #include "fs.h" #include "list.h" /* --------------------------------------------------------------------- * The "atf_process_stream" type. * --------------------------------------------------------------------- */ struct atf_process_stream { int m_type; /* Valid if m_type == connect. */ int m_src_fd; int m_tgt_fd; /* Valid if m_type == redirect_fd. */ int m_fd; /* Valid if m_type == redirect_path. */ const atf_fs_path_t *m_path; }; typedef struct atf_process_stream atf_process_stream_t; extern const int atf_process_stream_type_capture; extern const int atf_process_stream_type_connect; extern const int atf_process_stream_type_inherit; extern const int atf_process_stream_type_redirect_fd; extern const int atf_process_stream_type_redirect_path; atf_error_t atf_process_stream_init_capture(atf_process_stream_t *); atf_error_t atf_process_stream_init_connect(atf_process_stream_t *, const int, const int); atf_error_t atf_process_stream_init_inherit(atf_process_stream_t *); atf_error_t atf_process_stream_init_redirect_fd(atf_process_stream_t *, const int fd); atf_error_t atf_process_stream_init_redirect_path(atf_process_stream_t *, const atf_fs_path_t *); void atf_process_stream_fini(atf_process_stream_t *); int atf_process_stream_type(const atf_process_stream_t *); /* --------------------------------------------------------------------- * The "atf_process_status" type. * --------------------------------------------------------------------- */ struct atf_process_status { int m_status; }; typedef struct atf_process_status atf_process_status_t; void atf_process_status_fini(atf_process_status_t *); bool atf_process_status_exited(const atf_process_status_t *); int atf_process_status_exitstatus(const atf_process_status_t *); bool atf_process_status_signaled(const atf_process_status_t *); int atf_process_status_termsig(const atf_process_status_t *); bool atf_process_status_coredump(const atf_process_status_t *); /* --------------------------------------------------------------------- * The "atf_process_child" type. * --------------------------------------------------------------------- */ struct atf_process_child { pid_t m_pid; int m_stdout; int m_stderr; }; typedef struct atf_process_child atf_process_child_t; atf_error_t atf_process_child_wait(atf_process_child_t *, atf_process_status_t *); pid_t atf_process_child_pid(const atf_process_child_t *); int atf_process_child_stdout(atf_process_child_t *); int atf_process_child_stderr(atf_process_child_t *); /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_process_fork(atf_process_child_t *, void (*)(void *), const atf_process_stream_t *, const atf_process_stream_t *, void *); atf_error_t atf_process_exec_array(atf_process_status_t *, const atf_fs_path_t *, const char *const *, const atf_process_stream_t *, const atf_process_stream_t *, void (*)(void)); atf_error_t atf_process_exec_list(atf_process_status_t *, const atf_fs_path_t *, const atf_list_t *, const atf_process_stream_t *, const atf_process_stream_t *, void (*)(void)); #endif /* !defined(ATF_C_PROCESS_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/env.h0000644000470500017500000000330412271526120020547 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_ENV_H) #define ATF_C_ENV_H #include #include const char *atf_env_get(const char *); bool atf_env_has(const char *); atf_error_t atf_env_set(const char *, const char *); atf_error_t atf_env_unset(const char *); #endif /* !defined(ATF_C_ENV_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/detail/map.h0000644000470500017500000001027212271526120020536 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_MAP_H) #define ATF_C_MAP_H #include #include #include #include "list.h" /* --------------------------------------------------------------------- * The "atf_map_citer" type. * --------------------------------------------------------------------- */ struct atf_map_citer { const struct atf_map *m_map; const void *m_entry; atf_list_citer_t m_listiter; }; typedef struct atf_map_citer atf_map_citer_t; /* Getters. */ const char *atf_map_citer_key(const atf_map_citer_t); const void *atf_map_citer_data(const atf_map_citer_t); atf_map_citer_t atf_map_citer_next(const atf_map_citer_t); /* Operators. */ bool atf_equal_map_citer_map_citer(const atf_map_citer_t, const atf_map_citer_t); /* --------------------------------------------------------------------- * The "atf_map_iter" type. * --------------------------------------------------------------------- */ struct atf_map_iter { struct atf_map *m_map; void *m_entry; atf_list_iter_t m_listiter; }; typedef struct atf_map_iter atf_map_iter_t; /* Getters. */ const char *atf_map_iter_key(const atf_map_iter_t); void *atf_map_iter_data(const atf_map_iter_t); atf_map_iter_t atf_map_iter_next(const atf_map_iter_t); /* Operators. */ bool atf_equal_map_iter_map_iter(const atf_map_iter_t, const atf_map_iter_t); /* --------------------------------------------------------------------- * The "atf_map" type. * --------------------------------------------------------------------- */ /* A list-based map. Typically very inefficient, but our maps are small * enough. */ struct atf_map { atf_list_t m_list; }; typedef struct atf_map atf_map_t; /* Constructors and destructors */ atf_error_t atf_map_init(atf_map_t *); atf_error_t atf_map_init_charpp(atf_map_t *, const char *const *); void atf_map_fini(atf_map_t *); /* Getters. */ atf_map_iter_t atf_map_begin(atf_map_t *); atf_map_citer_t atf_map_begin_c(const atf_map_t *); atf_map_iter_t atf_map_end(atf_map_t *); atf_map_citer_t atf_map_end_c(const atf_map_t *); atf_map_iter_t atf_map_find(atf_map_t *, const char *); atf_map_citer_t atf_map_find_c(const atf_map_t *, const char *); size_t atf_map_size(const atf_map_t *); char **atf_map_to_charpp(const atf_map_t *); /* Modifiers. */ atf_error_t atf_map_insert(atf_map_t *, const char *, void *, bool); /* Macros. */ #define atf_map_for_each(iter, map) \ for (iter = atf_map_begin(map); \ !atf_equal_map_iter_map_iter((iter), atf_map_end(map)); \ iter = atf_map_iter_next(iter)) #define atf_map_for_each_c(iter, map) \ for (iter = atf_map_begin_c(map); \ !atf_equal_map_citer_map_citer((iter), atf_map_end_c(map)); \ iter = atf_map_citer_next(iter)) #endif /* ATF_C_MAP_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/atf-c.m40000644000470500017500000000440412271526120017602 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright 2011 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ATF_CHECK_C([version-spec]) dnl dnl Checks if atf-c is present. If version-spec is provided, ensures that dnl the installed version of atf-sh matches the required version. This dnl argument must be something like '>= 0.14' and accepts any version dnl specification supported by pkg-config. dnl dnl Defines and substitutes ATF_C_CFLAGS and ATF_C_LIBS with the compiler dnl and linker flags need to build against atf-c. AC_DEFUN([ATF_CHECK_C], [ spec="atf-c[]m4_default_nblank([ $1], [])" _ATF_CHECK_ARG_WITH( [PKG_CHECK_MODULES([ATF_C], [${spec}], [found=yes found_atf_c=yes], [found=no])], [required ${spec} not found]) ]) bind9-9.9.5.dfsg/unit/atf-src/atf-c/tc_test.c0000644000470500017500000001452012271526120020157 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "detail/test_helpers.h" /* --------------------------------------------------------------------- * Auxiliary test cases. * --------------------------------------------------------------------- */ ATF_TC_HEAD(empty, tc) { if (tc != NULL) {} } ATF_TC_BODY(empty, tc) { } ATF_TC_HEAD(test_var, tc) { atf_tc_set_md_var(tc, "test-var", "Test text"); } /* --------------------------------------------------------------------- * Test cases for the "atf_tc_t" type. * --------------------------------------------------------------------- */ ATF_TC(init); ATF_TC_HEAD(init, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_tc_init function"); } ATF_TC_BODY(init, tcin) { atf_tc_t tc; RE(atf_tc_init(&tc, "test1", ATF_TC_HEAD_NAME(empty), ATF_TC_BODY_NAME(empty), NULL, NULL)); ATF_REQUIRE(strcmp(atf_tc_get_ident(&tc), "test1") == 0); ATF_REQUIRE(!atf_tc_has_md_var(&tc, "test-var")); atf_tc_fini(&tc); RE(atf_tc_init(&tc, "test2", ATF_TC_HEAD_NAME(test_var), ATF_TC_BODY_NAME(empty), NULL, NULL)); ATF_REQUIRE(strcmp(atf_tc_get_ident(&tc), "test2") == 0); ATF_REQUIRE(atf_tc_has_md_var(&tc, "test-var")); atf_tc_fini(&tc); } ATF_TC(init_pack); ATF_TC_HEAD(init_pack, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_tc_init_pack function"); } ATF_TC_BODY(init_pack, tcin) { atf_tc_t tc; atf_tc_pack_t tcp1 = { .m_ident = "test1", .m_head = ATF_TC_HEAD_NAME(empty), .m_body = ATF_TC_BODY_NAME(empty), .m_cleanup = NULL, }; atf_tc_pack_t tcp2 = { .m_ident = "test2", .m_head = ATF_TC_HEAD_NAME(test_var), .m_body = ATF_TC_BODY_NAME(empty), .m_cleanup = NULL, }; RE(atf_tc_init_pack(&tc, &tcp1, NULL)); ATF_REQUIRE(strcmp(atf_tc_get_ident(&tc), "test1") == 0); ATF_REQUIRE(!atf_tc_has_md_var(&tc, "test-var")); atf_tc_fini(&tc); RE(atf_tc_init_pack(&tc, &tcp2, NULL)); ATF_REQUIRE(strcmp(atf_tc_get_ident(&tc), "test2") == 0); ATF_REQUIRE(atf_tc_has_md_var(&tc, "test-var")); atf_tc_fini(&tc); } ATF_TC(vars); ATF_TC_HEAD(vars, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_tc_get_md_var, " "atf_tc_has_md_var and atf_tc_set_md_var functions"); } ATF_TC_BODY(vars, tcin) { atf_tc_t tc; RE(atf_tc_init(&tc, "test1", ATF_TC_HEAD_NAME(empty), ATF_TC_BODY_NAME(empty), NULL, NULL)); ATF_REQUIRE(!atf_tc_has_md_var(&tc, "test-var")); RE(atf_tc_set_md_var(&tc, "test-var", "Test value")); ATF_REQUIRE(atf_tc_has_md_var(&tc, "test-var")); ATF_REQUIRE(strcmp(atf_tc_get_md_var(&tc, "test-var"), "Test value") == 0); atf_tc_fini(&tc); } ATF_TC(config); ATF_TC_HEAD(config, tc) { atf_tc_set_md_var(tc, "descr", "Tests the atf_tc_get_config_var, " "atf_tc_get_config_var_wd and atf_tc_has_config_var " "functions"); } ATF_TC_BODY(config, tcin) { atf_tc_t tc; const char *const config[] = { "test-var", "test-value", NULL }; RE(atf_tc_init(&tc, "test1", ATF_TC_HEAD_NAME(empty), ATF_TC_BODY_NAME(empty), NULL, NULL)); ATF_REQUIRE(!atf_tc_has_config_var(&tc, "test-var")); ATF_REQUIRE(!atf_tc_has_md_var(&tc, "test-var")); atf_tc_fini(&tc); RE(atf_tc_init(&tc, "test1", ATF_TC_HEAD_NAME(empty), ATF_TC_BODY_NAME(empty), NULL, config)); ATF_REQUIRE(atf_tc_has_config_var(&tc, "test-var")); ATF_REQUIRE(strcmp(atf_tc_get_config_var(&tc, "test-var"), "test-value") == 0); ATF_REQUIRE(!atf_tc_has_md_var(&tc, "test-var")); ATF_REQUIRE(!atf_tc_has_config_var(&tc, "test-var2")); ATF_REQUIRE(strcmp(atf_tc_get_config_var_wd(&tc, "test-var2", "def-value"), "def-value") == 0); atf_tc_fini(&tc); } /* --------------------------------------------------------------------- * Test cases for the free functions. * --------------------------------------------------------------------- */ /* TODO: Add test cases for atf_tc_run. This is going to be very tough, * but good tests here could allow us to avoid much of the indirect * testing done later on. */ /* --------------------------------------------------------------------- * Tests cases for the header file. * --------------------------------------------------------------------- */ HEADER_TC(include, "atf-c/tc.h"); /* --------------------------------------------------------------------- * Main. * --------------------------------------------------------------------- */ ATF_TP_ADD_TCS(tp) { /* Add the test cases for the "atf_tcr_t" type. */ ATF_TP_ADD_TC(tp, init); ATF_TP_ADD_TC(tp, init_pack); ATF_TP_ADD_TC(tp, vars); ATF_TP_ADD_TC(tp, config); /* Add the test cases for the free functions. */ /* TODO */ /* Add the test cases for the header file. */ ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/macros.h0000644000470500017500000001576212271526120020014 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_MACROS_H) #define ATF_C_MACROS_H #include #include #include #include #include #include #define ATF_TC_NAME(tc) \ (atfu_ ## tc ## _tc) #define ATF_TC_PACK_NAME(tc) \ (atfu_ ## tc ## _tc_pack) #define ATF_TC_WITHOUT_HEAD(tc) \ static void atfu_ ## tc ## _body(const atf_tc_t *); \ static atf_tc_t atfu_ ## tc ## _tc; \ static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ .m_ident = #tc, \ .m_head = NULL, \ .m_body = atfu_ ## tc ## _body, \ .m_cleanup = NULL, \ } #define ATF_TC(tc) \ static void atfu_ ## tc ## _head(atf_tc_t *); \ static void atfu_ ## tc ## _body(const atf_tc_t *); \ static atf_tc_t atfu_ ## tc ## _tc; \ static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ .m_ident = #tc, \ .m_head = atfu_ ## tc ## _head, \ .m_body = atfu_ ## tc ## _body, \ .m_cleanup = NULL, \ } #define ATF_TC_WITH_CLEANUP(tc) \ static void atfu_ ## tc ## _head(atf_tc_t *); \ static void atfu_ ## tc ## _body(const atf_tc_t *); \ static void atfu_ ## tc ## _cleanup(const atf_tc_t *); \ static atf_tc_t atfu_ ## tc ## _tc; \ static atf_tc_pack_t atfu_ ## tc ## _tc_pack = { \ .m_ident = #tc, \ .m_head = atfu_ ## tc ## _head, \ .m_body = atfu_ ## tc ## _body, \ .m_cleanup = atfu_ ## tc ## _cleanup, \ } #define ATF_TC_HEAD(tc, tcptr) \ static \ void \ atfu_ ## tc ## _head(atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) #define ATF_TC_HEAD_NAME(tc) \ (atfu_ ## tc ## _head) #define ATF_TC_BODY(tc, tcptr) \ static \ void \ atfu_ ## tc ## _body(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) #define ATF_TC_BODY_NAME(tc) \ (atfu_ ## tc ## _body) #define ATF_TC_CLEANUP(tc, tcptr) \ static \ void \ atfu_ ## tc ## _cleanup(const atf_tc_t *tcptr ATF_DEFS_ATTRIBUTE_UNUSED) #define ATF_TC_CLEANUP_NAME(tc) \ (atfu_ ## tc ## _cleanup) #define ATF_TP_ADD_TCS(tps) \ static atf_error_t atfu_tp_add_tcs(atf_tp_t *); \ int atf_tp_main(int, char **, atf_error_t (*)(atf_tp_t *)); \ \ int \ main(int argc, char **argv) \ { \ return atf_tp_main(argc, argv, atfu_tp_add_tcs); \ } \ static \ atf_error_t \ atfu_tp_add_tcs(atf_tp_t *tps) #define ATF_TP_ADD_TC(tp, tc) \ do { \ atf_error_t atfu_err; \ char **atfu_config = atf_tp_get_config(tp); \ if (atfu_config == NULL) \ return atf_no_memory_error(); \ atfu_err = atf_tc_init_pack(&atfu_ ## tc ## _tc, \ &atfu_ ## tc ## _tc_pack, \ (const char *const *)atfu_config); \ atf_utils_free_charpp(atfu_config); \ if (atf_is_error(atfu_err)) \ return atfu_err; \ atfu_err = atf_tp_add_tc(tp, &atfu_ ## tc ## _tc); \ if (atf_is_error(atfu_err)) \ return atfu_err; \ } while (0) #define ATF_REQUIRE_MSG(x, fmt, ...) \ do { \ if (!(x)) \ atf_tc_fail_requirement(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ } while(0) #define ATF_CHECK_MSG(x, fmt, ...) \ do { \ if (!(x)) \ atf_tc_fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \ } while(0) #define ATF_REQUIRE(x) \ do { \ if (!(x)) \ atf_tc_fail_requirement(__FILE__, __LINE__, "%s", #x " not met"); \ } while(0) #define ATF_CHECK(x) \ do { \ if (!(x)) \ atf_tc_fail_check(__FILE__, __LINE__, "%s", #x " not met"); \ } while(0) #define ATF_REQUIRE_EQ(x, y) \ ATF_REQUIRE_MSG((x) == (y), "%s != %s", #x, #y) #define ATF_CHECK_EQ(x, y) \ ATF_CHECK_MSG((x) == (y), "%s != %s", #x, #y) #define ATF_REQUIRE_EQ_MSG(x, y, fmt, ...) \ ATF_REQUIRE_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) #define ATF_CHECK_EQ_MSG(x, y, fmt, ...) \ ATF_CHECK_MSG((x) == (y), "%s != %s: " fmt, #x, #y, ##__VA_ARGS__) #define ATF_REQUIRE_STREQ(x, y) \ ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) #define ATF_CHECK_STREQ(x, y) \ ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s)", #x, #y, x, y) #define ATF_REQUIRE_STREQ_MSG(x, y, fmt, ...) \ ATF_REQUIRE_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ #x, #y, x, y, ##__VA_ARGS__) #define ATF_CHECK_STREQ_MSG(x, y, fmt, ...) \ ATF_CHECK_MSG(strcmp(x, y) == 0, "%s != %s (%s != %s): " fmt, \ #x, #y, x, y, ##__VA_ARGS__) #define ATF_REQUIRE_MATCH(regexp, string) \ ATF_REQUIRE_MSG(atf_utils_grep_string("%s", string, regexp), \ "'%s' not matched in '%s'", regexp, string); #define ATF_CHECK_MATCH(regexp, string) \ ATF_CHECK_MSG(atf_utils_grep_string("%s", string, regexp), \ "'%s' not matched in '%s'", regexp, string); #define ATF_REQUIRE_MATCH_MSG(regexp, string, fmt, ...) \ ATF_REQUIRE_MSG(atf_utils_grep_string("%s", string, regexp), \ "'%s' not matched in '%s': " fmt, regexp, string, \ ##__VA_ARGS__); #define ATF_CHECK_MATCH_MSG(regexp, string, fmt, ...) \ ATF_CHECK_MSG(atf_utils_grep_string("%s", string, regexp), \ "'%s' not matched in '%s': " fmt, regexp, string, \ ##__VA_ARGS__); #define ATF_CHECK_ERRNO(exp_errno, bool_expr) \ atf_tc_check_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) #define ATF_REQUIRE_ERRNO(exp_errno, bool_expr) \ atf_tc_require_errno(__FILE__, __LINE__, exp_errno, #bool_expr, bool_expr) #endif /* !defined(ATF_C_MACROS_H) */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/build.h0000644000470500017500000000353412271526120017621 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2009 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_BUILD_H) #define ATF_C_BUILD_H #include atf_error_t atf_build_c_o(const char *, const char *, const char *const [], char ***); atf_error_t atf_build_cpp(const char *, const char *, const char *const [], char ***); atf_error_t atf_build_cxx_o(const char *, const char *, const char *const [], char ***); #endif /* ATF_C_BUILD_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/check.h0000644000470500017500000000601012271526120017567 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_CHECK_H) #define ATF_C_CHECK_H #include #include /* --------------------------------------------------------------------- * The "atf_check_result" type. * --------------------------------------------------------------------- */ struct atf_check_result_impl; struct atf_check_result { struct atf_check_result_impl *pimpl; }; typedef struct atf_check_result atf_check_result_t; /* Construtors and destructors */ void atf_check_result_fini(atf_check_result_t *); /* Getters */ const char *atf_check_result_stdout(const atf_check_result_t *); const char *atf_check_result_stderr(const atf_check_result_t *); bool atf_check_result_exited(const atf_check_result_t *); int atf_check_result_exitcode(const atf_check_result_t *); bool atf_check_result_signaled(const atf_check_result_t *); int atf_check_result_termsig(const atf_check_result_t *); /* --------------------------------------------------------------------- * Free functions. * --------------------------------------------------------------------- */ atf_error_t atf_check_build_c_o(const char *, const char *, const char *const [], bool *); atf_error_t atf_check_build_cpp(const char *, const char *, const char *const [], bool *); atf_error_t atf_check_build_cxx_o(const char *, const char *, const char *const [], bool *); atf_error_t atf_check_exec_array(const char *const *, atf_check_result_t *); #endif /* ATF_C_CHECK_H */ bind9-9.9.5.dfsg/unit/atf-src/atf-c/utils_test.c0000644000470500017500000004035112271526120020712 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2010 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "atf-c/utils.h" #include "detail/test_helpers.h" /** Reads the contents of a file into a buffer. * * Up to buflen-1 characters are read into buffer. If this function returns, * the contents read into the buffer are guaranteed to be nul-terminated. * Note, however, that if the file contains any nul characters itself, * comparing it "as a string" will not work. * * \param path The file to be read, which must exist. * \param buffer Buffer into which to store the file contents. * \param buflen Size of the target buffer. * * \return The count of bytes read. */ static ssize_t read_file(const char *path, void *const buffer, const size_t buflen) { const int fd = open(path, O_RDONLY); ATF_REQUIRE_MSG(fd != -1, "Cannot open %s", path); const ssize_t length = read(fd, buffer, buflen - 1); close(fd); ATF_REQUIRE(length != -1); ((char *)buffer)[length] = '\0'; return length; } ATF_TC_WITHOUT_HEAD(cat_file__empty); ATF_TC_BODY(cat_file__empty, tc) { atf_utils_create_file("file.txt", "%s", ""); atf_utils_redirect(STDOUT_FILENO, "captured.txt"); atf_utils_cat_file("file.txt", "PREFIX"); fflush(stdout); close(STDOUT_FILENO); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("", buffer); } ATF_TC_WITHOUT_HEAD(cat_file__one_line); ATF_TC_BODY(cat_file__one_line, tc) { atf_utils_create_file("file.txt", "This is a single line\n"); atf_utils_redirect(STDOUT_FILENO, "captured.txt"); atf_utils_cat_file("file.txt", "PREFIX"); fflush(stdout); close(STDOUT_FILENO); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("PREFIXThis is a single line\n", buffer); } ATF_TC_WITHOUT_HEAD(cat_file__several_lines); ATF_TC_BODY(cat_file__several_lines, tc) { atf_utils_create_file("file.txt", "First\nSecond line\nAnd third\n"); atf_utils_redirect(STDOUT_FILENO, "captured.txt"); atf_utils_cat_file("file.txt", ">"); fflush(stdout); close(STDOUT_FILENO); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ(">First\n>Second line\n>And third\n", buffer); } ATF_TC_WITHOUT_HEAD(cat_file__no_newline_eof); ATF_TC_BODY(cat_file__no_newline_eof, tc) { atf_utils_create_file("file.txt", "Foo\n bar baz"); atf_utils_redirect(STDOUT_FILENO, "captured.txt"); atf_utils_cat_file("file.txt", "PREFIX"); fflush(stdout); close(STDOUT_FILENO); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("PREFIXFoo\nPREFIX bar baz", buffer); } ATF_TC_WITHOUT_HEAD(compare_file__empty__match); ATF_TC_BODY(compare_file__empty__match, tc) { atf_utils_create_file("test.txt", "%s", ""); ATF_REQUIRE(atf_utils_compare_file("test.txt", "")); } ATF_TC_WITHOUT_HEAD(compare_file__empty__not_match); ATF_TC_BODY(compare_file__empty__not_match, tc) { atf_utils_create_file("test.txt", "%s", ""); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "\n")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "foo")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", " ")); } ATF_TC_WITHOUT_HEAD(compare_file__short__match); ATF_TC_BODY(compare_file__short__match, tc) { atf_utils_create_file("test.txt", "this is a short file"); ATF_REQUIRE(atf_utils_compare_file("test.txt", "this is a short file")); } ATF_TC_WITHOUT_HEAD(compare_file__short__not_match); ATF_TC_BODY(compare_file__short__not_match, tc) { atf_utils_create_file("test.txt", "this is a short file"); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "\n")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "this is a Short file")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "this is a short fil")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "this is a short file ")); } ATF_TC_WITHOUT_HEAD(compare_file__long__match); ATF_TC_BODY(compare_file__long__match, tc) { char long_contents[3456]; size_t i = 0; for (; i < sizeof(long_contents) - 1; i++) long_contents[i] = '0' + (i % 10); long_contents[i] = '\0'; atf_utils_create_file("test.txt", "%s", long_contents); ATF_REQUIRE(atf_utils_compare_file("test.txt", long_contents)); } ATF_TC_WITHOUT_HEAD(compare_file__long__not_match); ATF_TC_BODY(compare_file__long__not_match, tc) { char long_contents[3456]; size_t i = 0; for (; i < sizeof(long_contents) - 1; i++) long_contents[i] = '0' + (i % 10); long_contents[i] = '\0'; atf_utils_create_file("test.txt", "%s", long_contents); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "\n")); ATF_REQUIRE(!atf_utils_compare_file("test.txt", "0123456789")); long_contents[i - 1] = 'Z'; ATF_REQUIRE(!atf_utils_compare_file("test.txt", long_contents)); } ATF_TC_WITHOUT_HEAD(copy_file__empty); ATF_TC_BODY(copy_file__empty, tc) { atf_utils_create_file("src.txt", "%s", ""); ATF_REQUIRE(chmod("src.txt", 0520) != -1); atf_utils_copy_file("src.txt", "dest.txt"); ATF_REQUIRE(atf_utils_compare_file("dest.txt", "")); struct stat sb; ATF_REQUIRE(stat("dest.txt", &sb) != -1); ATF_REQUIRE_EQ(0520, sb.st_mode & 0xfff); } ATF_TC_WITHOUT_HEAD(copy_file__some_contents); ATF_TC_BODY(copy_file__some_contents, tc) { atf_utils_create_file("src.txt", "This is a\ntest file\n"); atf_utils_copy_file("src.txt", "dest.txt"); ATF_REQUIRE(atf_utils_compare_file("dest.txt", "This is a\ntest file\n")); } ATF_TC_WITHOUT_HEAD(create_file); ATF_TC_BODY(create_file, tc) { atf_utils_create_file("test.txt", "This is a test with %d", 12345); char buffer[128]; read_file("test.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("This is a test with 12345", buffer); } ATF_TC_WITHOUT_HEAD(file_exists); ATF_TC_BODY(file_exists, tc) { atf_utils_create_file("test.txt", "foo"); ATF_REQUIRE( atf_utils_file_exists("test.txt")); ATF_REQUIRE( atf_utils_file_exists("./test.txt")); ATF_REQUIRE(!atf_utils_file_exists("./test.tx")); ATF_REQUIRE(!atf_utils_file_exists("test.txt2")); } ATF_TC_WITHOUT_HEAD(fork); ATF_TC_BODY(fork, tc) { fprintf(stdout, "Should not get into child\n"); fprintf(stderr, "Should not get into child\n"); pid_t pid = atf_utils_fork(); if (pid == 0) { fprintf(stdout, "Child stdout\n"); fprintf(stderr, "Child stderr\n"); exit(EXIT_SUCCESS); } int status; ATF_REQUIRE(waitpid(pid, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); char buffer[1024]; read_file("atf_utils_fork_out.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("Child stdout\n", buffer); read_file("atf_utils_fork_err.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("Child stderr\n", buffer); } ATF_TC_WITHOUT_HEAD(free_charpp__empty); ATF_TC_BODY(free_charpp__empty, tc) { char **array = malloc(sizeof(char *) * 1); array[0] = NULL; atf_utils_free_charpp(array); } ATF_TC_WITHOUT_HEAD(free_charpp__some); ATF_TC_BODY(free_charpp__some, tc) { char **array = malloc(sizeof(char *) * 4); array[0] = strdup("first"); array[1] = strdup("second"); array[2] = strdup("third"); array[3] = NULL; atf_utils_free_charpp(array); } ATF_TC_WITHOUT_HEAD(grep_file); ATF_TC_BODY(grep_file, tc) { atf_utils_create_file("test.txt", "line1\nthe second line\naaaabbbb\n"); ATF_CHECK(atf_utils_grep_file("line1", "test.txt")); ATF_CHECK(atf_utils_grep_file("line%d", "test.txt", 1)); ATF_CHECK(atf_utils_grep_file("second line", "test.txt")); ATF_CHECK(atf_utils_grep_file("aa.*bb", "test.txt")); ATF_CHECK(!atf_utils_grep_file("foo", "test.txt")); ATF_CHECK(!atf_utils_grep_file("bar", "test.txt")); ATF_CHECK(!atf_utils_grep_file("aaaaa", "test.txt")); } ATF_TC_WITHOUT_HEAD(grep_string); ATF_TC_BODY(grep_string, tc) { const char *str = "a string - aaaabbbb"; ATF_CHECK(atf_utils_grep_string("a string", str)); ATF_CHECK(atf_utils_grep_string("^a string", str)); ATF_CHECK(atf_utils_grep_string("aaaabbbb$", str)); ATF_CHECK(atf_utils_grep_string("a%s*bb", str, "a.")); ATF_CHECK(!atf_utils_grep_string("foo", str)); ATF_CHECK(!atf_utils_grep_string("bar", str)); ATF_CHECK(!atf_utils_grep_string("aaaaa", str)); } ATF_TC_WITHOUT_HEAD(readline__none); ATF_TC_BODY(readline__none, tc) { atf_utils_create_file("empty.txt", "%s", ""); const int fd = open("empty.txt", O_RDONLY); ATF_REQUIRE(fd != -1); ATF_REQUIRE(atf_utils_readline(fd) == NULL); close(fd); } ATF_TC_WITHOUT_HEAD(readline__some); ATF_TC_BODY(readline__some, tc) { const char *l1 = "First line with % formatting % characters %"; const char *l2 = "Second line; much longer than the first one"; const char *l3 = "Last line, without terminator"; atf_utils_create_file("test.txt", "%s\n%s\n%s", l1, l2, l3); const int fd = open("test.txt", O_RDONLY); ATF_REQUIRE(fd != -1); char *line; line = atf_utils_readline(fd); ATF_REQUIRE_STREQ(l1, line); free(line); line = atf_utils_readline(fd); ATF_REQUIRE_STREQ(l2, line); free(line); line = atf_utils_readline(fd); ATF_REQUIRE_STREQ(l3, line); free(line); close(fd); } ATF_TC_WITHOUT_HEAD(redirect__stdout); ATF_TC_BODY(redirect__stdout, tc) { printf("Buffer this"); atf_utils_redirect(STDOUT_FILENO, "captured.txt"); printf("The printed message"); fflush(stdout); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("The printed message", buffer); } ATF_TC_WITHOUT_HEAD(redirect__stderr); ATF_TC_BODY(redirect__stderr, tc) { fprintf(stderr, "Buffer this"); atf_utils_redirect(STDERR_FILENO, "captured.txt"); fprintf(stderr, "The printed message"); fflush(stderr); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ("The printed message", buffer); } ATF_TC_WITHOUT_HEAD(redirect__other); ATF_TC_BODY(redirect__other, tc) { const char *message = "Foo bar\nbaz\n"; atf_utils_redirect(15, "captured.txt"); ATF_REQUIRE(write(15, message, strlen(message)) != -1); close(15); char buffer[1024]; read_file("captured.txt", buffer, sizeof(buffer)); ATF_REQUIRE_STREQ(message, buffer); } static void fork_and_wait(const int exitstatus, const char* expout, const char* experr) { const pid_t pid = atf_utils_fork(); if (pid == 0) { fprintf(stdout, "Some output\n"); fprintf(stderr, "Some error\n"); exit(123); } atf_utils_wait(pid, exitstatus, expout, experr); exit(EXIT_SUCCESS); } ATF_TC_WITHOUT_HEAD(wait__ok); ATF_TC_BODY(wait__ok, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); } } ATF_TC_WITHOUT_HEAD(wait__invalid_exitstatus); ATF_TC_BODY(wait__invalid_exitstatus, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(120, "Some output\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TC_WITHOUT_HEAD(wait__invalid_stdout); ATF_TC_BODY(wait__invalid_stdout, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output foo\n", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TC_WITHOUT_HEAD(wait__invalid_stderr); ATF_TC_BODY(wait__invalid_stderr, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "Some error foo\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_FAILURE, WEXITSTATUS(status)); } } ATF_TC_WITHOUT_HEAD(wait__save_stdout); ATF_TC_BODY(wait__save_stdout, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "save:my-output.txt", "Some error\n"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); ATF_REQUIRE(atf_utils_compare_file("my-output.txt", "Some output\n")); } } ATF_TC_WITHOUT_HEAD(wait__save_stderr); ATF_TC_BODY(wait__save_stderr, tc) { const pid_t control = fork(); ATF_REQUIRE(control != -1); if (control == 0) fork_and_wait(123, "Some output\n", "save:my-output.txt"); else { int status; ATF_REQUIRE(waitpid(control, &status, 0) != -1); ATF_REQUIRE(WIFEXITED(status)); ATF_REQUIRE_EQ(EXIT_SUCCESS, WEXITSTATUS(status)); ATF_REQUIRE(atf_utils_compare_file("my-output.txt", "Some error\n")); } } HEADER_TC(include, "atf-c/utils.h"); ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, cat_file__empty); ATF_TP_ADD_TC(tp, cat_file__one_line); ATF_TP_ADD_TC(tp, cat_file__several_lines); ATF_TP_ADD_TC(tp, cat_file__no_newline_eof); ATF_TP_ADD_TC(tp, compare_file__empty__match); ATF_TP_ADD_TC(tp, compare_file__empty__not_match); ATF_TP_ADD_TC(tp, compare_file__short__match); ATF_TP_ADD_TC(tp, compare_file__short__not_match); ATF_TP_ADD_TC(tp, compare_file__long__match); ATF_TP_ADD_TC(tp, compare_file__long__not_match); ATF_TP_ADD_TC(tp, copy_file__empty); ATF_TP_ADD_TC(tp, copy_file__some_contents); ATF_TP_ADD_TC(tp, create_file); ATF_TP_ADD_TC(tp, file_exists); ATF_TP_ADD_TC(tp, fork); ATF_TP_ADD_TC(tp, free_charpp__empty); ATF_TP_ADD_TC(tp, free_charpp__some); ATF_TP_ADD_TC(tp, grep_file); ATF_TP_ADD_TC(tp, grep_string); ATF_TP_ADD_TC(tp, readline__none); ATF_TP_ADD_TC(tp, readline__some); ATF_TP_ADD_TC(tp, redirect__stdout); ATF_TP_ADD_TC(tp, redirect__stderr); ATF_TP_ADD_TC(tp, redirect__other); ATF_TP_ADD_TC(tp, wait__ok); ATF_TP_ADD_TC(tp, wait__save_stdout); ATF_TP_ADD_TC(tp, wait__save_stderr); ATF_TP_ADD_TC(tp, wait__invalid_exitstatus); ATF_TP_ADD_TC(tp, wait__invalid_stdout); ATF_TP_ADD_TC(tp, wait__invalid_stderr); ATF_TP_ADD_TC(tp, include); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/atf-c/atf-common.m40000644000470500017500000000701212271526120020646 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright 2011 Google Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl * Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl * Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl * Neither the name of Google Inc. nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT dnl OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT dnl LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, dnl DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY dnl THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT dnl (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE dnl OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl dnl ATF_ARG_WITH dnl dnl Adds a --with-atf flag to the configure script that allows the user to dnl enable or disable atf support. dnl dnl The ATF_CHECK_{C,CXX,SH} macros honor the flag defined herein if dnl instantiated. If not instantiated, they will request the presence of dnl the libraries unconditionally. dnl dnl Defines the WITH_ATF Automake conditional if ATF has been found by any dnl of the ATF_CHECK_{C,CXX,SH} macros. AC_DEFUN([ATF_ARG_WITH], [ m4_define([atf_arg_with_called], [yes]) m4_divert_text([DEFAULTS], [with_atf=auto]) AC_ARG_WITH([atf], [AS_HELP_STRING([--with-atf=], [build atf-based test programs])], [with_atf=${withval}], [with_atf=auto]) m4_divert_text([DEFAULTS], [ found_atf_c=no found_atf_cxx=no found_atf_sh=no ]) AM_CONDITIONAL([WITH_ATF], [test x"${found_atf_c}" = x"yes" -o \ x"${found_atf_cxx}" = x"yes" -o \ x"${found_atf_sh}" = x"yes"]) ]) dnl _ATF_CHECK_ARG_WITH(check, error_message) dnl dnl Internal macro to execute a check conditional on the --with-atf flag dnl and handle the result accordingly. dnl dnl 'check' specifies the piece of code to be run to detect the feature. dnl This code must set the 'found' shell variable to yes or no depending dnl on the raw result of the check. AC_DEFUN([_ATF_CHECK_ARG_WITH], [ m4_ifdef([atf_arg_with_called], [ m4_fatal([ATF_ARG_WITH must be called after the ATF_CHECK_* checks]) ]) m4_divert_text([DEFAULTS], [with_atf=yes]) if test x"${with_atf}" = x"no"; then _found=no else $1 if test x"${with_atf}" = x"auto"; then _found="${found}" else if test x"${found}" = x"yes"; then _found=yes else AC_MSG_ERROR([$2]) fi fi fi ]) bind9-9.9.5.dfsg/unit/atf-src/atf-c/h_build.h0000644000470500017500000002020312271526120020120 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2009 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined(TESTS_ATF_ATF_C_H_BUILD_H) # error "Cannot include h_build.h more than once." #else # define TESTS_ATF_ATF_C_H_BUILD_H #endif /* --------------------------------------------------------------------- * Test case data. * --------------------------------------------------------------------- */ static struct c_o_test { const char *msg; const char *cc; const char *cflags; const char *cppflags; const char *sfile; const char *ofile; bool hasoptargs; const char *const optargs[16]; const char *const expargv[16]; } c_o_tests[] = { { "No flags", "cc", "", "", "test.c", "test.o", false, { NULL }, { "cc", "-o", "test.o", "-c", "test.c", NULL }, }, { "Multi-word program name", "cc -foo", "", "", "test.c", "test.o", false, { NULL }, { "cc", "-foo", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cflags", "cc", "-f1 -f2 -f3 -f4-f5", "", "test.c", "test.o", false, { NULL }, { "cc", "-f1", "-f2", "-f3", "-f4-f5", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cppflags", "cc", "", "-f1 -f2 -f3 -f4-f5", "test.c", "test.o", false, { NULL }, { "cc", "-f1", "-f2", "-f3", "-f4-f5", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cflags and cppflags", "cc", "-f2", "-f1", "test.c", "test.o", false, { NULL }, { "cc", "-f1", "-f2", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some optional arguments", "cc", "", "", "test.c", "test.o", true, { "-o1", "-o2", NULL }, { "cc", "-o1", "-o2", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cflags, cppflags and optional arguments", "cc", "-f2", "-f1", "test.c", "test.o", true, { "-o1", "-o2", NULL }, { "cc", "-f1", "-f2", "-o1", "-o2", "-o", "test.o", "-c", "test.c", NULL }, }, { NULL, NULL, NULL, NULL, NULL, NULL, false, { NULL }, { NULL }, }, }; static struct cpp_test { const char *msg; const char *cpp; const char *cppflags; const char *sfile; const char *ofile; bool hasoptargs; const char *const optargs[16]; const char *const expargv[16]; } cpp_tests[] = { { "No flags", "cpp", "", "test.c", "test.out", false, { NULL }, { "cpp", "-o", "test.out", "test.c", NULL }, }, { "Multi-word program name", "cpp -foo", "", "test.c", "test.out", false, { NULL }, { "cpp", "-foo", "-o", "test.out", "test.c", NULL }, }, { "Some cppflags", "cpp", "-f1 -f2 -f3 -f4-f5", "test.c", "test.out", false, { NULL }, { "cpp", "-f1", "-f2", "-f3", "-f4-f5", "-o", "test.out", "test.c", NULL }, }, { "Some optional arguments", "cpp", "", "test.c", "test.out", true, { "-o1", "-o2", NULL }, { "cpp", "-o1", "-o2", "-o", "test.out", "test.c", NULL }, }, { "Some cppflags and optional arguments", "cpp", "-f1", "test.c", "test.out", true, { "-o1", "-o2", NULL }, { "cpp", "-f1", "-o1", "-o2", "-o", "test.out", "test.c", NULL }, }, { NULL, NULL, NULL, NULL, NULL, false, { NULL }, { NULL }, }, }; static struct cxx_o_test { const char *msg; const char *cxx; const char *cxxflags; const char *cppflags; const char *sfile; const char *ofile; bool hasoptargs; const char *const optargs[16]; const char *const expargv[16]; } cxx_o_tests[] = { { "No flags", "c++", "", "", "test.c", "test.o", false, { NULL }, { "c++", "-o", "test.o", "-c", "test.c", NULL }, }, { "Multi-word program name", "c++ -foo", "", "", "test.c", "test.o", false, { NULL }, { "c++", "-foo", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cxxflags", "c++", "-f1 -f2 -f3 -f4-f5", "", "test.c", "test.o", false, { NULL }, { "c++", "-f1", "-f2", "-f3", "-f4-f5", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cppflags", "c++", "", "-f1 -f2 -f3 -f4-f5", "test.c", "test.o", false, { NULL }, { "c++", "-f1", "-f2", "-f3", "-f4-f5", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cxxflags and cppflags", "c++", "-f2", "-f1", "test.c", "test.o", false, { NULL }, { "c++", "-f1", "-f2", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some optional arguments", "c++", "", "", "test.c", "test.o", true, { "-o1", "-o2", NULL }, { "c++", "-o1", "-o2", "-o", "test.o", "-c", "test.c", NULL }, }, { "Some cxxflags, cppflags and optional arguments", "c++", "-f2", "-f1", "test.c", "test.o", true, { "-o1", "-o2", NULL }, { "c++", "-f1", "-f2", "-o1", "-o2", "-o", "test.o", "-c", "test.c", NULL }, }, { NULL, NULL, NULL, NULL, NULL, NULL, false, { NULL }, { NULL }, }, }; bind9-9.9.5.dfsg/unit/atf-src/Makefile.am0000644000470500017500000001007712271526120017413 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_aclocal_DATA = BUILT_SOURCES = CLEANFILES = EXTRA_DIST = bin_PROGRAMS = dist_man_MANS = include_HEADERS = lib_LTLIBRARIES = libexec_PROGRAMS = man_MANS = noinst_DATA = noinst_LTLIBRARIES = INSTALLCHECK_TARGETS = PHONY_TARGETS = ACLOCAL_AMFLAGS = -I m4 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-tools include admin/Makefile.am.inc include atf-c/Makefile.am.inc include atf-c++/Makefile.am.inc include atf-sh/Makefile.am.inc include bootstrap/Makefile.am.inc include doc/Makefile.am.inc include test-programs/Makefile.am.inc if ENABLE_TOOLS include atf-report/Makefile.am.inc include atf-config/Makefile.am.inc include atf-run/Makefile.am.inc include atf-version/Makefile.am.inc endif # # Top-level distfile documents. # doc_DATA = AUTHORS COPYING NEWS README noinst_DATA += INSTALL README EXTRA_DIST += $(doc_DATA) INSTALL README # # Supporting logic to run our custom testsuite. # TESTS_ENVIRONMENT = PATH=$(prefix)/bin:$${PATH} \ PKG_CONFIG_PATH=$(prefix)/lib/pkgconfig testsdir = $(exec_prefix)/tests pkgtestsdir = $(testsdir)/$(PACKAGE) if ENABLE_TOOLS INSTALLCHECK_TARGETS += installcheck-atf PHONY_TARGETS += installcheck-atf installcheck-atf: logfile=$$(pwd)/installcheck.log; \ fifofile=$$(pwd)/installcheck.fifo; \ cd $(pkgtestsdir); \ rm -f $${fifofile}; \ mkfifo $${fifofile}; \ cat $${fifofile} | tee $${logfile} | $(TESTS_ENVIRONMENT) atf-report & \ $(TESTS_ENVIRONMENT) atf-run >>$${fifofile}; \ res=$${?}; \ wait; \ rm $${fifofile}; \ echo; \ echo "The verbatim output of atf-run has been saved to" \ "installcheck.log; exit was $${res}"; \ test $${res} -eq 0 CLEANFILES += installcheck.fifo installcheck.log endif PHONY_TARGETS += installcheck-kyua if HAVE_KYUA if !ENABLE_TOOLS INSTALLCHECK_TARGETS += installcheck-kyua endif installcheck-kyua: cd $(pkgtestsdir) && $(TESTS_ENVIRONMENT) $(KYUA) test endif installcheck-local: $(INSTALLCHECK_TARGETS) pkgtests_DATA = Kyuafile if ENABLE_TOOLS pkgtests_DATA += Atffile endif EXTRA_DIST += $(pkgtests_DATA) BUILD_SH_TP = \ echo "Creating $${dst}"; \ echo "\#! $(bindir)/atf-sh" >$${dst}; \ cat $${src} >>$${dst}; \ chmod +x $${dst} # # Custom targets. # dist-hook: forbid-dist if ENABLE_TOOLS forbid-dist: @true else forbid-dist: @echo "Sorry; cannot make dist without the tools enabled." @echo "Please reconfigure with --enable-tools." @false endif PHONY_TARGETS += clean-all clean-all: GIT="$(GIT)" $(SH) $(srcdir)/admin/clean-all.sh PHONY_TARGETS += release release: $(SH) $(srcdir)/admin/release.sh $(PACKAGE_VERSION) $(DIST_ARCHIVES) PHONY_TARGETS += release-test release-test: $(SH) $(srcdir)/admin/release-test.sh $(DIST_ARCHIVES) .PHONY: $(PHONY_TARGETS) # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/0002755000470500017500000000000012276444014017377 5ustar lamontlamontbind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_fail.sh0000644000470500017500000000326212271526120021653 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2009 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case @TC_NAME@ @TC_NAME@_head() { atf_set "descr" "An empty test case that always fails" } @TC_NAME@_body() { echo "ignore-me" echo "ignore-me" 1>&2 atf_fail "No reason" } atf_init_test_cases() { atf_add_test_case @TC_NAME@ } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/testsuite0000755000470500017500000047002012271526120021351 0ustar lamontlamont#! /bin/sh # Generated from bootstrap/testsuite.at by GNU Autoconf 2.69. # # Copyright (C) 2009-2012 Free Software Foundation, Inc. # # This test suite is free software; the Free Software Foundation gives # unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi 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'` if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} # How were we run? at_cli_args="$@" # Not all shells have the 'times' builtin; the subshell is needed to make # sure we discard the 'times: not found' message from the shell. at_times_p=false (times) >/dev/null 2>&1 && at_times_p=: # CLI Arguments to pass to the debugging scripts. at_debug_args= # -e sets to true at_errexit_p=false # Shall we be verbose? ':' means no, empty means yes. at_verbose=: at_quiet= # Running several jobs in parallel, 0 means as many as test groups. at_jobs=1 at_traceon=: at_trace_echo=: at_check_filter_trace=: # Shall we keep the debug scripts? Must be `:' when the suite is # run by a debug script, so that the script doesn't remove itself. at_debug_p=false # Display help message? at_help_p=false # Display the version message? at_version_p=false # List test groups? at_list_p=false # --clean at_clean=false # Test groups to run at_groups= # Whether to rerun failed tests. at_recheck= # Whether a write failure occurred at_write_fail=0 # The directory we run the suite in. Default to . if no -C option. at_dir=`pwd` # An absolute reference to this testsuite script. case $as_myself in [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;; * ) at_myself=$at_dir/$as_myself ;; esac # Whether -C is in effect. at_change_dir=false # Whether to enable colored test results. at_color=no # List of the tested programs. at_tested='' # As many question marks as there are digits in the last test group number. # Used to normalize the test group numbers so that `ls' lists them in # numerical order. at_format='?' # Description of all the test groups. at_help_all="1;t_test_program_filter.at:30;test_program: filter test cases by name;; 2;t_test_program_run.at:30;test_program: output format and exit codes;; 3;t_test_program_list.at:30;test_program: list test cases;; 4;t_test_program_compare.at:30;test_program: compare the user-visible interfaces;; 5;t_subr_atf_check.at:30;subr: atf_check function;; " # List of the all the test groups. at_groups_all=`$as_echo "$at_help_all" | sed 's/;.*//'` # at_fn_validate_ranges NAME... # ----------------------------- # Validate and normalize the test group number contained in each variable # NAME. Leading zeroes are treated as decimal. at_fn_validate_ranges () { for at_grp do eval at_value=\$$at_grp if test $at_value -lt 1 || test $at_value -gt 5; then $as_echo "invalid test group: $at_value" >&2 exit 1 fi case $at_value in 0*) # We want to treat leading 0 as decimal, like expr and test, but # AS_VAR_ARITH treats it as octal if it uses $(( )). # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the # expr fork, but it is not worth the effort to determine if the # shell supports XSI when the user can just avoid leading 0. eval $at_grp='`expr $at_value + 0`' ;; esac done } at_prev= for at_option do # If the previous option needs an argument, assign it. if test -n "$at_prev"; then at_option=$at_prev=$at_option at_prev= fi case $at_option in *=?*) at_optarg=`expr "X$at_option" : '[^=]*=\(.*\)'` ;; *) at_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $at_option in --help | -h ) at_help_p=: ;; --list | -l ) at_list_p=: ;; --version | -V ) at_version_p=: ;; --clean | -c ) at_clean=: ;; --color ) at_color=always ;; --color=* ) case $at_optarg in no | never | none) at_color=never ;; auto | tty | if-tty) at_color=auto ;; always | yes | force) at_color=always ;; *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'` as_fn_error $? "unrecognized argument to $at_optname: $at_optarg" ;; esac ;; --debug | -d ) at_debug_p=: ;; --errexit | -e ) at_debug_p=: at_errexit_p=: ;; --verbose | -v ) at_verbose=; at_quiet=: ;; --trace | -x ) at_traceon='set -x' at_trace_echo=echo at_check_filter_trace=at_fn_filter_trace ;; [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]) at_fn_validate_ranges at_option as_fn_append at_groups "$at_option$as_nl" ;; # Ranges [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-) at_range_start=`echo $at_option |tr -d X-` at_fn_validate_ranges at_range_start at_range=`$as_echo "$at_groups_all" | \ sed -ne '/^'$at_range_start'$/,$p'` as_fn_append at_groups "$at_range$as_nl" ;; -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]) at_range_end=`echo $at_option |tr -d X-` at_fn_validate_ranges at_range_end at_range=`$as_echo "$at_groups_all" | \ sed -ne '1,/^'$at_range_end'$/p'` as_fn_append at_groups "$at_range$as_nl" ;; [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \ [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \ [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \ [0-9][0-9][0-9]-[0-9][0-9][0-9] | \ [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \ [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] ) at_range_start=`expr $at_option : '\(.*\)-'` at_range_end=`expr $at_option : '.*-\(.*\)'` if test $at_range_start -gt $at_range_end; then at_tmp=$at_range_end at_range_end=$at_range_start at_range_start=$at_tmp fi at_fn_validate_ranges at_range_start at_range_end at_range=`$as_echo "$at_groups_all" | \ sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'` as_fn_append at_groups "$at_range$as_nl" ;; # Directory selection. --directory | -C ) at_prev=--directory ;; --directory=* ) at_change_dir=: at_dir=$at_optarg if test x- = "x$at_dir" ; then at_dir=./- fi ;; # Parallel execution. --jobs | -j ) at_jobs=0 ;; --jobs=* | -j[0-9]* ) if test -n "$at_optarg"; then at_jobs=$at_optarg else at_jobs=`expr X$at_option : 'X-j\(.*\)'` fi case $at_jobs in *[!0-9]*) at_optname=`echo " $at_option" | sed 's/^ //; s/[0-9=].*//'` as_fn_error $? "non-numeric argument to $at_optname: $at_jobs" ;; esac ;; # Keywords. --keywords | -k ) at_prev=--keywords ;; --keywords=* ) at_groups_selected=$at_help_all at_save_IFS=$IFS IFS=, set X $at_optarg shift IFS=$at_save_IFS for at_keyword do at_invert= case $at_keyword in '!'*) at_invert="-v" at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'` ;; esac # It is on purpose that we match the test group titles too. at_groups_selected=`$as_echo "$at_groups_selected" | grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"` done # Smash the keywords. at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//'` as_fn_append at_groups "$at_groups_selected$as_nl" ;; --recheck) at_recheck=: ;; *=*) at_envvar=`expr "x$at_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $at_envvar in '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$at_envvar'" ;; esac at_value=`$as_echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"` # Export now, but save eval for later and for debug scripts. export $at_envvar as_fn_append at_debug_args " $at_envvar='$at_value'" ;; *) $as_echo "$as_me: invalid option: $at_option" >&2 $as_echo "Try \`$0 --help' for more information." >&2 exit 1 ;; esac done # Verify our last option didn't require an argument if test -n "$at_prev"; then : as_fn_error $? "\`$at_prev' requires an argument" fi # The file containing the suite. at_suite_log=$at_dir/$as_me.log # Selected test groups. if test -z "$at_groups$at_recheck"; then at_groups=$at_groups_all else if test -n "$at_recheck" && test -r "$at_suite_log"; then at_oldfails=`sed -n ' /^Failed tests:$/,/^Skipped tests:$/{ s/^[ ]*\([1-9][0-9]*\):.*/\1/p } /^Unexpected passes:$/,/^## Detailed failed tests/{ s/^[ ]*\([1-9][0-9]*\):.*/\1/p } /^## Detailed failed tests/q ' "$at_suite_log"` as_fn_append at_groups "$at_oldfails$as_nl" fi # Sort the tests, removing duplicates. at_groups=`$as_echo "$at_groups" | sort -nu | sed '/^$/d'` fi if test x"$at_color" = xalways \ || { test x"$at_color" = xauto && test -t 1; }; then at_red=`printf '\033[0;31m'` at_grn=`printf '\033[0;32m'` at_lgn=`printf '\033[1;32m'` at_blu=`printf '\033[1;34m'` at_std=`printf '\033[m'` else at_red= at_grn= at_lgn= at_blu= at_std= fi # Help message. if $at_help_p; then cat <<_ATEOF || at_write_fail=1 Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS] Run all the tests, or the selected TESTS, given by numeric ranges, and save a detailed log file. Upon failure, create debugging scripts. Do not change environment variables directly. Instead, set them via command line arguments. Set \`AUTOTEST_PATH' to select the executables to exercise. Each relative directory is expanded as build and source directories relative to the top level of this distribution. E.g., from within the build directory /tmp/foo-1.0, invoking this: $ $0 AUTOTEST_PATH=bin is equivalent to the following, assuming the source directory is /src/foo-1.0: PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $0 _ATEOF cat <<_ATEOF || at_write_fail=1 Operation modes: -h, --help print the help message, then exit -V, --version print version number, then exit -c, --clean remove all the files this test suite might create and exit -l, --list describes all the tests, or the selected TESTS _ATEOF cat <<_ATEOF || at_write_fail=1 Execution tuning: -C, --directory=DIR change to directory DIR before starting --color[=never|auto|always] enable colored test results on terminal, or always -j, --jobs[=N] Allow N jobs at once; infinite jobs with no arg (default 1) -k, --keywords=KEYWORDS select the tests matching all the comma-separated KEYWORDS multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD --recheck select all tests that failed or passed unexpectedly last time -e, --errexit abort as soon as a test fails; implies --debug -v, --verbose force more detailed output default for debugging scripts -d, --debug inhibit clean up and top-level logging default for debugging scripts -x, --trace enable tests shell tracing _ATEOF cat <<_ATEOF || at_write_fail=1 Report bugs to . _ATEOF exit $at_write_fail fi # List of tests. if $at_list_p; then cat <<_ATEOF || at_write_fail=1 Automated Testing Framework 0.17 test suite: bootstrap tests test groups: NUM: FILE-NAME:LINE TEST-GROUP-NAME KEYWORDS _ATEOF # Pass an empty line as separator between selected groups and help. $as_echo "$at_groups$as_nl$as_nl$at_help_all" | awk 'NF == 1 && FS != ";" { selected[$ 1] = 1 next } /^$/ { FS = ";" } NF > 0 { if (selected[$ 1]) { printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3 if ($ 4) { lmax = 79 indent = " " line = indent len = length (line) n = split ($ 4, a, " ") for (i = 1; i <= n; i++) { l = length (a[i]) + 1 if (i > 1 && len + l > lmax) { print line line = indent " " a[i] len = length (line) } else { line = line " " a[i] len += l } } if (n) print line } } }' || at_write_fail=1 exit $at_write_fail fi if $at_version_p; then $as_echo "$as_me (Automated Testing Framework 0.17)" && cat <<\_ATEOF || at_write_fail=1 Copyright (C) 2012 Free Software Foundation, Inc. This test suite is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ATEOF exit $at_write_fail fi # Should we print banners? Yes if more than one test is run. case $at_groups in #( *$as_nl* ) at_print_banners=: ;; #( * ) at_print_banners=false ;; esac # Text for banner N, set to a single space once printed. # Take any -C into account. if $at_change_dir ; then test x != "x$at_dir" && cd "$at_dir" \ || as_fn_error $? "unable to change directory" at_dir=`pwd` fi # Load the config files for any default variable assignments. for at_file in atconfig atlocal do test -r $at_file || continue . ./$at_file || as_fn_error $? "invalid content: $at_file" done # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix: : "${at_top_build_prefix=$at_top_builddir}" # Perform any assignments requested during argument parsing. eval "$at_debug_args" # atconfig delivers names relative to the directory the test suite is # in, but the groups themselves are run in testsuite-dir/group-dir. if test -n "$at_top_srcdir"; then builddir=../.. for at_dir_var in srcdir top_srcdir top_build_prefix do eval at_val=\$at_$at_dir_var case $at_val in [\\/$]* | ?:[\\/]* ) at_prefix= ;; *) at_prefix=../../ ;; esac eval "$at_dir_var=\$at_prefix\$at_val" done fi ## -------------------- ## ## Directory structure. ## ## -------------------- ## # This is the set of directories and files used by this script # (non-literals are capitalized): # # TESTSUITE - the testsuite # TESTSUITE.log - summarizes the complete testsuite run # TESTSUITE.dir/ - created during a run, remains after -d or failed test # + at-groups/ - during a run: status of all groups in run # | + NNN/ - during a run: meta-data about test group NNN # | | + check-line - location (source file and line) of current AT_CHECK # | | + status - exit status of current AT_CHECK # | | + stdout - stdout of current AT_CHECK # | | + stder1 - stderr, including trace # | | + stderr - stderr, with trace filtered out # | | + test-source - portion of testsuite that defines group # | | + times - timestamps for computing duration # | | + pass - created if group passed # | | + xpass - created if group xpassed # | | + fail - created if group failed # | | + xfail - created if group xfailed # | | + skip - created if group skipped # + at-stop - during a run: end the run if this file exists # + at-source-lines - during a run: cache of TESTSUITE line numbers for extraction # + 0..NNN/ - created for each group NNN, remains after -d or failed test # | + TESTSUITE.log - summarizes the group results # | + ... - files created during the group # The directory the whole suite works in. # Should be absolute to let the user `cd' at will. at_suite_dir=$at_dir/$as_me.dir # The file containing the suite ($at_dir might have changed since earlier). at_suite_log=$at_dir/$as_me.log # The directory containing helper files per test group. at_helper_dir=$at_suite_dir/at-groups # Stop file: if it exists, do not start new jobs. at_stop_file=$at_suite_dir/at-stop # The fifo used for the job dispatcher. at_job_fifo=$at_suite_dir/at-job-fifo if $at_clean; then test -d "$at_suite_dir" && find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \; rm -f -r "$at_suite_dir" "$at_suite_log" exit $? fi # Don't take risks: use only absolute directories in PATH. # # For stand-alone test suites (ie. atconfig was not found), # AUTOTEST_PATH is relative to `.'. # # For embedded test suites, AUTOTEST_PATH is relative to the top level # of the package. Then expand it into build/src parts, since users # may create executables in both places. AUTOTEST_PATH=`$as_echo "$AUTOTEST_PATH" | sed "s|:|$PATH_SEPARATOR|g"` at_path= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $AUTOTEST_PATH $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -n "$at_path" && as_fn_append at_path $PATH_SEPARATOR case $as_dir in [\\/]* | ?:[\\/]* ) as_fn_append at_path "$as_dir" ;; * ) if test -z "$at_top_build_prefix"; then # Stand-alone test suite. as_fn_append at_path "$as_dir" else # Embedded test suite. as_fn_append at_path "$at_top_build_prefix$as_dir$PATH_SEPARATOR" as_fn_append at_path "$at_top_srcdir/$as_dir" fi ;; esac done IFS=$as_save_IFS # Now build and simplify PATH. # # There might be directories that don't exist, but don't redirect # builtins' (eg., cd) stderr directly: Ultrix's sh hates that. at_new_path= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $at_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -d "$as_dir" || continue case $as_dir in [\\/]* | ?:[\\/]* ) ;; * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;; esac case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;; $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;; *) as_fn_append at_new_path "$PATH_SEPARATOR$as_dir" ;; esac done IFS=$as_save_IFS PATH=$at_new_path export PATH # Setting up the FDs. # 5 is the log file. Not to be overwritten if `-d'. if $at_debug_p; then at_suite_log=/dev/null else : >"$at_suite_log" fi exec 5>>"$at_suite_log" # Banners and logs. $as_echo "## ------------------------------------------------------------- ## ## Automated Testing Framework 0.17 test suite: bootstrap tests. ## ## ------------------------------------------------------------- ##" { $as_echo "## ------------------------------------------------------------- ## ## Automated Testing Framework 0.17 test suite: bootstrap tests. ## ## ------------------------------------------------------------- ##" echo $as_echo "$as_me: command line was:" $as_echo " \$ $0 $at_cli_args" echo # If ChangeLog exists, list a few lines in case it might help determining # the exact version. if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then $as_echo "## ---------- ## ## ChangeLog. ## ## ---------- ##" echo sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog" echo fi { 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 } echo # Contents of the config files. for at_file in atconfig atlocal do test -r $at_file || continue $as_echo "$as_me: $at_file:" sed 's/^/| /' $at_file echo done } >&5 ## ------------------------- ## ## Autotest shell functions. ## ## ------------------------- ## # at_fn_banner NUMBER # ------------------- # Output banner NUMBER, provided the testsuite is running multiple groups and # this particular banner has not yet been printed. at_fn_banner () { $at_print_banners || return 0 eval at_banner_text=\$at_banner_text_$1 test "x$at_banner_text" = "x " && return 0 eval "at_banner_text_$1=\" \"" if test -z "$at_banner_text"; then $at_first || echo else $as_echo "$as_nl$at_banner_text$as_nl" fi } # at_fn_banner # at_fn_check_prepare_notrace REASON LINE # --------------------------------------- # Perform AT_CHECK preparations for the command at LINE for an untraceable # command; REASON is the reason for disabling tracing. at_fn_check_prepare_notrace () { $at_trace_echo "Not enabling shell tracing (command contains $1)" $as_echo "$2" >"$at_check_line_file" at_check_trace=: at_check_filter=: : >"$at_stdout"; : >"$at_stderr" } # at_fn_check_prepare_trace LINE # ------------------------------ # Perform AT_CHECK preparations for the command at LINE for a traceable # command. at_fn_check_prepare_trace () { $as_echo "$1" >"$at_check_line_file" at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace : >"$at_stdout"; : >"$at_stderr" } # at_fn_check_prepare_dynamic COMMAND LINE # ---------------------------------------- # Decide if COMMAND at LINE is traceable at runtime, and call the appropriate # preparation function. at_fn_check_prepare_dynamic () { case $1 in *$as_nl*) at_fn_check_prepare_notrace 'an embedded newline' "$2" ;; *) at_fn_check_prepare_trace "$2" ;; esac } # at_fn_filter_trace # ------------------ # Remove the lines in the file "$at_stderr" generated by "set -x" and print # them to stderr. at_fn_filter_trace () { mv "$at_stderr" "$at_stder1" grep '^ *+' "$at_stder1" >&2 grep -v '^ *+' "$at_stder1" >"$at_stderr" } # at_fn_log_failure FILE-LIST # --------------------------- # Copy the files in the list on stdout with a "> " prefix, and exit the shell # with a failure exit code. at_fn_log_failure () { for file do $as_echo "$file:"; sed 's/^/> /' "$file"; done echo 1 > "$at_status_file" exit 1 } # at_fn_check_skip EXIT-CODE LINE # ------------------------------- # Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit # the test group subshell with that same exit code. Use LINE in any report # about test failure. at_fn_check_skip () { case $1 in 99) echo 99 > "$at_status_file"; at_failed=: $as_echo "$2: hard failure"; exit 99;; 77) echo 77 > "$at_status_file"; exit 77;; esac } # at_fn_check_status EXPECTED EXIT-CODE LINE # ------------------------------------------ # Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing. # Otherwise, if it is 77 or 99, exit the test group subshell with that same # exit code; if it is anything else print an error message referring to LINE, # and fail the test. at_fn_check_status () { case $2 in $1 ) ;; 77) echo 77 > "$at_status_file"; exit 77;; 99) echo 99 > "$at_status_file"; at_failed=: $as_echo "$3: hard failure"; exit 99;; *) $as_echo "$3: exit code was $2, expected $1" at_failed=:;; esac } # at_fn_diff_devnull FILE # ----------------------- # Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless diff # invocations. at_fn_diff_devnull () { test -s "$1" || return 0 $at_diff "$at_devnull" "$1" } # at_fn_test NUMBER # ----------------- # Parse out test NUMBER from the tail of this file. at_fn_test () { eval at_sed=\$at_sed$1 sed "$at_sed" "$at_myself" > "$at_test_source" } # at_fn_create_debugging_script # ----------------------------- # Create the debugging script $at_group_dir/run which will reproduce the # current test group. at_fn_create_debugging_script () { { echo "#! /bin/sh" && echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\''' && $as_echo "cd '$at_dir'" && $as_echo "exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d $at_debug_args $at_group \${1+\"\$@\"}" && echo 'exit 1' } >"$at_group_dir/run" && chmod +x "$at_group_dir/run" } ## -------------------------------- ## ## End of autotest shell functions. ## ## -------------------------------- ## { $as_echo "## ---------------- ## ## Tested programs. ## ## ---------------- ##" echo } >&5 # Report what programs are being tested. for at_program in : $at_tested do test "$at_program" = : && continue case $at_program in [\\/]* | ?:[\\/]* ) $at_program_=$at_program ;; * ) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -f "$as_dir/$at_program" && break done IFS=$as_save_IFS at_program_=$as_dir/$at_program ;; esac if test -f "$at_program_"; then { $as_echo "$at_srcdir/testsuite.at:30: $at_program_ --version" "$at_program_" --version &5 2>&1 else as_fn_error $? "cannot find $at_program" "$LINENO" 5 fi done { $as_echo "## ------------------ ## ## Running the tests. ## ## ------------------ ##" } >&5 at_start_date=`date` at_start_time=`date +%s 2>/dev/null` $as_echo "$as_me: starting at: $at_start_date" >&5 # Create the master directory if it doesn't already exist. as_dir="$at_suite_dir"; as_fn_mkdir_p || as_fn_error $? "cannot create \`$at_suite_dir'" "$LINENO" 5 # Can we diff with `/dev/null'? DU 5.0 refuses. if diff /dev/null /dev/null >/dev/null 2>&1; then at_devnull=/dev/null else at_devnull=$at_suite_dir/devnull >"$at_devnull" fi # Use `diff -u' when possible. if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff" then at_diff='diff -u' else at_diff=diff fi # Get the last needed group. for at_group in : $at_groups; do :; done # Extract the start and end lines of each test group at the tail # of this file awk ' BEGIN { FS="" } /^#AT_START_/ { start = NR } /^#AT_STOP_/ { test = substr ($ 0, 10) print "at_sed" test "=\"1," start "d;" (NR-1) "q\"" if (test == "'"$at_group"'") exit }' "$at_myself" > "$at_suite_dir/at-source-lines" && . "$at_suite_dir/at-source-lines" || as_fn_error $? "cannot create test line number cache" "$LINENO" 5 rm -f "$at_suite_dir/at-source-lines" # Set number of jobs for `-j'; avoid more jobs than test groups. set X $at_groups; shift; at_max_jobs=$# if test $at_max_jobs -eq 0; then at_jobs=1 fi if test $at_jobs -ne 1 && { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then at_jobs=$at_max_jobs fi # If parallel mode, don't output banners, don't split summary lines. if test $at_jobs -ne 1; then at_print_banners=false at_quiet=: fi # Set up helper dirs. rm -rf "$at_helper_dir" && mkdir "$at_helper_dir" && cd "$at_helper_dir" && { test -z "$at_groups" || mkdir $at_groups; } || as_fn_error $? "testsuite directory setup failed" "$LINENO" 5 # Functions for running a test group. We leave the actual # test group execution outside of a shell function in order # to avoid hitting zsh 4.x exit status bugs. # at_fn_group_prepare # ------------------- # Prepare for running a test group. at_fn_group_prepare () { # The directory for additional per-group helper files. at_job_dir=$at_helper_dir/$at_group # The file containing the location of the last AT_CHECK. at_check_line_file=$at_job_dir/check-line # The file containing the exit status of the last command. at_status_file=$at_job_dir/status # The files containing the output of the tested commands. at_stdout=$at_job_dir/stdout at_stder1=$at_job_dir/stder1 at_stderr=$at_job_dir/stderr # The file containing the code for a test group. at_test_source=$at_job_dir/test-source # The file containing dates. at_times_file=$at_job_dir/times # Be sure to come back to the top test directory. cd "$at_suite_dir" # Clearly separate the test groups when verbose. $at_first || $at_verbose echo at_group_normalized=$at_group eval 'while :; do case $at_group_normalized in #( '"$at_format"'*) break;; esac at_group_normalized=0$at_group_normalized done' # Create a fresh directory for the next test group, and enter. # If one already exists, the user may have invoked ./run from # within that directory; we remove the contents, but not the # directory itself, so that we aren't pulling the rug out from # under the shell's notion of the current directory. at_group_dir=$at_suite_dir/$at_group_normalized at_group_log=$at_group_dir/$as_me.log if test -d "$at_group_dir"; then find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx {} \; rm -fr "$at_group_dir"/* "$at_group_dir"/.[!.] "$at_group_dir"/.??* fi || { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: test directory for $at_group_normalized could not be cleaned" >&5 $as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned" >&2;} # Be tolerant if the above `rm' was not able to remove the directory. as_dir="$at_group_dir"; as_fn_mkdir_p echo 0 > "$at_status_file" # In verbose mode, append to the log file *and* show on # the standard output; in quiet mode only write to the log. if test -z "$at_verbose"; then at_tee_pipe='tee -a "$at_group_log"' else at_tee_pipe='cat >> "$at_group_log"' fi } # at_fn_group_banner ORDINAL LINE DESC PAD [BANNER] # ------------------------------------------------- # Declare the test group ORDINAL, located at LINE with group description DESC, # and residing under BANNER. Use PAD to align the status column. at_fn_group_banner () { at_setup_line="$2" test -n "$5" && at_fn_banner $5 at_desc="$3" case $1 in [0-9]) at_desc_line=" $1: ";; [0-9][0-9]) at_desc_line=" $1: " ;; *) at_desc_line="$1: " ;; esac as_fn_append at_desc_line "$3$4" $at_quiet $as_echo_n "$at_desc_line" echo "# -*- compilation -*-" >> "$at_group_log" } # at_fn_group_postprocess # ----------------------- # Perform cleanup after running a test group. at_fn_group_postprocess () { # Be sure to come back to the suite directory, in particular # since below we might `rm' the group directory we are in currently. cd "$at_suite_dir" if test ! -f "$at_check_line_file"; then sed "s/^ */$as_me: WARNING: /" <<_ATEOF A failure happened in a test group before any test could be run. This means that test suite is improperly designed. Please report this failure to . _ATEOF $as_echo "$at_setup_line" >"$at_check_line_file" at_status=99 fi $at_verbose $as_echo_n "$at_group. $at_setup_line: " $as_echo_n "$at_group. $at_setup_line: " >> "$at_group_log" case $at_xfail:$at_status in yes:0) at_msg="UNEXPECTED PASS" at_res=xpass at_errexit=$at_errexit_p at_color=$at_red ;; no:0) at_msg="ok" at_res=pass at_errexit=false at_color=$at_grn ;; *:77) at_msg='skipped ('`cat "$at_check_line_file"`')' at_res=skip at_errexit=false at_color=$at_blu ;; no:* | *:99) at_msg='FAILED ('`cat "$at_check_line_file"`')' at_res=fail at_errexit=$at_errexit_p at_color=$at_red ;; yes:*) at_msg='expected failure ('`cat "$at_check_line_file"`')' at_res=xfail at_errexit=false at_color=$at_lgn ;; esac echo "$at_res" > "$at_job_dir/$at_res" # In parallel mode, output the summary line only afterwards. if test $at_jobs -ne 1 && test -n "$at_verbose"; then $as_echo "$at_desc_line $at_color$at_msg$at_std" else # Make sure there is a separator even with long titles. $as_echo " $at_color$at_msg$at_std" fi at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg" case $at_status in 0|77) # $at_times_file is only available if the group succeeded. # We're not including the group log, so the success message # is written in the global log separately. But we also # write to the group log in case they're using -d. if test -f "$at_times_file"; then at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')' rm -f "$at_times_file" fi $as_echo "$at_log_msg" >> "$at_group_log" $as_echo "$at_log_msg" >&5 # Cleanup the group directory, unless the user wants the files # or the success was unexpected. if $at_debug_p || test $at_res = xpass; then at_fn_create_debugging_script if test $at_res = xpass && $at_errexit; then echo stop > "$at_stop_file" fi else if test -d "$at_group_dir"; then find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \; rm -fr "$at_group_dir" fi rm -f "$at_test_source" fi ;; *) # Upon failure, include the log into the testsuite's global # log. The failure message is written in the group log. It # is later included in the global log. $as_echo "$at_log_msg" >> "$at_group_log" # Upon failure, keep the group directory for autopsy, and create # the debugging script. With -e, do not start any further tests. at_fn_create_debugging_script if $at_errexit; then echo stop > "$at_stop_file" fi ;; esac } ## ------------ ## ## Driver loop. ## ## ------------ ## if (set -m && set +m && set +b) >/dev/null 2>&1; then set +b at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=- else at_job_control_on=: at_job_control_off=: at_job_group= fi for at_signal in 1 2 15; do trap 'set +x; set +e $at_job_control_off at_signal='"$at_signal"' echo stop > "$at_stop_file" trap "" $at_signal at_pgids= for at_pgid in `jobs -p 2>/dev/null`; do at_pgids="$at_pgids $at_job_group$at_pgid" done test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null wait if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then echo >&2 fi at_signame=`kill -l $at_signal 2>&1 || echo $at_signal` set x $at_signame test 1 -gt 2 && at_signame=$at_signal { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: caught signal $at_signame, bailing out" >&5 $as_echo "$as_me: WARNING: caught signal $at_signame, bailing out" >&2;} as_fn_arith 128 + $at_signal && exit_status=$as_val as_fn_exit $exit_status' $at_signal done rm -f "$at_stop_file" at_first=: if test $at_jobs -ne 1 && rm -f "$at_job_fifo" && test -n "$at_job_group" && ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null then # FIFO job dispatcher. trap 'at_pids= for at_pid in `jobs -p`; do at_pids="$at_pids $at_job_group$at_pid" done if test -n "$at_pids"; then at_sig=TSTP test "${TMOUT+set}" = set && at_sig=STOP kill -$at_sig $at_pids 2>/dev/null fi kill -STOP $$ test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP echo # Turn jobs into a list of numbers, starting from 1. at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p` set X $at_joblist shift for at_group in $at_groups; do $at_job_control_on 2>/dev/null ( # Start one test group. $at_job_control_off if $at_first; then exec 7>"$at_job_fifo" else exec 6<&- fi trap 'set +x; set +e trap "" PIPE echo stop > "$at_stop_file" echo >&7 as_fn_exit 141' PIPE at_fn_group_prepare if cd "$at_group_dir" && at_fn_test $at_group && . "$at_test_source" then :; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;} at_failed=: fi at_fn_group_postprocess echo >&7 ) & $at_job_control_off if $at_first; then at_first=false exec 6<"$at_job_fifo" 7>"$at_job_fifo" fi shift # Consume one token. if test $# -gt 0; then :; else read at_token <&6 || break set x $* fi test -f "$at_stop_file" && break done exec 7>&- # Read back the remaining ($at_jobs - 1) tokens. set X $at_joblist shift if test $# -gt 0; then shift for at_job do read at_token done <&6 fi exec 6<&- wait else # Run serially, avoid forks and other potential surprises. for at_group in $at_groups; do at_fn_group_prepare if cd "$at_group_dir" && at_fn_test $at_group && . "$at_test_source"; then :; else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;} at_failed=: fi at_fn_group_postprocess test -f "$at_stop_file" && break at_first=false done fi # Wrap up the test suite with summary statistics. cd "$at_helper_dir" # Use ?..???? when the list must remain sorted, the faster * otherwise. at_pass_list=`for f in */pass; do echo $f; done | sed '/\*/d; s,/pass,,'` at_skip_list=`for f in */skip; do echo $f; done | sed '/\*/d; s,/skip,,'` at_xfail_list=`for f in */xfail; do echo $f; done | sed '/\*/d; s,/xfail,,'` at_xpass_list=`for f in ?/xpass ??/xpass ???/xpass ????/xpass; do echo $f; done | sed '/?/d; s,/xpass,,'` at_fail_list=`for f in ?/fail ??/fail ???/fail ????/fail; do echo $f; done | sed '/?/d; s,/fail,,'` set X $at_pass_list $at_xpass_list $at_xfail_list $at_fail_list $at_skip_list shift; at_group_count=$# set X $at_xpass_list; shift; at_xpass_count=$#; at_xpass_list=$* set X $at_xfail_list; shift; at_xfail_count=$# set X $at_fail_list; shift; at_fail_count=$#; at_fail_list=$* set X $at_skip_list; shift; at_skip_count=$# as_fn_arith $at_group_count - $at_skip_count && at_run_count=$as_val as_fn_arith $at_xpass_count + $at_fail_count && at_unexpected_count=$as_val as_fn_arith $at_xfail_count + $at_fail_count && at_total_fail_count=$as_val # Back to the top directory. cd "$at_dir" rm -rf "$at_helper_dir" # Compute the duration of the suite. at_stop_date=`date` at_stop_time=`date +%s 2>/dev/null` $as_echo "$as_me: ending at: $at_stop_date" >&5 case $at_start_time,$at_stop_time in [0-9]*,[0-9]*) as_fn_arith $at_stop_time - $at_start_time && at_duration_s=$as_val as_fn_arith $at_duration_s / 60 && at_duration_m=$as_val as_fn_arith $at_duration_m / 60 && at_duration_h=$as_val as_fn_arith $at_duration_s % 60 && at_duration_s=$as_val as_fn_arith $at_duration_m % 60 && at_duration_m=$as_val at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s" $as_echo "$as_me: test suite duration: $at_duration" >&5 ;; esac echo $as_echo "## ------------- ## ## Test results. ## ## ------------- ##" echo { echo $as_echo "## ------------- ## ## Test results. ## ## ------------- ##" echo } >&5 if test $at_run_count = 1; then at_result="1 test" at_were=was else at_result="$at_run_count tests" at_were=were fi if $at_errexit_p && test $at_unexpected_count != 0; then if test $at_xpass_count = 1; then at_result="$at_result $at_were run, one passed" else at_result="$at_result $at_were run, one failed" fi at_result="$at_result unexpectedly and inhibited subsequent tests." at_color=$at_red else # Don't you just love exponential explosion of the number of cases? at_color=$at_red case $at_xpass_count:$at_fail_count:$at_xfail_count in # So far, so good. 0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;; 0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;; # Some unexpected failures 0:*:0) at_result="$at_result $at_were run, $at_fail_count failed unexpectedly." ;; # Some failures, both expected and unexpected 0:*:1) at_result="$at_result $at_were run, $at_total_fail_count failed ($at_xfail_count expected failure)." ;; 0:*:*) at_result="$at_result $at_were run, $at_total_fail_count failed ($at_xfail_count expected failures)." ;; # No unexpected failures, but some xpasses *:0:*) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly." ;; # No expected failures, but failures and xpasses *:1:0) at_result="$at_result $at_were run, $at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;; *:*:0) at_result="$at_result $at_were run, $at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;; # All of them. *:*:1) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly, $at_total_fail_count failed ($at_xfail_count expected failure)." ;; *:*:*) at_result="$at_result $at_were run, $at_xpass_count passed unexpectedly, $at_total_fail_count failed ($at_xfail_count expected failures)." ;; esac if test $at_skip_count = 0 && test $at_run_count -gt 1; then at_result="All $at_result" fi fi # Now put skips in the mix. case $at_skip_count in 0) ;; 1) at_result="$at_result 1 test was skipped." ;; *) at_result="$at_result $at_skip_count tests were skipped." ;; esac if test $at_unexpected_count = 0; then echo "$at_color$at_result$at_std" echo "$at_result" >&5 else echo "${at_color}ERROR: $at_result$at_std" >&2 echo "ERROR: $at_result" >&5 { echo $as_echo "## ------------------------ ## ## Summary of the failures. ## ## ------------------------ ##" # Summary of failed and skipped tests. if test $at_fail_count != 0; then echo "Failed tests:" $SHELL "$at_myself" $at_fail_list --list echo fi if test $at_skip_count != 0; then echo "Skipped tests:" $SHELL "$at_myself" $at_skip_list --list echo fi if test $at_xpass_count != 0; then echo "Unexpected passes:" $SHELL "$at_myself" $at_xpass_list --list echo fi if test $at_fail_count != 0; then $as_echo "## ---------------------- ## ## Detailed failed tests. ## ## ---------------------- ##" echo for at_group in $at_fail_list do at_group_normalized=$at_group eval 'while :; do case $at_group_normalized in #( '"$at_format"'*) break;; esac at_group_normalized=0$at_group_normalized done' cat "$at_suite_dir/$at_group_normalized/$as_me.log" echo done echo fi if test -n "$at_top_srcdir"; then sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## ${at_top_build_prefix}config.log ## _ASBOX sed 's/^/| /' ${at_top_build_prefix}config.log echo fi } >&5 sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## $as_me.log was created. ## _ASBOX echo if $at_debug_p; then at_msg='per-test log files' else at_msg="\`${at_testdir+${at_testdir}/}$as_me.log'" fi $as_echo "Please send $at_msg and all information you think might help: To: Subject: [Automated Testing Framework 0.17] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly} You may investigate any problem if you feel able to do so, in which case the test suite provides a good starting point. Its output may be found below \`${at_testdir+${at_testdir}/}$as_me.dir'. " exit 1 fi exit 0 ## ------------- ## ## Actual tests. ## ## ------------- ## #AT_START_1 at_fn_group_banner 1 't_test_program_filter.at:30' \ "test_program: filter test cases by name" " " at_xfail=no ( $as_echo "1. $at_setup_line: testing $at_desc ..." $at_traceon for h in tp_basic_c tp_basic_cpp tp_basic_sh; do { set +x $as_echo "$at_srcdir/t_test_program_filter.at:35: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap invalid" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_filter.at:35" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap invalid ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_filter.at:35" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:36: grep \"Unknown test case .invalid'\" stderr" at_fn_check_prepare_trace "t_test_program_filter.at:36" ( $at_check_trace; grep "Unknown test case .invalid'" stderr ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:36" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:40: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap \"*p*\"" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_filter.at:40" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap "*p*" ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_filter.at:40" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:41: grep \"Unknown test case .\\\\*p\\\\*'\" stderr" at_fn_check_prepare_trace "t_test_program_filter.at:41" ( $at_check_trace; grep "Unknown test case .\\*p\\*'" stderr ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:41" $at_failed && at_fn_log_failure $at_traceon; } cat >expres <<'_ATEOF' passed _ATEOF { set +x $as_echo "$at_srcdir/t_test_program_filter.at:46: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_filter.at:46" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:46" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:47: cmp -s resout expres" at_fn_check_prepare_trace "t_test_program_filter.at:47" ( $at_check_trace; cmp -s resout expres ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:47" $at_failed && at_fn_log_failure $at_traceon; } cat >expres <<'_ATEOF' skipped: By design _ATEOF { set +x $as_echo "$at_srcdir/t_test_program_filter.at:51: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_filter.at:51" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:51" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:52: cmp -s resout expres" at_fn_check_prepare_trace "t_test_program_filter.at:52" ( $at_check_trace; cmp -s resout expres ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:52" $at_failed && at_fn_log_failure $at_traceon; } cat >expres <<'_ATEOF' failed: On purpose _ATEOF { set +x $as_echo "$at_srcdir/t_test_program_filter.at:56: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_filter.at:56" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_filter.at:56" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_filter.at:57: cmp -s resout expres" at_fn_check_prepare_trace "t_test_program_filter.at:57" ( $at_check_trace; cmp -s resout expres ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_filter.at:57" $at_failed && at_fn_log_failure $at_traceon; } done set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_1 #AT_START_2 at_fn_group_banner 2 't_test_program_run.at:30' \ "test_program: output format and exit codes" " " at_xfail=no ( $as_echo "2. $at_setup_line: testing $at_desc ..." $at_traceon for h in tp_basic_c tp_basic_cpp tp_basic_sh; do { set +x $as_echo "$at_srcdir/t_test_program_run.at:35: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_run.at:35" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:35" $at_failed && at_fn_log_failure $at_traceon; } echo 'passed' >expres <>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:36" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_run.at:38: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_run.at:38" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_run.at:38" $at_failed && at_fn_log_failure $at_traceon; } echo 'failed' >expres <expres { set +x $as_echo "$at_srcdir/t_test_program_run.at:39: diff -u expres resout" at_fn_check_prepare_trace "t_test_program_run.at:39" ( $at_check_trace; diff -u expres resout ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:39" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_run.at:41: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_run.at:41" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:41" $at_failed && at_fn_log_failure $at_traceon; } echo 'skipped' >expres <expres { set +x $as_echo "$at_srcdir/t_test_program_run.at:42: diff -u expres resout" at_fn_check_prepare_trace "t_test_program_run.at:42" ( $at_check_trace; diff -u expres resout ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:42" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_run.at:44: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout default" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_run.at:44" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout default ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:44" $at_failed && at_fn_log_failure $at_traceon; } echo 'passed' >expres <>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_run.at:45" $at_failed && at_fn_log_failure $at_traceon; } done set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_2 #AT_START_3 at_fn_group_banner 3 't_test_program_list.at:30' \ "test_program: list test cases" " " at_xfail=no ( $as_echo "3. $at_setup_line: testing $at_desc ..." $at_traceon for h in tp_basic_c tp_basic_cpp tp_basic_sh; do cat >expout <<'_ATEOF' Content-Type: application/X-atf-tp; version="1" ident: pass descr: An empty test case that always passes ident: fail descr: An empty test case that always fails ident: skip descr: An empty test case that is always skipped ident: default descr: A test case that passes without explicitly stating it _ATEOF { set +x $as_echo "$at_srcdir/t_test_program_list.at:49: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_list.at:49" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_list.at:49" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_list.at:51: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_list.at:51" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_list.at:51" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_list.at:52: grep 'Cannot provide test case names with -l' stderr" at_fn_check_prepare_trace "t_test_program_list.at:52" ( $at_check_trace; grep 'Cannot provide test case names with -l' stderr ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_list.at:52" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_list.at:55: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_\${h} \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l pass fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_list.at:55" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_${h} \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l pass fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_list.at:55" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_list.at:56: grep 'Cannot provide test case names with -l' stderr" at_fn_check_prepare_trace "t_test_program_list.at:56" ( $at_check_trace; grep 'Cannot provide test case names with -l' stderr ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_list.at:56" $at_failed && at_fn_log_failure $at_traceon; } done set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_3 #AT_START_4 at_fn_group_banner 4 't_test_program_compare.at:30' \ "test_program: compare the user-visible interfaces" "" at_xfail=no ( $as_echo "4. $at_setup_line: testing $at_desc ..." $at_traceon { set +x $as_echo "$at_srcdir/t_test_program_compare.at:33: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:33" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:33" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:35: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:35" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:35" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:37: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:37" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:37" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:40: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -h" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:40" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -h ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:40" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:42: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -h" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:42" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -h ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:42" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:44: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -h" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:44" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -h ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:44" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:47: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -Z" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:47" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -Z ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:47" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:49: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -Z" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:49" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -Z ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:49" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:51: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -Z" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:51" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -Z ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:51" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:54: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:54" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:54" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout { set +x $as_echo "$at_srcdir/t_test_program_compare.at:56: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:56" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:56" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout { set +x $as_echo "$at_srcdir/t_test_program_compare.at:58: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -l" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:58" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -l ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:58" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:61: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:61" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:61" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:65: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:65" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:65" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:69: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:69" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:69" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:73: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:73" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:73" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:78: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:78" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:78" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:80: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:80" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:80" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:84: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:84" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:84" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:86: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:86" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:86" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:89: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:89" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:89" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:94: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:94" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:94" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:96: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:96" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:96" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:100: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:100" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:100" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:102: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:102" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:102" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:105: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:105" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:105" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:110: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:110" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:110" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:112: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:112" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:112" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:116: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:116" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:116" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:118: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:118" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:118" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:121: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout default" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:121" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout default ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:121" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:126: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout default" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:126" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout default ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:126" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:128: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:128" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:128" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp { set +x $as_echo "$at_srcdir/t_test_program_compare.at:132: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap -r resout default" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:132" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap -r resout default ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:132" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:134: cmp -s resout resexp" at_fn_check_prepare_trace "t_test_program_compare.at:134" ( $at_check_trace; cmp -s resout resexp ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter at_fn_diff_devnull "$at_stderr" || at_failed=: at_fn_diff_devnull "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:134" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:137: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:137" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:137" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:141: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:141" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:141" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:145: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:145" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:145" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:149: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap unknown" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:149" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap unknown ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:149" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:153: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap unknown" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:153" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap unknown ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:153" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:157: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap unknown" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:157" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap unknown ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 1 $at_status "$at_srcdir/t_test_program_compare.at:157" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:161: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass:cleanup" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:161" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass:cleanup ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:161" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:165: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass:cleanup" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:165" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass:cleanup ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:165" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:169: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap pass:cleanup" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:169" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap pass:cleanup ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:169" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_test_program_compare.at:173: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_c \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:173" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_c \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; tee stderr <"$at_stderr" echo stdout:; tee stdout <"$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:173" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:177: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_cpp \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:177" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_cpp \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:177" $at_failed && at_fn_log_failure $at_traceon; } sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr { set +x $as_echo "$at_srcdir/t_test_program_compare.at:181: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_basic_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap skip" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_test_program_compare.at:181" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_basic_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap skip ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter $at_diff experr "$at_stderr" || at_failed=: $at_diff expout "$at_stdout" || at_failed=: at_fn_check_status 0 $at_status "$at_srcdir/t_test_program_compare.at:181" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_4 #AT_START_5 at_fn_group_banner 5 't_subr_atf_check.at:30' \ "subr: atf_check function" " " at_xfail=no ( $as_echo "5. $at_setup_line: testing $at_desc ..." $at_traceon { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:32: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap exitcode_0_0" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:32" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap exitcode_0_0 ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:32" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:34: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap exitcode_0_1" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:34" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap exitcode_0_1 ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:34" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:36: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap exitcode_1_0" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:36" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap exitcode_1_0 ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:36" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:38: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap exitcode_1_1" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:38" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap exitcode_1_1 ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:38" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:41: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_expout_pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:41" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_expout_pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:41" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:43: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_expout_fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:43" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_expout_fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:43" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:45: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_ignore_empty" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:45" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_ignore_empty ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:45" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:47: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_ignore_sth" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:47" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_ignore_sth ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:47" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:49: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_null_empty" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:49" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_null_empty ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:49" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:51: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_null_sth" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:51" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_null_sth ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:51" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:53: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_stdout_written" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:53" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_stdout_written ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:53" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:55: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_match_ok" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:55" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_match_ok ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:55" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:57: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stdout_match_fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:57" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stdout_match_fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:57" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:60: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_experr_pass" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:60" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_experr_pass ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:60" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:62: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_experr_fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:62" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_experr_fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:62" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:64: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_ignore_empty" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:64" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_ignore_empty ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:64" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:66: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_ignore_sth" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:66" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_ignore_sth ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:66" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:68: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_null_empty" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:68" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_null_empty ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:68" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:70: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_null_sth" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:70" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_null_sth ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:70" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:72: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_stderr_written" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:72" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_stderr_written ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:72" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:74: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_match_ok" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:74" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_match_ok ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 0 $at_status "$at_srcdir/t_subr_atf_check.at:74" $at_failed && at_fn_log_failure $at_traceon; } { set +x $as_echo "$at_srcdir/t_subr_atf_check.at:76: \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap/h_tp_atf_check_sh \\ -s \$({ old=\$(pwd) while test \$(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=\$(pwd) cd \${old} echo \${topdir} })/bootstrap stderr_match_fail" at_fn_check_prepare_notrace 'a $(...) command substitution' "t_subr_atf_check.at:76" ( $at_check_trace; $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap/h_tp_atf_check_sh \ -s $({ old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} })/bootstrap stderr_match_fail ) >>"$at_stdout" 2>>"$at_stderr" 5>&- at_status=$? at_failed=false $at_check_filter echo stderr:; cat "$at_stderr" echo stdout:; cat "$at_stdout" at_fn_check_status 1 $at_status "$at_srcdir/t_subr_atf_check.at:76" $at_failed && at_fn_log_failure $at_traceon; } set +x $at_times_p && times >"$at_times_file" ) 5>&1 2>&1 7>&- | eval $at_tee_pipe read at_status <"$at_status_file" #AT_STOP_5 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_test_program_compare.at0000644000470500017500000001727212271526120024465 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([test_program: compare the user-visible interfaces]) dnl No arguments. AT_CHECK([TEST_HELPER(tp_basic_c)], [1], [], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp)], [1], [], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh)], [1], [], [experr]) dnl Try to ask for help, which is not bundled in. AT_CHECK([TEST_HELPER(tp_basic_c) -h], [1], [], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) -h], [1], [], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) -h], [1], [], [experr]) dnl Give an invalid option. AT_CHECK([TEST_HELPER(tp_basic_c) -Z], [1], [], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) -Z], [1], [], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) -Z], [1], [], [experr]) dnl List all tests. AT_CHECK([TEST_HELPER(tp_basic_c) -l], [0], [stdout], []) sed 's,tp_basic_c,tp_basic_cpp,g' expout AT_CHECK([TEST_HELPER(tp_basic_cpp) -l], [0], [expout], []) sed 's,tp_basic_c,tp_basic_sh,g' expout AT_CHECK([TEST_HELPER(tp_basic_sh) -l], [0], [expout], []) dnl Run no tests. AT_CHECK([TEST_HELPER(tp_basic_c)], [1], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp)], [1], [expout], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh)], [1], [expout], [experr]) dnl Run the pass test case. AT_CHECK([TEST_HELPER(tp_basic_c) -r resout pass], [0], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp AT_CHECK([TEST_HELPER(tp_basic_cpp) -r resout pass], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp AT_CHECK([TEST_HELPER(tp_basic_sh) -r resout pass], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) dnl Run the fail test case. AT_CHECK([TEST_HELPER(tp_basic_c) -r resout fail], [1], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp AT_CHECK([TEST_HELPER(tp_basic_cpp) -r resout fail], [1], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp AT_CHECK([TEST_HELPER(tp_basic_sh) -r resout fail], [1], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) dnl Run the skip test case. AT_CHECK([TEST_HELPER(tp_basic_c) -r resout skip], [0], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp AT_CHECK([TEST_HELPER(tp_basic_cpp) -r resout skip], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp AT_CHECK([TEST_HELPER(tp_basic_sh) -r resout skip], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) dnl Run the default test case. AT_CHECK([TEST_HELPER(tp_basic_c) -r resout default], [0], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr sed 's,tp_basic_c,tp_basic_cpp,g' resexp AT_CHECK([TEST_HELPER(tp_basic_cpp) -r resout default], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr sed 's,tp_basic_c,tp_basic_sh,g' resexp AT_CHECK([TEST_HELPER(tp_basic_sh) -r resout default], [0], [expout], [experr]) AT_CHECK([cmp -s resout resexp], [0], [], []) dnl Try running multiple tests. AT_CHECK([TEST_HELPER(tp_basic_c) pass fail], [1], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) pass fail], [1], [expout], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) pass fail], [1], [expout], [experr]) dnl Run an unknown test case. AT_CHECK([TEST_HELPER(tp_basic_c) unknown], [1], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) unknown], [1], [expout], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) unknown], [1], [expout], [experr]) dnl Try running a non-existent cleanup routine. AT_CHECK([TEST_HELPER(tp_basic_c) pass:cleanup], [0], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) pass:cleanup], [0], [expout], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) pass:cleanup], [0], [expout], [experr]) dnl Run a test and dump the results on stdout. AT_CHECK([TEST_HELPER(tp_basic_c) skip], [0], [stdout], [stderr]) sed 's,tp_basic_c,tp_basic_cpp,g' expout sed 's,tp_basic_c,tp_basic_cpp,g' experr AT_CHECK([TEST_HELPER(tp_basic_cpp) skip], [0], [expout], [experr]) sed 's,tp_basic_c,tp_basic_sh,g' expout sed 's,tp_basic_c,tp_basic_sh,g' experr AT_CHECK([TEST_HELPER(tp_basic_sh) skip], [0], [expout], [experr]) AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_test_program_filter.at0000644000470500017500000000460712271526120024322 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([test_program: filter test cases by name]) for h in tp_basic_c tp_basic_cpp tp_basic_sh; do dnl Try an invalid test case name. AT_CHECK([TEST_HELPER(${h}) invalid], 1, [], [stderr]) AT_CHECK([grep "Unknown test case .invalid'" stderr], [0], [ignore], []) dnl Try a glob as a test case name. AT_CHECK([TEST_HELPER(${h}) "*p*"], 1, [], [stderr]) AT_CHECK([grep "Unknown test case .\\*p\\*'" stderr], [0], [ignore], []) AT_DATA([expres], [passed ]) AT_CHECK([TEST_HELPER(${h}) -r resout pass], 0, [ignore], [ignore]) AT_CHECK([cmp -s resout expres], [0], [], []) AT_DATA([expres], [skipped: By design ]) AT_CHECK([TEST_HELPER(${h}) -r resout skip], 0, [ignore], [ignore]) AT_CHECK([cmp -s resout expres], [0], [], []) AT_DATA([expres], [failed: On purpose ]) AT_CHECK([TEST_HELPER(${h}) -r resout fail], 1, [ignore], [ignore]) AT_CHECK([cmp -s resout expres], [0], [], []) done AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/testsuite.at0000644000470500017500000000603312271526120021750 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_INIT([bootstrap tests]) m4_define([GUESS_TOPDIR], { old=$(pwd) while test $(pwd) != '/' -a ! -e ./Makefile; do cd .. done topdir=$(pwd) cd ${old} echo ${topdir} }) m4_define([APP_HELPER], [$(GUESS_TOPDIR)/bootstrap/h_$1]) m4_define([TEST_HELPER_NO_S], [$(GUESS_TOPDIR)/bootstrap/h_$1]) m4_define([TEST_HELPER], [$(GUESS_TOPDIR)/bootstrap/h_$1 \ -s $(GUESS_TOPDIR)/bootstrap]) m4_define(COUNT_IN_LINES, [test @S|@[($1 | wc -l | awk '{ print @S|@1 }')] = $2]) m4_define(COUNT_LINES, [test @S|@[(wc -l $1 | awk '{ print @S|@1 }')] = $2]) m4_define(TCR_DATA, [echo '$2' >$1 <$1])]) m4_define(CHECK_TCR, [TCR_DATA([expres], $2, $3) AT_CHECK([diff -u expres $1], [0], [], [])]) m4_define(CHECK_TCS_TCR, [AT_CHECK([grep '^tc-end: @<:@0-9. @:>@*, $1, $2' $3], [0], [ignore], [])]) m4_define(CHECK_TPS_TCR, [AT_CHECK([grep '^tc-end: @<:@0-9. @:>@*, $1, $2' $3], [0], [ignore], [])]) dnl The tests below are sorted depending on how important they are. m4_include(bootstrap/t_test_program_filter.at) m4_include(bootstrap/t_test_program_run.at) m4_include(bootstrap/t_test_program_list.at) m4_include(bootstrap/t_test_program_compare.at) m4_include(bootstrap/t_subr_atf_check.at) m4_if([ENABLE_TOOLS], yes, [ m4_include(bootstrap/t_application_opts_args.at) m4_include(bootstrap/t_application_help.at) m4_include(bootstrap/t_atf_config.at) m4_include(bootstrap/t_atf_run.at) ]) dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_app_empty.cpp0000644000470500017500000000376012271526120022406 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include "atf-c++/detail/application.hpp" class h_app_empty : public atf::application::app { static const char* m_description; public: h_app_empty(void); int main(void); }; const char* h_app_empty::m_description = "A helper application for the bootstrap test suite that does nothing " "on its own and redefines no methods."; h_app_empty::h_app_empty(void) : app(m_description, "h_app_empty(1)", "atf(7)") { } int h_app_empty::main(void) { return EXIT_SUCCESS; } int main(int argc, char* const* argv) { return h_app_empty().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_basic_sh.sh0000644000470500017500000000416512271526120022516 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case pass pass_head() { atf_set "descr" "An empty test case that always passes" } pass_body() { atf_pass } atf_test_case fail fail_head() { atf_set "descr" "An empty test case that always fails" } fail_body() { atf_fail "On purpose" } atf_test_case skip skip_head() { atf_set "descr" "An empty test case that is always skipped" } skip_body() { atf_skip "By design" } atf_test_case default default_head() { atf_set "descr" "A test case that passes without explicitly" \ "stating it" } default_body() { : } atf_init_test_cases() { atf_add_test_case pass atf_add_test_case fail atf_add_test_case skip atf_add_test_case default } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_test_program_run.at0000644000470500017500000000411212271526120023630 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([test_program: output format and exit codes]) for h in tp_basic_c tp_basic_cpp tp_basic_sh; do dnl Check the -r flag to redirect the results output. AT_CHECK([TEST_HELPER(${h}) -r resout pass], 0, [stdout], [stderr]) CHECK_TCR([resout], [passed]) AT_CHECK([TEST_HELPER(${h}) -r resout fail], 1, [stdout], [stderr]) CHECK_TCR([resout], [failed], [On purpose]) AT_CHECK([TEST_HELPER(${h}) -r resout skip], 0, [stdout], [stderr]) CHECK_TCR([resout], [skipped], [By design]) AT_CHECK([TEST_HELPER(${h}) -r resout default], 0, [stdout], [stderr]) CHECK_TCR([resout], [passed]) done AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_basic_cpp.cpp0000644000470500017500000000443412271526120023035 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include ATF_TEST_CASE(pass); ATF_TEST_CASE_HEAD(pass) { set_md_var("descr", "An empty test case that always passes"); } ATF_TEST_CASE_BODY(pass) { ATF_PASS(); } ATF_TEST_CASE(fail); ATF_TEST_CASE_HEAD(fail) { set_md_var("descr", "An empty test case that always fails"); } ATF_TEST_CASE_BODY(fail) { ATF_FAIL("On purpose"); } ATF_TEST_CASE(skip); ATF_TEST_CASE_HEAD(skip) { set_md_var("descr", "An empty test case that is always skipped"); } ATF_TEST_CASE_BODY(skip) { ATF_SKIP("By design"); } ATF_TEST_CASE(default); ATF_TEST_CASE_HEAD(default) { set_md_var("descr", "A test case that passes without explicitly " "stating it"); } ATF_TEST_CASE_BODY(default) { } ATF_INIT_TEST_CASES(tcs) { ATF_ADD_TEST_CASE(tcs, pass); ATF_ADD_TEST_CASE(tcs, fail); ATF_ADD_TEST_CASE(tcs, skip); ATF_ADD_TEST_CASE(tcs, default); } bind9-9.9.5.dfsg/unit/atf-src/bootstrap/package.m40000644000470500017500000000051112271526120021221 0ustar lamontlamont# Signature of the current package. m4_define(AT_PACKAGE_NAME, Automated Testing Framework) m4_define(AT_PACKAGE_TARNAME, atf) m4_define(AT_PACKAGE_VERSION, 0.17) m4_define(AT_PACKAGE_STRING, Automated Testing Framework 0.17) m4_define(AT_PACKAGE_BUGREPORT, atf-devel@NetBSD.org) m4_define(ENABLE_TOOLS, yes) bind9-9.9.5.dfsg/unit/atf-src/bootstrap/Makefile.am.inc0000644000470500017500000001147312271526120022201 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # check_PROGRAMS = bootstrap/h_app_empty bootstrap_h_app_empty_SOURCES = bootstrap/h_app_empty.cpp bootstrap_h_app_empty_LDADD = $(ATF_CXX_LIBS) check_PROGRAMS += bootstrap/h_app_opts_args bootstrap_h_app_opts_args_SOURCES = bootstrap/h_app_opts_args.cpp bootstrap_h_app_opts_args_LDADD = $(ATF_CXX_LIBS) check_PROGRAMS += bootstrap/h_tp_basic_c bootstrap_h_tp_basic_c_SOURCES = bootstrap/h_tp_basic_c.c bootstrap_h_tp_basic_c_LDADD = libatf-c.la check_PROGRAMS += bootstrap/h_tp_basic_cpp bootstrap_h_tp_basic_cpp_SOURCES = bootstrap/h_tp_basic_cpp.cpp bootstrap_h_tp_basic_cpp_LDADD = $(ATF_CXX_LIBS) check_SCRIPTS = bootstrap/h_tp_basic_sh CLEANFILES += bootstrap/h_tp_basic_sh EXTRA_DIST += bootstrap/h_tp_basic_sh.sh bootstrap/h_tp_basic_sh: $(srcdir)/bootstrap/h_tp_basic_sh.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_basic_sh.sh; dst=$@; $(BUILD_SH_TP) check_SCRIPTS += bootstrap/h_tp_atf_check_sh CLEANFILES += bootstrap/h_tp_atf_check_sh EXTRA_DIST += bootstrap/h_tp_atf_check_sh.sh bootstrap/h_tp_atf_check_sh: \ $(srcdir)/bootstrap/h_tp_atf_check_sh.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_atf_check_sh.sh; dst=$@; $(BUILD_SH_TP) check_SCRIPTS += bootstrap/h_tp_fail CLEANFILES += bootstrap/h_tp_fail EXTRA_DIST += bootstrap/h_tp_fail.sh bootstrap/h_tp_fail: $(srcdir)/bootstrap/h_tp_fail.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_fail.sh; dst=$@; $(BUILD_SH_TP) check_SCRIPTS += bootstrap/h_tp_pass CLEANFILES += bootstrap/h_tp_pass EXTRA_DIST += bootstrap/h_tp_pass.sh bootstrap/h_tp_pass: $(srcdir)/bootstrap/h_tp_pass.sh test -d bootstrap || mkdir -p bootstrap @src=$(srcdir)/bootstrap/h_tp_pass.sh; dst=$@; $(BUILD_SH_TP) DISTCLEANFILES = \ bootstrap/atconfig \ testsuite.lineno \ testsuite.log distclean-local: -rm -rf testsuite.dir EXTRA_DIST += bootstrap/testsuite \ bootstrap/package.m4 \ bootstrap/testsuite.at \ $(testsuite_incs) testsuite_incs= $(srcdir)/bootstrap/t_application_help.at \ $(srcdir)/bootstrap/t_application_opts_args.at \ $(srcdir)/bootstrap/t_atf_config.at \ $(srcdir)/bootstrap/t_atf_run.at \ $(srcdir)/bootstrap/t_subr_atf_check.at \ $(srcdir)/bootstrap/t_test_program_compare.at \ $(srcdir)/bootstrap/t_test_program_filter.at \ $(srcdir)/bootstrap/t_test_program_list.at \ $(srcdir)/bootstrap/t_test_program_run.at @target_srcdir@bootstrap/package.m4: $(top_srcdir)/configure.ac { \ echo '# Signature of the current package.'; \ echo 'm4_define(AT_PACKAGE_NAME, @PACKAGE_NAME@)'; \ echo 'm4_define(AT_PACKAGE_TARNAME, @PACKAGE_TARNAME@)'; \ echo 'm4_define(AT_PACKAGE_VERSION, @PACKAGE_VERSION@)'; \ echo 'm4_define(AT_PACKAGE_STRING, @PACKAGE_STRING@)'; \ echo 'm4_define(AT_PACKAGE_BUGREPORT, @PACKAGE_BUGREPORT@)'; \ echo 'm4_define(ENABLE_TOOLS, @ENABLE_TOOLS@)'; \ } >$(srcdir)/bootstrap/package.m4 @target_srcdir@bootstrap/testsuite: $(srcdir)/bootstrap/testsuite.at \ $(testsuite_incs) \ @target_srcdir@bootstrap/package.m4 autom4te --language=Autotest -I $(srcdir) \ -I $(srcdir)/bootstrap \ $(srcdir)/bootstrap/testsuite.at -o $@.tmp mv $@.tmp $@ INSTALLCHECK_TARGETS += installcheck-bootstrap PHONY_TARGETS += installcheck-bootstrap installcheck-bootstrap: @target_srcdir@bootstrap/testsuite check $(TESTS_ENVIRONMENT) $(srcdir)/bootstrap/testsuite # vim: syntax=make:noexpandtab:shiftwidth=8:softtabstop=8 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_atf_run.at0000644000470500017500000001356012271526120021703 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([atf-run: execution of tests]) AT_TESTED(atf-run) m4_define([CREATE_PASS_TEST], [AT_CHECK([sed -e 's,@TC_NAME@,$2,g' @' stdout], [1], [], []) AT_CHECK([grep 'tc-so:ignore-me' stdout], [0], [ignore], []) AT_CHECK([grep 'tc-se:ignore-me' stdout], [0], [ignore], []) AT_CHECK([cd top/dir2 && atf-run], [1], [stdout], [stderr]) CHECK_TPS_TCR(tc_4, failed, stdout) CHECK_TPS_TCR(tc_5, passed, stdout) AT_CHECK([grep -i 'tc_@<:@123@:>@' stdout], [1], [], []) AT_CHECK([grep 'tc-so:ignore-me' stdout], [0], [ignore], []) AT_CHECK([grep 'tc-se:ignore-me' stdout], [0], [ignore], []) AT_CHECK([cd top && atf-run], [1], [stdout], [stderr]) CHECK_TPS_TCR(tc_1, passed, stdout) CHECK_TPS_TCR(tc_2, failed, stdout) CHECK_TPS_TCR(tc_3, passed, stdout) CHECK_TPS_TCR(tc_4, failed, stdout) CHECK_TPS_TCR(tc_5, passed, stdout) AT_CHECK([grep 'tc-so:ignore-me' stdout], [0], [ignore], []) AT_CHECK([grep 'tc-se:ignore-me' stdout], [0], [ignore], []) dnl Repeat previous but using a glob that matches everything. AT_DATA([top/Atffile], [Content-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: * ]) AT_CHECK([cd top && atf-run], [1], [stdout], [stderr]) CHECK_TPS_TCR(tc_1, passed, stdout) CHECK_TPS_TCR(tc_2, failed, stdout) CHECK_TPS_TCR(tc_3, passed, stdout) CHECK_TPS_TCR(tc_4, failed, stdout) CHECK_TPS_TCR(tc_5, passed, stdout) AT_CHECK([grep 'tc-so:ignore-me' stdout], [0], [ignore], []) AT_CHECK([grep 'tc-se:ignore-me' stdout], [0], [ignore], []) dnl Repeat previous but using a glob that matches directories only. AT_DATA([top/Atffile], [Content-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: d* ]) AT_CHECK([cd top && atf-run], [1], [stdout], [stderr]) CHECK_TPS_TCR(tc_3, passed, stdout) CHECK_TPS_TCR(tc_4, failed, stdout) CHECK_TPS_TCR(tc_5, passed, stdout) AT_CHECK([grep 'tc-so:ignore-me' stdout], [0], [ignore], []) AT_CHECK([grep 'tc-se:ignore-me' stdout], [0], [ignore], []) dnl Make sure globs do not match non-executable nor hidden files. dnl XXX This is not really part of the bootstrap test suite. Move to dnl tests/atf/tools/t_atf_run.sh when it exists. AT_CHECK([rm -rf top], [0], [], []) AT_CHECK([mkdir top], [0], [], []) CREATE_PASS_TEST([top/test1], [tc_1]) CREATE_PASS_TEST([top/test2], [tc_2]) CREATE_PASS_TEST([top/test3], [tc_3]) AT_CHECK([chmod -x top/test3], [0], [], []) CREATE_PASS_TEST([top/.test4], [tc_4]) AT_CHECK([chmod -x top/.test4], [0], [], []) AT_DATA([top/Atffile], [Content-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp-glob: * ]) AT_CHECK([cd top && atf-run], [0], [stdout], [stderr]) CHECK_TPS_TCR(tc_1, passed, stdout) CHECK_TPS_TCR(tc_2, passed, stdout) AT_CHECK([grep -i 'tc_3' stdout], [1], [ignore], []) AT_CHECK([grep -i 'tc_4' stdout], [1], [ignore], []) dnl Run all test cases from a test program. AT_CHECK([rm -rf top], [0], [], []) AT_CHECK([mkdir top], [0], [], []) AT_CHECK([cp TEST_HELPER_NO_S(tp_basic_sh) top]) AT_DATA([top/Atffile], [Content-Type: application/X-atf-atffile; version="1" prop: test-suite = atf tp: h_tp_basic_sh ]) AT_CHECK([cd top && atf-run], [1], [stdout], [stderr]) CHECK_TPS_TCR(pass, passed, stdout) CHECK_TPS_TCR(fail, failed, stdout) CHECK_TPS_TCR(skip, skipped, stdout) CHECK_TPS_TCR(default, passed, stdout) AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_subr_atf_check.at0000644000470500017500000000737612271526120023217 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([subr: atf_check function]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) exitcode_0_0], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) exitcode_0_1], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) exitcode_1_0], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) exitcode_1_1], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_expout_pass], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_expout_fail], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_ignore_empty], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_ignore_sth], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_null_empty], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_null_sth], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_stdout_written], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_match_ok], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stdout_match_fail], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_experr_pass], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_experr_fail], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_ignore_empty], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_ignore_sth], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_null_empty], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_null_sth], [1], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_stderr_written], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_match_ok], [0], [ignore], [ignore]) AT_CHECK([TEST_HELPER(tp_atf_check_sh) stderr_match_fail], [1], [ignore], [ignore]) AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_test_program_list.at0000644000470500017500000000441112271526120024001 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([test_program: list test cases]) for h in tp_basic_c tp_basic_cpp tp_basic_sh; do AT_DATA([expout], [Content-Type: application/X-atf-tp; version="1" ident: pass descr: An empty test case that always passes ident: fail descr: An empty test case that always fails ident: skip descr: An empty test case that is always skipped ident: default descr: A test case that passes without explicitly stating it ]) AT_CHECK([TEST_HELPER(${h}) -l], [0], [expout], []) AT_CHECK([TEST_HELPER(${h}) -l pass], [1], [], [stderr]) AT_CHECK([grep 'Cannot provide test case names with -l' stderr], [0], [ignore], []) AT_CHECK([TEST_HELPER(${h}) -l pass fail], [1], [], [stderr]) AT_CHECK([grep 'Cannot provide test case names with -l' stderr], [0], [ignore], []) done AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_application_help.at0000644000470500017500000000341312271526120023554 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([application: online help option]) AT_CHECK([APP_HELPER(app_empty)], 0, [stdout], []) AT_CHECK([grep 'Available options' stdout], 1, [ignore], []) AT_CHECK([APP_HELPER(app_empty) -h], 0, [stdout], []) AT_CHECK([grep 'Available options' stdout], 0, [ignore], []) AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_atf_config.at0000644000470500017500000001014412271526120022337 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([atf-config: querying of build-time variables]) AT_TESTED(atf-config) all_vars="atf_arch \ atf_build_cc \ atf_build_cflags \ atf_build_cpp \ atf_build_cppflags \ atf_build_cxx \ atf_build_cxxflags \ atf_confdir \ atf_includedir \ atf_libdir \ atf_libexecdir \ atf_machine \ atf_pkgdatadir \ atf_shell \ atf_workdir" all_vars_no=15 dnl List all variables. AT_CHECK([atf-config], [0], [stdout], []) AT_CHECK([COUNT_LINES(stdout, ${all_vars_no})], [0], [], []) for v in ${all_vars}; do AT_CHECK([grep "${v}" stdout], [0], [ignore], []) done dnl Query a single variable and test terse mode. for v in ${all_vars}; do AT_CHECK([atf-config ${v}], [0], [stdout], []) AT_CHECK([COUNT_LINES(stdout, 1)], [0], [], []) AT_CHECK([grep "${v}" stdout], [0], [ignore], []) AT_CHECK([cut -d ' ' -f 3- stdout], [0], [stdout], []) AT_CHECK([mv stdout expout], [0], [], []) AT_CHECK([atf-config -t ${v}], [0], [expout], []) done dnl Query several variables. AT_CHECK([atf-config atf_libexecdir atf_pkgdatadir], [0], [stdout], []) AT_CHECK([grep 'atf_libexecdir' stdout], [0], [ignore], []) AT_CHECK([grep 'atf_pkgdatadir' stdout], [0], [ignore], []) AT_CHECK([COUNT_LINES(stdout, 2)], [0], [ignore], []) dnl Query a non-existent variable. AT_CHECK([atf-config non_existent], [1], [], [stderr]) AT_CHECK([grep 'Unknown variable.*non_existent' stderr], [0], [ignore], []) dnl Query an existent and non-existent variable. for v in ${all_vars}; do AT_CHECK([atf-config ${v} non_existent], [1], [], [stderr]) AT_CHECK([grep 'Unknown variable.*non_existent' stderr], [0], [ignore], []) AT_CHECK([atf-config non_existent ${v}], [1], [], [stderr]) AT_CHECK([grep 'Unknown variable.*non_existent' stderr], [0], [ignore], []) done dnl Override every variable through the environment. for v in ${all_vars}; do V=$(echo ${v} | tr '@<:@a-z@:>@' '@<:@A-Z@:>@') AT_CHECK([env ${V}=testval atf-config], [0], [stdout], []) AT_CHECK([mv stdout all], [0], [], []) AT_CHECK([grep "^${v} : " all], [0], [stdout], []) AT_CHECK([mv stdout affected], [0], [], []) AT_CHECK([grep -v "^${v} : " all], [0], [stdout], []) AT_CHECK([mv stdout unaffected], [0], [], []) AT_CHECK([COUNT_LINES(affected, 1)], [0], [ignore], []) AT_CHECK([COUNT_LINES(unaffected, $((${all_vars_no} - 1)))], [0], [ignore], []) AT_CHECK([grep "^${v} : testval$" affected], [0], [ignore], []) AT_CHECK([grep ' : testval$' unaffected], [1], [], []) done AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/t_application_opts_args.at0000644000470500017500000001000512271526120024620 0ustar lamontlamontdnl dnl Automated Testing Framework (atf) dnl dnl Copyright (c) 2007 The NetBSD Foundation, Inc. dnl All rights reserved. dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions dnl are met: dnl 1. Redistributions of source code must retain the above copyright dnl notice, this list of conditions and the following disclaimer. dnl 2. Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND dnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. dnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY dnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE dnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER dnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR dnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dnl AT_SETUP([application: arguments and options handling]) dnl Check that an application that does not redefine any method does dnl not show strange flags in the usage message. AT_CHECK([APP_HELPER(app_empty) -h], 0, [stdout], []) AT_CHECK([grep ' -d ' stdout], 1, [ignore], []) AT_CHECK([grep ' -h ' stdout], 0, [ignore], []) AT_CHECK([grep ' -v ' stdout], 1, [ignore], []) AT_CHECK([grep ' -z ' stdout], 1, [ignore], []) dnl Check that an application that adds its own options shows them in dnl the usage message. AT_CHECK([APP_HELPER(app_opts_args) -h], 0, [stdout], []) AT_CHECK([grep ' -d ' stdout], 0, [ignore], []) AT_CHECK([grep ' -h ' stdout], 0, [ignore], []) AT_CHECK([grep ' -v ' stdout], 0, [ignore], []) AT_CHECK([grep ' -z ' stdout], 1, [ignore], []) dnl Check that an application that does not redefine any method does dnl not recognize strange flags. AT_CHECK([APP_HELPER(app_empty) -d], 1, [], [stderr]) AT_CHECK([grep 'Unknown option.*-d' stderr], 0, [ignore], []) AT_CHECK([APP_HELPER(app_empty) -v], 1, [], [stderr]) AT_CHECK([grep 'Unknown option.*-v' stderr], 0, [ignore], []) AT_CHECK([APP_HELPER(app_empty) -z], 1, [], [stderr]) AT_CHECK([grep 'Unknown option.*-z' stderr], 0, [ignore], []) dnl Check that an application that adds its own options is able to dnl properly handle them. AT_CHECK([APP_HELPER(app_opts_args) -d], 0, [stdout], []) AT_CHECK([grep -- '-d given' stdout], 0, [ignore], []) AT_CHECK([APP_HELPER(app_opts_args) -v], 1, [], [stderr]) AT_CHECK([grep 'Option.*-v.*requires an argument' stderr], 0, [ignore], []) AT_CHECK([APP_HELPER(app_opts_args) -v foo], 0, [stdout], []) AT_CHECK([grep -- '-v given with argument foo' stdout], 0, [ignore], []) AT_CHECK([APP_HELPER(app_opts_args) -z], 1, [], [stderr]) AT_CHECK([grep 'Unknown option.*-z' stderr], 0, [ignore], []) dnl Check that option processing stops after an argument. AT_CHECK([APP_HELPER(app_opts_args) -- -d], 0, [stdout], []) AT_CHECK([grep -- '-d given' stdout], 1, [], []) AT_CHECK([APP_HELPER(app_opts_args) arg -d], 0, [stdout], []) AT_CHECK([grep -- '-d given' stdout], 1, [], []) dnl Check that an application that does not redefine any method does dnl not show unexpected arguments in the usage message. AT_CHECK([APP_HELPER(app_empty) -h], 0, [stdout], []) AT_CHECK([grep '\@<:@options\@:>@$' stdout], 0, [ignore], []) dnl Check that an application that defines the arguments it takes dnl shows them in the usage message. AT_CHECK([APP_HELPER(app_opts_args) -h], 0, [stdout], []) AT_CHECK([grep '\@<:@options\@:>@ ' stdout], 0, [ignore], []) AT_CLEANUP() dnl vim: syntax=m4:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_app_opts_args.cpp0000644000470500017500000000553312271526120023251 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include #include #include "atf-c++/detail/application.hpp" #include "atf-c++/detail/sanity.hpp" class h_app_opts_args : public atf::application::app { static const char* m_description; std::string specific_args(void) const; options_set specific_options(void) const; void process_option(int, const char*); public: h_app_opts_args(void); int main(void); }; const char* h_app_opts_args::m_description = "A helper application for the bootstrap test suite that redefines the " "methods to specify custom options and arguments."; h_app_opts_args::h_app_opts_args(void) : app(m_description, "h_app_opts_args(1)", "atf(7)") { } std::string h_app_opts_args::specific_args(void) const { return " "; } h_app_opts_args::options_set h_app_opts_args::specific_options(void) const { using atf::application::option; options_set opts; opts.insert(option('d', "", "Debug mode")); opts.insert(option('v', "level", "Verbosity level")); return opts; } void h_app_opts_args::process_option(int ch, const char* arg) { switch (ch) { case 'd': std::cout << "-d given\n"; break; case 'v': std::cout << "-v given with argument " << arg << "\n"; break; default: UNREACHABLE; } } int h_app_opts_args::main(void) { return EXIT_SUCCESS; } int main(int argc, char* const* argv) { return h_app_opts_args().run(argc, argv); } bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_pass.sh0000644000470500017500000000324712271526120021711 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2009 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case @TC_NAME@ @TC_NAME@_head() { atf_set "descr" "An empty test case that always passes" } @TC_NAME@_body() { echo "ignore-me" echo "ignore-me" 1>&2 atf_pass } atf_init_test_cases() { atf_add_test_case @TC_NAME@ } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_basic_c.c0000644000470500017500000000451612271526120022136 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "atf-c/error.h" ATF_TC(pass); ATF_TC_HEAD(pass, tc) { atf_tc_set_md_var(tc, "descr", "An empty test case that always passes"); } ATF_TC_BODY(pass, tc) { atf_tc_pass(); } ATF_TC(fail); ATF_TC_HEAD(fail, tc) { atf_tc_set_md_var(tc, "descr", "An empty test case that always fails"); } ATF_TC_BODY(fail, tc) { atf_tc_fail("On purpose"); } ATF_TC(skip); ATF_TC_HEAD(skip, tc) { atf_tc_set_md_var(tc, "descr", "An empty test case that is always " "skipped"); } ATF_TC_BODY(skip, tc) { atf_tc_skip("By design"); } ATF_TC(default); ATF_TC_HEAD(default, tc) { atf_tc_set_md_var(tc, "descr", "A test case that passes without " "explicitly stating it"); } ATF_TC_BODY(default, tc) { } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, pass); ATF_TP_ADD_TC(tp, fail); ATF_TP_ADD_TC(tp, skip); ATF_TP_ADD_TC(tp, default); return atf_no_error(); } bind9-9.9.5.dfsg/unit/atf-src/bootstrap/h_tp_atf_check_sh.sh0000644000470500017500000001766112271526120023351 0ustar lamontlamont# # Automated Testing Framework (atf) # # Copyright (c) 2007 The NetBSD Foundation, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND # CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # atf_test_case exitcode_0_0 exitcode_0_0_head() { atf_set "descr" "Runs a program that returns true and expects true" } exitcode_0_0_body() { atf_check -s eq:0 -o empty -e empty true } atf_test_case exitcode_0_1 exitcode_0_1_head() { atf_set "descr" "Runs a program that returns true and expects false" } exitcode_0_1_body() { atf_check -s eq:1 -o empty -e empty true } atf_test_case exitcode_1_0 exitcode_1_0_head() { atf_set "descr" "Runs a program that returns false and expects true" } exitcode_1_0_body() { atf_check -s eq:0 -o empty -e empty false } atf_test_case exitcode_1_1 exitcode_1_1_head() { atf_set "descr" "Runs a program that returns false and expects false" } exitcode_1_1_body() { # In Solaris, /usr/bin/false returns 255 rather than 1. Use the # built-in version for the check. atf_check -s eq:1 -o empty -e empty sh -c "false" } atf_test_case stdout_expout_pass stdout_expout_pass_head() { atf_set "descr" "Runs a program with stdout set to expout and passes" } stdout_expout_pass_body() { echo foo >expout atf_check -s eq:0 -o file:expout -e empty echo foo } atf_test_case stdout_expout_fail stdout_expout_fail_head() { atf_set "descr" "Runs a program with stdout set to expout and fails" } stdout_expout_fail_body() { echo foo >expout atf_check -s eq:0 -o file:expout -e empty echo bar } atf_test_case stdout_ignore_empty stdout_ignore_empty_head() { atf_set "descr" "Runs a program with stdout set to ignore and" \ "writes nothing" } stdout_ignore_empty_body() { atf_check -s eq:0 -o ignore -e empty true } atf_test_case stdout_ignore_sth stdout_ignore_sth_head() { atf_set "descr" "Runs a program with stdout set to ignore and" \ "writes something" } stdout_ignore_sth_body() { atf_check -s eq:0 -o ignore -e empty echo foo } atf_test_case stdout_null_empty stdout_null_empty_head() { atf_set "descr" "Runs a program with stdout set to null and" \ "writes nothing" } stdout_null_empty_body() { atf_check -s eq:0 -o empty -e empty true } atf_test_case stdout_null_sth stdout_null_sth_head() { atf_set "descr" "Runs a program with stdout set to null and" \ "writes something" } stdout_null_sth_body() { atf_check -s eq:0 -o empty -e empty echo foo } atf_test_case stdout_stdout_written stdout_stdout_written_head() { atf_set "descr" "Runs a program with stdout set to stdout and" \ "writes something" } stdout_stdout_written_body() { atf_check -s eq:0 -o save:stdout -e empty echo foo echo foo >aux cmp -s stdout aux || atf_fail "Test failed" } atf_test_case stdout_match_ok stdout_match_ok_head() { atf_set "descr" "Runs a program with stdout set to match and" \ "matches the regular expression" } stdout_match_ok_body() { atf_check -s eq:0 -o 'match:bar$' -e empty -x "echo line; echo foo bar" } atf_test_case stdout_match_fail stdout_match_fail_head() { atf_set "descr" "Runs a program with stdout set to match and" \ "does not match the regular expression" } stdout_match_fail_body() { atf_check -s eq:0 -o 'match:bar$' -e empty -x "echo line; echo foo bar baz" } atf_test_case stderr_experr_pass stderr_experr_pass_head() { atf_set "descr" "Runs a program with stderr set to experr and passes" } stderr_experr_pass_body() { echo foo >experr atf_check -s eq:0 -o empty -e file:experr -x 'echo foo 1>&2' } atf_test_case stderr_experr_fail stderr_experr_fail_head() { atf_set "descr" "Runs a program with stderr set to experr and fails" } stderr_experr_fail_body() { echo foo >experr atf_check -s eq:0 -o empty -e file:stderr -x 'echo bar 1>&2' } atf_test_case stderr_ignore_empty stderr_ignore_empty_head() { atf_set "descr" "Runs a program with stderr set to ignore and" \ "writes nothing" } stderr_ignore_empty_body() { atf_check -s eq:0 -o empty -e ignore -x 'true 1>&2' } atf_test_case stderr_ignore_sth stderr_ignore_sth_head() { atf_set "descr" "Runs a program with stderr set to ignore and" \ "writes something" } stderr_ignore_sth_body() { atf_check -s eq:0 -o empty -e ignore -x 'echo foo 1>&2' } atf_test_case stderr_null_empty stderr_null_empty_head() { atf_set "descr" "Runs a program with stderr set to null and" \ "writes nothing" } stderr_null_empty_body() { atf_check -s eq:0 -o empty -e empty -x 'true 1>&2' } atf_test_case stderr_null_sth stderr_null_sth_head() { atf_set "descr" "Runs a program with stderr set to null and" \ "writes something" } stderr_null_sth_body() { atf_check -s eq:0 -o empty -e empty -x 'echo foo 1>&2' } atf_test_case stderr_stderr_written stderr_stderr_written_head() { atf_set "descr" "Runs a program with stderr set to stderr and" \ "writes something" } stderr_stderr_written_body() { atf_check -s eq:0 -o empty -e save:stderr -x 'echo foo 1>&2' echo foo >aux cmp -s stderr aux || atf_fail "Test failed" } atf_test_case stderr_match_ok stderr_match_ok_head() { atf_set "descr" "Runs a program with stderr set to match and" \ "matches the regular expression" } stderr_match_ok_body() { atf_check -s eq:0 -o empty -e 'match:bar$' -x \ "echo line 1>&2; echo foo bar 1>&2" } atf_test_case stderr_match_fail stderr_match_fail_head() { atf_set "descr" "Runs a program with stderr set to match and" \ "does not match the regular expression" } stderr_match_fail_body() { atf_check -s eq:0 -o empty -e 'match:bar$' -x \ "echo line 1>&2; echo foo bar baz 1>&2" } atf_init_test_cases() { atf_add_test_case exitcode_0_0 atf_add_test_case exitcode_0_1 atf_add_test_case exitcode_1_0 atf_add_test_case exitcode_1_1 atf_add_test_case stdout_expout_pass atf_add_test_case stdout_expout_fail atf_add_test_case stdout_ignore_empty atf_add_test_case stdout_ignore_sth atf_add_test_case stdout_null_empty atf_add_test_case stdout_null_sth atf_add_test_case stdout_stdout_written atf_add_test_case stdout_match_ok atf_add_test_case stdout_match_fail atf_add_test_case stderr_experr_pass atf_add_test_case stderr_experr_fail atf_add_test_case stderr_ignore_empty atf_add_test_case stderr_ignore_sth atf_add_test_case stderr_null_empty atf_add_test_case stderr_null_sth atf_add_test_case stderr_stderr_written atf_add_test_case stderr_match_ok atf_add_test_case stderr_match_fail } # vim: syntax=sh:expandtab:shiftwidth=4:softtabstop=4 bind9-9.9.5.dfsg/unit/atf-src/Kyuafile0000644000470500017500000000060512271526120017047 0ustar lamontlamontsyntax("kyuafile", 1) test_suite("atf") include("atf-c/Kyuafile") include("atf-c++/Kyuafile") include("atf-sh/Kyuafile") include("test-programs/Kyuafile") if fs.exists("atf-config/Kyuafile") then include("atf-config/Kyuafile") end if fs.exists("atf-report/Kyuafile") then include("atf-report/Kyuafile") end if fs.exists("atf-run/Kyuafile") then include("atf-run/Kyuafile") end bind9-9.9.5.dfsg/unit/atf-src/atf-c++.hpp0000644000470500017500000000305012271526120017201 0ustar lamontlamont// // Automated Testing Framework (atf) // // Copyright (c) 2007 The NetBSD Foundation, Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #if !defined(_ATF_CXX_HPP_) #define _ATF_CXX_HPP_ #include #include #endif // !defined(_ATF_CXX_HPP_) bind9-9.9.5.dfsg/unit/atf-src/bconfig.h.in0000644000470500017500000000551212271526120017542 0ustar lamontlamont/* bconfig.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if basename takes a constant pointer */ #undef HAVE_CONST_BASENAME /* Define to 1 if dirname takes a constant pointer */ #undef HAVE_CONST_DIRNAME /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if getcwd(NULL, 0) works */ #undef HAVE_GETCWD_DYN /* Define to 1 if getopt allows a + sign for POSIX behavior */ #undef HAVE_GNU_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if getopt has optreset */ #undef HAVE_OPTRESET /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if putenv is in std */ #undef HAVE_PUTENV_IN_STD /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if setenv is in std */ #undef HAVE_SETENV_IN_STD /* Define to 1 if snprintf is in std */ #undef HAVE_SNPRINTF_IN_STD /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unmount' function. */ #undef HAVE_UNMOUNT /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if unsetenv is in std */ #undef HAVE_UNSETENV_IN_STD /* Define to 1 if vsnprintf is in std */ #undef HAVE_VSNPRINTF_IN_STD /* Define to the last valid signal number */ #undef LAST_SIGNO /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the copyright string applicable to this package. */ #undef PACKAGE_COPYRIGHT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION bind9-9.9.5.dfsg/unit/atf-src/atf-c.h0000644000470500017500000000305312271526120016516 0ustar lamontlamont/* * Automated Testing Framework (atf) * * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if !defined(ATF_C_H) #define ATF_C_H #include #include #include #endif /* !defined(ATF_C_H) */ bind9-9.9.5.dfsg/unit/atf-src/configure0000755000470500017500000216116112271526120017271 0ustar lamontlamont#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Automated Testing Framework 0.17. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # Copyright (c) 2007-2012 The NetBSD Foundation, Inc. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: atf-devel@NetBSD.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac ECHO=${lt_ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF $* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Automated Testing Framework' PACKAGE_TARNAME='atf' PACKAGE_VERSION='0.17' PACKAGE_STRING='Automated Testing Framework 0.17' PACKAGE_BUGREPORT='atf-devel@NetBSD.org' PACKAGE_URL='http://code.google.com/p/kyua/wiki/ATF' ac_unique_file="atf-c.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='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS GIT HAVE_KYUA_FALSE HAVE_KYUA_TRUE KYUA GDB ATF_SHELL atf_xsldir atf_pkgconfigdir atf_egdir atf_dtddir atf_cssdir atf_aclocaldir ATF_WORKDIR atf_confdir ATF_CONFSUBDIR atf_machine atf_arch target_srcdir ATF_BUILD_CXXFLAGS ATF_BUILD_CXX ATF_BUILD_CPPFLAGS ATF_BUILD_CPP ATF_BUILD_CFLAGS ATF_BUILD_CC ATTRIBUTE_UNUSED ATTRIBUTE_NORETURN ATTRIBUTE_FORMAT_PRINTF CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX ENABLE_TOOLS_FALSE ENABLE_TOOLS_TRUE ENABLE_TOOLS CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTOOL am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld enable_libtool_lock enable_tools enable_developer ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP ATF_BUILD_CC ATF_BUILD_CFLAGS ATF_BUILD_CPP ATF_BUILD_CPPFLAGS ATF_BUILD_CXX ATF_BUILD_CXXFLAGS ATF_CONFSUBDIR ATF_WORKDIR ATF_SHELL' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Automated Testing Framework 0.17 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/atf] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Automated Testing Framework 0.17:";; 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-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --enable-tools Enables the build of the deprecated ATF tools --enable-developer enable developer features Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor ATF_BUILD_CC C compiler to use at runtime ATF_BUILD_CFLAGS C compiler flags to use at runtime ATF_BUILD_CPP C/C++ preprocessor to use at runtime ATF_BUILD_CPPFLAGS C/C++ preprocessor flags to use at runtime ATF_BUILD_CXX C++ compiler to use at runtime ATF_BUILD_CXXFLAGS C++ compiler flags to use at runtime ATF_CONFSUBDIR Subdirectory of sysconfdir under which to look for files ATF_WORKDIR Default location to use for ATF work directories ATF_SHELL Location of the POSIX shell interpreter to use 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 . Automated Testing Framework home page: . _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 Automated Testing Framework configure 0.17 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright (c) 2007-2012 The NetBSD Foundation, Inc. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Automated Testing Framework $as_me 0.17, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu $as_echo "#define PACKAGE_COPYRIGHT \"Copyright (c) 2007-2012 The NetBSD Foundation, Inc.\"" >>confdefs.h ac_aux_dir= for ac_dir in admin "$srcdir"/admin; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in admin \"$srcdir\"/admin" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers bconfig.h" ac_config_commands="$ac_config_commands bootstrap/atconfig" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.12' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='atf' VERSION='0.17' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.2.6b' macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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 '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$ac_tool_prefix"; then for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:4843: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:4846: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:4849: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 6055 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7584: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7588: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7923: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7927: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8028: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8032: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8083: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8087: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo(void) {} _ACEOF if ac_fn_c_try_link "$LINENO"; then : archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 10450 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 10546 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: # Check whether --enable-tools was given. if test "${enable_tools+set}" = set; then : enableval=$enable_tools; case $enableval in yes|no) enable_tools=${enableval} ;; *) as_fn_error $? "Invalid value passed to --enable-tools" "$LINENO" 5 ;; esac else enable_tools=no fi ENABLE_TOOLS=${enable_tools} if test "${enable_tools}" = yes; then ENABLE_TOOLS_TRUE= ENABLE_TOOLS_FALSE='#' else ENABLE_TOOLS_TRUE='#' ENABLE_TOOLS_FALSE= 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_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} _lt_caught_CXX_error=yes; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5]* | *pgcpp\ [1-5]*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC*) # IBM XL 8.0 on PPC lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 $as_echo "$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14263: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14267: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14362: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14366: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14414: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14418: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 $as_echo "$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } if ${atf_cv_prog_cxx_works+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : atf_cv_prog_cxx_works=yes else atf_cv_prog_cxx_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $atf_cv_prog_cxx_works" >&5 $as_echo "$atf_cv_prog_cxx_works" >&6; } if test "${atf_cv_prog_cxx_works}" = no; then as_fn_error $? "C++ compiler cannot create executables" "$LINENO" 5 fi # Check whether --enable-developer was given. if test "${enable_developer+set}" = set; then : enableval=$enable_developer; else if test -d ${srcdir}/.git; then { $as_echo "$as_me:${as_lineno-$LINENO}: building from HEAD; developer mode autoenabled" >&5 $as_echo "$as_me: building from HEAD; developer mode autoenabled" >&6;} enable_developer=yes else enable_developer=no fi fi # # The following warning flags should also be enabled but cannot be. # Reasons given below. # # -Wold-style-cast: Raises errors when using TIOCGWINSZ, at least under # Mac OS X. This is due to the way _IOR is defined. # try_c_cxx_flags="-D_FORTIFY_SOURCE=2 \ -Wall \ -Wcast-qual \ -Wextra \ -Wpointer-arith \ -Wredundant-decls \ -Wreturn-type \ -Wshadow \ -Wsign-compare \ -Wswitch \ -Wwrite-strings" try_c_flags="-Wmissing-prototypes \ -Wno-traditional \ -Wstrict-prototypes" try_cxx_flags="-Wabi \ -Wctor-dtor-privacy \ -Wno-deprecated \ -Wno-non-template-friend \ -Wno-pmf-conversions \ -Wnon-virtual-dtor \ -Woverloaded-virtual \ -Wreorder \ -Wsign-promo \ -Wsynth" if test ${enable_developer} = yes; then try_werror=yes try_c_cxx_flags="${try_c_cxx_flags} -g -Werror" else try_werror=no try_c_cxx_flags="${try_c_cxx_flags} -DNDEBUG" 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 valid_cflags= for f in ${try_c_cxx_flags} ${try_c_flags}; do if test x"${kyua_CC_has_werror-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Werror" >&5 $as_echo_n "checking whether ${CC} supports -Werror... " >&6; } saved_flags="${CFLAGS}" kyua_CC_has_werror=no CFLAGS="${CFLAGS} -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } kyua_CC_has_werror=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="${saved_flags}" fi if test "${f}" = "-Werror"; then found=${kyua_CC_has_werror} else found=unset if test ${kyua_CC_has_werror} = yes; then if test x"${found-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports ${f}" >&5 $as_echo_n "checking whether ${CC} supports ${f}... " >&6; } saved_flags="${CFLAGS}" found=no CFLAGS="${CFLAGS} -Werror ${f}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="${saved_flags}" fi else if test x"${found-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports ${f}" >&5 $as_echo_n "checking whether ${CC} supports ${f}... " >&6; } saved_flags="${CFLAGS}" found=no CFLAGS="${CFLAGS} ${f}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="${saved_flags}" fi fi fi if test ${found} = yes; then valid_cflags="${valid_cflags} ${f}" fi done if test -n "${valid_cflags}"; then CFLAGS="${CFLAGS} ${valid_cflags}" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu valid_cxxflags= for f in ${try_c_cxx_flags} ${try_cxx_flags}; do if test x"${kyua_CXX_has_werror-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -Werror" >&5 $as_echo_n "checking whether ${CXX} supports -Werror... " >&6; } saved_flags="${CXXFLAGS}" kyua_CXX_has_werror=no CXXFLAGS="${CXXFLAGS} -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } kyua_CXX_has_werror=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS="${saved_flags}" fi if test "${f}" = "-Werror"; then found=${kyua_CXX_has_werror} else found=unset if test ${kyua_CXX_has_werror} = yes; then if test x"${found-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports ${f}" >&5 $as_echo_n "checking whether ${CXX} supports ${f}... " >&6; } saved_flags="${CXXFLAGS}" found=no CXXFLAGS="${CXXFLAGS} -Werror ${f}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS="${saved_flags}" fi else if test x"${found-unset}" = xunset; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports ${f}" >&5 $as_echo_n "checking whether ${CXX} supports ${f}... " >&6; } saved_flags="${CXXFLAGS}" found=no CXXFLAGS="${CXXFLAGS} ${f}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS="${saved_flags}" fi fi fi if test ${found} = yes; then valid_cxxflags="${valid_cxxflags} ${f}" fi done if test -n "${valid_cxxflags}"; then CXXFLAGS="${CXXFLAGS} ${valid_cxxflags}" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf is in std" >&5 $as_echo_n "checking whether vsnprintf is in std... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { va_list ap; char* buf = NULL; const char* fmt = NULL; std::vsnprintf(buf, 0, fmt, ap); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_VSNPRINTF_IN_STD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt allows a + sign for POSIX behavior" >&5 $as_echo_n "checking whether getopt allows a + sign for POSIX behavior... " >&6; } if ${kyua_cv_getopt_plus+:} false; then : $as_echo_n "(cached) " >&6 else 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 "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int argc = 4; char* argv[5] = { strdup("conftest"), strdup("-+"), strdup("-a"), strdup("bar"), NULL }; int ch; int seen_a = 0, seen_plus = 0; while ((ch = getopt(argc, argv, "+a:")) != -1) { switch (ch) { case 'a': seen_a = 1; break; case '+': seen_plus = 1; break; case '?': default: ; } } return (seen_a && !seen_plus) ? EXIT_SUCCESS : EXIT_FAILURE; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : kyua_cv_getopt_plus=yes else kyua_cv_getopt_plus=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kyua_cv_getopt_plus" >&5 $as_echo "$kyua_cv_getopt_plus" >&6; } if test x"${kyua_cv_getopt_plus}" = xyes; then $as_echo "#define HAVE_GNU_GETOPT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt has optreset" >&5 $as_echo_n "checking whether getopt has optreset... " >&6; } if ${kyua_cv_getopt_optreset+:} false; then : $as_echo_n "(cached) " >&6 else 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { optreset = 1; return EXIT_SUCCESS; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : kyua_cv_getopt_optreset=yes else kyua_cv_getopt_optreset=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kyua_cv_getopt_optreset" >&5 $as_echo "$kyua_cv_getopt_optreset" >&6; } if test x"${kyua_cv_getopt_optreset}" = xyes; then $as_echo "#define HAVE_OPTRESET 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((__format__(__printf__, a, b))) is supported" >&5 $as_echo_n "checking whether __attribute__((__format__(__printf__, a, b))) is supported... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static void test_printf(const char *, ...) __attribute__((__format__(__printf__, 1, 2))); static void test_printf(const char *format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); } int main () { test_printf("foo %s", "bar"); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } value="__attribute__((__format__(__printf__, a, b)))" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } value="" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ATTRIBUTE_FORMAT_PRINTF=${value} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((__noreturn__)) is supported" >&5 $as_echo_n "checking whether __attribute__((__noreturn__)) is supported... " >&6; } if ${kyua_cv_attribute_noreturn+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if ((__GNUC__ == 2 && __GNUC_MINOR__ >= 5) || __GNUC__ > 2) return 0; #else return 1; #endif ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : kyua_cv_attribute_noreturn=yes else kyua_cv_attribute_noreturn=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kyua_cv_attribute_noreturn" >&5 $as_echo "$kyua_cv_attribute_noreturn" >&6; } if test x"${kyua_cv_attribute_noreturn}" = xyes; then value="__attribute__((__noreturn__))" else value="" fi ATTRIBUTE_NORETURN=${value} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((__unused__)) is supported" >&5 $as_echo_n "checking whether __attribute__((__unused__)) is supported... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ static void function(int a __attribute__((__unused__))) { } int main () { function(3); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } value="__attribute__((__unused__))" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } value="" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ATTRIBUTE_UNUSED=${value} for ac_func in putenv setenv unsetenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether putenv is in std" >&5 $as_echo_n "checking whether putenv is in std... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { std::putenv("a=b"); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_PUTENV_IN_STD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv is in std" >&5 $as_echo_n "checking whether setenv is in std... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { std::setenv("a", "b"); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SETENV_IN_STD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv is in std" >&5 $as_echo_n "checking whether unsetenv is in std... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { std::unsetenv("a"); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_UNSETENV_IN_STD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether basename takes a constant pointer" >&5 $as_echo_n "checking whether basename takes a constant pointer... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { const char* s = "/foo/bar/"; (void)::basename(s); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_CONST_BASENAME 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dirname takes a constant pointer" >&5 $as_echo_n "checking whether dirname takes a constant pointer... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { const char* s = "/foo/bar/"; (void)::dirname(s); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_CONST_DIRNAME 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getcwd(NULL, 0) works" >&5 $as_echo_n "checking whether getcwd(NULL, 0) works... " >&6; } if ${kyua_cv_getcwd_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { char *cwd = getcwd(NULL, 0); return (cwd != NULL) ? EXIT_SUCCESS : EXIT_FAILURE; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : kyua_cv_getcwd_works=yes else kyua_cv_getcwd_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kyua_cv_getcwd_works" >&5 $as_echo "$kyua_cv_getcwd_works" >&6; } if test x"${kyua_cv_getcwd_works}" = xyes; then $as_echo "#define HAVE_GETCWD_DYN 1" >>confdefs.h fi for ac_func in unmount do : ac_fn_cxx_check_func "$LINENO" "unmount" "ac_cv_func_unmount" if test "x$ac_cv_func_unmount" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNMOUNT 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf is in std" >&5 $as_echo_n "checking whether snprintf is in std... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char buf; std::snprintf(&buf, 1, ""); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SNPRINTF_IN_STD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the last valid signal" >&5 $as_echo_n "checking for the last valid signal... " >&6; } if ${kyua_cv_signal_lastno+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include #include int main () { int i; FILE *f; i = 0; while (i < 1024) { i++; if (i != SIGKILL && i != SIGSTOP) { struct sigaction sa; int ret; sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; ret = sigaction(i, &sa, NULL); if (ret == -1) { if (errno == EINVAL) { i--; break; } else err(EXIT_FAILURE, "sigaction failed"); } } } if (i == 100) errx(EXIT_FAILURE, "too much signals"); f = fopen("conftest.cnt", "w"); if (f == NULL) err(EXIT_FAILURE, "failed to open file"); fprintf(f, "%d\n", i); fclose(f); return EXIT_SUCCESS; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : if test ! -f conftest.cnt; then kyua_cv_signal_lastno=15 else kyua_cv_signal_lastno=$(cat conftest.cnt) rm -f conftest.cnt fi else kyua_cv_signal_lastno=15 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kyua_cv_signal_lastno" >&5 $as_echo "$kyua_cv_signal_lastno" >&6; } cat >>confdefs.h <<_ACEOF #define LAST_SIGNO ${kyua_cv_signal_lastno} _ACEOF ac_fn_cxx_check_type "$LINENO" "timer_t" "ac_cv_type_timer_t" "#include " if test "x$ac_cv_type_timer_t" = xyes; then : fi test x"${ATF_BUILD_CC-unset}" = x"unset" && ATF_BUILD_CC="${CC}" test x"${ATF_BUILD_CFLAGS-unset}" = x"unset" && ATF_BUILD_CFLAGS="${CFLAGS}" test x"${ATF_BUILD_CPP-unset}" = x"unset" && ATF_BUILD_CPP="${CPP}" test x"${ATF_BUILD_CPPFLAGS-unset}" = x"unset" && ATF_BUILD_CPPFLAGS="${CPPFLAGS}" test x"${ATF_BUILD_CXX-unset}" = x"unset" && ATF_BUILD_CXX="${CXX}" test x"${ATF_BUILD_CXXFLAGS-unset}" = x"unset" && ATF_BUILD_CXXFLAGS="${CXXFLAGS}" if test "${srcdir}" = .; then target_srcdir= else target_srcdir="${srcdir}/" fi atf_arch=`uname -p` atf_machine=`uname -m` { $as_echo "$as_me:${as_lineno-$LINENO}: Machine type: ${atf_machine}, architecture: ${atf_arch}" >&5 $as_echo "$as_me: Machine type: ${atf_machine}, architecture: ${atf_arch}" >&6;} atf_arch=${atf_arch} atf_machine=${atf_machine} if test x"${ATF_CONFSUBDIR-unset}" = x"unset"; then ATF_CONFSUBDIR=atf else case ${ATF_CONFSUBDIR} in /*) as_fn_error $? "ATF_CONFSUBDIR must hold a relative path" "$LINENO" 5 ;; *) ;; esac fi if test x"${ATF_CONFSUBDIR}" = x""; then atf_confdir=\${sysconfdir} else atf_confdir=\${sysconfdir}/${ATF_CONFSUBDIR} fi if test x"${ATF_WORKDIR}" = x""; then for t in /tmp /var/tmp; do if test -d ${t}; then ATF_WORKDIR=${t} break fi done if test x"${ATF_WORKDIR}" = x""; then as_fn_error $? "Could not guess a value for ATF_WORKDIR" "$LINENO" 5 fi else case ${ATF_WORKDIR} in /*) ;; *) as_fn_error $? "ATF_WORKDIR must hold an absolute path" "$LINENO" 5 ;; esac fi atf_aclocaldir=\${datadir}/aclocal atf_cssdir=\${datadir}/examples/atf atf_dtddir=\${datadir}/xml/atf atf_egdir=\${datadir}/examples/atf atf_pkgconfigdir=\${libdir}/pkgconfig atf_xsldir=\${datadir}/xsl/atf if test x"${ATF_SHELL}" = x""; then for ac_prog in bash sh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ATF_SHELL+:} false; then : $as_echo_n "(cached) " >&6 else case $ATF_SHELL in [\\/]* | ?:[\\/]*) ac_cv_path_ATF_SHELL="$ATF_SHELL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ATF_SHELL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ATF_SHELL=$ac_cv_path_ATF_SHELL if test -n "$ATF_SHELL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ATF_SHELL" >&5 $as_echo "$ATF_SHELL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ATF_SHELL" && break done else case ${ATF_SHELL} in /*) ;; *) as_fn_error $? "ATF_SHELL must hold an absolute path" "$LINENO" 5 ;; esac fi if test x"${ATF_SHELL}" = x""; then as_fn_error $? "No POSIX shell interpreter found; maybe set ATF_SHELL?" "$LINENO" 5 fi # Extract the first word of "gdb", so it can be a program name with args. set dummy gdb; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GDB+:} false; then : $as_echo_n "(cached) " >&6 else case $GDB in [\\/]* | ?:[\\/]*) ac_cv_path_GDB="$GDB" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GDB="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GDB=$ac_cv_path_GDB if test -n "$GDB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDB" >&5 $as_echo "$GDB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "kyua", so it can be a program name with args. set dummy kyua; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_KYUA+:} false; then : $as_echo_n "(cached) " >&6 else case $KYUA in [\\/]* | ?:[\\/]*) ac_cv_path_KYUA="$KYUA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_KYUA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi KYUA=$ac_cv_path_KYUA if test -n "$KYUA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KYUA" >&5 $as_echo "$KYUA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "${KYUA}"; then HAVE_KYUA_TRUE= HAVE_KYUA_FALSE='#' else HAVE_KYUA_TRUE='#' HAVE_KYUA_FALSE= fi # Extract the first word of "git", so it can be a program name with args. set dummy git; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GIT+:} false; then : $as_echo_n "(cached) " >&6 else case $GIT in [\\/]* | ?:[\\/]*) ac_cv_path_GIT="$GIT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GIT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GIT=$ac_cv_path_GIT if test -n "$GIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIT" >&5 $as_echo "$GIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_config_files="$ac_config_files Makefile atf-c/defs.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TOOLS_TRUE}" && test -z "${ENABLE_TOOLS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TOOLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_KYUA_TRUE}" && test -z "${HAVE_KYUA_FALSE}"; then as_fn_error $? "conditional \"HAVE_KYUA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Automated Testing Framework $as_me 0.17, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to . Automated Testing Framework home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Automated Testing Framework config.status 0.17 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ AR \ AR_FLAGS \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ SHELL \ ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` ;; esac ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _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 "bconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS bconfig.h" ;; "bootstrap/atconfig") CONFIG_COMMANDS="$CONFIG_COMMANDS bootstrap/atconfig" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "atf-c/defs.h") CONFIG_FILES="$CONFIG_FILES atf-c/defs.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "bootstrap/atconfig":C) cat >bootstrap/atconfig </dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == "file_magic". file_magic_cmd=$lt_file_magic_cmd # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name of the directory that contains temporary libtool files. objdir=$objdir # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that does not interpret backslashes. ECHO=$lt_ECHO # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $* )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$@"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1+=\$2" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1=\$$1\$2" } _LT_EOF ;; esac sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi if test ${enable_tools} = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building the deprecated ATF tools (atf-run and atf-report);" >&5 $as_echo "$as_me: WARNING: Building the deprecated ATF tools (atf-run and atf-report);" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: please migrate to Kyua as soon as feasible." >&5 $as_echo "$as_me: WARNING: please migrate to Kyua as soon as feasible." >&2;} fi bind9-9.9.5.dfsg/unit/unittest.sh.in0000644000470500017500000000051012271526120016627 0ustar lamontlamont#!/bin/sh PATH="@ATFBIN@:${PATH}" export PATH status=0 if [ -n "@ATFBIN@" -a -f Atffile ] then echo "I: unit tests" atf-run > atf.out status=$? # | cat is there to force non-fancy output atf-report < atf.out | cat if [ $status -eq 0 ] then rm -f atf.out echo R:PASS else echo R:FAIL fi fi exit $status bind9-9.9.5.dfsg/configure.in0000644000470500017500000031644612271526120015363 0ustar lamontlamont# Copyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. dnl AC_DIVERT_PUSH(1)dnl esyscmd([sed -e 's/^/# /' -e '/Portions of this code/,$d' COPYRIGHT])dnl AC_DIVERT_POP()dnl AC_REVISION($Revision: 1.533 $) AC_INIT(lib/dns/name.c) AC_PREREQ(2.59) AC_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([libtool.m4]) AC_CANONICAL_HOST AC_PROG_MAKE_SET # # GNU libtool support # case $build_os in sunos*) # Just set the maximum command line length for sunos as it otherwise # takes a exceptionally long time to work it out. Required for libtool. lt_cv_sys_max_cmd_len=4096; ;; esac AC_PROG_LIBTOOL AC_PROG_INSTALL AC_PROG_LN_S AC_SUBST(STD_CINCLUDES) AC_SUBST(STD_CDEFINES) AC_SUBST(STD_CWARNINGS) AC_SUBST(CCOPT) AC_SUBST(CCNOOPT) # Warn if the user specified libbind, which is now deprecated AC_ARG_ENABLE(libbind, [ --enable-libbind deprecated]) case "$enable_libbind" in yes) AC_MSG_ERROR(['libbind' is no longer part of the BIND 9 distribution. It is available from http://www.isc.org as a separate download.]) ;; no|'') ;; esac AC_ARG_ENABLE(developer, [ --enable-developer enable developer build settings]) case "$enable_developer" in yes) STD_CDEFINES="$STD_CDEFINES -DISC_LIST_CHECKINIT=1" test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes test "${with_atf+set}" = set || with_atf=yes test "${enable_filter_aaaa+set}" = set || enable_filter_aaaa=yes test "${enable_rrl+set}" = set || enable_rrl=yes test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes case "$host" in *-darwin*) test "${enable_exportlib+set}" = set || enable_exportlib=yes ;; *-linux*) test "${enable_exportlib+set}" = set || enable_exportlib=yes ;; esac test "${enable_symtable+set}" = set || enable_symtable=all ;; esac # # Make very sure that these are the first files processed by # config.status, since we use the processed output as the input for # AC_SUBST_FILE() substitutions in other files. # AC_CONFIG_FILES([make/rules make/includes]) AC_PATH_PROG(AR, ar) ARFLAGS="cruv" AC_SUBST(AR) AC_SUBST(ARFLAGS) # The POSIX ln(1) program. Non-POSIX systems may substitute # "copy" or something. LN=ln AC_SUBST(LN) case "$AR" in "") AC_MSG_ERROR([ ar program not found. Please fix your PATH to include the directory in which ar resides, or set AR in the environment with the full path to ar. ]) ;; esac # # Etags. # AC_PATH_PROGS(ETAGS, etags emacs-etags) # # Some systems, e.g. RH7, have the Exuberant Ctags etags instead of # GNU emacs etags, and it requires the -L flag. # if test "X$ETAGS" != "X"; then AC_MSG_CHECKING(for Exuberant Ctags etags) if $ETAGS --version 2>&1 | grep 'Exuberant Ctags' >/dev/null 2>&1; then AC_MSG_RESULT(yes) ETAGS="$ETAGS -L" else AC_MSG_RESULT(no) fi fi AC_SUBST(ETAGS) # # Perl is optional; it is used only by some of the system test scripts. # Note: the backtrace feature (see below) uses perl to build the symbol table, # but it still compiles without perl, in which case an empty table will be used. # AC_PATH_PROGS(PERL, perl5 perl) AC_SUBST(PERL) # # Python is also optional; it is used by the tools in bin/python. # If python is unavailable, we simply don't build those. # AC_ARG_WITH(python, [ --with-python=PATH Specify path to python interpreter], use_python="$withval", use_python="unspec") case "$use_python" in no) AC_MSG_RESULT(disabled) ;; unspec|yes|*) case "$use_python" in unspec|yes|'') AC_PATH_PROGS(PYTHON, python) ;; *) AC_PATH_PROGS(PYTHON, $use_python) ;; esac if test "X$PYTHON" == "X" then case "$use_python" in unspec) AC_MSG_RESULT(disabled) ;; yes|*) AC_MSG_ERROR([missing python]) ;; esac break fi testscript='try: import argparse except: exit(1)' AC_MSG_CHECKING([python module 'argparse']) if $PYTHON -c "$testscript"; then AC_MSG_RESULT([found, using $PYTHON]) else case "$use_python" in unspec) PYTHON="" AC_SUBST(CHECKDS) AC_SUBST(COVERAGE) AC_MSG_RESULT([not found, python disabled]) ;; yes) AC_MSG_RESULT([no found]) AC_MSG_ERROR([python 'argparse' module not supported]) ;; esac fi ;; esac PYTHON_TOOLS='' CHECKDS='' COVERAGE='' if test "X$PYTHON" != "X"; then PYTHON_TOOLS=python CHECKDS=checkds COVERAGE=coverage fi AC_SUBST(CHECKDS) AC_SUBST(COVERAGE) AC_SUBST(PYTHON_TOOLS) # # Special processing of paths depending on whether --prefix, # --sysconfdir or --localstatedir arguments were given. What's # desired is some compatibility with the way previous versions # of BIND built; they defaulted to /usr/local for most parts of # the installation, but named.boot/named.conf was in /etc # and named.pid was in /var/run. # # So ... if none of --prefix, --sysconfdir or --localstatedir are # specified, set things up that way. If --prefix is given, use # it for sysconfdir and localstatedir the way configure normally # would. To change the prefix for everything but leave named.conf # in /etc or named.pid in /var/run, then do this the usual configure way: # ./configure --prefix=/somewhere --sysconfdir=/etc # ./configure --prefix=/somewhere --localstatedir=/var # # To put named.conf and named.pid in /usr/local with everything else, # set the prefix explicitly to /usr/local even though that's the default: # ./configure --prefix=/usr/local # case "$prefix" in NONE) case "$sysconfdir" in '${prefix}/etc') sysconfdir=/etc ;; esac case "$localstatedir" in '${prefix}/var') localstatedir=/var ;; esac ;; esac # # Make sure INSTALL uses an absolute path, else it will be wrong in all # Makefiles, since they use make/rules.in and INSTALL will be adjusted by # configure based on the location of the file where it is substituted. # Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate # subdirectory of install-sh, This relative path will be wrong for all # directories more than one level down from install-sh. # case "$INSTALL" in /*) ;; *) # # Not all systems have dirname. # changequote({, }) ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`" changequote([, ]) ac_prog="`echo $INSTALL | sed 's%.*/%%'`" test "$ac_dir" = "$ac_prog" && ac_dir=. test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`" INSTALL="$ac_dir/$ac_prog" ;; esac # # On these hosts, we really want to use cc, not gcc, even if it is # found. The gcc that these systems have will not correctly handle # pthreads. # # However, if the user sets $CC to be something, let that override # our change. # if test "X$CC" = "X" ; then case "$host" in *-dec-osf*) CC="cc" ;; *-solaris*) # Use Sun's cc if it is available, but watch # out for /usr/ucb/cc; it will never be the right # compiler to use. # # If setting CC here fails, the AC_PROG_CC done # below might still find gcc. IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. case "$ac_dir" in /usr/ucb) # exclude ;; *) if test -f "$ac_dir/cc"; then CC="$ac_dir/cc" break fi ;; esac done IFS="$ac_save_ifs" ;; *-hp-hpux*) CC="cc" ;; mips-sgi-irix*) CC="cc" ;; esac fi AC_PROG_CC # # gcc's optimiser is broken at -02 for ultrasparc # if test "$ac_env_CFLAGS_set" != set -a "X$GCC" = "Xyes"; then case "$host" in sparc-*) CCFLAGS="-g -O1" ;; esac fi # # OS dependent CC flags # case "$host" in # OSF 5.0: recv/send are only available with -D_POSIX_PII_SOCKET or # -D_XOPEN_SOURCE_EXTENDED. *-dec-osf*) STD_CDEFINES="$STD_CDEFINES -D_POSIX_PII_SOCKET" CPPFLAGS="$CPPFLAGS -D_POSIX_PII_SOCKET" ;; #HP-UX: need -D_XOPEN_SOURCE_EXTENDED and -lxnet for CMSG macros *-hp-hpux*) STD_CDEFINES="$STD_CDEFINES -D_XOPEN_SOURCE_EXTENDED" CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED" LIBS="-lxnet $LIBS" ;; # Solaris: need -D_XPG4_2 and -D__EXTENSIONS__ for CMSG macros *-solaris*) STD_CDEFINES="$STD_CDEFINES -D_XPG4_2 -D__EXTENSIONS__" CPPFLAGS="$CPPFLAGS -D_XPG4_2 -D__EXTENSIONS__" ;; # POSIX doesn't include the IPv6 Advanced Socket API and glibc hides # parts of the IPv6 Advanced Socket API as a result. This is stupid # as it breaks how the two halves (Basic and Advanced) of the IPv6 # Socket API were designed to be used but we have to live with it. # Define _GNU_SOURCE to pull in the IPv6 Advanced Socket API. *-linux* | *-kfreebsd*-gnu) STD_CDEFINES="$STD_CDEFINES -D_GNU_SOURCE" CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" ;; # # Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use. # Setting this is sufficient to select the correct behavior for BIND 9. # *-darwin*) STD_CDEFINES="$STD_CDEFINES -D__APPLE_USE_RFC_3542" CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542" ;; esac # # CCNOOPT defaults to -O0 on gcc and disables optimization when is last # if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then CCNOOPT="-O0" fi AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,, [$ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif ]) AC_C_CONST AC_C_INLINE AC_C_VOLATILE AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME)) AC_C_FLEXIBLE_ARRAY_MEMBER # # Older versions of HP/UX don't define seteuid() and setegid() # AC_CHECK_FUNCS(seteuid setresuid) AC_CHECK_FUNCS(setegid setresgid) # # UnixWare 7.1.1 with the feature supplement to the UDK compiler # is reported to not support "static inline" (RT #1212). # AC_MSG_CHECKING(for static inline breakage) AC_TRY_COMPILE([ static inline int foo1() { return 0; } static inline int foo2() { return foo1(); } ], [foo1();], [AC_MSG_RESULT(no)], [AC_MSG_RESULT(yes) AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])]) AC_TYPE_SIZE_T AC_CHECK_TYPE(ssize_t, int) AC_CHECK_TYPE(uintptr_t,unsigned long) AC_CHECK_TYPE(socklen_t, [AC_DEFINE(ISC_SOCKADDR_LEN_T, socklen_t)], [ AC_TRY_COMPILE( [ #include #include int getsockname(int, struct sockaddr *, size_t *); ],[], [AC_DEFINE(ISC_SOCKADDR_LEN_T, size_t)], [AC_DEFINE(ISC_SOCKADDR_LEN_T, int)]) ], [ #include #include ]) AC_SUBST(ISC_SOCKADDR_LEN_T) AC_HEADER_TIME AC_MSG_CHECKING(for long long) AC_TRY_COMPILE([],[long long i = 0; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVELONGLONG="#define ISC_PLATFORM_HAVELONGLONG 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVELONGLONG="#undef ISC_PLATFORM_HAVELONGLONG"]) AC_SUBST(ISC_PLATFORM_HAVELONGLONG) # # check for GCC noreturn attribute # AC_MSG_CHECKING(for GCC noreturn attribute) AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));], [AC_MSG_RESULT(yes) ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE" ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"], [AC_MSG_RESULT(no) ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE" ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"]) AC_SUBST(ISC_PLATFORM_NORETURN_PRE) AC_SUBST(ISC_PLATFORM_NORETURN_POST) # # check if we have lifconf # AC_MSG_CHECKING(for struct lifconf) AC_TRY_COMPILE([ #include #include #include ], [ struct lifconf lifconf; lifconf.lifc_len = 0; ] , [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVELIFCONF="#define ISC_PLATFORM_HAVELIFCONF 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVELIFCONF="#undef ISC_PLATFORM_HAVELIFCONF"]) AC_SUBST(ISC_PLATFORM_HAVELIFCONF) # # check if we want the new statistics # AC_ARG_ENABLE(newstats, [ --enable-newstats use the new statistics]) case "$enable_newstats" in yes) AC_DEFINE(NEWSTATS, 1, [Use the new XML schema for statistics]) ;; *) ;; esac # # check if we want DNS RRL # AC_ARG_ENABLE(rrl, [ --enable-rrl use DNS Response Rate Limiting]) case "$enable_rrl" in yes) AC_DEFINE(USE_RRL, 1, [Enable DNS Response Rate Limiting]) RRLLINKOBJS='${RRLOBJS}' RRLLINKSRCS='${RRLSRCS}' ;; *) RRLLINKOBJS="" RRLLINKSRCS="" ;; esac AC_SUBST(RRLLINKOBJS) AC_SUBST(RRLLINKSRCS) # # check if we have kqueue # AC_ARG_ENABLE(kqueue, [ --enable-kqueue use BSD kqueue when available [[default=yes]]], want_kqueue="$enableval", want_kqueue="yes") case $want_kqueue in yes) AC_CHECK_FUNC(kqueue, ac_cv_have_kqueue=yes, ac_cv_have_kqueue=no) case $ac_cv_have_kqueue in yes) ISC_PLATFORM_HAVEKQUEUE="#define ISC_PLATFORM_HAVEKQUEUE 1" ;; *) ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE" ;; esac ;; *) ISC_PLATFORM_HAVEKQUEUE="#undef ISC_PLATFORM_HAVEKQUEUE" ;; esac AC_SUBST(ISC_PLATFORM_HAVEKQUEUE) # # check if we have epoll. Linux kernel 2.4 has epoll_create() which fails, # so we need to try running the code, not just test its existence. # AC_ARG_ENABLE(epoll, [ --enable-epoll use Linux epoll when available [[default=auto]]], want_epoll="$enableval", want_epoll="auto") case $want_epoll in auto) AC_MSG_CHECKING(epoll support) AC_TRY_RUN([ #include int main() { if (epoll_create(1) < 0) return (1); return (0); } ], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL"]) ;; yes) ISC_PLATFORM_HAVEEPOLL="#define ISC_PLATFORM_HAVEEPOLL 1" ;; *) ISC_PLATFORM_HAVEEPOLL="#undef ISC_PLATFORM_HAVEEPOLL" ;; esac AC_SUBST(ISC_PLATFORM_HAVEEPOLL) # # check if we support /dev/poll # AC_ARG_ENABLE(devpoll, [ --enable-devpoll use /dev/poll when available [[default=yes]]], want_devpoll="$enableval", want_devpoll="yes") case $want_devpoll in yes) AC_CHECK_HEADERS(sys/devpoll.h devpoll.h, ISC_PLATFORM_HAVEDEVPOLL="#define ISC_PLATFORM_HAVEDEVPOLL 1" , ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL" ) ;; *) ISC_PLATFORM_HAVEDEVPOLL="#undef ISC_PLATFORM_HAVEDEVPOLL" ;; esac AC_SUBST(ISC_PLATFORM_HAVEDEVPOLL) # # check if we need to #include sys/select.h explicitly # case $ac_cv_header_unistd_h in yes) AC_MSG_CHECKING(if unistd.h or sys/types.h defines fd_set) AC_TRY_COMPILE([ #include /* Ultrix */ #include ], [fd_set read_set; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDSYSSELECTH="#undef ISC_PLATFORM_NEEDSYSSELECTH" LWRES_PLATFORM_NEEDSYSSELECTH="#undef LWRES_PLATFORM_NEEDSYSSELECTH"], [AC_MSG_RESULT(no) case $ac_cv_header_sys_select_h in yes) ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1" LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1" ;; no) AC_MSG_ERROR([need either working unistd.h or sys/select.h]) ;; esac ]) ;; no) case $ac_cv_header_sys_select_h in yes) ISC_PLATFORM_NEEDSYSSELECTH="#define ISC_PLATFORM_NEEDSYSSELECTH 1" LWRES_PLATFORM_NEEDSYSSELECTH="#define LWRES_PLATFORM_NEEDSYSSELECTH 1" ;; no) AC_MSG_ERROR([need either unistd.h or sys/select.h]) ;; esac ;; esac AC_SUBST(ISC_PLATFORM_NEEDSYSSELECTH) AC_SUBST(LWRES_PLATFORM_NEEDSYSSELECTH) # # Find the machine's endian flavor. # AC_C_BIGENDIAN # # was --with-openssl specified? # OPENSSL_WARNING= AC_MSG_CHECKING(for OpenSSL library) AC_ARG_WITH(openssl, [ --with-openssl[=PATH] Build with OpenSSL [yes|no|path]. (Required for DNSSEC)], use_openssl="$withval", use_openssl="auto") openssldirs="/usr /usr/local /usr/local/ssl /usr/pkg /usr/sfw" if test "$use_openssl" = "auto" then for d in $openssldirs do if test -f $d/include/openssl/opensslv.h then use_openssl=$d break fi done fi OPENSSL_ECDSA="" OPENSSL_GOST="" case "$use_openssl" in no) AC_MSG_RESULT(no) DST_OPENSSL_INC="" USE_OPENSSL="" OPENSSLGOSTLINKOBJS="" OPENSSLGOSTLINKSRS="" OPENSSLLINKOBJS="" OPENSSLLINKSRCS="" ;; auto) DST_OPENSSL_INC="" USE_OPENSSL="" OPENSSLGOSTLINKOBJS="" OPENSSLGOSTLINKSRS="" OPENSSLLINKOBJS="" OPENSSLLINKSRCS="" AC_MSG_ERROR( [OpenSSL was not found in any of $openssldirs; use --with-openssl=/path If you don't want OpenSSL, use --without-openssl]) ;; *) if test "$use_openssl" = "yes" then # User did not specify a path - guess it for d in $openssldirs do if test -f $d/include/openssl/opensslv.h then use_openssl=$d break fi done if test "$use_openssl" = "yes" then AC_MSG_RESULT(not found) AC_MSG_ERROR( [OpenSSL was not found in any of $openssldirs; use --with-openssl=/path]) fi elif ! test -f "$use_openssl"/include/openssl/opensslv.h then AC_MSG_ERROR(["$use_openssl/include/openssl/opensslv.h" not found]) fi USE_OPENSSL='-DOPENSSL' if test "$use_openssl" = "/usr" then DST_OPENSSL_INC="" DNS_OPENSSL_LIBS="-lcrypto" else DST_OPENSSL_INC="-I$use_openssl/include" case $host in *-solaris*) DNS_OPENSSL_LIBS="-L$use_openssl/lib -R$use_openssl/lib -lcrypto" ;; *-hp-hpux*) DNS_OPENSSL_LIBS="-L$use_openssl/lib -Wl,+b: -lcrypto" ;; *-apple-darwin*) # # Apple's ld seaches for serially for dynamic # then static libraries. This means you can't # use -L to override dynamic system libraries # with static ones when linking. Instead # we specify a absolute path. # if test -f "$use_openssl/lib/libcrypto.dylib" then DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto" else DNS_OPENSSL_LIBS="$use_openssl/lib/libcrypto.a" fi ;; *) DNS_OPENSSL_LIBS="-L$use_openssl/lib -lcrypto" ;; esac fi AC_MSG_RESULT(using OpenSSL from $use_openssl/lib and $use_openssl/include) saved_cflags="$CFLAGS" saved_libs="$LIBS" CFLAGS="$CFLAGS $DST_OPENSSL_INC" LIBS="$LIBS $DNS_OPENSSL_LIBS" AC_MSG_CHECKING(whether linking with OpenSSL works) AC_TRY_RUN([ #include int main() { ERR_clear_error(); return (0); } ], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_MSG_ERROR(Could not run test program using OpenSSL from $use_openssl/lib and $use_openssl/include. Please check the argument to --with-openssl and your shared library configuration (e.g., LD_LIBRARY_PATH).)], [AC_MSG_RESULT(assuming it does work on target platform)]) AC_MSG_CHECKING(whether linking with OpenSSL requires -ldl) AC_TRY_LINK([ #include ], [ DSO_METHOD_dlfcn(); ], [AC_MSG_RESULT(no)], [LIBS="$LIBS -ldl" AC_TRY_LINK([ #include ],[ DSO_METHOD_dlfcn(); ], [AC_MSG_RESULT(yes) DNS_OPENSSL_LIBS="$DNS_OPENSSL_LIBS -ldl" ], [AC_MSG_RESULT(unknown) AC_MSG_ERROR(OpenSSL has unsupported dynamic loading)], [AC_MSG_RESULT(assuming it does work on target platform)]) ], [AC_MSG_RESULT(assuming it does work on target platform)] ) AC_ARG_ENABLE(openssl-version-check, [AC_HELP_STRING([--enable-openssl-version-check], [Check OpenSSL Version @<:@default=yes@:>@])]) case "$enable_openssl_version_check" in yes|'') AC_MSG_CHECKING(OpenSSL library version) AC_TRY_RUN([ #include #include int main() { if ((OPENSSL_VERSION_NUMBER >= 0x009070cfL && OPENSSL_VERSION_NUMBER < 0x00908000L) || OPENSSL_VERSION_NUMBER >= 0x0090804fL) return (0); printf("\n\nFound OPENSSL_VERSION_NUMBER %#010x\n", OPENSSL_VERSION_NUMBER); printf("Require OPENSSL_VERSION_NUMBER 0x009070cf or greater (0.9.7l)\n" "Require OPENSSL_VERSION_NUMBER 0x0090804f or greater (0.9.8d)\n\n"); return (1); } ], [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(not compatible) OPENSSL_WARNING=yes ], [AC_MSG_RESULT(assuming target platform has compatible version)]) ;; no) AC_MSG_RESULT(Skipped OpenSSL version check) ;; esac AC_MSG_CHECKING(for OpenSSL DSA support) if test -f $use_openssl/include/openssl/dsa.h then AC_DEFINE(HAVE_OPENSSL_DSA) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_CHECK_FUNCS(EVP_sha256 EVP_sha384 EVP_sha512) AC_MSG_CHECKING(for OpenSSL ECDSA support) have_ecdsa="" AC_TRY_RUN([ #include #include #include int main() { EC_KEY *ec256, *ec384; #if !defined(HAVE_EVP_SHA256) || !defined(HAVE_EVP_SHA384) return (1); #endif ec256 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); ec384 = EC_KEY_new_by_curve_name(NID_secp384r1); if (ec256 == NULL || ec384 == NULL) return (2); return (0); } ], [AC_MSG_RESULT(yes) have_ecdsa="yes"], [AC_MSG_RESULT(no) have_ecdsa="no"], [AC_MSG_RESULT(using --with-ecdsa)]) AC_ARG_WITH(ecdsa, [ --with-ecdsa OpenSSL ECDSA], with_ecdsa="$withval", with_ecdsa="auto") case "$with_ecdsa" in yes) case "$have_ecdsa" in no) AC_MSG_ERROR([ecdsa not supported]) ;; *) have_ecdsa=yes ;; esac ;; no) have_ecdsa=no ;; *) case "$have_ecdsa" in yes|no) ;; *) AC_MSG_ERROR([need --with-ecdsa=[[yes or no]]]) ;; esac ;; esac case $have_ecdsa in yes) OPENSSL_ECDSA="yes" AC_DEFINE(HAVE_OPENSSL_ECDSA, 1, [Define if your OpenSSL version supports ECDSA.]) ;; *) ;; esac AC_MSG_CHECKING(for OpenSSL GOST support) have_gost="" AC_TRY_RUN([ #include #include int main() { #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) ENGINE *e; EC_KEY *ek; ek = NULL; OPENSSL_config(NULL); e = ENGINE_by_id("gost"); if (e == NULL) return (1); if (ENGINE_init(e) <= 0) return (1); return (0); #else return (1); #endif } ], [AC_MSG_RESULT(yes) have_gost="yes"], [AC_MSG_RESULT(no) have_gost="no"], [AC_MSG_RESULT(using --with-gost)]) AC_ARG_WITH(gost, [ --with-gost OpenSSL GOST], with_gost="$withval", with_gost="auto") case "$with_gost" in yes) case "$have_gost" in no) AC_MSG_ERROR([gost not supported]) ;; *) have_gost=yes ;; esac ;; no) have_gost=no ;; *) case "$have_gost" in yes|no) ;; *) AC_MSG_ERROR([need --with-gost=[[yes or no]]]) ;; esac ;; esac case $have_gost in yes) OPENSSL_GOST="yes" OPENSSLGOSTLINKOBJS='${OPENSSLGOSTLINKOBJS}' OPENSSLGOSTLINKSRCS='${OPENSSLGOSTLINKSRCS}' AC_DEFINE(HAVE_OPENSSL_GOST, 1, [Define if your OpenSSL version supports GOST.]) ;; *) ;; esac CFLAGS="$saved_cflags" LIBS="$saved_libs" OPENSSLLINKOBJS='${OPENSSLLINKOBJS}' OPENSSLLINKSRCS='${OPENSSLLINKSRCS}' ;; esac # # This would include the system openssl path (and linker options to use # it as needed) if it is found. # AC_SUBST(USE_OPENSSL) AC_SUBST(DST_OPENSSL_INC) AC_SUBST(OPENSSLGOSTLINKOBJS) AC_SUBST(OPENSSLGOSTLINKSRCS) AC_SUBST(OPENSSLLINKOBJS) AC_SUBST(OPENSSLLINKSRCS) AC_SUBST(OPENSSL_ECDSA) AC_SUBST(OPENSSL_GOST) DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS" # # Use OpenSSL for hash functions # AC_ARG_ENABLE(openssl-hash, [ --enable-openssl-hash use OpenSSL for hash functions [[default=no]]], want_openssl_hash="$enableval", want_openssl_hash="no") case $want_openssl_hash in yes) if test "$USE_OPENSSL" = "" then AC_MSG_ERROR([No OpenSSL for hash functions]) fi ISC_PLATFORM_OPENSSLHASH="#define ISC_PLATFORM_OPENSSLHASH 1" ISC_OPENSSL_INC="$DST_OPENSSL_INC" ;; no) ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH" ISC_OPENSSL_INC="" ;; esac AC_SUBST(ISC_PLATFORM_OPENSSLHASH) AC_SUBST(ISC_OPENSSL_INC) # # PKCS11 (aka crypto hardware) support # # This works only with the right OpenSSL with PKCS11 engine! # AC_MSG_CHECKING(for PKCS11 support) AC_ARG_WITH(pkcs11, [ --with-pkcs11[=PATH] Build with PKCS11 support [yes|no|path] (PATH is for the PKCS11 provider)], use_pkcs11="$withval", use_pkcs11="no") case "$use_pkcs11" in no|'') AC_MSG_RESULT(disabled) USE_PKCS11='' PKCS11_TOOLS='' ;; yes|*) AC_MSG_RESULT(using OpenSSL with PKCS11 support) USE_PKCS11='-DUSE_PKCS11' PKCS11_TOOLS=pkcs11 ;; esac AC_SUBST(USE_PKCS11) AC_SUBST(PKCS11_TOOLS) AC_MSG_CHECKING(for PKCS11 tools) case "$use_pkcs11" in no|yes|'') AC_MSG_RESULT(disabled) PKCS11_PROVIDER="undefined" ;; *) AC_MSG_RESULT(PKCS11 provider is "$use_pkcs11") PKCS11_PROVIDER="$use_pkcs11" ;; esac AC_SUBST(PKCS11_PROVIDER) AC_MSG_CHECKING(for GSSAPI library) AC_ARG_WITH(gssapi, [ --with-gssapi=PATH Specify path for system-supplied GSSAPI [[default=yes]]], use_gssapi="$withval", use_gssapi="yes") # gssapi is just the framework, we really require kerberos v5, so # look for those headers (the gssapi headers must be there, too) # The problem with this implementation is that it doesn't allow # for the specification of gssapi and krb5 headers in different locations, # which probably ought to be fixed although fixing might raise the issue of # trying to build with incompatible versions of gssapi and krb5. if test "$use_gssapi" = "yes" then # first, deal with the obvious if test \( -f /usr/include/kerberosv5/krb5.h -o \ -f /usr/include/krb5/krb5.h -o \ -f /usr/include/krb5.h \) -a \ \( -f /usr/include/gssapi.h -o \ -f /usr/include/gssapi/gssapi.h \) then use_gssapi=/usr else krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr" for d in $krb5dirs do if test -f $d/include/gssapi/gssapi_krb5.h -o \ -f $d/include/krb5.h then if test -f $d/include/gssapi/gssapi.h -o \ -f $d/include/gssapi.h then use_gssapi=$d break fi fi use_gssapi="no" done fi fi case "$use_gssapi" in no) AC_MSG_RESULT(disabled) USE_GSSAPI='' ;; yes) AC_MSG_ERROR([--with-gssapi must specify a path]) ;; *) AC_MSG_RESULT(looking in $use_gssapi/lib) USE_GSSAPI='-DGSSAPI' saved_cppflags="$CPPFLAGS" CPPFLAGS="-I$use_gssapi/include $CPPFLAGS" AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h, [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"]) if test "$ISC_PLATFORM_GSSAPIHEADER" = ""; then AC_MSG_ERROR([gssapi.h not found]) fi AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h, [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"]) AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h, [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"]) if test "$ISC_PLATFORM_KRB5HEADER" = ""; then AC_MSG_ERROR([krb5.h not found]) fi CPPFLAGS="$saved_cppflags" # # XXXDCL This probably doesn't work right on all systems. # It will need to be worked on as problems become evident. # # Essentially the problems here relate to two different # areas. The first area is building with either KTH # or MIT Kerberos, particularly when both are present on # the machine. The other is static versus dynamic linking. # # On the KTH vs MIT issue, Both have libkrb5 that can mess # up the works if one implementation ends up trying to # use the other's krb. This is unfortunately a situation # that very easily arises. # # Dynamic linking when the dependency information is built # into MIT's libgssapi_krb5 or KTH's libgssapi magically makes # all such problems go away, but when that setup is not # present, because either the dynamic libraries lack # dependencies or static linking is being done, then the # problems start to show up. saved_libs="$LIBS" for TRY_LIBS in \ "-lgssapi_krb5" \ "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" \ "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv" \ "-lgssapi" \ "-lgssapi -lkrb5 -ldes -lcrypt -lasn1 -lroken -lcom_err" \ "-lgssapi -lkrb5 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \ "-lgssapi -lkrb5 -lhx509 -lcrypto -lcrypt -lasn1 -lroken -lcom_err" \ "-lgss -lkrb5" do # Note that this does not include $saved_libs, because # on FreeBSD machines this configure script has added # -L/usr/local/lib to LIBS, which can make the # -lgssapi_krb5 test succeed with shared libraries even # when you are trying to build with KTH in /usr/lib. if test "$use_gssapi" = "/usr" then LIBS="$TRY_LIBS" else LIBS="-L$use_gssapi/lib $TRY_LIBS" fi AC_MSG_CHECKING(linking as $TRY_LIBS) AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()], gssapi_linked=yes, gssapi_linked=no) case $gssapi_linked in yes) AC_MSG_RESULT(yes); break ;; no) AC_MSG_RESULT(no) ;; esac done case $gssapi_linked in no) AC_MSG_ERROR(could not determine proper GSSAPI linkage) ;; esac # # XXXDCL Major kludge. Tries to cope with KTH in /usr/lib # but MIT in /usr/local/lib and trying to build with KTH. # /usr/local/lib can end up earlier on the link lines. # Like most kludges, this one is not only inelegant it # is also likely to be the wrong thing to do at least as # many times as it is the right thing. Something better # needs to be done. # if test "$use_gssapi" = "/usr" -a \ -f /usr/local/lib/libkrb5.a; then FIX_KTH_VS_MIT=yes fi case "$FIX_KTH_VS_MIT" in yes) case "$enable_static_linking" in yes) gssapi_lib_suffix=".a" ;; *) gssapi_lib_suffix=".so" ;; esac for lib in $LIBS; do case $lib in -L*) ;; -l*) new_lib=`echo $lib | sed -e s%^-l%$use_gssapi/lib/lib% \ -e s%$%$gssapi_lib_suffix%` NEW_LIBS="$NEW_LIBS $new_lib" ;; *) AC_MSG_ERROR([KTH vs MIT Kerberos confusion!]) ;; esac done LIBS="$NEW_LIBS" ;; esac DST_GSSAPI_INC="-I$use_gssapi/include" DNS_GSSAPI_LIBS="$LIBS" AC_MSG_RESULT(using GSSAPI from $use_gssapi/lib and $use_gssapi/include) LIBS="$saved_libs" ;; esac AC_SUBST(ISC_PLATFORM_HAVEGSSAPI) AC_SUBST(ISC_PLATFORM_GSSAPIHEADER) AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER) AC_SUBST(ISC_PLATFORM_KRB5HEADER) AC_SUBST(USE_GSSAPI) AC_SUBST(DST_GSSAPI_INC) AC_SUBST(DNS_GSSAPI_LIBS) DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS $DNS_CRYPTO_LIBS" # # Applications linking with libdns also need to link with these libraries. # AC_SUBST(DNS_CRYPTO_LIBS) # # was --with-randomdev specified? # AC_MSG_CHECKING(for random device) AC_ARG_WITH(randomdev, [ --with-randomdev=PATH Specify path for random device], use_randomdev="$withval", use_randomdev="unspec") case "$use_randomdev" in unspec) case "$cross_compiling" in yes) AC_MSG_RESULT(unspecified) AC_MSG_ERROR([ need --with-randomdev=PATH or --with-randomdev=no]) esac case "$host" in *-openbsd*) devrandom=/dev/arandom ;; *) devrandom=/dev/random ;; esac AC_MSG_RESULT($devrandom) AC_CHECK_FILE($devrandom, AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$devrandom"),) ;; yes) AC_MSG_ERROR([--with-randomdev must specify a path]) ;; no) AC_MSG_RESULT(disabled) ;; *) AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$use_randomdev") AC_MSG_RESULT(using "$use_randomdev") ;; esac # # Do we have arc4random() ? # AC_CHECK_FUNC(arc4random, AC_DEFINE(HAVE_ARC4RANDOM)) sinclude(config.threads.in)dnl if $use_threads then if test "X$GCC" = "Xyes"; then case "$host" in *-freebsd*) CC="$CC -pthread" CCOPT="$CCOPT -pthread" CCNOOPT="$CCNOOPT -pthread" STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" ;; *-openbsd*) CC="$CC -pthread" CCOPT="$CCOPT -pthread" CCNOOPT="$CCNOOPT -pthread" ;; *-solaris*) LIBS="$LIBS -lthread" ;; *-ibm-aix*) STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" ;; esac else case $host in *-dec-osf*) CC="$CC -pthread" CCOPT="$CCOPT -pthread" CCNOOPT="$CCNOOPT -pthread" ;; *-solaris*) CC="$CC -mt" CCOPT="$CCOPT -mt" CCNOOPT="$CCNOOPT -mt" ;; *-ibm-aix*) STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE" ;; *-sco-sysv*uw*|*-*-sysv*UnixWare*) CC="$CC -Kthread" CCOPT="$CCOPT -Kthread" CCNOOPT="$CCNOOPT -Kthread" ;; *-*-sysv*OpenUNIX*) CC="$CC -Kpthread" CCOPT="$CCOPT -Kpthread" CCNOOPT="$CCNOOPT -Kpthread" ;; esac fi ALWAYS_DEFINES="-D_REENTRANT" ISC_PLATFORM_USETHREADS="#define ISC_PLATFORM_USETHREADS 1" THREADOPTOBJS='${THREADOPTOBJS}' THREADOPTSRCS='${THREADOPTSRCS}' thread_dir=pthreads # # We'd like to use sigwait() too # AC_CHECK_FUNC(sigwait, AC_DEFINE(HAVE_SIGWAIT), AC_CHECK_LIB(c, sigwait, AC_DEFINE(HAVE_SIGWAIT), AC_CHECK_LIB(pthread, sigwait, AC_DEFINE(HAVE_SIGWAIT), AC_CHECK_LIB(pthread, _Psigwait, AC_DEFINE(HAVE_SIGWAIT),)))) AC_CHECK_FUNC(pthread_attr_getstacksize, AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),) AC_CHECK_FUNC(pthread_attr_setstacksize, AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),) AC_CHECK_HEADERS(sched.h) case "$host" in *solaris-*) AC_CHECK_LIB(rt, sched_yield) ;; esac AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np) # # Additional OS-specific issues related to pthreads and sigwait. # case "$host" in # # One more place to look for sigwait. # *-freebsd*) AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),) case $host in *-freebsd5.[[012]]|*-freebsd5.[[012]].*);; *-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*) AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) ;; *-freebsd6.*) AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM) ;; esac ;; # # BSDI 3.0 through 4.0.1 needs pthread_init() to be # called before certain pthreads calls. This is deprecated # in BSD/OS 4.1. # *-bsdi3.*|*-bsdi4.0*) AC_DEFINE(NEED_PTHREAD_INIT) ;; # # LinuxThreads requires some changes to the way we # deal with signals. # *-linux*) AC_DEFINE(HAVE_LINUXTHREADS) ;; # # Ensure the right sigwait() semantics on Solaris and make # sure we call pthread_setconcurrency. # *-solaris*) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS) AC_CHECK_FUNC(pthread_setconcurrency, AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY)) ;; # # UnixWare does things its own way. # *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) AC_DEFINE(HAVE_UNIXWARE_SIGWAIT) ;; esac # # Look for sysconf to allow detection of the number of processors. # AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),) else ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS" thread_dir=nothreads THREADOPTOBJS="" THREADOPTSRCS="" ALWAYS_DEFINES="" fi AC_SUBST(ALWAYS_DEFINES) AC_SUBST(ISC_PLATFORM_USETHREADS) AC_SUBST(THREADOPTOBJS) AC_SUBST(THREADOPTSRCS) ISC_THREAD_DIR=$thread_dir AC_SUBST(ISC_THREAD_DIR) # # was --with-libxml2 specified? # AC_MSG_CHECKING(for libxml2 library) AC_ARG_WITH(libxml2, [ --with-libxml2[=PATH] Build with libxml2 library [yes|no|path]], use_libxml2="$withval", use_libxml2="auto") case "$use_libxml2" in no) DST_LIBXML2_INC="" ;; auto|yes) case X`(xml2-config --version) 2>/dev/null` in X2.[[6789]].*) libxml2_libs=`xml2-config --libs` libxml2_cflags=`xml2-config --cflags` ;; *) libxml2_libs= libxml2_cflags= ;; esac ;; *) if test -f "$use_libxml2/bin/xml2-config" ; then libxml2_libs=`$use_libxml2/bin/xml2-config --libs` libxml2_cflags=`$use_libxml2/bin/xml2-config --cflags` fi ;; esac if test "X$libxml2_libs" != "X" then AC_MSG_RESULT(yes) CFLAGS="$CFLAGS $libxml2_cflags" LIBS="$LIBS $libxml2_libs" AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 was found]) else AC_MSG_RESULT(no) fi # # In solaris 10, SMF can manage named service # AC_CHECK_LIB(scf, smf_enable_instance) # # flockfile is usually provided by pthreads, but we may want to use it # even if compiled with --disable-threads. getc_unlocked might also not # be defined. # AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),) AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),) # # Indicate what the final decision was regarding threads. # AC_MSG_CHECKING(whether to build with threads) if $use_threads; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi # # End of pthreads stuff. # # # Large File # AC_ARG_ENABLE(largefile, [ --enable-largefile 64-bit file support], want_largefile="yes", want_largefile="no") case $want_largefile in yes) ALWAYS_DEFINES="$ALWAYS_DEFINES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ;; *) ;; esac # # Additional compiler settings. # MKDEPCC="$CC" MKDEPCFLAGS="-M" IRIX_DNSSEC_WARNINGS_HACK="" if test "X$GCC" = "Xyes"; then AC_MSG_CHECKING(if "$CC" supports -fno-strict-aliasing) SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -fno-strict-aliasing" AC_TRY_COMPILE(,, [FNOSTRICTALIASING=yes],[FNOSTRICTALIASING=no]) CFLAGS=$SAVE_CFLAGS if test "$FNOSTRICTALIASING" = "yes"; then AC_MSG_RESULT(yes) STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith -fno-strict-aliasing" else AC_MSG_RESULT(no) STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith" fi case "$host" in *-hp-hpux*) LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS" ;; esac else case $host in *-dec-osf*) CC="$CC -std" CCOPT="$CCOPT -std" CCNOOPT="$CCNOOPT -std" MKDEPCC="$CC" ;; *-hp-hpux*) CC="$CC -Ae -z" # The version of the C compiler that constantly warns about # 'const' as well as alignment issues is unfortunately not # able to be discerned via the version of the operating # system, nor does cc have a version flag. case "`$CC +W 123 2>&1`" in *Unknown?option*) STD_CWARNINGS="+w1" ;; *) # Turn off the pointlessly noisy warnings. STD_CWARNINGS="+w1 +W 474,530,2193,2236" ;; esac CCOPT="$CCOPT -Ae -z" CCNOOPT="$CCNOOPT -Ae -z" LDFLAGS="-Wl,+vnocompatwarnings $LDFLAGS" MKDEPPROG='cc -Ae -E -Wp,-M >/dev/null 2>>$TMP' ;; *-sgi-irix*) STD_CWARNINGS="-fullwarn -woff 1209" # # Silence more than 250 instances of # "prototyped function redeclared without prototype" # and 11 instances of # "variable ... was set but never used" # from lib/dns/sec/openssl. # IRIX_DNSSEC_WARNINGS_HACK="-woff 1692,1552" ;; *-solaris*) MKDEPCFLAGS="-xM" ;; *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) # UnixWare CC="$CC -w" ;; esac fi AC_SUBST(MKDEPCC) AC_SUBST(MKDEPCFLAGS) AC_SUBST(MKDEPPROG) AC_SUBST(IRIX_DNSSEC_WARNINGS_HACK) # # NLS # AC_CHECK_FUNC(catgets, AC_DEFINE(HAVE_CATGETS),) # # -lxnet buys us one big porting headache... standards, gotta love 'em. # # AC_CHECK_LIB(xnet, socket, , # AC_CHECK_LIB(socket, socket) # ) # # Use this for now, instead: # case "$host" in mips-sgi-irix*) ;; *-linux*) ;; *) AC_CHECK_LIB(socket, socket) AC_CHECK_LIB(nsl, inet_addr) ;; esac # # Work around Solaris's select() limitations. # case "$host" in *-solaris2.[[89]]|*-solaris2.1?) AC_DEFINE(FD_SETSIZE, 65536, [Solaris hack to get select_large_fdset.]) ;; esac # # Purify support # AC_MSG_CHECKING(whether to use purify) AC_ARG_WITH(purify, [ --with-purify[=PATH] use Rational purify], use_purify="$withval", use_purify="no") case "$use_purify" in no) ;; yes) AC_PATH_PROG(purify_path, purify, purify) ;; *) purify_path="$use_purify" ;; esac case "$use_purify" in no) AC_MSG_RESULT(no) PURIFY="" ;; *) if test -f $purify_path || test $purify_path = purify; then AC_MSG_RESULT($purify_path) PURIFYFLAGS="`echo $PURIFYOPTIONS`" PURIFY="$purify_path $PURIFYFLAGS" else AC_MSG_ERROR([$purify_path not found. Please choose the proper path with the following command: configure --with-purify=PATH ]) fi ;; esac AC_SUBST(PURIFY) AC_ARG_WITH(libtool, [ --with-libtool use GNU libtool], use_libtool="$withval", use_libtool="no") case $use_libtool in yes) AM_PROG_LIBTOOL O=lo A=la LIBTOOL_MKDEP_SED='s;\.o;\.lo;' LIBTOOL_MODE_COMPILE='--mode=compile --tag=CC' LIBTOOL_MODE_INSTALL='--mode=install --tag=CC' LIBTOOL_MODE_LINK='--mode=link --tag=CC' case "$host" in *) LIBTOOL_ALLOW_UNDEFINED= ;; esac case "$host" in *-ibm-aix*) LIBTOOL_IN_MAIN="-Wl,-bI:T_testlist.imp" ;; *) LIBTOOL_IN_MAIN= ;; esac; ;; *) O=o A=a LIBTOOL= AC_SUBST(LIBTOOL) LIBTOOL_MKDEP_SED= LIBTOOL_MODE_COMPILE= LIBTOOL_MODE_INSTALL= LIBTOOL_MODE_LINK= LIBTOOL_ALLOW_UNDEFINED= LIBTOOL_IN_MAIN= ;; esac # # enable/disable dumping stack backtrace. Also check if the system supports # glibc-compatible backtrace() function. # AC_ARG_ENABLE(backtrace, [ --enable-backtrace log stack backtrace on abort [[default=yes]]], want_backtrace="$enableval", want_backtrace="yes") case $want_backtrace in yes) ISC_PLATFORM_USEBACKTRACE="#define ISC_PLATFORM_USEBACKTRACE 1" AC_TRY_LINK([#include ], [return (backtrace((void **)0, 0));], [AC_DEFINE([HAVE_LIBCTRACE], [], [if system have backtrace function])],) ;; *) ISC_PLATFORM_USEBACKTRACE="#undef ISC_PLATFORM_USEBACKTRACE" ;; esac AC_SUBST(ISC_PLATFORM_USEBACKTRACE) AC_ARG_ENABLE(symtable, [ --enable-symtable use internal symbol table for backtrace [[all|minimal(default)|none]]], want_symtable="$enableval", want_symtable="minimal") case $want_symtable in yes|all|minimal) # "yes" is a hidden value equivalent to "minimal" if test "$PERL" = "" then AC_MSG_ERROR([Internal symbol table requires perl but no perl is found. Install perl or explicitly disable the feature by --disable-symtable.]) fi if test "$use_libtool" = "yes"; then AC_MSG_WARN([Internal symbol table does not work with libtool. Disabling symbol table.]) else # we generate the internal symbol table only for those systems # known to work to avoid unexpected build failure. Also, warn # about unsupported systems when the feature is enabled # manually. case $host_os in freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*) MKSYMTBL_PROGRAM="$PERL" if test $want_symtable = all; then ALWAYS_MAKE_SYMTABLE="yes" fi ;; *) if test $want_symtable = yes -o $want_symtable = all then AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it]) fi esac fi ;; *) ;; esac AC_SUBST(MKSYMTBL_PROGRAM) AC_SUBST(ALWAYS_MAKE_SYMTABLE) # # File name extension for static archive files, for those few places # where they are treated differently from dynamic ones. # SA=a AC_SUBST(O) AC_SUBST(A) AC_SUBST(SA) AC_SUBST(LIBTOOL_MKDEP_SED) AC_SUBST(LIBTOOL_MODE_COMPILE) AC_SUBST(LIBTOOL_MODE_INSTALL) AC_SUBST(LIBTOOL_MODE_LINK) AC_SUBST(LIBTOOL_ALLOW_UNDEFINED) AC_SUBST(LIBTOOL_IN_MAIN) # # build exportable DNS library? # AC_ARG_ENABLE(exportlib, [ --enable-exportlib build exportable library (GNU make required) [[default=no]]]) case "$enable_exportlib" in yes) gmake= for x in gmake gnumake make; do if $x --version 2>/dev/null | grep GNU > /dev/null; then gmake=$x break; fi done if test -z "$gmake"; then AC_MSG_ERROR([exportlib requires GNU make. Install it or disable the feature.]) fi LIBEXPORT=lib/export AC_SUBST(LIBEXPORT) BIND9_CO_RULE="%.$O: \${srcdir}/%.c" ;; no|*) BIND9_CO_RULE=".c.$O:" ;; esac AC_SUBST(BIND9_CO_RULE) AC_ARG_WITH(export-libdir, [ --with-export-libdir[=PATH] installation directory for the export library [[EPREFIX/lib/bind9]]], export_libdir="$withval",) if test -z "$export_libdir"; then export_libdir="\${exec_prefix}/lib/bind9/" fi AC_SUBST(export_libdir) AC_ARG_WITH(export-includedir, [ --with-export-includedir[=PATH] installation directory for the header files of the export library [[PREFIX/include/bind9]]], export_includedir="$withval",) if test -z "$export_includedir"; then export_includedir="\${prefix}/include/bind9/" fi AC_SUBST(export_includedir) # # Here begins a very long section to determine the system's networking # capabilities. The order of the tests is significant. # # # IPv6 # AC_ARG_ENABLE(ipv6, [ --enable-ipv6 use IPv6 [default=autodetect]]) case "$enable_ipv6" in yes|''|autodetect) AC_DEFINE(WANT_IPV6) ;; no) ;; esac # # We do the IPv6 compilation checking after libtool so that we can put # the right suffix on the files. # AC_MSG_CHECKING(for IPv6 structures) AC_TRY_COMPILE([ #include #include #include ], [struct sockaddr_in6 sin6; return (0);], [AC_MSG_RESULT(yes) found_ipv6=yes], [AC_MSG_RESULT(no) found_ipv6=no]) # # See whether IPv6 support is provided via a Kame add-on. # This is done before other IPv6 linking tests to LIBS is properly set. # AC_MSG_CHECKING(for Kame IPv6 support) AC_ARG_WITH(kame, [ --with-kame[=PATH] use Kame IPv6 [default path /usr/local/v6]], use_kame="$withval", use_kame="no") case "$use_kame" in no) ;; yes) kame_path=/usr/local/v6 ;; *) kame_path="$use_kame" ;; esac case "$use_kame" in no) AC_MSG_RESULT(no) ;; *) if test -f $kame_path/lib/libinet6.a; then AC_MSG_RESULT($kame_path/lib/libinet6.a) LIBS="-L$kame_path/lib -linet6 $LIBS" else AC_MSG_ERROR([$kame_path/lib/libinet6.a not found. Please choose the proper path with the following command: configure --with-kame=PATH ]) fi ;; esac # # Whether netinet6/in6.h is needed has to be defined in isc/platform.h. # Including it on Kame-using platforms is very bad, though, because # Kame uses #error against direct inclusion. So include it on only # the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1. # This is done before the in6_pktinfo check because that's what # netinet6/in6.h is needed for. # changequote({, }) case "$host" in *-bsdi4.[01]*) ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1" LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1" isc_netinet6in6_hack="#include " ;; *) ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H" LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H" isc_netinet6in6_hack="" ;; esac changequote([, ]) # # This is similar to the netinet6/in6.h issue. # case "$host" in *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) # UnixWare ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1" LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1" ISC_PLATFORM_FIXIN6ISADDR="#define ISC_PLATFORM_FIXIN6ISADDR 1" isc_netinetin6_hack="#include " ;; *) ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H" LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H" ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR" isc_netinetin6_hack="" ;; esac # # Now delve deeper into the suitability of the IPv6 support. # case "$found_ipv6" in yes) ISC_PLATFORM_HAVEIPV6="#define ISC_PLATFORM_HAVEIPV6 1" LWRES_PLATFORM_HAVEIPV6="#define LWRES_PLATFORM_HAVEIPV6 1" AC_MSG_CHECKING(for in6_addr) AC_TRY_COMPILE([ #include #include #include $isc_netinetin6_hack $isc_netinet6in6_hack ], [struct in6_addr in6; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVEINADDR6="#undef ISC_PLATFORM_HAVEINADDR6" LWRES_PLATFORM_HAVEINADDR6="#undef LWRES_PLATFORM_HAVEINADDR6" isc_in_addr6_hack=""], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVEINADDR6="#define ISC_PLATFORM_HAVEINADDR6 1" LWRES_PLATFORM_HAVEINADDR6="#define LWRES_PLATFORM_HAVEINADDR6 1" isc_in_addr6_hack="#define in6_addr in_addr6"]) AC_MSG_CHECKING(for in6addr_any) AC_TRY_LINK([ #include #include #include $isc_netinetin6_hack $isc_netinet6in6_hack $isc_in_addr6_hack ], [struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]);], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY" LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY"], [AC_MSG_RESULT(no) ISC_PLATFORM_NEEDIN6ADDRANY="#define ISC_PLATFORM_NEEDIN6ADDRANY 1" LWRES_PLATFORM_NEEDIN6ADDRANY="#define LWRES_PLATFORM_NEEDIN6ADDRANY 1"]) AC_MSG_CHECKING(for in6addr_loopback) AC_TRY_LINK([ #include #include #include $isc_netinetin6_hack $isc_netinet6in6_hack $isc_in_addr6_hack ], [struct in6_addr in6; in6 = in6addr_loopback; return (in6.s6_addr[0]);], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef ISC_PLATFORM_NEEDIN6ADDRLOOPBACK" LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#undef LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK"], [AC_MSG_RESULT(no) ISC_PLATFORM_NEEDIN6ADDRLOOPBACK="#define ISC_PLATFORM_NEEDIN6ADDRLOOPBACK 1" LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK="#define LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK 1"]) AC_MSG_CHECKING(for sin6_scope_id in struct sockaddr_in6) AC_TRY_COMPILE([ #include #include #include $isc_netinetin6_hack $isc_netinet6in6_hack ], [struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1" result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVESCOPEID="#undef ISC_PLATFORM_HAVESCOPEID" result="#undef LWRES_HAVE_SIN6_SCOPE_ID"]) LWRES_HAVE_SIN6_SCOPE_ID="$result" AC_MSG_CHECKING(for in6_pktinfo) AC_TRY_COMPILE([ #include #include #include $isc_netinetin6_hack $isc_netinet6in6_hack ], [struct in6_pktinfo xyzzy; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVEIN6PKTINFO="#define ISC_PLATFORM_HAVEIN6PKTINFO 1"], [AC_MSG_RESULT(no -- disabling runtime ipv6 support) ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO"]) ;; no) ISC_PLATFORM_HAVEIPV6="#undef ISC_PLATFORM_HAVEIPV6" LWRES_PLATFORM_HAVEIPV6="#undef LWRES_PLATFORM_HAVEIPV6" ISC_PLATFORM_NEEDIN6ADDRANY="#undef ISC_PLATFORM_NEEDIN6ADDRANY" LWRES_PLATFORM_NEEDIN6ADDRANY="#undef LWRES_PLATFORM_NEEDIN6ADDRANY" ISC_PLATFORM_HAVEIN6PKTINFO="#undef ISC_PLATFORM_HAVEIN6PKTINFO" LWRES_HAVE_SIN6_SCOPE_ID="#define LWRES_HAVE_SIN6_SCOPE_ID 1" ISC_PLATFORM_HAVESCOPEID="#define ISC_PLATFORM_HAVESCOPEID 1" ISC_IPV6_H="ipv6.h" ISC_IPV6_O="ipv6.$O" ISC_ISCIPV6_O="unix/ipv6.$O" ISC_IPV6_C="ipv6.c" ;; esac AC_SUBST(ISC_PLATFORM_HAVEIPV6) AC_SUBST(LWRES_PLATFORM_HAVEIPV6) AC_SUBST(ISC_PLATFORM_NEEDNETINETIN6H) AC_SUBST(LWRES_PLATFORM_NEEDNETINETIN6H) AC_SUBST(ISC_PLATFORM_NEEDNETINET6IN6H) AC_SUBST(LWRES_PLATFORM_NEEDNETINET6IN6H) AC_SUBST(ISC_PLATFORM_HAVEINADDR6) AC_SUBST(LWRES_PLATFORM_HAVEINADDR6) AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRANY) AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRANY) AC_SUBST(ISC_PLATFORM_NEEDIN6ADDRLOOPBACK) AC_SUBST(LWRES_PLATFORM_NEEDIN6ADDRLOOPBACK) AC_SUBST(ISC_PLATFORM_HAVEIN6PKTINFO) AC_SUBST(ISC_PLATFORM_FIXIN6ISADDR) AC_SUBST(ISC_IPV6_H) AC_SUBST(ISC_IPV6_O) AC_SUBST(ISC_ISCIPV6_O) AC_SUBST(ISC_IPV6_C) AC_SUBST(LWRES_HAVE_SIN6_SCOPE_ID) AC_SUBST(ISC_PLATFORM_HAVESCOPEID) AC_MSG_CHECKING([for struct if_laddrreq]) AC_TRY_LINK([ #include #include ],[ struct if_laddrreq a; ], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVEIF_LADDRREQ="#define ISC_PLATFORM_HAVEIF_LADDRREQ 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVEIF_LADDRREQ="#undef ISC_PLATFORM_HAVEIF_LADDRREQ"]) AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRREQ) AC_MSG_CHECKING([for struct if_laddrconf]) AC_TRY_LINK([ #include #include ],[ struct if_laddrconf a; ], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVEIF_LADDRCONF="#define ISC_PLATFORM_HAVEIF_LADDRCONF 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVEIF_LADDRCONF="#undef ISC_PLATFORM_HAVEIF_LADDRCONF"]) AC_SUBST(ISC_PLATFORM_HAVEIF_LADDRCONF) # # Check for network functions that are often missing. We do this # after the libtool checking, so we can put the right suffix on # the files. It also needs to come after checking for a Kame add-on, # which provides some (all?) of the desired functions. # AC_MSG_CHECKING([for inet_ntop with IPv6 support]) AC_TRY_RUN([ #include #include #include #include main() { char a[16],b[64]; return(inet_ntop(AF_INET6, a, b, sizeof(b)) == (char*)0);}], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"], [AC_MSG_RESULT(no) ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c" ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"], [AC_MSG_RESULT(assuming inet_ntop not needed) ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"]) # On NetBSD 1.4.2 and maybe others, inet_pton() incorrectly accepts # addresses with less than four octets, like "1.2.3". Also leading # zeros should also be rejected. AC_MSG_CHECKING([for working inet_pton with IPv6 support]) AC_TRY_RUN([ #include #include #include #include main() { char a[16]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 : inet_pton(AF_INET, "1.2.3.04", a) == 1 ? 1 : (inet_pton(AF_INET6, "::1.2.3.4", a) != 1)); }], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"], [AC_MSG_RESULT(no) ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c" ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"], [AC_MSG_RESULT(assuming inet_pton needed) ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c" ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"]) AC_SUBST(ISC_PLATFORM_NEEDNTOP) AC_SUBST(ISC_PLATFORM_NEEDPTON) # # Look for a 4.4BSD-style sa_len member in struct sockaddr. # case "$host" in *-dec-osf*) # Turn on 4.4BSD style sa_len support. AC_DEFINE(_SOCKADDR_LEN) ;; esac AC_MSG_CHECKING(for sa_len in struct sockaddr) AC_TRY_COMPILE([ #include #include ], [struct sockaddr sa; sa.sa_len = 0; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_HAVESALEN="#define ISC_PLATFORM_HAVESALEN 1" LWRES_PLATFORM_HAVESALEN="#define LWRES_PLATFORM_HAVESALEN 1"], [AC_MSG_RESULT(no) ISC_PLATFORM_HAVESALEN="#undef ISC_PLATFORM_HAVESALEN" LWRES_PLATFORM_HAVESALEN="#undef LWRES_PLATFORM_HAVESALEN"]) AC_SUBST(ISC_PLATFORM_HAVESALEN) AC_SUBST(LWRES_PLATFORM_HAVESALEN) # # Look for a 4.4BSD or 4.3BSD struct msghdr # AC_MSG_CHECKING(for struct msghdr flavor) AC_TRY_COMPILE([ #include #include ], [struct msghdr msg; msg.msg_flags = 0; return (0);], [AC_MSG_RESULT(4.4BSD) ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD44MSGHDR 1"], [AC_MSG_RESULT(4.3BSD) ISC_PLATFORM_MSGHDRFLAVOR="#define ISC_NET_BSD43MSGHDR 1"]) AC_SUBST(ISC_PLATFORM_MSGHDRFLAVOR) # # Look for in_port_t. # AC_MSG_CHECKING(for type in_port_t) AC_TRY_COMPILE([ #include #include ], [in_port_t port = 25; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_NEEDPORTT="#undef ISC_PLATFORM_NEEDPORTT"], [AC_MSG_RESULT(no) ISC_PLATFORM_NEEDPORTT="#define ISC_PLATFORM_NEEDPORTT 1"]) AC_SUBST(ISC_PLATFORM_NEEDPORTT) # # Check for addrinfo # AC_MSG_CHECKING(for struct addrinfo) AC_TRY_COMPILE([ #include ], [struct addrinfo a; return (0);], [AC_MSG_RESULT(yes) ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO" ISC_IRS_NEEDADDRINFO="#undef ISC_IRS_NEEDADDRINFO" AC_DEFINE(HAVE_ADDRINFO)], [AC_MSG_RESULT(no) ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1" ISC_IRS_NEEDADDRINFO="#define ISC_IRS_NEEDADDRINFO 1"]) AC_SUBST(ISC_LWRES_NEEDADDRINFO) AC_SUBST(ISC_IRS_NEEDADDRINFO) # # Check for rrsetinfo # AC_MSG_CHECKING(for struct rrsetinfo) AC_TRY_COMPILE([ #include ], [struct rrsetinfo r; return (0);], [AC_MSG_RESULT(yes) ISC_LWRES_NEEDRRSETINFO="#undef ISC_LWRES_NEEDRRSETINFO"], [AC_MSG_RESULT(no) ISC_LWRES_NEEDRRSETINFO="#define ISC_LWRES_NEEDRRSETINFO 1"]) AC_SUBST(ISC_LWRES_NEEDRRSETINFO) AC_MSG_CHECKING(for int sethostent) AC_TRY_COMPILE([ #include ], [int i = sethostent(0); return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_SETHOSTENTINT="#define ISC_LWRES_SETHOSTENTINT 1"], [AC_MSG_RESULT(no) ISC_LWRES_SETHOSTENTINT="#undef ISC_LWRES_SETHOSTENTINT"]) AC_SUBST(ISC_LWRES_SETHOSTENTINT) AC_MSG_CHECKING(for int endhostent) AC_TRY_COMPILE([ #include ], [int i = endhostent(); return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_ENDHOSTENTINT="#define ISC_LWRES_ENDHOSTENTINT 1"], [AC_MSG_RESULT(no) ISC_LWRES_ENDHOSTENTINT="#undef ISC_LWRES_ENDHOSTENTINT"]) AC_SUBST(ISC_LWRES_ENDHOSTENTINT) AC_MSG_CHECKING(for getnetbyaddr(in_addr_t, ...)) AC_TRY_COMPILE([ #include struct netent *getnetbyaddr(in_addr_t, int);], [], [AC_MSG_RESULT(yes) ISC_LWRES_GETNETBYADDRINADDR="#define ISC_LWRES_GETNETBYADDRINADDR 1"], [AC_MSG_RESULT(no) ISC_LWRES_GETNETBYADDRINADDR="#undef ISC_LWRES_GETNETBYADDRINADDR"]) AC_SUBST(ISC_LWRES_GETNETBYADDRINADDR) AC_MSG_CHECKING(for int setnetent) AC_TRY_COMPILE([ #include ], [int i = setnetent(0); return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_SETNETENTINT="#define ISC_LWRES_SETNETENTINT 1"], [AC_MSG_RESULT(no) ISC_LWRES_SETNETENTINT="#undef ISC_LWRES_SETNETENTINT"]) AC_SUBST(ISC_LWRES_SETNETENTINT) AC_MSG_CHECKING(for int endnetent) AC_TRY_COMPILE([ #include ], [int i = endnetent(); return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_ENDNETENTINT="#define ISC_LWRES_ENDNETENTINT 1"], [AC_MSG_RESULT(no) ISC_LWRES_ENDNETENTINT="#undef ISC_LWRES_ENDNETENTINT"]) AC_SUBST(ISC_LWRES_ENDNETENTINT) AC_MSG_CHECKING(for gethostbyaddr(const void *, size_t, ...)) AC_TRY_COMPILE([ #include struct hostent *gethostbyaddr(const void *, size_t, int);], [return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_GETHOSTBYADDRVOID="#define ISC_LWRES_GETHOSTBYADDRVOID 1"], [AC_MSG_RESULT(no) ISC_LWRES_GETHOSTBYADDRVOID="#undef ISC_LWRES_GETHOSTBYADDRVOID"]) AC_SUBST(ISC_LWRES_GETHOSTBYADDRVOID) AC_MSG_CHECKING(for h_errno in netdb.h) AC_TRY_COMPILE([ #include ], [h_errno = 1; return(0);], [AC_MSG_RESULT(yes) ISC_LWRES_NEEDHERRNO="#undef ISC_LWRES_NEEDHERRNO"], [AC_MSG_RESULT(no) ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"]) AC_SUBST(ISC_LWRES_NEEDHERRNO) # # Sadly, the definitions of system-supplied getnameinfo(3) vary. Try to catch # known variations here: # AC_MSG_CHECKING(for getnameinfo prototype definitions) AC_TRY_COMPILE([ #include #include #include int getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, unsigned int);], [ return (0);], [AC_MSG_RESULT(socklen_t for buflen; u_int for flags) AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t, [Define to the buffer length type used by getnameinfo(3).]) AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, unsigned int, [Define to the flags type used by getnameinfo(3).])], [AC_TRY_COMPILE([ #include #include #include int getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int);], [ return (0);], [AC_MSG_RESULT(size_t for buflen; int for flags) AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t) AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)], [AC_MSG_RESULT(not match any subspecies; assume standard definition) AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t) AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)])]) # # ...and same for gai_strerror(). # AC_MSG_CHECKING(for gai_strerror prototype definitions) AC_TRY_COMPILE([ #include #include #include char *gai_strerror(int ecode);], [ return (0); ], [AC_MSG_RESULT(returning char *) AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [char *], [return type of gai_strerror])], [AC_MSG_RESULT(not match any subspecies; assume standard definition) AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [const char *])]) AC_CHECK_FUNC(getipnodebyname, [ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"], [ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"]) AC_CHECK_FUNC(getnameinfo, [ISC_LWRES_GETNAMEINFOPROTO="#undef ISC_LWRES_GETNAMEINFOPROTO"], [ISC_LWRES_GETNAMEINFOPROTO="#define ISC_LWRES_GETNAMEINFOPROTO 1"]) AC_CHECK_FUNC(getaddrinfo, [ISC_LWRES_GETADDRINFOPROTO="#undef ISC_LWRES_GETADDRINFOPROTO" AC_DEFINE(HAVE_GETADDRINFO)], [ISC_LWRES_GETADDRINFOPROTO="#define ISC_LWRES_GETADDRINFOPROTO 1"]) AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR)) AC_SUBST(ISC_LWRES_GETIPNODEPROTO) AC_SUBST(ISC_LWRES_GETADDRINFOPROTO) AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO) AC_SUBST(ISC_IRS_GETNAMEINFOSOCKLEN) AC_ARG_ENABLE(getifaddrs, [ --enable-getifaddrs Enable the use of getifaddrs() [[yes|no]].], want_getifaddrs="$enableval", want_getifaddrs="yes") # # This interface iteration code for getifaddrs() will fall back to using # /proc/net/if_inet6 if getifaddrs() in glibc doesn't return any IPv6 # addresses. # case $want_getifaddrs in glibc) AC_MSG_WARN("--enable-getifaddrs=glibc is no longer required") AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS)) ;; yes) AC_CHECK_FUNC(getifaddrs, AC_DEFINE(HAVE_GETIFADDRS)) ;; no) ;; esac # # Look for a sysctl call to get the list of network interfaces. # case $ac_cv_header_sys_sysctl_h in yes) AC_MSG_CHECKING(for interface list sysctl) AC_EGREP_CPP(found_rt_iflist, [ #include #include #include #ifdef NET_RT_IFLIST found_rt_iflist #endif ], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_IFLIST_SYSCTL)], [AC_MSG_RESULT(no)]) ;; esac # # Check for some other useful functions that are not ever-present. # # We test for strsep() using AC_TRY_LINK instead of AC_CHECK_FUNC # because AIX 4.3.3 with patches for bos.adt.include to version 4.3.3.77 # reportedly defines strsep() without declaring it in when # -D_LINUX_SOURCE_COMPAT is not defined [RT #2190], and # AC_CHECK_FUNC() incorrectly succeeds because it declares # the function itself. AC_MSG_CHECKING(for correctly declared strsep()) AC_TRY_LINK([#include ], [char *sp; char *foo = strsep(&sp, ".");], [AC_MSG_RESULT(yes); ISC_PLATFORM_NEEDSTRSEP="#undef ISC_PLATFORM_NEEDSTRSEP"], [AC_MSG_RESULT(no); ISC_PLATFORM_NEEDSTRSEP="#define ISC_PLATFORM_NEEDSTRSEP 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRSEP) AC_CHECK_FUNC(memmove, [ISC_PLATFORM_NEEDMEMMOVE="#undef ISC_PLATFORM_NEEDMEMMOVE"], [ISC_PLATFORM_NEEDMEMMOVE="#define ISC_PLATFORM_NEEDMEMMOVE 1"]) AC_SUBST(ISC_PLATFORM_NEEDMEMMOVE) AC_CHECK_FUNC(strtoul, [ISC_PLATFORM_NEEDSTRTOUL="#undef ISC_PLATFORM_NEEDSTRTOUL" LWRES_PLATFORM_NEEDSTRTOUL="#undef LWRES_PLATFORM_NEEDSTRTOUL" GENRANDOMLIB=""], [ISC_PLATFORM_NEEDSTRTOUL="#define ISC_PLATFORM_NEEDSTRTOUL 1" LWRES_PLATFORM_NEEDSTRTOUL="#define LWRES_PLATFORM_NEEDSTRTOUL 1" GENRANDOMLIB='${ISCLIBS}']) AC_SUBST(ISC_PLATFORM_NEEDSTRTOUL) AC_SUBST(LWRES_PLATFORM_NEEDSTRTOUL) AC_SUBST(GENRANDOMLIB) AC_CHECK_FUNC(strlcpy, [ISC_PLATFORM_NEEDSTRLCPY="#undef ISC_PLATFORM_NEEDSTRLCPY"], [ISC_PLATFORM_NEEDSTRLCPY="#define ISC_PLATFORM_NEEDSTRLCPY 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRLCPY) AC_CHECK_FUNC(strlcat, [ISC_PLATFORM_NEEDSTRLCAT="#undef ISC_PLATFORM_NEEDSTRLCAT"], [ISC_PLATFORM_NEEDSTRLCAT="#define ISC_PLATFORM_NEEDSTRLCAT 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRLCAT) AC_CHECK_FUNC(strcasestr, [ISC_PLATFORM_NEEDSTRCASESTR="#undef ISC_PLATFORM_NEEDSTRCASESTR"], [ISC_PLATFORM_NEEDSTRCASESTR="#define ISC_PLATFORM_NEEDSTRCASESTR 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRCASESTR) AC_SUBST(READLINE_LIB) AC_ARG_WITH(readline, [ --with-readline[=LIBSPEC] specify readline library [default -lreadline]], readline="$withval", readline="-lreadline") case "$readline" in no) ;; *) if test "x$readline" = "xyes" then readline=-lreadline fi saved_LIBS="$LIBS" LIBS="$readline" AC_CHECK_FUNCS(readline) if test "$ac_cv_func_readline" = "yes" then READLINE_LIB="$readline" fi LIBS="$saved_LIBS" ;; esac ISC_PRINT_OBJS= ISC_PRINT_SRCS= AC_MSG_CHECKING(sprintf) AC_TRY_COMPILE([ #include ], [ char buf[2]; return(*sprintf(buf,"x"));], [ ISC_PRINT_OBJS="print.$O" ISC_PRINT_SRCS="print.c" ISC_PLATFORM_NEEDSPRINTF="#define ISC_PLATFORM_NEEDSPRINTF" LWRES_PLATFORM_NEEDSPRINTF="#define LWRES_PLATFORM_NEEDSPRINTF" ], [ISC_PLATFORM_NEEDSPRINTF="#undef ISC_PLATFORM_NEEDSPRINTF" LWRES_PLATFORM_NEEDSPRINTF="#undef LWRES_PLATFORM_NEEDSPRINTF"] ) AC_SUBST(ISC_PLATFORM_NEEDSPRINTF) AC_SUBST(LWRES_PLATFORM_NEEDSPRINTF) AC_CHECK_FUNC(vsnprintf, [ISC_PLATFORM_NEEDVSNPRINTF="#undef ISC_PLATFORM_NEEDVSNPRINTF" LWRES_PLATFORM_NEEDVSNPRINTF="#undef LWRES_PLATFORM_NEEDVSNPRINTF"], [ISC_PRINT_OBJS="print.$O" ISC_PRINT_SRCS="print.c" ISC_PLATFORM_NEEDVSNPRINTF="#define ISC_PLATFORM_NEEDVSNPRINTF 1" LWRES_PLATFORM_NEEDVSNPRINTF="#define LWRES_PLATFORM_NEEDVSNPRINTF 1"]) AC_SUBST(ISC_PLATFORM_NEEDVSNPRINTF) AC_SUBST(LWRES_PLATFORM_NEEDVSNPRINTF) ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS $ISC_PRINT_OBJS" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS $ISC_PRINT_SRCS" AC_CHECK_FUNC(strerror, AC_DEFINE(HAVE_STRERROR)) AC_SUBST(ISC_EXTRA_OBJS) AC_SUBST(ISC_EXTRA_SRCS) # # Use our own SPNEGO implementation? # AC_ARG_ENABLE(isc-spnego, [ --disable-isc-spnego use SPNEGO from GSSAPI library]) if test -n "$USE_GSSAPI" then case "$enable_isc_spnego" in yes|'') USE_ISC_SPNEGO='-DUSE_ISC_SPNEGO' DST_EXTRA_OBJS="$DST_EXTRA_OBJS spnego.$O" DST_EXTRA_SRCS="$DST_EXTRA_SRCS spnego.c" AC_MSG_RESULT(using SPNEGO from lib/dns) ;; no) AC_MSG_RESULT(using SPNEGO from GSSAPI library) ;; esac fi AC_SUBST(USE_ISC_SPNEGO) AC_SUBST(DST_EXTRA_OBJS) AC_SUBST(DST_EXTRA_SRCS) # Determine the printf format characters to use when printing # values of type isc_int64_t. This will normally be "ll", but where # the compiler treats "long long" as a alias for "long" and printf # doesn't know about "long long" use "l". Hopefully the sprintf # will produce a inconsistent result in the later case. If the compiler # fails due to seeing "%lld" we fall back to "l". # # Digital Unix 4.0 (gcc?) (long long) is 64 bits as is its long. It uses # %ld even for (long long)/ # # Win32 uses "%I64d", but that's defined elsewhere since we don't use # configure on Win32. # AC_MSG_CHECKING(printf format modifier for 64-bit integers) AC_TRY_RUN([ #include main() { long long int j = 0; char buf[100]; buf[0] = 0; sprintf(buf, "%lld", j); exit((sizeof(long long int) != sizeof(long int))? 0 : (strcmp(buf, "0") != 0)); } ], [AC_MSG_RESULT(ll) ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"' LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "ll"'], [AC_MSG_RESULT(l) ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "l"' LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "l"'], [AC_MSG_RESULT(assuming target platform uses ll) ISC_PLATFORM_QUADFORMAT='#define ISC_PLATFORM_QUADFORMAT "ll"' LWRES_PLATFORM_QUADFORMAT='#define LWRES_PLATFORM_QUADFORMAT "ll"']) AC_SUBST(ISC_PLATFORM_QUADFORMAT) AC_SUBST(LWRES_PLATFORM_QUADFORMAT) # # Security Stuff # # Note it is very recommended to *not* disable chroot(), # this is only because chroot() was made obsolete by Posix. AC_ARG_ENABLE(chroot, [ --disable-chroot disable chroot]) case "$enable_chroot" in yes|'') AC_CHECK_FUNCS(chroot) ;; no) ;; esac AC_ARG_ENABLE(linux-caps, [ --disable-linux-caps disable linux capabilities]) case "$enable_linux_caps" in yes|'') AC_CHECK_HEADERS(linux/types.h) AC_CHECK_HEADERS([sys/capability.h]) AC_CHECK_HEADERS([linux/capability.h], [], [], [#ifdef HAVE_LINUX_TYPES_H #include #endif ]) AC_CHECK_LIB(cap, cap_set_proc) ;; no) ;; esac AC_CHECK_HEADERS(sys/prctl.h) AC_CHECK_HEADERS(sys/un.h, ISC_PLATFORM_HAVESYSUNH="#define ISC_PLATFORM_HAVESYSUNH 1" , ISC_PLATFORM_HAVESYSUNH="#undef ISC_PLATFORM_HAVESYSUNH" ) AC_SUBST(ISC_PLATFORM_HAVESYSUNH) case "$host" in *-solaris*) AC_DEFINE(NEED_SECURE_DIRECTORY, 1, [Define if connect does not honour the permission on the UNIX domain socket.]) ;; *-sunos*) AC_DEFINE(NEED_SECURE_DIRECTORY, 1, [Define if connect does not honour the permission on the UNIX domain socket.]) ;; esac # # Time Zone Stuff # AC_CHECK_FUNC(tzset, AC_DEFINE(HAVE_TZSET)) AC_MSG_CHECKING(for optarg declaration) AC_TRY_COMPILE([ #include ], [optarg = 0;], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) GEN_NEED_OPTARG="-DNEED_OPTARG=1" AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])]) # # BSD/OS, and perhaps some others, don't define rlim_t. # AC_MSG_CHECKING(for type rlim_t) AC_TRY_COMPILE([ #include #include #include ], [rlim_t rl = 19671212; return (0);], [AC_MSG_RESULT(yes) ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE rlim_t"], [AC_MSG_RESULT(no) AC_MSG_CHECKING(type of rlim_cur) AC_TRY_RUN([ #include #include #include main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(int)));}], [AC_MSG_RESULT(int) ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE int"], [ AC_TRY_RUN([ #include #include #include main() { struct rlimit r; exit(!(sizeof(r.rlim_cur) == sizeof(long int)));}], [AC_MSG_RESULT(long int) ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long int"], [ AC_TRY_RUN([ #include #include #include main() { struct rlimit r; exit((!sizeof(r.rlim_cur) == sizeof(long long int)));}], [AC_MSG_RESULT(long long int) ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int"], [AC_MSG_ERROR([unable to determine sizeof rlim_cur]) ],[AC_MSG_ERROR(this cannot happen)]) ],[AC_MSG_ERROR(this cannot happen)]) ],[ AC_ARG_WITH(rlimtype, , rlimtype="$withval", rlimtype="long long int") ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE $rlimtype" AC_MSG_RESULT(cannot determine type of rlim_cur when cross compiling - assuming $rlimtype)]) ]) AC_SUBST(ISC_PLATFORM_RLIMITTYPE) # # Older HP-UX doesn't have gettune # case "$host" in *-hp-hpux*) AC_CHECK_HEADERS(sys/dyntune.h) ;; *) ;; esac # # Compaq TruCluster requires more code for handling cluster IP aliases # case "$host" in *-dec-osf*) AC_CHECK_LIB(clua, clua_getaliasaddress, LIBS="-lclua $LIBS") AC_CHECK_FUNC(clua_getaliasaddress, AC_DEFINE(HAVE_TRUCLUSTER, 1, [Define if running under Compaq TruCluster])) ;; *) ;; esac # # Some hosts need msg_namelen to match the size of the socket structure. # Some hosts don't set msg_namelen appropriately on return from recvmsg(). # case $host in *os2*|*hp-mpeix*) AC_DEFINE(BROKEN_RECVMSG, 1, [Define if recvmsg() does not meet all of the BSD socket API specifications.]) ;; esac # # Microsoft has their own way of handling shared libraries that requires # additional qualifiers on extern variables. Unix systems don't need it. # AC_SUBST(ISC_PLATFORM_USEDECLSPEC) ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC" AC_SUBST(LWRES_PLATFORM_USEDECLSPEC) LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC" AC_SUBST(IRS_PLATFORM_USEDECLSPEC) IRS_PLATFORM_USEDECLSPEC="#undef IRS_PLATFORM_USEDECLSPEC" # # Random remaining OS-specific issues involving compiler warnings. # XXXDCL print messages to indicate some compensation is being done? # AC_SUBST(ISC_PLATFORM_BRACEPTHREADONCEINIT) ISC_PLATFORM_BRACEPTHREADONCEINIT="#undef ISC_PLATFORM_BRACEPTHREADONCEINIT" case "$host" in *-aix5.[[123]].*) hack_shutup_pthreadonceinit=yes ;; *-bsdi3.1*) hack_shutup_sputaux=yes ;; *-bsdi4.0*) hack_shutup_sigwait=yes hack_shutup_sputaux=yes ;; [*-bsdi4.[12]*]) hack_shutup_stdargcast=yes ;; [*-solaris2.[89]]) hack_shutup_pthreadonceinit=yes ;; *-solaris2.1[[0-9]]) AC_TRY_COMPILE([ #include ], [ static pthread_once_t once_test = { PTHREAD_ONCE_INIT }; ], [hack_shutup_pthreadonceinit=yes], ) ;; esac case "$hack_shutup_pthreadonceinit" in yes) # # Shut up PTHREAD_ONCE_INIT unbraced initializer warnings. # ISC_PLATFORM_BRACEPTHREADONCEINIT="#define ISC_PLATFORM_BRACEPTHREADONCEINIT 1" ;; esac case "$hack_shutup_sigwait" in yes) # # Shut up a -Wmissing-prototypes warning for sigwait(). # AC_DEFINE(SHUTUP_SIGWAIT) ;; esac case "$hack_shutup_sputaux" in yes) # # Shut up a -Wmissing-prototypes warning from . # AC_DEFINE(SHUTUP_SPUTAUX) ;; esac case "$hack_shutup_stdargcast" in yes) # # Shut up a -Wcast-qual warning from va_start(). # AC_DEFINE(SHUTUP_STDARG_CAST) ;; esac AC_CHECK_HEADERS(strings.h, ISC_PLATFORM_HAVESTRINGSH="#define ISC_PLATFORM_HAVESTRINGSH 1" , ISC_PLATFORM_HAVESTRINGSH="#undef ISC_PLATFORM_HAVESTRINGSH" ) AC_SUBST(ISC_PLATFORM_HAVESTRINGSH) # # Check for if_nametoindex() for IPv6 scoped addresses support # AC_CHECK_FUNC(if_nametoindex, ac_cv_have_if_nametoindex=yes, ac_cv_have_if_nametoindex=no) case $ac_cv_have_if_nametoindex in no) case "$host" in *-hp-hpux*) AC_CHECK_LIB(ipv6, if_nametoindex, ac_cv_have_if_nametoindex=yes LIBS="-lipv6 $LIBS",) ;; esac esac case $ac_cv_have_if_nametoindex in yes) ISC_PLATFORM_HAVEIFNAMETOINDEX="#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1" ;; *) ISC_PLATFORM_HAVEIFNAMETOINDEX="#undef ISC_PLATFORM_HAVEIFNAMETOINDEX" ;; esac AC_SUBST(ISC_PLATFORM_HAVEIFNAMETOINDEX) AC_CHECK_FUNCS(nanosleep usleep) # # Machine architecture dependent features # AC_ARG_ENABLE(atomic, [ --enable-atomic enable machine specific atomic operations [[default=autodetect]]], enable_atomic="$enableval", enable_atomic="autodetect") case "$enable_atomic" in yes|''|autodetect) case "$host" in powerpc-ibm-aix*) if test "X$GCC" = "Xyes"; then AC_MSG_CHECKING([if asm("isc"); works]) AC_TRY_COMPILE(,[ main() { asm("ics"); exit(0); } ], [AC_MSG_RESULT(yes) use_atomic=yes], [ saved_cflags="$CFLAGS" CFLAGS="$CFLAGS -Wa,-many" AC_TRY_RUN([ main() { asm("ics"); exit(0); } ], [AC_MSG_RESULT([yes, required -Wa,-many]) use_atomic=yes], [AC_MSG_RESULT([no, use_atomic disabled]) CFLAGS="$saved_cflags" use_atomic=no], [AC_MSG_RESULT([cross compile, assume yes]) CFLAGS="$saved_cflags" use_atomic=yes]) ] ) else use_atomic=yes fi ;; *) use_atomic=yes ;; esac ;; no) use_atomic=no arch=noatomic ;; esac ISC_PLATFORM_USEOSFASM="#undef ISC_PLATFORM_USEOSFASM" if test "$use_atomic" = "yes"; then AC_MSG_CHECKING([architecture type for atomic operations]) have_atomic=yes # set default case "$host" in [i[3456]86-*]) # XXX: some old x86 architectures actually do not support # (some of) these operations. Do we need stricter checks? AC_CHECK_SIZEOF([void *]) if test $ac_cv_sizeof_void_p = 8; then arch=x86_64 have_xaddq=yes else arch=x86_32 fi ;; x86_64-*|amd64-*) AC_CHECK_SIZEOF([void *]) if test $ac_cv_sizeof_void_p = 8; then arch=x86_64 have_xaddq=yes else arch=x86_32 fi ;; alpha*-*) arch=alpha ;; powerpc-*|powerpc64-*) arch=powerpc ;; mips-*|mipsel-*|mips64-*|mips64el-*) arch=mips ;; ia64-*) arch=ia64 ;; *) have_atomic=no arch=noatomic ;; esac AC_MSG_RESULT($arch) fi if test "$have_atomic" = "yes"; then AC_MSG_CHECKING([compiler support for inline assembly code]) compiler=generic # Check whether the compiler supports the assembly syntax we provide. if test "X$GCC" = "Xyes"; then # GCC's ASM extension always works compiler=gcc if test $arch = "x86_64"; then # We can share the same code for gcc with x86_32 arch=x86_32 fi if test $arch = "powerpc"; then # # The MacOS (and maybe others) uses "r0" for register # zero. Under linux/ibm it is "0" for register 0. # Probe to see if we have a MacOS style assembler. # AC_MSG_CHECKING([Checking for MacOS style assembler syntax]) AC_TRY_COMPILE(, [ __asm__ volatile ("li r0, 0x0\n"::); ], [ AC_MSG_RESULT(yes) compiler="mac" ISC_PLATFORM_USEMACASM="#define ISC_PLATFORM_USEMACASM 1" ], [AC_MSG_RESULT(no)]) fi else case "$host" in alpha*-dec-osf*) # Tru64 compiler has its own syntax for inline # assembly. AC_TRY_COMPILE(, [ #ifndef __DECC #error "unexpected compiler" #endif return (0);], [compiler=osf],) ;; powerpc-ibm-aix*) compiler=aix ;; esac fi case "$compiler" in gcc) ISC_PLATFORM_USEGCCASM="#define ISC_PLATFORM_USEGCCASM 1" ;; osf) ISC_PLATFORM_USEOSFASM="#define ISC_PLATFORM_USEOSFASM 1" ;; aix) ;; mac) ;; *) # See if the generic __asm function works. If not, # we need to disable the atomic operations. AC_TRY_LINK(, [ __asm("nop") ], [compiler="standard" ISC_PLATFORM_USESTDASM="#define ISC_PLATFORM_USESTDASM 1"], [compiler="not supported (atomic operations disabled)" have_atomic=no arch=noatomic ]); ;; esac AC_MSG_RESULT($compiler) fi if test "$have_atomic" = "yes"; then ISC_PLATFORM_HAVEXADD="#define ISC_PLATFORM_HAVEXADD 1" ISC_PLATFORM_HAVECMPXCHG="#define ISC_PLATFORM_HAVECMPXCHG 1" ISC_PLATFORM_HAVEATOMICSTORE="#define ISC_PLATFORM_HAVEATOMICSTORE 1" else ISC_PLATFORM_HAVEXADD="#undef ISC_PLATFORM_HAVEXADD" ISC_PLATFORM_HAVECMPXCHG="#undef ISC_PLATFORM_HAVECMPXCHG" ISC_PLATFORM_HAVEATOMICSTORE="#undef ISC_PLATFORM_HAVEATOMICSTORE" fi if test "$have_xaddq" = "yes"; then ISC_PLATFORM_HAVEXADDQ="#define ISC_PLATFORM_HAVEXADDQ 1" else ISC_PLATFORM_HAVEXADDQ="#undef ISC_PLATFORM_HAVEXADDQ" fi AC_SUBST(ISC_PLATFORM_HAVEXADD) AC_SUBST(ISC_PLATFORM_HAVEXADDQ) AC_SUBST(ISC_PLATFORM_HAVECMPXCHG) AC_SUBST(ISC_PLATFORM_HAVEATOMICSTORE) AC_SUBST(ISC_PLATFORM_USEGCCASM) AC_SUBST(ISC_PLATFORM_USEOSFASM) AC_SUBST(ISC_PLATFORM_USESTDASM) AC_SUBST(ISC_PLATFORM_USEMACASM) ISC_ARCH_DIR=$arch AC_SUBST(ISC_ARCH_DIR) # # Activate "rrset-order fixed" or not? # AC_ARG_ENABLE(fixed-rrset, [ --enable-fixed-rrset enable fixed rrset ordering [[default=no]]], enable_fixed="$enableval", enable_fixed="no") case "$enable_fixed" in yes) AC_DEFINE(DNS_RDATASET_FIXED, 1, [Define to enable "rrset-order fixed" syntax.]) ;; no) ;; *) ;; esac # # Enable response policy rewriting using NS IP addresses # AC_ARG_ENABLE(rpz-nsip, [ --disable-rpz-nsip disable rpz-nsip rules [[default=enabled]]], enable_nsip="$enableval", enable_nsip="yes") case "$enable_nsip" in yes) AC_DEFINE(ENABLE_RPZ_NSIP, 1, [Define to enable rpz-nsip rules.]) ;; no) ;; *) ;; esac # # Enable response policy rewriting using NS name # AC_ARG_ENABLE(rpz-nsdname, [ --disable-rpz-nsdname disable rpz-nsdname rules [[default=enabled]]], enable_nsdname="$enableval", enable_nsdname="yes") case "$enable_nsdname" in yes) AC_DEFINE(ENABLE_RPZ_NSDNAME, 1, [Define to enable rpz-nsdname rules.]) ;; no) ;; *) ;; esac # # Activate "filter-aaaa-on-v4" or not? # AC_ARG_ENABLE(filter-aaaa, [ --enable-filter-aaaa enable filtering of AAAA records over IPv4 [[default=no]]], enable_filter="$enableval", enable_filter="no") case "$enable_filter" in yes) AC_DEFINE(ALLOW_FILTER_AAAA_ON_V4, 1, [Define to enable the "filter-aaaa-on-v4" option.]) ;; no) ;; *) ;; esac # # The following sets up how non-blocking i/o is established. # Sunos, cygwin and solaris 2.x (x<5) require special handling. # case "$host" in *-sunos*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);; *-cygwin*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);; *-solaris2.[[01234]]) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK) AC_DEFINE(USE_FIONBIO_IOCTL, 1, [Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking.]) ;; *) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK, [Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK).]) ;; esac # # Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket. # This prevents the source address being set. # case "$host" in *-solaris2.[[012345]]|*-solaris2.5.1) AC_DEFINE(BROKEN_TCP_BIND_BEFORE_CONNECT, 1, [Define if you cannot bind() before connect() for TCP sockets.]) ;; esac # # The following sections deal with tools used for formatting # the documentation. They are all optional, unless you are # a developer editing the documentation source. # # # Look for TeX. # AC_PATH_PROGS(LATEX, latex, latex) AC_SUBST(LATEX) AC_PATH_PROGS(PDFLATEX, pdflatex, pdflatex) AC_SUBST(PDFLATEX) # # Look for w3m # AC_PATH_PROGS(W3M, w3m, w3m) AC_SUBST(W3M) # # Look for xsltproc (libxslt) # AC_PATH_PROG(XSLTPROC, xsltproc, xsltproc) AC_SUBST(XSLTPROC) # # Look for xmllint (libxml2) # AC_PATH_PROG(XMLLINT, xmllint, xmllint) AC_SUBST(XMLLINT) # # Look for Doxygen # AC_PATH_PROG(DOXYGEN, doxygen, doxygen) AC_SUBST(DOXYGEN) # # Subroutine for searching for an ordinary file (e.g., a stylesheet) # in a number of directories: # # NOM_PATH_FILE(VARIABLE, FILENAME, DIRECTORIES) # # If the file FILENAME is found in one of the DIRECTORIES, the shell # variable VARIABLE is defined to its absolute pathname. Otherwise, # it is set to FILENAME, with no directory prefix (that's not terribly # useful, but looks less confusing in substitutions than leaving it # empty). The variable VARIABLE will be substituted into output files. # AC_DEFUN(NOM_PATH_FILE, [ $1="" AC_MSG_CHECKING(for $2) for d in $3 do f=$d/$2 if test -f $f then $1=$f AC_MSG_RESULT($f) break fi done if test "X[$]$1" = "X" then AC_MSG_RESULT("not found"); $1=$2 fi AC_SUBST($1) ]) # # Look for Docbook-XSL stylesheets. Location probably varies by system. # If it's not explicitly specified, guess where it might be found, based on # where SGML stuff lives on some systems (FreeBSD is the only one we're sure # of at the moment). # AC_MSG_CHECKING(for Docbook-XSL path) AC_ARG_WITH(docbook-xsl, [ --with-docbook-xsl=PATH Specify path for Docbook-XSL stylesheets], docbook_path="$withval", docbook_path="auto") case "$docbook_path" in auto) AC_MSG_RESULT(auto) docbook_xsl_trees="/usr/pkg/share/xsl/docbook /usr/local/share/xsl/docbook /usr/share/xsl/docbook /opt/local/share/xsl/docbook-xsl" ;; *) docbook_xsl_trees="$withval" AC_MSG_RESULT($docbook_xsl_trees) ;; esac # # Look for stylesheets we need. # NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_HTML, html/docbook.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_XHTML, xhtml/docbook.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_MAN, manpages/docbook.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_HTML, html/chunk.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_XHTML, xhtml/chunk.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_HTML, html/chunktoc.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_XHTML, xhtml/chunktoc.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_HTML, html/maketoc.xsl, $docbook_xsl_trees) NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_XHTML, xhtml/maketoc.xsl, $docbook_xsl_trees) # # Same dance for db2latex # # No idea where this lives except on FreeBSD. # db2latex_xsl_trees="/usr/local/share" # # Look for stylesheets we need. # NOM_PATH_FILE(XSLT_DB2LATEX_STYLE, db2latex/xsl/docbook.xsl, $db2latex_xsl_trees) # # Look for "admonition" image directory. Can't use NOM_PATH_FILE() # because it's a directory, so just do the same things, inline. # AC_MSG_CHECKING(for db2latex/xsl/figures) for d in $db2latex_xsl_trees do dd=$d/db2latex/xsl/figures if test -d $dd then XSLT_DB2LATEX_ADMONITIONS=$dd AC_MSG_RESULT($dd) break fi done if test "X$XSLT_DB2LATEX_ADMONITIONS" = "X" then AC_MSG_RESULT(not found) XSLT_DB2LATEX_ADMONITIONS=db2latex/xsl/figures fi AC_SUBST(XSLT_DB2LATEX_ADMONITIONS) # # IDN support # AC_ARG_WITH(idn, [ --with-idn[=MPREFIX] enable IDN support using idnkit [default PREFIX]], use_idn="$withval", use_idn="no") case "$use_idn" in yes) if test X$prefix = XNONE ; then idn_path=/usr/local else idn_path=$prefix fi ;; no) ;; *) idn_path="$use_idn" ;; esac iconvinc= iconvlib= AC_ARG_WITH(libiconv, [ --with-libiconv[=IPREFIX] GNU libiconv are in IPREFIX [default PREFIX]], use_libiconv="$withval", use_libiconv="no") case "$use_libiconv" in yes) if test X$prefix = XNONE ; then iconvlib="-L/usr/local/lib -R/usr/local/lib -liconv" else iconvlib="-L$prefix/lib -R$prefix/lib -liconv" fi ;; no) iconvlib= ;; *) iconvlib="-L$use_libiconv/lib -R$use_libiconv/lib -liconv" ;; esac AC_ARG_WITH(iconv, [ --with-iconv[=LIBSPEC] specify iconv library [default -liconv]], iconvlib="$withval") case "$iconvlib" in no) iconvlib= ;; yes) iconvlib=-liconv ;; esac AC_ARG_WITH(idnlib, [ --with-idnlib=ARG specify libidnkit], idnlib="$withval", idnlib="no") if test "$idnlib" = yes; then AC_MSG_ERROR([You must specify ARG for --with-idnlib.]) fi IDNLIBS= if test "$use_idn" != no; then AC_DEFINE(WITH_IDN, 1, [define if idnkit support is to be included.]) STD_CINCLUDES="$STD_CINCLUDES -I$idn_path/include" if test "$idnlib" != no; then IDNLIBS="$idnlib $iconvlib" else IDNLIBS="-L$idn_path/lib -lidnkit $iconvlib" fi fi AC_SUBST(IDNLIBS) # # Check whether to build Automated Test Framework unit tests # AC_ARG_WITH(atf, [ --with-atf=ARG Automated Test Framework support], atf="$withval", atf="no") if test "$atf" = yes; then atf=`pwd`/unit/atf ATFBUILD=atf-src AC_SUBST(ATFBUILD) AC_CONFIG_COMMANDS([atf-config], [( mkdir -p unit/atf-src; cd unit/atf-src; case "$srcdir" in /*) ;; *) srcdir="../../$srcdir";; esac ${SHELL} "${srcdir}${srcdir:+/unit/atf-src/}./configure" --enable-tools --disable-shared MISSING=: --prefix $atfdir; ) ], [atfdir=`pwd`/unit/atf]) AC_MSG_RESULT(building ATF from bind9/unit/atf-src) fi ATFLIBS= if test "$atf" != no; then AC_DEFINE(ATF_TEST, 1, [define if ATF unit tests are to be built.]) STD_CINCLUDES="$STD_CINCLUDES -I$atf/include" ATFBIN="$atf/bin" ATFLIBS="-L$atf/lib -latf-c" if test "$want_openssl_hash" = yes; then ATFLIBS="-L$atf/lib -latf-c $DNS_CRYPTO_LIBS" fi UNITTESTS=tests fi AC_SUBST(ATFBIN) AC_SUBST(ATFLIBS) AC_SUBST(UNITTESTS) AC_CHECK_HEADERS(locale.h) AC_CHECK_FUNCS(setlocale) # # Substitutions # AC_SUBST(BIND9_TOP_BUILDDIR) BIND9_TOP_BUILDDIR=`pwd` AC_SUBST(BIND9_ISC_BUILDINCLUDE) AC_SUBST(BIND9_ISCCC_BUILDINCLUDE) AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE) AC_SUBST(BIND9_DNS_BUILDINCLUDE) AC_SUBST(BIND9_LWRES_BUILDINCLUDE) AC_SUBST(BIND9_BIND9_BUILDINCLUDE) if test "X$srcdir" != "X"; then BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include" BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include" BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include" BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include" BIND9_LWRES_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/lwres/include" BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include" else BIND9_ISC_BUILDINCLUDE="" BIND9_ISCCC_BUILDINCLUDE="" BIND9_ISCCFG_BUILDINCLUDE="" BIND9_DNS_BUILDINCLUDE="" BIND9_LWRES_BUILDINCLUDE="" BIND9_BIND9_BUILDINCLUDE="" fi AC_SUBST_FILE(BIND9_MAKE_INCLUDES) BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes AC_SUBST_FILE(BIND9_MAKE_RULES) BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules . "$srcdir/version" BIND9_PRODUCT="PRODUCT=\"${PRODUCT}\"" AC_SUBST(BIND9_PRODUCT) BIND9_DESCRIPTION="DESCRIPTION=\"${DESCRIPTION}\"" AC_SUBST(BIND9_DESCRIPTION) BIND9_VERSION="VERSION=${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}" AC_SUBST(BIND9_VERSION) BIND9_SRCID="SRCID=unset" if test -f "${srcdir}/srcid"; then . "${srcdir}/srcid" BIND9_SRCID="SRCID=$SRCID" elif test -d "${srcdir}/.git"; then BIND9_SRCID="SRCID="`(cd "${srcdir}";git log -n 1 --format=%h)` fi AC_SUBST(BIND9_SRCID) if test -z "$ac_configure_args"; then BIND9_CONFIGARGS="defaults" else for a in $ac_configure_args do BIND9_CONFIGARGS="$BIND9_CONFIGARGS $a" done fi BIND9_CONFIGARGS="`echo $BIND9_CONFIGARGS | sed 's/^ //'`" BIND9_CONFIGARGS="CONFIGARGS=${BIND9_CONFIGARGS}" AC_SUBST(BIND9_CONFIGARGS) AC_SUBST_FILE(LIBISC_API) LIBISC_API="$srcdir/lib/isc/api" AC_SUBST_FILE(LIBISCCC_API) LIBISCCC_API="$srcdir/lib/isccc/api" AC_SUBST_FILE(LIBISCCFG_API) LIBISCCFG_API="$srcdir/lib/isccfg/api" AC_SUBST_FILE(LIBDNS_API) LIBDNS_API="$srcdir/lib/dns/api" AC_SUBST_FILE(LIBBIND9_API) LIBBIND9_API="$srcdir/lib/bind9/api" AC_SUBST_FILE(LIBLWRES_API) LIBLWRES_API="$srcdir/lib/lwres/api" AC_SUBST_FILE(LIBIRS_API) LIBIRS_API="$srcdir/lib/irs/api" # # Configure any DLZ drivers. # # If config.dlz.in selects one or more DLZ drivers, it will set # CONTRIB_DLZ to a non-empty value, which will be our clue to # build DLZ drivers in contrib. # # This section has to come after the libtool stuff because it needs to # know how to name the driver object files. # CONTRIB_DLZ="" DLZ_DRIVER_INCLUDES="" DLZ_DRIVER_LIBS="" DLZ_DRIVER_SRCS="" DLZ_DRIVER_OBJS="" DLZ_SYSTEM_TEST="" # # Configure support for building a shared library object # # Even when libtool is available it can't always be relied upon # to build an object that can be dlopen()'ed, but this is necessary # for building the dlzexternal system test, so we'll try it the # old-fashioned way. # SO="so" SO_CFLAGS="" SO_LD="" SO_TARGETS="" AC_ARG_WITH(dlopen, [ --with-dlopen=ARG Support dynamically loadable DLZ drivers], dlopen="$withval", dlopen="yes") case $host in *-sunos*) dlopen="no" ;; esac if test "$dlopen" = "yes"; then AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) if test "$have_dl" = "yes"; then LIBS="-ldl $LIBS" fi AC_CHECK_FUNCS(dlopen dlclose dlsym,,dlopen=no) fi if test "$dlopen" = "yes"; then case $host in *-linux*) SO_CFLAGS="-fPIC" if test "$have_dl" = "yes" then if test "$use_libtool" = "yes"; then SO_LD="${CC} -Xcompiler -shared" else SO_LD="${CC} -shared" fi else SO_LD="ld -shared" fi ;; *-freebsd*|*-openbsd*|*-netbsd*) SO_CFLAGS="-fpic" SO_LD="ld -Bshareable -x" ;; *-solaris*) SO_CFLAGS="-KPIC" SO_LD="ld -G -z text" ;; *-hp-hpux*) SO=sl SO_CFLAGS="+z" SO_LD="ld -b" ;; *) SO_CFLAGS="-fPIC" ;; esac if test "X$GCC" = "Xyes"; then SO_CFLAGS="-fPIC" test -n "$SO_LD" || SO_LD="${CC} -shared" fi # If we still don't know how to make shared objects, don't make any. if test -n "$SO_LD"; then SO_TARGETS="\${SO_TARGETS}" AC_DEFINE(ISC_DLZ_DLOPEN, 1, [Define to allow building of objects for dlopen().]) fi fi AC_SUBST(SO) AC_SUBST(SO_CFLAGS) AC_SUBST(SO_LD) AC_SUBST(SO_TARGETS) sinclude(contrib/dlz/config.dlz.in) AC_MSG_CHECKING(contributed DLZ drivers) if test -n "$CONTRIB_DLZ" then AC_MSG_RESULT(yes) DLZ_DRIVER_RULES=contrib/dlz/drivers/rules AC_CONFIG_FILES([$DLZ_DRIVER_RULES]) else AC_MSG_RESULT(no) DLZ_DRIVER_RULES=/dev/null fi AC_SUBST(CONTRIB_DLZ) AC_SUBST(DLZ_DRIVER_INCLUDES) AC_SUBST(DLZ_DRIVER_LIBS) AC_SUBST(DLZ_DRIVER_SRCS) AC_SUBST(DLZ_DRIVER_OBJS) AC_SUBST(DLZ_SYSTEM_TEST) AC_SUBST_FILE(DLZ_DRIVER_RULES) if test "$cross_compiling" = "yes"; then if test -z "$BUILD_CC"; then AC_ERROR([BUILD_CC not set]) fi BUILD_CFLAGS="$BUILD_CFLAGS" BUILD_CPPFLAGS="$BUILD_CPPFLAGS" BUILD_LDFLAGS="$BUILD_LDFLAGS" BUILD_LIBS="$BUILD_LIBS" else BUILD_CC="$CC" BUILD_CFLAGS="$CFLAGS" BUILD_CPPFLAGS="$CPPFLAGS $GEN_NEED_OPTARG" BUILD_LDFLAGS="$LDFLAGS" BUILD_LIBS="$LIBS" fi NEWFLAGS="" for e in $BUILD_LDFLAGS ; do case $e in -L*) case $host_os in netbsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; freebsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; solaris*) ee=`echo $e | sed -e 's%^-L%-R%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac done BUILD_LDFLAGS="$NEWFLAGS" NEWFLAGS="" for e in $DNS_GSSAPI_LIBS ; do case $e in -L*) case $host_os in netbsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; freebsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; solaris*) ee=`echo $e | sed -e 's%^-L%-R%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac done DNS_GSSAPI_LIBS="$NEWFLAGS" NEWFLAGS="" for e in $DNS_CRYPTO_LIBS ; do case $e in -L*) case $host_os in netbsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; freebsd*) ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; solaris*) ee=`echo $e | sed -e 's%^-L%-R%'` NEWFLAGS="$NEWFLAGS $e $ee" ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac ;; *) NEWFLAGS="$NEWFLAGS $e" ;; esac done DNS_CRYPTO_LIBS="$NEWFLAGS" AC_SUBST(BUILD_CC) AC_SUBST(BUILD_CFLAGS) AC_SUBST(BUILD_CPPFLAGS) AC_SUBST(BUILD_LDFLAGS) AC_SUBST(BUILD_LIBS) # # Commands to run at the end of config.status. # Don't just put these into configure, it won't work right if somebody # runs config.status directly (which autoconf allows). # AC_CONFIG_COMMANDS( [chmod], [chmod a+x isc-config.sh doc/doxygen/doxygen-input-filter]) # # Files to configure. These are listed here because we used to # specify them as arguments to AC_OUTPUT. It's (now) ok to move these # elsewhere if there's a good reason for doing so. # AC_CONFIG_FILES([ make/Makefile make/mkdep Makefile bin/Makefile bin/check/Makefile bin/confgen/Makefile bin/confgen/unix/Makefile bin/dig/Makefile bin/dnssec/Makefile bin/named/Makefile bin/named/unix/Makefile bin/nsupdate/Makefile bin/pkcs11/Makefile bin/python/Makefile bin/python/dnssec-checkds.py bin/python/dnssec-coverage.py bin/rndc/Makefile bin/tests/Makefile bin/tests/atomic/Makefile bin/tests/db/Makefile bin/tests/dst/Makefile bin/tests/dst/Kdh.+002+18602.key bin/tests/dst/Kdh.+002+18602.private bin/tests/dst/Kdh.+002+48957.key bin/tests/dst/Kdh.+002+48957.private bin/tests/dst/Ktest.+001+00002.key bin/tests/dst/Ktest.+001+54622.key bin/tests/dst/Ktest.+001+54622.private bin/tests/dst/Ktest.+003+23616.key bin/tests/dst/Ktest.+003+23616.private bin/tests/dst/Ktest.+003+49667.key bin/tests/dst/dst_2_data bin/tests/dst/t2_data_1 bin/tests/dst/t2_data_2 bin/tests/dst/t2_dsasig bin/tests/dst/t2_rsasig bin/tests/hashes/Makefile bin/tests/headerdep_test.sh bin/tests/master/Makefile bin/tests/mem/Makefile bin/tests/names/Makefile bin/tests/net/Makefile bin/tests/rbt/Makefile bin/tests/resolver/Makefile bin/tests/sockaddr/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh bin/tests/system/dlz/prereq.sh bin/tests/system/dlzexternal/Makefile bin/tests/system/dlzexternal/ns1/named.conf bin/tests/system/ecdsa/prereq.sh bin/tests/system/filter-aaaa/Makefile bin/tests/system/gost/prereq.sh bin/tests/system/inline/checkdsa.sh bin/tests/system/lwresd/Makefile bin/tests/system/rpz/Makefile bin/tests/system/rrl/Makefile bin/tests/system/rsabigexponent/Makefile bin/tests/system/tkey/Makefile bin/tests/system/tsiggss/Makefile bin/tests/tasks/Makefile bin/tests/timers/Makefile bin/tests/virtual-time/Makefile bin/tests/virtual-time/conf.sh bin/tools/Makefile contrib/check-secure-delegation.pl contrib/zone-edit.sh doc/Makefile doc/arm/Makefile doc/doxygen/Doxyfile doc/doxygen/Makefile doc/doxygen/doxygen-input-filter doc/misc/Makefile doc/xsl/Makefile doc/xsl/isc-docbook-chunk.xsl doc/xsl/isc-docbook-html.xsl doc/xsl/isc-docbook-latex.xsl doc/xsl/isc-manpage.xsl isc-config.sh lib/Makefile lib/bind9/Makefile lib/bind9/include/Makefile lib/bind9/include/bind9/Makefile lib/dns/Makefile lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile lib/dns/tests/Makefile lib/export/Makefile lib/export/dns/Makefile lib/export/dns/include/Makefile lib/export/dns/include/dns/Makefile lib/export/dns/include/dst/Makefile lib/export/irs/Makefile lib/export/irs/include/Makefile lib/export/irs/include/irs/Makefile lib/export/isc/$thread_dir/Makefile lib/export/isc/$thread_dir/include/Makefile lib/export/isc/$thread_dir/include/isc/Makefile lib/export/isc/Makefile lib/export/isc/include/Makefile lib/export/isc/include/isc/Makefile lib/export/isc/nls/Makefile lib/export/isc/unix/Makefile lib/export/isc/unix/include/Makefile lib/export/isc/unix/include/isc/Makefile lib/export/isccfg/Makefile lib/export/isccfg/include/Makefile lib/export/isccfg/include/isccfg/Makefile lib/export/samples/Makefile lib/export/samples/Makefile-postinstall lib/irs/Makefile lib/irs/include/Makefile lib/irs/include/irs/Makefile lib/irs/include/irs/netdb.h lib/irs/include/irs/platform.h lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile lib/isc/$thread_dir/Makefile lib/isc/$thread_dir/include/Makefile lib/isc/$thread_dir/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile lib/isc/unix/include/isc/Makefile lib/isccc/Makefile lib/isccc/include/Makefile lib/isccc/include/isccc/Makefile lib/isccfg/Makefile lib/isccfg/include/Makefile lib/isccfg/include/isccfg/Makefile lib/lwres/Makefile lib/lwres/include/Makefile lib/lwres/include/lwres/Makefile lib/lwres/include/lwres/netdb.h lib/lwres/include/lwres/platform.h lib/lwres/man/Makefile lib/lwres/unix/Makefile lib/lwres/unix/include/Makefile lib/lwres/unix/include/lwres/Makefile lib/tests/Makefile lib/tests/include/Makefile lib/tests/include/tests/Makefile unit/Makefile unit/unittest.sh ]) # # Do it # AC_OUTPUT # # Now that the Makefiles exist we can ensure that everything is rebuilt. # AC_ARG_WITH(make-clean, [ --with-make-clean Run "make clean" at end of configure [[yes|no]].], make_clean="$withval", make_clean="yes") case "$make_clean" in yes) make clean ;; esac AC_ARG_ENABLE(full-report, [ --enable-full-report report values of all configure options]) echo "========================================================================" echo "Configuration summary:" echo "------------------------------------------------------------------------" echo "Optional features enabled:" $use_threads && echo " Multiprocessing support (--enable-threads)" test "$enable_rrl" = "yes" && \ echo " Response Rate Limiting (--enable-rrl)" test "$use_gssapi" = "no" || echo " GSS-API (--with-gssapi)" test "$use_pkcs11" = "no" || echo " PKCS#11/Cryptoki support (--with-pkcs11)" test "$enable_newstats" = "yes" && \ echo " New statistics (--enable-newstats)" test "$enable_fixed" = "yes" && \ echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" test "$enable_filter" = "yes" && \ echo " AAAA filtering (--enable-filter-aaaa)" test "$want_backtrace" = "yes" && \ echo " Print backtrace on crash (--enable-backtrace)" test "$want_symtable" = "minimal" && \ echo " Use symbol table for backtrace, named only (--enable-symtable)" test "$want_symtable" = "yes" -o "$want_symtable" = "all" && \ echo " Use symbol table for backtrace, all binaries (--enable-symtable=all)" test "$atf" = "no" || echo " Automated Testing Framework (--with-atf)" # these lines are only printed if run with --enable-full-report if test "$enable_full_report" = "yes"; then test "$enable_ipv6" = "no" -o "$found_ipv6" = "no" || \ echo " IPv6 support (--enable-ipv6)" test "X$USE_OPENSSL" = "X" || \ echo " OpenSSL cryptography/DNSSEC (--with-openssl)" test "$OPENSSL_GOST" != "yes" || \ echo " GOST algorithm support (--with-gost)" test "$OPENSSL_ECDSA" != "yes" || \ echo " ECDSA algorithm support (--with-ecdsa)" test "X$PYTHON" = "X" || echo " Python tools (--with-python)" test "X$libxml2_libs" = "X" || echo " XML statistics (--with-libxml2)" fi echo " Dynamically loadable zone (DLZ) drivers:" test "$use_dlz_bdb" = "no" || \ echo " Berkeley DB (--with-dlz-bdb)" test "$use_dlz_ldap" = "no" || \ echo " LDAP (--with-dlz-ldap)" test "$use_dlz_mysql" = "no" || \ echo " MySQL (--with-dlz-mysql)" test "$use_dlz_odbc" = "no" || \ echo " ODBC (--with-dlz-bdb)" test "$use_dlz_postgres" = "no" || \ echo " Postgres (--with-dlz-postgres)" test "$use_dlz_filesystem" = "no" || \ echo " Filesystem (--with-dlz-filesystem)" test "$use_dlz_stub" = "no" || \ echo " Stub (--with-dlz-stub)" test "$use_dlz_bdb $use_dlz_ldap $use_dlz_mysql $use_dlz_odbc $use_dlz_postgres $use_dlz_filesystem $use_dlz_stub" = "no no no no no no no" && echo " None" echo echo "Features disabled or unavailable on this platform:" $use_threads || echo " Multiprocessing support (--enable-threads)" test "$enable_ipv6" = "no" -o "$found_ipv6" = "no" && \ echo " IPv6 support (--enable-ipv6)" test "$enable_rrl" = "yes" || \ echo " Response Rate Limiting (--enable-rrl)" test "$use_gssapi" = "no" && echo " GSS-API (--with-gssapi)" test "$use_pkcs11" = "no" && echo " PKCS#11/Cryptoki support (--with-pkcs11)" test "X$enable_newstats" = "X" && echo " New statistics (--enable-newstats)" test "$enable_fixed" = "yes" || \ echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" test "$want_backtrace" = "yes" || \ echo " Print backtrace on crash (--enable-backtrace)" test "$atf" = "no" && echo " Automated Testing Framework (--with-atf)" test "X$USE_OPENSSL" = "X" && \ echo " OpenSSL cryptography/DNSSEC (--with-openssl)" test "X$USE_OPENSSL" != "X" -a "$OPENSSL_GOST" != "yes" && \ echo " GOST algorithm support (--with-gost)" test "X$USE_OPENSSL" != "X" -a "$OPENSSL_ECDSA" != "yes" && \ echo " ECDSA algorithm support (--with-ecdsa)" test "X$PYTHON" = "X" && echo " Python tools (--with-python)" test "X$libxml2_libs" = "X" && echo " XML statistics (--with-libxml2)" echo "========================================================================" if test "X$USE_OPENSSL" = "X"; then cat << \EOF BIND is being built without OpenSSL. This means it will not have DNSSEC support. EOF fi if test "X$OPENSSL_WARNING" != "X"; then cat << \EOF WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING Your OpenSSL crypto library may be vulnerable to WARNING WARNING one or more of the the following known security WARNING WARNING flaws: WARNING WARNING WARNING WARNING CAN-2002-0659, CAN-2006-4339, CVE-2006-2937 and WARNING WARNING CVE-2006-2940. WARNING WARNING WARNING WARNING It is recommended that you upgrade to OpenSSL WARNING WARNING version 0.9.8d/0.9.7l (or greater). WARNING WARNING WARNING WARNING You can disable this warning by specifying: WARNING WARNING WARNING WARNING --disable-openssl-version-check WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING EOF fi # Tell Emacs to edit this file in shell mode. # Local Variables: # mode: sh # End: bind9-9.9.5.dfsg/acconfig.h0000644000470500017500000001025712271526120014763 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2008, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: acconfig.h,v 1.53 2008/12/01 23:47:44 tbox Exp $ */ /*! \file */ /*** *** This file is not to be included by any public header files, because *** it does not get installed. ***/ @TOP@ /** define on DEC OSF to enable 4.4BSD style sa_len support */ #undef _SOCKADDR_LEN /** define if your system needs pthread_init() before using pthreads */ #undef NEED_PTHREAD_INIT /** define if your system has sigwait() */ #undef HAVE_SIGWAIT /** define if sigwait() is the UnixWare flavor */ #undef HAVE_UNIXWARE_SIGWAIT /** define on Solaris to get sigwait() to work using pthreads semantics */ #undef _POSIX_PTHREAD_SEMANTICS /** define if LinuxThreads is in use */ #undef HAVE_LINUXTHREADS /** define if sysconf() is available */ #undef HAVE_SYSCONF /** define if sysctlbyname() is available */ #undef HAVE_SYSCTLBYNAME /** define if catgets() is available */ #undef HAVE_CATGETS /** define if getifaddrs() exists */ #undef HAVE_GETIFADDRS /** define if you have the NET_RT_IFLIST sysctl variable and sys/sysctl.h */ #undef HAVE_IFLIST_SYSCTL /** define if tzset() is available */ #undef HAVE_TZSET /** define if struct addrinfo exists */ #undef HAVE_ADDRINFO /** define if getaddrinfo() exists */ #undef HAVE_GETADDRINFO /** define if gai_strerror() exists */ #undef HAVE_GAISTRERROR /** define if arc4random() exists */ #undef HAVE_ARC4RANDOM /** * define if pthread_setconcurrency() should be called to tell the * OS how many threads we might want to run. */ #undef CALL_PTHREAD_SETCONCURRENCY /** define if IPv6 is not disabled */ #undef WANT_IPV6 /** define if flockfile() is available */ #undef HAVE_FLOCKFILE /** define if getc_unlocked() is available */ #undef HAVE_GETCUNLOCKED /** Shut up warnings about sputaux in stdio.h on BSD/OS pre-4.1 */ #undef SHUTUP_SPUTAUX #ifdef SHUTUP_SPUTAUX struct __sFILE; extern __inline int __sputaux(int _c, struct __sFILE *_p); #endif /** Shut up warnings about missing sigwait prototype on BSD/OS 4.0* */ #undef SHUTUP_SIGWAIT #ifdef SHUTUP_SIGWAIT int sigwait(const unsigned int *set, int *sig); #endif /** Shut up warnings from gcc -Wcast-qual on BSD/OS 4.1. */ #undef SHUTUP_STDARG_CAST #if defined(SHUTUP_STDARG_CAST) && defined(__GNUC__) #include /** Grr. Must be included *every time*. */ /** * The silly continuation line is to keep configure from * commenting out the #undef. */ #undef \ va_start #define va_start(ap, last) \ do { \ union { const void *konst; long *var; } _u; \ _u.konst = &(last); \ ap = (va_list)(_u.var + __va_words(__typeof(last))); \ } while (0) #endif /** SHUTUP_STDARG_CAST && __GNUC__ */ /** define if the system has a random number generating device */ #undef PATH_RANDOMDEV /** define if pthread_attr_getstacksize() is available */ #undef HAVE_PTHREAD_ATTR_GETSTACKSIZE /** define if pthread_attr_setstacksize() is available */ #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE /** define if you have strerror in the C library. */ #undef HAVE_STRERROR /** Define if you are running under Compaq TruCluster. */ #undef HAVE_TRUCLUSTER /* Define if OpenSSL includes DSA support */ #undef HAVE_OPENSSL_DSA /* Define if OpenSSL includes ECDSA support */ #undef HAVE_OPENSSL_ECDSA /* Define to the length type used by the socket API (socklen_t, size_t, int). */ #undef ISC_SOCKADDR_LEN_T /* Define if threads need PTHREAD_SCOPE_SYSTEM */ #undef NEED_PTHREAD_SCOPE_SYSTEM bind9-9.9.5.dfsg/isc-config.sh.in0000644000470500017500000000620512271526120016021 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001, 2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: isc-config.sh.in,v 1.17 2007/06/19 23:46:59 tbox Exp $ prefix=@prefix@ exec_prefix=@exec_prefix@ exec_prefix_set= includedir=@includedir@ libdir=@libdir@ usage() { cat << EOF Usage: isc-config [OPTIONS] [LIBRARIES] Options: [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags] Libraries: isc isccc isccfg dns lwres bind9 EOF exit $1 } if test $# -eq 0; then usage 1 1>&2 fi while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case "$1" in --prefix=*) prefix=$optarg if test "x$exec_prefix_set" = x ; then exec_prefix=$prefix exec_prefix_set=true fi ;; --prefix) echo_prefix=true ;; --exec-prefix=*) exec_prefix=$optarg exec_prefix_set=true ;; --exec-prefix) echo_exec_prefix=true ;; --version) echo @BIND9_VERSION@ exit 0 ;; --cflags) echo_cflags=true ;; --libs) echo_libs=true; ;; isc) libisc=true; ;; isccc) libisccc=true; libisc=true; ;; isccfg) libisccfg=true; libisc=true; ;; dns) libdns=true; libisc=true; ;; lwres) liblwres=true; ;; bind9) libdns=true; libisc=true; libisccfg=true; libbind9=true; ;; *) usage 1 1>&2 esac shift done if test x"$echo_prefix" = x"true" ; then echo $prefix fi if test x"$echo_exec_prefix" = x"true" ; then echo $exec_prefix fi if test x"$echo_cflags" = x"true"; then if test x"${exec_prefix_set}" = x"true"; then includes="-I${exec_prefix}/include" else includes="-I${includedir}" fi if test x"$libisc" = x"true"; then includes="$includes @ALWAYS_DEFINES@ @STD_CINCLUDES@ @STD_CDEFINES@ @CCOPT@" fi echo $includes fi if test x"$echo_libs" = x"true"; then if test x"${exec_prefix_set}" = x"true"; then includes="-L${exec_prefix}/lib" else libs="-L${libdir}" fi if test x"$liblwres" = x"true" ; then libs="$libs -llwres" fi if test x"$libbind9" = x"true" ; then libs="$libs -lbind9" fi if test x"$libdns" = x"true" ; then libs="$libs -ldns @DNS_CRYPTO_LIBS@" fi if test x"$libisccfg" = x"true" ; then libs="$libs -lisccfg" fi if test x"$libisccc" = x"true" ; then libs="$libs -lisccc" fi if test x"$libisc" = x"true" ; then libs="$libs -lisc" needothers=true fi if test x"$needothers" = x"true" ; then libs="$libs @CCOPT@ @LIBS@" fi echo $libs fi bind9-9.9.5.dfsg/config.h.win320000644000470500017500000002211512271526120015414 0ustar lamontlamont/* * Copyright (C) 2004, 2006-2009, 2011-2013 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: config.h.win32,v 1.28 2011/10/30 23:39:39 marka Exp $ */ /* * win32 configuration file * All definitions, declarations, macros and includes are * specific to the requirements of the Windows NT and Windows 2000 * platforms */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define as __inline if that's what the C compiler calls it. */ #define inline __inline /* Define to `unsigned int/__int64' if doesn't define. */ /* #undef size_t */ /* * ANSI C compliance enabled */ #define __STDC__ 1 /* * Silence compiler warnings about using strcpy and friends. */ #define _CRT_SECURE_NO_DEPRECATE 1 /* * Use 32 bit time. */ #ifndef _WIN64 #define _USE_32BIT_TIME_T 1 #endif /* * Minimum version is Windows XP */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #if _WIN32_WINNT < 0x0501 #error Minimum Target environment is Windows XP and Windows Server 2003 #endif #ifndef NTDDI_VERSION #define NTDDI_VERSION 0x05010100 #endif #if NTDDI_VERSION < 0x05010100 #error Minimum Target environment is Windows XP SP1 and Windows Server 2003 #endif /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* define on DEC OSF to enable 4.4BSD style sa_len support */ /* #undef _SOCKADDR_LEN */ /* define if your system needs pthread_init() before using pthreads */ /* #undef NEED_PTHREAD_INIT */ /* define if your system has sigwait() */ /* #undef HAVE_SIGWAIT */ /* define on Solaris to get sigwait() to work using pthreads semantics */ /* #undef _POSIX_PTHREAD_SEMANTICS */ /* define if LinuxThreads is in use */ /* #undef HAVE_LINUXTHREADS */ /* define if catgets() is available */ /* #undef HAVE_CATGETS */ /* define if you have the NET_RT_IFLIST sysctl variable. */ #define HAVE_IFLIST_SYSCTL 1 /* define if you need to #define _XPG4_2 before including sys/socket.h */ /* #undef NEED_XPG4_2_BEFORE_SOCKET_H */ /* define if you need to #define _XOPEN_SOURCE_ENTENDED before including * sys/socket.h */ /* #undef NEED_XSE_BEFORE_SOCKET_H */ /* Define if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the header file. */ #define HAVE_SYS_SOCKIO_H 1 /* Define if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the c_r library (-lc_r). */ /* #undef HAVE_LIBC_R */ /* Define if you have the nsl library (-lnsl). */ /* #undef HAVE_LIBNSL */ /* Define if you have the pthread library (-lpthread). */ /* #undef HAVE_LIBPTHREAD */ /* Define if you have the socket library (-lsocket). */ /* #undef HAVE_LIBSOCKET */ /* Define if you have h_errno */ #define HAVE_H_ERRNO /* Define if you have RSA_generate_key(). */ #define HAVE_RSA_GENERATE_KEY /* Define if you have DSA_generate_parameters(). */ #define HAVE_DSA_GENERATE_PARAMETERS /* Define if you have DH_generate_parameters(). */ #define HAVE_DH_GENERATE_PARAMETERS /* * Define to 1 if you want to use the DLZ "dlopen" driver * (which has the same name on windows even though it uses * LoadLibrary() instead of dlopen()). */ #define ISC_DLZ_DLOPEN 1 #define WANT_IPV6 #define S_IFMT _S_IFMT /* file type mask */ #define S_IFDIR _S_IFDIR /* directory */ #define S_IFCHR _S_IFCHR /* character special */ #define S_IFIFO _S_IFIFO /* pipe */ #define S_IFREG _S_IFREG /* regular */ #define S_IREAD _S_IREAD /* read permission, owner */ #define S_IWRITE _S_IWRITE /* write permission, owner */ #define S_IEXEC _S_IEXEC /* execute/search permission, owner */ #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_RDWR _O_RDWR #define O_APPEND _O_APPEND #define O_CREAT _O_CREAT #define O_TRUNC _O_TRUNC #define O_EXCL _O_EXCL /* open() under unix allows setting of read/write permissions * at the owner, group and other levels. These don't exist in NT * We'll just map them all to the NT equivalent */ #define S_IRUSR _S_IREAD /* Owner read permission */ #define S_IWUSR _S_IWRITE /* Owner write permission */ #define S_IRGRP _S_IREAD /* Group read permission */ #define S_IWGRP _S_IWRITE /* Group write permission */ #define S_IROTH _S_IREAD /* Other read permission */ #define S_IWOTH _S_IWRITE /* Other write permission */ /* * WIN32 specials until some other way of dealing with these is decided. */ #define snprintf _snprintf #if _MSC_VER <= 1400 #define vsnprintf _vsnprintf #endif #define strcasecmp _stricmp #define strncasecmp _strnicmp #define strdup _strdup #define sopen _sopen #define isascii __isascii #ifndef _WIN64 #define stat _stat #define fstat _fstat #else #define stat _stat64 #define fstat _fstat64 #endif #define fileno _fileno #define unlink _unlink #define chdir _chdir #define mkdir _mkdir #define rmdir _rmdir #define getcwd _getcwd #define utime _utime #define utimbuf _utimbuf #ifndef _WIN64 #define lseek _lseek #else #define lseek _lseeki64 #endif /* #define EAFNOSUPPORT EINVAL */ #define chmod _chmod #define getpid _getpid #define getppid _getpid /* WARNING!!! For now this gets the same pid */ #define random rand /* Random number generator */ #define srandom srand /* Random number generator seeding */ /* for the config file */ typedef unsigned int uid_t; /* user id */ typedef unsigned int gid_t; /* group id */ typedef long pid_t; /* PID */ #ifndef _WIN64 typedef int ssize_t; typedef long off_t; #else typedef __int64 ssize_t; #ifndef _AFX /* BINDInstall defines it with another type but doesn't use it */ typedef __int64 off_t; #endif #endif /* * Set up the Version Information */ #include /* We actually are using the CryptAPI and not a device */ #define PATH_RANDOMDEV "CryptAPI" #include #include #include /* * Applications may need to get the configuration path */ #ifndef _USRDLL #include #endif #define fdopen _fdopen #define read _read #define open _open #define close _close #define write _write #include #define isatty _isatty #ifndef _WINSOCKAPI_ #define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ #endif /* * Make the number of available sockets large * The number of sockets needed can get large and memory's cheap * This must be defined before winsock2.h gets included as the * macro is used there. */ #ifndef FD_SETSIZE #define FD_SETSIZE 16384 #endif #include /* * main() is hooked */ #define ISC_MAIN_HOOK 1 /* * Configure sensible arguments */ @CONFIGARGS@ /* * Define if libxml2 is present */ @HAVE_LIBXML2@ /* * Define when building BIND9. When building exportable versions * of libisc, libdns, etc, this must be removed. */ #define BIND9 1 /** define if struct addrinfo exists */ #define HAVE_ADDRINFO /** define if getaddrinfo() exists */ #define HAVE_GETADDRINFO /** define if gai_strerror() exists */ #define HAVE_GAISTRERROR /* Define to enable the "filter-aaaa-on-v4" and "filter-aaaa-on-v6" options. */ @ALLOW_FILTER_AAAA@ /* Define to enable "rrset-order fixed" syntax. */ @DNS_RDATASET_FIXED@ /* Define to 1 if you have the `EVP_sha256' function. */ @HAVE_EVP_SHA256@ /* Define to 1 if you have the `EVP_sha384' function. */ @HAVE_EVP_SHA384@ /* Define to 1 if you have the `EVP_sha512' function. */ @HAVE_EVP_SHA512@ /* Define if OpenSSL includes DSA support */ @HAVE_OPENSSL_DSA@ /* Define if OpenSSL includes ECDSA support */ @HAVE_OPENSSL_ECDSA@ /* Define if your OpenSSL version supports GOST. */ @HAVE_OPENSSL_GOST@ /* Define to 1 if you have the `readline' function. */ @HAVE_READLINE@ /* Build with GeoIP support */ @HAVE_GEOIP@ /* define if idnkit support is to be included. */ @WITH_IDN@ /* Build with GeoIP City IPv6 support */ @HAVE_GEOIP_CITY_V6@ /* Build with GeoIP Country IPv6 support */ @HAVE_GEOIP_V6@ /* Define to enable rpz-nsdname rules. */ @ENABLE_RPZ_NSDNAME@ /* Define to enable rpz-nsip rules. */ @ENABLE_RPZ_NSIP@ /* From enable developer */ @ISC_LIST_CHECKINIT@ /* Avoid warnings with strlen() */ #ifdef _WIN64 #define strlen(x) (unsigned int) strlen(x) #endif /* Define to enable response rate limiting. */ #define USE_RRL /* Get SRCID */ #include "srcid.h" bind9-9.9.5.dfsg/config.h.in0000644000470500017500000003256012271526120015065 0ustar lamontlamont/* config.h.in. Generated from configure.in by autoheader. */ /* * Copyright (C) 2004, 2005, 2007, 2008, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: acconfig.h,v 1.53 2008/12/01 23:47:44 tbox Exp $ */ /*! \file */ /*** *** This file is not to be included by any public header files, because *** it does not get installed. ***/ /** define on DEC OSF to enable 4.4BSD style sa_len support */ #undef _SOCKADDR_LEN /** define if your system needs pthread_init() before using pthreads */ #undef NEED_PTHREAD_INIT /** define if your system has sigwait() */ #undef HAVE_SIGWAIT /** define if sigwait() is the UnixWare flavor */ #undef HAVE_UNIXWARE_SIGWAIT /** define on Solaris to get sigwait() to work using pthreads semantics */ #undef _POSIX_PTHREAD_SEMANTICS /** define if LinuxThreads is in use */ #undef HAVE_LINUXTHREADS /** define if sysconf() is available */ #undef HAVE_SYSCONF /** define if sysctlbyname() is available */ #undef HAVE_SYSCTLBYNAME /** define if catgets() is available */ #undef HAVE_CATGETS /** define if getifaddrs() exists */ #undef HAVE_GETIFADDRS /** define if you have the NET_RT_IFLIST sysctl variable and sys/sysctl.h */ #undef HAVE_IFLIST_SYSCTL /** define if tzset() is available */ #undef HAVE_TZSET /** define if struct addrinfo exists */ #undef HAVE_ADDRINFO /** define if getaddrinfo() exists */ #undef HAVE_GETADDRINFO /** define if gai_strerror() exists */ #undef HAVE_GAISTRERROR /** define if arc4random() exists */ #undef HAVE_ARC4RANDOM /** * define if pthread_setconcurrency() should be called to tell the * OS how many threads we might want to run. */ #undef CALL_PTHREAD_SETCONCURRENCY /** define if IPv6 is not disabled */ #undef WANT_IPV6 /** define if flockfile() is available */ #undef HAVE_FLOCKFILE /** define if getc_unlocked() is available */ #undef HAVE_GETCUNLOCKED /** Shut up warnings about sputaux in stdio.h on BSD/OS pre-4.1 */ #undef SHUTUP_SPUTAUX #ifdef SHUTUP_SPUTAUX struct __sFILE; extern __inline int __sputaux(int _c, struct __sFILE *_p); #endif /** Shut up warnings about missing sigwait prototype on BSD/OS 4.0* */ #undef SHUTUP_SIGWAIT #ifdef SHUTUP_SIGWAIT int sigwait(const unsigned int *set, int *sig); #endif /** Shut up warnings from gcc -Wcast-qual on BSD/OS 4.1. */ #undef SHUTUP_STDARG_CAST #if defined(SHUTUP_STDARG_CAST) && defined(__GNUC__) #include /** Grr. Must be included *every time*. */ /** * The silly continuation line is to keep configure from * commenting out the #undef. */ #undef \ va_start #define va_start(ap, last) \ do { \ union { const void *konst; long *var; } _u; \ _u.konst = &(last); \ ap = (va_list)(_u.var + __va_words(__typeof(last))); \ } while (0) #endif /** SHUTUP_STDARG_CAST && __GNUC__ */ /** define if the system has a random number generating device */ #undef PATH_RANDOMDEV /** define if pthread_attr_getstacksize() is available */ #undef HAVE_PTHREAD_ATTR_GETSTACKSIZE /** define if pthread_attr_setstacksize() is available */ #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE /** define if you have strerror in the C library. */ #undef HAVE_STRERROR /** Define if you are running under Compaq TruCluster. */ #undef HAVE_TRUCLUSTER /* Define if OpenSSL includes DSA support */ #undef HAVE_OPENSSL_DSA /* Define if OpenSSL includes ECDSA support */ #undef HAVE_OPENSSL_ECDSA /* Define to the length type used by the socket API (socklen_t, size_t, int). */ #undef ISC_SOCKADDR_LEN_T /* Define if threads need PTHREAD_SCOPE_SYSTEM */ #undef NEED_PTHREAD_SCOPE_SYSTEM /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to enable the "filter-aaaa-on-v4" option. */ #undef ALLOW_FILTER_AAAA_ON_V4 /* define if ATF unit tests are to be built. */ #undef ATF_TEST /* Define if recvmsg() does not meet all of the BSD socket API specifications. */ #undef BROKEN_RECVMSG /* Define if you cannot bind() before connect() for TCP sockets. */ #undef BROKEN_TCP_BIND_BEFORE_CONNECT /* Define to enable "rrset-order fixed" syntax. */ #undef DNS_RDATASET_FIXED /* Define to enable rpz-nsdname rules. */ #undef ENABLE_RPZ_NSDNAME /* Define to enable rpz-nsip rules. */ #undef ENABLE_RPZ_NSIP /* Solaris hack to get select_large_fdset. */ #undef FD_SETSIZE /* Define to nothing if C supports flexible array members, and to 1 if it does not. That way, with a declaration like `struct s { int n; double d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99 compilers. When computing the size of such an object, don't use 'sizeof (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)' instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with MSVC and with C++ compilers. */ #undef FLEXIBLE_ARRAY_MEMBER /* Define to 1 if you have the `chroot' function. */ #undef HAVE_CHROOT /* Define to 1 if you have the header file. */ #undef HAVE_DEVPOLL_H /* Define to 1 if you have the `dlclose' function. */ #undef HAVE_DLCLOSE /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `dlopen' function. */ #undef HAVE_DLOPEN /* Define to 1 if you have the `dlsym' function. */ #undef HAVE_DLSYM /* Define to 1 if you have the `EVP_sha256' function. */ #undef HAVE_EVP_SHA256 /* Define to 1 if you have the `EVP_sha384' function. */ #undef HAVE_EVP_SHA384 /* Define to 1 if you have the `EVP_sha512' function. */ #undef HAVE_EVP_SHA512 /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_GSSAPI_GSSAPI_H /* Define to 1 if you have the header file. */ #undef HAVE_GSSAPI_GSSAPI_KRB5_H /* Define to 1 if you have the header file. */ #undef HAVE_GSSAPI_H /* Define to 1 if you have the header file. */ #undef HAVE_GSSAPI_KRB5_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_KERBEROSV5_KRB5_H /* Define to 1 if you have the header file. */ #undef HAVE_KRB5_H /* Define to 1 if you have the header file. */ #undef HAVE_KRB5_KRB5_H /* Define to 1 if you have the `c' library (-lc). */ #undef HAVE_LIBC /* Define to 1 if you have the `cap' library (-lcap). */ #undef HAVE_LIBCAP /* if system have backtrace function */ #undef HAVE_LIBCTRACE /* Define to 1 if you have the `c_r' library (-lc_r). */ #undef HAVE_LIBC_R /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `scf' library (-lscf). */ #undef HAVE_LIBSCF /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define to 1 if you have the `thr' library (-lthr). */ #undef HAVE_LIBTHR /* Define if libxml2 was found */ #undef HAVE_LIBXML2 /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAPABILITY_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_TYPES_H /* 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 `nanosleep' function. */ #undef HAVE_NANOSLEEP /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF6_H /* Define if your OpenSSL version supports ECDSA. */ #undef HAVE_OPENSSL_ECDSA /* Define if your OpenSSL version supports GOST. */ #undef HAVE_OPENSSL_GOST /* Define to 1 if you have the `pthread_yield' function. */ #undef HAVE_PTHREAD_YIELD /* Define to 1 if you have the `pthread_yield_np' function. */ #undef HAVE_PTHREAD_YIELD_NP /* Define to 1 if you have the `readline' function. */ #undef HAVE_READLINE /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `sched_yield' function. */ #undef HAVE_SCHED_YIELD /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `setresgid' function. */ #undef HAVE_SETRESGID /* Define to 1 if you have the `setresuid' function. */ #undef HAVE_SETRESUID /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_CAPABILITY_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DEVPOLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DYNTUNE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PRCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_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_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H /* Define if running under Compaq TruCluster */ #undef HAVE_TRUCLUSTER /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `usleep' function. */ #undef HAVE_USLEEP /* return type of gai_strerror */ #undef IRS_GAISTRERROR_RETURN_T /* Define to the buffer length type used by getnameinfo(3). */ #undef IRS_GETNAMEINFO_BUFLEN_T /* Define to the flags type used by getnameinfo(3). */ #undef IRS_GETNAMEINFO_FLAGS_T /* Define to allow building of objects for dlopen(). */ #undef ISC_DLZ_DLOPEN /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Defined if extern char *optarg is not declared. */ #undef NEED_OPTARG /* Define if connect does not honour the permission on the UNIX domain socket. */ #undef NEED_SECURE_DIRECTORY /* Use the new XML schema for statistics */ #undef NEWSTATS /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK). */ #undef PORT_NONBLOCK /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking. */ #undef USE_FIONBIO_IOCTL /* Enable DNS Response Rate Limiting */ #undef USE_RRL /* define if idnkit support is to be included. */ #undef WITH_IDN /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to empty if your compiler does not support "static inline". */ #undef inline /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to `unsigned long' if does not define. */ #undef uintptr_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile bind9-9.9.5.dfsg/aclocal.m40000644000470500017500000000026712271526120014701 0ustar lamontlamontsinclude(libtool.m4/libtool.m4)dnl sinclude(libtool.m4/ltoptions.m4)dnl sinclude(libtool.m4/ltsugar.m4)dnl sinclude(libtool.m4/ltversion.m4)dnl sinclude(libtool.m4/lt~obsolete.m4)dnl bind9-9.9.5.dfsg/FAQ.xml0000644000470500017500000013120212271526120014164 0ustar lamontlamont
    Frequently Asked Questions about BIND 9 2004 2005 2006 2007 2008 2009 2010 2013 Internet Systems Consortium, Inc. ("ISC") 2000 2001 2002 2003 Internet Software Consortium. Compilation and Installation Questions I'm trying to compile BIND 9, and "make" is failing due to files not being found. Why? Using a parallel or distributed "make" to build BIND 9 is not supported, and doesn't work. If you are using one of these, use normal make or gmake instead. Isn't "make install" supposed to generate a default named.conf? Short Answer: No. Long Answer: There really isn't a default configuration which fits any site perfectly. There are lots of decisions that need to be made and there is no consensus on what the defaults should be. For example FreeBSD uses /etc/namedb as the location where the configuration files for named are stored. Others use /var/named. What addresses to listen on? For a laptop on the move a lot you may only want to listen on the loop back interfaces. Who do you offer recursive service to? Is there are firewall to consider? If so is it stateless or stateful. Are you directly on the Internet? Are you on a private network? Are you on a NAT'd network? The answers to all these questions change how you configure even a caching name server. Configuration and Setup Questions Why does named log the warning message no TTL specified - using SOA MINTTL instead? Your zone file is illegal according to RFC1035. It must either have a line like: $TTL 86400 at the beginning, or the first record in it must have a TTL field, like the "84600" in this example: example.com. 86400 IN SOA ns hostmaster ( 1 3600 1800 1814400 3600 ) Why do I get errors like dns_zone_load: zone foo/IN: loading master file bar: ran out of space? This is often caused by TXT records with missing close quotes. Check that all TXT records containing quoted strings have both open and close quotes. How do I restrict people from looking up the server version? Put a "version" option containing something other than the real version in the "options" section of named.conf. Note doing this will not prevent attacks and may impede people trying to diagnose problems with your server. Also it is possible to "fingerprint" nameservers to determine their version. How do I restrict only remote users from looking up the server version? The following view statement will intercept lookups as the internal view that holds the version information will be matched last. The caveats of the previous answer still apply, of course. view "chaos" chaos { match-clients { <those to be refused>; }; allow-query { none; }; zone "." { type hint; file "/dev/null"; // or any empty file }; }; What do no source of entropy found or could not open entropy source foo mean? The server requires a source of entropy to perform certain operations, mostly DNSSEC related. These messages indicate that you have no source of entropy. On systems with /dev/random or an equivalent, it is used by default. A source of entropy can also be defined using the random-device option in named.conf. I'm trying to use TSIG to authenticate dynamic updates or zone transfers. I'm sure I have the keys set up correctly, but the server is rejecting the TSIG. Why? This may be a clock skew problem. Check that the the clocks on the client and server are properly synchronised (e.g., using ntp). I see a log message like the following. Why? couldn't open pid file '/var/run/named.pid': Permission denied You are most likely running named as a non-root user, and that user does not have permission to write in /var/run. The common ways of fixing this are to create a /var/run/named directory owned by the named user and set pid-file to "/var/run/named/named.pid", or set pid-file to "named.pid", which will put the file in the directory specified by the directory option (which, in this case, must be writable by the named user). I can query the nameserver from the nameserver but not from other machines. Why? This is usually the result of the firewall configuration stopping the queries and / or the replies. How can I make a server a slave for both an internal and an external view at the same time? When I tried, both views on the slave were transferred from the same view on the master. You will need to give the master and slave multiple IP addresses and use those to make sure you reach the correct view on the other machine. Master: 10.0.1.1 (internal), 10.0.1.2 (external, IP alias) internal: match-clients { !10.0.1.2; !10.0.1.4; 10.0.1/24; }; notify-source 10.0.1.1; transfer-source 10.0.1.1; query-source address 10.0.1.1; external: match-clients { any; }; recursion no; // don't offer recursion to the world notify-source 10.0.1.2; transfer-source 10.0.1.2; query-source address 10.0.1.2; Slave: 10.0.1.3 (internal), 10.0.1.4 (external, IP alias) internal: match-clients { !10.0.1.2; !10.0.1.4; 10.0.1/24; }; notify-source 10.0.1.3; transfer-source 10.0.1.3; query-source address 10.0.1.3; external: match-clients { any; }; recursion no; // don't offer recursion to the world notify-source 10.0.1.4; transfer-source 10.0.1.4; query-source address 10.0.1.4; You put the external address on the alias so that all the other dns clients on these boxes see the internal view by default. BIND 9.3 and later: Use TSIG to select the appropriate view. Master 10.0.1.1: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; // reject message ment for the // external view. 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; server 10.0.1.2 { keys external; }; // tag messages from the // external view to the // other servers for the // view. recursion no; ... }; Slave 10.0.1.2: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; ... }; view "external" { match-clients { key external; any; }; server 10.0.1.1 { keys external; }; recursion no; ... }; I get error messages like multiple RRs of singleton type and CNAME and other data when transferring a zone. What does this mean? These indicate a malformed master zone. You can identify the exact records involved by transferring the zone using dig then running named-checkzone on it. dig axfr example.com @master-server > tmp named-checkzone example.com tmp A CNAME record cannot exist with the same name as another record except for the DNSSEC records which prove its existence (NSEC). RFC 1034, Section 3.6.2: If a CNAME RR is present at a node, no other data should be present; this ensures that the data for a canonical name and its aliases cannot be different. This rule also insures that a cached CNAME can be used without checking with an authoritative server for other RR types. I get error messages like named.conf:99: unexpected end of input where 99 is the last line of named.conf. There are unbalanced quotes in named.conf. Some text editors (notepad and wordpad) fail to put a line title indication (e.g. CR/LF) on the last line of a text file. This can be fixed by "adding" a blank line to the end of the file. Named expects to see EOF immediately after EOL and treats text files where this is not met as truncated. How do I share a dynamic zone between multiple views? You choose one view to be master and the second a slave and transfer the zone between views. Master 10.0.1.1: key "external" { algorithm hmac-sha256; secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { algorithm hmac-sha256; secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; server 10.0.1.1 { /* Deliver notify messages to external view. */ keys { external; }; }; zone "example.com" { type master; file "internal/example.db"; allow-update { key mykey; }; also-notify { 10.0.1.1; }; }; }; view "external" { match-clients { key external; any; }; zone "example.com" { type slave; file "external/example.db"; masters { 10.0.1.1; }; transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; }; I get a error message like zone wireless.ietf56.ietf.org/IN: loading master file primaries/wireless.ietf56.ietf.org: no owner. This error is produced when a line in the master file contains leading white space (tab/space) but the is no current record owner name to inherit the name from. Usually this is the result of putting white space before a comment, forgetting the "@" for the SOA record, or indenting the master file. Why are my logs in GMT (UTC). You are running chrooted (-t) and have not supplied local timezone information in the chroot area. FreeBSD: /etc/localtime Solaris: /etc/TIMEZONE and /usr/share/lib/zoneinfo OSF: /etc/zoneinfo/localtime See also tzset(3) and zic(8). I get rndc: connect failed: connection refused when I try to run rndc. This is usually a configuration error. First ensure that named is running and no errors are being reported at startup (/var/log/messages or equivalent). Running "named -g <usual arguments>" from a title can help at this point. Secondly ensure that named is configured to use rndc either by "rndc-confgen -a", rndc-confgen or manually. The Administrators Reference manual has details on how to do this. Old versions of rndc-confgen used localhost rather than 127.0.0.1 in /etc/rndc.conf for the default server. Update /etc/rndc.conf if necessary so that the default server listed in /etc/rndc.conf matches the addresses used in named.conf. "localhost" has two address (127.0.0.1 and ::1). If you use "rndc-confgen -a" and named is running with -t or -u ensure that /etc/rndc.conf has the correct ownership and that a copy is in the chroot area. You can do this by re-running "rndc-confgen -a" with appropriate -t and -u arguments. I get transfer of 'example.net/IN' from 192.168.4.12#53: failed while receiving responses: permission denied error messages. These indicate a filesystem permission error preventing named creating / renaming the temporary file. These will usually also have other associated error messages like "dumping master file: sl/tmp-XXXX5il3sQ: open: permission denied" Named needs write permission on the directory containing the file. Named writes the new cache file to a temporary file then renames it to the name specified in named.conf to ensure that the contents are always complete. This is to prevent named loading a partial zone in the event of power failure or similar interrupting the write of the master file. Note file names are relative to the directory specified in options and any chroot directory ([<chroot dir>/][<options dir>]). If named is invoked as "named -t /chroot/DNS" with the following named.conf then "/chroot/DNS/var/named/sl" needs to be writable by the user named is running as. options { directory "/var/named"; }; zone "example.net" { type slave; file "sl/example.net"; masters { 192.168.4.12; }; }; I want to forward all DNS queries from my caching nameserver to another server. But there are some domains which have to be served locally, via rbldnsd. How do I achieve this ? options { forward only; forwarders { <ip.of.primary.nameserver>; }; }; zone "sbl-xbl.spamhaus.org" { type forward; forward only; forwarders { <ip.of.rbldns.server> port 530; }; }; zone "list.dsbl.org" { type forward; forward only; forwarders { <ip.of.rbldns.server> port 530; }; }; Can you help me understand how BIND 9 uses memory to store DNS zones? Some times it seems to take several times the amount of memory it needs to store the zone. When reloading a zone named my have multiple copies of the zone in memory at one time. The zone it is serving and the one it is loading. If reloads are ultra fast it can have more still. e.g. Ones that are transferring out, the one that it is serving and the one that is loading. BIND 8 destroyed the zone before loading and also killed off outgoing transfers of the zone. The new strategy allows slaves to get copies of the new zone regardless of how often the master is loaded compared to the transfer time. The slave might skip some intermediate versions but the transfers will complete and it will keep reasonably in sync with the master. The new strategy also allows the master to recover from syntax and other errors in the master file as it still has an in-core copy of the old contents. I want to use IPv6 locally but I don't have a external IPv6 connection. External lookups are slow. You can use server clauses to stop named making external lookups over IPv6. server fd81:ec6c:bd62::/48 { bogus no; }; // site ULA prefix server ::/0 { bogus yes; }; Operations Questions How to change the nameservers for a zone? Step 1: Ensure all nameservers, new and old, are serving the same zone content. Step 2: Work out the maximum TTL of the NS RRset in the parent and child zones. This is the time it will take caches to be clear of a particular version of the NS RRset. If you are just removing nameservers you can skip to Step 6. Step 3: Add new nameservers to the NS RRset for the zone and wait until all the servers for the zone are answering with this new NS RRset. Step 4: Inform the parent zone of the new NS RRset then wait for all the parent servers to be answering with the new NS RRset. Step 5: Wait for cache to be clear of the old NS RRset. See Step 2 for how long. If you are just adding nameservers you are done. Step 6: Remove any old nameservers from the zones NS RRset and wait for all the servers for the zone to be serving the new NS RRset. Step 7: Inform the parent zone of the new NS RRset then wait for all the parent servers to be answering with the new NS RRset. Step 8: Wait for cache to be clear of the old NS RRset. See Step 2 for how long. Step 9: Turn off the old nameservers or remove the zone entry from the configuration of the old nameservers. Step 10: Increment the serial number and wait for the change to be visible in all nameservers for the zone. This ensures that zone transfers are still working after the old servers are decommissioned. Note: the above procedure is designed to be transparent to dns clients. Decommissioning the old servers too early will result in some clients not being able to look up answers in the zone. Note: while it is possible to run the addition and removal stages together it is not recommended. General Questions I keep getting log messages like the following. Why? Dec 4 23:47:59 client 10.0.0.1#1355: updating zone 'example.com/IN': update failed: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET) DNS updates allow the update request to test to see if certain conditions are met prior to proceeding with the update. The message above is saying that conditions were not met and the update is not proceeding. See doc/rfc/rfc2136.txt for more details on prerequisites. I keep getting log messages like the following. Why? Jun 21 12:00:00.000 client 10.0.0.1#1234: update denied Someone is trying to update your DNS data using the RFC2136 Dynamic Update protocol. Windows 2000 machines have a habit of sending dynamic update requests to DNS servers without being specifically configured to do so. If the update requests are coming from a Windows 2000 machine, see <http://support.microsoft.com/support/kb/articles/q246/8/04.asp> for information about how to turn them off. When I do a "dig . ns", many of the A records for the root servers are missing. Why? This is normal and harmless. It is a somewhat confusing side effect of the way BIND 9 does RFC2181 trust ranking and of the efforts BIND 9 makes to avoid promoting glue into answers. When BIND 9 first starts up and primes its cache, it receives the root server addresses as additional data in an authoritative response from a root server, and these records are eligible for inclusion as additional data in responses. Subsequently it receives a subset of the root server addresses as additional data in a non-authoritative (referral) response from a root server. This causes the addresses to now be considered non-authoritative (glue) data, which is not eligible for inclusion in responses. The server does have a complete set of root server addresses cached at all times, it just may not include all of them as additional data, depending on whether they were last received as answers or as glue. You can always look up the addresses with explicit queries like "dig a.root-servers.net A". Why don't my zones reload when I do an "rndc reload" or SIGHUP? A zone can be updated either by editing zone files and reloading the server or by dynamic update, but not both. If you have enabled dynamic update for a zone using the "allow-update" option, you are not supposed to edit the zone file by hand, and the server will not attempt to reload it. Why is named listening on UDP port other than 53? Named uses a system selected port to make queries of other nameservers. This behaviour can be overridden by using query-source to lock down the port and/or address. See also notify-source and transfer-source. I get warning messages like zone example.com/IN: refresh: failure trying master 1.2.3.4#53: timed out. Check that you can make UDP queries from the slave to the master dig +norec example.com soa @1.2.3.4 You could be generating queries faster than the slave can cope with. Lower the serial query rate. serial-query-rate 5; // default 20 I don't get RRSIG's returned when I use "dig +dnssec". You need to ensure DNSSEC is enabled (dnssec-enable yes;). Can a NS record refer to a CNAME. No. The rules for glue (copies of the *address* records in the parent zones) and additional section processing do not allow it to work. You would have to add both the CNAME and address records (A/AAAA) as glue to the parent zone and have CNAMEs be followed when doing additional section processing to make it work. No nameserver implementation supports either of these requirements. What does RFC 1918 response from Internet for 0.0.0.10.IN-ADDR.ARPA mean? If the IN-ADDR.ARPA name covered refers to a internal address space you are using then you have failed to follow RFC 1918 usage rules and are leaking queries to the Internet. You should establish your own zones for these addresses to prevent you querying the Internet's name servers for these addresses. Please see <http://as112.net/> for details of the problems you are causing and the counter measures that have had to be deployed. If you are not using these private addresses then a client has queried for them. You can just ignore the messages, get the offending client to stop sending you these messages as they are most probably leaking them or setup your own zones empty zones to serve answers to these queries. zone "10.IN-ADDR.ARPA" { type master; file "empty"; }; zone "16.172.IN-ADDR.ARPA" { type master; file "empty"; }; ... zone "31.172.IN-ADDR.ARPA" { type master; file "empty"; }; zone "168.192.IN-ADDR.ARPA" { type master; file "empty"; }; empty: @ 10800 IN SOA <name-of-server>. <contact-email>. ( 1 3600 1200 604800 10800 ) @ 10800 IN NS <name-of-server>. Future versions of named are likely to do this automatically. Will named be affected by the 2007 changes to daylight savings rules in the US. No, so long as the machines internal clock (as reported by "date -u") remains at UTC. The only visible change if you fail to upgrade your OS, if you are in a affected area, will be that log messages will be a hour out during the period where the old rules do not match the new rules. For most OS's this change just means that you need to update the conversion rules from UTC to local time. Normally this involves updating a file in /etc (which sets the default timezone for the machine) and possibly a directory which has all the conversion rules for the world (e.g. /usr/share/zoneinfo). When updating the OS do not forget to update any chroot areas as well. See your OS's documentation for more details. The local timezone conversion rules can also be done on a individual basis by setting the TZ environment variable appropriately. See your OS's documentation for more details. Is there a bugzilla (or other tool) database that mere mortals can have (read-only) access to for bind? No. The BIND 9 bug database is kept closed for a number of reasons. These include, but are not limited to, that the database contains proprietory information from people reporting bugs. The database has in the past and may in future contain unfixed bugs which are capable of bringing down most of the Internet's DNS infrastructure. The release pages for each version contain up to date lists of bugs that have been fixed post release. That is as close as we can get to providing a bug database. Why do queries for NSEC3 records fail to return the NSEC3 record? NSEC3 records are strictly meta data and can only be returned in the authority section. This is done so that signing the zone using NSEC3 records does not bring names into existence that do not exist in the unsigned version of the zone. Operating-System Specific Questions HPUX I get the following error trying to configure BIND: checking if unistd.h or sys/types.h defines fd_set... no configure: error: need either working unistd.h or sys/select.h You have attempted to configure BIND with the bundled C compiler. This compiler does not meet the minimum compiler requirements to for building BIND. You need to install a ANSI C compiler and / or teach configure how to find the ANSI C compiler. The later can be done by adjusting the PATH environment variable and / or specifying the compiler via CC. ./configure CC=<compiler> ... Linux Why do I get the following errors: general: errno2result.c:109: unexpected error: general: unable to convert errno to isc_result: 14: Bad address client: UDP client handler shutting down due to fatal receive error: unexpected error This is the result of a Linux kernel bug. See: <http://marc.theaimsgroup.com/?l=linux-netdev&m=113081708031466&w=2> Why does named lock up when it attempts to connect over IPSEC tunnels? This is due to a kernel bug where the fact that a socket is marked non-blocking is ignored. It is reported that setting xfrm_larval_drop to 1 helps but this may have negative side effects. See: <https://bugzilla.redhat.com/show_bug.cgi?id=427629> and <http://lkml.org/lkml/2007/12/4/260>. xfrm_larval_drop can be set to 1 by the following procedure: echo "1" > proc/sys/net/core/xfrm_larval_drop Why do I see 5 (or more) copies of named on Linux? Linux threads each show up as a process under ps. The approximate number of threads running is n+4, where n is the number of CPUs. Note that the amount of memory used is not cumulative; if each process is using 10M of memory, only a total of 10M is used. Newer versions of Linux's ps command hide the individual threads and require -L to display them. Why does BIND 9 log permission denied errors accessing its configuration files or zones on my Linux system even though it is running as root? On Linux, BIND 9 drops most of its root privileges on startup. This including the privilege to open files owned by other users. Therefore, if the server is running as root, the configuration files and zone files should also be owned by root. I get the error message named: capset failed: Operation not permitted when starting named. The capability module, part of "Linux Security Modules/LSM", has not been loaded into the kernel. See insmod(8), modprobe(8). The relevant modules can be loaded by running: modprobe commoncap modprobe capability I'm running BIND on Red Hat Enterprise Linux or Fedora Core - Why can't named update slave zone database files? Why can't named create DDNS journal files or update the master zones from journals? Why can't named create custom log files? Red Hat Security Enhanced Linux (SELinux) policy security protections : Red Hat have adopted the National Security Agency's SELinux security policy (see <http://www.nsa.gov/selinux>) and recommendations for BIND security , which are more secure than running named in a chroot and make use of the bind-chroot environment unnecessary . By default, named is not allowed by the SELinux policy to write, create or delete any files EXCEPT in these directories: $ROOTDIR/var/named/slaves $ROOTDIR/var/named/data $ROOTDIR/var/tmp where $ROOTDIR may be set in /etc/sysconfig/named if bind-chroot is installed. The SELinux policy particularly does NOT allow named to modify the $ROOTDIR/var/named directory, the default location for master zone database files. SELinux policy overrules file access permissions - so even if all the files under /var/named have ownership named:named and mode rw-rw-r--, named will still not be able to write or create files except in the directories above, with SELinux in Enforcing mode. So, to allow named to update slave or DDNS zone files, it is best to locate them in $ROOTDIR/var/named/slaves, with named.conf zone statements such as: zone "slave.zone." IN { type slave; file "slaves/slave.zone.db"; ... }; zone "ddns.zone." IN { type master; allow-updates {...}; file "slaves/ddns.zone.db"; }; To allow named to create its cache dump and statistics files, for example, you could use named.conf options statements such as: options { ... dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; ... }; You can also tell SELinux to allow named to update any zone database files, by setting the SELinux tunable boolean parameter 'named_write_master_zones=1', using the system-config-securitylevel GUI, using the 'setsebool' command, or in /etc/selinux/targeted/booleans. You can disable SELinux protection for named entirely by setting the 'named_disable_trans=1' SELinux tunable boolean parameter. The SELinux named policy defines these SELinux contexts for named: named_zone_t : for zone database files - $ROOTDIR/var/named/* named_conf_t : for named configuration files - $ROOTDIR/etc/{named,rndc}.* named_cache_t: for files modifiable by named - $ROOTDIR/var/{tmp,named/{slaves,data}} If you want to retain use of the SELinux policy for named, and put named files in different locations, you can do so by changing the context of the custom file locations . To create a custom configuration file location, e.g. '/root/named.conf', to use with the 'named -c' option, do: # chcon system_u:object_r:named_conf_t /root/named.conf To create a custom modifiable named data location, e.g. '/var/log/named' for a log file, do: # chcon system_u:object_r:named_cache_t /var/log/named To create a custom zone file location, e.g. /root/zones/, do: # chcon system_u:object_r:named_zone_t /root/zones/{.,*} See these man-pages for more information : selinux(8), named_selinux(8), chcon(1), setsebool(8) I'm running BIND on Ubuntu - Why can't named update slave zone database files? Why can't named create DDNS journal files or update the master zones from journals? Why can't named create custom log files? Ubuntu uses AppArmor <http://en.wikipedia.org/wiki/AppArmor> in addition to normal file system permissions to protect the system. Adjust the paths to use those specified in /etc/apparmor.d/usr.sbin.named or adjust /etc/apparmor.d/usr.sbin.named to allow named to write at the location specified in named.conf. Listening on individual IPv6 interfaces does not work. This is usually due to "/proc/net/if_inet6" not being available in the chroot file system. Mount another instance of "proc" in the chroot file system. This can be be made permanent by adding a second instance to /etc/fstab. proc /proc proc defaults 0 0 proc /var/named/proc proc defaults 0 0 Windows Zone transfers from my BIND 9 master to my Windows 2000 slave fail. Why? This may be caused by a bug in the Windows 2000 DNS server where DNS messages larger than 16K are not handled properly. This can be worked around by setting the option "transfer-format one-answer;". Also check whether your zone contains domain names with embedded spaces or other special characters, like "John\032Doe\213s\032Computer", since such names have been known to cause Windows 2000 slaves to incorrectly reject the zone. I get Error 1067 when starting named under Windows. This is the service manager saying that named exited. You need to examine the Application log in the EventViewer to find out why. Common causes are that you failed to create "named.conf" (usually "C:\windows\dns\etc\named.conf") or failed to specify the directory in named.conf. options { Directory "C:\windows\dns\etc"; }; FreeBSD I have FreeBSD 4.x and "rndc-confgen -a" just sits there. /dev/random is not configured. Use rndcontrol(8) to tell the kernel to use certain interrupts as a source of random events. You can make this permanent by setting rand_irqs in /etc/rc.conf. rand_irqs="3 14 15" See also <http://people.freebsd.org/~dougb/randomness.html>. Solaris How do I integrate BIND 9 and Solaris SMF Sun has a blog entry describing how to do this. <http://blogs.sun.com/roller/page/anay/Weblog?catname=%2FSolaris> Apple Mac OS X How do I run BIND 9 on Apple Mac OS X? If you run Tiger(Mac OS 10.4) or later then this is all you need to do: % sudo rndc-confgen > /etc/rndc.conf Copy the key statement from /etc/rndc.conf into /etc/rndc.key, e.g.: key "rndc-key" { algorithm hmac-sha256; secret "uvceheVuqf17ZwIcTydddw=="; }; Then start the relevant service: % sudo service org.isc.named start This is persistent upon a reboot, so you will have to do it only once. Alternatively you can just generate /etc/rndc.key by running: % sudo rndc-confgen -a Then start the relevant service: % sudo service org.isc.named start Named will look for /etc/rndc.key when it starts if it doesn't have a controls section or the existing controls are missing keys sub-clauses. This is persistent upon a reboot, so you will have to do it only once.
    bind9-9.9.5.dfsg/doc/0002755000470500017500000000000012276444014013611 5ustar lamontlamontbind9-9.9.5.dfsg/doc/doxygen/0002755000470500017500000000000012276444014015266 5ustar lamontlamontbind9-9.9.5.dfsg/doc/doxygen/doxygen-input-filter.in0000644000470500017500000000354112271526120021706 0ustar lamontlamont#!@PERL@ -w # # Copyright (C) 2006, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: doxygen-input-filter.in,v 1.4 2007/06/19 23:47:13 tbox Exp $ # Input filter for feeding our source code into Doxygen. # Slurp whole file at once undef $/; $_ = <>; # It turns out that there are a lot of cases where we'd really like to # use what Doxygen calls "brief" documentation in a comment. Doxygen # has a shorthand way of doing this -- if one is writing C++. ISC # coding conventions require C, not C++, so we have to do it the # verbose way, which makes a lot of comments too long to fit on a # single line without violating another ISC coding standard (80 # character line limit). # # So we use Doxygen's input filter mechanism to define our own # brief comment convention: # # /*% foo */ # # expands to # # /*! \brief foo */ # # and # # /*%< foo */ # # expands to # # /*!< \brief foo */ # s{/\*%(the Doxygen web site
    /// for more information about Doxygen, including its manual. /// /// \section mainpage_knownissues Known Issues /// \par /// /// Known issues with our current use of Doxygen: /// /// \li In a major departure from previous attempts to use Doxygen /// with BIND9, this manual attempts to take the simplest approach /// to every choice Doxygen gives us. We don't generate fancy /// extra Doxygen tags files from the RFC database. We don't /// attempt to use Doxygen as a wrapper framework for other /// documentation (eg, ISC Tech Notes, the ARM, ...). We don't /// try to generate the list of files to document on the fly. /// Instead, we attempt to use Doxygen's native facilities /// wherever possible, on the assumption that we'll add new /// features later as we need them but should start as simply as /// we can. /// /// \li Our use of \\file is wrong in many places. We probably should /// be marking header files with the names by which we include /// them (eg, "dns/resolver.h"). Doxygen reports filename /// conflicts in a few cases where it can't work out which of /// several files to use. /// /// \li At the moment we're instructing Doxygen to document all /// functions, whether they have proper comment markup or not. /// This is a good way to see what's been marked up, but might not /// be the right approach in the long run. /// /// \li See doc/doxygen/doxygen-input-filter.in for local abbreviations. /// /// \li We're probably over-using the \\brief markup tag. /// /// \li We may in fact be confusing Doxygen to the point where it's /// not finding markup comments that it should. Needs /// investigation. /// /// \li At the moment I have all the cool "dot" stuff turned off, /// both because it's a distraction and because it slows down /// doxygen runs. Maybe after I get a faster desk machine. :) /// /// \li At the moment we're producing a single "BIND9 Internals" /// manual. One of our previous complications was an attempt to /// produce separate manuals for each library, then cross-link /// them. We might still need separate library manuals, but, if /// so, it might be easier to have the BIND9 Internals manual be a /// superset of the library manuals (ie, reuse the same source to /// produce differently scoped manuals). Would certainly be /// simpler than the cross-linking mess, but partly it's a /// question of how we want to present the material. /// /// \li Doxygen is slanted towards C++. It can be tuned towards plain /// old C, but the C++ bias still shows up in places, eg, the lack /// of top-level menu support for functions (in C++, the basic /// unit of programming is the class, which Doxygen does support /// directly). This is a bit annoying, but not all that /// critical. /// /// \li If we ever get really ambitious, we might try processing /// Doxygen's XML output, which is basicly a dump of what Doxygen /// was able to scrape from the sources. This would be a major /// project, just something to think about if there's something we /// really don't like about the output Doxygen generates. Punt /// for now. bind9-9.9.5.dfsg/doc/doxygen/isc-header.html0000644000470500017500000000217312271526120020153 0ustar lamontlamont $title bind9-9.9.5.dfsg/doc/doxygen/Makefile.in0000644000470500017500000000231112271526120017320 0ustar lamontlamont# Copyright (C) 2006, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.4 2007/06/19 23:47:13 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ SUBDIRS = TARGETS = @BIND9_MAKE_RULES@ @BIND9_VERSION@ # Until and unless we decide to ship all umptyzillion Doxygen output # files, distclean for this directory implies docclean. doc docclean distclean:: rm -rf html xml doc:: BIND9_VERSION='${VERSION}' @DOXYGEN@ distclean:: rm -f Doxyfile doxygen-input-filter bind9-9.9.5.dfsg/doc/doxygen/isc-footer.html0000644000470500017500000000207212271526120020217 0ustar lamontlamont
    Generated on $datetime by Doxygen $doxygenversion for $projectname $projectnumber
    bind9-9.9.5.dfsg/doc/doxygen/Doxyfile.in0000644000470500017500000014647012271526120017405 0ustar lamontlamont# $Id: Doxyfile.in,v 1.2 2006/12/22 01:44:59 marka Exp $ # Doxyfile 1.4.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "BIND9 Internals" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = $(BIND9_VERSION) # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = @BIND9_TOP_BUILDDIR@/ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = @BIND9_TOP_BUILDDIR@/lib/isc \ @BIND9_TOP_BUILDDIR@/lib/dns \ @BIND9_TOP_BUILDDIR@/lib/isccfg \ @BIND9_TOP_BUILDDIR@/lib/isccc \ @BIND9_TOP_BUILDDIR@/lib/bind9 \ @BIND9_TOP_BUILDDIR@/bin/check \ @BIND9_TOP_BUILDDIR@/bin/dig \ @BIND9_TOP_BUILDDIR@/bin/dnssec \ @BIND9_TOP_BUILDDIR@/bin/named \ @BIND9_TOP_BUILDDIR@/bin/nsupdate \ @BIND9_TOP_BUILDDIR@/bin/rndc \ @BIND9_TOP_BUILDDIR@/doc/doxygen/mainpage # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.c *.h *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */win32/* */lib/dns/gen* */lib/dns/rdata/*.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = ./doxygen-input-filter # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = isc-header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = isc-footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = YES # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = YES # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = YES #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = YES # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = @PERL@ #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 1000 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # Local Variables: # compile-command: "doxygen" # End: bind9-9.9.5.dfsg/doc/arm/0002755000470500017500000000000012276444014014370 5ustar lamontlamontbind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch01.html0000644000470500017500000006172112271526120017007 0ustar lamontlamont Chapter 1. Introduction

    Chapter 1. Introduction

    The Internet Domain Name System (DNS) consists of the syntax to specify the names of entities in the Internet in a hierarchical manner, the rules used for delegating authority over names, and the system implementation that actually maps names to Internet addresses. DNS data is maintained in a group of distributed hierarchical databases.

    Scope of Document

    The Berkeley Internet Name Domain (BIND) implements a domain name server for a number of operating systems. This document provides basic information about the installation and care of the Internet Systems Consortium (ISC) BIND version 9 software package for system administrators.

    This version of the manual corresponds to BIND version 9.9.

    Organization of This Document

    In this document, Chapter 1 introduces the basic DNS and BIND concepts. Chapter 2 describes resource requirements for running BIND in various environments. Information in Chapter 3 is task-oriented in its presentation and is organized functionally, to aid in the process of installing the BIND 9 software. The task-oriented section is followed by Chapter 4, which contains more advanced concepts that the system administrator may need for implementing certain options. Chapter 5 describes the BIND 9 lightweight resolver. The contents of Chapter 6 are organized as in a reference manual to aid in the ongoing maintenance of the software. Chapter 7 addresses security considerations, and Chapter 8 contains troubleshooting help. The main body of the document is followed by several appendices which contain useful reference information, such as a bibliography and historic information related to BIND and the Domain Name System.

    Conventions Used in This Document

    In this document, we use the following general typographic conventions:

    To describe:

    We use the style:

    a pathname, filename, URL, hostname, mailing list name, or new term or concept

    Fixed width

    literal user input

    Fixed Width Bold

    program output

    Fixed Width

    The following conventions are used in descriptions of the BIND configuration file:

    To describe:

    We use the style:

    keywords

    Fixed Width

    variables

    Fixed Width

    Optional input

    [Text is enclosed in square brackets]

    The Domain Name System (DNS)

    The purpose of this document is to explain the installation and upkeep of the BIND (Berkeley Internet Name Domain) software package, and we begin by reviewing the fundamentals of the Domain Name System (DNS) as they relate to BIND.

    DNS Fundamentals

    The Domain Name System (DNS) is a hierarchical, distributed database. It stores information for mapping Internet host names to IP addresses and vice versa, mail routing information, and other data used by Internet applications.

    Clients look up information in the DNS by calling a resolver library, which sends queries to one or more name servers and interprets the responses. The BIND 9 software distribution contains a name server, named, and a resolver library, liblwres. The older libbind resolver library is also available from ISC as a separate download.

    Domains and Domain Names

    The data stored in the DNS is identified by domain names that are organized as a tree according to organizational or administrative boundaries. Each node of the tree, called a domain, is given a label. The domain name of the node is the concatenation of all the labels on the path from the node to the root node. This is represented in written form as a string of labels listed from right to left and separated by dots. A label need only be unique within its parent domain.

    For example, a domain name for a host at the company Example, Inc. could be ourhost.example.com, where com is the top level domain to which ourhost.example.com belongs, example is a subdomain of com, and ourhost is the name of the host.

    For administrative purposes, the name space is partitioned into areas called zones, each starting at a node and extending down to the leaf nodes or to nodes where other zones start. The data for each zone is stored in a name server, which answers queries about the zone using the DNS protocol.

    The data associated with each domain name is stored in the form of resource records (RRs). Some of the supported resource record types are described in the section called “Types of Resource Records and When to Use Them”.

    For more detailed information about the design of the DNS and the DNS protocol, please refer to the standards documents listed in the section called “Request for Comments (RFCs)”.

    Zones

    To properly operate a name server, it is important to understand the difference between a zone and a domain.

    As stated previously, a zone is a point of delegation in the DNS tree. A zone consists of those contiguous parts of the domain tree for which a name server has complete information and over which it has authority. It contains all domain names from a certain point downward in the domain tree except those which are delegated to other zones. A delegation point is marked by one or more NS records in the parent zone, which should be matched by equivalent NS records at the root of the delegated zone.

    For instance, consider the example.com domain which includes names such as host.aaa.example.com and host.bbb.example.com even though the example.com zone includes only delegations for the aaa.example.com and bbb.example.com zones. A zone can map exactly to a single domain, but could also include only part of a domain, the rest of which could be delegated to other name servers. Every name in the DNS tree is a domain, even if it is terminal, that is, has no subdomains. Every subdomain is a domain and every domain except the root is also a subdomain. The terminology is not intuitive and we suggest that you read RFCs 1033, 1034 and 1035 to gain a complete understanding of this difficult and subtle topic.

    Though BIND is called a "domain name server", it deals primarily in terms of zones. The master and slave declarations in the named.conf file specify zones, not domains. When you ask some other site if it is willing to be a slave server for your domain, you are actually asking for slave service for some collection of zones.

    Authoritative Name Servers

    Each zone is served by at least one authoritative name server, which contains the complete data for the zone. To make the DNS tolerant of server and network failures, most zones have two or more authoritative servers, on different networks.

    Responses from authoritative servers have the "authoritative answer" (AA) bit set in the response packets. This makes them easy to identify when debugging DNS configurations using tools like dig (the section called “Diagnostic Tools”).

    The Primary Master

    The authoritative server where the master copy of the zone data is maintained is called the primary master server, or simply the primary. Typically it loads the zone contents from some local file edited by humans or perhaps generated mechanically from some other local file which is edited by humans. This file is called the zone file or master file.

    In some cases, however, the master file may not be edited by humans at all, but may instead be the result of dynamic update operations.

    Slave Servers

    The other authoritative servers, the slave servers (also known as secondary servers) load the zone contents from another server using a replication process known as a zone transfer. Typically the data are transferred directly from the primary master, but it is also possible to transfer it from another slave. In other words, a slave server may itself act as a master to a subordinate slave server.

    Stealth Servers

    Usually all of the zone's authoritative servers are listed in NS records in the parent zone. These NS records constitute a delegation of the zone from the parent. The authoritative servers are also listed in the zone file itself, at the top level or apex of the zone. You can list servers in the zone's top-level NS records that are not in the parent's NS delegation, but you cannot list servers in the parent's delegation that are not present at the zone's top level.

    A stealth server is a server that is authoritative for a zone but is not listed in that zone's NS records. Stealth servers can be used for keeping a local copy of a zone to speed up access to the zone's records or to make sure that the zone is available even if all the "official" servers for the zone are inaccessible.

    A configuration where the primary master server itself is a stealth server is often referred to as a "hidden primary" configuration. One use for this configuration is when the primary master is behind a firewall and therefore unable to communicate directly with the outside world.

    Caching Name Servers

    The resolver libraries provided by most operating systems are stub resolvers, meaning that they are not capable of performing the full DNS resolution process by themselves by talking directly to the authoritative servers. Instead, they rely on a local name server to perform the resolution on their behalf. Such a server is called a recursive name server; it performs recursive lookups for local clients.

    To improve performance, recursive servers cache the results of the lookups they perform. Since the processes of recursion and caching are intimately connected, the terms recursive server and caching server are often used synonymously.

    The length of time for which a record may be retained in the cache of a caching name server is controlled by the Time To Live (TTL) field associated with each resource record.

    Forwarding

    Even a caching name server does not necessarily perform the complete recursive lookup itself. Instead, it can forward some or all of the queries that it cannot satisfy from its cache to another caching name server, commonly referred to as a forwarder.

    There may be one or more forwarders, and they are queried in turn until the list is exhausted or an answer is found. Forwarders are typically used when you do not wish all the servers at a given site to interact directly with the rest of the Internet servers. A typical scenario would involve a number of internal DNS servers and an Internet firewall. Servers unable to pass packets through the firewall would forward to the server that can do it, and that server would query the Internet DNS servers on the internal server's behalf.

    Name Servers in Multiple Roles

    The BIND name server can simultaneously act as a master for some zones, a slave for other zones, and as a caching (recursive) server for a set of local clients.

    However, since the functions of authoritative name service and caching/recursive name service are logically separate, it is often advantageous to run them on separate server machines. A server that only provides authoritative name service (an authoritative-only server) can run with recursion disabled, improving reliability and security. A server that is not authoritative for any zones and only provides recursive service to local clients (a caching-only server) does not need to be reachable from the Internet at large and can be placed inside a firewall.

    bind9-9.9.5.dfsg/doc/arm/man.isc-hmac-fixup.html0000644000470500017500000001203012271526120020631 0ustar lamontlamont isc-hmac-fixup

    Name

    isc-hmac-fixup — fixes HMAC keys generated by older versions of BIND

    Synopsis

    isc-hmac-fixup {algorithm} {secret}

    DESCRIPTION

    Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations.

    This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys. isc-hmac-fixup modifies those keys to restore compatibility.

    To modify a key, run isc-hmac-fixup and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.)

    SECURITY CONSIDERATIONS

    Secrets that have been converted by isc-hmac-fixup are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength."

    SEE ALSO

    BIND 9 Administrator Reference Manual, RFC 2104.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/isc-logo.eps0000644000470500017500000177021512271526120016622 0ustar lamontlamont%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: MacOS Roman %%Title: ISC_logo_only_RGB.eps %%Creator: Adobe Illustrator(R) 13.0 %%For: Brian Reid %%CreationDate: 3/25/10 %%BoundingBox: 0 0 118 46 %%HiResBoundingBox: 0 0 117.9991 45.0176 %%CropBox: 0 0 117.9991 45.0176 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %ADOBeginClientInjection: DocumentHeader "AI11EPS" %%AI8_CreatorVersion: 13.0.2 %AI9_PrintingDataBegin %ADO_BuildNumber: Adobe Illustrator(R) 13.0.2 x434 R agm 4.4379 ct 5.1039 %ADO_ContainsXMP: MainFirst %ADOEndClientInjection: DocumentHeader "AI11EPS" %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 %%+ procset Adobe_CoolType_Core 2.31 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. systemdict/setpacking known {currentpacking true setpacking}if userdict/Adobe_AGM_Utils 73 dict dup begin put /bdf {bind def}bind def /nd{null def}bdf /xdf {exch def}bdf /ldf {load def}bdf /ddf {put}bdf /xddf {3 -1 roll put}bdf /xpt {exch put}bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /gx {get exec}bdf /ps_level /languagelevel where{ pop systemdict/languagelevel gx }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr}stopped{-1}if def /set_gvm {currentglobal exch setglobal}bdf /reset_gvm {setglobal}bdf /makereadonlyarray { /packedarray where{pop packedarray }{ array astore readonly}ifelse }bdf /map_reserved_ink_name { dup type/stringtype eq{ dup/Red eq{ pop(_Red_) }{ dup/Green eq{ pop(_Green_) }{ dup/Blue eq{ pop(_Blue_) }{ dup()cvn eq{ pop(Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or { currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne { mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark }if }{ AGMUTIL_GSTATE_ht sethalftone }ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /AGMUTIL_cpd nd /capture_cpd{ //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf }def /thold_halftone { level3 {sethalftone currenthalftone} { dup/HalftoneType get 3 eq { sethalftone currenthalftone }{ begin Width Height mul{ Thresholds read{pop}if }repeat end currenthalftone }ifelse }ifelse }def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%)anchorsearch{pop}if }bdf /filter_cmyk { dup type/filetype ne{ exch()/SubFileDecode filter }{ exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length/AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ]cvx }bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get }bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type/filetype ne{ 0()/SubFileDecode filter }if [ exch [ /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx currentdict/srcStr get/readstring cvx/pop cvx /dup cvx/length cvx 0/gt cvx[ Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx names_index Names length currentdict/srcStr get length 1 sub{ 1/index cvx/exch cvx/get cvx currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx }for currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx ]cvx/if cvx /end cvx ]cvx bind /exec cvx ]cvx end }bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict/DataSource get def /origMultipleDataSources imageDict/MultipleDataSources get def /origDecode imageDict/Decode get def /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse { /imbufCnt imageDict/DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub{ /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put }for DeviceN_PS2{ imageDict begin /DataSource[DataSource/devn_sep_datasource cvx]cvx def /MultipleDataSources false def /Decode[0 1]def end }if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or{ /srcDataStrs[imageDict begin currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse { Width Decode length 2 div mul cvi string }repeat end]def imageDict begin /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def /Decode[0 1]def end }{ imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put imageDict/Decode[0 1]put }ifelse }ifelse imageDict exch load exec imageDict/DataSource origDataSource put imageDict/MultipleDataSources origMultipleDataSources put imageDict/Decode origDecode put end }bdf /write_image_file { begin {(AGMUTIL_imagefile)(w+)file}stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources{ 0 1 DataSource length 1 sub{ DataSource type dup /arraytype eq{ pop DataSource exch gx }{ /filetype eq{ DataSource exch get imbuf readstring pop }{ DataSource exch get }ifelse }ifelse AGMUTIL_imagefile exch writestring }for }{ DataSource type dup /arraytype eq{ pop DataSource exec }{ /filetype eq{ DataSource imbuf readstring pop }{ DataSource }ifelse }ifelse AGMUTIL_imagefile exch writestring }ifelse }for end true }ifelse end }bdf /close_image_file { AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile }def statusdict/product known userdict/AGMP_current_show known not and{ /pstr statusdict/product get def pstr(HP LaserJet 2200)eq pstr(HP LaserJet 4000 Series)eq or pstr(HP LaserJet 4050 Series )eq or pstr(HP LaserJet 8000 Series)eq or pstr(HP LaserJet 8100 Series)eq or pstr(HP LaserJet 8150 Series)eq or pstr(HP LaserJet 5000 Series)eq or pstr(HP LaserJet 5100 Series)eq or pstr(HP Color LaserJet 4500)eq or pstr(HP Color LaserJet 4600)eq or pstr(HP LaserJet 5Si)eq or pstr(HP LaserJet 1200 Series)eq or pstr(HP LaserJet 1300 Series)eq or pstr(HP LaserJet 4100 Series)eq or { userdict/AGMP_current_show/show load put userdict/show{ currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show}ifelse }put }if currentdict/pstr undef }if /consumeimagedata { begin AGMIMG_init_common currentdict/MultipleDataSources known not {/MultipleDataSources false def}if MultipleDataSources { DataSource 0 get type dup/filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch gx length exch 0 ne{pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup/filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height{pop DataSource flushbuffer readstring pop pop}for end }if dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [5 1 roll]bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs/TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs/TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type/dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf }if dup type/arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf }if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch{cvx}if }bdf /clonedict { dup length dict begin { dup type/dicttype eq {clonedict}if dup type/arraytype eq {clonearray}if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and }bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne{ dup/CSDBase known{ /CSDBase get/CSD get_res/Names known }{ pop false }ifelse }{ pop false }ifelse }bdf /DeviceN_NoneName { /Names where{ pop false Names { (None)eq or }forall }{ false }ifelse }bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup/arraytype eq exch/packedarraytype eq or { dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false }{ true }ifelse }{ true }ifelse }{ true }ifelse }bdf /base_colorspace_type { dup type/arraytype eq{0 get}if }bdf /currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5{cleartomark}bind def }{ /pdfmark_5{pdfmark}bind def }ifelse /ReadBypdfmark_5 { currentfile exch 0 exch/SubFileDecode filter /currentdistillerparams where {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse {flushfile cleartomark} {/PUT pdfmark}ifelse }bdf /xpdfm { { dup 0 get/Label eq { aload length[exch 1 add 1 roll/PAGELABEL }{ aload pop [{ThisPage}<<5 -2 roll>>/PUT }ifelse pdfmark_5 }forall }bdf /ds{ Adobe_AGM_Utils begin }bdf /dt{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict/setpacking known {setpacking}if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. systemdict/setpacking known { currentpacking true setpacking }if userdict/Adobe_AGM_Core 209 dict dup begin put /Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen[currentscreen]cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_Default_flatness nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_pattern_paint_type 0 def /knockout_unitsq nd currentglobal true setglobal [/CSA/Gradient/Procedure] { /Generic/Category findresource dup length dict copy/Category defineresource pop }forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer{readline}stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type/dicttype eq{ dup/HalftoneType get 1 eq{ /SpotFunction get }{ dup/HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if }def /np {newpath}bdf /clp_npth {clip np}def /eoclp_npth {eoclip np}def /npth_clp {np clip}def /graphic_setup { /AGMCORE_graphicsave save store concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth []0 setdash 10 setmiterlimit np false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias gx /Adobe_AGM_Image where{ pop Adobe_AGM_Image/spot_alias 2 copy known{ gx }{ pop pop }ifelse }if /sep_colorspace_dict null AGMCORE_gput 100 dict begin /dictstackcount countdictstack def /showpage{}def mark }def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub{end}for end AGMCORE_graphicsave restore }def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox np pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto }if AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def }{ AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def }ifelse }forall }bdf /AGMCORE_CMYKDeviceNColorspaces[ [/Separation/None/DeviceCMYK{0 0 0}] [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] [/Separation(Cyan)/DeviceCMYK{0 0 0}] [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] [/DeviceCMYK] ]def /ds{ Adobe_AGM_Core begin /currentdistillerparams where { pop currentdistillerparams/CoreDistVersion get 5000 lt {<>setdistillerparams}if }if /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict/AGM_handleerror known not{ errordict/AGM_handleerror errordict/handleerror get put errordict/handleerror{ Adobe_AGM_Core begin $error/newerror get AGMCORE_cur_err null ne and{ $error/newerror false put AGMCORE_cur_err compose_error_msg }if $error/newerror true put end errordict/AGM_handleerror get exec }bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err/AGMCORE_bad_environ def}if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_Default_flatness currentflat def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 14 def /AGMCORE_&gsave/gsave ldf /AGMCORE_&grestore/grestore ldf /AGMCORE_&grestoreall/grestoreall ldf /AGMCORE_&save/save ldf /AGMCORE_&setoverprint/setoverprint ldf /AGMCORE_gdictcopy{ begin {def}forall end }def /AGMCORE_gput{ AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget{ AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave{ AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge{limitcheck}if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore{ AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt{1 add}if dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall{ AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save{ AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge{limitcheck}if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub{ AGMCORE_gstack exch AGMCORE_gstackframekeys dict put }for }if level3/AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern/makepattern load def }if /currentcmykcolor[0 0 0 0]AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace[/DeviceGray]AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent()AGMCORE_gput /customcolor_tint 1 AGMCORE_gput /absolute_colorimetric_crd null AGMCORE_gput /relative_colorimetric_crd null AGMCORE_gput /saturation_crd null AGMCORE_gput /perceptual_crd null AGMCORE_gput currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf << /MaxPatternItem currentsystemparams/MaxPatternCache get >> setuserparams end }def /ps { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3{ 3 index add neg dup 0 lt{ pop 0 }if 3 1 roll }repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint {pop}ndf /currentoverprint {false}ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf }if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where{pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias{ /Name get exch pop }if dup dup(None)eq exch(All)eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq AGMUTIL_cpd/OverrideSeparations known and { AGMUTIL_cpd/OverrideSeparations get { /HqnSpots/ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not }{ gsave [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace false AGMUTIL_cpd/SeparationColorNames 2 copy known { get {AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where{pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup(Cyan)eq exch dup(Magenta)eq 3 -1 roll or exch dup(Yellow)eq 3 -1 roll or exch dup(Black)eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup(Cyan)eq exch dup(Magenta)eq 3 -1 roll or exch dup(Yellow)eq 3 -1 roll or exch (Black)eq or and }forall not }{pop false}ifelse }{ false exch { /PhotoshopDuotoneList where{pop false}{true}ifelse { dup(Cyan)eq exch dup(Magenta)eq 3 -1 roll or exch dup(Yellow)eq 3 -1 roll or exch dup(Black)eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } { convert_spot_to_process or } ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup/Cyan eq 1 index(Cyan)eq or {pop(_cyan_)}if dup/Magenta eq 1 index(Magenta)eq or {pop(_magenta_)}if dup/Yellow eq 1 index(Yellow)eq or {pop(_yellow_)}if dup/Black eq 1 index(Black)eq or {pop(_black_)}if }def dup type/arraytype eq {[exch{filtername}forall]} {filtername}ifelse end }def level3{ /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup(Cyan)eq exch/Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup(Magenta)eq exch/Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup(Yellow)eq exch/Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup(Black)eq exch/Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type/stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string/string_in xdf /string_out 1 string def /component xdf [ data_in string_in/readstring cvx [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx [/pop cvx()]cvx/ifelse cvx ]cvx/ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type/dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict/Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode[1 1]def}if }if FunctionType 2 eq { paint? { /C0[C0 channel get 1 exch sub]def /C1[C1 channel get 1 exch sub]def }{ /C0[1]def /C1[1]def }ifelse }if FunctionType 3 eq { /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def }if currentdict/Range known {/Range[0 1]def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict/Function known { currentdict/Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf /ColorSpace[/DeviceGray]def }{ ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq { /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get/Separation eq { { [1/exch cvx/sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx }{ pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2/DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup/ColorSpace get dup type/arraytype ne {[exch]}if dup 0 get/DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get/Separation eq { exch begin ColorSpace 1 get dup/None ne exch/All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get/exec cvx 4 AGMCORE_plate_ndx sub -1/roll cvx 4 1/roll cvx 3[/pop cvx]cvx/repeat cvx 1/exch cvx/sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get/DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get/exec cvx 4 AGMCORE_plate_ndx sub -1/roll cvx 4 1/roll cvx 3[/pop cvx]cvx/repeat cvx 1/exch cvx/sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace[/DeviceGray]def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not { exch begin ColorSpace dup type/arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get/CIEBasedA eq { /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def }if ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or { /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def }if ColorSpace 0 get/CIEBasedDEFG eq { /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup/AGMCORE_ignoreshade known { begin /ColorSpace[/Separation(None)/DeviceGray{}]def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup/AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup/PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading/AGMCORE_ignoreshade known currentdict end exch {pop<>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4{4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf end [/Separation 4 -1 roll/DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation(All)/DeviceGray{}]setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval{255 div}forall }bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index }bdf /n_color_components { base_colorspace_type dup/DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo/moveto ldf /li/lineto ldf /cv/curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2/setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace/setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup/arraytype eq exch/packedarraytype eq or { /AGMCORE_SpotAliasAry2 where{ begin dup 0 get dup/Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get[ exch{ current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name }forall ]1 xpt }if }ifelse end }if }if }def /setcolorspace { dup type dup/arraytype eq exch/packedarraytype eq or { dup 0 get/Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1[8 0 0 8 0 0]{}image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput }def /currentcolorspace { /currentcolorspace AGMCORE_gget }def /setcolor_devicecolor { base_colorspace_type dup/DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup/DeviceGray ne{ dup/DeviceCMYK ne{ dup/DeviceRGB ne{ dup/Separation eq{ pop currentcolorspace 3 gx currentcolorspace 2 get }{ dup/Indexed eq{ pop currentcolorspace 3 get dup type/stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err/AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor }def }ifelse /sop/setoverprint ldf /lw/setlinewidth ldf /lc/setlinecap ldf /lj/setlinejoin ldf /ml/setmiterlimit ldf /dsh/setdash ldf /sadj/setstrokeadjust ldf /gry/setgray ldf /rgb/setrgbcolor ldf /cmyk[ /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx /setcmykcolor load dup type/operatortype ne{/exec cvx}if ]cvx bdf level3 AGMCORE_host_sep not and{ /nzopmsc{ 6 dict begin /kk exch def /yy exch def /mm exch def /cc exch def /sum 0 def cc 0 ne{/sum sum 2#1000 or def cc}if mm 0 ne{/sum sum 2#0100 or def mm}if yy 0 ne{/sum sum 2#0010 or def yy}if kk 0 ne{/sum sum 2#0001 or def kk}if AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace sum 0 eq{0}if end setcolor }bdf }{ /nzopmsc/cmyk ldf }ifelse /sep/setsepcolor ldf /devn/setdevicencolor ldf /idx/setindexedcolor ldf /colr/setcolor ldf /csacrd/set_csa_crd ldf /sepcs/setsepcolorspace ldf /devncs/setdevicencolorspace ldf /idxcs/setindexedcolorspace ldf /cp/closepath ldf /clp/clp_npth ldf /eclp/eoclp_npth ldf /f/fill ldf /ef/eofill ldf /@/stroke ldf /nclp/npth_clp ldf /gset/graphic_setup ldf /gcln/graphic_cleanup ldf /ct/concat ldf /cf/currentfile ldf /fl/filter ldf /rs/readstring ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin/clonedict load end def /clonearray Adobe_AGM_Utils begin/clonearray load end def currentdict{ dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type/stringtype eq{indx get}if exch Scaling exch get aload pop 3 1 roll mul add }for ColorSpaceFamily/Separation eq {sep} { ColorSpaceFamily/DeviceN eq {devn}{setcolor}ifelse }ifelse }bdf /sssetbackground{ aload pop ColorSpaceFamily/Separation eq {sep} { ColorSpaceFamily/DeviceN eq {devn}{setcolor}ifelse }ifelse }bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where{pop/setinkoverprint{pop}def}if gsave BBox length 0 gt { np BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip np }if c1x c2x eq { c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse }{ /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if }ifelse gsave clippath c1x c1y translate theta rotate -90 rotate {pathbbox}stopped {0 0 0 0}if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end }{ /max{2 copy gt{pop}{exch pop}ifelse}bdf /min{2 copy lt{pop}{exch pop}ifelse}bdf rampdict begin 40 dict begin background length 0 gt{background sssetbackground gsave clippath fill grestore}if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill }{ c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill }{ /AA r2 r1 sub c2y div def AA -1 eq {/theta 89.99 def} {/theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def }{ /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill }ifelse }ifelse }ifelse }if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt{exch}if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def }if }if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def np xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke }{ 0 numsteps { dup subsampling{round cvi}if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add }repeat pop }ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill }{ c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill }{ c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill }{ /AA r2 r1 sub c2y div def AA -1 eq {/theta 89.99 def} {/theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def }{ /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill }ifelse }ifelse }ifelse }if grestore grestore end end end }ifelse }bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where{pop/setinkoverprint{pop}def}if gsave BBox length 0 gt { np BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip np }if x1 x2 eq { y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse }{ /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if } ifelse gsave clippath x1 y1 translate theta rotate {pathbbox}stopped {0 0 0 0}if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end }{ rampdict begin 20 dict begin background length 0 gt{background sssetbackground gsave clippath fill grestore}if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt{exch}if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def }if }if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill }if }if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling{round cvi}if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add }repeat pop ext1{ xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill }if }if grestore grestore end end end }ifelse }bdf }def /pt { end }def /dt{ }def /pgsv{ //Adobe_AGM_Core/AGMCORE_save save put }def /pgrs{ //Adobe_AGM_Core/AGMCORE_save get restore }def systemdict/findcolorrendering known{ /findcolorrendering systemdict/findcolorrendering get def }if systemdict/setcolorrendering known{ /setcolorrendering systemdict/setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup//Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name/MappedCSA xdf}ifelse }def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup/sep_tint exch AGMCORE_gput TintProc end }def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt }for TintProc end }def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2{AGMCORE_tmp mul NComponents 1 roll}repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll }repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end }def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end }def /sep_proc_name { dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ pop[/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse }def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup/sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup()eq exch(All)eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx ]setcolorspace_opt /TintProc{ 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get/DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc[ Components aload pop Name findcmykcustomcolor /exch cvx/setcustomcolor cvx ]cvx bdf }{ AGMCORE_host_sep Name(All)eq and{ /TintProc{ 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and AGMCORE_host_sep or Name()eq and{ /TintProc[ MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ cvx/setcmykcolor cvx }{ cvx/setgray cvx }ifelse ]cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc[ /dup cvx MappedCSA sep_proc_name cvx exch 0 get/DeviceGray eq{ 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx }if /Name cvx/findcmykcustomcolor cvx/exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load/exec cvx /not cvx/and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ]cvx/if cvx /setcustomcolor cvx ]cvx bdf }{ /TintProc{setcolor}bdf [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end }def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add/index cvx c1/get cvx/mul cvx }for numarrays 1 add 1/roll cvx }for numarrays[/pop cvx]cvx/repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add/index cvx c1/get cvx/sub cvx/mul cvx }for /sub cvx numarrays 1 add 1/roll cvx }for numarrays[/pop cvx]cvx/repeat cvx end }def /exec_tint_transform { /TintProc[ /TintTransform cvx/setcolor cvx ]cvx bdf MappedCSA setcolorspace_opt }bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length{pop}repeat end }bdf /setdevicencolorspace { dup/AliasedColorants known{false}{true}ifelse current_spot_alias and{ 7 dict begin /names_index 0 def dup/names_len exch/Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup/Names get { dup map_alias{ exch pop dup/ColorLookup known{ dup begin new_LookupTables names_index ColorLookup put end }{ dup/Components known{ dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index[null null null null]put end }ifelse }ifelse new_names names_index 3 -1 roll/Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup/LookupTables known{ dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index[null null null null]put end }ifelse }ifelse /names_index names_index 1 add def }forall alias_cnt 0 gt{ /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def 0 1 names_len 1 sub{ /names_index xdf new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ /AliasedColorants false def exit }{ new_LookupTables names_index get 0 get null eq{ dup/Names get names_index get/name xdf name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq or or or not{ /AliasedColorants false def exit }if }if }ifelse }for lut_entry_len 1 eq{ /AliasedColorants false def }if AliasedColorants{ dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def currentdict/TTTablesIdx known not{ /TTTablesIdx -1 def }if end }if }if end }if dup/devicen_colorspace_dict exch AGMCORE_gput begin currentdict/AliasedColorants known{ AliasedColorants }{ false }ifelse dup not{ CSA map_csa }if /TintTransform load type/nulltype eq or{ /TintTransform[ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup(Cyan)eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup(Magenta)eq { pop exch LookupTables length exch sub /index cvx 0/exch cvx 0 0 }{ (Yellow)eq { exch LookupTables length exch sub /index cvx 0 0 3 -1/roll cvx 0 }{ exch LookupTables length exch sub /index cvx 0 0 0 4 -1/roll cvx }ifelse }ifelse }ifelse 5 -1/roll cvx/astore cvx }{ dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx/mul cvx/round cvx/cvi cvx/get cvx }ifelse Names length TTTablesIdx add 1 add 1/roll cvx }for Names length[/pop cvx]cvx/repeat cvx NComponents Names length TintMethod/Subtractive eq { subtractive_blend }{ additive_blend }ifelse ]cvx bdf }if AGMCORE_host_sep{ Names convert_to_process{ exec_tint_transform } { currentdict/AliasedColorants known{ AliasedColorants not }{ false }ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants{ /currentspotalias current_spot_alias def false set_spot_alias }if Names{ AGMCORE_is_cmyk_sep{ dup(Cyan)eq AGMCORE_cyan_plate and exch dup(Magenta)eq AGMCORE_magenta_plate and exch dup(Yellow)eq AGMCORE_yellow_plate and exch (Black)eq AGMCORE_black_plate and or or or{ /devicen_colorspace_dict AGMCORE_gget/TintProc[ Names names_index/devn_makecustomcolor cvx ]cvx ddf /painted? true def }if painted?{exit}if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ /devicen_colorspace_dict AGMCORE_gget/TintProc[ Names names_index/devn_makecustomcolor cvx ]cvx ddf /painted? true def exit }if }ifelse /names_index names_index 1 add def }forall AvoidAliasedColorants{ currentspotalias set_spot_alias }if painted?{ /devicen_colorspace_dict AGMCORE_gget/names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget/TintProc[ names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx 0 0 0 0/setcmykcolor cvx ]cvx ddf }ifelse end }ifelse } { AGMCORE_in_rip_sep{ Names convert_to_process not }{ level3 }ifelse { [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and{ [ Names/length cvx[/pop cvx]cvx/repeat cvx ]cvx bdf }{ {setcolor}bdf }ifelse }{ exec_tint_transform }ifelse }ifelse set_crd /AliasedColorants false def end }def /setindexedcolorspace { dup/indexed_colorspace_dict exch AGMCORE_gput begin currentdict/CSDBase known{ CSDBase/CSD get_res begin currentdict/Names known{ currentdict devncs }{ 1 currentdict sepcs }ifelse AGMCORE_host_sep{ 4 dict begin /compCnt/Names where{pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal{ /tableIndex xdf Lookup dup type/stringtype eq{ compCnt tableIndex map_index }{ exec }ifelse /Names where{ pop setdevicencolor }{ setsepcolor }ifelse currentgray tableIndex exch 255 mul cvi NewLookup 3 1 roll put }for [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt end }{ level3 { currentdict/Names known{ [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt }{ [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt }ifelse }{ [/Indexed MappedCSA HiVal [ currentdict/Names known{ Lookup dup type/stringtype eq {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} {/exec cvx}ifelse /TintTransform load/exec cvx }{ Lookup dup type/stringtype eq {/exch cvx/get cvx 255/div cvx} {/exec cvx}ifelse CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx }ifelse ]cvx ]setcolorspace_opt }ifelse }ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ pop[/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval{}forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end }bind }{ Lookup }ifelse }ifelse ]setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep{ /indexed_colorspace_dict AGMCORE_gget begin currentdict/CSDBase known{ CSDBase/CSD get_res begin currentdict/Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end }{ Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll map_index MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse }ifelse end }{ level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin map_indexed_devn devn end } { setcolor }ifelse }ifelse }def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode[0 1]def /DataSourcedef /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict/image gx grestore }if consumeimagedata }def /add_res { dup/CSD eq{ pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop }ifelse }def /del_res { { aload pop exch dup/CSD eq{ pop {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall }{ exch {1 index undefineresource}forall pop }ifelse }forall }def /get_res { dup/CSD eq{ pop dup type dup/nametype eq exch/stringtype eq or{ AGMCORE_CSD_cache exch get }if }{ findresource }ifelse }def /get_csa_by_name { dup type dup/nametype eq exch/stringtype eq or{ /CSA get_res }if }def /paintproc_buf_init { /count get 0 0 put }def /paintproc_buf_next { dup/count get dup 0 get dup 3 1 roll 1 add 0 xpt get }def /cachepaintproc_compress { 5 dict begin currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def /ppdict 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal ppdict 1 array dup 0 1 put/count xpt setglobal /LZWFilter { exch dup length 0 eq{ pop }{ ppdict dup length 1 sub 3 -1 roll put }ifelse {string_size}{0}ifelse string }/LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not{exit}if }loop LZWFilter closefile ppdict end }def /cachepaintproc { 2 dict begin currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def /ppdict 20 dict def currentglobal true setglobal ppdict 1 array dup 0 1 put/count xpt setglobal { ReadFilter 16000 string readstring exch ppdict dup length 1 sub 3 -1 roll put not{exit}if }loop ppdict dup dup length 1 sub()put end }def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul/xshift exch neg def BBox 1 get YStep div cvi YStep mul/yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [xshift yshift/translate load null/exec load]dup 3/PaintProc load put cvx/PaintProc exch def end gsave 0 setgray makepattern grestore }def /set_pattern { dup/PatternType get 1 eq{ dup/PaintType get 1 eq{ currentoverprint sop[/DeviceGray]setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{pop}{setcolorspace}ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get } { Intent/AbsoluteColorimetric eq { /absolute_colorimetric_crd AGMCORE_gget dup null eq } { Intent/RelativeColorimetric eq { /relative_colorimetric_crd AGMCORE_gget dup null eq } { Intent/Saturation eq { /saturation_crd AGMCORE_gget dup null eq } { /perceptual_crd AGMCORE_gget dup null eq }ifelse }ifelse }ifelse { pop null } { /RenderingIntent known{null}{Intent}ifelse }ifelse }ifelse Intent ne{ Intent/ColorRendering{findresource}stopped { pop pop systemdict/findcolorrendering known { Intent findcolorrendering { /ColorRendering findresource true exch } { /ColorRendering findresource product(Xerox Phaser 5400)ne exch }ifelse dup Intent/AbsoluteColorimetric eq { /absolute_colorimetric_crd exch AGMCORE_gput } { Intent/RelativeColorimetric eq { /relative_colorimetric_crd exch AGMCORE_gput } { Intent/Saturation eq { /saturation_crd exch AGMCORE_gput } { Intent/Perceptual eq { /perceptual_crd exch AGMCORE_gput } { pop }ifelse }ifelse }ifelse }ifelse 1 index{exch}{pop}ifelse } {false}ifelse } {true}ifelse { dup begin currentdict/TransformPQR known{ currentdict/TransformPQR get aload pop 3{{}eq 3 1 roll}repeat or or } {true}ifelse currentdict/MatrixPQR known{ currentdict/MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true}ifelse end or { clonedict begin /TransformPQR[ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind ]def /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def currentdict end }if setcolorrendering_opt }if }if }def /set_crd { AGMCORE_host_sep not level2 and{ currentdict/ColorRendering known{ ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type/arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /set_ucrbg { dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp)flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep)flushinput }if }def /cpaint_gend {np}def /T1_path { currentfile token pop currentfile token pop mo { currentfile token pop dup type/stringtype eq {pop exit}if 0 exch rlineto currentfile token pop dup type/stringtype eq {pop exit}if 0 rlineto }loop }def /T1_gsave level3 {/clipsave} {/gsave}ifelse load def /T1_grestore level3 {/cliprestore} {/grestore}ifelse load def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0}ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup/Name get map_alias{/CSD put}{pop}ifelse}forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get/CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not{ //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put }if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { //Adobe_AGM_Core begin dup/customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias /sep_colorspace_dict AGMCORE_gget null ne 3 1 roll 2 index{ exch pop/sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop not{/sep_tint 1.0 AGMCORE_gput}if pop true set_spot_alias }{ AGMCORE_&setcustomcolor }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd/setpagedevice load def /setpagedevice{get_gstate spd set_gstate}def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known AGMCORE_distilling not and{ currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ <>setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer AGMCORE_distilling{ erasepage }{ gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore }ifelse }if end }def /lw_save_restore_override{ /md where{ pop md begin initializepage /initializepage{}def /pmSVsetup{}def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage/showpage load def} ifelse /showpage{orig_showpage gR}def end }if }def /pscript_showpage_override{ /NTPSOct95 where { begin showpage save /showpage/restore load def /restore{exch pop}def end }if }def /driver_media_override { /md where{ pop md/initializepage known{ md/initializepage{}put }if md/rC known{ md/rC{4{pop}repeat}put }if }if /mysetup where{ /mysetup[1 0 0 1 0 0]put }if Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq { Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def /AGMCORE_invalid_color_space(This job contains an invalid color space. )def end /set_def_ht {AGMCORE_def_ht sethalftone}def /set_def_flat {AGMCORE_Default_flatness setflat}def end systemdict/setpacking known {setpacking}if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.31 0 %%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.31 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} if userdict/Adobe_CoolType_Core 70 dict dup begin put /Adobe_CoolType_Version 2.31 def /Level2? systemdict/languagelevel known dup {pop systemdict/languagelevel get 2 ge} if def Level2? not { /currentglobal false def /setglobal/pop load def /gcheck{pop false}bind def /currentpacking false def /setpacking/pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal currentglobal true setglobal userdict/Adobe_CoolType_GVMFonts known not {userdict/Adobe_CoolType_GVMFonts 10 dict put} if setglobal currentglobal false setglobal userdict/Adobe_CoolType_LVMFonts known not {userdict/Adobe_CoolType_LVMFonts 10 dict put} if setglobal /ct_VMDictPut { dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse 3 1 roll put }bind def /ct_VMDictUndef { dup Adobe_CoolType_GVMFonts exch known {Adobe_CoolType_GVMFonts exch undef} { dup Adobe_CoolType_LVMFonts exch known {Adobe_CoolType_LVMFonts exch undef} {pop} ifelse }ifelse }bind def /ct_str1 1 string def /ct_xshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_yshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { _ct_x _ct_y moveto 0 exch rmoveto } ifelse /_ct_i _ct_i 1 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /ct_xyshow { /_ct_na exch def /_ct_i 0 def currentpoint /_ct_y exch def /_ct_x exch def { pop pop ct_str1 exch 0 exch put ct_str1 show {_ct_na _ct_i get}stopped {pop pop} { {_ct_na _ct_i 1 add get}stopped {pop pop pop} { _ct_x _ct_y moveto rmoveto } ifelse } ifelse /_ct_i _ct_i 2 add def currentpoint /_ct_y exch def /_ct_x exch def } exch @cshow }bind def /xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def /ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def /xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def currentglobal true setglobal /ct_T3Defs { /BuildChar { 1 index/Encoding get exch get 1 index/BuildGlyph get exec }bind def /BuildGlyph { exch begin GlyphProcs exch get exec end }bind def }bind def setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup/args 7 index 5 add array put put get } { get dup/args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch/args exch put } {pop} ifelse } ifelse begin count 1 sub 1 index lt {pop count} if dup/argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } {pop} ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end }bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt {{pop}repeat} {pop} ifelse args 0 argCount getinterval{}forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt {{end}repeat} {pop} ifelse }bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end }bind def /@Raise { exch cvx exch errordict exch get exec stop }bind def /@ReRaise { cvx $error/errorname get errordict exch get exec stop }bind def /@Stopped { 0 @#Stopped }bind def /@#Stopped { @_SaveStackLevels stopped {@_RestoreStackLevels true} {@_PopStackLevels false} ifelse }bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end }bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put begin count @_SaveStackLevels {(*){pop stop}128 string/Category resourceforall} stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq {pop exit} if } loop } if } { pop end } ifelse } {false} ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark {/steveamerige/Category resourcestatus} stopped {cleartomark true} {cleartomark currentglobal not} ifelse } {false} ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse end }bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad/ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup/CMap CTHasResourceStatusBug {CTResourceStatus} {resourcestatus} ifelse { pop dup 0 eq exch 1 eq or { dup/CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug {exit} {stop} ifelse } ifelse } {pop} ifelse } 128 string/CMap resourceforall } stopped {cleartomark} stopped pop setglobal } if } if }bind def /ds { Adobe_CoolType_Core begin CTWorkAroundBugs /mo/moveto load def /nf/newencodedfont load def /msf{makefont setfont}bind def /uf{dup undefinefont ct_VMDictUndef}bind def /ur/undefineresource load def /chp/charpath load def /awsh/awidthshow load def /wsh/widthshow load def /ash/ashow load def /@xshow/xshow load def /@yshow/yshow load def /@xyshow/xyshow load def /@cshow/cshow load def /sh/show load def /rp/repeat load def /.n/.notdef def end currentglobal false setglobal userdict/Adobe_CoolType_Data 2 copy known not {2 copy 10 dict put} if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal }bind def /dt { currentdict Adobe_CoolType_Core eq {end} if }bind def /ps { Adobe_CoolType_Core begin Adobe_CoolType_GVMFonts begin Adobe_CoolType_LVMFonts begin SharedFontDirectory begin }bind def /pt { end end end end }bind def /unload { systemdict/languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known {undef} {pop pop} ifelse } if } if }bind def /ndf { 1 index where {pop pop pop} {dup xcheck{bind}if def} ifelse }def /findfont systemdict begin userdict begin /globaldict where{/globaldict get begin}if dup where pop exch get /globaldict where{pop end}if end end Adobe_CoolType_Core_Defined {/systemfindfont exch def} { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont {pop}ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq{0}{dup length}ifelse 2 index length add 1 add dict begin exch { 1 index/FID eq {pop pop} {def} ifelse } forall dup null eq {pop} {{def}forall} ifelse currentdict end exch setglobal }bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal }bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } { FontDirectory 3 index known {FontDirectory 3 index get/FontReferenced known} { SharedFontDirectory 3 index known {SharedFontDirectory 3 index get/FontReferenced known} {false} ifelse } ifelse } ifelse dup { 3 index findfont/FontReferenced get 2 index dup type/nametype eq {findfont} if ne {pop false} if } if dup { 1 index dup type/nametype eq {findfont} if dup/CharStrings known { /CharStrings get length 4 index findfont/CharStrings get length ne { pop false } if } {pop} ifelse } if { pop 1 index findfont /Encoding get exch 0 1 255 {2 copy get 3 index 3 1 roll put} for pop pop pop } { currentglobal 4 1 roll dup type/nametype eq {findfont} if dup gcheck setglobal dup dup maxlength 2 add dict begin exch { 1 index/FID ne 2 index/Encoding ne and {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type/stringtype eq{cvn}if def dup currentdict end definefont ct_VMDictPut setglobal } ifelse }bind def /SetSubstituteStrategy { $SubstituteFont begin dup type/dicttype ne {0 dict} if currentdict/$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin {def}forall {def}forall currentdict dup/$Init known {dup/$Init get exec} if end /$Strategy exch def } {pop pop pop} ifelse } {pop pop} ifelse end }bind def /scff { $SubstituteFont begin dup type/stringtype eq {dup length exch} {null} ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } {$sname} ifelse def end {findfont} @Stopped { dup length 8 add string exch 1 index 0(BadFont:)putinterval 1 index exch 8 exch dup length string cvs putinterval cvn {findfont} @Stopped {pop/Courier findfont} if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end }bind def /isWidthsOnlyFont { dup/WidthsOnly known {pop pop true} { dup/FDepVector known {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} { dup/FDArray known {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} {pop} ifelse } ifelse } ifelse }bind def /ct_StyleDicts 4 dict dup begin /Adobe-Japan1 4 dict dup begin Level2? { /Serif /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMin-W3} { /CIDFont/Category resourcestatus { pop pop /HeiseiMin-W3/CIDFont resourcestatus {pop pop/HeiseiMin-W3} {/Ryumin-Light} ifelse } {/Ryumin-Light} ifelse } ifelse def /SansSerif /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiKakuGo-W5} { /CIDFont/Category resourcestatus { pop pop /HeiseiKakuGo-W5/CIDFont resourcestatus {pop pop/HeiseiKakuGo-W5} {/GothicBBB-Medium} ifelse } {/GothicBBB-Medium} ifelse } ifelse def /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus {pop pop/HeiseiMaruGo-W4} { /CIDFont/Category resourcestatus { pop pop /HeiseiMaruGo-W4/CIDFont resourcestatus {pop pop/HeiseiMaruGo-W4} { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } { /Jun101-Light-RKSJ-H/Font resourcestatus {pop pop/Jun101-Light} {SansSerif} ifelse } ifelse } ifelse /RoundSansSerif exch def /Default Serif def } { /Serif/Ryumin-Light def /SansSerif/GothicBBB-Medium def { (fonts/Jun101-Light-83pv-RKSJ-H)status }stopped {pop}{ {pop pop pop pop/Jun101-Light} {SansSerif} ifelse /RoundSansSerif exch def }ifelse /Default Serif def } ifelse end def /Adobe-Korea1 4 dict dup begin /Serif/HYSMyeongJo-Medium def /SansSerif/HYGoThic-Medium def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-GB1 4 dict dup begin /Serif/STSong-Light def /SansSerif/STHeiti-Regular def /RoundSansSerif SansSerif def /Default Serif def end def /Adobe-CNS1 4 dict dup begin /Serif/MKai-Medium def /SansSerif/MHei-Medium def /RoundSansSerif SansSerif def /Default Serif def end def end def Level2?{currentglobal true setglobal}if /ct_BoldRomanWidthProc { stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth 0 0 }bind def /ct_Type0WidthProc { dup stringwidth 0 0 moveto 2 index true charpath pathbbox 0 -1 7 index 2 div .88 setcachedevice2 pop 0 0 }bind def /ct_Type0WMode1WidthProc { dup stringwidth pop 2 div neg -0.88 2 copy moveto 0 -1 5 -1 roll true charpath pathbbox setcachedevice }bind def /cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_BoldBaseFont 11 dict begin /FontType 3 def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /Encoding cHexEncoding def /_setwidthProc/ct_BoldRomanWidthProc load def /_bcstr1 1 string def /BuildChar { exch begin _basefont setfont _bcstr1 dup 0 4 -1 roll put dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def systemdict/composefont known { /ct_DefineIdentity-H { /Identity-H/CMap resourcestatus { pop pop } { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse } def /ct_BoldBaseCIDFont 11 dict begin /CIDFontType 1 def /CIDFontName/ct_BoldBaseCIDFont def /FontMatrix[1 0 0 1 0 0]def /FontBBox[0 0 1 1]def /_setwidthProc/ct_Type0WidthProc load def /_bcstr2 2 string def /BuildGlyph { exch begin _basefont setfont _bcstr2 1 2 index 256 mod put _bcstr2 0 3 -1 roll 256 idiv put _bcstr2 dup _setwidthProc 3 copy moveto show _basefonto setfont moveto show end }bind def currentdict end def }if Level2?{setglobal}if /ct_CopyFont{ { 1 index/FID ne 2 index/UniqueID ne and {def}{pop pop}ifelse }forall }bind def /ct_Type0CopyFont { exch dup length dict begin ct_CopyFont [ exch FDepVector { dup/FontType get 0 eq { 1 index ct_Type0CopyFont /_ctType0 exch definefont } { /_ctBaseFont exch 2 index exec } ifelse exch } forall pop ] /FDepVector exch def currentdict end }bind def /ct_MakeBoldFont { dup/ct_SyntheticBold known { dup length 3 add dict begin ct_CopyFont /ct_StrokeWidth .03 0 FontMatrix idtransform pop def /ct_SyntheticBold true def currentdict end definefont } { dup dup length 3 add dict begin ct_CopyFont /PaintType 2 def /StrokeWidth .03 0 FontMatrix idtransform pop def /dummybold currentdict end definefont dup/FontType get dup 9 ge exch 11 le and { ct_BoldBaseCIDFont dup length 3 add dict copy begin dup/CIDSystemInfo get/CIDSystemInfo exch def ct_DefineIdentity-H /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefont exch def /_Type0Identity/Identity-H 3 -1 roll[exch]composefont /_basefonto exch def currentdict end /CIDFont defineresource } { ct_BoldBaseFont dup length 3 add dict copy begin /_basefont exch def /_basefonto exch def currentdict end definefont } ifelse } ifelse }bind def /ct_MakeBold{ 1 index 1 index findfont currentglobal 5 1 roll dup gcheck setglobal dup /FontType get 0 eq { dup/WMode known{dup/WMode get 1 eq}{false}ifelse version length 4 ge and {version 0 4 getinterval cvi 2015 ge} {true} ifelse {/ct_Type0WidthProc} {/ct_Type0WMode1WidthProc} ifelse ct_BoldBaseFont/_setwidthProc 3 -1 roll load put {ct_MakeBoldFont}ct_Type0CopyFont definefont } { dup/_fauxfont known not 1 index/SubstMaster known not and { ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put ct_MakeBoldFont } { 2 index 2 index eq {exch pop } { dup length dict begin ct_CopyFont currentdict end definefont } ifelse } ifelse } ifelse pop pop pop setglobal }bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 1 index def /$doSmartSub false def end dup findfont $SubstituteFont begin $substituteFound {false} { dup/FontName known { dup/FontName get $fontname eq 1 index/DistillerFauxFont known not and /currentdistillerparams where {pop false 2 index isWidthsOnlyFont not and} if } {false} ifelse } ifelse exch pop /$doSmartSub true def end { 5 1 roll pop pop pop pop findfont } { 1 index findfont dup/FontType get 3 eq { 6 1 roll pop pop pop pop pop false } {pop true} ifelse { $SubstituteFont begin pop pop /$styleArray 1 index def /$regOrdering 2 index def pop pop 0 1 $styleArray length 1 sub { $styleArray exch get ct_StyleDicts $regOrdering 2 copy known { get exch 2 copy known not {pop/Default} if get dup type/nametype eq { ?str1 cvs length dup 1 add exch ?str1 exch(-)putinterval exch dup length exch ?str1 exch 3 index exch putinterval add ?str1 exch 0 exch getinterval cvn } { pop pop/Unknown } ifelse } { pop pop pop pop/Unknown } ifelse } for end findfont }if } ifelse currentglobal false setglobal 3 1 roll null copyfont definefont pop setglobal }bind def setpacking userdict/$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known {get} {pop pop{pop/Courier}bind} ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams/CannotEmbedFontPolicy 2 copy known {get/Error eq} {pop pop false} ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup/WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type/stringtype eq{cvn}if def /FontType 3 def /FontMatrix[.001 0 0 .001 0 0]def /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def /FontBBox[0 0 0 0]def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth/y exch def/x exch def x y setcharwidth $SubstituteFont/$Strategy get/$Underprint get exec 0 0 moveto cc show x y moveto end end }bind def currentdict end exch setglobal }bind def /$GetaTint 2 dict dup begin /$BuildFont { dup/WMode known {dup/WMode get} {0} ifelse /$WMode exch def $fontname exch dup/FontName known { dup/FontName get dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse exch Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index/FontName get known { pop Adobe_CoolType_Data/InVMDeepCopiedFonts get 1 index get null copyfont } {$deepcopyfont} ifelse exch 1 index exch/FontBasedOn exch put dup/FontName $fontname dup type/stringtype eq{cvn}if put definefont Adobe_CoolType_Data/InVMDeepCopiedFonts get begin dup/FontBasedOn get 1 index def end }bind def /$Underprint { gsave x abs y abs gt {/y 1000 def} {/x -1000 def 500 120 translate} ifelse Level2? { [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] setcolorspace } {0 setgray} ifelse 10 setlinewidth x .8 mul [7 3] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? {.2 setcolor} {.8 setgray} ifelse fill grestore stroke } forall pop grestore }bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict/FontName known { FontName dup type/stringtype eq{cvn}if } {/unnamedfont} ifelse def /FontName $fontname dup type/stringtype eq{cvn}if def /currentdistillerparams where {pop} { /FontInfo currentdict/FontInfo known {FontInfo null copyfont} {2 dict} ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [1 0 ItalicAngle dup sin exch cos div 1 0 0] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal }bind def end def /$None 1 dict dup begin /$BuildFont{}bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type/stringtype eq{cvn}if dup/$fontname exch def $sname null eq {$str cvs dup length $slen sub $slen getinterval} {pop $sname} ifelse $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval /$match false def $SubstituteFont/$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval {/$match exch def exit} $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont/$dstack get { exch { 1 index eq {pop false} {true} ifelse } {begin false} ifelse } forall pop } if cleartomark /$slen 0 def $match false ne {$match(fonts/)anchorsearch pop pop cvn} {/Courier} ifelse }bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [/Ryumin-Light/HeiseiMin-W3 /GothicBBB-Medium/HeiseiKakuGo-W5 /HeiseiMaruGo-W4/Jun101-Light]def /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def /GB1 [/STSong-Light/STHeiti-Regular]def /CNS1 [/MKai-Medium/MHei-Medium]def end def end def /$cmapname null def /$deepcopyfont { dup/FontType get 0 eq { 1 dict dup/FontName/copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup/FontName/copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } {$Strategies/$Type3Underprint get exec} ifelse }bind def /$buildfontname { dup/CIDFont findresource/CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index(-)putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy(-)putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch {pop pop 3 2 roll putinterval cvn/$cmapname exch def} {pop pop pop pop pop} ifelse length $str 1 index(-)putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn }bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known {get} {pop pop[]} ifelse } {pop pop[]} ifelse false exch { dup/CIDFont resourcestatus { pop pop save 1 index/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get} {false} ifelse exch pop exch restore {pop} {exch pop true exit} ifelse } {pop} ifelse } forall {$str cvs $buildfontname} { false(*) { save exch dup/CIDFont findresource dup/WidthsOnly known {dup/WidthsOnly get not} {true} ifelse exch/CIDSystemInfo get dup/Registry get Registry eq exch/Ordering get Ordering eq and and {exch restore exch pop true exit} {pop restore} ifelse } $str/CIDFont resourceforall {$buildfontname} {$fontname $findfontByEnum} ifelse } ifelse }bind def end end currentdict/$error known currentdict/languagelevel known and dup {pop $error/SubstituteFont known} if dup {$error} {Adobe_CoolType_Core} ifelse begin { /SubstituteFont /CMap/Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq {dup $str cvs dup length $slen sub $slen getinterval cvn} {$sname} ifelse Adobe_CoolType_Data/InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } { FontDirectory 1 index known {exch pop true exit} { GlobalFontDirectory 1 index known {exch pop true exit} {pop} ifelse } ifelse } ifelse } forall } {pop pop false} ifelse { exch pop exch pop } { dup/CMap resourcestatus { pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS } { 128 string cvs dup(-)search { 3 1 roll search { 3 1 roll pop {dup cvi} stopped {pop pop pop pop pop $findfontByEnum} { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup/CMap resourcestatus { pop pop 4 1 roll pop pop pop dup/$cmapname exch def /CMap findresource/CIDSystemInfo get{def}forall $findfontByROS true exit } {pop} ifelse } for dup type/booleantype eq {pop} {pop pop pop $findfontByEnum} ifelse } ifelse } {pop pop pop $findfontByEnum} ifelse } {pop pop $findfontByEnum} ifelse } ifelse } ifelse } {//SubstituteFont exec} ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and {$findfontByEnum} {//SubstituteFont exec} ifelse end } } ifelse bind readonly def Adobe_CoolType_Core/scfindfont/systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup/FontName known {dup/FontName get dup 3 index ne} {/noname true} ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def/$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin {1 index/FID eq{pop pop}{def}ifelse} forall currentdict end definefont dup/FontName known{dup/FontName get}{null}ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using )print dup/FontName known {dup/FontName get}{(unspecified font)} ifelse $str cvs print(.\n)print } if } {exch pop} ifelse } {exch pop} ifelse end }bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core/findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type/stringtype ne{$str cvs}if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne {dup $inVMIndex $AddInVMFont} if $doSmartSub { currentdict/$Strategy known {$Strategy/$BuildFont get exec} if } if } if end }bind put } if } if end /$AddInVMFont { exch/FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data/InVMFontsByCMap get exch $DictAdd } {pop pop pop} ifelse }bind def /$DictAdd { 2 copy known not {2 copy 4 index length dict put} if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get{forall}def 2 copy currentdict put end } {pop} ifelse } if get begin {def} forall end }bind def end end %%EndResource currentglobal true setglobal %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 %%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. %%Version: 1.23 0 systemdict/languagelevel known dup {currentglobal false setglobal} {false} ifelse exch userdict/Adobe_CoolType_Utility 2 copy known {2 copy get dup maxlength 27 add dict copy} {27 dict} ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch/eCCRun known not ct_Level2? and or def ct_Level2? {globaldict begin currentglobal true setglobal} if /ct_AddStdCIDMap ct_Level2? {{ mark Adobe_CoolType_Utility/@recognizeCIDFont currentdict put { ((Hex)57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility/@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq {1 index length exch sub 1 sub{end}repeat exit} {pop} ifelse } for pop pop Adobe_CoolType_Utility/@eexecStartData get eexec } {cleartomark} ifelse }} {{ Adobe_CoolType_Utility/@eexecStartData get eexec }} ifelse bind def userdict/cid_extensions known dup{cid_extensions/cid_UpdateDB known and}if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type/stringtype eq {exch cvn exch} if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq {pop pop cid_UpdateDB} { exch 1 index/Created get eq {exch pop exch pop} {pop cid_UpdateDB} ifelse } ifelse } {pop cid_UpdateDB} ifelse } {cid_UpdateDB} ifelse end }bind def end } if ct_Level2? {end setglobal} if /ct_UseNativeCapability? systemdict/composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring()def /usewidths? true def end def ct_Level2?{setglobal}{pop}ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict/languagelevel known {pop/CIDFont findresource/GlyphDirectory get} { 1 index/CIDFont findresource/GlyphDirectory get dup type/dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + }def /+ { systemdict/languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } {1 dict begin} ifelse /$ exch def systemdict/languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ?{$ begin}if }def /?{$ type/dicttype eq}def /|{ userdict/Adobe_CoolType_Data known { Adobe_CoolType_Data/AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data/CC 3 index put ?{def}{$ 3 1 roll put}ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont/Widths get exch CC exch put } {?{def}{$ 3 1 roll put}ifelse} ifelse end end } {?{def}{$ 3 1 roll put}ifelse} ifelse } {?{def}{$ 3 1 roll put}ifelse} ifelse }def /! { ?{end}if systemdict/languagelevel known {gvm setglobal} if end }def /:{string currentfile exch readstring pop}executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx[.001 0 0 .001 0 0]def /ct_1000Mtx[1000 0 0 1000 0 0]def /ct_raise{exch cvx exch errordict exch get exec stop}bind def /ct_reraise {cvx $error/errorname get(Error: )print dup( )cvs print errordict exch get exec stop }bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop }bind def /ct_GetInterval { Adobe_CoolType_Utility/ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt {dup string/dst_string exch def} if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add/dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add/dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt {arrayIndex get} { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end }bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal {/unknowninstancename/Category resourcestatus} stopped {cleartomark setglobal true} {cleartomark currentglobal not exch setglobal} ifelse { { mark 3 1 roll/Category findresource begin ct_Vars/vm currentglobal put ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec {cleartomark false} {{3 2 roll pop true}{cleartomark false}ifelse} ifelse ct_Vars/vm get setglobal end } } {{resourcestatus}} ifelse bind def /CIDFont/Category ct_resourcestatus {pop pop} { currentglobal true setglobal /Generic/Category findresource dup length dict copy dup/InstanceType/dicttype put /CIDFont exch/Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering(Identity)def /Supplement 0 def end def /CMapName/Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } {pop pop/defineresource/undefined ct_raise} ifelse }bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known {get 3 1 roll pop pop} {pop pop/findresource/undefinedresource ct_raise} ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } {pop pop/findresource/undefined ct_raise} ifelse }bind def /ct_resourcestatus/resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup(Binary)eq { pop null currentfile ct_Level2? { {cid_BYTE_COUNT()/SubFileDecode filter} stopped {pop pop pop} if } if /readstring load exit } if dup(Hex)eq { pop currentfile ct_Level2? { {null exch/ASCIIHexDecode filter/readstring} stopped {pop exch pop(>)exch/readhexstring} if } {(>)exch/readhexstring} ifelse load exit } if /StartData/typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch/GlyphData exch put 2 index null eq { pop pop pop } { pop/readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse }bind def /StartData { mark { currentdict dup/FDArray get 0 get/FontMatrix get 0 get 0.001 eq { dup/CDevProc known not { /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known {get} { pop pop {pop pop pop pop pop 0 -1000 7 index 2 div 880} } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp/cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul }def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup/cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup/SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup/SubrMapOffset undef dup/SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } {pop} ifelse } forall } if cleartomark pop pop end CIDFontName currentdict/CIDFont defineresource pop end end } stopped {cleartomark/StartData ct_reraise} if }bind def currentdict end def /ct_saveCIDInit { /CIDInit/ProcSet ct_resourcestatus {true} {/CIDInitC/ProcSet ct_resourcestatus} ifelse { pop pop /CIDInit/ProcSet findresource ct_UseNativeCapability? {pop null} {/CIDInit ct_CIDInit/ProcSet defineresource pop} ifelse } {/CIDInit ct_CIDInit/ProcSet defineresource pop null} ifelse ct_Vars exch/ct_oldCIDInit exch put }bind def /ct_restoreCIDInit { ct_Vars/ct_oldCIDInit get dup null ne {/CIDInit exch/ProcSet defineresource pop} {pop} ifelse }bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility/ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge {pop 0} if /cid exch def { GlyphDirectory cid 2 copy known {get} {pop pop nullstring} ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne {0 FDBytes ct_cvnsi} {pop 0} ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq {/charstring nullstring def exit} if /cid 0 def } ifelse } loop }def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto }def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont/Widths get cid 2 copy known {get exch pop aload pop} {pop pop stringwidth} ifelse } {stringwidth} ifelse setcharwidth 0 0 moveto } ifelse }def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known {get} { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup/FontMatrix 2 copy known {get} {pop pop ct_defaultFontMtx} ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont/Widths get def /CharStrings 1 dict dup/.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup/CharStrings get 1 index/Encoding get ct_dfCharCode get charstring put rootfont/WMode 2 copy known {get} {pop pop 0} ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } {ct_str1 show} ifelse }def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not {ct_1000Mtx matrix concatmatrix concat} {pop} ifelse /Private get Adobe_CoolType_Utility/ct_Level2? get not { ct_dfDict/Private 3 -1 roll {put} 1183615869 internaldict/superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility/ct_Level2? get {1 index} {3 index/Private get mark 6 1 roll} ifelse dup/RunInt known {/RunInt get} {pop/CCRun} ifelse get exec Adobe_CoolType_Utility/ct_Level2? get not {cleartomark} if }bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility/ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped {stop} if end end end end }bind def /BaseFontNameStr(BF00)def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0]def /FontBBox [-250 -250 1250 1250]def /Encoding ct_cHexEncoding def /BuildChar/ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString/ct_Type3ShowCharString load def /ct_dfSetCacheProc/ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup/lenIV 4 put def /CharStrings 1 dict dup/.notdefput def /PaintType 0 def /ct_ShowCharString/ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not {exit} if } for exch pop exch pop }bind def /ct_makeocf { 15 dict begin exch/WMode exch def exch/FontName exch def /FontType 0 def /FMapType 2 def dup/FontMatrix known {dup/FontMatrix get/FontMatrix exch def} {/FontMatrix matrix def} ifelse /bfCount 1 index/CIDCount get 256 idiv 1 add dup 256 gt{pop 256}if def /Encoding 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for bfCount 1 255{2 copy bfCount put pop}for def /FDepVector bfCount dup 256 lt{1 add}if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont/FontBBox known {CIDFont/FontBBox get/FontBBox exch def} if CIDFont/CDevProc known {CIDFont/CDevProc get/CDevProc exch def} if currentdict end BaseFontNameStr 3(0)putinterval 0 1 bfCount dup 256 eq{1 sub}if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup/CIDFirstByte exch 256 mul def FontType 3 eq {/ct_FDDict 2 dict def} if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont/Widths get begin exch/CIDFont get/GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } {exch pop} ifelse }bind def currentglobal true setglobal /ct_ComposeFont { ct_UseNativeCapability? { 2 index/CMap ct_resourcestatus {pop pop exch pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch/WMode exch def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search { dup length string copy exch pop exch pop } {pop(Identity)} ifelse } {pop (Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def setglobal /ct_MakeIdentity { ct_UseNativeCapability? { 1 index/CMap ct_resourcestatus {pop pop} { /CIDInit/ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry(Adobe)def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-)search { pop pop (-)search {dup length string copy exch pop exch pop} {pop(Identity)} ifelse } {pop(Identity)} ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000>0 endcidrange endcmap CMapName currentdict/CMap defineresource pop end end } ifelse composefont } { exch pop 0 get/CIDFont findresource ct_makeocf } ifelse }bind def currentdict readonly pop end end %%EndResource setglobal %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict/ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge }bind def /AllocGlyphStorage { Is2015? { pop } { {string}forall }ifelse }bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix[1 0 0 1 0 0]def 4 array astore cvx/FontBBox exch def /sfnts }bind def /Type42DictEnd { currentdict dup/FontName get exch definefont end ct_T42Dict exch dup/FontName get exch put }bind def /RD{string currentfile exch readstring pop}executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop }ifelse }bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop }ifelse }bind def /T0AddT42Mtx2 { /CIDFont findresource/Metrics2 get begin def end }bind def end %%EndResource currentglobal true setglobal %%BeginFile: MMFauxFont.prc %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. %%All Rights Reserved. userdict /ct_EuroDict 10 dict put ct_EuroDict begin /ct_CopyFont { { 1 index /FID ne {def} {pop pop} ifelse} forall } def /ct_GetGlyphOutline { gsave initmatrix newpath exch findfont dup length 1 add dict begin ct_CopyFont /Encoding Encoding dup length array copy dup 4 -1 roll 0 exch put def currentdict end /ct_EuroFont exch definefont 1000 scalefont setfont 0 0 moveto [ <00> stringwidth <00> false charpath pathbbox [ {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall grestore counttomark 8 add } def /ct_MakeGlyphProc { ] cvx /ct_PSBuildGlyph cvx ] cvx } def /ct_PSBuildGlyph { gsave 8 -1 roll pop 7 1 roll 6 -2 roll ct_FontMatrix transform 6 2 roll 4 -2 roll ct_FontMatrix transform 4 2 roll ct_FontMatrix transform currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse dup 9 1 roll { currentdict /StrokeWidth 2 copy known { get 2 div 0 ct_FontMatrix dtransform pop 5 1 roll 4 -1 roll 4 index sub 4 1 roll 3 -1 roll 4 index sub 3 1 roll exch 4 index add exch 4 index add 5 -1 roll pop } { pop pop } ifelse } if setcachedevice ct_FontMatrix concat ct_PSPathOps begin exec end { currentdict /StrokeWidth 2 copy known { get } { pop pop 0 } ifelse setlinewidth stroke } { fill } ifelse grestore } def /ct_PSPathOps 4 dict dup begin /m {moveto} def /l {lineto} def /c {curveto} def /cp {closepath} def end def /ct_matrix1000 [1000 0 0 1000 0 0] def /ct_AddGlyphProc { 2 index findfont dup length 4 add dict begin ct_CopyFont /CharStrings CharStrings dup length 1 add dict copy begin 3 1 roll def currentdict end def /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def /ct_PSBuildGlyph /ct_PSBuildGlyph load def /ct_PSPathOps /ct_PSPathOps load def currentdict end definefont pop } def systemdict /languagelevel known { /ct_AddGlyphToPrinterFont { 2 copy ct_GetGlyphOutline 3 add -1 roll restore ct_MakeGlyphProc ct_AddGlyphProc } def } { /ct_AddGlyphToPrinterFont { pop pop restore Adobe_CTFauxDict /$$$FONTNAME get /Euro Adobe_CTFauxDict /$$$SUBSTITUTEBASE get ct_EuroDict exch get ct_AddGlyphProc } def } ifelse /AdobeSansMM { 556 0 24 -19 541 703 { 541 628 m 510 669 442 703 354 703 c 201 703 117 607 101 444 c 50 444 l 25 372 l 97 372 l 97 301 l 49 301 l 24 229 l 103 229 l 124 67 209 -19 350 -19 c 435 -19 501 25 509 32 c 509 131 l 492 105 417 60 343 60 c 267 60 204 127 197 229 c 406 229 l 430 301 l 191 301 l 191 372 l 455 372 l 479 444 l 194 444 l 201 531 245 624 348 624 c 433 624 484 583 509 534 c cp 556 0 m } ct_PSBuildGlyph } def /AdobeSerifMM { 500 0 10 -12 484 692 { 347 298 m 171 298 l 170 310 170 322 170 335 c 170 362 l 362 362 l 374 403 l 172 403 l 184 580 244 642 308 642 c 380 642 434 574 457 457 c 481 462 l 474 691 l 449 691 l 433 670 429 657 410 657 c 394 657 360 692 299 692 c 204 692 94 604 73 403 c 22 403 l 10 362 l 70 362 l 69 352 69 341 69 330 c 69 319 69 308 70 298 c 22 298 l 10 257 l 73 257 l 97 57 216 -12 295 -12 c 364 -12 427 25 484 123 c 458 142 l 425 101 384 37 316 37 c 256 37 189 84 173 257 c 335 257 l cp 500 0 m } ct_PSBuildGlyph } def end %%EndFile setglobal Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. systemdict/setpacking known { currentpacking true setpacking }if userdict/Adobe_AGM_Image 71 dict dup begin put /Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf()def /AGMIMG_ybuf()def /AGMIMG_kbuf()def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /ds { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage/colorimage ldf }if end end }def /ps { Adobe_AGM_Image begin /AGMIMG_ccimage_exists{/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode[Decode 1 get Decode 0 get]def }def /knockout_image_samples { Operator/imagemask ne{ /Decode[1 1]def }if }def }{ /invert_image_samples { {1 exch sub}currenttransfer addprocs settransfer }def /knockout_image_samples { {pop 1}currenttransfer addprocs settransfer }def }ifelse /img/imageormask ldf /sepimg/sep_imageormask ldf /devnimg/devn_imageormask ldf /idximg/indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ bind }if def }forall }def /pt { end }def /dt { }def /AGMIMG_flushfilters { dup type/arraytype ne {1 array astore}if dup 0 get currentfile ne {dup 0 get flushfile}if { dup type/filetype eq { dup status 1 index currentfile ne and {closefile} {pop} ifelse }{pop}ifelse }forall }def /AGMIMG_init_common { currentdict/T known{/ImageType/T ldf currentdict/T undef}if currentdict/W known{/Width/W ldf currentdict/W undef}if currentdict/H known{/Height/H ldf currentdict/H undef}if currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if currentdict/D known{/Decode/D ldf currentdict/D undef}if currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if currentdict/O known{ /Operator/O load 1 eq{ /imagemask }{ /O load 2 eq{ /image }{ /colorimage }ifelse }ifelse def currentdict/O undef }if currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if currentdict/I known{/Interpolate/I ldf currentdict/I undef}if currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if /DataSource load xcheck not{ DataSource type/arraytype eq{ DataSource 0 get type/filetype eq{ /_Filters DataSource def currentdict/MultipleDataSources known not{ /DataSource DataSource dup length 1 sub get def }if }if }if currentdict/MultipleDataSources known not{ /MultipleDataSources DataSource type/arraytype eq{ DataSource length 1 gt } {false}ifelse def }if }if /NComponents Decode length 2 div def currentdict/SkipImageProc known not{/SkipImageProc{false}def}if }bdf /imageormask_sys { begin AGMIMG_init_common save mark level2{ currentdict Operator/imagemask eq{ AGMIMG_&imagemask }{ use_mask{ process_mask AGMIMG_&image }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator/imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix/DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix/DataSource load AGMIMG_&image }ifelse }ifelse currentdict/_Filters known{_Filters AGMIMG_flushfilters}if cleartomark restore end }def /overprint_plate { currentoverprint{ 0 get dup type/nametype eq{ dup/DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or }forall not }ifelse }{ pop false }ifelse }def /process_mask { level3{ dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def /ImageMatrix[Width 0 0 Height neg 0 Height]def /NComponents 1 def /BitsPerComponent 1 def /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def currentdict end def currentdict end }if }def /use_mask { dup/Mask known {dup/Mask get}{false}ifelse }def /imageormask { begin AGMIMG_init_common SkipImageProc{ currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator/imagemask eq DeviceN_PS2 not and{ imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ [/Separation/Black/DeviceGray{}]setcolorspace /Decode[Decode 1 get Decode 0 get]def }if use_mask{ process_mask image }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not{ 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file{ Names{ dup(None)ne{ [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace Operator imageDict read_image_file names_index 0 eq{true setoverprint}if /names_index names_index 1 add def }{ pop }ifelse }forall close_image_file }if grestore end }{ Operator/imagemask eq{ imagemask }{ image }ifelse }ifelse }{ Operator/imagemask eq{ imagemask }{ image }ifelse }ifelse }ifelse }ifelse }{ Width Height Operator/imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix/DataSource load /Adobe_AGM_OnHost_Seps where{ pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator/colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource DataSource 0 get xcheck { [ DataSource 0 get/exec cvx DataSource 1 get/exec cvx DataSource 2 get/exec cvx DataSource 3 get/exec cvx /AGMCORE_get_ink_data cvx ]cvx }{ DataSource aload pop AGMCORE_get_ink_data }ifelse def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0()/SubFileDecode filter def }ifelse /Decode[Decode 0 get Decode 1 get]def /MultipleDataSources false def /NComponents 1 def /Operator/image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator/image eq{ AGMCORE_host_sep{ /DoImage true def currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse { AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }if 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys}if }{ use_mask{ process_mask image }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin AGMIMG_init_common SkipImageProc{ currentdict consumeimagedata }{ save mark AGMCORE_avoid_L2_sep_space{ /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def }if AGMIMG_ccimage_exists MappedCSA 0 get/DeviceCMYK eq and currentdict/Components known and Name()ne and Name(All)ne and Operator/image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load/exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for }/exec cvx ]cvx bind MappedCSA 0 get/DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator/imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name(All)ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator/imagemask eq{ //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }if }{ invert_image_samples }ifelse }{ //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ [/Separation Name[/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub }bind ]AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }if }ifelse currentdict imageormask_sys }{ currentdict Operator/imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name(All)eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ currentcolorspace 0 get/Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if }if currentoverprint MappedCSA 0 get/DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse Name(All)ne and{ imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end end }def /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark }bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub{ dup currentdict/dataSource get/exch cvx/get cvx/exec cvx /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx }for ]cvx bind end }bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0()/SubFileDecode filter BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0()/SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx }for /convProc load/exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2/add cvx/index cvx 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx }for ]bind cvx 0()/SubFileDecode filter end }bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs[3 -1 roll begin AGMIMG_init_common currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse { Width Decode length 2 div mul cvi { dup 65535 gt{1 add 2 div cvi}{exit}ifelse }loop string }repeat end]def /dstDataStr srcDataStrs 0 get length string def begin AGMIMG_init_common SkipImageProc{ currentdict consumeimagedata }{ save mark AGMCORE_producing_seps not{ level3 not{ Operator/imagemask ne{ /DataSource[[ DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def /MultipleDataSources true def /Decode colorSpaceElemCnt[exch{0 1}repeat]def }if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process{ CSA get_csa_by_name 0 get/DeviceCMYK eq{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get devn_alt_datasource filter_cmyk 0()/SubFileDecode filter def /MultipleDataSources false def /Decode[1 0]def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate{ /DataSource DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt[exch{0 1}repeat]def currentdict imageormask_sys }{ gsave knockout_unitsq grestore currentdict consumeimagedata }ifelse }ifelse } { /devicen_colorspace_dict AGMCORE_gget/names_index known{ Operator/imagemask ne{ MultipleDataSources{ /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def /MultipleDataSources false def }{ /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def }ifelse invert_image_samples }if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN[ AGMIMG_c 0 ne{/Cyan}if AGMIMG_m 0 ne{/Magenta}if AGMIMG_y 0 ne{/Yellow}if AGMIMG_k 0 ne{/Black}if ]/DeviceCMYK{}]setcolorspace AGMIMG_c 0 ne{AGMIMG_c}if AGMIMG_m 0 ne{AGMIMG_m}if AGMIMG_y 0 ne{AGMIMG_y}if AGMIMG_k 0 ne{AGMIMG_k}if setcolor }{ /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def [/Indexed [ /DeviceN[ AGMIMG_c 0 ne{/Cyan}if AGMIMG_m 0 ne{/Magenta}if AGMIMG_y 0 ne{/Yellow}if AGMIMG_k 0 ne{/Black}if ] /DeviceCMYK{ AGMIMG_k 0 eq{0}if AGMIMG_y 0 eq{0 exch}if AGMIMG_m 0 eq{0 3 1 roll}if AGMIMG_c 0 eq{0 4 1 roll}if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ]setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation/Black/DeviceGray{}]setcolorspace gsave /Black [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation/Yellow/DeviceGray{}]setcolorspace gsave /Yellow [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation/Magenta/DeviceGray{}]setcolorspace gsave /Magenta [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation/Cyan/DeviceGray{}]setcolorspace gsave /Cyan [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if close_image_file }{ imageormask }ifelse }ifelse }ifelse }def /indexed_imageormask { begin AGMIMG_init_common save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ /CSA get get_csa_by_name }{ /Names get }ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN{ /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }{ AGMCORE_is_cmyk_sep{ Operator/imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN{ /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget dup null ne { begin currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and AGMCORE_in_rip_sep and{ [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] setcolorspace }if end } {pop}ifelse }ifelse imageormask Indexed_DeviceN{ end }if }{ Operator/imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict/_Filters known{_Filters AGMIMG_flushfilters}if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not{ currentcolorspace dup 1/DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace }if currentdict Operator/imagemask eq{ AGMIMG_&imagemask }{ use_mask{ process_mask AGMIMG_&image }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type/dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode[0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc{false}cdndf /Decode[ 0 currentcolorspace 0 get/Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ]cdndf /Operator/image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter/WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0(%EndMask)/SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not{exit}if }loop WriteFilter closefile end }def /spot_alias { /mapto_sep_imageormask { dup type/dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode[/customcolor_tint AGMCORE_gget 0]def /Operator/image def /SkipImageProc{false}def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA[/DeviceCMYK] /TintMethod/Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components[AGMIMG_colorAry aload pop pop] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch itransform/AGMIMG_llY exch def/AGMIMG_llX exch def 1 1 transform AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch itransform/AGMIMG_urY exch def/AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat }{ }ifelse end }def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def }if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage end }def /sep_imageormask_lev1 { begin MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get }currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get/DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get/DeviceGray eq{ {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get/DeviceCMYK eq{ currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get/DeviceGray eq{ {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get/DeviceCMYK eq{ currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1}exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict/setpacking known {setpacking}if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/ds gx Adobe_CoolType_Core/ds get exec Adobe_AGM_Image/ds gx currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup %ADOBeginClientInjection: PageSetup Start "AI11EPS" %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 %ADOEndClientInjection: PageSetup Start "AI11EPS" Adobe_AGM_Utils begin Adobe_AGM_Core/ps gx Adobe_AGM_Utils/capture_cpd gx Adobe_CoolType_Core/ps get exec Adobe_AGM_Image/ps gx %ADOBeginClientInjection: PageSetup End "AI11EPS" /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 application/postscript ISC_logo_only_RGB Adobe Illustrator CS3 2010-03-25T14:28-07:00 2010-03-25T14:28-07:00 2010-03-25T14:28-07:00 256 100 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAZAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A53hQ7FXYq7FXYq7FXAEk ACpPQYq9K8sfkxeTWA1vzfeL5c0NaMTOQtxIp3oqtshPblv/AJJxVM5PzH/LXymDb+S/Lyahdpt+ mNRBJJH7ShgZKHwHp/LFKQ6p+en5k37HjqS2UZ/3VawxqB8mYPJ/w2KEri/Nb8xYpDIuv3ZYmpDs HX6FYFR92Ksk0/8APzzG8P1PzLYWXmDT3/vYp4ljc9tioMfT/ivFKLk8kfl/56he48i3f6J1sKXk 0C9JCvQVPpMS34Fh4hcVeYatpGp6Rfy6fqVs9reQGkkMgoR4HwIPYjY4oQmKuxV2KuxV2KuxV2Kp nYeWPMmo2Ut9YaXdXVnDX1biGGR4xTc/EoI274qlmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KovSdI1LV9Qh07Tbd7q8uG4xQxipPiT2AA3JOwxV6/Fp/k38pbVLnU/T13zzIoaC0U1htaioY1Hw /wCsRyb9kAVOKXmHmrzl5h8035vNYummYV9GAfDDED+zGnQfPqe5xQkmKuxV2KuxVfBPPbzJPBI0 M8TB45YyVdWBqCrDcEYq9c0TzHo35mabH5a82PHa+Z4l46Lr3EKZW7Qy0pufDo3ajdVLzHzD5f1X y/q9xpWqQ+jd25ow6qyndXQ91Ybg4oS7FXYq7FXYq7FWZflr5Jt/MWoXF7q0htvLekRm51a6rT4Q CREpG9Xoenb3pirIL/8APvzHBq8S+XoodO8uWZWO20oRR0eFD0kbiWUsP5CKe/UqUp/OHRrC21+1 1zS04aV5ktU1K3UCgWSQfvU29yGPhyxQwPFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm/ljzVrf ljUW1HRpxBdPE8DOyK44PQnZgR1UH6MVS27u7q8uZbq6lee5mYvLNISzsx6kk7nFVLFXYq7FXYq7 FXYq2jujq6MVdSCrA0II3BBGKvY7SSL82PJr2U5X/HWgRcraYkBry3HZie56Hwah/aOKXjskckcj RyKUkQlXRgQQQaEEHoRihbirsVdiq+GGWaVIYkMksjBI0UVLMxoAB4k4q9T/ADJmi8n+T9K/L6xc C8mVb/zFIhrzlfdIyR2BH3Kvjil5Tih6f5nj/SH5G+VNRPxTabeXFkx7hJWkYfhEgxV5hirsVZF5 Z/L7zh5lIOk6bLLATQ3bj04B4/vH4qaeAqcVZ7D+ROlaUiy+cPNFrp5pU2tvRpCP8lpCrH6IzluP DOf0glozanFi+uQiriw/5x70v4TFqOuEU+MtIlfuNoMzYdlZjzofH9VutydvaaPImXuH66cfMv5L oCkXk12RvtF5PiHyPqMfxy4djT/nBxj7SYukZfYsaX8g9QJSXRb/AEt229eKR2UCnWnqy/8AEMhL sjKORBbYe0OA8xIfj3oa5/JTRdZhe48i+YodRKgt+j7ukc4X/WAU17fFGo98wMunyY/qFO10+rxZ vokD9/yeZaxouq6NfyWGqWslneR/ahlFDQ9GHZlPYjY5S5CCxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2Kpn5Z8w6h5d1y01iwalxaOG4n7Lqdnjb/JdSQcVZ5+cnl/T7ldP8+aEv+4jzAoa5AH93dUP LlTYF+Jr/lK3jil5hih2KuxV6R+RugWt15kuPMOo0XS/LcJvZnYVAloTH/wIVn+ajFLCvM+vXOv+ YL/WbnaW9maXj14p0RPkiAL9GKEsxVOT5t1s+Vh5Y9Vf0QLj60I+C8+dOnPrSu+Kojyh5D8y+bLv 0NItS8SECe8kqkEVf53od/8AJFT7Yq9Ph8tflZ+Xy11hh5n8xJ1tAFMETU6MhLIP9nyPfiMzdNoM mXflHvLrNb2thwbXxS7h+nuSnzD+cPm7VVMFpKNJsQOKW9n8LBQKAGX7f/A8R7ZvMHZmKHMcR8/1 PMartvPl2B4I+X62ESSSSO0kjF5GNWdiSST3JObACnUEkmytwodirsVVLe5uLadJ7eV4Z4zyjljY qykdww3GCUQRR5MoyMTYNF6bovmLRvzBsE8recgo1ShXR9bUBZBKdlRj/Mfuf/Woc5/X9ncA44cu oet7J7ZOQjHl+roe/wAj5vDc0z0bsVdiq+GGaeVYoY2llc0SNAWYnwAG5xVluk/lF+YuqANBok8U Z353XG2FPGkxRj9AxVksH/OOnm4RiXUNR06wjPXnLIzDueiBen+VjaVT/lRmlJ8Nx520uKUdUqhp 4dZVP4Yq1/yozTJKLbeddLmk/kqg28fhlfFVKf8A5x385GMy2F9p1/H29KZwT3/aQL/w2KsZ1b8p /wAxNKBa50O4eNdy9sFuRQdz6JkIHzxQxSWKSKRo5UaORTRkYEEH3BxVbirsVdirsVet/k7fW3mH Q9Z/LvU5P3V/E1xpLNv6c6fE3H5ELIB7N44peV31lc2N7cWV0hiubWR4Z4z1V42KsPoIxQoYq7FX r+qj/B/5G2VgP3eqebZfrE/Zvq9Ffr4emIwR/lHFLyDFDsVen+RfykhnsB5l86T/AKK8uxgSRwse E1wDutP2lVu1Pib9nxyePHKZ4Yiy15s0MceKZoBNPNH5qyyWY0TynbjRNChHBPRAjmkX5r9gHvTc 9znQ6TsuMN5+qX2PH9oduTy+nH6Yfaf1PPSSTU7k9Tm2dC7FXYq7FXYq7FXYq2rMrBlJVlNVYbEE YqCx3OFfUk78r+S/Mvme6+r6NZPccSBLN9mGOv8API1FHy6+GKvQv+Vcflx5PQSeetc+vaiBU6Np xJNf5WIpJv2J9PFKnN+eGn6PG1t5I8tWmkwmq/Wp1DzOOxYJx3/1nbFWI6v+an5g6qzG51y5RW/3 XbN9WSnhSEJX6cUMYnuLi4kMk8ryyHq7sWb7ziqnirsVVILi4t5BJBK8Ug6OjFW+8YqybSfzS/MH SiPquuXTKOkdw31haeAWYSAfRirKovzuttWjW286eW7LWYQOP1mNfSnX/KBbnv8A6pXFKoPI35We bt/KGtto+pv9jSNTrxLHoiOSW6/ytJ8sVYR5r8g+a/K03DWLF44SaR3afvIH+Ui7V9jQ+2KGPYq7 FUx8u61c6Hrtjq9sf31lMkoHTkFPxIfZlqpxVnv576LbJr9j5n0/4tN8x2yXKOBt6qqvL/gkZG+d cVeY4qm/lLQn17zNpmjrWl5cJHIR1EdayN/sUBOKsz/P3XEvvO502Cgs9FgjtY0X7Icj1JKfLkE/ 2OKXmuKHr/kfyHovljSY/OPnmP4m+LR9FcfHI4+JXkQ9/BTsOreGX6fTyyy4YuLq9ZDTw4pn3DvS Hzj521rzVqBub5+FuhP1WzQ/u4l9v5mPdjv9G2dVptLDDGo8+94TW6/JqJXLl0HQMfzJcJ2KuxV2 KuxV2KuxV2KuxVmui/lbofl3TYvMH5kXX1OB/itdDiNbiYjfi/H4h7qvT9pl6Zwr6mgPNP5z6veW v6I8sQL5d0GMcI4bUBJmX/Kdaca+CfSTih5yzMzFmJLE1JO5JOKtYq7FXYq7FXYq7FXYq7FXYqzr yl+cHmfQ4jYXxXW9EkHCbTr4+oPT6FUduRUexBX2xVkFz5E8l+e7aTUfINwLDV0UyXPly6YLU9SY WJNBX3K/6mKXl2o6bqGmXstjqFvJa3cB4ywSqVZT8j49jihDYq9csCfNf5EXlo3x6h5TuPXi/m+r mrGp8BG8n/ADFLyPFD1f/nHzToE1zVfMt2KWmhWTuX/leUGp+iJH+/FLzLVdRn1LU7vUbjee8mkn l7/FIxY/rxQ9N/LPydpej6V/j7zYlLGA10WwYDlczb8X4nqKj4P+C+yN7sGCWWXDFx9VqoYIGcv7 fJIvNfmrVPM2ryajfv1+GCAGqRR12Rf4nuc63T6eOKPDF8/1mrnnmZy+A7kmy9xXYq7FURFp9/LG ZIraWSMCpdUZlA+YGRM4jmWYxyIsAqDKysVYFWGxB2IyTAhrFXYqrwWN7cAm3t5JgOpjRm/UMiZg cyzjjlLkCVF0dGKupVh1UihwgsSKawoS7Xdf1jXtRk1HVrp7q7k6u52A7KqjZVHYDOFfUkvxV2Ku xV2KuxV2KuxV2KuxV2KuxV2Kq1neXdldRXdnM9vdQsHhmiYo6sOhVhuMVetaT5q8tfmTYw6B5zKW PmNB6el+YECqHPZJR8I3P7J+Fu3Fuql5z5t8oa35V1d9M1aHhIPihmXeOWOtA8bdx+I74oZr/wA4 /wCqRJ5sutCufis9ds5beSM9GeNS4r/zz9QfTirzzWdMm0vV73TJv72ynkt3PiYnK1+mmKvVNL/5 1z/nHy/vPsXXmW6METHY+mW9Mr/yLhkI+eKWK/lZ5Gi8y6xLdakfR8vaSv1jVJ2NFKrUiKv+VxNf 8kHvTDGJJocywlIRBJ5BM/P/AJzl8zaqDCvoaPZD0dMtAOKpGKDkVGwZqD5Cg7Z1ui0gwwr+I83g O09edTkv+Ach+O9DeQVVvOuiKwDKbyEEHcH4xk9Z/cy9xa+zh/hEP6wfUN7ZWf1Of9xH/dv+wv8A KfbORjI2N30GcI8J2HJ8gKrMwVQWZjRVG5JOdu+YgPpPyF+V2ieX9PgnvbaO71p1DTzygOI2I+xE DUDj05dT+GcprNfPJIgGoPedndk48MQZC8n3e5MtR/MvyPp2ovp15qscd3G3CRAkrqrdKM6IyAjv U7d8qhoc0o8Qjs35e1NPCfBKfq+P9iM8xeVPL3maxMWoW0cwdf3N2gHqpUVDRyDf38DkMOoniNxP wbdTo8WeNSF+fX4F8u+YNGuNF1u90q4PKWzlaMuNgwG6sB/lLQ512HKMkBIdXz7U4DiyGB/hL2P8 pvyv0tNKt9e1q3W6u7tRLaW0q8o4ojujlTszOPiFegp3zR9o6+XEYQNAc3qOx+yYCAy5BZlyB6Bn OueevJ/l2dLLU79LWbiCtuiSSFV7VWJX4+1c12LSZcouIv8AHm7fUdoYMB4Zyo92/wChW1TRPLXm zSUN1DFe2lzGGtrpQOaqwqrxyUqp3/rgx5cmGW2xDLLgxamG4EokbH9T5l83eXZ/LvmG80iVuf1d h6UvTnG4DI30qd/fOs02cZYCQ6vA6zTHBlMD0+5g2cY+kOxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KvXvJfmjTPPWjL5F84SgXwFNA1l95EkA+GN2JFTtQVPxjb7VDilhVvaar5E/MCzXUk9G40u8i kkYV4vCHBLIe6ulf9vFCdfnzpA0/8xryVF4xajFFdpTp8S+m5+l42OKsj/OCyuoNL8keRbGMyXkd ujPAvV5nCwofpcSYpd55ntPKnluy/L/SpA0kYW51+5Tb1bhwG4H26H5BR45veydL/lD8P1vK9v6/ /Ix/zv0D9PyedZvXlmQfl/8A8pvof/MbD/xMZjaz+5l7i5vZ3+MQ/rB9TXv+8Vx/xjf/AIic4+HM PoeT6T7nyT5eeGPX9NkmIEKXUDSlugUSKWr7UztMwJhKu4vmumIGWJPLiH3vrzOJfTXyX5t0TU9G 8wXllqKMswld1katJUZiVkUnqG/z3ztNNljkgDF821mCeLKYy538/N6T5b/PPT9L0Gw02506eeaz gSBpVdQG9McQd9+gzVZ+yZTmZAjcu90vb8ceOMDEkxFMA8363F5q84T6jbQtbrfvBGkbkMwKxpFv Sg/ZzZabEcOIRJur/W6bW5xqM5mBXFX3APqeCGOCCOCJeMUShEUdlUUA+7OPJs2X0SMQBQ6PlHzt qEmoeb9Yu5G5c7uVUPX4I2KIPoRQM7LSw4cUR5PnGvyGeecj/OL1b8tPzM8oaR5NsdO1fUvRvLcy gxmGeSitKzL8SIy9G8c02u0GWeUyiNj5h6PsvtXBiwRhOVSF9D3+5gv5veYdC17zPDf6NcfWbf6p HHNJwkj/AHqySVFJFQ/ZK9s2PZuGePGYzFG3T9s6nHmzCWM2OHz52e95PnKveOxV2KuxV2KuxV2K uxV2Kppo3lfzHrb8dJ025vexaGNmQf6z04r9JxVm+mf84+fmDdqHu0tdNTq31mYMQPGkIl/E4qjz +Snley21nz3p1rIPtQp6ZavtzmVttv2cUrX/AC9/JuIN6nnnlx2bgitv024hq7+GKFv/ACrn8o51 UW/nxI3bcNNGoFKdwxjp9JxVa35EPfAny15p0vWSASI1kCOQPaNpx95xSw/zD5A86eWG9bU9Nmt4 o2BW8j/eRA1+E+rGWVT4VIOKHoc5T81Py+a5oG86+Wk/eU+3dW/XoOpYA0/yx2DYpRfmjTv8Tt+V up0EhvhFaXzHv6RjaT9UuKsi1Q2sHnnzL581FRJbeW4YtN0eNukl20QZ/wDgXm4/ST2y7T4TkmIj q42r1Iw4zM9Pv6PE769ub68nvbpzLc3LtLNIerO5qTnZQiIgAcg+cZMhnIylzKhkmDIPy/8A+U30 P/mNh/4mMxtZ/cy9xc3s7/GIf1g+pr3/AHiuP+Mb/wDETnHw5h9DyfSfc+Oc7l8ve/flf+a1hqdn b6NrUwg1aJRFDcSGiXAGy/EeknYg9e3hnN6/s+UCZwFx+79j2fZPa8ckRjyGpjr3/tZ35g8s6H5g s/qurWiXMYr6bHZ0J7o4+JT8s12HPPGbiadxqdLjzR4Zi3h/nz8mtS0KKXUdIdr/AEuMFpYyP38K juwGzqB1YfdTfOg0facch4ZbS+wvJdodiTwgzh6ofaP1sD0X/js2H/MRF/xMZscv0H3Omwf3kfeH 1/nEPpz5A1r/AI7N/wD8xEv/ABM52+L6B7nzHP8A3kveUFljU7FWPZwr6k7FXYq7FXYq7FV0cckk ixxqXkchURQSSSaAADqTir0LQvyV16e0/SfmS5h8s6QKFp75lEpB8IiVofZyp9sVTQa9+SvlP4dJ 0uXzXqKbfXL2i29f8lXXjsen7r/ZYpS3WPz68+3qejYyQaPagcUis4lqF7DnJzI/2NMUMI1PzBru qsW1PUbm9J3/ANImeQfQGJpiqAxV2KuxVtWZWDKSGBqCNiCMVZr5Z/ODzvoRERvTqVh9mSxvqzoU 6FQzHmu3gae2KvTvIbeVNd1uHzR5Kj/RGu21BrflwsFintpCBIYvsqKbMpFF5Acgta4pelQeULC3 OnLCeMGmX9xf2sVBRfrMcwaMf5Ie5LL4UAwK8p/PDVYbWW18s2Tfu0kl1G//AMqe5kZ1B+XNj8iM 3/Y+CgZn3B5P2i1VyjiHTc/oeUZvHmHYqyD8v/8AlN9D/wCY2H/iYzG1n9zL3Fzezv8AGIf1g+pr 3/eK4/4xv/xE5x8OYfQ8n0n3PkCxsbu/u4rOziae6nbjFEv2mbwGdvOYiLPJ8yx45TkIxFkp7L+X HnmKJ5ZNGuFjjUs7ECgUCpPXMca7CduIOYezNQBZgU78kfm/r2gPFaagzajpIopic1miXpWJz4fy tt8sx9X2bDJvH0ycrQdtZMNRl6ofaPc+hbC+tNQsYL60cS2tzGssLjurio2/hnMTgYkg8w9vjyRn ESjuC+cfPWi2egfmU0Fsojs2uILmKNeiLIVZlA8A1aDwzqdJlOTT2edEPC9oYI4dXQ+mwX0tnKPe vkLX42i17Uo2+0l1MrfMSMM7bCbgPcHzLUiskh/SP3p/5W/K/wAy+ZtMOpac1utuJGipNIytyUAn YK23xZjajX48UuGV25uk7Jy54ccKq63QHm7yVrHlW5t7fU2haS5QyR+ixcUU0NaquW6bVRzAmPRo 1mhyacgTrfuef5xz6M7FXYq7FXYqy7yR+Wev+aud1HxsNFgqbrVrn4YUVd241pzIpvQ0HcjFWUTe d/I/kZGtPI1kuqayoKzeY71eQB6H0E22+VB/rYpeea95l17zBeG81i9lvZ9+JkPwqD2RBRUHsoxQ lmKuxV2KuxV2KuxV2KuxVHaHrepaJqttqmmymG8tXDxuOh8VYd1YbEdxir7K8s+YbPX/AC5Y65AQ kF3CJWBP2GG0iE7fYdSpPtgpNvl7zXrTa35j1HVSSVupmaKvURj4Yx9CADO10+Lw8Yj3B811mfxc sp95+zp9iU5c4zsVZB+X/wDym+h/8xsP/ExmNrP7mXuLm9nf4xD+sH1Ne/7xXH/GN/8AiJzj4cw+ h5PpPufKPlDU4tM806VfzNxht7qJpm8I+QDn/gSc7LU4+PHKI6h850WUY80JHkJB9YTRRXNs8THl FMhUkd1cU2+g5xgJBt9HkBIV0L5wvfyZ8+Qai9rBYi5g50iu1liWNlrsxDMGX5EZ1Me1MJjZNHue Fydh6kSoRsd9h7/5V0d9F8uadpcjiSS0gWORx0L0q1Om1TtnN6jL4mQy7y9ppMHhYowP8IfPH5t6 vb6l57v5LZg0Vvwtlcd2iUB/ueozp+zsZhhF9d3iO2cwyamRHIbfJ9CeUteg17y7Y6pEwZp4l9cD 9mVRSRT8mrnM6nCceQxL2uj1AzYozHUfb1eQfmL+UvmebzPd6jotqL2z1CQzkK6K8ckm8gYOV2LV IIzd6LtHGMYjM0YvM9p9j5jmM8Y4oyN/F6j+XXlq48ueU7TTbog3YLy3IU1AeRi3EH/JFBmo1ucZ cpkOT0PZmlODCIS+rq8Z/PDWIb/zqbeFgyadAls5FCPUq0j7+3MKfcZveycRjhs/xG3le3swnqKH 8Ir9LI/+sZv+XX/p9zmHuXf9Yzf8uv8A0+4q7/rGb/l1/wCn3FXf9Yzf8uv/AE+4q2P+hZ6j/eX/ AKfcVZ35o/5V9/hS2/TPpf4Y/d/V/q/q/VaU/d/7y/Dw/lrtX3wKwP8A6xm/5df+n3Crv+sZv+XX /p9xV3/WM3/Lr/0+4q7/AKxm/wCXX/p9xV3/AFjN/wAuv/T7irv+sZv+XX/p9xV3/WM3/Lr/ANPu Ku/6xm/5df8Ap9xV3/WM3/Lr/wBPuKu/6xm/5df+n3FXf9Yzf8uv/T7ir0Lyt/gj/CMn+H+P+G6T 8+Hrcab+tTn+88en0YYXxCubDJw8J4uVbsM/6x8/5d/+nvNx/h3n9jz3+tnl/snf9Y+f8u//AE94 /wCHef2L/rZ5f7J3/WPn/Lv/ANPeP+Hef2L/AK2eX+yR2h/8qQ/TFn+ifQ/SfrJ9T4/Wq+rX4acv h6+OV5fzfCeK+HrybdP/ACf4g4K472+rm9Jm9P0n9X+74nn/AKtN81Q5u+lVbvKP+sfP+Xf/AKe8 3P8Ah3n9jzn+tnl/snpmifo79EWn6M5fo/01+q8vUr6f7NPV+OlOle2anLxcR4vq6u+wcHAOD6a2 5/pRuVtyleej9Un9fl6Ppt6vDnz48Ty4+n8dadOO/hko3YpjOuE3yeVn/oXyu/1evf8A3rzcf4b5 /Y87/rZ5f7JmXkX/AAR9Vuv8JU+qcx9Y4ev6fqU7er8PLjSvH2r2zA1fjWPF5/D9DtOz/wAvR8Dl 15/pZPmI7Bx6Yq8quf8AlQn1mX6z6P1jm3rep9c586/FyrvWvXNzH87W11/mvOS/k2zdX/nP/9k= uuid:7127DB5039AC11DFBC4CC917F60414F5 uuid:7127DB5139AC11DFBC4CC917F60414F5 uuid:7127DB4D39AC11DFBC4CC917F60414F5 uuid:9EF2320A284E11DFACBCF5F943788E24 51.000000 66.000000 Picas 1 False False Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 39 37 37 Yellow RGB PROCESS 255 242 45 Lime RGB PROCESS 189 213 118 Night Blue RGB PROCESS 31 113 184 ISC logo blue PROCESS 100.000000 RGB 0 153 203 PANTONE 425 U PROCESS 100.000000 RGB 94 96 98 % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %ADOEndClientInjection: PageSetup End "AI11EPS" %%EndPageSetup 1 -1 scale 0 -45.0176 translate pgsv [1 0 0 1 0 0 ]ct gsave np gsave 0 0 mo 0 45.0176 li 117.999 45.0176 li 117.999 0 li cp clp [1 0 0 1 0 0 ]ct 20.5381 45.0176 mo 63.8301 45.0176 li 60.3721 31.124 32.5381 35.542 20.5381 45.0176 cv cp false sop /0 [/DeviceRGB] /CSA add_res 0.372549 0.376471 0.384314 rgb f 62.46 39.5361 mo 54.5381 21.667 23.9551 8.62402 0 27.083 cv 0 45.0176 li 18.1216 45.0176 li 33.1802 33.3477 54.6216 31.624 62.46 39.5361 cv cp f 63.7471 38.749 mo 60.9551 20.874 52.6006 1.02051 38.0801 0.666992 cv 38.0801 0.666992 li 32.1006 0.864258 27.0381 3.77051 21.9551 8.37402 cv 21.2773 8.9873 20.1318 7.98926 21.0381 7.14551 cv 24.5068 3.95801 29.2256 0.833008 33.0381 0 cv 0 0.0263672 li 0 25.249 li 25.0801 6.70801 56.0381 21.333 63.7471 38.749 cv cp f 65.2041 38.874 mo 68.8721 15.208 81.1221 -10.792 83.7041 11.542 cv 83.7471 12.583 82.2471 12.583 82.2471 11.667 cv 80.9541 -8.08301 70.3721 17.833 66.8291 38.292 cv 78.4131 10.792 107.704 1.29199 117.999 12.917 cv 117.999 0.0263672 li 42.9546 0.0263672 li 55.5381 4.42676 62.7471 21.749 65.2041 38.874 cv cp f 66.0381 45.0176 mo 80.543 45.0176 li 80.543 25.8945 li 84.7637 25.8945 li 84.7637 45.0176 li 89.2861 45.0176 li 87.9697 43.7939 87.6777 41.8916 87.8086 39.8379 cv 92.0273 39.8379 li 92.0273 41.7656 92.1133 43.3867 94.4316 43.3867 cv 95.8555 43.3867 96.5547 42.4648 96.5547 41.0957 cv 96.5547 37.4629 88.0605 37.2402 88.0605 31.2324 cv 88.0605 28.0742 89.5684 25.5586 94.7109 25.5586 cv 98.8184 25.5586 100.858 27.4043 100.579 31.623 cv 96.4707 31.623 li 96.4707 30.1133 96.2207 28.5781 94.5156 28.5781 cv 93.1465 28.5781 92.3359 29.3301 92.3359 30.7285 cv 92.3359 34.5566 100.829 34.2207 100.829 40.5645 cv 100.829 42.7754 100.14 44.1553 99.1064 45.0176 cv 105.153 45.0176 li 102.93 43.1367 102.927 39.5938 102.927 35.9824 cv 102.927 30.6445 102.927 25.5586 109.884 25.5586 cv 114.187 25.5586 115.919 27.9355 115.753 32.2656 cv 111.616 32.2656 li 111.616 29.584 111.142 28.5781 109.884 28.5781 cv 107.509 28.5781 107.202 30.8125 107.202 35.9824 cv 107.202 41.1504 107.509 43.3867 109.884 43.3867 cv 111.841 43.3867 111.757 40.8711 111.812 39.2793 cv 115.976 39.2793 li 115.976 42.1104 115.377 43.9248 114.243 45.0176 cv 117.999 45.0176 li 117.999 15.374 li 108.704 0.791992 74.0381 14.624 66.0381 45.0176 cv cp 0 0.6 0.796078 rgb f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" grestore grestore pgrs %%PageTrailer %ADOBeginClientInjection: PageTrailer Start "AI11EPS" [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 %ADOEndClientInjection: PageTrailer Start "AI11EPS" [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/pt gx Adobe_CoolType_Core/pt get exec Adobe_AGM_Core/pt gx currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/dt get exec Adobe_CoolType_Core/dt get exec Adobe_AGM_Core/dt get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.eps) %%CreationDate: 3/25/10 2:28 PM %AI9_DataStream %Gb"-6l`OMbE[LJ_q]3tS#.hk;RCln\`W52%O[2PJ[A8p.$lUE-e`+)02HWtBjem;l`:l^'^%YrXh)pjOjoWZBi7b__jiWO/I.<,% %gjf7q_jBgUr;Q]Us8D8Q<;K=,o"3_BQqtKl`IE=1f5JF<]]V232W_s5g1jbTe4$?XI3dY"+Wl(/pu^?*Da/X@Rnk-`]`%]mLQ>ej %r:KZcD]\oFM[qarn\stKs*ShXJ%kmHX,m:,F8sc,DuQrh0CJhPrpKU<=)X]qIX;%52`L=d#VDq2h1,=iX"XMDg\:aCp=$3`8hNHU %^XEepp?OTc)HD5Ent1DVo@:,M;G8rrP\-omT_?iK3U0E:1;r1rE#WJrVkW.?XmRDGCT>Nh3\$+pN/4X%t0&aEVM]mgEsJ& %pR?*XI__c2G's(C4\c9lJ+;:dNDCY1I/*JCQ@J;1?ehiOrF,)p[<:j9r+Gu#p$lu#@'eI7s6_O)Y.N;t>%=0';ZCD-mPeL$]Dh-B %5(3A&%tFT;T0AiqH2$F@IscV7RkMMOkB11hIe`L"?ep6Es1GU4/F)PFs74`S[pQfF_lpdq]YF7f]B&]FJ+\m&j6`=SeqZQD5Q1<1 %GMg(3irf8RN@`PVS,6"=If7SOJ+N3j=$FCjs70lUXAlb15K7pF7R-D$YbI[TBhm!+O5P""K?[VOs]AJ,7 %iXc(em`eC3nA>5&2qe60J1k,>r6sF!H2T,jrZ9hbhqnCna04?JrI44T"6DIKI/*oGhd[UTou2\>52@XCLD9Hgp@%!Rk:F_g %5%soN@Z3h.pZg:QnAKcss5EJ)J+i,b0Ae@!qs0_Yrp>IO?bCmcjj!6[qUOi![!6u3\c;6m&#]I+']Q]Q`a>X9F0P\*#5l:JI/5L3 %V='uD+7C<>n*f`5kC(*`p[u8UkPKKGm[ihfn*]Z4mcM+W?+VV2q(CKWq)k;3_n;W4CWn]'OttJp1Q:MeF;b\MIOt=4UQ))sNjPt9 %TDRZ[*r:;WlPdJ2\usI[O$0r7p9_!CG2LmF[*e`]=tAp]Vj:P%TnW>JT@W\>Xu4=I=4cXk7]iDVXt-\+Xt/!uT%EYBY(q-_QM!f1 %:9RO7Baq\g\EIQ4IjJ?^=+9"mXjf/0-b]6"lgKVu&G8i0i^6mN`8Bf&YDYX"^ZD&3E^DncDu99kG5OA(-fX$(l$D".-iI]LX.EU` %<;sMi)HW/P>"&6@?N+;eY;s5G8qjZRO*+_;QbN:9JSX8V_f`07""sS!o'9G]e)U$u^_Li8^Tq2M=7rU7Y3sn$4Uo0giOV*UpLi*q %`V"J)S^nmTqt9mXV7UJZo=d-\>hf7,Xl&0-kAq1":o']70!4FbaKMiYc.tEC%r3VdqXXt;lG6Y)aZ9WCoHD!3\3$hApRj&81nNbTal/cU9X"'%Nq&l.p[_Zm='Wd-YH-H\e$T\FqSp-e\f9u5bHLfTLNU^3PN@)(&*o,=9'aXcP%,h/F$7V(,lN2: %jBfT4nWpe6qt4q.E3_EOG)UZfK(&ZE';6pVYiF>\hUg68H9PZP"V+Tr]96DHqeKL5i[Pbrjf`iM.5O'=?[dtNYPHl;md`DEOm`8% %[8s<_r8MqpT0rr;Ni]u3qpjSPEDcV^Y/Md]2m80)m7Q]M5Eer>p`]H_b8#$=Y9,0Erhi<;2)j>TlZm%fmaeOh>\rI]`jkC2fTu<# %nSW3Ra8!<=-`+Ja6q_qKS%H)7*uBQTc7u5%f%0&1X93L8+.#Z'CDBKKqa8ao)Dk-OK`Umn6`[k4fM@I^&S[GGmpZEeY3S9I!\ %l`B-B(HLTTFi`s+b5msi?1_O.6`h_>::$I$42l5lp%5D.S+OqIGo_3)f)_/3H."KOoe]E,JIcefF>_?GR2eUTe%uNQ5E]L`#C`*dg$GO$mS3CjY\j@??Pmhf8@Tn!b:.?7#/.,Xp6V&,'`9Z'K\6R3't\H!E#iiH\^)CQo)&rLeZ3](\k-e63d3.uLtc*OE$d %0H)\f#d!3cTKG/<'c2-%eUW<'l4rZ+Ia2:Q%een&J`WW%U%IS^92;b2jn9EP@APFOYe7IoL%pSL_Srs!*gV2DYjPbCXM=._TbFFe %!VoK;M2s^WSW;(iG'QUKIY,>&HX2&(H-o9jkV";hn"Za?%_?7MD=^p'bm.pP6T*-rSMNUuHrRfNDU-^o@3)@\?Df!9o!of7[*Lha %5.g*P75`Gj)X%hkcoYp69f:9K3p:9t`Fi1:+&iQ;We<8D4BDSM&,dTbqTILTJhXpZ28AHl;gT6L,js-1:e:@#*_f>+#!FhO5aC&-6=2\^B3.=W`D40?\T/ZsTO^[Md3)=5;qfhjKnW7M.NHk;S* %m*C%+MsSb'r\4r8P-:b%%FsK,(Q^SJ(8m4&[4!,Z@jO6."SbrcV(Lq.@'bXjU/m0npd_Yk:AQU)`HSdhQ2o><(D6TkXASsT9:4Ol-Fa1_?XG7jNek9Vrkt;E)j7\H(EeWSb:O*\[C"IGkn;+dE%OJuYQM5-Y,DsBiq@)78m]r- %GHW4!/-.9\ol5i>[&2[2@lu=04fh.)H6VcWQAQYfHIPN?kd(Um&YE!UkOY-J?737de%B4gWl01RGYs)8Q<#ZMY=Zp2g@""LEoUUV %9=$cI:d1hVN%-3aP^HGQe4cs@k0MjmCCc?>4g/]8f8:?ODRs"-,0:m$@]65";Uiu/C-FaF\>VAbjV]7WM_5YU,1rK(/#oh;mmnr- %1)/PjYc.E?c)IHeFYoo&$)R4Ob];DqPM8\W2j@\k\QsNM %b*V4cnicNl7/1I;eOsu/n$6uFE)P<3it,b$NZC9R5Z8q&TuUG3`.C,^G'W]*@W;=B?SZ$M@mbXZ[!ZoS1;gckl:s#Ho?iQA">fYUNht4@Zh1P1l0)-9 %E%#RIOu\`MQ)'G9'DtDImR&Jn+.;F#Jl\:a"T(*`F;t`gF/')'VC,<0ZRK#!hhQ5u?Ho[K"(WpefroM-U0T/*V>Cl3KBq_&FN`q: %_64c4J3':2JG=n`K_&.,Th5a.,=Ou:q3&3aKdO>N7FF*Z3X#7*h:-DMNg'tAgX@g)pYuLgs8!FIQ\%:tP1rS< %F6F,j,YKpq,%/P@j`d/'h7>e@lYToTo;;69`FOnQj(B4OB#In@P+OSK68Ma)VtC1lb7EnHJr[71HjkA#>&RUbLC*q/O`Wc!q(kI* %0jF@mmG]L/9Zb%P,,T"LaQ)$q9=^T>+(k'W`m?`e@f#Zd#@5FaUTS]r[E\[(m3U(_Of*OE5AccFPP[k2KefP$rPG(?_n?WG'^ACt %hnid!rJKm-2-lnA:RGmI4i$),>!dhs>h,\mW[$<"Jc93BI#9<8#j)=3E.gER/(?D/ZqS]Dg;+C:9;/nKIddd%+K6C5i7jVHeIA/h %*+W/k))`"C;NkOd$;cISMF!8n<"lPS$"Y!N)g)D-WK;!EhsM==GsI='M)lAp_$+/"K7u%EIYab$,Xl/k%k7fAU2gld %-l2q8nR2$#BDL)[T8%;XGL8/$(/fMCF:^ME*f+5Y#"Fap9"a0B9'=e4;&_uBp2qERfOD:]?/sq5-NneAYIi+cf=r@ZY7ll)bNnE5 %?Dk,Z56(9@o[ATjUBAr>_F#@VJ"]_YH.;5c5P]k[n]7?\Fuqe[C)iHS%fQR)+EmC@HC2j+!A#"*EZX_[1^i7E`WHS-,NcnVK-Iq\ %^fG%dQiU1?'5W=L\.F@P:2)uI]['-%j %&`k=:Bts'G9]b-!$5e\TCCe'ho9T`BOk2@8ce6R*l-t>LH=T8=TY2BaO^=qASojttZR>^eZEC@ZkPjLna*mFBoYWoamm#_@4lUY# %T+;Pt+-&9jq?_.`4lCY!H,/_RP5TX@m;UPR2u10_pIUG?P6Aa%bhE0%I_b.*J3P.:r3fX?YJLN`;JY5>oTL5tEkqD][iPT$TP6F@S2SO8@Os5S60"/jIa %KpSu9?L_0iEIIfL?`3@4cZ_1?MsL#QDZ`HYPf:G].C9BGSp=d9H&]t]q.(Y@;1+UOf:]Il7=!!N("bn %qK.UmM\stB72"ML=VN>jAb',4VmH$0QP08BYO^?Sq%T_o7c4flg@]T7JL!b`q>'i#4mKpgo"2l:LLufNbor4^OeC %GG`=c5.6f@/[!PSY2`(9JW_Y51<)r3_auq_F:9VcjGP$Y@U'5%V3=M1$SF0H_uLH<9FN[2bbTe:%lILoM.mh53*F>EJkd5-o"^HC %Sh*fblIkL'/6M+!la_r[6tn(7K_YGX8)Pt;\7m]?1PaFJmdR!+E#t*&4>fqmPY!^R+Pot@AdqCJ[t0 %a5D66gXU2nkq&$-psfmV4']gBc>n)>MOJpY\p/L+b,Y(!q[(/)*Uu?7nNS&a5998Y*Uu?7nNS&aruW?Q@j(SDE1Urf\BS/d_)kKk %R2\!$Lfj%]P6baL+#G#g&^iWX9BWLqcTh2W5:qgR?OS/S#pX$m,>OWf_dDOg][3"f830H@G+eU<5@+3=j[V!(jE81HCtImCVeZqE %^7I\VS+lH`VJk/"'E38ihO1I*M@N/BK3G59N%jG[5bZ8_(Q&q%;<^M,&$#G$q['E(opVUWKL+!Ic09L7P`(oI'U_(=(hc:ALjBi\ %hjLTQ"Q^hg8:=4$r7VpQ4td^$aOIb!a.amE,c8D$Fi6FF%Wc@Oi,p(0]^ke[VK)7FRNL)nMZR@n%(RM*W9@dXKf=11?60]W[IB)S %^=_IJJK'$D9B_nq.=6ldTJVBefdGi/KsP/[;\:rfgta1e=Bqn"'[h8q=9Ppf5L)nd5%"$RS`r,3(\;X\,9uBX#rtPu3W8H;SF`bL %Z]puVKq+Nq@qs=_MTnpF"$'ZDU<.Z*jnHi.JpHmP!k8Zq20-S0u*eoa:OLN?uXaqZ8XGS.u<\0YC %dlg;#8W0O1Q;K4sn"bisK,5_9.U>9>6Om:T>a9:7bHOD(#ka(4V.G.s'/`E.IQo6%%]HV3)Of@dhk'8LF1kFbouL=;P6RR[CitLG %RjX1A71BM;NR)]"=1UnYdZ]tD74h#5lq>rkWB'_o&[>,e)#Z0TLT,a_&?0-:+p8mpYSc- %:bQ$Qmomk7!oYUaQ"6i8U@CKC<^dmtaK6mi=$Cgu`Y1It`#h&79%#A,%na8*i1"gb,*r#\T3h"_I^b)q5"]8uSbX\Q9=_*Qc[D%M %pJ>2m-d=_uY*C`N58jmk;@BSO+maT+9mj-KAN=EB5ORR/I8MSbpr)R(_?Na&LH`2eocNf6Y*GQM36k=KG4LRF:4CFi;LOjLE;,[#l#"\uW-jW=I72iQ]]i>gM>reX5.(OP/ %f$TsUIhk1Nn7fF7lNq&aSGBUZ@U[n>lJPQ/ffWO3ERDs@*gN@n6+l-/3.4$iiH$&r+'R#,IZCEfauu&kAND=+G$^-.-r=%k(-!s^ %P$5hHSBObMl[2Hm';)9UfJkFCX=T'!G5DZQpns,Cdq!HH;&36L"*IbJL6;l:&OhnE'8ie^K6G^NG$0!/=)%eGH,;>#2l/Vp %3VNMm)7bPuciGgF=8'Edi7ab;d%Dh&b`g'$Wb2#E8qE\U9W^=6#cgZs8=!N(lLVMQU2JPleiX7N%(mQ[4WFt^+nAP$mh@Fpcsh_: %M'jFb(efl*j<>KlI*6B*]9C$;$>rZ0sAdl-V) %W);aQN0fojB/kiOY_rKa4<:[A%rdEh@#:s`HpGBtUFR3XX;ur!&P`cQ&Z@NXf]L-<,+<#rEDSGPkqY3,q&N`'XSY&EK:j@J:d+YA %6-*clK:j4FWYFer#BjBZ\k>@d#]_sV"$819pe7CG2>6K76t?t-i:J$2LED>mB$/!T8,+#5JLll<>PS9A*Du*8AW?j-!upAW]B(hG %-f?&se'[a6D1$H0.\_c;XrXo7U/[9C;MQaXWL"O'5s!<'q_RV]HVn/>Tq5S2U5F1O*S>Ko9)\VZG52P6D)GRf,(Wg4h9TAY3TFWU$:iOY1&THA+Vf&&+dh[6$^>"mf+W\66cP:kRJH^)V(Ms&4=*sa(II9>FDYc#QhcsL#nr$Rq %nVS^Ts'8siGaVb*1En3)coo'=")sL:.XA4JhtP^348a1*#[@;(\_K:F[2b?t$n^;3kIP">T$9Q6al-A!I=Gfha.H<=gF)gf7MsNqEFTM+,K2\Go8>EZbZ_UN>XRgh> %5_gT?JGO7V#kDN;.UV`jrhOPJMj+1&/k"D$8cM;M9;+r/B(RhXl4e.(f'gBRf@.4pg)]b`rnl9krf?`is&c(H]dYmiEUs_@4ktE6 %p\sjM<=.)6nYYq\6thjTpSV)eq;0Dnm2X3NccBs`>HsrVbRn0U*BsHgBD#?lh)&rRgZCiN;==d5(M+PA1lkmOr:'GfSBiif5rbo/ %m2AVPE_H(;dIMU-bK;MBC^mbJJjlAugYUu8_o\i5<1.lB9:]3!HN!DY]fuCYhOe];q<@SpFY:'g-^"#fHA6+N%)(J70$Dg$W]2=k %NjlDCO@:2&Z$U9P3^R0\`*,>LEd%D)#bKfR#$=*B]G<*ZhR/H46B6[#>YOkmcV^!_eu%7TFrd0L/e':SOQDJT]jp;'p2rC!(Lfcr %KZlAbAr@SM1hnLuEu8m;EI?@nFiqse'>Vig3mu2>PlF;F]m.e[glbAUhZc47,3I:Q&]JJdZ,AY^R$[TQW@`.\'a$!S[GftEqQqn[ %Ru[YVb[=66@Ur5N)0XEKAa(EVAF3YrD4)c6`3o&n\5og0e7tM@)HU36*ALuQff25g'*FJbp9U%:0L/bf\)1CLXfuubB,4"0Xl\:t %ZCZN5>/RZuo&@5JaKcV?5$L[hh*t`FVY)Yi`l4ug2e'k-gXI"Lg<2_@.W(`'%+(2$gU]37#blQoDX>*Krb^Q-N!o!Y3cBdE"2-WH %2*gT3911(3noaETn4$Xfa,YibjUBiCCXXp%&W`#@`;ic$7#Bob!&9721"R^8I/pZ)C^.1:N4?B*ZS0M(l?fIH4jCdLZ>CtN439(@ %@1+<'8^P]uf6T9C6^`jNg;MQ_QD#\1['^#&/M(eNP\V4^OW,?.6=$GI?;ZNB5>m=Q]0ngJ3 %SE9G6AK9a3f1G,32Y1aUbc0iB/Fcc)A!@KUou8>d2Hm)i;g3f;TWArmRrO1nfWa4:f1%R91rRIn+P&`m1Y4_J!(.rWi30P."`p'U %5//.>[qq&5UP0!5qD[8)>5P8X?=hk\%-p#bZ6a]+A$r;Y&l]jk\e[,d'mDYPp1gA@8M`?u3mo,Y^1u`_N6sB;ROKJIWC3J&s0Xr? %EcAa.UQc(^mE`5dF18-NV %ng>!Z@-b+Cs"q0q%XsZ@VfsW2Ifk/(=DTp:_QFX10aI/QCCK33lfBhc"8G_3"'\&OZOpCI_h_/b)"(Y_0kBiGg%cVsJhW-;E,T(\ %gh+oPR+Inpf^`HTgB3\J=0TMUL*e*\FdO.O>6=ZGil[rqLtRqQM#K+5Y[ee$NlgVX91mdQstNR7HBg'=+Z9/ha6#g0nQ5Y]J:IiU#k/ZiS`lM%trA'$H*s %[,I+TAobM?7Ra_`eF&sTc*kYR%FI.@P>;W=2s#MScI*J(N;dS'lTf4eW>5mbY%BAKDMjGc;oEBD6KA-GE3bo#G(%>=NFW8*fkZS" %WD?poD/K=,0"Ap4D,btM,';Y/,7eY6"c'Ogh:j1)]$WS,/NH'8YD&Sjpa4Z;rr1K5L9]FE2eMZ0[A:^->`t$d["PiFi$LO(@XoeG %pGL!.__jlqQGjV5Tki%gRSAJA8Tuj1$>NC6`Pj[5FU"`abp5?-l"=-5lA@krI[_gqjCddX*co3#TiYuseJM/Mf'64JL&^c)ZV\JB %$:Mn995X+l4H=bql;[&9e3TEPCGN>Hf"KIiM_8Woi4C=96%PuCoj==?#qOBS"q*Sd^Qq;&-b%pD2M7"#2Y]%VmEQQj0,AgN:q/I\ %CCsRYo$-`=0;L2^%MF/8iGo=@P1cd-LB'7ZV[D-SNOV^;jhcLb]OinACD?8 %mA+,#0a,cbj.30R2e!XOI%mV$3pp,M&-cgO17OdOU'+8.UbJS7a&,OD=(2sZf*3Ys'frK=`Rc5.BO,C,UhiCL"uRWK\8kLk$7!ZV %&)=uGL+k$IOY0hCNOr9t7#GXa!MX>1(Y!/'OE7ONf0$;32)\id#,jZKTSLa1GX4XN$:9]kn8+GZoU0J``oOe&+Y<34MQe6o25rL? %.EAk;X0KRQG!*.,@MXn30P(c7is]([&k(=Yp*/(cg,.f8kIEo+XbYC,QL6DTNhHf7o)(-*Fq:He41V+=pGL#baCF#FKiBi=(?=EA'?&N-mT_lF01[(Q'io+-M>-#^ %Lj<0-"];g\g%Zf]go\gT/*pk(R-`!Whh*"?EFT0%^QAaCgJo?*KTqIi/96>3]C$FZaN2Ug!VRjnNu3.ZPF-?9EWPor0]0gi*HqE] %mS07`ds3gGHVoID)p=i4E:3M,B#`M5?VB>SuAEFc3/dkQ-M`oCK68"gesJI(l#iOpPNGl/u!6M>%c!L!_hb2",uedNsK,2CM=r %P2T&tEFC>U5e\R_'c:1#fUK?UgW#QWTrA&88#4E?SVD'+D>RY<.J;)nfKkH2)^(9pa?/VZ^-hu3F9)PiAQ44T+KDS6>@Em//P@TA %k;@(C`C9IfV4te^C9_0O)r-ZPG;5Y%eU;475!+"g,qQ?5hP?pPXCXqE.B4bQ%Z!+.4e1MR^/V*L=S_E(^`V@Hhl92Q0a$!87?@g%l:AV.q!R?QS:9]6`)PLScsiEV7GBBd#Zff3tZ" %8(5RR$!umaKVmq8,uIa;)b1S>Y@%2cb[Ri;Y+jD*/FTQO9X_7fmguC6B\61hOOINb*TW+n_,K+![KBij% %bq<>lnk8#&,c>:*FlK7R8gY#@@7sk+%j]N;b %Ns=4i7<%XLL=aLeMb+Oe*\i/FYp#39T90pO>'hPSO/CSQT-59\OZ;*FqXtVA*YE:"!%kN(0f-9#1"P&U*a+og;lugW7GC3ZRfV)g %?YY3V66'kE/ZB41/rB?E+BHM:](%coa0OID4a\LkG^"iI>C(.m@J_C0Mn[*"eG;^"^^,d3h_*%N&n7dW&LR]u/XKV3nE#UY6%jZ)TebQ1jqIjSm'Urf*)Jed'B5 %]$I*^*1V/YKt"e4kNS\-@W,6$.li\J#Y^po';/9G&T\s0TSqiicIQ\FA6krs##+cre7Ad-5W<1\r)0=sGA"XS_[6pU@Kf"kU;(qD %k`G@42`k"`C*+"V@Mg=8jYM/+]LQK3TrUqZ]?X-!BKk %k`ZKt3e/$O%M)FP9=9RdPO%g'ddtmB4SDbp7W_g!.S-)1'Nj)6UHB/(.lKYmoZo4W,"1eKCm-(ui0e,R^#A,dTIn0DN7b]Z^I8j'!ge(L?W7ijjpc^aoNWtgV;;DHdS^X&VhW6ZEB1s!`0lD`:rKIs %E,Se)V=u1P-,dgt5A3JL=ZVY.?JB!uH,a@$dn.]n+Egi;/`B$OCnJS`@+kXOnfsp5#kgdHhU*!eELr\,*i\1,.c0UNpdEoNZ`n?81!P %j^,lFQG!d77Ri*02;7r5)>%(*eP*HqQG#:+PsMuH`%aVTYsp"t:e2&L*Q++6VIKf_0)?H#U44di\-\#t"_7nOYi9+n!2%^/EMk5k %17OSSDc9f5MVtcTkQ"K+JJ'2qlOp6A.^dtLH_i@YojC.Cin1QeP&RlKS5&oq@em]G4Ar:@+ihFoXa0ht(8cqD-)-1k&V[a^7?R(S %m3m7\#VgJGb%5r:2d*Rl7<.1u_#R>B0Q!tbZ:,6>ES9$uLuo\`))N:4FdNXF\!Bj3Kp3R:)-$:89[e]d5Bh&P+fZm6Gbg$tKWJf` %Gu<+?W;:Wo)8ASuZJP*YOumb;m/m#o6pX6&%0O0r(u/THgk7sLSW#X3n_E0U!HhelQR_++pA(.kc_Whp72g!O"V=`@/W!,mn-r0"a]2;;e";XW)VJ.TmX2*i+o %.b[hFr!4Gr:,Z*/oc+C(nkfJ)>f7ue:tD:cr*+g1=G*.")-e`gb#UEU!>Ztm'R1#O&`Mt5Rb`_c"2167'8=$3Ju$I#5V16j@*'6cb7dbI_F+&F>mh-3$[VX])\%Y:'jD=*-Bq2=//kIXOI4MH16c+B#Y^A.>=2nr[p?bV\DpK0o_e]iUCm5LZoIJEcc %0CSAuhRr[XrEk'PjpS`o=#^0F](:DU^R%+W#R`jAJ1DLm%=*T>9@dUkknsb6h6_+d<#c!f<4.L+h"4"!r[mLLO"!N+b;^-$->YN(N#Q:0?O5N9_co:0W@R7\"KH@@qZ"Y/>ph.1#1\42r0a990'M %o0S\*/[":ANuH/5?A;];?!>V$:AFG=@2$f:0SpaoiRS(Ue+ZNHk?OIXd!:gLJ/1qSAZ(hI7YV-5N=J %-J8U'#C5;q$TM&-&hCKD;Mp.+adk*QUS!GZ@GeGNkD3$&?nUcA#/u.kXq7'K2*@A>r#qUg>uikCXoe"h[HJ`#,8M:o=hjB.\8dfq %f36.j;`SC^C9i&chdsV`o:i2GV>L[oWQ#LRC.KD7C(f^0,`>%+L_d-*@LJG:X+g>5M:(:Te4La>(AIZQ0f;&Ohn#MsD*j=sLGU6f2Db4lDlCE@QQFa<3%e5i3tFre*6d\VC!NoNlEmPYH;GZ2r2G$#XQc %DkEYaJ_#QCWe#,/+MHt+."uZ]DAl4g%,.]LDD73OoR`H502r"!Aj/^Q_E3RF+W[dNP4W9sHdlR7-sABDA`,8M_$$[D#FHYDSg7H7 %V'3L:4Qj0_qF"i_fPO8&_[`i"Y;KF#>D&Fa!h`&c;$@d,FSDON;%)kPd#^mInQZY,&,87:$"O,,hFIjNWQRstGk!*XN,Nrs&'('1 %7'f&E1sLbQEeDDQZ,&;<2r]M:\Z&(WRI)Qp%QjTe=lj[Bi;#kmQP*F5d6thd%Nr27?$7-KhIIi`Xgo9G$Dak]!l4od %k+JVGM8Bg_d0(^SWIB`7j4_O.kDC&h4FTn64KGm\#+BLr)pC*+9mBe&TR@lAA)2L?Y1`*Sb\JU=kDjc0ie0=R*2GYSHEKqWk%Z;V %"MI)6O1GdZ/4K[\HnEaV'a%C&!j$t?HIg"`o3:KW*gVX.4K"V$h4[&JTPqM)(>28_i>]f:`aG<\RO`>Yj!e%oM]R`XVG&seA^JYO %mM(t&7*>s9iir>$aa[u9TaWk>FfGJ27#.qH.:*c>CV%<6SmMkT.F/U@&$qXrg!AYLM%`WPcd5gA,'KL8)4?to;-u(+NtEtsJb*%S %bPjq"qK$Z@@q[k>]'Kn6YJ7e6[@\rTrNd2_-3iWZ8&R/35^e&MQ1l^eC?O]LfsX5$[MC'3Gd(3>S]^6A^j5UCI!LiR.(lfhi)GNR_ND?IjIh@?bCYP% %c\p\8&^"'6n'q[X_M`@T2m8s;SNouK%+(EV":6K`^_]k+"n\uW(m8$r#faaZre*t>\8:"YOL[JCja+$RdE`HFSNJ*;oP:83\CASY %%)YG;a>ril1*n<*YL<.NT=@6#d,8[u"$Cc%BTtK)PBD,,lq!Lq'dY!b+^$T&i\1bego?X]f5^TNaQ[Dk'1`4#i0YaG85YRnljRXK %:=WZ/J+=C1G,k=dO`bc,o>TuJZM;m`.2.N)JY$1cKUSDW:qI:EViTGA_EHk;>'&[&Q2Cn7J< %Ue'Jn!RCMGlpi-VN67C^_Xpm"g-@ZL3qI/&\IZVV`rgOa/OC0L.BYXbSM0Y:2r1U0r)a&D4.+a5(KL_j;`INGZZ$N@P8U$Z3ZQZ5 %L77%0)'m`?>Na9b5#f-LVa835oH%!,9#`%!r;-@7q,u8U=jBpI>k$a+>aVA=,]iXdPBYu]WN8-KUrM$P\9W)LL])qJi5urGr?L4? %ic=Q7fSc%CaD#[J8b^*tYa[!t:Sh?o3p[k1cUd1,DtbH!W$'Qs_j?b:GB*@f3_$K,J@-&dPZ&:?3;&nXp]9(^r9B!Z0?o[pWkX+r*=aE?Nm^ %eQ3#-'T;aeiU1g6KjtE<6l\4t*%snLE>48PPf)u.)U0Em_E=JY54XEiU_j)DQZKXB<+PQcpH:lcB %q21`hM[JO"o+?I=a+VM,5B_+\^ZO@NQg,W:(1MHZ7S,Nl%_HRfefdK*`,jru\SeuqgL:m#;8K$eKu,2$&a^]-%I$@'JKFcp%KG[E %:_hr[[ZFTD*Gi_^gj33j^7Zc>Quc,>Zd#nPoiZ9`pL0hE%X)S\]"uK7ko@M?%D2G&KF_Sp)_%SW58dAN(6PO;'4K&Pi^58KR&H*D %@eQ=:'YMoRihg;DqB@-',tVCIqg&iSJMr+]CaDhCm)RmhLCPiU %^)L6*6AQ05qM7ZCAtS?]I7k(n1el0%ZJC4t4FI@mn5@V4.u6%r;*g0hE^Q/lMNSA1ls:MT-88^_*ObOMpHbZC\MJ3S9?8pOq]Ka> %k2PI8G'5ueIYXIW3Wrm0m-GgKl)2RkIbF0*5L"r!#IF&DLj:o=,,&OBd*_#LqO$r\kPH5Q$6\BGM19Id;<\\VT"(370At9k_QPkEiCS-G!J6(q0 %55$12e\YUO#eo5N>%1qY\e(&-l))@&+L&9Aq?D:2g/6e%gWh*UKLsst;d%\7m'@XbB?m%W7HKXlV;2`f7%X+l4Pank1Yi4pZPKXF %a2l/+"+W5hD_snH]eKkd](s'OA^\QY]^r$M2?1gfajC14X#Ild96Ygf$^e7ScP)6=rGEg8$?cp;W`e^eTC8" %'be?F*%"VH"44J70=`-j?Pjn7,RgB>YlqltAP'cNU9YC7-`EZWU(`gVr4<@n!1^Ts0m_qqURf/ggfJZ&C>$`\c'SVM+.n'1# %PLXAtLa)7t2YFu2?Usa\i9;!(&m2i#!K*AYVi+NFEL@,c/OU*RlGe(ak=]9-6(I(DeH$Qn7B,\I"SO?SL"*L#_=o4q8TOL3cX(=b %c;Y@mi18-?#QjdONGEg966(gaUfK_Snm7h'f!9I?K36o'[c`"#I@()]-]m7@k49F\&0%Zn2\r4ui%o!@Q4VU?dfFt>HT_H`Ai"h\ %@TauXgJ,b.Nl>:j,5BfM\3nJ'mLJq4D9G/V4>%54MAO`EG@nYcV()s,*li]9:npo7?`(hj\7HT&5!do(S %_M)JdD9qr!_](%Z/fm#A7ld-3A""*]T=0%nE2XNPdf-)T6,'EoHK654Y%Ou:FtkbM`jR1&DKh,R:$@>eU(fb;D-EA;Vaaq!l*V`s %WZ1Kt`OthZp,^627fM[05_f"Y41]]g%pt+mJJJ1gYSVK7$)r#Z^7C?_]Y#,Z%a[IGqj9nd(Gg=*,I!@\X8$[Z"G5eAl`.VoI#@'> %YY0b'R5c2J8S%7"2C4E$g:;4@_plf4.ldSchNDq@boQ30c*3A+JuXDC.C:3^:QLB$J-/_?d>L>A#2i%.gX-]eCs/Ca=(OlS,jA@?k$F%^]`k92!)m:N-+:gV[[8%VZ:fN>qE/dMdlHX)'p?.]Q'QpL(isT3`6:5Tp^VY %!8_j,(^71jkeN1XAMp+4,Zo(EJXh<@)+J\NP"[#S+agfW2',uOpa[F-J!0$_phn*`6'sg3*6O^::*-R,:3PtQW6X6lm%G[89j\qq %5]m7@+H.djbD_*^eq>P##RYiT`mPl.UEb7_Mh_0NmS07?=M),f %^,78;r5El"'%o^s0S/orA[46$6KYdK9+u51"Jh>'>]t[,?Ed$ug.O(-9>un+@_mp%W4?%5"@EJ>4,g6 %'I*)[S!@PKE.H0h*mBet!Gqcm/%,[;7MnX$BHb^fj*NG2 %gKqEGS`)33[h>$_b+O\#4LO=+I;+]^>>9Wf"rt*Ueq5OUo1,h$"Vq]P[ff'I\%ZUdhXV0_R[n_1o(?_de,)]obfSu/l_Y&b0Gdh= %>5dK72:X(/6_Fj+F&9!kq_^m'PZ;4mkYAj<[ii.R1*V0Yf*b0f)lFj/VsPBJH*t^TB\Ss(>m]iTcds-"_0=JLhXI)tkm4!YX/08N %3S/HPL$7oN,3&_k%1K[8jS%kL)4$<`JpM-Pg<>^=FHdCI5GdUpgIcu/+\!5G0YsV33oLe_2Jh`JNn;i&(o&?#^?YciUL)/PQO5RF %g"Shi[;YXS!L;:1W)3=Yjs&`P`>&+R+rZ;VMa]pqVG]GI^Y)$'K;3I8,ZZ^b;25jrkP%YcWXLj*aolUTm>8\kXe:rgP% %-W>CLL]f#!!icc#Mg0HL/lAr0Q[:qsaT\Zn6UWJtO"A?,+I %+oIF*T9(G4Qr+jrFBG=>4@6#%KBoR@>b2&Ii=4-,]nfnWQQ8Pb]Tjh#\Y?)Nm]+1'q=W3Nt@X6j`@md[$#n<.m1qhPPl:sk(MRr?Y#%[gABA.q2a\gs#8lX41):i3E5!%blar!k&]Z'S:2 %(tkI?XU9[C:UNI8]E8>k7P%F;:0.?b?C&K7QK0LVKJ$U&7[gaGdA92t`8(qM,W;Yo8?<\k\K\?7b^A;G8s7Ds/+2s9q6F=o3-[E' %.--^o.C_+%208@UNT:N\iEMF2NCH@?YYe+YG^+gqY=<]*j5G80,6J.hE[!RY]6;b=3BTUbpsEoGQFpLk&/,Ell>T\2Oql*PQDPc> %ZN,-pZ4;2[-soI6nt^8]pdna^,I2K31k`+IgUe2U)0'smg,.L!B5IL<>44qK?T0pGL=]T&5*+%1Q$EJ"f?Ti+;k0+I-WYAGZ\5W,@O#Qd+BFX(OZY#i?VVXPGmMX.jLRi %o4]T58j*kK9[C$Z1h@L33WON+15/'R9%cj[%^J.7RA)%N+tGsT8t7F@a6?SgW^K`=$_.ki;R<`mf-Cl^eHOZ)G,88>K1[?JBC-9" %'C;Xa5A34\]*EHP>0lP=A9XPiqm+^)=H\&7VA/ERm0M!6TY72t)B=;&g]3 %C4sl7l7;6maQA-21Nt1n(sTED?]2F%&S#TWHh@B3rS6WdYZ_)qh`heljGpBa_c[f#-R2DZGD.5B)BBb;87G2eS^ie'!g5A$DQkj3 %O[fS=XmiX*q;%&W-1BH&IRYV=,VI5*,RrSh[';VU9lmc]7[4R0O'XE'1?,ag;i&6$;Ks=a9NKZ>pG0(J)[N,L8"]iOI0A7<2HL^I %QN92cMO4En"](58cME9G@FKEN?f3n]GP0I98>UU)H;M`,Cn$#p';d&BT2Tfnjo2It[tK7[qmBRUHlB7L.2oOuZ^\;Z!31At>rpnn)M5=8;-`#A9oP:`1O7hS(&iB9;)=WjgYG%p),!'M5.>8ZtJ) %3W"SIB+Ba^f@DE.d"c=hcq<@*XKJ/K\@H$u&um0iTZ_4-G7*&MH37d('_@<8?!PU5Nc!1r`^ZB1d0@FmWkUbuZAcD^%EgIgA6-M& %X]m2]:WffS6[>A]Af"Crm8di7jF&Y:U85ogrp;e@`Op:Xf4,I3bMojHp\)u:f`su9fXjE8.r$.hW5Xno<7j:p4R,A_0SOa]rqqbP %3l8Bf)l$AK[-X1uef"]thhjG']`AD_NXVQm@p+HJ:+"qbMp=j="+&2`?6f_j*4`C1C)6"U$m@MXD@M9W0mG#a2R3/LThVJYdBJss %Q1dLWFFjMS_>^8>],"322Q;<[eEk9^dRIY#gBaK/ObMJ0Jh!JL"VAR+d+"7fT-r)50UfCX.=lEM\=,;27*=YlGRa3H+3M[k[J$GI %774>h&_T+@Qo`''qt098<)37pa[6m>XC8RtWd@dRWJ`(`@0r#WJKr>Ai7U.>3EL_H)\Jic+!JIJDUfY5o1#f8T^u#2m4>6qqdNXX %r>HBj%7I"dCAj6RW_#u/VEHC\\*P[ljq/8dH*;9/g:ee69(e$t)P_K]fmj-lX>#D[0U_q!fqL5%jB:38+Pdu@mU?oF+-W)N]Go?+ %88$ko`(,K`=)btM%&-Ke/-;][[Duf(n2@5B*FK1_A#NJ%Gr)/:QHiu-*0C?V5jb5Ek!L/X!ol=f)9O$(_R>Y1Od[V!YOE#jeuh@$ %a0CW\Ys^,d:Uji8LHo/^G/D`f@fo8=@02j.A2?339:k_uUKVYu657"Z'hgcp02".@6=JR^X..+N0JLW#@J9Qiib2&$pXY_]J[>/Q %?qkg"AFsV'\JIHDNT2DKBHSu;c`Q-;:F:FL6YBdR\I6s4A:j]t?)BUmBT/oOfYV_m_e@n%)doGXe*E3NS=,:h#ekI) %+P[tn'Vqir,VaQfHZp;\'L0sH0dAJbh.bDX#F?>dXkbk-`"Zh\1uTr0X:Y'*j?mh8,arKs%Z33Y5-_>@7.\;W*A\*ZLsJ5:QBE>- %D[S+%QlWHYYs"Pb2H)7gBZ,<4'FFg3FLE+g7lSquC"sF7C53+,/&p_lfod=H)QuH0%UuAgrmEHbXDccB_[pf1`fLQo5aiKsG_MdJ %^dRm6b,H%kK46TR]G?X#hW$M[NC6VA'pp.U'rJ^u(f:jJ-hOG!+d=>!K5>JAMl*>S9XF@d/ebA$FC.cu8/WO+d5M]8DmC?ZM9S\Y %"#neQ[OmNocGXl`87&9ZQUa,`&5O:_g"Z-[RXu72B#:VY+L0#$ZX0/Q?.Q**i4M*Mr4UVk=69LpKVH`U9nbABd:jP0%M08:9j*n6 %O6DZ8`mMJ/#LfDKT>8"Ll(!o,@24e\KeO]NTXYBmROa`1V$9T'WWut,G>m]?WF2.p$AD9l4,alK=-@D3=m;d'9$>EHeol#sYheZ` %%],pnc+ILfM47$e3kq#$kJO;HD[7dd!V7o_,^*pELV*c44k[<>mJ/Vi++rii,Yuu#jacYUlGXagL-Q-P %cf=j>'YSAZ]!2EaPT'unYAsMIBdqooD\1"ldYslnj'197`gXeB]\8"18*^ZL>/eA1,.K>[Omfr_1_PEe %"F;"57Z/CRFSXR6Rh]5*VLuj1l1bjAAZ'/".kB1ac^t6BML&GH5o5'kl`+9p@XV %0#=g8?!SBFH+&Lli"tM-?*n>7H+l!$"5;nrh([P,6tEh=&+`CN3-oo[Z\1==>GMb<]qh0'eI,s<:n=H;oAoU+Uo6qs#g);8fEUmN %XU]KX`4Y5sfUTk6AHT0c-3.Frl'UP!Zl*0@g,M3GlAmh'ZUK#I;=>\2pg[;GPe$\DEVB2/P=R&$"flbK`D-1gG&0ZOlSs.WK^:'N %6=l94lcs7uEI5LqW2sXYM'7$8E7ocj^BSs/G!PbU1rCR0!UX-.%2&/^@uoZ1:/kKh.@EP2&j*4<+hE7?$\R/j2;g>e,PhBm!J82o %0ROoOJ_)g91(E(g=EfVZlM(T@60"XE>T:<&B;9T2QkU0,,!p2@W'8!tSn0.`,`*!r-HciG5]cu]H!c2X`SL%bYL.e*le]s8@'J(*D59N;\7^Od5fI%Gn'=.cBFg^2G.@RN-hF'SI)i'8Rs\Q7B[[Ej=!?W]MOX!I1AU;5,c^fn^YKSB;.EndEk:8 %k]u%=SZ4r0FeC?8O];p\V?>gg=nIaI[uGSC2OJT+0_F:/%YRq5n#JBNCt4aHU'"+(:RKe+J6($+cWkQKoiaX'C+DUrY\ulj?J?OB %j-+hf>M$qmBbIUh]@,YN>P9s*&Wo!u![q+;h4:pN!u1+I"%(i[>A[m`a^)fi_bEjk\rT=US%(@N/Qu=dRn6#'fL+nZ&[Q7)D$9=-*ue]Yp1+G]$X2F#OeKj4Lnn^,R.,J>p;;5W8rUUE9jQU1&"cAJpm+@-/1U\8b-6Pak"%nLGuQVbfe %[$:Xs+GN=(%B1B8&mk^>U87mp!M\;n(^h8_4hIU?Gan?l&^Xnd+l?Q1V)fYi&'qKc82e5Ih;-^:00/@g'dn$q(X_d=qI""We#d]l %.^_)Ep"XM#F_,g?3jnOuqMnSd?acA`+\sNr*\]UcM>KhNrV=k6:1:d6OpX\HjKoet5H6U5YfU]ZN2@;/'=Kine<^otZcgsi&W!gF*hYZ2kKS$(PWm/n85c.h'M1naQuhCX7,!Wp"=rrUFs=LAIdOCGFhldTSA %U9/[2:bVIn+B0Y^Q9Z\5]1fWjD4e6k>D[<6mr=NC7cEL.C_L++\ek2r-4m!iZ(R@i2c/^>eh".(+4NVe)ZZ<&>KsK`_eKZPHSke< %(4;^h2?t6?Uc#bi0FirT2'ZA'.mB=?cUe[N^Mu7A`!g%pb5";BnKXfEF]Z?n9R&4"&$p^@?R-,)$@Bq9YDWrHq %:Q^e]2OmOKP%8p@e9obCgXX/5@3"rgjs/#4aqRsn+-ItlKfhiB_Z'A$?++>5`i9;NHGViVNalV;N&,a7pX8#9d;>7#gVFfRPZ]>M %%q&[T%4'(nWVXFMR(Qq82E#f6 %[?BQ:\]Olqffgu4]V&Q1r)Yr=l4"W`]+^jr& %#K1Xi+Z:[\KKODaHAYCT?mjNoXD5.F6ooRJgI`,e)e)-O*[N*'Npmh;$R9N_4]J(3qgA$"3RMS.E%gKoZibRTOm,"I)ti[Wnp2G, %/X&LBb6C.rVhtn#'>:-'].nO8c$h4EN!ol&6&rtDs^YaH%.i>A %/+,'cmYILF#Wr$`=I2K.m['S,>^(3rYd_qI@&!BbR4.[rc7?>O@@mbS)4XEcER9'LAC&"GOF,-S#H;hR=HpnlXc.HZ/h#V3!iVkU %:M,pWh,,Gnj!pM_joib/b=N>/At!aPt&i_L+FJQV+aCmKb9"Q71o*(.mS&@%p2rI>U2U?5urHq&3?r.^&ZU %2^:>]G58Mqg8]cPp$ai'fbc5,4K%NsFtn7T#7+PYUYls8Kh64UJ4?Mg%3EYW258Sr-Q:[MAW2^Z[[PnD)V!\k4g4oZ72T0AdEDq$ %X^LXXeH&9SkO3,mP=Fo&#F@/*8%gSaK)Xe.ggL\b_J>7"TIT+pV!JR=_5jtS[`oCc$3Bel+elT=![hRdpU]UO<$AU@YR.Y2D.PiH %:,er`.j3.]m)Nst=)F![RIqr[)3rtiU:<&@`#`2ZV&s#GE\KntaXFP<\=+#A@sYH[e%mTjNPkiep6?KuZ_02im+<.0]3=X%%tYeL %ahN[m,gVq$H(l,Af>OUup1,=L/!iO*9kr`l4a2Kd,MCgo-;#f2'fd:`]P%P9iA'NVnC"TlJLPNjgWg/:o-e?j5A$Ca-*j[JgpG6goI%)/r0c`iGPsK`YHKl&`atgH9 %A>$i4CH3[_31]28g:58Z1. %:l0/=l,"Q./`5W*69>3gJEU,q$oaJo$k'q^.)^6^&`A%/FQH(W%j;EKMfH_+Fm;El!X8=Nq%AK*bi=sf:l63*_')'sk\4Y@UJBM0 %Jtca^^H@,O9P)DrF5`R(3_"i@9jS+4h?Nmc,opHNl2g)2K0rB(I7J4p&M5<[Lob'G#Mc';3OA8,/Z.N5(,ZK>U'n7a/!K-%2d:l$ %D$csWHY7U3hLPrZ$1+1Z_6<&FfUi#Nj$n=,^%aR:%O %fn(Nj?ilppV:H6nNYV*#!AQlefTug]6cQ# %oI3H!N."nRH+4Y:R$6?^g\8eE`]Q@:"@YU75X,Bh(n](O(s5=0l151,40OZ^3^M,6Ip>@j7$bW07^XA1O0J.b$1T:IFTh2i8f/^@ %U?ndO4'`'[2.0pM4P3Xc7!D&@/'jeQmcm%YlrJ8e1:#j+kM8F[+*tGF+4($75NPZF%C:q@K$]3I>IF['DN;Icm290\@Et4%=&U %cI]V26!2e/rp*<+.u-K20r'dY'OIFo$.:*,BN.pkm/F5aIjl`Q.i9/O]"ClsU['KlGQh8)+:&o/\AB3kELqe!3(D6*9[aBbik_O\ %G1iQs2u((c0t2cr;Arl$)%Op6dr#n[PS"=#R#Ig/e*^a8BKS9Ldl?Qk"^MU:5N"U>8Ct3ln\QFY0K%0/M&(Lui^T:FE4%#am\`*G %?&;nKURSMu!rIp2[m0OQGPM>oI6T\*!HtXX*)86m=RPdh'0P5fGj12,*(`D\r6*8iJ$4mb4jN`.E5U/:-A)f6W.FOa$_=sFKW:P? %)hSVk85<"(lkGmf9Z%PG40FE%=?c3HL;_,q#KU/K_`O]$d!:(I`^$OUKeWUKjdEPKM]S6AUcp>CkH%rEGV!P(h]GC%Z5e %>hnR$Y_gRhhHL3H %KbBo_\lKRjd)l6V&F@?$(T4=*)\s; %&:gllUdZumKd:34,%DKk8e)ONSP?lGp;tC2Ji=OeMb&p>62QF&9&AT`C%rW3nNHaNFgr6&!r?$`a90'7#A"#/WR.VVaEOW"'sCW %KFGUcG'BFmr-QCIZC,(bnm^Ya[5iTR<:o$Z63QTd@O(A1p%"T^263g4WpE;B9t30gX%X9:P=7FSXE&/qm&'(#)?#Z"Wo?2S=jPnF_UKrQ %ZO4M17+t[3WrjnYWZKqsf6Hh*ZXY`O%c=976A5\H9Ht54!\Tf,V9u8&k<$PbmFU"!7(?"uEl^,75@CliJ;k06Mo])[$p0@;aYPd3T6dQ;3CXPRg=N!:U]Vj;6oppuEY(.D.[HNuY#J %F?J)K1[h4%o)Y"=5c83[I&Ob`Jn-No)!8Bl8_@_=$CqTn1q6SfI7hm=UjbSp:XLuncaN0P(=^qn\53k"XhgT*/(_2p-C_>i-BcTA.HKXhD]?)JSouV %i5Q_NY4s^Y0%.>][c87`XcSiDM3=1D-"E^=b&]SC.99J5?J52nD2#.In[Lu(4N0B9Q@bST>/XAp!Cdk+.Ko_1jUP\jc;+Q9"#7"r %\gEMK?OVB`G*c4_TTR]m5,lQB^?P:6Uu_$Zo>mQN2:cAiMJplOrN#XZOhJMQio6Y[l1F6TOZh@&e,*XN`9tnPK]WFT.33`>0Mbd4 %C:\CQOsO`Z6&_D$U%_;=lXa!?d=]-EGt,u8jPX7rf!fHaR`U!,SX72M$JWi8F>k"FB>_4D.>'C+^DcPc\6Wu^O.'?c`le,X&-lMY %SeU4$@L8,^SK&nZT"kGYC,K,RDUG]*2@?_"'P/q:>W1Hq('^G\Y_35h"aa:a/O\HBnQhLu:7(1ImPZMS7Ceo;b63>]1:Jc0*2h?r %4riC-)b!5$p:7b6hi7!B6.T6d^.pWQ2:h+@q@C_63X%e[eYqiFIjE:CLl'k(L?]o7gq_] %IV<<+H&jrLC_c!ulR%Ym"kPQWp?-"pSFrc<:A!d"HYK_%Y\o(af,JH)@lslRKP[W[;'curD-Un&"b2:hpT\5+)=bccMpS?bfS5S\ %2"I_SBp$%n;udp&iYnnU;^1%VaR##7Hb$ZAC:ZlnSg5dLjheabc3u%0#Qj@[gj#;^hi77_"(ajW$1rnm@eY,+e`OYBLsbN!ZUDOV %jS%8uF6hj5hsErb3I:"6h^H)mKKKeGEH>Sb9UV-sMro-6<#H-@Unb@<'?GStR,QA7ISuPfoCRK2jl!CQRSPPh_"+c5o8b3QC`.@*R`I`9Lm_UI<;LZGYu3J`UkKDt%\g=I&]K %SKreR#YC'IL/6LG4="0lr12'3U^34!=-g^6Nd[oL2F*sG5ns[OiM>ZG7%KE-9DJ%SQ"/S3.mog]m,h94.D'R%OHi:kVMJ1r)kbTq %LhF8:SNa6e/&aB^R*qT9-&UG?ZDrUn@+j08Oq^$HjsR+Zgd3YSqgQ[8[pEY6oOP6a#9DnLR$Kq7c`"eqR4?/IX)<1'=*cEq&C`TVJ9R1#MJc$+koB\#l43`N&gBZn#*IbV!=I&OPC%3i\-rqi-lLEqZ5Q-GVE5!Xm\0/1D1#Nd[0a4J.Otk4`?&GgH9"MCUJ_LuI\%S/V`A^5 %A]hhVV&e7Z%$@*b"1n#-pRC5jfU`4!p5Fc=E?,71p!0QE\@tU+X@hs6HDjG(QDQ[32qI?@O`=]\`-g]bdql11bFXrRYlSrQ\;XWdYLrjj`,>r>JJ5foO^;fD'9W:_Y=.]B&cs'H0F\8b(@]ef*lU_j#X_]r*ej69] %0sk-mRfT,Fo0W05kLq,1V/t$%X-XBD7nAmfR2(6S!`f6_?C@pg<5uGK#H6bJ,1Ti=-(WF'aq_B&D0q161d#8b@'N>3@]#hbe$bte %Se4C"^VT)kJc3],JZp9iP%NUl6d;b"8e/'E7F]G:.0G<;2:s1KKXO>S?^uMSg5=CU;k7b$FgbU.0H)Mr]ar\udtlZQH4+Q!'G%a> %$8Y!A#CE.)2R_6Wcjj6P_csjr5s;khM+['4R[JI[FnpG=pc.4djih#9hYT[t"Z1EF:Q.SRc.Q*S/IC-tDc;q3IBiX0t_J,R9KUodJ67eM>U"FNZ!T %2WRUL,,6:_4&O'm4Io7+AL:E>9SA<2kPgc>$81B8^U'm$lBk0iTUHS'6&EDkR+@g*X2O[.VrMM,M2B](7$OG*mY,%^TgjuF8NUBt %>]^X'3/j)m*=Y3N@<3-<\*<>DdN6'810F$ZCr+L\p'HEdYt=.5d)Q!5H$e:O9:"p(lj<)AoH++0i>u!JB1fq[[XZqC6\Z#l,RcsU %1eEN.c3P6t+mA=,A$(QPFa@\+$J)%.(nbM9S_R4J=deS#,1bE#6VFS.&"u'iCK)<]TIFuC(knfJ+ndFOU-S*9"1SgB4BV93m7mL: %$blFf+?7OA.8-uA!'T?./KNR6R4bnTlWsI*[7=q]*a=Ep.p]M)^Y:&;W6(Co<*oMdPBF<*H-h@5MuMRD"*pr[X6We7l2fW/aIr*- %,+!.68p[QWnaWJf6C3Sc!g_<]6C012Lh']Q3Xl8g9WGoE-+oeglobJVkIuWk.<=H^Bj)^G5)"(Aj5qhL`mFT7jXVTTn#DqSl\;P+ %j&Q[ea%uV8C_;RWjS?hAalgJ20.k_W<(Ik!p %fo&XE`c,D`E.M;9"Ll)LIP%PO-R%`gDLSXpZd2?jMqE;6=l(3FT!=bcF@TlQ;>oSP?+4]#k-c>\!q5(hgt(!qo87Dn4co-m$39L5 %/rp4=]49Mp<>>(CKOcr^#,B_rVtX2cToKff=-WLWr[q5>Z->j%\cGA]))!eqn7j8>5bpiik-9@($p@`e$H%_/Ks\&<4UKOl;O#\` %PZY+X/q1D=LdA53oSs]s+O"7o9-C3k_8r3?c0<"#3.QO>/KE0#648ik056r&YD.UgoeP(7Hg=M@GA*:F^s(Ulc#ec:nR[`Qql,4M %p"oAm5"cn,D0,`=\O?a2p$J4B#-J.JfD>AJ<9=3p._YO#*#j="II#lj0kJ.q7Nh$KmZHJu9s[*^i" %Xp4M(:Wj4leZf25NYB]uhhWJN>s)e!+,jC37Y]cr=RGA)Ds"JBT\>[='08o@0/6PqSK`5\DM3THet2O)cu;lB%l>#bifkreBPo'>atH/m3G'HXm8l.Fu8G`#DKNe %IKis%SfA6tN.QM:'MZZeqE59._*?a]3pR!J1leNW`Oh&.>$9qBBX)o!gPqAu6.;6P81]Ol\QQG_'qh/4BaQAZ %Tm+i$WT&=0Ga;MCG_.2_T^##8;gUU99+@3$gN;Q6P4Zp#'],g2`aR`ul>$BE/QI(&FP5WP69"%l,&CJ83K31X]E,8[3F;Se0"SL;,r@!'&b&^m-k*<)BRh+J#n:V#WeQUR8.?c9k)E:@pk*3e*$q%uD&S#0 %`n(:]K?>=;8V+LL>GgER@olb'HEm9bj^,ptL/hC;P0KYZQ#pdI0A"aWe/Y8t?\<@YK2nfd(^!nm:((qi3ndfp8-=\0fPcqM-&'o@ %&,Jdf+[4M1]m6(LA?N9c(R%Dsf@A3[P(L0n6_Y$N41&XgK'NpWE*ZYAC0cQs.-_Ks/W6n<0%s#l&U2#$YF/>W2CTEKcupl4m]fuE %%d#_aEcA[%O]R<,`&"M!465\9Muf0JC2B3!!LpQoLB<[Nq46?bA1I3&W,,)LZ-JFNmt"pOGT`@\d8La/Ijshs'`?<: %ZOTFt5ml1o5.K=76X"8YcS9erBjAWUF'%8a<"Aeo+oa9,:RPGPBf#YLbq#me"r%XJXfgEf02=\&c'C,'k,a$lI*7B')_;D`X:V-F6Ui.lQY!$_mEN%5dkYKmlo_&!!WOS?s7JUu?k%bbtcKA/_:X[cfB\*ia>V",V. %7!Q78kQM!R@#PHTm^P;!HC6)\Id&^^@I4*h9DM>P6(tYH>#bPM> %q"!FRX:X_fJL6M5ctkR_J7"muq=2Y+8\DLK4''DK9ng7(%(a>uP`'EeQc4,DPFH==`X^K1qn_oN4cNSPgl>Hq.oFY:,V^E76Fh@JfHq@S`2'6,*f=/fki"nI^+@-kh,rc$N$t5aLb$o`+gk?g:rM#9J:l5g>ER46Rn5;c*DfDm %nP#oqf8V)FhMb!TY7?B(VJu.K!Wa4e.a+d>EHpm#5EQXC)nO(TI]_l\4^.%!*&,$S(\a*$Q5uCYUh1N?;jf,HTE$?o^E)g\9uu_2 %'mdi2h7[_G0'6%4P %\Jqd[N,"W5UWpDenWN=cK,]%2_dIa.5XHDQMW&-Er'?-TK#:4ZUtq4$2s>)LZBTI&B%1DQ1uMfSGeRYTf%lq23BL,W7aaZKf=eWUrP-19Dp".@T*Dg_JQan*(7-:& %H-oV;^"/00p9gCRM9WlJqtAHOPXnQ-DO@r".^D"JMkTInC*G\FM0K9^35A)p/I^;Gp(99>>Peq-72iap1I1[sA_\S0?Tg]J#?cV;,+\n$k\BVY^"acp/k-)VN*0mX99Gp>$LB %\(.mh']S@].U,"1EXW%0rp#PQ=r>sRRWbJGS@(DI8Z:V_1'_j@=q4SI%F)oecrDf;NO04ahB+TCGb6ghti\$bfEpXA+M4S@rZnV`)@VIqT(3Rde!oSF.h-"<2oX-u;[t=V*umOd %oXhDa7T0n>$)WBIh`>I3o*hJEOboi&>;)C&F3i#1F31=10p"D%g?$2'S`-g@-lA^ %E_'JMdEa:A3:+$&!&Y-I@3p&9-e.@`],[0]/J(UDD7QFlQCeji4\^Adeo%>=hJZ+RN:HE]F%CcgU^gW$B8KZa>97r0/U$CHZl.N> %>8NNn1"9@Nq!EH55]uu8J#1:86m.fB2YLc*1eV,ThDL\cPfooCP#/Dk%]\CF0UQXo's,bIL#O"kqDbPEG;OXh2\$t5fi0RSbp^+H/WurnQ*S-;eT>E# %l(Xm%Ec__30kcb#8u`q,V@eKNH)mI5&^\;O3",bkXUS6!(k8!+rJ#(6^Pp73=!T4;SfX>/.3^?>/]bS'ZfWZ`5EF&*P'8CB'!&l? %#c2pf"p*Ms,shQ7![C"&NiDsNXUhFua&W4Y]ZF#`!AAo5!C7C&aQ[p_2+K"]L-lZIrGLa;&?j:9i%V$42\ZXc:;_,G;=lO,^h'12 %&"9[FF7,C;nY<$]PlRaPad/+Jm\j##CtnE8\Q_B*_US!+ELKf7Y^>HEhq7\5A&nJWXE7*Ta5ZeuTql=9du-;[I5YuUk`)6_WXeP9 %2r=_R_&SCk\S7QUF$-Kml.+*#"*D[6U.uZUNBUjY83\*EHMNeA0hE:a5GlH$/HBVe9(&?&\E2h)`k$NO82K,c\(H4=+HVi %rsF6moOmbkKC"G'-ZC:PV&C!l-9&>Z,s\\$)C,QWnU6M4;"TT=T0+]iSN\u60VBU_qGN6qTX%ej@2"aiVd]BMeU2/D@2[i2RRbrG %X<@^K%4dRKZ>Se;Wiq`>q0jAh%lpDM`,]GV%qRH$fP2UoK;VN?eF&ArQ;W%nhL+rX^^T5KDVb,;#F^^*cU=2jUg&I3K%fF.F-f5" %nd(5+(,r-_K`e:UF\.6od%R\Pf1Z&fI_()[o$1,9MmkcHX,F^(>J2?YUF("MNk%VJ_JhHaJN8/WqQ7I/OgPeSNMg4@U:]517+(pD %Kn:<=/F*QdO-o-4ABH*L)^5%`GlYQ?$sT"4'*W#9/knl%Z?@S\&.,uqi,_##%C%bJLftW;EgoFiTjf_QYmA_B2E$+MCZlr%B`kIY %m7#7rML[M:6iAjL)a0l)1t-4b+&$N/p,\QA/VXm'0_16q"DA-cuOb[UZH&^Rkc,*q+3UD9]_A %iaC([p"U=+Y@ZulQn^*mWG]B"nVrS=rAX\#A./fh:hpG5PiDT/s+iTh6WMYLJU/Q'^C/SM%3c-&MG4du2^fWJ*J(;d[q.3qnuKe& %55tIT\)(@sBK7NtW]9k+/%LOdH#5_gN6tjOGPl7NY#CMM6%@I[7`0!*o6pqU2,H-+j1<'$.5mE&!Ut;:e[r88`VfUQM!sjlQp/Qr %6:tF"K.+O;6Ieu<_QVeoonojKnn@`$gdP64P1b'O&u[GM76e%hD0msF5DFKm9k!5YUM %D`T6)AZ)1i\"n2T.@N'u$SYj0'RY52^LqFT^m*d`b7CG>](0aiC7E4n:hUago>fiLNCXGm(^.mZn)E^=FD'_/`"k[QcVRN)DUWf9 %]sjS".48n+/%;MEp?^WYhDKCAVBoc';fqtPl;$J.%k4k^VUWA,!+=]&G8$=u6*e1>kW/KW<]Y0t@;rV__dGC!9UX(-gru5n7@p%B %QA%U-qWZ&7`Ehijdk:Ikoq-$aMQ;@6VO$L'&?#!WlLhQXnIN[FI*aE@i,F@L)s&`5kj*t.A:sr[`tB,^^j@$dJ3Wb#?Y>kNe8+GF8Lse!"`>VB[d. %o-Sc,*qE$(&d"mciZJ*PO=$ZYn=()Z[Se;e+N5-2C2iXNbNB_#'M*.JnXsV&k1U:Q-$R %nJsg,N$WdoD6;\MaT\q%X\3SH9_.*na1s0m%5E-I2H!i#P.mX_KbW$H9Qi5b]Sr%k`k6HO;Ic(KK@>'*aB&HL3jD[6`XIkA0o0`> %MOmUp)Ff`YY_YF[S"5MS)O8!i/t:I:bSDY9JZPds4B!G?$qemOEV-!Q;HLT.Q-=t?4Cuj8O22A,mLI.U^9?"Lchd5I:9IJe0]jpq %Z>7gFc!]^/qeZUAl=N%)6RYdcDF_p.Vh4gSp(%E&DoAOB6"=(rf7(u=dhj>@_5M#NCM;tK9P6fs\D\Mmmi0ZQfge"TDa/-SMRN/m]Da#AdS'F$EiU[c:!/urHed)_AI(3 %@&uP0-;)S-dsX=qfn+GQ]6C9/VVcr(%-M.I?ZCkYf:Wn=X^kJakD9(b2bTe'[dU#*Gr(3`AF-Is0Qs=dU,0%nXlGUp[/ofd,FWFS %TqX<_/J0If!4R)d\1C5YbVM#8<#!1Ld1]5k,NafnY4\16!'Sg3W.3mJ)D.Qdl`[WL19aJNb-8*noqW>I@^])=fFf11"Vfq,;+bF. %VE3NeIlI&O#WWR/1"!X*blC2RSb:P7DX75E%B`;UYbZ9f<1g,Wmbo_+I_hSLjKhC_$b%(r+IMbuL;VoV6AtP`6/O"-"tJr;k+"42 %$i@Lm$Ge[LU5a*l?tKa&/S#;2K/6GVfFaf(I6.75;'?mukZ/QSiej1M$;h&`eqfoGH1)#r$7LA,IATK7?EO+0fO60hH6<(cqJPcb %i.nbaVR3Lh>WB_?`*<=6)^@tpGMP[!%fK %4/R]+)i["VIEQZDnB9J]N(f0'L=+\2_`(+XXMR*-q6TEN3gn`oJ'28Zma%#EHbWdqI%:npG,Wn*:Ea@u#)I);Y!A&9*4bW^Z9LRm %W]J\?f[PZ&IZ#>h\(g`p\#YL(H(utIYI^K,au:;s:cQWAe,2DNp4'PpV=A$Us%9+s3[pYLU9H9"[MjCO4oRQ^pQl51eldWs9*g`V %L.jAgqsX"BDM5g7D4trZSpH/[=7!dXGNfJFeUQJsi);;X.hAG/Wb*abJJCETpFTGZ_8c=s3nALlIc9C9\o/QR8Z=5'Ft6/*bm%8g %i28Zh+8*$@lIjT*F"t#Z-_1V[bs@I44)9b7:UN-j5EK*3);Qmb)/2n94Lqpq04CDEIXu'ZA2ZGfh]Z.WSs(bhbh,r5QP/1+5019P %"]FRf9sr6RTSb%S\VQc\V[1T;639Icn8>>50'[Z8r\I%NZdkH!9Hrl8_G+@rLVQr5]?Htb>Y$sH3E*Y&sV4kq,:(!M(E/!:,QcF[-2^olN@TB4[\R+>\sP@^)FYMJglbg %+Pk=SZI>>Jh2lhd[l6G4e,X=l^*N-*I1lZSC]s`0_)f10J%0YXQn&`KViQ^ZRoF0'@;i;V`*CS;3duGqQB,AhiFuP7"-uZCT=-7/GR(g\n:M>*PCSB(RH;fF/C=1hc"UOUKL+?*^]F!lo:h!O %qipm`JUemhF58ngDk%K43Zp$>1kbr_D:[.?[%gqJeosG%""\R(2fG*K7\-/%fVb&&e<`.L!k\13dh@@-Y&qZ5&iEjP\Y>e*TZoh< %p?RHJH66[YrmNP>?2@b%Fh9['(X,IfQ30-8EKo"*7s^58:,hRLd@!u*qce01?=mh=glbpCZW!dBO8N*A.ILfLnsJ9hh2a/)b&qcN %MR7po;qh.Whh9O.b;Bp'icXl>fIl74rM*7dt8WHleaKZ,#9P2VjJ!LEk<^Bp&JNE %;Mo2_WnAlALk:ROpqIo+ek[(SgbYX,\R2]"i$+.4Q"K5?h:a;#IZ8ZAV5k?uWbIG!1(T,Dk(ID4>E^U,P,N*bJn/dEPbNO,ZqK`dJC:[.,h" %IkC&2OQ^'$#tdrsF`KGJM+.Q+#H;BS,dhB%MVkQWIUb9NkTqodSG?S7#&G0!0V1W@tA %^75uF9"tkMY^ZUg*SKK3n"5A[0ZP#[Y^?7+^HdMj/Y:3=J/`9,p@d4rXi37b"2+Tig[A<'[G_ACaPqha4$256Wo@M,G3QD^b\65c %2qC$8jm*+&>W&j=k'_aqJ):!"Ss?]*>"GW[Z"q#)<7l^*+o %1B!V0bHE_pcbKD$s5Qn)r.dN7a"Mr9Q[efI5CWOja1qT!J,2;\rUV]Bj6OR3rVE]\KQY?$I(&%%.5S_&W(AdgC:>cXS;Gsem5?ga %U"t[Zi8tAdGr+m/8AHh(#hR4kc(cumqq$aU]emTBZBW6"aR)<`+HASWZ,6Wg!0D[]pe)Y %68b%JUesA6^i0)+/XbV!%oIl6qmc9Y4U?-S:nE+TBtmAkc1l\%T)@8TX4Q7uW:.1D>;n5a5H)dV-i!CQ1W8>F`8]LOlQtVpRt(7/ %Hm44ASt>r]O-qk,eBF\&@]d2Fg#cW&3%iF`$kB:U:X_!*lLXqr#+sM:W;SM:)N*+`p3"IMjnKrL1M'Sp7VU)TOQPZdAN-%sAB*&' %h$,VWSh;kkbNa-N%]A\0poRm$MlI7kU!WrL1Rj]AIgH%@E"ccQ/J.[<+Unf1*Ylm2f0>bk'qnj?bZNeo'Q7!oln<`f)n&B;N.(L7.f)^\i'l>h<`! %4I;7Yr@C9hc"o<&E>JDT^b3#S0J:'ka@'!%^umTIRk7Dq(j"pS'b3/bkV$X-]JF#<&<*Sks^-bi!obZ!9!F[Og@\_(C.JBZt`]Tf4OGp-q'rKa/sfC@GoYe4R5$kBGLt[;e:.ngC(@Ii#J%fjq,VM0 %GGk&31k<VUaf:OX1'Y=u,>7Dn"3m6R[E<+s]^9:5?7t3E^2#$1`4kkR=/Rd^U>*gq+`;1+Sh$ra;kNQe %N@T1G4T-sZR9sink+H>B_(-Sfh3PJ;@)TpY=HMEWf.Q,03Ie37CPR7brG"-LE&rK8Dar#rqUjtD/JLbil9P1 %#Ok'Q)9467egg=3iauLq"2'XUIpMI8N>XstNV9thYOVg[2&##2V-,ZYqgI@\%sQB0Z:r_IcaCbgbOBch>d4^he;r!U\hCsI>K:Q4 %kkCqH_?\o5f9&]BE]j.U/r`T.]Z&/Qju%%JE=BW-hg!g.:"LfS9s#aPe%oXIK)[j^ZY"AcS1V*u.eF3E>1S\qSC-6^)?B%VRVpqshV!VI %6b0H3D6Kr)%^M?Wq.$b"df?/*pADs-Z2]$\G+kMQ([dbc7UkZ2p,5'EaG.%%Da0QcMLAJ"W&(RsN)O_#aO-Apa_cShYD[;WlRc.4 %c&Tg]]%M2iF0R%gj-PNoO(1BRro%1E:\?[LRTX`HpId:\,^!&_RqJk*""4PF!g%*X,SDDMiC:u!/I'!II)Ch$2b\Y3`(m-<@D7_fLpLU^$ %h>U[(pKnj>.RtPNN(PG4bKU8DbI7S0`q`gUQhMeuaAA<^SddB2[o5-Tj^-uSPG-D!E[/dfN>pO*a9F^[=9!8U?i&;NSiM1JY!K,9 %l?$]Fn_uC^TnQP#n(<-E!XTCs4T0iiV[%c5aE]Ep29J#g9C@t&*9Y?49bfHn71]A1<4qVOd607QPN5LF-*(nkC8)lQVhe"tcf75$ %gD^"uUV?Q]eo5Q/"nnZf%tln)7ue<.-bm&mS6bkE2uc4LG(ua(M5$Xj&Mi'q2ia?fiT6aa/Z^!F^K/(oa(]k;^4R+g]&Ta!ak^^`KUiT$oW'lV>.g>M"n.Ge.=h.)]t7Sn4*"=uVn[L)]7M>b2"<@qj)s!%-;XJ4kij %OZTVg$aVHY4"Kkp95^%G^=+Vla-s++`*O%n_:W79(ph0]F_PSCjgY:&D9BNAWbgD]a:Lh2/jFf1]_5d`LH@KPmI@`IF$M^j^N/H- %]-G&"'c&)+m1.BSVrBYtrY1_Na2?*arqhQ`e0LLU#aOeDmDgjA,SmDBNH_TD7$3r-eZt7)KBWAE+2H=\]J8l1Ce"6o7&@Il'ntb, %nJX[\p2Zi\T9q-,I?B)OSk>gYek6EJRfY2XZg\7O=i\iEUjMpA.Ij==epC)b+bBH"QR9?[AKsZic0W4*[H3QM,<'&/HO\psIVlfC %k%lKe2GJf`VJCF,HgPVh5bMWR!Q%oZ!ROb7j_oUSCe^o^<6a'RR8)GgMGb2bMEneZgc2'PL?nqhTMOg@W[$[JkQ(sf@8Mkp?P2tcHB=/U=f:qL9$fZQrMajEB+?`AO[>N %2``/NAL``*Go8'rmDeQu$FG5L<%]M?KrOM0$&7Q&9c;9#,h&caDId%iN.T!Y\M"HN?AI4hF77_p-U84orpK$:eOCX4C%DkH4f>^_Rf+*"?Le2'Dmu(k=ZqW?_d#2]< %a<##G;U*8"W-2(S`_7ZGC.qB2"e!hXTK4[MYC2-"f]bIqMH8?GQ0-#uN$dL(IrD\J]@8/37LEXnZ18o7'>*=jC%,5Vfjo$f"t[u? %,M+eVH#a?oCDb[ZBJ,2IGca`dQ6WDXJBM1@lcX)SQMjdk=QT3fq\XY[H87XqcFH/k#m&Zdk@&#L[ENcA)/J[sk+G(%`6>@p@)c*g %O6F\]HoKb/Z,J_hjq+!K6VAID(4XNF)Fu*NG_18;NaiNQH9?b`K?a=OnMK,sk!;GhX1N!9j:G:TO^6B8aPC2b&'@.2`qL,#Bs\IX=U#0matH"^0LX&m\()(k3asKK*EY-.*>"H7[_dc(d3B=17HC_!N_l,k.3NVW2aN]dX3Q8f8Zd\,7t*c %$1"&5fm@=Ag"QX,f&Gl+VJSBhWA7Zd@%WKugW!^o!QO1?\/5Tt%gO7iBH?lT_f1qC- %YX9>Ff3Xg>k.WZRI#5YA=0CuMaZTU.`9fCq"#Ml2]J?m$p(R3MLN,K)Dq!7&p1$Ue^h>Oe7[<#]KP+$Io#npI1JV:]MnE:R3lh:/ %55%<`_q[IN/35,96[Fn.1mq!"%htN(&#a$ %oOR/6&J^b>BG">ngYL;BDQARGctg7`9.TEFc?;.dD+t%X9EZkHd86:4jT'C)Y@7#:OEIX+G[&:6\EpJtk("$VK_dem@.SO:.8u%_ %[$T]nW0bb8Z;tE)K+aM's6.j=2#0uVgGZ$]3#$*A'0H[,RJalk2C%h04SI(?o-O%nLMe+c%dYun6=Jge;W*RMIOMdgMO5h %P@L(dr)P!&`WHDd5&`C7=*]]U4sQA#d0g^+&gYJq_D9%oi5"/oTY3a"NLGo\n8KfHcIrb&Q`mfVT^u[);&# %YYcH#e`6@MhPuXkqY:+NT+t/Bb38meT2gYVm,Y!=4^H_1bD_q %n's+nB(T':Xc'>:R6H;/`F$*SNK^RRfXaC^R-Wh,e2,DWp:]s292k>*gng&nqJktR3%#cmPf)bWE)JihC5;ELiN,/5X2bnKiO"%n %g#%4.#Ck^r>9(>[9O2Of[1nHGRZm'HJB-\8MHNbc=O3rC3?U'SuWK[`-Yfsd=Gn]TsE3%gbWATh7>Vkn`Dj6)K^r7*pJ,_u0V %+jtXlM@L6J1"LZ0bDn=41"n]YL;t_5(iLH?dpif5N-69fj'rdON44kQq([mo7f;H1^dB1%OE#Nd:)l&-a.11[IcQkh3G)QW)4E#H %.C(snq5i\R0/F6Sg+JZh45%LEpJQ-WF7YsRUkO6*+TCesZZbRZRPDe=cXlPakq(k-#;SmjULU@NF+BN\Gj %^:/U!nFQ#UfspN@>O`aU9G9$aCBtKdf;nZK+CjUF5he0Fd/nsP=mC^G$%:ZG3.^is!71=chHUt,.Y2??Vg_U\7IZB?X2o'f".@M/ %l-D,<[I;5"3+fl5kqK>6MNpKcXXsL4n:Xl?Z)Q//3]^(i\jeJ;bq:f7c&2N5g6 %e*\8QiV_jbB>0;)q_BK=*E]tM._(">nLH33mK;t#I65aRh+o"sKDR[p5X=S,,]#@H[f#UI$Bou.9*U&r5NQicb9tm9qK@,XbDS;C %!(bUnf=K8%)6Goo)p+A4_\")7n<8J/a!AX@c%A68jfNgM/-O52]W[=cKpb+@!YSE_H5RkiV#_pXYIWZV\9=#@g-er-^5a#m![Pej %qql&W-h(Smj+N#C@V^dP22,1sTC"t>i6iT?&d2#h9"`U3+Wg\QJYr$_OtP0F2DJ_$k5i+.L7cpp4a[6qX6eP`"j)PY-e+6U04Y_1 %dN-Og2tMeU#P.qmLi"fsWTu-Z;&kMSJ$G"^A84N9&p']Y1:U7]^&h.gW:9Q*?SX0tMXc@Ki_m%?K$`%35q63IW;sMh%=Zsi1*'mj %M7?]0S/hH'S2-$N=PO;ng^?ANWrpRY:F.3>q2"o> %p%MLWo>N/gIii!)UP=Ph#H^OnqsgL:Wr7btj+ %:6'nX>NM,E8Jo@GZV['g/SE-`ePt!e=%p:/]U'f:9%q:%tIT&cDtP
    M>)%c*Au&A0ta<)-32d2(92K#sPn1=-=9i(jG';qO4'QEGl'Ia06nN=Iu)DHM`W<&b@5FueUc#AoJ%=gHRVV:Mp)__?5U23Rp;[W]I %!%(Jk'`nnk,=$rAc7C^e:4iaM4O=_T/o"g;mC%c^+QbsOd-j(X!:QGS61aG/_M %#KO@E[F]R?M5N5RR'4bS6aI\bep#pk8f#:?]!7Yn#nDRDG2&.=OW>Wg+mPS2of`Q7#n0Pa(lI(cC&k@q!9S+:)XP!_ag.FD!%%0' %X$/p`j/:Q+gpDIJK)H7cXA0%On(ZiAW0W0]X`B6@?"GrEe$`MPh2Pqs^sc%&i#/+KZW=G>Rt:"Y@?oE-h&REo^jH'><(Tf8[A*?q %ke#%h8kht#<[33@1)Q-JdQ5;SF1$k5n]M,;%W?GB9_"Pn\p7j&[(ei^&]@%*#.QUq>;tS1oINkrj,^) %E&ra/EWmdQ7J83VVSJ8G6*G_N6lOgMd];Pf^9kG\$V_T9@@"tOqsSSO%E,Mc1K(I/mhh9sn$jPumttkaR/%2dKr"SU,>+NM3E^5N %I;o/R&#aW%-S;XtQY#:M,bQ]NrmnkKnWuRB`0jqcgR))ThX$h@WseOrQ*\Vh'C#gN,4/LmGFH=A6f)XnM]ltKi[:9Hho9[E)&!)ljGQp&Or=-l%q]rl*ofa?X)K-l=F9NPag-u2iC)fAT^;KK7(;KOdSC&tR,d.o", %$jOf,DCM7[A+#IKWCecC!Sfa!n7n;=N:]Pd,9puSf5tb=#I>61!dC]M@$9t<27T8qKOYO?K3&7n\L0NAi&mFV^gR?DNqJ($Jl@k:,V2HE(mn#oa,H//=@*i^EeI<`X175,q1^D\kY^FDgOeL]<qh(DFE>DV0Cd]G@"o+;k+ %.k0r<'j;b"P7*R'@S<%<9&3/5:`-@,%sh)mh'pC98[(?:94,L""9)22U_p:.b::Xl`WMgdnlDZ5a`OB]B9`nT=#ehI %e6&NA*2u2].k(F3aS.LN''#;c3\]+rAJq)IpS[,5"(P3$,2!&8SYT`O:>V4Dj)Y!^6&mpH9phlO_:XMsMK:cr"gaG,AlTdW&Hs>> %Pj[Q&kUd]WXV*s/fd%YilmNnePdr2kZ?]-\=.>)WU+g%,rkVPqWTu7i/hNok_oVGr[)'.ah3:p@X"L$gg(o1GqLOL_m`0H[)g^Hh %S3jT[XZE7ESS/+jL5Re^Q$X!=pbWd-$obN"Z[tCG]hWT]VjKfqHHk^C8\=QRYV+IAa<,8')[6J8Ga.Sb@NaS:-]d]!&e"CJ*^t$sj_u9PGBe+;,&4-5VLStc_UL^/niooI::91s(E,qLW$NcT9iJ7e6B_QFMVV/1 %i!jJ8kd\JUCB4^Lp5GR:'O/\`:/[9f+^Q964Yr'=fu#-Ig9n!fI@q[W0e&2AnjH-rGRTd4_CQj)p0X3(g4p3'!W`j9n-NQV+L&R8h?.4^s+N-?WJcj;_mXhIq([lbTS*A1>Hc; %dY&i9!Ob8*U1VViAIn.9GP0o(#XYklIXqaVmm$\YnAQ_+^D-21-3BkuoEeE-D(6F0jb0*d*ss7ab]^<&pOp%=B:sTSc-,Or3]e*=(p@U)5o&35(q&k82G!+L),U7j[rWJ1Tsg<#=L %,0h.SL?S1R@2ljoC,<42?0KPW=po6!CFs]]:UZ7p0PM&QGbhJ;!;qnd`Z-*3-s0`,!shU-W"D>6aeMlU^gn`,Vb8_HYlh5sM.PY7 %`0[`Vb)]mL0-uB-#8e"$@]qED&\N\s\.p/Apo-\*+Fpf*B-`7*\ri9M)moi`hl>:AWPEElJGOICZfo4-87YGR:*NV>)J%63i'0!0 %?MV#9pJ5B$=f(;mLic*9Q.'3Ch&`3o=G[i:Bi6)r2&ug[PipChf;UP7TL;j6`9d"%1eMniH7'4$0c3b$=XRkr"tR6/S,.etII>rt %G%f9)6UD81GN47+n;PVY;0<@t\a>T5f2CW=TM#>SN1(H)@,r]\FJH.EI:lP:VO7R"/!#+Xc[bN%%V %R%=>#o*WXI,R1Q]!tFM=CdIb?N"=8^+V;6NLlA84o]AmRX'LJ7g8mmDHAi@&#LEHQn'!=k:Bj]qP %*,Pm)59eU_WGk\Yn$XMJCXSO7`A6)eA;?.7.<+ZU$"MEmVAnc8H%$2l_lNX-+e3TdFJG+jTWTT-Wm&s3Xs&#oisjVdc)KKo+6jSG %V\4l8N!U#*eqd;8$^l>8ufb>-BLY)8D`#ga+_-6F_da'2T,GFTt4Zj9`Icau7GDL=Il4?lEakAZL6*n@^%&EZl3gL.BCTm-@ %-tpH,*B%kC*"Zcem`A1Sg+aGo8TO=K$-hD`2M:R)VR:?XpXUVRK)a'O\D.r5*CVMo&Hj:$t_qt\]e("\D_m7pGVq#FE/dQY.;!>2On %c0UhipQP2[mBQ6Db7]pTkon5ajpDrM*q^IUIPY>4GTWe^\N!aH=0hgKKm1=IJR(q(-pNit%(HGM]&E=_)ut@Sj9\V"#\GWX`*&?? %f(SG4FAKdL!1Lhe0)Y%%TQ"Y5p<2&=SFo"uqMa62RWPA_>a-'t>cq!$QLX'A`F0itm767W_.X&NpS^of*2mCBg7a!2Ua,D!; %D)@TR"C(TKpkNmF?:?QS6XkT(pWB#s\W^*4\hs-k9\`_;)$NT8Qg50G5(OD378?.uIPc %M2TYW7C3ki92s8djiZEftulI%#Ye\maJZ"#c(31X=AflLUs*!O66'P>4HO^e)*f&\,1V=H,-G15-`%-#*G7o.E5XR"c0>ZL7eU %5m8rr2f"9hhR=mm&d!)I9pT&KAVo2EWG=@nRHtF(V#WAm:P/Ef"!ae %f8U1Uc$4*Z#?-%lKDpe.kKm=bp*_srk'\U,`>eEYN&Jdn:o!Mb'@P3.(9k^LdAp'Rc$u^mRp&$a8)-Iq`W6c#DgmPc_/O7/:^Zg2 %k\!Ul;$fdF27Y&lU+=n-@mI)f&*[&.ld\`)84_m[3@.-3Z5m7ra,KZ$;(^JU)jiOoImG3OZr!VIcGHGM9%QGY1!X?M^$l_tkY7nA %TdKpeWQCF@&EjRgkG2<&C04G*oVa0SJo/k)ShD=h %aCijiC*P*-[F"u#g>q0\s"Pk\7LH5C[8\,5MkVbV_'dnpmYZG2#4S3WTaD1fnhAAKQ--RHm?K* %qe'^]?!,E%Xk?r%+5)#gCb %HNg_XAMH!dVDf_%Lu"$j`msm!jZPjA)91gc5C#p-k:6_aG%;3Kn?/O!egU9l+c$EoY;>r)@WXPK!";s)D$E$/)hfAI-Mp'R8lb-] %;&j`;;%BDbKqc0ZAmgt,_;CFUN:o"O,#3aVX?Z&L`#1hp@@0k[ZFl8Fl*21M=S!4qg]lN[?PA]@R6]X/&G?j2>??lQbMDXdeeRsCnBQq9>*=ahcK?\m#qV4UncG3f#0o2&^X5[cH\N[cE#`dVJ*G\pqE4*.H(YqsT9\nK8>OCrc++eZmkg\p;- %AgkV>]us4/)o1$IIta<[7"4W$`GA&nW1c;Nj(>)#G9iePCLYA9K5t\sM-r+h*9SQG9b?`5^V(=dh\(Sa(eHkA6(iJbh&SJ$-SjR( %n*e=04L,8hbekYun]YWni'&3-P"/"'"8hZ1e3%b4+8DH5Wp#RDqSYT]E`J1%ejfr2JLu60eNS"mO*oacZhK"SI,kYWGf:15j]J-#GgO>fC1eMd2BESnhS_L9.N_HD+@l*d#G$t^9p1-Xa\h<`/;eJt:H@X?4=IKTeQYd(0+Wpo %n(KKdNL;.WR\P&N;fT[NS-k]bDQHdE']C'l$4#9T0;:SNS6otq$2`1s?l8Up7rX78d5nYcG5Rf&,Dmoa<`jP:*(6%mo5STj5kh4 %o>%.^F)Fb>S0O*XaS7d$K8rX",Nn9AT6-qc*B6h*r2:j,lH$P_?t^S6>Y!Z&"%V]G-TgnE*]Rm^3noekp:uf;i6r^7G:/^5OjSC8 %r]T`R:R&^@p[Fp@8=7q109/U/)kVeji4'Oh:S-o7#VN+5,[%UA9q8INks[nD'(pp`k.bJSBUEje(f7-`6p-._nnGi1r5Leg3:*(d+`;4=DEo %1__#'(67)W7hpda`J:3L`)0%a6$)$OTAlMSnXt3uUl]TGdQ$Q1*&Td;C*#n,O/#=g8PeD5HfV8,E`=l@:d6rHV&U4M*n48O8hDD^ %QO!2MK20Wf:Zarik+kps<4$r!^,`.Q*;+Cp[Qr#6ZdjfVM@jG,Tg]dh? %2<6j7"[rU#(H5I61LMA(sRsLCNY"6+O=UlL&m`e:$t&Y/+fc,oq5E0e@%F'?l]rf*gF'm.U3LA>t8b8UCPq/B%Tsdls5D5 %W*"5o2ET*T4Xd0J[FL9uCepL:7s2;)'&6>Am\hf5TLJUJ>Ba&VHVhUA.d%g0p)`l$%bc>$Q+mPm^ls$$;.]5_OmkZMn>LDQdR64_ %-_?S=c_?@YSGK46R+H@eW0:GS(3f0qjQnHLY'='hY5]kmGLSeWiD9NW"f*$.XG&:4\:o&Wg^X0 %TH9@r+&u<:!j(i_X[c+;Zhj!?:@(hVp8C4QTN(faCAY/aHdp2dd+*Qki'"%34t-:lVuRq4Jq'($5,o,8Fc+M6`^g!fUJUNVVXdT5 %q5DbidW@\<59H/b+'#.E*fa!(^-nF'-u$>0M:9#DF1k8FD:m/i"t9CW]#E.N>YU_[eJaqdrj,/?_hM0DoGckAJC&#L7X+CI36+/BMre!D+XoqBA("q">=6ibJ5__3Pc`jrXbOM+*EZO9Q*CdhF?mq/`D&m3d3WA %8XT_B^I9V$b($peE*X,Li^k%6CQp&iT^GHtGZf/*;qGV6lIu*gW3(3aAMql=XE13+V,mY_>@:K9P_RHHNPi%%1uK`<+IZ %?Mo>Wk_^PGbPA,?)8=31llLi3jTSDjQnns9JhqdR/m/%9WnVK*Xi>'eA%N7HbR"H0R\X2RYn_U1\E %K^\TfNKIY8IVK5HpQ^FlDFpK9P;F[jjmFVJ2C^[R-VWK5$=SdR\M?S8^/EJWOt-fP!:k2*8hT04FM?hWQsIOWBuH.4fOU(E5:!5( %LBWZod!Le'?I).,WD>Da&%fL:L]V!L+%j*""tQ:TGM9/4:W9g`/YKp><6 %Gn'Nb&9M2bf4nS(2bUAX>Ufp'WBp]7KKQ%]9CB-[ouF631[)j]1obTi!,5]\HNH+PrVO%:>Tfj\j8n#ZQ3;I=lE]5b8hTg3RIk-B %bKDC=;rG!lb3qa[j8cHd8=g^%3XHMie*k%9 %?@KFC$]pn1Wl2%Cm\n7liUOo<1qW7u".1-7om2I&!;Q/ZqEoWupF3T7bIb_.?DU#Z12;tP?kCIB)tc9baTB2oI'lRb?][/SYRqLI %%a$lqXZ&D]]W:SQ72u/BM2?ki48'uh#bl4EY2#e*ecNLJS,1MW#'&]YN5?h0TH66l7hpcafgK/P_p==#>`A)Jkmn^5Vc+A+LuP7rCbWnWFme'ZN!0=3 %<+Ha^7ckX`XR=O*cR;>D^la.ghPHGQ_OHZ.#Hgne%/bMcV(*g-8Da_VN^D^P&TGhRns+NQ,q!9L+X\!pE'Mct7&\ %oX`4<)Adlp!75!X(fO8BY.CH.=_9F(T5W9lAG%E5OGBFa_j05C(8l(b!+qc`S8DU7`F8/J5@lGu#WlX]YDg?mNJil)AqN8W>q6Or %V)N[%`'<*[\nN!/EnJ2EE:(q%YW2-QcKbTkOabCpmG3uGlgclc)jThscFD4$!]c#F%429)JLms[mDBXB2ZG;e7R`eb9nA1HP&X>c0e>SP9sI\T.!&/`CuAP@CJ=8Q4ED,)q`dY %`G+O`:9L*%P)&p]5is^m&_%:+4*lu7XGuA)HiP\Z,lX/WqnF%W40?UnDIi4m%m6?996i%Wql_ad]4aDf!C\.8b_nN&,W"FHW6P!ldJ%2ffnWV*Yi^VC:Zpsh4mI.K:_Oap?tj) %pd%dP9mcZ6;>d)"I+1>DW['eW.R0jb+*F#JRa+G%kHe(YK<"Qr!qfEkH:qH-Dc0pNS;9"M`eoT+"N_lQsZ3Ht8,(^^f"H,&k?U!n"#rj_%c,ELA6^k1"KkXlUU<:/@m5bdj7d^N$"nXq;CC?#YLQSb@lB;uYq4Fi0^FkAUY_Eb;.n5+.a0V@]3rbaqdXC.R"d[LllM=:LIC&TAb_X!4Jj;EP*X,k %kN1"$-VbuC.s1D1KO:&gTLeUQT=`I3pSHNS'H+]M/4@6_/d^$8F=R`Z"bKJ+IA/YtJ#pMSZ2iigBA'4Eu]dfsl;K:CB*$Zsub<3`?=7H3gGh!r,CGaD[#L1^0Tod'R#4!!c7g]-WF=Ft2 %.J'6JK(b3EJ4^s^h35bWP^A*@CtB[q:D@&,RN]nN(o0eeX'3!:lJ!PRSo_hG2ufU9=>j&X[pcM^!5Ne8lGZ %)Xf<.@riBdTOtqT()WU5oXZsD.e-U.-rql/;#D%54YqWH*LYf1J"UDL_cjGh62``OV@#\2("e %Lt[#D+u'Xo?cDrL$aVk6G"CGV&VSWe0bo1DkRLi3^O9I?n#>A3O=LRJo8C^uG\T>HUA=J">P\2XSmSP?P0'j\Cg09o-;UWfc742N %%\ZUc1CRZm;B6h(jK>sk1>W3#]!X%6ZRW%l^EGDtB=$-(kl\_6PlO0HU7*6,[hgm5h7u!05g\J*pO53][*"`<-/fY065Jp**Pc9] %_3X?$W5(5YC##Hb4@7/TX.15DA`D?D3FP,Ek38WN:JW'V5S]8@7Gt..FQ-^#KFgWGc,e-tJ\oVtCgIa_KTQg:aL8\NE2?*jhuQMD %e`"jLeO=)`O:(6u/pP3T2-q,,)&O)@8n]EB=3(S+$J:;)!j=VF[)WSsKW?T<.PW00Q$a/P;9=gnE;A30*ch#Up*!t78K2?k)1uof %Y9r8WN17:QRpNRWiPBMQG%tT%kshQ8CV(b(93;,>jB%9/+\X&qR:_!l8B8Ogf):T(tTfVRaf'qs8(U*fEA %4[Sg8Z#L338qW`tb3)[J$"eBf@,,*@F61D3i#Hi'i-^&#Pp";e&tk"R7MCJ-U(\*G$3=?GKn'G$AT8(skn6[GaZ[R+Rnc4C/9B8B %-<+75cAs]@#CQR_M5n]rAooeX0kAE%R2-E($[!)VCC/!bZ(a9T)rp\fLV/+$`sb64C;k0_aC8Jmkgm&ISu;A%0J5@d3V;1oV.BU*@NZ9J"'S[_-[Uh,IQl//e*?O5M1,:ND"Z1'H6sU)LLh7im&@f %qPH_h(aN4D=9B,B=,ZYiFAlAf#/GQ[7c%DMpCI)[QcG0d\37KA-/Z(pn4:`RO"cNF)@4CLiW,I%A*-662,9CodAp:-nIZ8W %g">0#I9$L!+#L<:6JX>4muL%I2KKZji*"1u0#\Q>=UE.f"\KHdDYc-]\KZ[b+NS;"?2f8fTq1p8H)XOJ[Q\`,*6@CtT+=b9*kGET %EDr+aJAs\(W0dU`p=4P;;$MHm=ure)[7(\1,`U]Zn2Ka9#W9@?c@k.o*:;/8"r[#I$.g:jmYDA3-a:M?#@,1R5Of#e&.?*=U+JmM %2\bPEQSN%AOIAH@6flZs#<8=--p0$]XWs8J^X'\%Xmq.2E3r)^"K8\PqS?PC>pWlQ'*&GD'e;ol#?[Z+R%\o)2/b)EZ-F'Z'3aAr %=`M5b4Q&*Bd#N;Ua8mm`hjj9kC*N^Y)jSdMEbs;gUT.KfH-Ze]IGP<.<'mtCEj"'sE.jR#nRF+p2:4(Mjk]+&%$H6Sl=?J626',X %HJW=G^J]/5Q7%]HN.3Tms)peYr:9'T*Bh$PcMMChoPm+q]_DHa!!50X/T'4+?%l?DY2)dj0o!esl?q&*'LRN',X_iqPX@,kn3;'< %*`(kgg&:`2J",PDJ,b/`jd:hW6G=.:3Yrm;S,-Zc@\$D$5np^4!Z\\I\'[>u:`)`3G@6l6H83DEke\-=+t&`ibloqDhi5PWeGE:V %bN40X=-JR$aE6__in&&iqC,s##]G`Scs+lh51]AG.HEo,Ko-p[dGZ-sD$&5!\`p:AIg=UE]i;N,jTYbBr+'*&;u>Wfio %.kd2>990j;$i7p[q-$< %MI'ksgmMasjL]FPcVX*UCA`T8J&J'',-cojm4H%6,,)X&>1c:q-o@pa5kInf'\XppZk5Xkl`Z/[*ee'aP-RURg$JN'8)@*?ddeiF %LiIUM^m0T\ff)uL(h$Pf5?LCaa/'nMh70d*IAtsRR2Y@8M>*[_nL]Ik8./,Oq]qbF]#>keAD@F7#)[KC2pnimR_VVa7@(7kN83o1 %IZp`%#[toB=U*RH6@mH+`8)@tmcuZrmL6`)$(]\]'$N=@5>@*'5r/BHD]o`V2AO]b^,rAE%?1D+X^pt8:YdJHB*uI2.Ib2;cl\.? %J3,+L?n4OP)haTL[*31q\OYAP$qkc%,l(k1V,Burh\ie%MP$c3pl0LE4]?lQ<$DH$&EJ(=h"BMGiUiWj6jfE)N]q-BHWLG%0=i;H=L;fakaSqR95hp/*I41Q\)5tk%TeR3siW( %DSo1Q]Ml=,oXLr"[0g1pR&+YDq^LaX-a*D>[:Gq-]ncld-T+nZRC-"ep:1Kjm4=9JC(GbIriW]JrX.P-`7]ZIYQ!KjVkP7Dm&\*X %9`S2/o!*cd5!7j$C*N[oRr%F")NugN2hi8*2iTqQC$`m=[bB8c#,B>q]=!'==aJI(f^3,'@;+MZd%5;,>-07A5%$4c+,B!L4mG#=1m!t %GKkkfF82.17r$[:Jn>t/>nO%][J@_a$ML\,:`O5BbQt659=qja-sU:+@XM$KRC0)I(#F(uOEb]Z3HP=@J=/enqHkiDqe<[W0!!(fgYN$tDrq7PA`Lgi61ea'tJZHj!#W![#p%B;/eaDJ&FQOAE+HT-:N_['j(O %X&&f0X$<3GcABGe_sH)_T(0Ka,k*$nG^*NC<#=@8=Ynd:K^,SrY)B)1Cnpp:mi]fd48?=sV?m;L_2\];=Ee`_n@Y!Te!)qpLnFbr9[Ag:I=&UJ=`29og4$aGG=Yptpb^p6s %RS%_s]Q:mDQ@QFeDA2PTJ::-51;;k#Ik>#TbUfBld*ot5]a@#ajuO3M(qc`EMtaJ_n5NUO`q:J0FVOXtO97R:LRhDa*otD&dU`qEB*U`0BCW?QTs^(0gOjn.=mGAs %$25P`pE2;:Pb`YfY<,;2*C]K>"n^)LHUh5Q#78/?gttsGn15c.'HB5+'0aJS5"H_9`=X2F'T\uH7sW+LPiGX7nL+tE+=?n,4F*0i %4K2JTF>&[VR?(gGBAq+17-?k\o-F6ZPR)\6'0Q\`*X,.XUeHiTV[%e&#;OaA6?dKpGHTn4bc#q#]H>,f>E'K%jNDGH1"9Re_Bn(G %S5]dSW!^3_Ej_e9=eb3/FLjt*@"uh+FdJEBH%Dc\&$Qd]?=rn#7bd_%A1*$l!pWTWcD#Ku/G82&0[G&R-ZtEA%Ycp+QdBqOdZ9l! %aHA4FkO$:JjEHgFG";eRN2q#3,PnbohpIQRjL,pO9Y>Cg1oG)Un(Vh'9T$4Q-9YZ$Cg*$)X]VL5_FU[eN*"l`>`iW$\Q(Uls. %C'!7I\k?#pf)V!-CXN!*ZM%lP4gfmhI_@90[7#ZH?5^F#%6.l$k^Sq$7#6`4DmrGR"jA#RD7(k!*s7/Omr,kS#dkd2*.N!R%j'O;!0g+C6^p"\_NXRfM\/0NZ;6N)1gNO[,\H %$c_kRMfeWC`qo;FL@$sJIe<]LSS?JGN&V2WWJG.@VI<.tJBn8(_L>QTjmD#jNZPc\feK6Y-KRZE*B,PP.:'dg!KIpY@Zn=?_+;_T %Bm][W5?cQjPP=kF!G^[lErbGp%Au,[S+AulQ]U?g`q(FUA7p]*"?6^Ln/p@2C**aQr`dC+5qn^'$kE&bejaI]=h/&-^!Kol9m-h;2U&6]QBU+`URr@("q8 %\Hlt^<`n5BkfPA\hM-'>7\$3&iao!pDc`HH!J:oEr$1mHQa$B7W(*iEfqXUaKsGbi"RO!:3er+\.lOi;O_M=ZHML7*<5lhW;,f/&+r@-o5H.8T?gnk&bSd,,AU)02:ZNG(-GHLtB!nI-igG-]%;b*!a>)F'Ye\G-,"[S%2MK-0.u %L/U1Xea51C!s)2?M0l[S8-^;Y!KO'N)l)*5SL]u"UKD-UrCmG:07(/'`0j+0E5JpWm;W5<;309F@JN5.jp>ET(NMGaEI %.(Fo9og*ZD.9t`2F)bH"[^%O;]Uh+hlcVXE5:fH,3bAs"As"p+XX*`R-1lr4m\=:Mk"]iUC9oknUJ(RNd8t\alOFuoK=CX6=WVt; %K>79SRqe=;A94cq55nFLY.e#=9.07/l"KL#S1j5R`HP^GQf1^_Ou(nS;>BK+P'3'gH]VPQJT+[j#MV^N"Hf&]cdsu.i9N0Uij7c*Z3=-gGA24]kdlIkQapUD_QIK8.M]DEa+YM\6M.. %=Bi#HAJC:._n;Y1DJ,FX6iWO*ZuCtO2e7)1,Zif%)SQErWZKD4CtYI`9P]Q#IDqb[?u([@q5>g!b]23_sjQ@r1@:eer+.PRhj(/*-q(+WR?n+:c#P7S+3HF6;E %?W("T=ZpYu%R".>i9XNnBL9^RJ.5RS,a5Wq/r'rnF9a=LK.;mN*rtP<$/o+Ug:qC5)jfju\8f^P?WiIt_!YekfjGO3]*/p&<_/l. %`cDGH`!`9dZVR:+6I,mD?'6[_85NXX<,!;$&nEq]"tXr#5jS@\F_Ie#4e[ms#iu:>o?XAuIg4fkIAR1f4M6s>qg3S>a*$pVJt?#t %Bk8@:nABQ*YuON+BebFAn$R;U'HboK_n%n3^phkjNl?D#dQW,*f_eL6jMQ^uhKk5eoPlrg[tR>PR;%r3p*hS,dXY&AD`;-t_q#uI %f1+->K.ThU_Q$rg@#sX?u>]JUG3/&K;TK_F)QR:'WK0I'bF4?^'VeqAc?pTD[ %&=A^NE##dB2@S"@\-fn^PW1:TC70Ad8X*T-D03!QM9m0G):=-a:6ld/\c]K-Kts"-'f;r/<^je6Cm9o]No['WkQWr$!qhX;GdE@r %@:\ubh'q;oHUS,?@0?iLQ&jL^?4C=b>lc06.XL5J,C7:BkBG\50['+``"8RO^eX7''?UA!h^t5F2[NI8MM[!'1^A:Pc(eOEM_4<%>i?>us#4T@P#3@$MBC%Ii %JL''22KRK28X=GmiS_`BD-H8X1-PoaAW!HY>TSu5c:];:7qf?#'NC-a8@YQoN<2eANAg&K_'9]^:l:_V's,F$iLWE!ih^.c;XE(r %;B?c`&_(,jSQB4D".$lt-[369i=R8ADXkX9Z@3eKAYVYb!g^^(9JuZsj5=WNrYV6:s2";c8F?;^d/t<,mI^G>i'2kqkBPqs>9)[b %F2W*TDVbP6LT1p\cL;0*A?HhI?Himh^LbG+1AB:Mk1Hj!eC`oW$-oe_cDe"m@ga>YSh%V`DRAE758F-QQ.-i*Ror9p1P`3n'Kujn %&bMugk@cfMNFKI]LCXCGM%[aYj$W'p-h_Z.orACAeukCdqL//>9hjhe:s'n(96I]magajbi"9>kJ4+cM/KPI`7kE^GDK<@V@ZLPc %=`cW0<6g7'CqPGj3?TQ9M@Q/n@akR]SX-?BC0,Gcp?*Y>NP=H^9b3t@+o>;G:B/*L5,dbd#;LaTg7H7,(11h^+C %6(Rno7/o%0JQ'PZX,DRF@sY3JCIknO_R+Oflc.4=5S>ds;l-EKV;l_nV7:LE>Heo/9-(s6@@`"Ye55#2:2eG>Z$f3\JWO^@EoK9Q %9nnpgc#aK@NU,$G*c-%BX36B\#]N-547?L8%u-ITP\q-Tkrc>l,9d-j<$%8!NY=`Tm,? %SBSHcM[0&QdgstP.\RHQQ*Ed3E($R!MUER+-?YK+H;W5K/3``WhfaQS;AUUdhSm[ %r_,aO!>qA,L39>8h7`c;"s>5[-8V'Ig=4WFJ)LkAO3Qeg><]ht1/pWsd8hNu-=i<_Tq#"aM-%,9Q\`\*Z3GA'-o$p*.[;HmFp=EUrUV_HpfUZdeUR.:?EUM28:XF.' %UlRobDCYtp93V,?FgVmc94Hb<4WS-&$U^T5GAS0Cjk'H3HrTpnrSEhofEl[gTEK/L-"g8t!rNaBFX2N*]R2-2lBHInsq`DTch0k3,[u%1S6/['ENuC%m\F]uh'5r+7?P!#DDB %*+UH;pQZi66"8rAhY&oV(r0ei[_E[MB]dl`*%jSQNK3Opgf5)#%RGoOUJfo;9sdOPV>`[!q]8hKcjk*'Coiu4hAu4^DI3t"PkHq" %QQJ'AP#1KYOK3_)IQeA`Q0U"LEWldr\!o1HY8,c.8T'Gd`80'ljBA^o2*smF0c3;8/m_O3#a<("l6;u5D7>^NBE3r-jg]G'ioKKg %:9V!RFd^]tnRh8E9`7q1M=tTGUb^"!L+3m;g"4YmF)kMX]&iiNp4'hXo7c@JJ3lgNYVeT/n,WOe<$!U>bqpU+/C9R`K;4Kq1/f*a %7qcsBQ-Dt0Kha$qWAigBmkI':53is^QV2C$S0bogg1Qb`(L)aQ#ADObL$tc3C:Aj,AS#8>JQn"a$i8#4]LO<*9hs1-^K)B>P3^XV %FRLY`QIp#>#V4=s-@$"Y0H@Z$08EfD&T>YnW7rh.WguFEQoIH+=^>c9hKEQIi-_K("eJGU8/"]ueUWl`CQ7b#dE7qVq1K1'V:]JW %r\dK:?I:?OH($-`FCtORJ@DKDgGjeWJJ?RD %\R#V$NFcR#iOlD2kf6]Z@r"0D':2ZT0q&=P=>I6D3D25pJ2t!q?#%u6[%ZD!,aPk,BKk.>!#r.@+)*Q`jZ+UUp:sL2VU/EhAUQ5,pNpZiufL(DZJXOjoCZ-C"IX0(J!2eYFrlU'3pc&p3qYo>T-`& %9(0!a0/0VSg"O'NmL($($[hJMB)+UsI@%.ObA?'I_='/A06$7OB_]2urEX=@IMmZ2_16E7J`S?aSVdU,g'3IX&3;Z^]%%N2.PZ%G %2K\7HCt+%r;r%^/J9&#s_DG5jKpjM\63m7mOe-ONM2Y5Goe7`];#sf/>NrRZVgL3`R@[FR;a^o)cs024g0LUc#["i?T`:]M&OpIs'Z'&W+:_aC*1d\.`81[^e:kFUNX%Bs;QeHtA.J`lVX-N6J$]K'* %Ush/!'-e5`;?"e^&X!]_L=m\,`E@m,;qA!KjAM^qj2?m)$-Ba(UAc\t?[#)I]6)a7eCt+dp=_&;?-.WSe18cTi.rYe!+Y,1E@UoS %bU@>IQgB7UC-)e4I#OQ(>.:NeVu$"$:0IOu9<(?X:+CX#)MmGY=&66B)b)47ZlUgn %NPoGGCAa1&MM'pu;"hlAg=b*6';./+,3HL9^6>SH':bCd-NuYX!k3X4KD49'\<@9H9c@,/0^.RAFHRF9q$d_2&=o&BDK8/n%AT8m %Z&m\EPQoQ1(g0B^EH.F21$>M!YbVlY=*D/I8'lD=NjA0cnD$O5?qBkoJnbZJ&E5Adbhg?phbstjGRN"18L_CikOd%t2E&uF2AXD( %!n+2C#OnXid9VJEpm,jh;bit%$?:[Cjt;h,!j%?7>hk9g7Ca!ho<7Z\:9%>RWG*Y;r %CH7VO0K?lS?oJB,P='P25YcduVZ2\/*\)F>4:Fh.^iJOuNVU0r#j;Q(8`7M/.cPifGe[7= %ea;MlG&r0MZ@t7/MRsbIrESH<]]O)9F>m-E.BC%HJ_eT$?HDHh9E=PDM(dqS,B[M-24:EPS5M>C.FCf5qf-4gdT">sT*Ug9p`0W9k`@0Dr4t-#=F/p=e0X>K$)Ru?R5he\!!=Lq4Yb.1mNdO:N9m5^JMkR* %W`kCI`*,U"18;Wn%)A1O3ard7Xul_AjM'H5\*//L"fB6PXJK_CSn3n2Q\tO((qA;"]&WOOl.3K9LXM\VUiO4CS@>%uVI,FK(8Mc/'R#^a%;dZK+tg5!WFE@*!mDMmh8fE %2[FG"QcX@H[(CaD?3N>&85Q=9ENd=T9!l@Knjf2W\P-7@L%bgf=d3lcSA5-dO4MY@]F#I"UcY*q?$>MpXN4]PAN/5HS!Rht-P@pJ %QS(f>L1O1'DleO3Hg_14r`7"7TFSE]N9&,Ip8hF\"J&%#X?d,f\bU&6atu]aEOM7*OrQN62Q/fV/;[OB>LYj]La()P7"')e %%!iG)IPP"_il9(8!V$t'0])t[mt9\JB_ie>4pZsM*X0f`:[@4?P3+k*-K'=!W`dET)_An?'>3&YJN'4;nu %TOb/A65]h,9JDZF+McG9E3Zk$=-=;kb]$cnd`5[$JEejj$X]SBBad.EI:QF6mn\&RsM?,VU9JtSJdrU %b_>/p!2ri+nI^-;j:1h9>89Y:hal$hr(RH_DC;O:,%QpR[JCsH_h_@-_Wf0F-ZV,ie0CZLLG2LQnma2PT;lZ.)kmY(/W2H?PRPRZ %K1@R\WOnhh-mJ9bsMN)[:7b %:a_;60G+n23"EM;eCu-%QJ;W6F96nhVjHDp^%q5Tr>UH;RlCb.SJ4PQ:(IAQ9QYBO;dktJQHdo#OqFu\URWTkVl"ZtnuG^/P>4S- %"0eVQ3m.hhb5X4j:A4c_013,tD%7@#7aUF?^d/r4_`3;!<-@%-UZ#HJ!L%R,DZ42]D;Skr$,k+n6!:_>@61E%LW5S%hg;'XTX\QHJb"uH,qE(HoF]7_8'5,&O+M](eS8f*$$[U8&Wf9IZ+OMPjd$]dlp!TTBZ>`9@7.2%aJX%Mo7-b9_ %6^MY(32fK/+YOu8!!AE,AF7L&#*g>K\rg&:4+f6VlDHGJ\q=QbqEm,rJg1q3^#-WT]k0s&*+Nl=O(KNI/[[<$=;0>V4rk?TGYLV//G(EQ&%TG6;n8KTr*Gf3n`5A"P8dBde&SgSq"lV$7p,_-G/du\21>%-oG(GI-TZ%DVYmZ7jKM?V4QrGJW5G5k6PkHi]hQ!+kW9hE(`5"Yb?@Gi+5= %G5u!JMqG6DLhm*2`^*_f&1X).?$%29AQ^Oe#@04 %WIhGgX6)6%;"hB\,ZHp;$UA?'?`,_F&h7:/R&Ju-PSoX0.`MIW-6',HYC.*0q`3eZuiIL@pj?X]hq6Eq9X\YZ/Ndp<)0fW %^n3-kUZ=P[*"gQ3==p$'VG&G_]2aW!e((J=Tf`^L#fAX4[OY&',kN4XOX%^oi,IsIatSY'L=!g=4/B^>6\EC.Wc8"'34ZDm#Xc`A %Em\Xp$s/HK'\T8&h.2l(Lp\W7fII2$UFgi#gIJeVj]FFI,*&l[kpr`+MG1Sna>Zhsfc39gaVsOLW\\l?77]:X4dt+P-PRCj((M[b %EbH%L&BG$c##H>I!@ss6J-VP2s"@C5]OuWDTL7.KJ"C3m\bB,TO0UBS[LeOh#gj?%pfnRT>SnLmu=o[jnPHmhh;TY8Rd)j,$&#L;YkpLdeNX`^17BKEUU_ %-,]jHHnjL1ND4SkQjXMP1f(C#IIY!=[!AEnfIl!^e_Po7mFp7Fh#h&Aj`$%gZ,`EF_6_d(R9SED!orJWD_+_,FQkp!e/pi:O9It555@a9VIY>-":ZJjbu?Y8Jj24< %dt#$+J8O;BZ-ib317r]qX1c[BGn.jrW(IkdQ),.mG?/RNCV:Y#X3<;siS,NDl-ds1:tKf'DRtK\$fjFe0m?nYWnT6Q %XbI`*S%D1^ZYAoH0Laf4n?p.`e`EE,i2Z)5>'1^eqIE_l>-0FWecJoSQe/:Y!4KZY7OEW)Mujga#Lds78!;D\pe$hRF(ac1n/5FK %&U6sH,FPi5\S@KuWn!g^.h,kl=;&T/afp"&n093sG"@e!"E-(G#Ude(+;_CGk*tcGOf$qGR8QLW)95i@jj-9H:5XlI/Js(J/f>UI %P*E+B>lgCC6=LE#d'D#hP&NuGP)XU@agr0u*P/RO^V`M^riO1O3][)nm/E'^"L-:u:!/8r'gFck7/,)HUYQE%451cVLGbi.qKn4[ %"JrlFA1/JPP_DNo@VS/Z?]BN)4U^5V#f-P6[4DL'0J-E_gZA/4SJ\$RBdA88 %V'C(A/+@1R3`^F*i:UK2pY#IK,g>HPmT1m_S^E(#BpkBn>e".RH?D%.j\Rs6WnCT_FqW",IU<7a1Fm'5mi'#pM#3@; %1l,&b=!ijIPZd3I[Cr:o&Qb;0i7'.j[Z-G.Uu,/QRaJF!\U&LSE3r&=jAo`pJiQsnTXW'[cRJW,6:L;,HIGlaXILK$AqP9HVhtb2 %i(+NSQFDgM=X9@X,h0UCoftdB]\tuO2HVOs"(%(!%(+DR,dPOl%=kF0G'Ca?0LH+@!gMl(#/s/7N'0ojV?L:f,mobefgq0kUe>1& %5^1Xd7d6)7/C:M@WEC!M>WRNkMhDa,DMg''`E>1^ %m:s/]EG?tH[.5D_#&+'t]HE)9>b[PJd84ok/!e:/3`T4moiN#F[s%)MFt:FI<0'1@GC?h:$>O$NXt'K8QT(!3RmEiB5&5Sp5VSeC %A;Du*Q5"cmj$bWrpY7A?(K'qH>.EB(DSkh4\T#<$hSn;THg-:R.g'(ZTrVUD[?7WKda<&`>"*Q).jM(C>nPo#dp6VBMT4snNu+f@ %G:P+dCG,A)1M\iQq0f[Ac2`YpH^?/pcqDACo.D91L^MW@FsPV9[R)!#Gq"VkhoHT\%0euB,[J!-'YB]sF@_(bekjo]&KV!d*'h&< %2@16LJm[TWOc^8E*sLLeY3BWW&'1T+9J[09.Gcp"*G4c1p^!5Dju@9d/^?q3p(h:%$=aI# %;)Z'(kUE9+bgJn%kB(/+2nme-HpM%5PWjH:!n0c.Q).".ZH2Y>o"f)2H2>5M;3;/Pq7RZD.g'n?!Lt/JRH-1+/`B8fKdSKhWMT"6 %h5J"]h)tb(Nf*h8d]F&;XX*p'=\TLhJY4-C!tS$*_qb_=%OY %/at6@#f\B%5?1/DdB=!o@g7GJ]5_mFgo=K*^M+iZn77)JG;NDkM6f]DB@q5N$/hLZ %%n`iCO:Y=78OT1AduO^n-S;,J0ZAnC\#E66F>"Iu>e<5hdm0Z'5MRI$@Q6H?(<58Yr] %RMntYd8N:i+Gs,];WFM&IFA3*JQ&qfcf3NQ&:fLd9'*Z#%#!=R=A^9 %@>C4l[X'7DJVO`>Z@R'^=U=5g<$d*O4L7^k(gY?VS]%B)$;E_mr"`gUh,-*?XeH.nbk0E8[_8Yfq %g"F%`@.CVfSh/\RB]Hc%Bl>j13XT2RS3R4Z]2^TNZka>nk!4`T+q5N!004-b'M7PC>S_$u2[FcB`4h-T^g4h80"#YZL:BlZga>$e %+@:7XBIg^:7-JHqR4U[WHt6<]X&N^p8-//7@8QOF8bJ.CUflBM'X\0H=Ihro-'[>tVb'i7j!Zl9RI'2gJ0*hkiMC#XJLJYq4!T&O^c@':_G>jBlb;=B]-*B!YN$Vq\u):Sg8t[o-DG&-9G[CVE]l8 %))QVANkX!rYl^jf/CtU'/bo@bhn.G06(/X#%^c-rd0< %BD"i)i@Z!^Q(-ld"+s"m]WfR&(4"'P8>SQZCDm1fP\+sXB_Hu=@Ls8TK`9cq9BVJiqQ'c=@l1!C5]&BTTJLZ1.C8U/#t,4> %gBQ2=[[A2,Z65t]>;"7oBqN9*FHPsg9+07G&F('cmT,BT,M\G"k](Zd8\?qe^Z>+sA[T,R\@]_k#K+-5!eQSra5iRL/"2^MiB6-) %#if3Q1)Z=uMMMHAjJ=qlH7i2[mhJ@]<`*5&\DAa]hQ>eO;=U3,T16>!H&q:b;19N(WigekpPtPk+#A@PNC%fM1,H3beY>G)^QOC- %Tf82;Fs18r\'BMZTi_DLE@[uicR46_Q7t3f)T[N_(2ZY/#q,F@l*G,/0gfB(Br$\B,+^cl2&aNu+PbKga"`kN*i!B4lOLC+^lJG+_3E-l0ZF=\c[4?&j/pAZZa10EWPc_QHG.fsof>=&-=3q8_FMB6HZfkMRQ9[h+J#c3_K* %4GG!#)6?I&dS)5TgMM)8#9SXAFV@b+GhJ^^I/4>_k"SA#3Wo5\9"SWu?!?onS:^\aTZf>PQ]L(9Ti.9oXokFh'C$1GiOXu\Cu@oWj,)V2(tC!q6%^W.Z49,&iMPq*ogAmDQM!r0]3uE7 %Lb*Kka/'hjY9MES(k3RR!HOGJAj%V&p+Xn+-'Vl:FDi;0Os%0XoII5p=p9iI;.<_n6"b_q_+;M>ZKOm_`)ee/9X2ti*(/eQ(s4&0 %GnY,,JZBNuj[-rC:2Sm2%L705/C?V&M'3Y7(3M)H/_!*jW12;=Z.,nqZr":^g70WO-Kg%#5R*f(ibJnj'Xb>0nR/^s)mNu9jWV@: %$o8ms:Cl6n#s$fiF*=VD:._g!n[+!:C]0uDh=>CjV;AdpiOT3R(5g@Z$e'5kfI`?"l^#QV(=??.G]]H#>rPBr<5l2JidnuoO$Ei: %7p.cBW*JmJbpY)O0T9("[L.e8_U1'Sk\>2##FK&K9aU%CW,HpVJY1s!]PcTdb$2`Jr$$R!#$g?V';Rq^"IM+AZ %g4SJf,lQ]+]_=P#ecQ?7(r9X%4eh;N$pZ@eQn(rNba,A!Y %X+rbKrpo?Xf68b)TDusfh8Sd3RhM*ZW;)ugUS#$qroO#8_t9S[`6EYu^Y0e0eO8;e`09)Lr1F!NS@kPns.(2/oX-,V[8&9sBbHu_ %78@17AcpIA'oa0W;VSEB3Wd03g(BoW@4"Zu3YBJ(QbGs&g %E6m0jgE?F8_2%;%>'mF36.3"$NEQ[_$'h]uWf\Fk1=I_@A`B%?e(4c>PYg6?GKLql6o&LW,-riM-cs+Z,IhVpVtO3\5Ai?anP9V4 %?p4!Nqe?Oi,Yg]r]-(RC?m;Z.8j%')2_,)sb8TOQLh=ul:o32!jFpO+Jo,aM-/(lZd%[OgB?K`rkX+u(3R"R^Dp]UEFaflV%t1+$ %*\1#@4ZNp3[K>_:(<<6L(cB?qQ>'d8[0BI"G'\+>?-C3HQsh6cf7[@^Sf]K2]G3e.RGHd$:D.&qkQ1cHZ %VQ<-9[SB6RO]9K!fHM"KP_D,,q)7V24(8+Eg*7?.k=nmnmq[k0h%!h=$8NLhoW="9erdrg/[\s@KlqEd^SbR>p5!?j6lQ(JKG$DQ %&TmA3I`QSlm.Xi]m:k[\B9OC%Z7T(Ik;"f(NMDb;NQRb"P,Mh=Oi0"0jE]_J?6QGSk]pUDYp@ULkdKD_o==S<8J$EjR[m,7"rW?8 %j(0/CHhPrm?j7Ya$dGd^Y%l.GMO]Cq@hPNV8n#]P82`O2[)'1qmpa@]Fu#W'orP.F\tI\IHOd=9VS'HF0_&lsfE,)_PZA=JMF]^f %,=`RGo/S'h1]+hTq*W!MfAoQXS/u5/Pd)iU,`.4sNa"(p'btQ#.GQ/^SY_[9\EY7!R;;G"V9684lUUp0[0k,EL9.Q3c%0:]8R6=^ %eM=)a(?-OmaA&HBUnu.YGCXtF0Lc>Sjen0\%3dMD.S-=k.a4Z*\;_PCf8..hO='n$CJpIGc@^QSN`)IL=95;+kk1;eTrYU>,BEVq %a%p%UkS6kc+/?^o1S=bk<)jD(Lf!]+/(`T+2WSI8;o;_X*0*JYdp]=P4ek()W]F %&3VU?T4u=1Lq7AT8()o,[9PFoV(*]u&JhD3,uY5UX*X:rB^OT*?8&J[o9aBWN;BQRmRbsWUXB/;!=Wee`SO;0FA&VG>*/rCJf\0" %:24DQjas'o?MKr#MeTWB,'G-"d3Q\^9pG;;LZ`nA([Om`9Up=]d,Te:85pR$6\/_"`$+,ti2kUQ(&OF^DM*ak#FYikX&AMZ=m1I/ %#,C!e,RuiYDAa$ADknp!X[>H5$lmd00X2pKPT6F"VucB7,]ut2Rro5F]/j/'/,2K1l@k3kS:13@Rra5B].u"F(^*B#(]$W$k-]->OaY$IM1+XPQT=Z-=>_CLeT!>9ob3kY,;THG9,XGW4W0 %)1tE]=Yroe(< %n2"oHMuL!k(!o4pZH(W*'VVC;br721(%jjc_A@Q"+MuTbik?2l@g4n)MVf>F=?+Y.%h\)l@S)r][6W?NJ2\.Q%]0h-B?uSM2THMj %dTf(aQ/t:?)T1!g=qOCG4K^dkktUOLL2uF7EQ8^2IXi'4cDN!_ft%@T=Fu8reT@^8Zr@j<67]LsgOP)?XTb]<2(FNh4Qn:j9aZI\ %qC&K\V88:dU\^"6)!QYsdA21La;XV>k%ELdPNRMV5`f0+o%n9_:B_7Hb5o,EZeK!/!6BG/Cckc9;3L2.EuC<)kMD2sN/ %iHD.JJ&He1=megFjT_U\KhY(EJ@J4Y-4C3#WWg5Ji:'S6aI1^B-F)%bgbPTOX]s%<9%H6HJSl]k+G$5C7t?anhK4>M$m$\FXB;Vd %>P(Xdi+m&<)%0GOGJ_IThfGlU`=[;CeKG40;IU3tP3AP`p2C$=UG+pe3C8oU$Yr0/%pD==-5qW,B>Z-F#J"^5cq:b#[IT?b>9st; %33`"[&jI*C;B&I**"/;A=KP1'8hsTS;)-\pfV7_?oV5->8pC1cil(F/7ca4'DAkHr@I>pfY1'Sk&heNIdk^5Mul*A %Ur/*(,X-k7J_GWp84S$X$U'9:/eVlqWV)(_Ok<%e*)jdI'[=^?;leB$a!_TXTQ)$!A"9Eo.?.N1^q?)A7W$mB3*LLL-:j %bRKa(6s%]:3970k^T3QH*7E**rEF1Q@]6mD.PX@k/0f:C]p1bANm7I'Q'E.i3iPr6X7^u5f_Ug;El=Qk7Tp^@C6=UY;G2ZlPGHiQC3rhlT%r,JlA7BkBXfS %r>mR!\5JPGYB0as+eQGG(5(s,@Y'`Y0#`%!*R."rg1K=-Tm0KZ[fJ*I'XMcdZBFf\dg04^aYUt#AgQ?!g76seUr)U\*-m:t(KJd' %EQ39beV]j@);?Up:fb*F+cVE_?J7,HMD"^\-0KjuL__WgLcZMgJFu&nBk$6oXd_8_9%;j=KK>jb\A\'E"1bgUNF*SXj53[Sa/Ck)OW2/I(JJ#?l>#cb#RTqnU7*PS-o) %Bkkup,IV-6.;9;!*OJ4R`cG9.gm%_Vc?'?7m)"*h6k;W'H%bN].Ub?S3b='SH4W6:;&tq=U5ImhTR2^//oA%o9IV/e*>"Lf<*<\R %*1Y'`)8WAQ(bM0XgS#nD$/hW7EtsE1nSC9a'9QF^fi"&UIe$WTN(0D0SBL8&8%Y:#>N[IjQ+%[VSYL'5C)=]ZD)-`cMY]/%NOpL1 %o2(RIWYQl21EmZu'QKM/gW2Qd[MV;t'@pbO$%gR4;G[kdSsJ!j?4CSt!c$Kk>W2'^IE9$N=/)*&qg<^Y7:aMG%1Aen0 %gNjhEI,p+q"i`IS`="3eGi3Y-(QJL>ZQUZ!&Nr5.[=g#@'fE-p>_#4iCF9H+DRDk`I7T()]*]rGihQ:VVEJs-;KqLf6]iMMfb%XO %eBjGRL=3CD&S;4^&Oq\_Tcu0LJ;oXUA52&4L5fr%D?TS!C]^O@:5!UK_,fA?G+MC/(7XfG3=rk9P>VMZA<<$:_=q[S]e!#l0(=LT %5g-ad3g'W9SgMjD?4mMa_;)YY_\*;/EC/T"Co;S'g5NA:C0::FD.dpL,`8QJPe,CRsuPU%S3RD %,g0CBP`$*eVMI2eQbV(,72,O^p\9KZNXgLP@n"'AWfC':_[XmnI@[p;#l"OUF_=NgVCf'j)o(R9S>'>Q)t[A_[]%If/PEm=@*p2B %=I"mGM].BRcJFF./gOIo!D.q&'qfa_K=$8rQ)`5C1T=Y;0F=1j'eV=d`hVA+G"BHK>%SS"#.8ZCGqQ*?eQjmOrP[;RK[o5\8&@,@ %@.5gZ*H':R)"]98+sb_a/is5J'01;l(;U\XBV8IH7Urp_.nNcP-#^^6V`C_mZe<='ED"(R.\QF7&m;kIknIPU'N[=snR.sVPYG._ %De!ND3\5chFO2u]\,]PlIUNGVC:(/a4Ml>Jg!maUV!b;+9gT*W@"D@gd/gp;]UPT\pb-0#<0p6][iG9/q,B?9P0WgSU2DGUa %:S5diSA?\J[D+Kjq`(T07%j7RK>L:@!UV?uiCl^OS?c`b-P/(,FNX].[0Q)OVh>]WK`"fb'Hq^[\36%%LZcd^lDFlR=9'^ %,6ckbE.Xo\je(a>Dd%Lhi)j(3"MW?m3*\0[dOYSt@N:KYNq^NJ*g;MSSkKe'eB[Z#.P#e"7GmY><1f,&&K/.BJ9YK*,^s+F?OVn- %-aXT[2(QaS%1K%M1hg?f,JFf5WA>pqFP)B\Md(sohq&-i&;iDk8kU8XDWK2]^UXFi%#1df!$2LW`e^-0Won9)#kjQT"-sA;\#2,< %GDmZ,Ko.aWL9O(1VlqR-ND[]:dg[9&,.2A6odUpD8j,DDpNP/Y5^]JEk?%RqAMi%*u9_N,,G7X"5ODC#q.L!^c"i %D'_s1U/W5-=FaGo'^92Fb\@P:978&\$K)[&UAgZM$SSpZn"0Mt+$1+X,=%gL)``r?l,Z&uc%H!E[tHofe%Ks$>eL,H6qn%h-( %VB1PgBNt8tU"7=h)Tn]qqB^1Djj7lIB3'_('h3/U]V;8B;oh&! %FlQH/Ua@'h:,>d(l(\E,4_#DT!F3G,!l>2`@J4[ua\7MliU4O)SqCHtFIAiY=B!.=KBkF2"AeJBn\\3G*%ijWTp`V3p8T/Y,"CcO %$FuHtN`77%;^d^ZO";P`9naf=I35+rJ=`D&l5g7ZH3R7"!S+u[(e`;m'T@oiRu)(kCk,eL%i4dI&fj:@YjIYE1/\ut>Ec;AM).Aj %>?mMP)k_ep_+m\'R)cTRe;#.5iZtfT_a7,bYc4!.X*&,OR7\PCEr*@8XJECY;=5iH+OBSFfud/7%MK!N01)dR?fs])AB_aRUX\QJ %>">F7h$mWJ*=J)<+jbb&Q-UE5[S$7Eh&<.]96"UgXTlcoESP#+5d+'/l@@DrW(ms9$LEbpcGe=<]I!9E\5NAF0RV4;HTLZ#90&VB %KZ0,,i9Vh',9]^X]p*/Dg=&Yp85F944=q+4&Fn4_h]T]M+^Q3g,6MQ$cb>at>0fV''.j13=@\dUdD;eGBUoAeb:Z5>N_$)UI&Xr< %B:+8+%P"@kCn)d)<=:A!PK9-^1P,ntJ[[WJ)8cpG4bg+-K=))UlZ$,2$Hik!/>\\-Gh\s[8kKH:(71DNC')6j/BZ'Co#'8'-,Q&0 %I)/DWeWP2%$DgecF[?0Y/OY74A!h%NBE3"V+N9E&asgdSl+*suQl2/XfH@J'DT_1Y!riT$>q)7"'8WKZ\gWD0$Jnfd92pibYT;ho+1q[@q$F1k8VL?M6"IO1j=\' %%rH@LnJPtTJ9,e-JbH5PLSe\GOno62O5\YYWA>V>P0`![lP7#Z"uUC6ZlXc@d&T[r0ahS;K(4Yg27%[0DBbZ)48FIe,+enM*Qr51 %[[;[)%U9t#Jaj?I4EVN9GiaGa!4< %I^3jP7Y@8r[Md2$KKoP7T1#%TbqXo-8=Za^[Cque$Qit-S7T<89U.5-%u`Kj@%iUX.Mo\8-`jVGd>u\'D.',!MmeaQ+@``4)R+&h %N?Su4?+bl^*(jEH41im)!0^+Qb(,rj=CA!./VqIKgWa:?/::\r4%kkQ=pD3G4%i.aNP_B[d&-HND-@&.P>"2)qaDBM)[Zn)oFereNF\X[cR&FZki,U[[q;afAJSS!O1Q'&O,?l,Mr:EU`jO'm+E69jQG&srd? %:Us\$:I?VF@R*RFUR/8\MkcUgs-Z#()RB %1gKL3@!M=`hZrpui\-SC`]r\.%KIKWj:p7tL(_Vq%SL+PA>m6SHgf.4P4V9`.@#<"X6$ES3 %Log(H"p)SOo]0+5>k:oBc^B:!/H0?eP,;egC"O#T7Blh@M$'nVSr@a`,]MsJ%QVM@AI"Mfp15NE1=k5Nl;o0qF]V7\hl+F7co4&1"B.N;+ZJO&)?0?u"JJAL305eb.$dPRU3V/!\#5ZAOsD'6:Z %A:@!Hd%Y506oLr/e0HH`;_F[IQp;@UR=&X>i3#+L,N;,%=pdOS47AE7ifsX>&Ad1-$tgJk+=@e_Ql=C1cW089F-BR7H?rH1$$F0] %jAJiqps:MW9DUf;8='0UR=_)C7^M2MboE_9'$B2BURihYFHj[DKNbmc7\lekV9YU).?&#FGg^1]9^I&#*Mql %TJri/+]!Btd84:Oh-ijACugpp9#M_ApTR1DrG'\*!,-B_eu-%\OnP.dmt8uk8-AIb'EROHP6k&;F-;DU'\0IP'MeH4=MJ2=@*B]u8O/Ic4$BSrEf_F@p'@\?j-%XtS/kmGY0?@cWr %9Z\/-fP!9jEL+[5i`Jp!%2t-VH>Q=l[Kr#/)9l;Rn-OEA9#IGt0P^S,:FAEP %X`>cU1Q9Tdi_;\\H0lq.eu8)C,g\^)7MN\)i9-sIfT]2,oeO9P2-.o+TX#aEK:R#HJEqT>9\MO[[Ke2olJ(=:BcD`:X#Y#X.W[+E %g>"J6.A;N)!^A#5HIL5[P2[f4oMN&H&j2cpXYqEJl*IhIWmOX2J[UFi-G)s8btUVM9\"O9==p&_6t"1b3`.5;,`$+fVU7R9nVP0d'rMgi!ba.Spg;`&6M2!MG7+gF3qJ1/CX_;;SS'H-j`J^6Fldh3:`o$R,p^#Pm"&,HcYe %0k:g4.OAe`Y(b))/fSL@&"P;%en6Ao%'#4a28[`t3'EeAPb>#BAqX)7&h1F[?VTK'e3Jg,fI/p`.XMedR0#A(-u6+r=!O91qO)MD %Kb'FopY@ge>]_rc8.jPFtbO:)&+=B'np*ejH7ZKEDVH&<^;-"Qb6B_,TF8Ej9&0sTt0GM1n;ajR_5NH*:J&or^ %LCL5,pRI]j5BTRsRk\j(2Ae#;J+IcMNh(@Bl]1#\#TPo3$RaDr38I/4I0HnjQMm:s?o/2!bhHrna %gkg\krr2obNt9idO4ST*4ZsN7'6DM"iRRD3V13K;r6lI3rjUcihm@!%rPJOrq:A]_pri-OIt.L\MZ3P(p#Y6,rS>H1&+BCNcVArg %pY21Lp.qTg>7]=m]mIDo'.$`5 %i<`s8V[(pkJ)Gd'g7EfngFke+q=^;90AVg:\:4&A&EoNX5)(Y$s6ia-rU8(ZF#Rp_p[>2LkFa&*<6YMoY/(bGE+&)UVc!mcmSDD5!rLn!Wou4M@odQBpH6Z(Zq:q1AJ&rnYKRe\=7PI/D1]jV@sOAfT,NN5^fOID>gUlJ^amro*)R9M[k,?9#R3rV$6X %p#@r7iF?t[Q&-mGrJP#gI=:\>d9ufA##dW&9RCMj*"Ad?_6i)La5.b/?U%dP/c+W(pXa?pT7rr.l2pCFnI%VXn:rV#OI&+>g1HpG=;L9q9( %ZsDPGgct`&pYRNk47au^LRTlcBDU9N,l1BOIi9j-p>*X<(RJ31>[D7>'ipoTL;:XSj(Y"Ih9EpVYQ+UhrS?#[(>EEl(S?.]>7^&d %rpK16`K(nfoSZ)bnk\)gro[,&rR8,JkP*IuDAN40^&O_&HiH=VW!3+hrqc'QHn.#Jj#Ghs^3seO0=u %^%qQ2WGep]s*/OsW&bpFY24Uhm-Tg^+]5hKeV([hGnajrVe>_.lUu!g]^'Ggc%Wod/\3"sZg1i^ftT\jQG%OQIf/@%l>_a\qN#ie %*KF_,,M_A7+1okkl$djLnCK1Z]9fIN]VsN`GTAd'8NtYMYtZKl:E<-$s7XXBqtlji5$VClcdON?r<8C\Vn^$=HHD[=@S)S>r-_Uf %[d\P/lacM,fD",lnKIrsme,&>aU]2+Y2=*$O7:pP+2jZ7Ru8lXcj+-grU0[DgMcLumf3-jI^22,rt_j8I6EZu5XNri(ci^*a('r! %nc>NS\*3_G+%4jo=7,6[2Wj?ai!JpN=BfUb(r3QdUFrEBan-4_A[UZa`6hcrpd,+2XlEFPlim %db*R-hHtBM+^]Lj0:oXW@f;o*jT#&)6+O=?0(//1DSEWl\[pS=A+Zl+ZWd8[ZN3Z*,P* %(+Ft[RB'b'G1"bpnb'fum2!JKIVKD,-BIn*SA4gEdIj@%D<=%>JoX4"qXagP*@D:T>WN@L"$o %?:Q.K#KO*o+gCV`I&=)jL]h&=T[8_jrmT3j:RT"J!7Ur;3q,fr5CCJXc[YiRYF*;ebFd4^GW7Y-$R+on_Q.u.ds-Vbn]-`**"T"B %+&McX5TT7np%69d*`0lZl9GlY?U$B`;1UdhoB?E,:fk"2O2o`>Gj6AH8+l+sO/Eee4ro]^j71V^T&sIA07QU,_Vq"_a/\IG*O>&B %.K>JkjQTM`GK<#<%f,/XhlgqsG]WDmQNs#^pM$[7HtoC+i?UPq'U(`[q_hQ]fqX=EOLZ&!R3,1/CB&W?C&e.5rS@JQce:UR*'TJ0 %D*^R/,_S,i6>VqHYn(?W5ig>s/+$S%UP'o[DtD5&in2/AK0YDi*H4a\a)S/Y:oDp]orjfGD6_X0&D& %m]1*9FRo4cg,YIC*X*PB=8qD>/1206Z\Ij#fOt3V@%?fIqbYl,R(XHb6J2e8`+0qtk(lhVXVC %>-kB\1],htV;3oq\pK175Jal;4K'B9h:VN.ce"aFaC&c4sNfMefcfX?aeMS:!kB&[J(I6t]@S!'U"`ZfNqX(anQgJ%)GS,c$_tI0AQfbO)@Q_6uIf9"ZgPrn+b@:&Z %c[[CqHE2`R/mLoN`Gb(OL)]h7Ucd5(InSdIkp*a3jQ(IJ?,ZIS@^FhIYHuAM8R;k/Z_1H[DH' %X^)q8Z=iFu^>++DV[V'g;i<4hC^BTa`10\nZR9ok:-tU-fk2OYapW!UXMdorNP<#.Ck*R!u2bNAaCe_sgi(nT*I/W`mX%2II %_pt7D!c-t2Uq3cZtqU1'Sn+tq6E?"q/pVT4Mmem05s$\Bqqskak<[?c,5/GVVg,hC[e>8d#\Ho[SJY(m'RV]J9 %jojN*")Mt5$b!'#$:nE/+3YX_m\d1`a&qkG48-X_k8+$BZ%F"&.n %!W2C-Nh1c^d".r>?jCKDnR"p[7_cm/qgH%=,tkfhXet]DF6&Y9,Ea>_R5X!Bp.Sl^MaG[.<]0S_;c!eup1`Dn!6bpo.oYDGQJ5 %5Mg22>0kDs.+qa'@bUdA5`-I529ZHXtHA4"+_N_Cik-BuKPDU!k*;*61THM?pZ]:66e&'o*9n2q$3)!1X0'`K?+,94CP?#BUS %#E0jqNkmB8Eq^'Z;msXmfN0'?n,dPsgPk*I,TGH7ah`"RSM[)Rn`q[rr1/L+"k!(f6_9hD=n)+eS7]0^hVS8 %$qIA_5cppNP$%JOCj8PIp'4ski+_N@QuW-4&%qXJ(a$QE4u*<^hYuA9`df:Xi28ei[]?S@I'gD9So%IAUgaBN8?4$2eWne1EU%q7*C>F4]B#P#O.*WO2EfmPl[[]V$gYG]mY"5*LGl**m< %VkH1jh`Z@8EI%5rji(7=a3)l'hDP/:=X!,!m/E"Q05k9/XT)Z=#:5:Xb>5M9n0]=%pYTeN#CWADW));p^3Sr`=,d*_XZuQ'A&,Z9;n8(>l=qrpB[?eM_0bjtHF):I-A;f=j.mER\*^rFiihc])sE=H3a3+Y,*Nk^dg)=S;cI %EU^-f+'1"A:\Cod_tWscpX\HkpO6anmCM03?2[+Z@8ABbIp37Kcalltm%LQO\"uUW?$H0+lUrKko<*lIm.qKEp2A9^AM5+-+2>A" %g4nJ`GaBH>ZB(a:mHo>1o`mK`A^AftID*e3\:s\M.bg]`a/eP,YHl(9U)p@SmDjGG#aaELbl5ZK^]Al[-[?".8/6Ob2.Bo&fua\5 %W&th7H88ZPA6\lV&+XZ+Vf1Gph`.9mpda*hH[?=9PFA`d[.OCj,,e@'i*b:!+P?B'aPNLY8"eF^D=JE=])5'h=F7Y7g_RknO"0Op %>ucCMqWd#uf+0OMiU\dANl-]`5$iWE`Q7f-=mo.XG&?h)s1G0iCZXO3MGBD9tJ3dM=.Iu?+7lLUL7O0H/*a.i?kkM-Z9pJ^&A5/tcq<5julIK!G0 %I/3*?2cb3W7#<0rrr2obO0&^89fNmX0]%YHHa]GO*\XiT0V(hnOR=lm/E7$C_s>="kd8a!P:*&RS`>f-0"&#?eb3eta4I;MN'#dcBY>^#lTd(oL$j(%4U]I!S6XPJg6W^- %MsK[G9%!ouRR_XkMDcgYo$u@A5]&`,K@a7Jg%/:8u3%'n@T>A2^on1f9'>nYs2+\m;.J.=i*FD<$ %E6#i]_55i2l_#=YL+'6_m>LS[[TA18gA`rngSUB"hSd=t;T=4fQf:EsSKG7j+a>Y'E5RK'FDWkKOP$t%j8!8'@WDl[B%DsqgX8.C %j'<7:>J0AlKYbbk#d:r6C3-iR)$1S:o9S=9qa,n[V>9;(k%XjD2Tg7bian)d%=QdqdX?iCZab!:*I3o5?4A,eE[/"p\g`\NdD'e.Tfj:YN1n*o&Y7pT9ZXg;N=IXO_nAd^9Iq([2j67h<@+emuZ9B*+P'`S82?3[jj$,g%.2o&g`Yn8VG(%$=W"`,p@Db^Ht\t]2!:"G0Xmrc=.@Vd %=&*S$7"=*k,6bcPC0Oa:Y')rg\T4]T"8iliI76.^`cdYIDDu2i0\b!s;ijL`Bn!S8,&#f@CV]6`B_&NV?aL(&<+!=Ag<+0AJ6T^@ %g7(Q\q>@sA;prsF]RI?O[TnQgQRcui'"4Pni?!ksRV[F$g.D>BY%_(SU5%Bc""c'QBq_;l5@g65?[S$e<(E>sk@NE>]#>;%WL\5n %8-aF,Ee@!C2aGD<%j3c!a%,P_D7sCYXdtucl&1C[%rq#&C;"V7QJ+p3\-cd-G79> %Q!IL?[[eM.:VT;TX5"gR=Z]jBc):m/>b#7b5'V;52TgTc/NoZX5+qL'#H&J]athePSI]uoEit*MlJbEXoi0H]]_3k`912f.D5G)= %Hmed!U85."g#`a%/$!t\W,eFlegBeZWi'=l.-jfZXO=(kL?iI`%C#51?[2uVS=Q=t!)pkFM4:38\oGr^^Hm32'S\Ti.W1#V]?U"r %itLTRVlF$e;-rAKTTO(f=SJS.e`n[Y#-/n(It?*4=iKc59f\(jitA7o3al9>K@1ZOhe4@$]+[TFB!#`#i%=kGX!+7pu+ %Bpaji[e*PVp0!FI2Ta7a'oEY,/%3bBe(Pe#FE-Tr(u'0(bJn]l%s\R=YIXU^L#-VJ0.4,/G]ZXpD:c617!gUj?(S4-s&kXAP"Z2NN0.KsA_Y+E>"-nAXsco\"C[kV@7S23AHRC4gLpNfDGoc0VI4A$J2OI8Z5$=RfB"g89XMn()XefsuCP %6,!FS<&)LMOUi]59JE^)g!73^pEtC/ZWHI%hTb5!ijJif$Yh^,5O]8YHE\Gg\`anupXkm;=K2IbSPnQEC!4\dW.u?C*n"^sUE8[4 %Wl;uQI4'eg';pd!kcuLCONl.*I,9^!^rC672RdI,`)SDCVR0uBhsI.YkWlap,>V_]#!,+_Am;Tuc^f7?2_?QGieW;lau1e.NnO_S %.\`Hhm9K.\D);D!G7'a;_.A&'>rk)$X]LX-qU(Ed&A:b\V;%Sgi7mhEU;\t.13%5&:KhS^4jNr1#m7;/m)Hk%h+WA>.V[CNbK&Dj %mcE6L??oUV.3`TC&$.A02f.rEhii45c#;VoSpM@/!FEbZHLA7K=WX:K/d@"MHkWk@IT16ENM^TMHD+&i&4+#_n %=*::;&DU?uB;0Hfe+tIC^8\JV;KuV0;>?pf\e2S]lYW9arlj_+U@6p,8jRWKU8>aHYmCZ6S5"!<]d4&@e--ouDBLrB-;E-QjS&!T %)/QWCSHoVjAGH@FA-4n9RTOtdoXS.\WX/9f*dq_U*A:pN9W.tp73e+74pK1XiRI;%NqjfXGk>_u64YB#]r*:*Hl<ju:%2"RrM2E^!u %+`DuoRRm#kptO/3lF9B'%S0um2JbGf#DtJ0,X@&GGcTTSn1/$*dY3.L;^QS?KOUI\WGV@; %>,EpZe]YWu`=<2XF^ih,jqD[g68trhYTK$5CIo4m1NboJP9OZ9B\$@XNYje;BMI`Bkf&+-j]Mh6)/4D+ZaW0jfF3k!\Le)'#NTtQRVKTE:&k*ZaV,(AOZ"efFKH\GQNu=O%Ed@l% %/SPeB[d;Xb'#aNOt@+pG3A %JYTRlW[[l!gm3%&B9D+@t,3MfjdE:7,Z_7MFGKAo/SuN[KFDDE7/#^&sAuoQ%G(GNkS^4B)N36Rg_m/^d.ub0/^[8X/jLXa!%J# %,!WUD8R#6-0gROsKFSQ/1lu"bqh'E?5#p<.?92QKU262Y)Q4ZOc8JlD2e$B[dUOcGnM`]@8@S\g.'JWqT[kJdk;6(E2!LRWmLe-Z&P!Y:!^dT10%0DV67C#:7T1"j&.=dVQf(gM"#"pS/4D/AIDiUD:h)=='22+o%E"%g %=iWrLWl,&(WckICOu;Rd?mi?j5Qdh]M>)P5j+UJo&k[85D@r62d\R.qO<,,3R*pLjDmV>FhqG2&mCf9tXBLe@mb2?>!0tb.D8]Cb %&WB_koU'=&l"A@1QJ;VGp^plf[S%'W%?a@QLIu0"&>rE1bVA<&*1Ws/,AU3HE=B,Za^$PpQF>B!]b'9s-[RFA4GFR\MBnCcH)[ho %Q(WJ8TOWe2m:K+ph,FpB'+*Cnbf_dHD1KPRW*"J(,g7+(%h?Wf4+4Mf(`eX\Fs"_$Qa!LiD*D=I>'++20k9HiQLu?V`[C %oZS6UI,o-e7LdV):KC41Jf(ut]TO'5>3nC"(]$tQCZ+S\U_5C#bAI\EVCD3uUoLZd>0&S*k %@0`pe\VlI*ht=*4b3%$-B.uE]a4ean?8)Okb'>s6&b5W>TVMfBI"gY\^uA9`+I"IeWPtD"8)u@G//I %h9]ud`$V'Mj?"O=Ukp*GD4%mF8$tnr45no'M;=81gr)t?2Juq^FIVX(Sa^JUnTR7.aVhf#`m&VY%nF0u9(Ck"2nSuO)!Qc:Hir[] %s0*0j9pWsTGW.1`%n=4bRJ_=+TlG6$QXf4QH:*h7:5JFLL*[1`sebsC%cj2jOP"NNl'@g>8j1pIE6%sR8n %KCTQqkQ:AF%m*&J`9,\YS0q%t!md&GFopl!'0AMP6s8CRUk^:?JE]W=3s##Y/9ZR/fs9@clTtHBJ3=e.:67VQ@MdC_['0pScXu>B %JU>kcmXY&m+*N5(8IIT\pr*0f$,S&jpeDqqBjq;aT?P4`5X'"^%u0Yk.J(A`5-2.4i-`tk:4PNB@L#Gr1p@XlcgI54L\5(&Fo_6h %hX,mk0Zjo]pYcn`E.FSV<'D;]#LC[*+?t*NGC]M29G>]i4See;Sc%T!\%hof!VSH#)'6',SQlfHjL`#_-Z?c1q"F"6Q9"sDV*4KS %qeu@]J,0,us5I\I+"nZWY9*-2nF#i/qX3W-pCCVYqf))Ce\ga!Hb$E>$%H69dI*>[n#fE7GQ71"2tnhmG01uGe94m$O8eb2R-NDq %`!0etD&:R0-E/LmrBDjYD'PRlZRLurRE;EZ(C1m%@T&CDN(C/s0o'1/bjegJ3f_gS0T.8F6LPa\6!KB9#;hMDLX=e-jF'A3+Qj8" %gWkhR6B:Y4:J(_G<7W7&mrShPKafc\?FDKI82C:d6Z8P6iCJS-6D7'QWP`?TNJ&^E)W,sajF$K55\ %I^oIgG_sAF\>4djjX;DuK=1>C!>@K)]>63fm0ZUcM0"bM,VO?2qQ-`,2Y(_.F5Rqi2#B! %**?L(5_B49j`Omf*.T4A(/59jI\Bg,_>u;,#8J(TjtpgQ#W5d#^GkbE9L@?QCeONn["TBH`6g*C,LtE`XT?j=,h>>6[>H-3hC<8b %'sFPC$cb#kO:`e:m(;?f@^aTPUAuNDilLNtH<-8fap%qi`(e>#cuibji+8TYO;f;P".[o:=oq\(c72L7SCiCuHkL:(Pa>q^]CKpo %WY&Z;SR`G42Y+3Y>015/?Z&ie?:5Qi3f>8I;#2:]gUba9nhgTb>]_d,$ELXK($fK\T2DdkkuWRm:Z*=u0<5_#Qd-5^jj/0p9OVO6 %Mbp*sFYjdVUNtMn6jmE+-&I5OFEp9eX(f@h[Uqq[/=ElMOQL$/6*%lRPZUkb_X-Qh#80)Vj\`+_8K/\-2&ZY!`CndfrMRJ4$!`C- %XAKp:fH<%O-*gXkFa0dOO2Fe9-R<\m';WjfWsB#5;-?R>^Re)V'?,h??$b]CM?+]Bq\lQk))DeK=p8"L,fk#KJcER.nPDZ\3T\%@ %44O)k)3\[tZW]8Ggq\`e'0/:3aS9c'A*XEtTW+t`DRkSqA8sXi'b@U%86qIY-K?>k"JK/:K80@OeV2fY?H$[&Gd`-T_D]r.iQ6`@ %'^X-HB_d(`7"g*&:P=jni&thYPfAd8AV\'.H\fB4((Fho?WaIA[XC-%" %@&T9QI?)_V;Y.gc:"NKF@SaBke1&EY-l_,!:OE;1=n7qr`1pO?'ai:IJ<`$^U7D>OK5j6s`U9:_&i/8ir3"$,MLhG8/6TX=2 %eF4JJeLmi139%T**'&QS*NsqKHVag;4R4DZh/K,:bN"R\idH>kZ4BKq3j6RW_/g8]lSo %HuFI#/CakC9H8qYLTCc>;"A^!BH1u4Z%p5PhuIXk)/&lGk?r6I!bJ8EdK/Gp2R/35"-nQ$n-TdQ*"Sd`,:1K_p8UYe;Dtm,S`jRL %QsPlT;1tGk_87XnPn\K5O_)sNj/C;428h+t6#`s3ZH]2Ali.j00R %X#go$8/r^G3)om5M*0?M!lEHl0p5G=H\SbE'!+b-0p7[3*'QeAIE:]t/=($ZDg]8]_cmlLD3"P;$A:LiI %QF[T@'e&.1FB_0LHO3G6@hge^"-OQ,Vd2Gr`0?#_TPgK3L]h>HnS]5NRP3Z&'@Tj2LSa\E534JLD+:Bn3BmK`X\N8HoJ*nqtu(Yjt9Hj[LTP!+i>F7[VMW*%&mQ7W3"[C2t=$ %/"bURP[NO^a>im^=L1fE&"I0A&<=V1cGdm%.$9CQ_$6;1$dW;!_=4d`!(`S58uA6e?'[FKj7hoj\lcXDPJ=4!`l.5t^k9nR1BD^'l]GEZKHKB-]:s7sB=NFL,s`$/aMW&fn[nHB4D)#tHFR^sHEOEq3A %>Wf/7oWjOOKYh5rLAn!YS',d %Z^QZ+PDB7h/4M0SN6&OTf@%IE5D&373fd54M&Q^hO9t7n$_"3IKVK31;aqao)F2TGjmW/&ZH*?/5^H>MYu%h?W]EHm7E@(.3]'Z1 %&N@/7:q[Gj8jX7`nlVl$J%8D+::%oIeD7.WnM*UEgpNUUi"*$R$3Q.8W@mH;)DGS2Do*cQ.b_W+k-L8uf=EDQ+;CL5PD!k>Y'8$; %*X1(Y#qpG*7AkA'/8%OUR<)rD,;%&2,-.3\r3L_6?(?c'T4RY`#US&068Y>XrmbX/iN*9JO?GKU_L7N.c$DYbaupViNt9oA]hVV[f-<)-`<@^ %cqEMrf3uN[#T6R#f[OI!PGoZQ+L[+sn`l0U/AQQHbS,gBs"P=1&H'jhXQu!.DjQP5H+aFs7.bK-ZS'iJQo:II?bKhFp& %-7hDN-D;8k,iiJ"LKCNNGff_bm=@_ck3a+-f/J+&=DooL5=LbB0q-V"%m-fug$pXsla:Oei.,d:GKXFtPLG4JMW:WlmZTTN`2iJe %=L,k]@KqZh@D4G$_8$c6ZZNS^<,gD?#hLu[lEe(DV9m"!G9)Ln%h[Wop(5DX'6/&Xt8jZ>htB*]K>_u(oGFdZg/:[7Ijt<@pStfe!!cUDO7C_ %lKg'qZuqmU31J!!NFS?:D#$*%ppjV=2FLY_7\Cb\<2CG4??*f+p]t[br$Si:0FZs?;lG5?9\Zf7\--[ld!MSoHI7XIYb7d)PS"2[ %Z%P6gf&ZRB`NumYXqo9RSb1X(:c0qK!:NhUNJa2gbug4H&<>5GIXir-KJ"R!P'tMeG7k]dcWq-C6)SK2\uE-_Cr3ge,Li`4(b:8V %$Jhd`1k9Q#lt(h1E@_FJH8(1g4i#6AKPQ]7=WOqakQLCSXtI["NAFN"!2`oJpX&?>OF-KQ`j;&$klP-*D@UjD[&Ztt64A$+3#h56 %.dOE:M@?.71F02X:0.k,a^WmZkF"E!Y`hsp1r36IEtPqUJjcm]g0^7R"OT)TJ6`<=1)2DqG-@&h-^FJ,\5gLVQB>IgVrW^ONYjJR %%%ISQW]QE_Sr!\Q*22b9'E9\]ArYa+cpS;-M&UOhp"=I*MblrSlq))Fd%(TtRerT]4^&]d3U=M=O9)U'!npZKngWUY'UV", %6t]o#P)i,9od?dFIXItp"8fp.s@,u&;];fI3/54?6C"Iq4#2_`AptM$+ %IbsG_:h$0/6HKC;"Ns4a4iBVoP@'@&oTF.p'p %^e[,Z"MQ5"SFTp@"qVI!b9VJAt8",Ztom9[@Irr&ge7-%biC"tHVU/Eb>S6D[+S(\/l)8;G2L#[BsD_"h.6-;*"Q9)Jf8 %_c7l!<1U?$8/6q$V+A3Re]SLT)P:+M=`R%oV#5$81##<:W"`A;5/A1T"d8K4IZ3/&I5ZjLLAF/CjnDfo0c` %R`&*W\n5Nb9+dcDbLMY@C5S+KE!EWO5)D*i_;hjLWuU2eY?!hJ`9Ta*?kO6k`*(kidfc\DV,nEQd>M`'R6))&.LBkbu676I1Ps^\$*_%7hVNZnC15&24G1cMBFRc)Qo1B+[=JU#3(KQLFDQ+0Vkcn7' %EGj$u5]KTc_Fa9d^)*[PQ*e,<-j*H5H6U0c$Rg-ga-<,K(L-BN/l[WA$)=AHW=TM0\cIZ<-K^Dk6sg86-DVsZn?'Q8&\agS%"qn& %7SP%n[5s("KK#pg+NWOIW4\25u` %#G/_Mgs$(l6iMGQm,O=P8nLKTsnj_,JTT5&Oci=nW`(X'#20iAD7Adn!k#N)(Q#+,N3MTkd'.e$JCJP'3ns %Cs:m(SLF>LJ(59UW<3q6'H,M1"DGXbLO&)YK^B]_Z-=.6N!:W6\p#WfcQ`;>%FbV)F&b?K<(YW2e$S?$Jb<]@gpCf==:5J-g:a$a=jPtNS:HM9-")WoSOH;a_?6/>jaroJro:qqg6+e^`_C>k(X&k2JS;4c)_!Fh^@\oqp %0cNI/mPNlWMs_Dd[`mk8?8ce,"u!a]V+m'qh#Oes-#0"CO5Q];dOBaZRQ(=-XG0BMPial(HqI=r0\ObcM.FAX\8Z=?G8N %^bi$E"r>!k>p.oJN(Vqh;oFi(8scQM+aYXF'DUhI/=NPtPP%cZ(m$*[;sa^$Su6XhSp2cM(jm"T#<.:(j/Z?=SomO&\ft[,1)a9D %s%h7*LN-"*X]m9.iSK!+68Ne='u5?"1%RW4$OI:L01-703QY[Y9U:t_8o(ar\"Cn0L[_o5)cH(/dhR4NB#.>>Je4HSfT;<53jU!S %P)$Sm\mk-.@0o"6ipO.:BtGRZb[=(0St!r05jB\@(!BfUQ+>:[CS&Z#%/l&2j8;HVD8Z;&CJQu:4&Mn@#WW6%pmN^Bjp[YIQ0FMj %X%`7-1LQrIjih^BKO]#`HVki$;ulM8bVSQr7@[!,I+J3`[_X+lpChZi9o5Se)`"%uX]S,N;l-XD]%Wu_fDQ!E[:+9"S:98t2[PHe %Dt:97'+hcs69rj:H^h8'9aLFG!OM(3liONF5hsdQ(\$77LA+R+ICshAR(`Q0TA80ATD,DfXY_fDbV.K[Y5-9.0+dkV>HY!\T)JX6 %gq_lUC,DW:fr)34U58lTC3BUIoSsh&iToE"UD1rg9IHkA*+[Zb:oUTX$XOI"&6$-hn;/9T'-42X=U25Yhp=5*`:9._:;V"h8O.Po %FVr_:B#P/?_Mqe)"L5O`&'6QrnN9]*"gN/YetZX%I*Ej>/&EaD2Dq]_L@;+2UTk],6N`n7&#\p]q6qpcR9>=`8cqW'?O8el@?T$A %/gMo6&4TCB@#bH06LtcNimX1&kq#*"jIjt"7P$I'WB&iD7JYT5I<2t8oX21=jjX`GV49#V\s+VLOAqF[-]J\D#W9A8(@VJkDE\'G9^N1sEj:b>+8haR-8[<6[lN %E9bR(m*S,"M9HohC.&uQU^F:n^fJBIcRTG1,%aQ*=/k\*XTp()i061a`DQeVm]'*)*&3+U%=h)a&f+K_CC,WQ\tkZWHI%UFJ.&"#5gN %d$92=;U%QBS'_9/b>\A\PLWE2](9Z4B/;fQB[P^iV7##?7m+JPf;Y[Kmt[b&m4bB_V,Yb`h4=Lj*pb.V>1aD/<',e?s8PW:G9'>> %>tOYrnfP;fJ3&La7tdCb/!W.7(cd-tFc1GGrV(Mu1aA!o1:n&N>*bF,L51OKk^44WF^J,f8-\_mZEUNHr5r5Yo4m#mE(A$p"??Y\ %!bWPdSu<`T8#F2&:u(uC"$8Y9^+!'A'jagAn]8%lj#2,eLI=9)TY>"@D"hqB/MlF.#nYMmU5aW#k*A@FouT!!UISr4d#m9K=b^^H %GOAQ?3]4qdqR&-B0=lW[UR0YI(@j@1X8>1@$A*[*&U#^P&6>`aiZ1EUNh81*V%&4aD#'mZ'!YrJurS-5KCRd#$8Bfa=e?>_R_!cE"H2&Ic:SoC<# %q[OfQTnp"\rMC7J@*hj0eUpefZVa',_/:pc=!VS_=m%p(:W?3G#U:+_&]qB-N)e))pWsR,U4l:D+_s?I_;1&N%jAJ-$Jh %@u,XUDQ"\ZX;[lOWBGY=[ZfSB,qogl\BeJs,t8@PJ@p\.1mj^K,+4QH7i]G.S@^(nDNL%qnd_@_UX7),Lg!Dr-Q"2 %0ojM37TO[CB]Y3[O_CB^\Q@,B(R?:k02T(F=1^prdBa#*'.A1kR_/:*Z>.M!s*#X&B(6Be0cIi4!B/r.3+4AuD1n6+7qaI`uc^0N%<>H2Y(t@+eHTXmkjQ'@\7LZ!iG>]9G%E?OXNH&A]ae1o!H)N=RPXZ:4_[ %]%hSEQ%?!7DhT?B:[@'Sk*=gGZNsl,T:K]g2@JHqDr@'_cA9p]Hs/pR`mu1g.4(_Z3C;nuge6m%Ip(82CgR@`mV?gcEa&5/4>,/)U4L5hdWf %mR\$TJe[,DkIp6_L$8`g7+h^Y[s1P2]5c\5#l`0.HY3s0@5YtsLnVA2A#tWm!PU1[gEb_E;=criUUgSV)-D3P5g@r8>>OW,& %!eS]9J=do>S?K/[bZ^jG)'1Dmr]4teJ-*%^$YrW36!Q14*!6+aK2Eao87d_%@Pg]S=Y>PgcO5K0mn_EioF!mXG^(&BE.X2*rLcu.g2$"62R+iBI$iWea?uCb2$VD44ALu@AeblL:`;Pum;VD]Lnpc$Dh21V0 %d]hUo^UJU(a\>K06+?RfKno'S'i\0lPrs$fGWF*J?Qkm/-oQH'I?_B[="sK-9$2O@YE'RHX23(3,>Hou=$E0/q[:"/'oNsdnZG'* %Nu`=.1_fr_-IL:2\u$PYq/@h[jhlSTL*\&HjSj^N`?E%V3_pU#[jZjm7CpBh/6?&RJNdMUp.Oo<8&&1M5%4_Ahj*LCE_Rq^;,O*i %'0h'7(20s;5?c+g@7GYb4H'.Qp/m0ahGXF6i!>)lYts9[28n(:7iY&hG7FUs=/#es;sG]+s,A-sB7^a^b\#;H_+5dXrk* %/nnlIQpr:)8rCe>8(J[[cSBMR^ecF&7E4>tCst^qJJ#SaYsT4U)8jCrR%(>CN%.d*DE8)BA6N6\)[XuO3?Ql%C`+"=qV!@kf,rRi %4>b)@N9+TGf:N^-#4GffP"$auW*+XhncVQaR'_RHZjfZ$GS4*]e;=p_p+>uYR@NrSK2`_o)>s](JD0fYjZ6M[C9=<[ZcrQcD-O2? %)^iI9P8._")7id^JZT/mqJobDfVu4_H2ho5[=u%fI+6pm(DV]9HuREnJ0G4n&%Y?7q`9 %Lalk`9h1rnadXqF&e$GJ59,em+#?#UW2?^ol5qThW]=2IC*p+1d]k9sTKkJ]WSg`S+dF^BA][A.dYr(kOLY!lr^)a8@KpA^I/70D/#Ud[D4/aHtQ/R^>k]5^HVKB[#Pmb'C7r%D40k?H7L+n&`BaCM[-qM %VP^kN?0L3RdhTJ#$=o$h/Tmsp3n3QsBp%@l_=^3M8eh7PXHuY3AWfLY=HBu=X%_A&'[50W]Cc$YL36)i"G.`q"RO+_6H'kbXA0NF %+WDlQQ'Q9\0GU2aEW[+%Qc=W_b8HE+)Z)IkKk*X1>k-,aF>f;MOi\5#JWd0UaOuk!2jkO,?>];EUaf73dB0OO*PVV2@A4Hs#1C49 %=VPTY2C!TC:'hrMo"%\]6:0"PqFI.np5&C/4?u6_<&@1MNh\.0A+DC_1L_*C>'-hY<3'$HbFW6sL'lgSft-aVC\k6ld%p %d=XNtJVUb_C-gqO&?d.T%4llX$cO_FkH8#E[_\Hna3g(K[3B=U$j[0I3@qlR=VpP2iFp2ql38D;WB %QU*0'\[EQ;b>"Ei%0a %&/qU()T=s`Z`MDAl/V,,\QM9K"k9DMhJV$GFM"tJ\&[QBmGKeh[J,07N`NXY$?mBrbBW;l;lkAV;U;70CWf+.J<;@0B@qpF=RRQ6G-M=]*[#i//1u)+nk'oc:cJdQ'MN)T.PMhL;?2+6g9u=S5^Bh&8T\q*8/'YRZJ4-eGcVLP!f9/NAP)!;&e]M!+9+!)7DPdWd#h$NZiYM-Z[S?TSBfZp'?/E$gfq(@=cTr^="[+kcSH[%Lui.SSEGQ^Gb_#L&ZM&FGT,(+b!@qf?470nSLE[^neHtBkl;_&bW>>t]_T2=Uc %7+GY=JU@W+P1_Qf6e"a7M*ngtKeFXuX1kIg^Rbe0)X4=sc_;N.:jF4l`+&T!5OYP6fKtj+.=LY$BY0H-dd,qQ6Bcomj_srepWW[=$'a41VN/,I(U$Y!ZHl9K]$r=p9k-fD5Mk!5Zl&,iO1PCJ/Xe2L@a`+ %%s[X#aN,-*NdO7X$g5uG%GJD.Wj,:d,;Ef]RY\HdIr6R(GrEVCA=P$dc1Jj>&iRJhbtaS>!O6&Zk'OF03Eq\Z'cGPbY+ %0:T]8$`;JuDZK:12I'.O]\4\_B*[$Z8`Y+d`tJ@tgcdrSIOeoH$Vmj#Pq$27^qn@]'u0kH98JP&\k@%d<1T"7eD9VdDZZ_O#nX(PGtC>t0Z9^#IfkjC(*uR$T\sbCU8D<'Z\iCNf8X]6G1XZc(UXT8.b1K+/<&i2%Eo`fSVVGSB.O6_ %SSpr'fm#f@kVDJ4.4:t=H5<8%

    DUjG/I%`SU.133j=@H_"<%,+YBS_12j>[`B'>i9]Xe7Qa/lHg&eela^r4?4&ga4F[ %=/*Wr.jYr?mBrXP8<7iQT!XBiJ16kH">\-dL8ED1BMgIf86&V[ %/3Q'([+%[W4<[PTQD/+oo[B$H>iqn`M#T(f=cGJ&2o!gUt#'lD@7E@b&n>IXRESC-gZq<:5K739B"ob>;\8\;_KG51"59?87q;Un4Y*C,50=%oK4XN.RckOuT>+o.Y5& %Q-*3Y<=.VV#_$%NN@J9f=,%L`!;U+,%PS1eKllrYAqF:MU`D`-A8*t:Em9b@gV'kD:m]1i+bP;X;PVbQ7;k@b!5IKum5Z:j<9n^INt[U7"nY@M5;,a)RHHQ'g\`ZiN;*>326q<9S&8d8TQc %F_LSs@bfe"[;0*.JcT&V5^LNYVd7]EfZb-lgd)]LCgLTYF%lm`J9h>R3ntPR)Y7V^6PKpj84T432M[Y=k?mXP6Yu_oeo;K>=\jP< %:TDn4N#1h;fBTKU#7O^e2KDj]K'Al,5']BWY#'o7X]U<@ch`nqp(29?oID2V:8/gUet!1NX]B=\eAXDp\<)1i\Ja8QK%4Ch:Ir(8 %?q;F(3YirqXG8a3.E9oSb/tcGCKd8uQE)(J4MthC3:6H0P1f)q!rSr'gRCDcrI.UY9,TT'k>Bai53C2.g;*CDZJDK:\.j'?EsP'74!;Y%bYAuKuT,Mk;%Yen<'kU=6; %!Am3!N1r.dM9g7G'qk0ba/;Bc=&B3+o6`cobb^.%lHh<>pN/X?.]aKLnDE20[GW/JKOK7T==35&Mo %a`eFN\r,65@QRIa8:mG_2Gr@/8>]UH`l>M>12%nIT"0HGkfRO1R3Uam9!B=K7Pa6?DTs6AllI1i#2D^#SgWY9F_jdA`Ml`li4<#'*a,S_M_GZb%YB]7GLR)n1rB;S8:>#7_Z-toX--:gY+9*1l_ %[PlUA%otiqi0tFAac9%k@'cM-[DbE!n6B8#i??Vsd_]r!N!*b>gSi'EfJGPB6?^rAG,ch?L(^L%+SW]EfqO=o(S_u2_D>?SqY;/: %XZ8f5)hCY9a@ghW#rr3BaMfuie!9?Cg)X];mA&sJEZ>lFFNGC^K!;Cc*uX7BX'N1Zrq4S/*(=JC=O=E53suCO^U]jRP"aXmRG_!8 %7B.W[2!e1#guXj8HL72_H-3/XNHG-OfP9<53gt0oj0S936S[Jq2X5/rQh28N;Taf!'iX?+6>ja*d"(ubkSjB?eE?4AllO.P904Tj %RJ3UV\t.@l%=kkUAg^!.I;g&^LDV>t811tX#6ngaFXJ)8U9m=mKmhn,_*Li\nCW#u*/E>#NL:n5fWhk*F3m68D"CE=YJuR1bssu> %LRZt^e3)cO0\=#hnS;33eZf0KEI-A\k_1oSgLYZFS]Nq_";lhKFU4apE`X%tm,fUM6Bl44;@"bLK&0d7b#dM!njmaNW'< %^%XLSZkZP?r8Y;sB#0VK2&K7^`.8h>`i]Z]&G,"/UG3AOG\X=4gVc/g7;)(7gl8Tup#2/F.YZPo'YH(lIlo<*PCNlUQ7N\E:9gMNd^Z< %H`V\h4feUarr7[r?i;)GXZu:] %-P)euo'"W]ID?jcA+cH%+*HMqeUK_iocO!ZT)[]%7h:9*DIlF3j+Z*gqTiLHO,'q8*d'.W4QkYA%rhh-UB,i%J6;/5'fiU^;=#;_ %V#1\>0`K(CO)\sZZ+6,Q9LMi7ngt@/.1q0Tfo@--,-(e[chgP"do1r\@jb_.kSpL2$)8!N4mesq$-]c\oV\SA* %T(0nPX8d_QX(/CV4EL1&DIpF#Hk]kOLj;X\TE!cR\[IpNRVRS1eOCj^`ba#3bB&`MDp?$3[@ZY"UJ?fY!ubQ^k1q2R?p[=oNE]DH %*fC)ZHj=i(o5D[^VGT:E_K=MV9f0f#lhbcWn/A.O2H;L %*k#7`LCYKZB+MTCs.Bhd>2G6>06$Sko_L3'J"IK=\a>I+R)$^s3jNHN8&?9&eMVPq7:)`UHJ,6]^"aIOfEX8@FnCXX3@K8:_+%#) %hdnJoTs,tA8^cl4h;:n^Po>!LIiac"K_^FCnu"NOm\m)6A3"F>7.j23]g?HJ7U8V;;E9qARM28Eq\ofJ[&SZ(edkR=r"?:1Zk&^>mt.?TGm %&LAe[auk@J99FK&XqqV)%H[#XDCHY%7m=R5[0.$,%@\cb8/YQ&OAg6\s!\E3[#ot[(r@[:allRf##SBDBQYQ@5L].89\"Z:Gkk;TV]U]nZ(=1A:72!T?Ua7\/"'#kq;h`]+F>Jg-#hGREWrE7DrDlB@5nH5\Wq7 %d`N(%Brr'aPLMFn4+mYCdM/TnY],`RhjX$NSIXIkUMk*@nNOUIe]n)p>u#MQae5\+DldGdq``5PIQ`a-'Z0HIN"eA0F$U%oiB016 %@UDja\YXl^2icM+'`Ca=NC$mIH,BpG[\P=IWp=t.$-!MVLpG)\Eflr8S!#ZrQemX0,r`-sJKY:Ai:K_e=AFg^BPUf48L[Z#CUH4P %08d[h[Bo5&R/^[GNk&"N_kXJ3in@6e#IpO56<"@<2CXbe9hHGDNF=A3rcO-7^K+fT*>dE96;K$h&Jd;kW%Is&=RLk%KL^1CSQbFG %B_,YokABaUclqI2neZ;sZ_++n_\Wum*k+FEi$E6NkG%diH%KVAB0;#%Bq`f7<^]K)q.iu>?bVSq-f`5$UFk1@>V^jpQ[N(B'm(S0 %/P?A,>`88EQ7m,bA8tl.ZA+i\@M^Q/.8jmMD,BM.l^-*Y`4l$73jA^gJ"^sLD19\See@r7Qf"(XA)8FYlW%0Ageh0K][Z'B6Z+K6 %--\LdiQ[;8ZENZilZq9im4QEHao\lbp>QQ^frCM7e#qMl:MkN@V[J7-QKJ:Bmhc?pT,_)rd6#XA@GZq4ST--)#SKLgH^nFGe.6iJ %Bh&t][4KWn_qr_;kl-X,I\#&>]c;7-MmDI*?b>KW?Z2@g`j7r01e=]r(a`q?&WLK]er%I9r=piLMS\>T7Oi2nULWn'q>^`;0,H;"MsM]gWa1mKNPl-gEc %RQR!uHk+A>nmk@P97reJ(o_@V1[eHN)OV[,".`)*r6fGTUeF0oAb%Rs^$2LL*>0!Z=4$_]>q!H7Fa@h`%fI``[WIF@1^D>6%MYa^ %P]C=!DKRT!BlM?!#R=H);MQ%nAb;cao=U_jjS:n':pm!sAqE%!BFNHOTLSQiFb0_d6W39>$Q7f7Y@-3mo3M6`/qBimY?b[Z-_Hd* %&V>(F#J %#^sdC&O'WP`U9(4QHnb3D)3Y/gP548:,*aJMGsh%7!k:d12VjWd<;@)S6'+#eM-7SM2rks,ed@uJdfn8!kIY5NA`T=1U*f#KC0R4ri8dnml`o0nS5 %F-lVao*`g,bbJEd4H:sjD=aOGP"M5cSNc0u%`e*+P*k(Kf9aEk)FNFo-f^nkQ:3Q"gfQu*KCgk$A>ClQPYOt(PO^^dp#S4]YA#2h %+02!K$,J5!ro@JFdIB(+Kk^8P6Ip(9\7.`5Wh8M5di;^N,L5>^MY5G2R949Wi-b,P8ZZec"Oj>f-Gs(kJ4`)0d`\rJH&uhHgFdV] %j9i1L%fm_cB3Euoj0C%MgSO>ajL=opPX$SlR9b%`JP,`OZM*PiKk4C].9Tebc`5DNp"<+T2*\FF>\OqdpYWDXWj/W*$B;`$MUL"5!es5/.'[2[]?o!#+Ou$j!4aP'f+Ljr6MXNlglnj+/9mum0/\g(R9F7?5*=PY"$at&1](Zu+ %PF3/D,c5>&_9^FNfNjjS'S:tm\/n9'7On&%6](C1K;n7C%@HG#\4VXfjY"L-iEmrThKqm%N<,$hDQK+_)!lp2OcBQN4">Sn7rG9J.(`VW,DI^(X>akp2jM#/i+?'rX>onde-g0+u`2EUk\ %T2FcuR(fF?oHDCrce(#9YET$Y)38G0VEJ$ekq3Oa,euYRfIIlI+JFE/-Q5EF[UJ(22T3]q#A"iF=X3%;^:d[$E8D!NTqnr1:3oIS %:"IaWduHQ=RFB_MEh@+drCE/Ja21BH:'\j2^oe\:,@*AO:*Zr(*Fg<%]QWMD+DK#B6K3U%2E`7X/'fPDO#VF`XBc-0]4m'PKanK[ %L""^<_`Sh.?q^SnF-,&#cr6<%fQSC&qd*T)ZfI=01ihks2U][^:H$YBePA*OaR$+`8-9)Nfgl3"0\Ju!?a+.M%Q)%5issk]A.9'2 %_j]sT+;'g64hq_p9g53c9*9Y$1+$dd+?5*[0]4!f5/[GV9Wli0OUN=I5YflMZ2mdigp[;qR2im@Hs(Lu#>A`M+pXcQE]47$B$E=V %@%GE)*O)-WkoCn>2&CO'L*h\%J;Yc+HU*_E*;'>;Rb[ajE#S`UJ4$FB$O1ch6l$!JC'm378CgtS@K-7g0D\eIpnO %^U5i1jGOI%&>aREXc?XZ>AgqO?rb"0SB6[;&8:At0NTckiu>,A#n`U%hLT[T(m0TGN[GBtf*'m/Z8GN:W@Z=RTq.nbai)d2`?']iON1js"s0i7:KD?g[.X7$*#;5*XmA%"g*)8H8f&(k_lYEeqO7]Q6W4h+U!c$jj*`\V=Le&Wj>P;oaV\f34b' %"Kgf\kU([8?#C7fjf2GslX$($4A!sT.s`RZO,QXgQZPE'ZU^c\.?`nG`>5lT0A#>&-CZqBD-SmMB$bD!Wjo@aZ"IMDNSA5BWPHDNCiY;S.IeRTYX\'gO+'uk7YCI>=GXEj^]!?AqF82gR'ok6&HU$&j=NHpBqHjuPA %BA20)lMtgn:-f+D7#;Hm`8D*Y.oZn@>Np"uA6-F+![Oj>10^Gs1C+Z++n@nM!6,fd"W`86O;MYW&IX2S51I6k;J#i %:iVK\H@KWe=qZ]`eDR=LEU80sDFV+G3:j+f_8eXO)*<(=N]6)bE<@&Ys8C=u.[iU?WZDX8pT^8-.30A]VRl %DbO9a!44'U0R3X#\>iZU)FcX2(g/R)(W\e<^6g&?RR*5UZ^>C87)'3H@1$lQ=5-]h]Red>TSm!76r6K_JR0l`!a!`'4@BOT,o9T? %_,$dn4XL$1:U)7o+i]R/U_+#Gk)I)l@iFqQ&`?uf@b#m80i1_b$b<(\ODrQYo*27C=,Y`_5bFE%fYfZh&f%"8](S[q)Bk#o^HRX& %MG*a-C6@jca1uBCP+l-#5eLt(26!S2>cLLc0T1WZYgTiV!RO;I..ITJgVr&T0$:=re;NG#0op%3S@!#(XUdT58c)KR$u'74db5bZ %jD6DVa-k:7EN6;m<[YD^NNM.F7gL?*)2?\3t %%[br_V`7G2jZNT3(I;Ec-[t6+@*1L1V*-:43VhrjC_VFA:8\G?p3_*X7oJ'^ %ER`GK%?3%K2CC9+Z9SU]D5\Ujh()Hc?uV7Mk[B1]1o!,h;MrGo[(OdK6rEUUC`kLQ+K_&?LD44u)@b0RAW/oY>'Cq7R&@I4:JQgj %/)$/h"H+6X2W%mEMK?)EAV^]jh=)PUb@_%UTP_eekrqHV;$WYG":fqM4)FP@!S1kfS75DRT/niVf"ppAl2i7sC]FXaODMA(CpoT'5!K^X&L8+nQeBu/nE6_oAY4;ufu1=*6l`!HA,OF1B:'8:>TD"se/NfL:/,`GM#AJ0X,GGc%Y`s;j` %*^uS2?ie]FW1`(>TdU@19D4,M`EI;a(rCBcfB+e`EXD*&FKGiV(=fgI/':tuN2lbgZW*?"]#F#J5asRu*755PW.W)?lp5dSL\9sG %MP*3*"1(AlCs/L!%6[>?/NC6"b(O.V:!SBt9NEnl$t6aE2V6_!NIrFq($YR,&Y$]9qOMfh5XZDe&S@J@O>V]2N$$joeg`Y*YM^ %>\g>@$e3,eW!721!k5cADW<$RZ)s@r.n]qSg[pft*cEWg'&-O_&6DDtFCVE5e_)Xl`\g*DP9\B5%Vp]g<3Sfi?W.U+I(;!kE5el# %SFdk!qpA.5-B#"9iIp/K.N9Jg-EDk[O;>">4JmSSuBRYM)s9D;)MOVQlY$ %b[$E`9HHC[(jsanG7@JmWMt=H6AU"#Gti"UQ"tJ%DCLn0%,L<(Q?OD0$Qu4<,;A#.P,r]01YHhU:1J!9JF1bm'PEdIX0Z/5-n5We %Z4`lYMF3pgce1"u4\_,NSP)O)/!'-;QJ--^W&&<6Y=ia6G>W@m=(,rV,/e6kn)ZsGRYOG*&+d$7@L-d%KPP&2B_"8"S#$+AqslmL %A4:bLZS8HLU/MC`RVfN;+UWTLF5\FuUIcW]/UD>&GeKc$ml)T!eWg/9@bCJh7prDdCN)[>!WY8pSs8ViVkE0Dl:?ZN#t)M3;Yk22 %CkVd0,*eW"(hCK@o2iE:Hu.)#'b6JWjEKpX5X6P?,%G9#.kD"R3]>!`U7F7Y0L>k=.-Cp(K^q;Nh"MWe7?01(23);`Kka2q %:(c\p:p5o_b5*CGq4X!+Gm9U?9=XB#i0\I5$q:cXe]e]+S%s7Fc-bP$==5?[Y!V'ZV@_N85/cRBUDoHe5;1Q,6LkC. %@UUVec(-_HWi;m?or#+Dk%&oAYqN4Pf=)0^.sQ+VRqZV1dJtdUOsmIY6^DFIJM:b+_.ad4LC=pe]#MmV,r[GDkUsc7]rYG!"&UG` %c/u.kLu$oka,Y;Hqmh_jX58&ZD>:QI)/eT?/K;1-rRQPhSUbSS5iD>>bW4X6T!hfto+g$2UUDIg;q.#5]2f/4N6=2ek2Wq?h %mV6&C=LaLg<.)eeI7'WBm+PRI)gFJ,A#?7I)PVAlhK^AeRumS(`_N![oj=%_`Mum`!khO%L^3-%5X]L6D&USXC5.,\>2Xf)30FY) %o%;-T"fjUWDmpQ2OBV_FFR=-Ihg#GW6mKX?A](,r"U[7&)K[#)@%3S/0=/c^Z2N8V;3=gp(mPE;n)hcMs40p(K^?E0aWn@:L@0hlZis38rT)(B7(L`'-) %;2Za)Erf$W4t;OBU*8&)8*Pi!n>/U&oaiP)`,!ZjOp2(qTK=ll)$`2u%o`N.2FHqY='r@Zm,So%Y.\G`cjPk?IgZR.8Zbt8E9$6N %&:fLK=BFetMI+D^)S0:X`%9=s8ST8-UK,7&D4hM*HcQkUc&7Y8RN&";D[eP5>lD'ZCDHY"EoAITn''\9.e#?Bfj#b0*-:n]c3i>M5C%GM&C0+_@Q: %3FQ0Z>L68/HF^R2BVP8Q;J=KV71.%6<,M+t^s+d>9$l04UFL_Oe,cr[9$162bn.otQ+q6P9X8[LX.DlBaquS]fM-'ce+$E&6L5!$ %Va[MF<_u\m^qu5M8lR#NXGF/%@c+Rl;:1R*af//=K-O@UM>Udn>\elJcbn2C@eG^J*0a8X0McNFH#ZJ'A21[Vn$P,f[86sZERXI_ % %AY02*I4>e&KIipt!*YlWq6e)?-U1d+h"d>)*O@R=P)Y=M,%Vooe^]P^oQEROf+^de6/V@NUiq5W1n3t&$ %Ha>8q.3D&80>3;q,&@#>V7_@Xm>P_[\=PPeL6lK'?Tp#%qEn3-$hXR4Phf?0-EP]HV.q8K.hR?O!6*^3C^)m9$e`sS&5f2HN'$V) %7H@W?'i/*CQ3[$)_h;Tj[G4OG8d;4,0B%m]GK8qP8.iune[Q&Bmn_uAj4p&OauWG$kC/u)N7qcKCkT>dBSk?9f!79o*TXWQi%MVV %WUYhRpaEm'I6S>9c$`,'HOqjlT\)UL''jg:.Z62;$m2%icd=GQP9Lm"#45fo*9Y"i4qDKmmU:/J_3p4M5mr7ooA+q!`Hjo^qt:&"\7<<@<:Sf^;a@?adQ- %Ha*7Tok$u!JR_32T6'YceQ4r'NRT1cS9:](n3K9Ze^]#pV<7$bL:urRLE4"fN3i@,WuF%ujRpQS>r"#o)6m_"??k/W6O[>?6Njq_ %cbHE8]T7&]qDh'LGm+.#J+3*J=']tHi2Je>Sp82YbN&kqfj9L%M9^Q]=6E6EGNJ@)pVahNNVrrLY?>#nX/=FD#8rS$#`m]19.CYe^649,%Zku-Dd>)RU7Q*,8mH_5HL45W)c]&OYE>^TlTQN&J(4T"meT)Rf75Br5niEH'*a$'=qc[,5;\&,PemG*magiV#O+8+R(Id+&$G+\E$T6]Z1 %=.ap<0DVI4Y]K@q5P'c%SpIJeaY.eZBb,L+MdGrEku7(5OtY#KXX2/g?63:A^A'Xh!b$$?g@PI;ag4ST=Qo+8ucL=;iSJ*b2<4lsg>m=PAD0B<)Dl[uBhg'p8d=o+:flRT]$s6Fi@52u*. %II,AV-,%l2X"BMVqP_G!qNp1Y %:HM:O90N'E#N%bKm1\pI7mHs,Vd/iOr>*KA:;>udSG')bPtR[5DS+L!DnQi-a15SJ[a9>^"kgnE7"i%kO&$;J/eNl5Pp4sI-A94ppnF/E/W=lg\X24YtobkZ2<=nM1&%N\`gnO %b-kHTr]0jYDghZ#IJT-Lq=D)OoZ4bCs8.g@q8T="4J++!.'^N[Hkr2^jor\pI\q;tKQj1A[iPR$#aZiA+s2n\X*O2'bA %)*taDpI2]\md.R'SpfW\5P3WuDnc$WmsFZtNc)RsDgUu7^YiaBHJ69_puYe$Xj\>5jkcj.g#i[5Em",@kCp42`*`Pa$[+I) %::L,-QbDs&T!`e;Q<`_cpV5]bf,ef+p7LsShta1roLjFQ9"kM!+cclX'CoF8+ubr7&4Tm:YVprl#hJ\EP-,qN.WQm'"(qkFQh8^@,I<=RUP+ %V/LbYYJ9G(Yg750I+.P4A@46Xqr)btb`s.)`PDdas.WkLrMs<'j6%N>kKj1_QVIL#YK+CEQErT?Cnj0Kf4IP@;jN441bVY/UQ^$Y?=Xm]Rt^Z\aKlh>ko%55HlHUm,-:\Kcl]`%I6bK4+9pHR-9qVcY5 %k)!`R:[@3Ci$5VtIcbQtD/XjF]?bcYn%@i>s7=c:qk4T5rbq*Tff+EX[nd\7cD*>sp-6oln];=?YFkjBjXWFY)/oKSm27j4k3q1! %\E1BkoUmSFlF6f[I=M1gQ_1qBB\dY-^?*XaR16b)4nVO!`<1Se"7LKNdJ5<)g[SACr]ef;DZ8EUrml.Vqeit0V/QC?^]!(4^Zg$m %L\YL#516p3HB7k1?7kJee,-oUoDeC9:IEsDbZCLKL?MC$%IH3caH0sXQN5ihlbQ$A[*oX9Z0`Cloc[G]JIYscI %5JHIH:(3W`/m#^PpHJLX\^i/.qTVg'NK*CSfF-U4JUdXmIoq-Xdg#i;)_TRJgnTW"KD;#[qisD-;rd"9]`5)m?>OuapH@s;J,V15 %e8!lccd2XT[(ibEe/s/7;kO'Y]3]O*1t'ulGXr)-rk8&dPDSsk+8Rh/QB/]UQ`de'e,u<>cG07`?L-`LrS;Djo^T2,me-A, %^\?VLs7q_gl_Xn]e,#s;ETmS8f@ag!ahG:R'41F2rur-RlaK%?4Dhdt,CYZfA,YTNmsjLp-YtHIcVr]mrmceu07WcF$cY/5Hi*h_ %@/X9dEQ7ejm'L2QhrW9&]^p(:NIC5in,A"SGI'g7(]SB>](tstp/g^1q/p?9U:];=hYK133IgBk?[:lQpT*b-Qg^cM55N %QTVL3KcdJn`HQh(F7R?-%&;gP)h-h"T,uUqq/[YT_!h9^P928ikKISPrU2p;9BM6*P.?4gG@0s&^?(q&??(AeS7r#kXDD*Ih4OT6 %]3]XaS*f,'0`B#3bWc#M^]3",GPP_B^Yp1T>$^H8s7EI\?TrYN44YWhKJd9:Zj/bRjOHch57X5Oa'\A>J#&;-k)]K:lQ4(c5reE* %GCB7-2_Y1+jPU!b)kM8Adqd?jI,_?dnr.Y0"8gqrci=!UoT/Efm_c5Xm)c$s*p_k1-a.]?)Xc((qi9jDm84r#ZQ%N-q,8C7j#90b %@B8GHX;g%_cZ&Q/s6,fQ0/g"\4o!H\5-Q\Fe(Yp(p6[6-`5rCBNH*R*^$muVKDtd=J,eVsdjO:\I-GSLrFa]aFn;Lqr5ZSKX<51J %.;.Q-)f5'"r2II2h3[THQN-FP_CJD%Hf/UrM5>tkk%W.fi`/o>4C.iap\ZhLn;mP4X08:Zp.djMgp_aj'C48]q,@=_qlb>4rDns, %>(#h2a*#,e%=t\i&BNmmi0k^m4GMeg*Pq\poFGU?a\jbs6S?UI-=jX %gdaKc),Ied)OB7"%mTbJ0D_ZG*^=Ec=jMB=DpgE?e6fud.:RATqpE1JHQW+F`l1.8(N4]@\Yi^-_V`0GnX4n'UL3g'4_;h)j)9>= %PP4E/YJiSNs,TA875',8O'OkAN75!/Q,!)R?0a(3HmuR%PoNJ/_G3P!)plgc??gNsuI-WT74QZ"O=69O,bE)\b>Aj@I[KQ#;mWHj)nI(q7q818K[WATs %k)4,gn_/'(6bMkDhnJqN=7>IspX,;U/pmSerq%FN$ia-II*:"-GKMAt55T3<^XPlp(I-00P%+e1':!ieEf4oJtNp]1@Im9:t^; %07No\Is=)o6]ZQ2#+k!=&6:`h9uNT#BcFA:_X%f+;cPc %)F1=DPV<@m-B]np'bN.('N>KK>Uh.h`MEWfR#kkZ'LGo7h\=0,,+prUnr'VeWn'!HNB!/`4q2]]0CM*23@69n %s1l(PB:W=M>;5QTAa@+UhR2aQgU]u0(2qP1hY"]pQZFZ!2u*5P[p;p6ZCUmKH.U9NB856U\kNPsfS-D=Q<.k/g2;8^tP@TmueUoB(+HfB#,muTQoC;2btB>:?g'oN,'M? %o'H:tW(m4Se!AA/]RAo.ZV0^:*'a+]/[iX,YFt;XORtf$$:T %oNd0ecYTmCriQbQW9;36]sUS_p2>EQf'[qOM%/'1]rHSHiP])Xc*442Q_=Em7/,(ab7!=dgOd!=E8'!c-,bfW#n-NGmE]Bf5/onrU/\n`q-+84o_f: %;_C/HUhc@Be_=G>i:#G!mC0^6H"b7PLRRf2hnO9G@.H,>F)/t5YLbsdlaU/j=M;[;ZubV_%;\e9"0T@Hb33.X43]Q./RDeu`adKl %k58*3J,aoUBkR)V2.`p.bkX?oD?"/.X"2b>bKBS(MV1,+O7(S@rQS81F=uu"poFfqHo%(`[iUu?G>@lRk7517o$)A2>diqhSHk&? %33[&9f/n0=d_:0?L5bS)1\"1W4JDPV9P[W^?0L#@e_4RFc(-Y'mR'c%I;RM))o(')q7c4L])3r9:qE;h_9k1t#_D6`-ZN/bW(kWE$q*Vas2]NR,(msfW5Wb(p` %.KW,10Q,;83tIlNl`]clG\c/hgE(kAj3Kr9AaZdsDV06gZ41B"h[s.@2S]"+MKN:nfY6>;48\3'I=E)Qf3;H`f>Cd?mG#$sa6n?\ %^>HSN^qnAMm[Ynn0]gK37Z1]OWOf09('q53)j\TYYJn,3*q3_WfVkoo6"+*d0ZpZT]r_/P1q %I_'ajh=1?MH,i7r2,CFUWTrugQ8`F:c>mlmo\iTr2k"s)pX%":_/VGT_4%!pcbn%22Q_&oY2Augo?AjOnlW?PJSjl25<.7V\kH?) %fh^-YRWj8XgnZ`IF73ZJf5CVf5&C8M(%[/kqlaMqDLZrL:\J5SY$ZS:q3aNUF87&]\,M0k=OFPNb;\RC3RaRt*-:*2-0p#[Y./u) %4,YFkOI]"S6gfDG_a06N,ItPG]Q2EL\g0B8D1DA6Dh%;@]PRV.orlT3E3>\DlOW/QH$&.DnZmR)5'q@uNIu!:Ap2qC;]gF7j/sK7 %k9&?iFkuAEgt5^1#HFqtqXF&OGPnDQnb[5_XBmr;@_WRLSVh:1]COep5MZ+qNO/(tCg?l._HS\\e$`(r*Re`@XCkUQh"d^mgAX7i %2netNUU./6psdFu&jcO:*dR.jc+B#.D$Te&gA9L7Y<4`/MZ3!IoI./[i6"-RIe2SOh]Bnop6gp07k9lgEr2.#3Z\^mHq_Q]f?A[* %XcL3O^AE\um_HP"]?H:^jblpi4)Je>c(P^!D,,#:2#"!$f7(;Vql\c4n(kIfFi3.QrpP("g:m7'cTYV0ne:Vl:De3)M(Kmuo%1X# %]&]mEO">SDSI[p`Cr<,'^\[er?/L(FGQ7XE(#O>q_#D#o^,9j)I/O<=]^bQU8+4.Unj2),DKVaARu[He:;1T%_P\/6s2)s_]k)AO %GitAE>Ka3%>;guAn^A"M^[^md:G8/$l_]O!0'R]1iJ!O:F8T`8/fB*![?IKEE:`Jg(-V9eM_Dj9l>*T:?@'mZfj',H)jmPi;Bn+k$B:RMQESRs#VVQLGoU@@9dr2g;g>m%h%.)[C[$p$(KFj2&a45:ueEMoJ.pZeXdHU95VoF4?5a&n8 %$h:#5#5:JA.Df[mfD&I3AtritI-/UXI&gECB^KLmeR6MNT+W*'t`9bk9&q!(&2O %SdL/W,77BR$@E&'`WkD2!4/-,bGKjI8u/"Cg(QQBi^fTRr4LoF#neBqMZYaRE>2ueG:g0]Oq'kO6 %S;]1RjJS@J5h4*\B'CNY"Qb7Zl9D#]!TcZ-Bb8$lq-_(J5&T:f`Ek*CAAV-)'`^W58Xru4#aMlT1E!5q8[6^&0`a*fOR5adLVrYI %7"E8D,0.%^&EV4s.@Z)+MTQo1RM=:Q9&t/`=KjGhhiY3#AD+sh8=qO8&TO[7d#k\X,3g*#"IalqLM.q%GHo(!qP!OUnB:XOP2iiQ %/+]/sclEV+[?RI%j93[/@1o>/7U7:G9n*XUbe:Nj&3``dI@PG1_"YjTsbVpkWS81Q*IgLO!fTMaMP=9,57o8/4 %Nb73Q4qj9^$^i<[(Psa$$LuhZR:f[T7laj!-;eeNo>7dIP4cINY0*TqsSsAl-@GcsV6[Pa",gfd'1k %>&Q#jjuCX/9?q,TE'(V#k[Z.oB%inY":J21O,$?r%X&^DE&'/18*!8Z#9nehK&Oq3E`3i?O$9[^F[WE89nZ.`NLiq)L$cqkAEA_i %SZlXVJbY<4*i;t6g*RH_9d0^K7+mf>O0p7SA[s9RQO*S&9oHq<9LT[BAAW7]B)*uaDOT4#FZKWN4&_."((-.0bLGceFPO;-q>)<* %!M6idrDNF;R!9_FM6'!p@L:M@P'3+$&46:<8r>hVoOX%LVEW>'&7Yp0'gM.iZ5Bh2':0M+f!N3E'a98,9(4.'WfoIhr<&bEESTOT %A5dD!KDZ^S]@X2Lq0*EjEZja\HDdCF7IssQ5d;LJ.Oj><7j<#`@<=KeGZOAo@6t;7+lNHUN)2,1Wm]m,NqXkd&D2]mZ@d!N=0nTcV$DL#agZq*>e)P3nmU1*sJK>BH!?cf)\aXO/:+V#0'6, %M[:^i-I;XM/pDtTru9CZoe,g %.4b=b_qeFeEc/q8I,`B/K+9\b]Z2n]of;YMqT\^g7nhMh>Mk],h@E`\=d&'R$5d'r,>j2Tt>U[MVS;7PQ(S,45_'.8g0 %G3NGdmmYifY7SiuYcHsK:$i=Bs8+LAkVf0l0Dt`E6&p6/q,mg3((.f<">@\Xk:jto0C3%E-ldSi*rP?ZWViag(H@,c?WmdXP3_aqK_ki]`Dn]N7+amRR4)CNiV&+e0^CQ37$eZ1 %#^`.[5I/2fKo794kfE-QqNAu5CMr%G=if3NVcPI`9`@5Y@<[`EC3=FGWGuL=`F<3WO@_'dP1du&/N\fSmIc%ctmG$sH %oIl3+_,Yj*/JlR%rLWh^\bZ1SlqbY\%&kq)<=QKKNXiTCYO#t@rp\(sa'QZpQTn=aE;0:(o&h;PmVZqABL;DsO"j!ON5kkg+.jma %eh3#2h;#[2WpI4O'oB/.$"Rmom]/[Wa>kA"'"(Gl_))kgs2s?DmKDLub\-R[ZO2>o<@2!2r,L<%&/\ %^9@@J$Mq??`sgG-bI`!A*q&\P+;^Y6[Sd^h)t#blE;=k*c!(tc9TtLJVGX7oZS*=/W;'B]dsW)FlLW[V'Q3imI.q1,FoLI$g:-,$ %f)e]qrj/Hhm<9ol\h)Rd]QZC4o^Uu)gj#DQdJ^YU[AMgDI9,pSm[&YB/pV/ToTeQ2b;O?L3&"HW:p=c,# %:T!*RJTosp[6R8YQn\9co*T+oYdrhG]l0@rfDiDK]2t%LGFa!G"*Y9==7i#3hp":lNA'`LqK$V2X#n>SRed#jQB:M3H %hQ)YiN.-P"qtS9WjSQ]=N>c6bM@UdsT=T"(IFi.#h>'"eAif;R[CC)FSV>'`r5>LSC"//kkq*hCI;bT85TBXVBfDK,^4I9`'/T%l %P4O%`di@FlktA&n!F+%A[MsSZ'>5_e3DZ:BG[dAu$e204]:+5_D#'r.R(7t/29CIB4&;5gDLm+dkuCXij/@3LQ^u=7:0>,@qst8N %^'gODf(S`\jOIk"*kN=LDRlf%Rqhc2#NaPV2`Qk).I^2@s1GRi:_LfR0%:Vkp=RZG(6h]pWn7<8*Uc$B.o\)YAi+% %dO.Yj:N_gOS2u#98$=N@oM?&TmoX6>d#%4>^UFs7q0fI!JC1D^4S8$N#;:TV67T=D;1@U"*:$@+n+]CkV0 %[A&odNHb&PWNH)Wk10%ah4J@,E9G$kQc^_'Vj4I\mKHdg$`D6fAPG%3E?FqG[tTL^X1gTe(uZ]f&u+n\h\#$I'<$mV5f1t8oC.m!aG$H&WI3^$ftuZ1*q3j@8p\gMSmAYm:+Z4+\>kb1kC1D0B0LAlBO\O %b#Q8e#QdgC,\T;I[*oX"gGJYnNg=^[\7T]Xe.skGTL)U*)%_3\(G'!m'bZ-eS^'=pIKpqUg`rI,Tp%eC0(Q-P#01!)UaWH %aG$l+("IW+69dc)LuVMN5"H;WIGCV#Tc(dg,f35!cq=O=O.U/f5U.ih"C+=X!Ic(sUTW*;3WO[kSlB)AIUC0/,Z`H%*TnbL*.I,0 %!K6Or*fEX2V1d7sT$$]%n9]jl"u6e-#;3l>oIeQ@9LVR*@0WIN"^u%FFeM@CObPd4TN(\4Lj_V%3164./6EFU-V.FH7[.7hcPO,A %p&("H2$c2EX%8ZBKLlij(Ye\BqKrY;=&2(!*[?$)B;5poYac_65[_!_-ok6eGsUSG!ob@N]aS:6RWrjK"9,;=!NV=M.V5(PY!RbM %c4l,8h?1_:7UH./'kZGk;HD,p2(B^orCQ2i9+T*,n#.#6<\3u'kg=>c_B]pF,%N%Q"c*^GL57mhcJkeSR.VY'$\t"aBW=e/12S9\ %mXP^6Ji\^i[N"]c^1X-+XMKh2iAukI$J8\q8M;J7f16*$/Yehm$L*Gb-tW]!0f1fn.\;o-E>Ai<"84U=@CE.0[LFtZRV5@#uplF[E'sVCfN.BFBd>u/Bg8c %%9.X%Z/5/lZ-*;rD7*fb,SIY$(GHlS_"UB('Ar#Lg']ahcq8gsQ#He-"3kIO'tCh__f/7ID(j4pFhNp&8bJ.dk/i#Pjo?;d0Q8eh %Csu!uYA\&3-k5bn%(.0IbsCt=T!'>nH`$iPGf;tC$=K8TLcAH;4(d<9o]fgA"b@WF/tWLAKS0RjdtlD5:gpYC8Djk=!^7H"8tfZa %oMn:3&;2;)$hj^QRaBhnLMEP0]Y8E\lc,*g9PruG0n](j;f?;WLq`G("W?OM/>'0oqCK\.:rZ&UUBopi#=:ZX+`]/<$f+VZJs]CU %eX&uJ%2-NsFkkCR_V",U;Emf"d1%<^52#3,,@1[u/:40=#XF976I8bE4[pQ?*/-_:+Vk8B9>XYjBKDRB3/SSLRcq*n`[XN9$qUA_ %YWnokC-e^J72S<=OHikAPQet(>%l4I>iEgM?YBk`$Gn^d3L`*hQ$8>t899<9C8W7C] %LCUj)C.,6UPS,AqalK9&*Gk)0-YYCcj-jE<>C4LO3hMcEa#:R3XV-,`td'cbZ+Fh %0\!4"P3p'3UD&o"f%DmeU2rSHV=k:ihTej:W3-8,?\qcO($3CG!&"u`MrG`G1lUh!0!M"daL*$]eh1Z&[Sfu;YVB*29u(?f.n>>F %)(;3E#`;CO"Hap4IMd(3phL'7Qb_)^)4K>6]SJu&6Yr*7/jj)5ZG1s,fG0i-0YAN:=>B"(YlnhB8d %&:Z1X#]#BbDNgFq01Z4]NT;4i,0rA/plXB5`=dSa8ph]@*-EuEr,q3.4+4(KaOKLP#4B94O;g[ko:FbMf[QsWB`?!_?Kps.[G*6E4\!BnGU[@DY&+9S7t6THkFkVK25lPQAWO;c[Y%G?Ar %^b]oQJligV,c7Qd/Ttne8,.PY+DJ,.5BDk>;>g?=_8;2ZSX_)XcX%QgkV,(_ltVoAPJh:?K?0b %k--O=4OP&B,SRHPqgc3PB-F7[%\c_S8rKPUjV+SGp)0Z08ald3Nu'Wg$mZ\!2."0Bi2@d %"pb:=h,:S]kO+5Za1Q3]3@mG,&0Lfs1#q&)F;Qe\4L*>K1cb&k'8L#/4f(=nRs@pEW@5P+?TfTPFF0I>KK,A032GWaF&H0(3AZ.Q %Me!-"13:.!EoLYFl.UY"Re1&H^?fT*pj4r]GU.-C-armEk%0+n/9P6u6o2su5I-Jei3I6AP/UIT](Elies[&uI`?AkRRCi.=:X7f %4,uZ;:I+s]2^6\Og+Fi?l3Bl7+r#g/mcjClnepqAdHAUmd\C%DH9QY-;=)H7,"B_;'-3V_E*h^@J<6O=*!fp1,m"=kNd)l.RITC+ %=8$gu/YZ9sDZPT9bu)I%Ai*+J)+%O%7)qFY3*%:gjr"g6hR]/<)i83:S<<&NB#ZWFn0(m$VkGC$l'H*Wq0[:)Ne0P*$C;gSSgs4^ %7h2&!-mpj^k'(r"-)']kQ>N%X0s9.E5bb@K)F(4;.OsPNA8A`BgHFcklK_S"HnTX`EY.dXbL!\;/_3CNZ*d=QcTif]1Ms'U3lU$q %<)Me'`t??qC>B")X3G^[@fohHBi&;/KWoG#ag3r>I;XP)/;o6;l+ZatV?c3k0aH1[DF)O+-0KqqUeX/XiQ4guM*-V;":+8!qYOgR %KqF-e@`jss6;2)NCb:W(Cb6DY>>((1W[102FMU?Yoq8P5j&suk\/*Ed'1,cjfQ;D/<`/XCl0?8$J.5meAf'%1`f6',Etk%&n)7;I %M2%)12sk7h27Wut`$>PC"Z+[]]6SXAHqu;/#=4/9-kh$-ErDU?A8+K_r\o^F8Mi=/Z!&-:@[:abqC4t?<4El3ne:rYXb^Koc!KsZ %+HkiA>\+'55NMZL&m<3*5Q2MZZbL1e3`:mfc`<(29DDS<4S"+%/ug<%Fa/2%g>U+A8);H2O'L[#3pVI:mq\a1Uh?;rpj3(V+%FIT %4tu*e9o^Up5)"@M59>P'=h]YYJtRNt[mC+7oj>2,BMs$P;dM0Bf;=aS)*RtNp0alsD7c)k",j@4q+XU\mT8f"bBlsqCDmKkrR*24 %s/C,=qNtd`+5Rc:Bc#V$jF*B+#V,Vm+_#E#2NKlDbEr!k;ZRdYnB`ZnLDC6sqR]'r:B0qsH""=W6Wg&L=e1EWHr;U_[RVlopUO.T %_B7+jG"ubQb0duMbF;g\H;a'Eq=Oa,2Z!qUEph=g?nd3f]YfnKYGWk-DVOb5?+HY;c#pAU[MBs`Y<;H-$YM*%[D,XRP>ZW"K3&nu,R6.(EljRo %bO*&_qaX>H4bjblEW4f`/RLV]c8[W2S5[eTX*^AonUeC)=ci'sf5FLLB@smBR)r)C41R8AaYE!JdC<=']]le(nY0NI&-S* %/uKk#jm3p.]YbGlgS9^0h>-DkKn#hZH/d?:f=ZE8TuZpU5PjN#`Im`LF>63tGj(Q2$LJ)J;>"4:ca#t>^>H;KCNZN=T/<+/[p\$p %Y?0PhGg4eAc+@>$b1B5:?H3kbI:M*V1[gbeJg.N*4LTPr!fEj1Y^FWa6G]Q[^YdLER[a%hs-AmihTa"Z'abrd?Ztgp?glgYn_GQQ %kbms]9jbVV9s;Db7L"@WC.dO*`4K7NFKX:Uh3Xlb %e8(@eV=`)P2Tp<<;#gGgT^FTbM(bJ=c\(hD%9Y$i?Ha+H&8-7=]q9A$Gk6ZPI=oD)$VN2$?U!29Dk=3g9AHd/CS%uuU1<'B0(J=a %ceW3Eo;iRloX``Rq7WEG_8*g1<5W&Ma)jGo[,0JojPB\k52/ot=ooTAp;LHoT:+"fp!sX/\GFL[VHKmpj*HjKbOp`ehm7'&@DlBh %.,n%cFt*>Lq/,*M-amV)^H:2qKZA7#Y9VP>YHkD5)eKdr('iOZ=[(P5\Qsj)OI%OoqqJN&AT>(KT:RltB)r0_f0/Y$1#;Q37GS;f %cgQ'u@FUcM_XH?n.nB/VnjOPnET?5m2]((\o>Y!.%iO&B7c@66n:1JSh#(u/H3<-,04%hb04M-0\!c2:l.YQ.-D/Q/"2tZ(YF.Rt %o_@`ZpocA;#`du*]E%![$9\h=ObI(O%G[SNOZ=6M:Z %^%TV.9L_2@p50@jM3^*P=&8NAS?[UZHM(il]U]NQ))_h %X4BJb[nrH5Yf;f!&EIp"3r43JebMo(T@gC>o8!/XjrQ9%Vg5'%/;9L!d,,r$RU>mr/2g:BI-n33LWlN=pNptYh789\_g=?'fB(_a %;1sA"i\oZfeV5_;O52H"bC<:-HbX7=o-N#>LU!^gqukWZ1)d+TqWnFXj>"Imr`(N4d49YGcfD"$[DO&Vg8Lu2E7mNHDbJ\`ZO:E+ %)O4HMBABudcjuCJqq']2E7+'@d8RPqoaghhrS,'anF=?*T!IF4On`g@jm"Ci]&VSoaN)k;hn1ol(G.iA`R[]cV:Y^m*j3i^\'o!& %o)fnEo1N#&C3jL^];%5\5K26okAKWk.(X`LrSTA$a>Z:CVG,pRfA)DsMqE3ro4(D!0\PU^7[_;_5 %%@-Tfe%td^q>*pAftV=o]%+urRTV('T!'3E4S@9[m<`$fU%j)c4"i]Ml*B8r%n7(MC;2:^4h#gX40)Gd?6e(6mshWSf:IEfp[?kC %j,4W[Y&Al[M7!8j]F*IVPAGJ#[88IH5?G %QDuk!#Lj6c5II26E5-:u,6r=*cYmZAArF.j(c/P5XD!@rc@QQt,";F&D(>$33bid>NK6;URPNMk\G10!RjZ+tW7>nP1BjFg%37q$BF[6B9UD&nnQqmQG)1fX=o/ %.o!m6('gui?6FBZ7N):.pDSB+iCS.q@c/sX<*aLK'1afZ'F"?@)YN4$obctQ>eSc'lj$tmX?W?96A0)cE'7H?>d]Ca&u9LSd#'?p %dj3$If1Fn(PZX)2J4!QfQj[1G^6>;2ES_T$=q@ZDWk^[?"IG+8XdCOcdu5j+kEmjoU^9UDh#(=AT"+0PK*E<,RiIOWNWJR %+ATh;7W9*A+q]OopPg&R$RE$r-QpWo"$mK*`S>sR0*(DSD4mInFXP2+RrKuZp0dr=$FhX&""gNbTZOa#^5SdD+rjXI"S<##Jip'I %#4r3%)890pEeXoqf?_m6eSJfI'QjNIrsH1TnWuoP$A::h,"oWcpj?pJ>@%%Y5uU*YmgV$J23L*lirO2C86tJ"!@PGaI,J([!ZhN@ %+NT?uji]tD_p*HF@hBnU:;[JD-Od4kAGs/L%bi">:h6O"/mr-/iPr60Kb6!TMZ6+AUqg^ibL$ZHV?@F@%&W/K,7+dDQI2'hQ`5RZ %i"m\/&ocK&HuCY,JQgiO9*V`#BP0+i3-j6,J>;,p&-^$0`_t\P-o/5-INX[r%A*tbW_2$> %Rc=aM5[$Ii\qpUBB]%/:8g4)V2bmC.=eEl$5o0\DJ`gtXVdl,j!>CQ'PJm\0LeAG#I@QAVF1?QDY%>i^dPJ<3,miKrYT^nd!#]to %qn+VA+t&?cN,/n8ieLh$5k[/?&'sGJOjtT>h/tU1ds#)S[gE9@%877qIOAHVc9Z=E%.CFd(Bs+rkDX4>#l'jB$9V]9#=%Z\LfZKO %A7a"d?ka`>A*L04TLPW765Z7*QQq73-%&I5sh+;"sc %7%Q?&g`'a4PZpki$^uiIaN?pm8MG?rWMKWIMdhP;d\%LHic3SsAO^[l6'=k4]FGFoeWYQc;'oFS!U@#m\l_W0Djt0W@N-QopnJC$ %k0WI23bKI*HCF``I>%d>D=PM`?S#+[2TSEChuI %K$-!:cXE#pH*Al_G*FDN$1TkSni)UU#ZtJ$G-N2U>Mq2EM$"2T$UZ5Zc^G&;_8>OIeaIr5u81U %$IlJ[FoZ^:L6!bK2s',*m_c69'<,@;ZN;=*l]j39Unih[J]X&CA^+:EtKJcYCD(8iV?f+Gu\ %a8iW!;4[nT(L+rddZKpdfTQ18qoeYl!*H?jE&>KGk"EK^%DRu)E8WSc8B`ANRHacoj=j80SADV\qIUaV9L$B\@L4r:'PC5<'WKrG %kt$GD&k=l\_V.`S69H"qm117Q^6@gI.0SP2^EK[mJp8Lq=P+Ap#+nKrETlV8+H(-S8g$8/CPF+sU33aMj9mfK`T83\bcUpp=&XL8 %m&<8?0=*s/E?jO'":,t.Lr@qUO>kdb`/s%lK@&?)72&j*>4[JJXF.*g(4P^c#%mh,0`#7:.mcc=LJh"=EYWdY&a9S;mL\\#a:]P] %\Kk&CG/WoiKNrCK_?^Z8=[?WtaXXo9XitMqTj5! %PC&hm/r?A6>`M`6)G;"?;U+JUCpG4s-pJf1'gR"8M<[JsU*J&?)P.Wk&V0?5ip"6S^_$u=X;nLb+]+ju5H^p"9F^()5G)dKHj%2d %S@%W4I4qA!00@Em(%Tjm,s7@,SV_!:S`*;&"_.b<)h@e$N#U68:`\\FE%3*0XBFdMg?d0gX^J"+gagT* %Xtir&6"-Y$]*W(A:[ikCL+qEmj8Yu1dus%c%t2VEY+PZ..rT51FSHCHr5Vj4)ZRO*df/^1$\']o=14'+Ck6L$?emp_r)<0dN%H8g %>A3\:SraXIG0^Gg$iek"`VdJ&Un<$`T0`ErTW)97c`+)tl@3B8A=Y>Zg8 %?X-"RrTCP^lJq,])L<4IBZI#b"1:]rX/XDEeFnjp^rR5h-3$D`547d/29"Lm'@&\+&HY8%o/h^rEf%R"g`7N:haJDpZL-n)H6-G9 %0Rgm3b6FYd]o,D3\qT&@,6-E>kF[0=iE%Ct@9]u'Kh\>bq>8kU\GjKfSI1&l=&86g./^sX9G %Dg:cflams&cC5'7_/ZC7^@RE!/i3_om^uk0s(>'=lfJPmeAkq(kk18`Sb)2PYKlQ5n9aneE^TY]F%p5Q3ToDqo'\@^cC<:t4GuPn %I4I7(n]?Lp+2'dPE8r7X"+c)nld%`k!(YGIi?E"3GjO42'.QhET/>f_c+A1J^@qL?:Z"),U6Eh%qR++9:HZ*:i-ArF+50GDBN4k`Nt-b&TIag>`RV@=HY/bPG*!5PFgTB>DHb_g".a %))^c&PJ_AHC+-dfSgW]\5H-JtIeQ$K(Eo?\N?*qkpRCZ>6Dk-6#lF,]_lp_ke518s1IJXDo'"PHQ$u>\Rhm`giFMj$NLDUH.29YZ %O"POdrk\K1B#7t8:.6+$GEc7-mdA%i?=2\@+8Wpu-/sItEr-:^'p@u3^Woao4`r:Qa?=Eg?tNd;^V;k:)\;1s-U,9:i@FIqcU+i4 %hV[fX1U!B)rK.8mN#Fq#HqiBQJ*@V*Sm<`QHsl1@oL8.#3/a\q$g0X]jR2rDS:94]S_pOpK%M\S+'nI4]Y!X'!L-!-)je4Jm'^sB %f=\E_=o+j&obT=CkIA\W>5#nQ>j#dHGt2rIqO*%(f9,eYH0*FXYIJGs_OFE%!u@tCp\'ep^V9N5W]?W:)k:D%-MADuQh&hf,J)==s[dDrMfn6ub5VKkCgeD'J %'ArE&f%dVV&*3MM#gu4+^]'F`-C\&HD!BYR:YrG3h!rA,pJ.a7M&f8oq;)e%=^D'WQ9;0T %,>hWOr:m-p)]gkJDg^L-g#j0S>P!:7[qd'(/^;p^^o/c\^V/aPk65NTDIjF:E5uIe`t%i\Cu2k\2"RA#\!a\hrpYY*?SA#UK%/i+ %+*uIccbI$aoA.[K]Z@2G*Th4[kKpm1D$&-[q4tRsiu*QRdr$7W1>_WFBCF(IHoSh+^),Z)JgH;h'_H;!1F;OZYFbhhH.&TuUV6PU %LMim?V=oJlT-[=gH1TnkL9VKj\%Hi*GHQZ:9>P"C4uM;h_OU[omeu-tAWpgrSoid5o8*WqOCG>9Y'YQUQ+\W2V")DZGg88:/Ud+5 %Ias`s"V5t-N7mjTLt;t1Ea[@sZd14n_#qFFl0Y`R5C[GWt:upFc5eE`]'iTk.W]&k5K>Ic#]X-gVCTa59$B9 %Gk9J;c+`YT_(oskc/3KE/=Q]=-)$QJ$o$D %cgUjJbmOn+>rM'/;_$s>(k?hHmlI0r_ECiUk?E:6Xq[X]2V!h`L1&\M`s$<+P+HgUbX+]BS(ZLBCiVjBDl+f&J\5lut!7>3@$4JI^657df %M=MsTm3H^%SN)bn?:b2Y.8D&j7_):Kcm)mkBKc>c,Z\T%cj4Ul(eFl%&2M.mZ@"XU>=S$F&N*8s3J(1J=4FR5]7W\Q6=@qKjjOc) %#rmhE?X[3VHOO4$\8;q6Pqo1,i+:CM)'<$q'es!@0HXkR#)'*ff.O]=)>crUHF)`IV$]K$@7=k3^R3Y8\@Um1TC9a=\g'Ttf#'k> %(;>sN=ISYG=_#8UVX+]+s,^.lN]p+5"oLcW+F"pZ[NU!f:hjF?Wkf*tUF4@s8MP]qm %GSO08KO>p'>56%ae6sI+J-kWFn]lfR;\3]j_TD!%(iA6$A+!JrAd\8PLie(9Qq1YdKi+>p9>oDY>TKKMAoZ`KXZY6HfF&4fCPK)+ %;0A$4=7/&h;9S`n)<2m:@W,EqLsRJ7NgQ+Kn;l,\#0\A"M@42\?:]N^mB6:5a@*SCi+*@(_*TQ:r=d %BU6Rd!\ZUM6)JB<>?^_Ca9dP&jM>0p+CqZl28LWXh]<&dY?L_qPjC*Ej0lh=Q!#C/_ %bdo>*(-Fe^;k[UVgrmJl)lr'E$.6U0i?LXi&fLD'#hGN\n@(_^f'JU,ppln5E43nk %\VYk+*K9QGF,1su",mCQTL;YMK=4D4@0UrfqVmV5OHr*D?>7I6)6hK?its&cNnIsX2+hp9OQL0)@h:Aq52YTZ\37pSnd(+>)?hg> %$*YO8QKL1kKCNAa'-bUJO&e%e.4^1(G#Xf\fWo[H2DL\YI6WK.cIP"#qdG$El>;t7j]l(UYo4hq\FXd3P;%P#2Cl'A#Ve!OneFQ! %_<>eH>TdW3GMnQ6G[^lG$PO8="/'EPSSA`h:efcs4Q9e.K;U3;W(j97KbHG'q@"Q'iCm+*h=CT4BRs2cj*qHD5c"DZ343FNW604g %MJ.PJG8"/1T&BWd"^8_9r;X3=J\OEY>,mm9h6"C$LE3>aoukL,mR(@]O+.%G>#-bMFCf$eqVB!UC\c,qrbogum(O7<^WVuB&+T*! %4+i%X=^FAk2^b/@f\c5"?PEjfAfh!IN8u*?QdA<$rVtjf5;*_`%Mk0:7i1#;\tAT8+C2a?S@ %G$Y.5kb8Ims8#Ngmb:'NrIf_H/l3D&8U\o`^4LjC5`]DN3"Ddd.`"ON`jF\H$(Bc\RP7Xqo)IS4r8ZmsX),EGmd.OAD+t&+@S"]b %IUDl8c]Ep2PHV?KX#9(-*<#tGga99(Ut]HjH^K#KE)N8ml8N^P_S7BrpuBE>&ERqRSUqi[O0q!a8q6TG@J5s6((,NRdrQoFpZ-fW %r%b"(5B$DS;lsGCVt3ZJ55(K>*OO>(F.]$gYYb+Ca51+'Ie,:lK3[UnGY?<3pY:+TT(&=.T`,)ciDeNp\ghHjiUM+uT@(L);V/WG %2%(T:/%"X+'KV2fF2@7]L$R]V1"QkT9]a;pjrYW?-qp?!PqP'KL6'tIs,p^TSTS[#!HZJik6r=eFmaiAQh*^h(jc'(F"b?7S79'A %d]_QMP/DG2n(mlgST+4F*B&F2?eqqCWo*-'XSEK?[^eCVsi?U"q=FdGtCa=.[ZS3Dc> %pNt]baHL\c16G:tR;ZuroBk7'e9p;S9Y:;H$bdDBIdJ.3SpBF[9.9>cH-9R)JmU3I %Af]bgHDS20f$CNU4o9a-?]kKtKN$H/D;)Sc"bql`bZaPn_c6K[$Qg"%Vp!Yi-fbA["+G-CeVH/)NgDo0KK&#(2-\Zs3NcS[mj"l7 %biQ:CncPB!2f%a>?Gk[\MGJ+Es#d!-:(R;hjF*lZ((rbr\&V@Z#JSps\)\A"UO2^Z %3&/-qZ+b0Ls1UPWSp#$YeopLdjFj/0.d+e,o@C=H7N]qGHYcu6e#h(gS?/>;iSD0$kj-3blME_C7.[d$`LP\LDT^kErOle:N3Ii: %L1Nf<*F"iSSGcn'j377)D(]h^D1*q4mb2AmZ"3?J?Yr!6J*r5-0$h@$L-C*#I[ZF8gT+9E"EYYrX?J`ol%,t?9eTtt/+f?Q=MEKp %T.HC6S3`ifp785pk!1T2^AIiYH\S+m.(sr`ZLkKSI*)AY)d^5PdPK(<7pV(Bs8(n?^-AReo7:2:f">tJW"rZsB/\TEm&MYohlrk2 %--!Z)?`m^Yhh6aTo&n3DDtqt#mpEYRjZAb;"+1q-J%9^FLA0S32Le%\`T!4!V1*YD)91d%mX93)ghW>_*e@\'r<3uWN6($ti;+P! %jC*9Z>M.ZXhY#4-H0o@UY^H#1$%TUI!t#G76)6t80/"K:399g:"B28Ej[bYHD,]"nXiYSh.EE^X,3R/,f?;tJT`O3ghk$j.RY\"(?3e;84Hd#(/>)Arq=hL&I+q^f-=[a3c*FR"Ukq+(5srkdg3&AJ:R.71_!k0l$pON<;[A9djVCh-D5F!7r&KQtDIo5E823M*5H:OGZee$HGI= %,?8acG_7jYBJ6C6K8O*RM<_"eGW+1a9KA4D7hXsHg-jdMH0?C"l\\:a>R.u6mul[R2$Z4Lj"_(f(M18kGK21_//h;(>Kr>N0ags$ %.7D*!9h!W!gOm1:&Irb[eLZi%qT+MqQDGteMTBpC"]7K/&pBDY%J+V^$mm^hQ7!$-K5s2D!?5^-%9Zjp[.12Q;eEKBJd%pNp#0-c %!*gXhAmaVE,7_sSM&u!.E$EIJ7g)Q.Eem#K,4AHVO&uS"U$kZ]gg9^B&0[576Xnm9@DiN!&/aufEF1%)X]\U7PV*cDXs?k=),qBY %DF+-19I&jgb)91:*Me'@MBW_+)+cNn"-M$6Rt^?sRS;9E$,[YMF;E'_V\TstnR %,M,h!0Jcc5)%d(jE#+IY`mJ3`HjQWWSqY7F/TD8T2FZo"Y@6@HIRqC`DX,3D["g+uMA1J,8eEgaR[,rHi@/7S[`qWLjMj&kOUB/U1aj"%/.&qa %lUhQD\9@59b,Jfb3M3M/iL0i_*-n2=G.GJ&0M<%/>Y/#TY_s`p7T*bAU1(4la(G%&+pJoG9'DF/OF0cg"]HYn(Q-:tULleY<#\i&A\0c$dn^UZ %AJH>0*#T'IW'EpUjnf\G"s90lIAM7B*D %l1QP:nV#Gm]i[m--:>l3d=Q%?"aRum;M^hHUrOM/\eE_N94f)1/E'-qfN^\MG[p%.%_B[RXO&,<-`M*D"DUEKkd$VNbaP+<",q%+ %kj8N3:4VNf5#fgefuMr$a=Q&#qC8ok1H?`segM"Rd?k-DDfS[DqEj,&>VTk*X:/sp=LXbf#:51GAllf2c*0LZ+qgq&UpZ=2$mDIi %n15]@0i#.#$23/[P/u

    =$3DA/FhCO$Y"ZE+ %/$=KNBgkVCEqNE1$lE2KKOE8c(04Y.$L3q');gj:ar2[SlrofPO9gb;l8u7MI?;#A;\iCH;WeeRDA'+seHERSP^H'oYp0+E:GuK( %Jafo=RCK6V19ASq:pDQ_,`*RO&TjBD\qp6Wg1;#_;6oFmli<]R"?Qma,GDFp*u&>"5r&('m)I2eJcVP,-*dg;m[-^UbHg9n.-7+n %mRgsT-!:FacbSm)^<\p"eHF-V*GQ5Ej\Ai^R:_148N>c""?NElD\?ZK!iLX`_p4A,H6cs8T\D#Y)hMg\[V)nfAm?O5Um4R[N+0&4 %j^e$LYW+SkoL*E!4SarWg0']nG3na"))k>[(8"3X5CCOa:O<).Q]isgRfq7*5r[r((:<>(.b(&%)_E0sIHk!lD?q,LB!Uo//007E %3T$h^!O&=*H-LqI4ATpT4nV3G?=n,'LbRG7U.)+c&DDjaK`Vdq8Q\Ht>A\d33jpOuGMV!3]6NZCi>^Ig1=0jZ0masN>7lfuMVHAcQRdZ89)ueV %m+m?!VB>"JS7m5/@/Dh"KKu]6cEep/f%=.#:D?s!/>"R\.@^"Yl%D,.,QPtQa`9DOJWu2EBr/FdSe0V%Ehl<\@]h=7\ZJ$+.V$K7 %<@D'@[$c^o.ss:sM9cNSTQW91on)I-G*hFbE^Ci"n]-*-%]`ehmeeD3-_Sp]jtVnO(OCm)=/r@:l1=e`Utc:1f@)KPQ%@ %2Ej#eSg4q1@Wc89EO?$]b5j%8DkKiA->gdA)7YfQEcdQ1Gkj\9SckL\3'$'"A"0T9-+cgMU/#I(\q8pXA%(\p@NkE?[8.D;8$$\n %Nl0F(ocsc'V:7)tq&sp7n2sP7A!7b.TXHMo$J3`#fMAV`h5k48Cq+@ulTrD(&N3Y/I=CSnr$'J1G$.cj^sX %/eU0kGUF*e;.K3XGkFSV8Dn/@*PI3*X2J*%lo7n,OE`+Y/5je1i_/8=A33?;W"^A>8t++8,;#B?9tG.e1&n1A11p@#dn.[/*/$O0 %OtCF.bsFh7a^3L;bj+Fc>*.IVaM'1M:@u@&T)(4M&ZrcpZ`dVmQF+B-3GPk.MI?jHEp2S/B#$6,,:SH^3E%*4F\WXRI%3Z?*1EHq %dOl)(CM%3Ni#F_:dnhK-BeGbN&dJr,SiAOJO&GL8EaK-^1$cLt6J'Jr1:1JGY^aRp'&#gETVtb[0Ys*t)q?X#?H$[HYbC.K_,u]!AiFlZ&=Q-2V=+:]W]5h=#uK1q\bRJGO:Ngab$c9L[[tPgk&=c9k!`bC %8J%R:e!>bge_)LtE_O@TNd6V3d9o&fEe#Ah@:!l]aCM0[@gV*(a@"33@[gg0a#;hYuPNC$1fb8MYl %e1(3"GWnjSV[BFSAI:#;ljG,6(?c7u_o#qUmitug.(Gi %NBII?Pe9dX@t/@sn)dTWlSNi3@!AbPJm41q3-m8$548%ZmYPYNH91*5J:i*_0mo0!_p<&Lp2oY?AV$X*V"-Vb#9ID %"o*W&GF5:\I=i"OZ[68H]ud+35]G=b^`W %?q,WlhSZ%-B-_i'*<*cW7,u*Bec;>-d#?6SRr8[g6Y:]\$C)_\=&;I#is7[RiP1oO`8UrbOXbG^Jb>CUn9r.eH63.&=MB;Dkkoh&*"IKlLnE.OD&pf]Q8&:.r_eBi;"HIQWuS&Ei.(8= %:hIg6CEr^LJ%LXl^<$]WFS9T8ohlOO6Sp*Trim!.u&TYUsG=^bAQh9:7D9p[Ys_lpSsH#[8M8=qq8n="$#nJj/:HW"eV>-$'[b9 %"NY5r*!h'K_Y9q@JG01Z6Pepd0teDNVhfL0j5&OW>q$_$iIW#O'i, %l=H26A>KG:_c#W\e<@>cO57a`o8Lj%?7-@Q?J4rag@Y^64H`!ljSAnBTLNNu9hs@Ki/'G!NLja1dC(Y;]/3m8-K`O.`2kkc*+cGh %9Rg-P2lc3*a*K.hK2#-3L``U\%ZFqLqnRXEHb-Oo1E?Bb-d#L,I@),2aY'%u_7CsNPP]s]cDs]X@`EF(VLlo&P6]&\H'X,n3\XT38BU_!WNe@=!0I@gSA_PLudaSn!GZZ\0l %!7XtW;,Yci/YSa]AR'C*KePd)2j94fTp9'd%\HVV>=;/K][]^=f90"oWG2dUU62?3\.bg\-3rE>L;Qkp/O#-Ue;-ma %1@?IRAUKpUe@*40+u[.`;%CMj>M&.]nMUf4ih_\f+VJN9jc'9DI0-POg+Mum&d_m-c%_V[rBS`Qa\?0@#s_qik.2mpq,o.N8Y"#- %Z7BH*B/>NB$?3UgZ^i1Y2r_%Z_0Q>Ir[>EJf$[1VmZC_JDUg1'b;Xi)/8Z9+"dVrM_d%9d=Kb:mA6kqUQ'e(("ClV^(>WbCepOX2 %`$gsto+HUfWB8TuXHEcnOQjT&7ETj54uHfQ/O!B# %@$GN'rS5E>bGlse+C4tQ#tEiIUgSkgL_$F%:Dfq5h1_#g,4T3+4AS]t9(QQW3[W<(FZ!%2^hdo=UR9g-4'%.hYahGZ_ru2+Md^6L %B-=un9pRAPk_bKs87#%:TGX*mjAFhJGh/V`,WH(;,p5CE2>,HCqZ9@Mk9C@SbhX3mELMCnH):!A%2"G'2&Ug"1/R&1*K;Jr],0dt %QT/-]`!W$a6s].-Ej5=F-rhQ+OX3:+q8AB(5Fb$*S64!?Q>>b6rE$-)R]%Sm&Sm?gmm[/4.r]!PY[Jp$8'2P--&[f$(.lA8WdHd^ %a12kFgG8)K&igY:6DeE`O.-oS$b=gU5-SN(9)F\M%r5^MOBj$BZ+fT-#m8;ta@]R0=a4n_+eP1T\]u?'So/GU;C#(rCuIq58DK?U %M!e$M5f-%R!;$XUcpQk0Sb1BfI&nYc>eUll7%cGVXO\[E%BTXi9?a7WZ+=`;$q7n91f@^GN>QqDC,>AGr_Lks8nVqOPeig0lrti1 %FR0@(D+Lrg22'PjNckL"Y1W<(k3"KSV\;Hu@oms#TR8g"0ilqZ76jp:6YWnl*5O'2BAq$o"[As'%kpB;!@^lO?8r;? %BJFO4L$nW9-,YO-b#KWNb0NU9$UBAi0B07IeN*N#/49r(*X=ZZ:J8@fSX9$&ei8"+ORHcJ?mG*Ae@ZM66a"0PV!-0+:$IcVF#s)D&uR[a+8d]Jta%2_K&qeu2Npt#C8T(?4=:,T&8!!AfrDT6M?F\MMJQ.@\8_W1D+qB:t%m3-#j %Q,!S:3Yq%J6U_QuPCZUdFpXU(=[X/4Of5K8peE-(Wkq53Vn42+b%hbWHo#]Sh`lKM:K^ZNd.7c<[&(6)S&a(JF%D378i45\H?$D= %Oic-^S:j1s>Brkh1K(k1o?OS,qJXqNr>u-2lA&G`*7?OF[XY9+\gq$%jP1&)/2JdXBaKM@0eQR&V]r:\8E+&ql.H`9[E8(:3rm3B1jO3REs$a!M/E^R+Z)%SXA@1pgk'P7'%G9``Nl\1e31SJV@T4 %!I3nZb=^^(MJ'Dgnl[mQ:iI)YI61"^"f,)R(IbIH#B %6QCdT3;#UqB5Vo+*f%PWB1#NT!+*TS!\p4/NRBBuVNPo)5m0Q,,TP/aC&^n5-u^"i8A3Xlre/)9Y\\Pq"mcAto7-r#4aX,&UEJZB %=b$M+00rPuAZ?.mNX.&[E!pLn"I^kVnd`Y<+[h)>T?&iT;_siP-Qt&:GCdW$@Sho$J77o&INho#-6,RqIh_sc&;J/rji=)OJDmA% %`U\n_A';:mc^(q6_dB)Y;b@[3l2c/\SMmMT)os2P`r%`18]jb]]bFPJ'3WnALijE16n(kqRtM'OCL-ipSEg%>1]* %e*+YS^p>0&a.&q4/ZpnZ0[^4l>jhLj_Kopt'@^/RD\*d$e$-hu:mn![kYIV0aGBE4-d:0RGYHi1M-`ICq@RoPSh*3?N::B[i53LN %)c-A>+q4SUKFjqIp)n>,/.i)JYGKL,Yo?WlQV]ri[!-RNE/Q]8@dt_m@B^Bj#GQ."g=S=])%b$C$Z)bEQ=u4Ea0Ek]V(LQn'2/E4 %Yp3;5#fmL?Z;KoEA!VupZ#gW*-m4*jC+J55RUcd!kY<3='4"j'DDgtg_9FQ#TE:<*@Sa#2On&q?HchM+ZZMc=HrlB!W1GH@%-q2, %[>7(g6C'N5>'@tT^Co!l2[4`4g(@Hd"-Sd*k*jT\5XR%&LuhnM[B'-F/&^)JJd?BN=p2h\8s@Y1+e1YrT+H;OTi)%o97/$;budbe %F,`',-`..X$XTgTg4Z"_dYq(K>bUO.&s(??F=p7Pt@b>q<`_t-UPC#_.d<;!KWsg-_oS%C&&G$g;K2q9B+LI=d'Oo,faqoTX %FQg5/)bmH"e00h_/;L3&[eVBHV:`epPuipGJH@+H9gVC##3s&]#sh/r%MA!<_FfWG!"P:d4>shk`PKbF.SMJRI3PLGAu,!/Eb>E^ %:aJq'n0:G4NfApK!1L-!i;A_J4X(cAMKBK=3!r8.IN/SaZ#6NEPb(LTWH0_)758VRQ,ir]Vb"[^"=ZnP4',ZM_E#T5>9V$bVlhfG %V%gT1MH<.gW]4N\q'=5F0O`4V=42Hs]L:DO#`40Pok"5,UsMW?DBL<_O+Ogia=NZ4mf8:VF1Uq/a^(5//,JoF[='1DIpM[0bY)&$S_00`j'EPBnOC<;VD5(LiO[K*eM1i_\--/ %\QAX54O^tm%m]c0-@!p+/h>4)*P_AU;Z\j'ng2)KMNurgX44O,i_HGUR-AC,21RJp?i?692;>_((n^&5kVls7JV7m)c]kZD1h.)J %S\nX!E:X,1B0T>?_#rY]nM6CoR9a@iZ;tTf@?'ORQNL,(HBLRe15.]2(L9fFkYNE?`.Ord>@oBQEoK1GYEsKKpcj2sM_cJ\MO"%, %JKmf/--Jk)n/p),,*i_'6k19gn']lViZ$9reHKg@5qeJub7dFFkGdAV:n"EYKeJVqA2k7T5\#jE,,Ya!2YM+0TdL82W-.3;2H2%A %*@445A5oWap(T:.Th"5,>*gNl;\6(LHuI)'aZQRK'W\m]Y`42T'1nR^c[KnolNk-oTPu+#7IFJo5/rPBM-E')_i-m\Qar5'M[j\^ %4GZ-3Kl^EnC/Bo,/cb>%eFjeT%+JCSAUlYU;PCS))8r,NY:5&5!$N\ZTp[$`V6lrc'B3R`s0a"(JZEETO)g7,0@L`VkDC)n1.\p- %:jiLF=p=#Pf.G=oSsbXRMIdekq(ptYfKn"b#ZssFPB-m`,u/R9!&5-6?V1uk";OpBdq3d36X[@,-05Gp"!+BR6KAfll!m4)p0*TM7T-`T/LjStP&!o.K?eg0EDM9q.WQ6QU?#d=2og/L,bk@dOfnq=o`\>r"YQNVkcTO?%N %8J&H?bdF=CMTUIl'a;RNJlt!%GRQ`lFL=A;33ATf.CFK1i8ZMr3:\6PA]^"BU0'Ki,XPmAM*LPQu5.tdfC*,'a'\j6&5OTA+5&K#S/+)L13,.h+3?u-E.S1U0.L4["^/WUVFtrA;k<9s@^.=k,mAfZ/NT".Z0PQ!>s^Kd.*KgEGe\-<;Pc/nQ5=.mF+Z(U6ARS] %GWCh1F(o[G6UMi@nRmNHX[bG7V82/JR'qC1DE2/HRsrP/CfcPqG*eeK+9jga2']?L@bId^F:n@mTJCf3^_s`g@j#kbNn>PV6:sO5 %FD-3R2!/-+,&m/5?-:Sj_=)L:N^GQJ*-Gf'`_hI4qt==>/VFdKih5@dN%ICJ:-gA*fk'j18n/lSjZM)/kE$6pL[7rRqh#d%c75OO %7F8+;66I>&^93chM\:m;M6/Qa!VNLs,E"eee?`.s(^#LO\jRI]jAZsLEkhrpQH!gFm])Gj\0f_#Wk(P])G:QR>[86#a=P=0gh!3WP!#[D*g-pfcEF9EL+eBug!eWTA6dssSF=?'Qo$K,TdWmOQN]9S?0)E3B]V>hYXM/+:Fg.S %*7&<[H-.q'a[O4CX0o,T@Y>LrE=g`^8Lhj30<$!f@d?Qh$ %o0F5$$'s3j3Ht,tXm*pUq9>3#`Sm0cSr5_90mkjU`1diA>o3SC:F3!'m?;o_A>?epX7do$8Ai:`$J_%O?Q/#G6B5-(XIkQ?!RVJ; %+H_T0#%Xng7Z*:U&D8eUcN%gG,?%*k-j&!46At#>?OtsH76-K"m0]]s7Mm@KY\2t[fl?Y#MJr/s:Cn44,XV_'b)9$l$#Mo_Q\W0: %Tp:Gub:+bjNMWk>7,2Cp.qmI8_2B3@J<%m"Ot*r20:,ZiRdZ@/<7R8,17@i73O#@n!iHZ5LY5*G6@126J1:PRPh@RO8=<<5PiOCi %;rO0<-(5cJBjh-ffGCP--_Oe&L%[cI46_]MIk,,=4ODj*bAEM@"*5FaQ0HDW[nA2u\Wh$e-mX'+G=V'6?6]Yq*M %'C^j,[HM*SkT]!\Lb&qnq'$&Z-jsK0Rlk`<-Hq6Bd;O'ql,&?kHZ:Y0=beDH0F4>iI5*$;m %N(V@lCuVAJ4#rEuTZIB_6'@0U;OM>Vbp,"$6F#1-d2uQt*fuC%7qJCpI!Ua8!LJ$"jl[EtT6pBJ8**[3ZL\aTT]0ZY`H.FSB/lE8 %US2qjF)uKIT=S'A8.Nh689OgfD[?;$pW6r2!88?@+M4?#qLdejq %;ldTp/%")K.XED+SZER^Z":)m3ZA<$mcZ6H$;9n=]9"O'Rk$Lr9><1P@TRYq=)a.7N='>^c$%LeDu-0=0,u^=!K4E17Cb)jV*PT5 %i)SEmalI108R`=)b1+Hf+Yp8tPkp>l#c7s13$dF!Dj_;h'fpib06J+Q5$be7p2Xi^c0Nj9$-M1f>s!fH.PIY1VgGH8""d/#f,M#8#/& %Y"7RA9@S?L1HHcjG7r5,7aW/X:>.\sPpTVcfctKP<'68oeus=G?ZsrVa1ed0A"WuA6A`=Jc?:=#[1l'J.V(/$qReM@PU]6^@sp8( %op`XBi0N_A-l+\^bE).].Jq">AY6cnq7pHc6Dmb %P`).lbbEJbCKf$@1RC_nkgh4XMY7V>_A'8Y+ELj8b(5N..<)rPY,CK%)8d_^GgVoa<(o],YP]LgP>)a/Hr%,PZpnab6UBY(N"T\Q %/TI.l2AP%`PoOe/S9DPl;Aqes#>9Rl_%W4p%QXhtU2Ua,5d6U;2IONoM.QT5$FC4p04h;BfIm@$B/`lt"fN7p:a*W)Z`"_$:ap@W %;NQNKX"&ilPQsu`$FJ_h<"-sK(r/ulfYd83Q\C/n$mMYbE5H5gQ,6HL#-sK4]LWNt"(]Q+C&4(MSV>p"%+;*hcsnMhbE"(km12M, %@G:gT!-'49AXo\cRXsBq-o(;`;N-QcTQAN!duuq)f>Loi60]qQg/nA1=#JrbZM>kBZrUmWEM=7qidb'upk0d.ihN0;6^EGEG9D4d %ZO2rZTB^u;H*3#p[Md\=.23t9M%BM`8&+i25d8A;K7U(@:Ma,H(Ad^;]KU?U=@R?O;s6U_7DqS%i3JXC;*B]1-t"d,4sD8-&h3t1 %h:OK/$YOG32sC#7D3<;%pub(Y%2mrY8TI-l9A)Wm4-ofVlFKq7K38lpNLGP*EcD,rhCErU7R[ %qSV0+],\RF`;`8$p4)F_qXIp_oj)mKq5;8?C2=*+2Ru&op\H0N>nu(.:<``_m%X;IhWts,[/$Uqh]+^Ulg@R@ak;VA0/i-MoWN"W %DKRJEq8XH\Q%ln">Of(Q5%<[,Sq@:"2V.W'o%R1/J'^..9.=ojJM=m>59\X %9n$@r.14r[p<$aO<+X6K8^W^\XqNMCp[CdtfRkm>?VHToNuZVF5N8VbB+>u'l!X@C0aZUA+#<+j#R0FZX(ljE.BG8ig7;\(a/40r %Z!E>kM]E$\R*W^GVDAW#>fAX@lC[8Bg;tprWUs$]OgV(N%f4PO[3Gn,je"eD*qU&*rbgp\>jaJ;j:,Jf9g_DL7t'2)@hJFPO*mFE %>#f?\&*T%&-L:O.X?+)\W2_bdCg[Mj?U\n83rZ(XG26ngO0%h&2+%TB)`;SF$_NQ2n-;s;akKW>#Ck[)[=lT,3[.I^.fOof+:g^U %CE-VLc,"@o_[r'JI74ldhi);-"[:HFYc9TE8(;`rWZU$(?b]Xm2NQE1_eTLH`pp%BofX"uGfBY*@T%YW@?\ %D\r`hAK='dD6Y2DVT2_["4t#SGKSkCglFfskruKJs(h)8pCg&_KteG^*=0YqOG&EJQlHOCZ,$Gg9X9Y7-L@O*4&YciGh65]\nI[/"8O4P5Y\@/hp/:L*18&N90ZN=fnhkHI;li7qYI>IZL=aR+V#3ZN31hi6P!N_a]%>i>2fM+:d&J;Kh!_6f>%&(IY[`1\C)n`Mg %$_u6]df%#[A@oe>-BB_Id=6F2^cg!R^,E%b<8cMIlcfj+m?;gFr9%`N'Yh7cX@@hN!K]i=9+=.^q%?&1i__HYJLZ:;l_q$2,5X(* %jW!#EbiWG*_WZJM+n\q/#L:r.5%KrC+7[9$8g44PAuSJHJKeK=rAj5)[riba<*eBi^+h%s\BPsI35OY/kC!)4r.LCp+A:9,nL*-q %s&8Jr^0+*^AG;9b'Ol[8lMeU>Nq).OH`QsQZQ=/XcbQ\'=sfZ$.(LD'#rh%ZqH/@+Kh4d*9G(#GEZadN/pDQB\C&M1\dS;\=lB8I %P^AU`/NbJ+2ld[,L">$iZW+m[8Lr87o.e:]Sf;\:ZH[d))NPT*m/V:h[))e/-e5EHnUIn8riJ?3b4XQRU$_m.YZCLk]C',kMURL2 %K-mW")h>nY`A$9t#8b>Y6g@(94'Gg/?)41oFumSAVT\UEX7S67kuacp0-BKo9G+<`4/obARmND>jV8&-bs%X_oS(WP1l;!QA%ou@U^eh)OVXSGB=)]5I\FehD)35!A4-&(p#0sIR>Q_2cpF[-F89!5nAlD:iH.%&%]q="3q_ocT+6a %U(f20+*s.XLV%Yo:IL4`Pa(+4PS$p^5pEB/A1:hbJ$nYC)S,^FjAEYn(s$6C;C_ %K/I0,nIK$As-7m?jmL>5PlBRqr5X?o5MbO97esZ`qI*2%@a%99U4^iAldC]4p4%ZS+B>c8_`u,Gs8@rmGU5UqX<;fbn$0`)=4E"$dIX$=R %GPAu_IJf+Cpg@@F)9!L=`ElZ-mYQ`fd;`!73@Xs8^8$1ll$UnWZ'bP4Z*/p*lbC74H\:?;)!<9`;`4p2.S+](0c(VsCA*\)c5t3d %@Ir!Y0Pia2]6\s6%G/[?BD>9#W[1N1nDIMZ,j:3d%9[jZ(X8K^Vqd6r7*U#]\;apE+2"PmLNnE5kqhJ?g %QU?#p]:mC7GQN8e"r\acsd'YNh,[J.2c7@a#.4)CXga2(3]dNlMJB:G?'.Vp\EP?84@u6j42f-f4bSK*6f.6L#!b)]ZJF %CET9k.2G">Ce\^\;#D<6pMU@qf\[V^/D&tSYf(Djc7_u"_Nhf8q&dT&53nI('X[0e"i:*b2&h$<= %OolF0)6[BZ^Go$PJ&8_S4U:J_4P;Gr0Y79Ja7)o4'YqZCgO>%dXGQfqHm/_]> %J8e!Y[fc3E!qt;u%p??Za83j9=#kOD&(Y1N`ii>gJ%rq3J%c6i,,;dI2IV.+"cO&"q %>P!Ap`PJ78^i+M6rYp(drqU.uCU@8^J9Q2R0^&@]1?j8cO%'rclT7#i+(=3&#iSAt-=IAj0fGUYMQ\j(JZ-=7G?aeSebir\fb/Q) %/gY;04*b2ZB>Yk@<)N-V>8icU#-UeHO&BD6CT8cIW1T+FhtB&+r?_B5U#/1`q_@q1&\c#EhRXW_n^c6-i%8$b.UIT"A$nf!fD_f[ %3MG-P\pu]mSj-9[.$1aHB8PO,mTJiE>lXQ\*p.]to&\%q.e9Y/?iHC7r6%-M1$bM4f2tP)i0'N'3sF;VD+VN(G:>8cRa_9d*rg8A %?cPMfb^><4QiZYZ>maQ'IOaeuGbTAJ2[:WM!krm;i#$cgb&reR8IHMtrN!;hJ[:h/%6@!Q/aR]#GFc2bK!%EGSn;8,Ij5hTB:H.e=$:kcFo>Q?5naKnD %r4/ZOhhIHorc>Ff1@OoHP_6(CXbQ5ekV\7e=aN+oR4?F)AkuLeqtb!K/Rc\e*U)R)o^TI]27/%>TG9%b1;Uh_;n0@H7sDA/[nc'- %F));7c>:;K,(%PNR*3P3X5ud[r$7.mi!sh9a2?\ldU?`?mRHoUF`giodT"/2.h!\ON!=%XG_G,H9#*8<$@RUZ68(`q$%#mo&7+UE %o%iQi"/d'SO"r83B['=2X#5W')$JC3RU%K6Cs0=+_!mC.Y584j#LrXWqZ?k2\l]GD/"kMAC?jc>&rZu&g?!]C>^m5B/+d>X>TbEp %9L/NkK,_$mQIaK31;Z,j/--M=t?=1<\dOB0)Jk&A":=A'=' %-_T8%#-8KH)_lL]-FS9aFFa@\am!hh_?=dn01J7i))!5HPL3"rBXO52AWN]JHkpqGCFP/oUNJRY-YUrZlt/DihK70%YtBbL"+ZVY %JSALLRVjI">dUiTfB@`#+QkGe>5QCI_liIeU4.q=$VI(FOoI5.bi!UD!!J+k=V'3IKX/d4QYH-!]/W(UU/q6=d:BI$ZJa]IbIP+G %T/F@X$GCR(cW6T$]$&W\#_Bogs6*q;MVFlg/!Y96*hV)QXqXaeh(EG#FEFa*Kp'7(`'j*^^08H&"q`KG]f?6!]p*0l!p*[XroA:l$7!D(E_3rX64J@YSI;u%e;l0A5nhcLfs %@PV%[7fC(`0+LK^_+7N2N)s6L%jS^`j&\$DMN.jsGVl,'Rf=5AeR-!.P)KPX$/NSua^g=p0Bc1aXn5[IMN.fGjMfMLeE7BG]gc&A %[J\!j`>OGG$gQ!gT^UBcn*@%9LcNW/?/#!2^Obmp>d$0F/Gm=)EanrekmoQ7=&36c>^)TLJGnVmfQ/*o!UFJTJmG+j1A:uE>.Jk. %nI3X[q.=J4Sui1RP]_%`H["c2fuKue0sik$$a+n7&d_'->pECu]&`5)#Xq[3op1gWSa4KV-TkSW-f+IBg-\@ACjs'R5&k*!GZt)$ %['k_h=^-f:dCS'O9h+Fj#3Xb$6*<:XTd_E)SOP1aL9",,`IrY1+s38:lrG>:%k>\#dpQh$LCG`GNR'>"IC;UGB#^_Wj\/qTc\kQ[%585DJAMcJ%SZ]!MCE?Vg77S?9?+ %"ru;c,,LSUHj7@6DVUkC('&5_5Q(gFjo_9Qo>Q=!DuG9C]U%3#j5^]dHk]VOBSfAB\9/'Fn1j!nS$;Pj;IQVa>+HOoQNLf %=aL%%];9Uqc-=nfA)WbNcHpgGZ@PY`k0Ou-6A+2]1`d^m/Z^Y_)bV[Kf9[9u3I%uG %B_3DO(GhQc]HhleD2sYV;9?:Q8?j?"Ra$;X4mUE,/#Yuh2JhjQSMUG`5:=H=1)_@8p(Fs<\)Q;DEEhnft(nB=898]b=t,b$3i'&?[\BG(42L*&h%pqENKWJ8*K)XgB2WD:YHgY=C%9grFLV %>]IS$)Jq`;F,GcgS,RHB:nR=UC`OKh,[7"qB!plCWsUA:ZjKP2iM]9kX'cGC"`$eU'q>^t\gT=5ZVc39@m[aag.Y&5&TlW/]L(1e %p"9K\-"=uRXcVh`h$,07DW4^s=Tj(,+e[3^@_t*3+X57MQm:t!"CX@.5[oZ>4ORD %&''68$C:K#BsB^L64Mh'%<7_8Mdo"_/7E7'3J`S'f2RoG"Y^-T#_sL>5a5meK[Z'"rJ4a %Obi.aU^>bM`I'Pk)&m]YS06loL9)gc=L;=O),n]F5cciN%K%umUQd.Rl8eXCoT@(W\pc9)rel4m7FnO/mnj!d[eGUEqm=6Y#]`' %K/(%m#/f,OG9H4r*#SN=FXe[jOd,i2)g?)PSrhab[<*'L:nBGR:h[M5.(k/UG$u8VU1YdK>-D)qSmX(QSa?/U^V[ZnWB'2 %YEFJdBl4K18MfR'RR(:I%=Rh4\hdXI-&gk:@1%2b;n,Jf_Hk"emLlC9QS='(`&@$Q'btu`-RNf!OQ!?#1(nW_ea;-7mLj,NQOr1p %<5!!q^+kN(OY$uS;kKdm$=uWiIP*tW+JFDf&K-l>8V8*%6hH0Cd=]SS/DD8.7Sk4:$J-M7E':M',O;`rJ`m[`U2/Zrhcb]sg'Vu@ %0VV(5Loptu'24iq6X_mP:\Sob$HI7I'A=.qVG6#&D2M3>Arr?;KtOc1jJ>Qp05Uo=Bc6Ik3R$Qd%3mNC(jTgOa@hGRQh-eJB4EI7 %)&0VUFIX8l^.HgWUJU76.uju.5A*[`^fIfUV$&64O/p@2TC'o'd,5Iu:\01iZSn6]e:F@f'cU/Jjb2_Z/MF_#G$V$<>PU%^-B,Z< %SZg%W(\?=ms,$;=KlI8-.6H:l^6Pmgeq=e'6%-F=`3;D5inc.'%G\Eop_]n3+(pr+5Ng40?/*u1qHZkBV5jCRNSjpspL0!O[&TX_ %hTeUSngYpl_Y#>\M_UnZg;fH5='X6c[_J@,]'F\:a)JT;r/AK#^k%+djDVI2>ND?gFJLX`N&^Oset'7J-Zo"h5&$qs;dQe324hm&[S0k5j.)$qqFqbB<":ba*.GeBinFY<'s:e[o^CkL[P;tj45Js,Dc>r4:`6+k4_)a07K,J%P6'I+%b %k.;!J;Kt%J34\'-rcU0;-P.k,!0%bg1tUR:!1.t1F0#\b#t9c2`'MS8U&jXqGLMXHr(D\ %aUHN62YgHe4UJ#CL_`Yl_\Hu-`[*@uC!B6s8<#5+I:djYg]1J/1R`+7>)oHrkb(S`l-8_8?qUq+SE:D?:CnY6X8JB]AkOI9"\k[: %.&naeU[mO&9>gVU5KKN3c+<\7?)R(LR>tL?8,\UJ@e$Y0gWY=@>hCa0WDk`64XBR\Zh4dE>Q*FSOC?E4d>i(qA-L2$/Puk,.>]RL %5uH/":,:_V\*Vp@5;"f\`OOL'4ELr?4$r6HA:PC1CL)E"X_`fX(%qffJX,oScf**ZlMc@Sm`qnCR=oYbCNkIRZR']#,sFI>APPB?C"VlQW[joOF^AFV/h\2!lEAj.CEn'($al^m>GVS('dI_1GQ*foS=F2^iF?6_df8IQjB]6kr,C[jhjlhm:\t%X)#Z>_(#S>LbfD%AlGf-bUUT=JomDjj36ti\V=/\nXZ)LhLHc]f2IFlu8\i:#8VU)5=//DF&LU50QQ1U'",i<+HE5&mcYf0kbfR9,(,Y.Z,(\X3.8@\j%@;Z]n9UQX&lcr2SKN\e)QV9pUEVd7+$oog^A"/E=tE] %Q,\=Nd\Tn9YLEAXNG5!Y(Z1V*W&@WZe9rHel#bZ$'=T)%;I_qn["$'=6O$g %"0%m>dDtHP5MIZ8q$QSag39gVFWKS<^"_l%8thHo[QaTSCu_IDO_ms(f_oXQVn4KmY/RjVP(TTh'6%!N1Vbf6B[/C"o9C?$o]-=i,rO!N\V %1,3878On.!bXlSecaM-NRr)!EG#AHeDW;h)2Y='SI-`pSb0&\M\Od3&mc0!Kru&Lq/G=luDdg.\qMAW*Fi$q-!='-oH9'_?-S`'# %#2Vt.;JX*8odeU)BV3u)Gk68cb?hmE/kYs6o/K%eH@o+E0Pt=^WNZWhga&?"(]'/pl`%p0V<(7ik$W2G/;@5[o%5sUTrq0'LC"X_ %anto-Cut'\n<\W1?J'U]K^XT.PX4B+\sgCs8#oK$EQc-rKCV"%'k()i_rU>%./Cl8d-JQ83e'9T#5rcN4r/m^cFUKtmL5uGk1b/) %1eP;O9F($h8i5;6R"&Z7>1IMi(r(O(3)=rjnX0X&U?J4V;PiDencAH3P:6.FhoFLPQpWmn_gli/K`gee%BgcETSV26kJb9P=JKnV6hXi)Zf,EK;3CDh^#mFW %^7IW?V#eQW'J\r#cUbf4J&X]G>Fa,[R$RLbqO']E0onQ;5GQIaFcG7TnCRR6fh.> %9;*G>'JuDgM[ViG2#kN$DLuKL^f/*kJ@.X,=_9-sREU91U_%WOkh-:19GdqW+U8UJZI5E@-OVZY@oE_.r65OoMjJE1J)TV1C!Eb;]FhGdYW-25_0glc-1m1`J`.jX7gcFlpkcWB7kP0jYW/J+R8uX7bq3A$N;qm=`=+6oA8k3S0as]Y %C0]q'-(p,8B:60+!\;6k'N5JHNg-b[eG)WBW%puQ3-c(4ABX%BP*C-0-Cmk;p_LW0%Ee*s5^+E2OmHgd^foM15pE?p.OY-&)a*_" %OH`m@$,[@!CD>9m3G@C[#!)$6Jg9/s>)<:>V=C?q%Lqr_0G$>-#JbDnM8i-5(&j*l5JPWKoIfnK%/_X"b.U2dQG%SDW.A,T>K?q: %[WPZ@PqjUF[Q)IUEX,tbECWI/al_<&>3`1nhTQ;RYka0#%i%j("cc"9KLdVT>=mgtJB>kd@+5u(_*3uq7OGoYWTBj,;#NLPWn(/9 %jKW%6L;ugIfFEuqaG13-M_dO]-Xt&Fs.(dlcG"#_.(RVWHS]HoAt/,O[-4QGgsWZq;C:@-E(7g+7khZE!NJqtn*F%N`N/\f*2(eZU%=J_5D]o!Un^gNLrP*0>?[faase=R>`m==_$k %YF;.^isF5tich!A\&4I/8_Y([22*SVYq[M3-s@O!@6\;+8qjJG:4DgM%@t.-SKFN^H:`WYqCNJp)9gLh!ePm>Wj0gjMpN2H1>CJH %ag-_KH%/)jn.G/[0`t[9dr1nX?+KNu^32[s8uIj=?:j*$YslZ_p;)o"#Ql.^mm3_#_%20Q*QWM&B5jG2:=2JZN/HXPKBE::1b'0C %/-PoYWr7i&RMZQNH!&G/=*j2.'8:Hgp($50OWp_ZI3J(Qg?*[H)(>uS'tIc1Xpa^-^,#3B;M"BIM@9Yt9,5R!"N.`U:QNP2F;6=> %^3CZpib\3U3>9k$]DJN*UX2q%eut_/XrA6\97)!,)Yff11OFQ']IO^Z"7Cknm.4^22W"'E7(q/U#WB!DkJPYHD=3s(6!?ofHm&@k3UIMBF8@.>\)IHZe2:$GPL\r5LSn*I4Sbmi$WAPQuW4.))$2JM&M %fk,O!"oFHd;OL`n!q-0HJWtLK%2$aritoMOc9>;K]ZH"G@&bp'CDXQqXbrYQfuoo@\q2+R)&8Rl:Yn$iYAEO5gP,`l';G,h$,^R/ %!M2Br*>fQ)@T&Z0X'lFY[qp'6/+1V(onLF,7;_lIW+bn7d%c@j?0W/!"B"Um?ujB*DRLkM#!77hL])Q^.1@"oFf\>+*Hg(eSl(2FlbY7_ %+1n#l>9N.TNf"idp/6-R(#COfU47Wsa[S&=VddCqn]93+ehd-\*!8Q&fOLu/j^#;pcQFu:"L]\-lHUp_M+tEu'7*61?K:LYj7cm4 %(Qj$]LndoT0W+7A"m,Qge2d=5aTnZjhc&1g%pS2nX?RD*TY9&ij1WE%OK@75fk7P.TT?L@^&o\U4Q2F9,(&u4-$6uH=#B$^5]/>' %h>q!'O3r(?Wgu.Q,foALZ0foP5g*:-HL=dMKUX4lKAQ?GPK,q>83FIUq-eB8D&'WmDA%03$-N92as=0n-[DPJ*B"HM`-'1MITB6DSkEj"$"c+N#`)N>T%&e+ %mtD:m$QVkmJpC1J7UDc=XS&:4hM60*FAJg+,A.6ipM$lKH<`uuDelQip54-O+!,En1:c$]q!\kE@*>diMULm %F_m6ab?:,![a'2u=L>"_9UP_QXF_Q07k('Y!>R=fI/lH3n@'USc]FQ3@[o$YZE_?m7tQ359js/E6F@+4"C5OfGlfdOMc\6?$>\Ig %NAIKs`BD;bac&2[k[Knu]@Q.*\o#3aUn2:eTp;ouStm0Hn/73@Y$Q_U;4NR//t/1QBm>YcSZpm?fE!>9@m]B'8]GV6,u;.XcIU_1 %5W!/SFu^rZV?t$4bQ;D="tkB_rXeiX_h@2kT+M[3nu!94_t@<\^C'Fdo1>Y=*B=f+\)h_U?B#FQ&8iYB2n-6 %D\iiW/K>F^mD\"sjK=a]i_@G&HN!1q0.,@aDt2+TMcA4*Odk(b?Qr2n;d"Kh<%5m)4N`*IZl;*;^1q2JRp0W3TL>*"l?'B7Z'Cfq %$n'HNgP%GWXoVcR:N$5B(PB:dH+Q)-,+b0WqSh=('$t@E3kg(mG2K=ngsgO!'$qVYM6r>Mb6Q\aOm(S,esV?^[T87gb'O@OZ/Y]d %Q+M@a8S$%/^Qu$Xdd^p(bgDn"=?9i(MemFhAEo0W#7VFr\Z`2+VGJ:d\PrT5Qt6hc=(L8fB7] %`\&86KQmF^[C65NZ9KYSm.bt7-E9l';].a&CB4U8hb%4hp,8bV=)*V3/Bf355Di;e29^p05GE3'%SgL2"N'-6?$JS?325`m3`YH= %Jg&5aUK@I#m)I0e9>:7kkWHp6hj:Q[(']JCmUg1"CRu[;CS>RW]NV)7!Dr![h1s4so3a6$cXkkkVQ %.+AJPWKt`IrDhA-nOOume0*(S%SIR+5jV`?HW@+gd7J:]@"bJ]'f2h)Ha2HL5+Qfa5rT)b^L31\q5F)bn9N2J54JuI`c'8ZX/@TT %mooD4Z`J)=0sZqn-hCe3lA=RS4J#DdjIt6f*%Z#;#-b/AaXa?@[/e$ROoM/!R>53QZWKUY/S1;11 %g("^h$&"4)&?u0`.@i6O623M@R2H,7eOfa(43tXQ-.,PjFNVS/NCX"R[!mkX4,Q?@>fH]^5!flB;XCfK&`Kft1@eop'U?f@gW4q+ %j$JHtM9Pq+mo[D7T*2^pjj25tClQl4qh7ATn6@r^]b@-^Z$gh&:T@K]RqVBO[KgRcQEWmLjfOJO+$5LEgeV"EZeONZ;<#%ZFHlR1?c(#:1bt>&RID)]j8YtOlm`?J(2LV#&TTC;JZU3cm)3?>ab?tY<^L3!>6lcj %6L)p?8TUbsr8ppt&)q%h>KL)9_+JDF3"uP=,^d.2Pkh_anKJ;>fG=g0DN[:s6q\bYNRq28NmIC3>. %Kb4oC(rq:V(8nCRj`C0QL)%Wc^3&%O9WtDF"ZNE*RG,%*HLS7'+U6!SK"0R!e\gss;n*r:FOMgJF(^kq07Am8MOd@ciBqX?ApYgB %o]7u7:`VB5*?Hla#(9^iI'7IB6#lOo0PnH>^$,_L`BdSqHW"_-$Cu-Ja3'%+g5di2Q0W+t:g31*o+jH/pPs-_Pm6oP;K]C47NIN$ %a308m.+5[qqpp3A9"F/N,(T'WYP?KrI*th0PUO6>/#n5*SAu?"/h4&iD@_PDH.c6Te^F1DQ#H>cn/4CHg/HT[aU[$D\R8d?],G#4 %Kg,%"Uc7$Y8pBrBq,4_'$Ee=V9QCSGL<[Z14kcUmEB\C/2<#sIGr5`+l%16lRT%ZNS %eY7&:L@oEbpq#NLMe-]1^p/T@d!@7pAd;J.qY5@bS9bnTI9?fY<=of%cc;dAWg`j:'8Y4@I&(;BoJ %PsOFFg\iEqB*RbWf4@&m)MO;2[^5)XreX*sqR24Bb&QEdh+TmaBPJtYn`r&,@8[;YBWkDF1:?/$f*IJ0e.hBL8&Ff!4JWo6d# %%sq.DgRPgL!d^o_ep=Z9XE6k)[p)C5YC%ss1KQDlWD`!ZC`0j2WC0_BY1IYKr>8I^>L7"b"U$X1^HTZ+GPGfC@$Sdc3N&P%[VY@ZcNa?u!1S#![fpN;Lrb$h&9;T %$sG!@&q*G7/Cl7L#=U\mXVuH_We2KZX0jqL#jXIokFTX>3n?`.b&QQYL8'nuI=1%usU@Y9%a2$\>:O.+!h4#BX1c\>bgk1o_28Sdmd-%Xk7/o7A!PICm3*M!g %4;CD*m]4:ia^L&#$.rQF?$(u'!R<*,bh&r.9PE3@roTZRb7u?tS4B)E'YanQ60KFG(>,$\nLH$_d_0Tg"@*R[bI7rUH&Tt&NE9gd %Jff`8e4P'cTogSaa8[j_A:-!b:ETc1qF1HFf(g&3NrQX%gXQYs4!SN`^%K3+a@b_]'XW'^.5;p3Z@=364iQU^69G7_H;2u. %Gi>I1nQI2r0<6kc79CFXjk;GiPUXDNpjBK8;WZJW0Q6]\J"FSrdk02eOVM,"@G<82ktsaRf4+O=UfQAcC"PZDm*H"10ge)gGSLIKC %O.%;A9M0M7HX1XAAjq0X`&@uY4F)9,rC&sB&%boe+iQ?CoYPbRgW@TdQ4%.lZiVOtm2)R5B;*Y^0=)ml8&7>C0gn+"#mOB`eaF0;L\+KO$rG$M-!F %d_U1#%^d`s"I^)!%pMUT4/eq&FZ(kIqe'p6WH:VoEu\QXU.X:-`OS?K"';sFC0j$3h!Ric;"e'2:eB'6rmF+=?2` %-5Xf#[(DBd(p4P<+>9:VE-*Z$Lc&ZKZi9gl-glG,fKlt)Jk0C7Y?(o`>64`k@Y2E>h0.1%chE'K0i\Sia^ %d[@_O2E-/D;ko3Ygp3piUVo>q#R&@*72`9c-2(;;@oA(i!5N"Ujfds#(]^Z+fW;ci]"YN3on<^4c,IRK9WGpmd;A)d-0o:hO8tLs*Ga;ZZoBVsj86j,$i]1U6,g(p4erI+s %7\ffAkfH=dj=&A2M@I(+cfP!b^GJX]il,Uac+Tm!6f]7Nh\+*opjK%&`,ITJQS""VZS8YWo8S#;h3J`_+!nYc*<@Ac94t6al]\RT %T/q'Nr&%qa+Rh+jY/eDrA]N@S`$H1KZ9'n0Sj %DJ@=+)a:lVL:;[?'>:?C,0KNQ7o*8,8G;M%"K"5B_ON(@tZ4Fi[WeBj!%9F@O:J5C.RbRS+a_Y4@DEV-P\s$(5)R-Q=bOEEk*R=IGC7_K[<\2 %1:MM=3>;$ZSm0'14f2Z;Knd1%MArOehj!.)buWlO8*,\*9o4+.)$HdE./D %I?Z]05'^3fV,1gShAct5KVj0Ig:oM\d>ZHOmG8flgFp(/]la\;b5ompEBbJoUU(@`>i19<*0TLe,0hjtZ4fRTh&n^=h"%t3_a<%5 %\F@Ueg+*Qrg+i(_@J+isN7QLu%33L-FrFbo(8ilF$_;!Hp"E)?b*/O*]qZZGS;uB8'VE&W-KjB0_.SWSW8JNbUSGmJS4uiBmFelh %,FY:E5X4OuUT]i=:D7\[j;sj`*EaGu9GTC2m/CDhrU[L]/2V)2+WF'EJ18T,bBC0GgR05V;*UKNF[aK$YWF"3f02=N?]*\.mEuVj %It.Fr?<%c0P@F7joR!E@`7_P'5J'HRPmt?u2#PJXV'-0PpWI*@&Ga1argfnEK9fH(%@prP\j_/eWp>G.]l)?.6iou3+B;4pOKkIR %;&\#-Te"h6k;P``8U!SKX'gHtEtFfY:j3ZA5rg8V(o25Tdo.@mRHn&=\^D"dP>=c@84=A(0e/QB$:\4RW*$@hL=(WFWF;S?Lg6.t %qe^U0]c&;Y&6J:.Cd1b'/aD\,8$n*5MtZBEl>4-a&oU.]Ld,%<@Rs5uUcU"5^/ad@ZCRtn)#7Q1,PY;u&Ku_CBMD*B%(]B=W`W&/ %K#/8B'BdQLDiS;j16s90N2t\7nN[?BctR.>=e(8hU!q;[ZT&JZ6`6J@-bI'#k8ZPM$p$tgi#Xn#g)5"\Cr+qKkd3/0jOo-sk0RgT %crlloae@2/TT`ppm[QYBSO(+-^NPtV\e:@0G@*^\ofX;?C[0U36ALCUnL3mg>EO"sf,$7t,p\T^ %9M0Vu@sUbAbXW[4Qj0(&;s(;K=iY`&$t7oiV5i2rNZ?VCTMeQ]edDYD=a[ElIGDi*V$07AT,LRA3_M7B$DJ;MhtA^fJjIU--F3X1 %]f`tsUW59_Q)%)'-pLF3k;RYD!+6C9V%H'__[M+A<:dHcR>#NkdL[t6=j'".&lI)ca\D9cY5LZ:Vkdhpb%#cj7[$Mg;bXeLJc0RN %H$A#WUj89N\4IAY'"b1$;EnM`V$it!+>!?Tju#U&WS`WF%.ubjc&WSp;r-% %c(gliVFUM=?moW`;5V-;+@f0MY)`gCQKD)m^[f=:jVsQOOjqRS(R43I

    J9R22c^aY0]_)7P<+HCRIEOHf(0B1*V.:H#)2_5*$# %I&S0)9(]BT[JT_AE,s'tZkYl;'MdBM*>o2tGcl"'S/G+TqNPC^Fm_$=`_3]gL!<1DXUI9i*ZWPK+(fO2#7En*YX@5>_/`kYII14)TC>BkA1jr'phCsj"dRBR6Hf^;D(11q! %GeL5l3gCBlBr8+`J-\oQ;no,#KmL_LV(>RV7Wu:P-`QUZXWZ;+L_C3IS>is>*Krjk5]%KHJ,a'c/*T\oOB"*>b]lOEZ!;o %oSOO"gSQg?d`C$1g3p9:,4nQ!J/L/A;$PGl1/aaZ&"&IdSK0=-p%eIb)6'E;Soh;;7V^P(iA\aE<&.@FT*+RWkXBSKZ<'7[bU;5* %<9)RqCUg`2T+W=ZND!3p"rSTXi"q32+!p1&fa*4@W0do>n1h9&3bD:K3"8p55BrPp3"a(;q/^^PKeqo$gbfgAa0%O$.NG0!F\-qY %<&hmu?m*p?Y>dL<5@uJ5%a!$;DM2)VaM!iq5[oM]3an/,.X-rJQ$&rB'.CJ>d!u39Ff'2ATm7ZU[ut&Q]^+MX:14glW2&+8MJth# %#O4V[@t_g85WjknlAT/)>W?]Z;+<[P5+l\gC7HJ/98\GDhOiY7>]&t8]srGaF],?YR*=_[kP#/#n@Vm`o/0_fB57G.Mo+B5#./L6 %9+T@F!Tcr.$]I'^mTu#?q//:_/:MjkcGbs3Mf[[])j1J,BaRs'R=AtP-+c==-G(igDb3hbW&V\T-kY;DPsM1*UY(Rh74m1e1W+)B %f#k3I4!&L&&u_bSo]mQ^k7;K'7kF[qWAsarfOI %i`)/'SC`Y/f+#9UKun\J&W^lt`5qn/aT*^]e=Mn6@%$r:_H>2=W@"]2-0:LEQrIB>T%%/6hb$,qC8X[E$<(tKN&l6,/'/\%_Vo:V %%K`Q=<6X[KopI6QVsB&k]ni2@ol5-3N5k/J9hDhFJ75)ibnUeeV!(f4:d<8#P`Yc3Za-B)\EclnkdEUeHY:eFp;?6^9rF4K-\C!% %ZK[U>AiY)oSJo0]2OeUAbfAP#Ym#u3W,+L@\^()l&!fq&m"UUMZft.Sj?9g5Uta#PdM_OXS'7a.o!=-iTK5n-SPh)2H>Lp1flTiD %TgESAT%S4[^g0-j:?,Z7*OG!pEp9f6H-g@gV(%8^bCQt`P]H#aRaN@bl'.E2hU?hUCc\Ek@s")*B%&3.K=d`EWb9d0Fet^;Bf;GU %)e+TFVGkX6gBV26MP1Nup<'723^uu+J_rJW:=K=5(uufO\dMeu,L3.'')A3RFNQ?-LX)bql@@j8LWlVo8ftqcEY"U5VdqnoZsD*A %ACDt-K/.l`N@HmrLc=uG%X60p;c63+p%\.dVWf%MBCY1RCo[Ra!D5<]<_otSL'!(:C)pJ$le0X\bch/rPa&5lm=S2t.kuOFAE>X[,%<\i.:h#iE4iD:VKsTt,\Psh& %`#flebafh")TlHU48)DaD3]M;13\oHE^n?0G:I[CbagpE)iI&4 %/p!qVqe#3a."$4(Eu7.HmU/8BoK0t-UNP4a3GlSMRZ8#Ma4G#FIXXu)G8B/]Hb5us]g6hMQ3 %j)t5eafi^!UoGii25Bt8U:\o3.r7)?g\F6sWDPsZF"W3qeUmZ79KQcA<:c4!:egQ0:-%oc8)f`p(OCae&;FM7m7079HEhM7!@P79IJDKo>KaI[0ftL_m>T9PW!t@+R1L2:L>iQiCUVT%+Z7.aY$RiILX!ETN%rcWYIl1g6tO'a8jP. %MDWF,ERbok>GF'U[51bLk(h>0R'$p#_=2>[1m((fp/g8plI;6Q4.OF5?j61U0Ij3Z*Q&o1>t %.Y1>M>>2dRom>XSP*l$g'R@7%Sb(UF&#)2fG5%hDpol[po(d!Q"s6c<@o<>=B;qH-_T0P28n32"d;2n>Q\U3!D2u1/Z[I&4V%dCm %[^ujX&g_klR)C9@O.eDJ4*APZ:,,.8P/f&>]Tlj,)!6I%/]BCc'MV]segAe*CKu-&tr2NTJR^VAi@jdQY3+X8^V=E`S-$d;S,qR/1ra3 %9!i_YETV>YIQjA3ePI)qF2<\SkH-rFa@Y#P[c3eSJ-G5%h9@W*0;Q3.H@T^k-[8`,CI<0Wh`EFJps&"iM.Q/"U9>;\9T\ToFMPONst-WBQ[@.H-:NTth3qai=0 %DlT1BaCV35k,jrt>4J9+p#5(!D:"tW'&N;6KNlUJn1L?U.YG_kP2_2d6*Ick'VC5g'7diC9M[.G<+pJbW#bhAQf_AL\+DMEG-%(4 %7hq7`Nc7X\a]@dV9g;9u\6BY+(?ApGli`O1P?C=Vi"2-`0cBEkmT %gLVP"=WS2'0/dgYIuV)4fGVLD:Gq[R?V%.'@eO':D6R]SUR)pYpkO)[,b4C1lQ:aB2fN<0GH^[*4Ng1E5INda%-NQ5=tQ[/ %l!8950DXS;V(?;U8'U-uZX%o`Hd,#?9TRmI`^Z7SK@OlB2K7qedYsS-R=3M.9,4W;\qEcUZ7?#04.[qtZ822e#Y>"^=o[%V*IU>[ %OU#G,iFjj+/A@G7,76;,%&X0@C>X)?.`Y.7/mdOsGB`!FiENB3XW;lImDN""9EfB!VJ;889X[;!T/8eLjNse<=%=-F3]3joD]W %In,!od2YC\h9nP(T[=`E6WM?0?t-dCSjol]JLj']3IjT)Ct,ckNTXECK#?A$0Ub"PVJKeNdl6Y65X&[kCQi>`e%S9HZn&F&W[OK" %0AN^!q(.EWJD-fB/]stfOmOM1j\t;OLG$_^dGoue.E[FR5#_ROV\\AmYEj=PU3s!6/,(I7-_"#)I[6R_MBbH*%Aa8MFo?tR-rorp %l#%o'\pc`Z_X11O:Bb3DF*Dm2p1\Uop>-SC0^gqIs%(1OM-G:0g)ZG=1b!f2"q-e@Z`8canSZ+c@b\7GjeSW32cddO`\]eFbmk"VCXDIbG0=V:aXIrO@MBX]s'EYNr),EMf7i\7>At3:ql"5!mj`1Mb[YY+JU0 %Rm;+CAYnXW+u+BGQ-m0lg86L#.IC?kO+Xl]397JbO.`EZ\5"kUUX8sP11l_e%=mk@mY-1*QO6t^moeb.BTkh=/oh6F,TG#c:?lLC8j'!,)oDspmmpo8cJWQ1p;`#He[ %fWOOQ0^h:^g30[2IL:?2U+8Z$U[2"4:E6^R?.El6X>H.2)&SPJ:tJM7]K$M0Iuq6jg1I^[H@3?VlB]r[3rg-J=7t=M*hQS>>3Ya8 %mCIbD9(C$8P2E4E7pS@HWdYkSO/D4=mENZ[eb.BlEs*K;YHFL6?8AR-QWorDlMBo+leA,9T3sE2F:rLEJWp?Rb(iGlimTA(:"dEh'5IH[eZZZ5R:M_T-_pnA.NX&V/Y2,eST.7cuVL\YKP-GXGg'9Ucm+U:]qIp%MR-O6(L4i(P2Imk5m<8CY-FXG5l,Y,a=:-bO(f7uqgtFmZGF9/e#@q_ag)C>M#ZcLIu=G7?bQJS;Ch %h2.*rooI>lmIJ`cX::YU`8u(%qlWLCC@BEnld=e%*4jeXFikbLVj$k#^=n^QX(fIqo"OTVB%BUfe*UlMnf>.BR:ZqPrcIB!#''A='< %:4"4CGHoG6ol9CB6>G!7aC %i[9q[ZdC=r]AB",'V.4tM#-o-:tVZ.@N\]9rW9IrPudTV2.0XK?:$&ko*.V+eP]k70iT?1=)ZB@`4(WR$.e"&':'t9+#+b\@]ne^ %S>(r9\aR.(B^IAOLIok+:p*>h1@Xqq4S+$V]$+3LDjS1+,^!-[*8M%o0B\?&?7D.Tqhbejj%J4Vja/pI@<)/OIcmThY#MH4nMPT\ %+*Bprg724W(pp^-UQYX!0ZkB-mBjc^'9.VRZG@!\+Uq.Y2OW;_hF'n+r$_6pa8k%MI1e-hY@t@kXFF.qT6F\o\c!tjgr.K5P'^MQX>An %quYWoQN?WW7?Tp^6EE_6>S8GnBhDF#FUJ)CR(dpN:;614+4I$p+9Uh?J7gi3J1Bso*p#H(2!RU&W1Ri,?Q2f7.p)KngMQu\M8X!5 %&SdY[To8%m$u]@!r0HnAP65^Lk->hK5%RCo@*B\)%,bITQr8?;PIkaLM>Mp=97UA;Slb-(aB-$$ %W$"o#Z]WHDdZ)Fci]2o$Im$(qHn$gCd7@+;LK4brcpj^WuddR#@+mS`VaZ?[r %T&(AQU_Y?T[-g;>&f5D^gkg2VONmQgh4?e\ZYDgAmM.6NJ@-L9 %98oJS2^X:Q84_=J_a>ZlFF`dZ8<)CK*=a/>@DRV@W;(`Q#To[$Oap425@UsX#)f+)!dtkqT"V3d@>q"Y,'=KQ^H--2mM88=Yr<@n %+4iii@AL*ZKps6IjKkTtD/#C?*"baAI;::A%l77\M.V0It#s>]3sh#.c-!'mA8N+ %KFD[MC`DHEcZqrb3)=C0>Seh]kec.;\p7?08WP&l!L#BR+mm.]iuE;Jm*-3rG8W\H:gtD#Z4''rM\IIOk?!G+$k`GeK0AdhB.Bfd %En>tl&CP`t`Mq^hTgef,@42?+ft1=#H.i"Ba=E_//:>m-h-GVT!Ka:K'dH#Wg#oFcPoTEN7Z@=GQ(6s%5?T:FI!pX>XHErPs3FZd %;*578jZcloLOE#uTb")b$QS;AWoTh4,Gk;cX5pK<81E^B3&,m*NYt!4;1__`2kpKlT[B!P+/>7SD`P(UZ;m(#SIO_Xj`&ijrb#N(pG^R[Ci)mM6eQ(c>)c#Z_u>$;K]WQiDo+DY=dL5rLC:.CkY=q` %QX&K4;'&dY2lU]RSS4q_mQ44SP!\TK)iN2-992kcc66>sq*2W_k\#`Lg)0]]jqD?kpGYo1UL$H!\BJfI^5Mi9TiSQY"k=Zp^6)!j %pg&+q7DOT&<[(+JiQV&lP^C$hsili1ZL'KX:`C%W,rH9_(VT1\iFcHSrq//@ %ZLiag'@@3eR<0Z]<#BZc*S]+Y[L9;Pf:5]@,m::r.c#6!6XhJN#V2"a_,3D8]uUFHXQ]o;KKp-d$_Y\(/GJ.]jBoR*VHZ(B'qU7P %0'E0WGJpP,luFt>'EKjh2:#AOHU%^`D;`ABM1:+R\&$B[7d.I:irn:C$&`OOYcqOG@iI20j4LJ;O(7&m1qF#;9AL*\Hlp2N>MQ?I %fpkn!.EkF/!5IRDJc,U'5S+&a],hMC2E(u_pd]j:+k/Y<:4CDl\#%OtrP]GBRl,`>&(ffN+/LA&Wh+`TcLO<2Z;*hS%d(@aHm#q' %c[#FL&MKJ+Y$nA-*MdL&?*tbF!L$`P8G%-R*=!t%\hjqNXr,Q4=."d>=Z5$H%C$&_HQ^C9^$:0`5ia`,V"[KTUq%rYqpt(fnR'^S %(aZXG`rLA\e7Sai+"JHp5=L'mUOUQ+0&Zb9>U_H/T#7c@+EYhrj,?OAR'FiE)L=+ail`X:f]hG:=2A`FlW?h(G?:>/(:6R@odF*9[?I@SLe:\-ko9`2]6diQX;lYb)&KQ=pEa)aF;JD.Nl[9QUb3"ZdfTst?`I6KE6apOZ-6@W>b9O7"_S:0 %DtRe3ZNa^gGenOlk*1"=N4<3S>O5@9UsA(>.9if8jkWhD>Abn$h%4e7mFMD5%Tf9U/t15##pYC4bn+6]j.\Zb>RY&>)iT:X!o^MA %IFeAjZHpO6+54I8n'E%FP"ce[hqci!fQ>jXRTJWjd"&17D9Tr;GE$H"Q2m-1XsJHW'!i_IVbk,!Pe"(if'^r) %%\e;:\T:%I\lUcJ&0N1?G"%F)KmD]Efo7,,l96S#^/&/^AD:L3W]L0aIsW:++\X]ZAbSW?(@#1]*.GJ?^t7+SFWoVqSX+h/Amd:d %SP/)GPfuFPqZ=k#&:9_PjC,+FUTf'=P`&kiDOhMX(Ktl:7(<<@&X>\h`t(%k?bYe;r6kA#@(t_1cf"@b71QR8,h8b$.-H32K2p6I %MK6uFd>?BET;%k9,&:Z\r21t+]\1K-klA!t'*G>nc4NJo#JJiV^KJa/;s6qE6F(HMH;(@(qN;JcneO[sH/#hVk4t0LA:gX&p3B_&q#_5r&l_BT+?]7)CIs8e^/k!d.1( %LN2r\4;*T<2o5Z*2H2LGUkj7`ngk9dM?72&0K"A.D+-h2E%?0eqVIeSSgCHr*iAHpoNsGq31a&.JNA7`GJ*@W[]bYA*2bNrG]G$$PhqX=%HD_oguTE0LiBGXN1,(ksSq^.+)+M(j#RD4#2b5rp"'5QW@nGGo:> %_,rN2`f8@'BYjoD%7p^JnZWk5pe`;oV^qg4((>sQ=CW&O/f5!K-4KJinc"Y:oH+t?(k>LM.RE',#^coO,0U6:TNfnP(!#X:WA*p* %9E\kp"\k'qS+7?e"SG7u"LLq^aiOHn!K[(Dhp<(a&Zd0MZC%)RdDCH^E5OBF*_cuiJ.N(tKn]^u@>4tGiCO,d!R@A,'=^:%J9rPr %'VI+<)A,1A',60ag&j)C%:ae'^e(aqOoYaf$^SVj1$fG?!#cG-UA]%_U#'2,MI7)D@WAH\g<^4N(8]&nh\\&@6c2J6]sq>'t!HaTOTO5Q5'U#7VN!@R!&P^KV$*q&]?#p@#U+"3t#Rb!f$!6Y`pGkSf9eb-l,`p.Yaf@L$_2?'#XrE^`Z)+*>`ZG!lR>nRD*>Qm4Wo$ %No:!PnV#s0C^%ZA'E8IV")K\9C;oX,,T9@pLmV_FU;-n@(f4J<-qF[H$U,J*#&SdQ!b+pCn[=)_Y+iH/#nUNCGZGVFK:*phK*N)* %([[/p$Gp+]':>ds~> %AI9_PrivateDataEnd bind9-9.9.5.dfsg/doc/arm/Bv9ARM.pdf0000644000470500017500000501235112271526120016062 0ustar lamontlamont%PDF-1.4 5 0 obj << /S /GoTo /D (chapter.1) >> endobj 8 0 obj (1 Introduction) endobj 9 0 obj << /S /GoTo /D (section.1.1) >> endobj 12 0 obj (1.1 Scope of Document) endobj 13 0 obj << /S /GoTo /D (section.1.2) >> endobj 16 0 obj (1.2 Organization of This Document) endobj 17 0 obj << /S /GoTo /D (section.1.3) >> endobj 20 0 obj (1.3 Conventions Used in This Document) endobj 21 0 obj << /S /GoTo /D (section.1.4) >> endobj 24 0 obj (1.4 The Domain Name System \(DNS\)) endobj 25 0 obj << /S /GoTo /D (subsection.1.4.1) >> endobj 28 0 obj (1.4.1 DNS Fundamentals) endobj 29 0 obj << /S /GoTo /D (subsection.1.4.2) >> endobj 32 0 obj (1.4.2 Domains and Domain Names) endobj 33 0 obj << /S /GoTo /D (subsection.1.4.3) >> endobj 36 0 obj (1.4.3 Zones) endobj 37 0 obj << /S /GoTo /D (subsection.1.4.4) >> endobj 40 0 obj (1.4.4 Authoritative Name Servers) endobj 41 0 obj << /S /GoTo /D (subsubsection.1.4.4.1) >> endobj 44 0 obj (1.4.4.1 The Primary Master) endobj 45 0 obj << /S /GoTo /D (subsubsection.1.4.4.2) >> endobj 48 0 obj (1.4.4.2 Slave Servers) endobj 49 0 obj << /S /GoTo /D (subsubsection.1.4.4.3) >> endobj 52 0 obj (1.4.4.3 Stealth Servers) endobj 53 0 obj << /S /GoTo /D (subsection.1.4.5) >> endobj 56 0 obj (1.4.5 Caching Name Servers) endobj 57 0 obj << /S /GoTo /D (subsubsection.1.4.5.1) >> endobj 60 0 obj (1.4.5.1 Forwarding) endobj 61 0 obj << /S /GoTo /D (subsection.1.4.6) >> endobj 64 0 obj (1.4.6 Name Servers in Multiple Roles) endobj 65 0 obj << /S /GoTo /D (chapter.2) >> endobj 68 0 obj (2 BIND Resource Requirements) endobj 69 0 obj << /S /GoTo /D (section.2.1) >> endobj 72 0 obj (2.1 Hardware requirements) endobj 73 0 obj << /S /GoTo /D (section.2.2) >> endobj 76 0 obj (2.2 CPU Requirements) endobj 77 0 obj << /S /GoTo /D (section.2.3) >> endobj 80 0 obj (2.3 Memory Requirements) endobj 81 0 obj << /S /GoTo /D (section.2.4) >> endobj 84 0 obj (2.4 Name Server Intensive Environment Issues) endobj 85 0 obj << /S /GoTo /D (section.2.5) >> endobj 88 0 obj (2.5 Supported Operating Systems) endobj 89 0 obj << /S /GoTo /D (chapter.3) >> endobj 92 0 obj (3 Name Server Configuration) endobj 93 0 obj << /S /GoTo /D (section.3.1) >> endobj 96 0 obj (3.1 Sample Configurations) endobj 97 0 obj << /S /GoTo /D (subsection.3.1.1) >> endobj 100 0 obj (3.1.1 A Caching-only Name Server) endobj 101 0 obj << /S /GoTo /D (subsection.3.1.2) >> endobj 104 0 obj (3.1.2 An Authoritative-only Name Server) endobj 105 0 obj << /S /GoTo /D (section.3.2) >> endobj 108 0 obj (3.2 Load Balancing) endobj 109 0 obj << /S /GoTo /D (section.3.3) >> endobj 112 0 obj (3.3 Name Server Operations) endobj 113 0 obj << /S /GoTo /D (subsection.3.3.1) >> endobj 116 0 obj (3.3.1 Tools for Use With the Name Server Daemon) endobj 117 0 obj << /S /GoTo /D (subsubsection.3.3.1.1) >> endobj 120 0 obj (3.3.1.1 Diagnostic Tools) endobj 121 0 obj << /S /GoTo /D (subsubsection.3.3.1.2) >> endobj 124 0 obj (3.3.1.2 Administrative Tools) endobj 125 0 obj << /S /GoTo /D (subsection.3.3.2) >> endobj 128 0 obj (3.3.2 Signals) endobj 129 0 obj << /S /GoTo /D (chapter.4) >> endobj 132 0 obj (4 Advanced DNS Features) endobj 133 0 obj << /S /GoTo /D (section.4.1) >> endobj 136 0 obj (4.1 Notify) endobj 137 0 obj << /S /GoTo /D (section.4.2) >> endobj 140 0 obj (4.2 Dynamic Update) endobj 141 0 obj << /S /GoTo /D (subsection.4.2.1) >> endobj 144 0 obj (4.2.1 The journal file) endobj 145 0 obj << /S /GoTo /D (section.4.3) >> endobj 148 0 obj (4.3 Incremental Zone Transfers \(IXFR\)) endobj 149 0 obj << /S /GoTo /D (section.4.4) >> endobj 152 0 obj (4.4 Split DNS) endobj 153 0 obj << /S /GoTo /D (subsection.4.4.1) >> endobj 156 0 obj (4.4.1 Example split DNS setup) endobj 157 0 obj << /S /GoTo /D (section.4.5) >> endobj 160 0 obj (4.5 TSIG) endobj 161 0 obj << /S /GoTo /D (subsection.4.5.1) >> endobj 164 0 obj (4.5.1 Generate Shared Keys for Each Pair of Hosts) endobj 165 0 obj << /S /GoTo /D (subsubsection.4.5.1.1) >> endobj 168 0 obj (4.5.1.1 Automatic Generation) endobj 169 0 obj << /S /GoTo /D (subsubsection.4.5.1.2) >> endobj 172 0 obj (4.5.1.2 Manual Generation) endobj 173 0 obj << /S /GoTo /D (subsection.4.5.2) >> endobj 176 0 obj (4.5.2 Copying the Shared Secret to Both Machines) endobj 177 0 obj << /S /GoTo /D (subsection.4.5.3) >> endobj 180 0 obj (4.5.3 Informing the Servers of the Key's Existence) endobj 181 0 obj << /S /GoTo /D (subsection.4.5.4) >> endobj 184 0 obj (4.5.4 Instructing the Server to Use the Key) endobj 185 0 obj << /S /GoTo /D (subsection.4.5.5) >> endobj 188 0 obj (4.5.5 TSIG Key Based Access Control) endobj 189 0 obj << /S /GoTo /D (subsection.4.5.6) >> endobj 192 0 obj (4.5.6 Errors) endobj 193 0 obj << /S /GoTo /D (section.4.6) >> endobj 196 0 obj (4.6 TKEY) endobj 197 0 obj << /S /GoTo /D (section.4.7) >> endobj 200 0 obj (4.7 SIG\(0\)) endobj 201 0 obj << /S /GoTo /D (section.4.8) >> endobj 204 0 obj (4.8 DNSSEC) endobj 205 0 obj << /S /GoTo /D (subsection.4.8.1) >> endobj 208 0 obj (4.8.1 Generating Keys) endobj 209 0 obj << /S /GoTo /D (subsection.4.8.2) >> endobj 212 0 obj (4.8.2 Signing the Zone) endobj 213 0 obj << /S /GoTo /D (subsection.4.8.3) >> endobj 216 0 obj (4.8.3 Configuring Servers) endobj 217 0 obj << /S /GoTo /D (section.4.9) >> endobj 220 0 obj (4.9 DNSSEC, Dynamic Zones, and Automatic Signing) endobj 221 0 obj << /S /GoTo /D (subsection.4.9.1) >> endobj 224 0 obj (4.9.1 Converting from insecure to secure) endobj 225 0 obj << /S /GoTo /D (subsection.4.9.2) >> endobj 228 0 obj (4.9.2 Dynamic DNS update method) endobj 229 0 obj << /S /GoTo /D (subsection.4.9.3) >> endobj 232 0 obj (4.9.3 Fully automatic zone signing) endobj 233 0 obj << /S /GoTo /D (subsection.4.9.4) >> endobj 236 0 obj (4.9.4 Private-type records) endobj 237 0 obj << /S /GoTo /D (subsection.4.9.5) >> endobj 240 0 obj (4.9.5 DNSKEY rollovers) endobj 241 0 obj << /S /GoTo /D (subsection.4.9.6) >> endobj 244 0 obj (4.9.6 Dynamic DNS update method) endobj 245 0 obj << /S /GoTo /D (subsection.4.9.7) >> endobj 248 0 obj (4.9.7 Automatic key rollovers) endobj 249 0 obj << /S /GoTo /D (subsection.4.9.8) >> endobj 252 0 obj (4.9.8 NSEC3PARAM rollovers via UPDATE) endobj 253 0 obj << /S /GoTo /D (subsection.4.9.9) >> endobj 256 0 obj (4.9.9 Converting from NSEC to NSEC3) endobj 257 0 obj << /S /GoTo /D (subsection.4.9.10) >> endobj 260 0 obj (4.9.10 Converting from NSEC3 to NSEC) endobj 261 0 obj << /S /GoTo /D (subsection.4.9.11) >> endobj 264 0 obj (4.9.11 Converting from secure to insecure) endobj 265 0 obj << /S /GoTo /D (subsection.4.9.12) >> endobj 268 0 obj (4.9.12 Periodic re-signing) endobj 269 0 obj << /S /GoTo /D (subsection.4.9.13) >> endobj 272 0 obj (4.9.13 NSEC3 and OPTOUT) endobj 273 0 obj << /S /GoTo /D (section.4.10) >> endobj 276 0 obj (4.10 Dynamic Trust Anchor Management) endobj 277 0 obj << /S /GoTo /D (subsection.4.10.1) >> endobj 280 0 obj (4.10.1 Validating Resolver) endobj 281 0 obj << /S /GoTo /D (subsection.4.10.2) >> endobj 284 0 obj (4.10.2 Authoritative Server) endobj 285 0 obj << /S /GoTo /D (section.4.11) >> endobj 288 0 obj (4.11 PKCS \04311 \(Cryptoki\) support) endobj 289 0 obj << /S /GoTo /D (subsection.4.11.1) >> endobj 292 0 obj (4.11.1 Prerequisites) endobj 293 0 obj << /S /GoTo /D (subsubsection.4.11.1.1) >> endobj 296 0 obj (4.11.1.1 Building OpenSSL for the AEP Keyper on Linux) endobj 297 0 obj << /S /GoTo /D (subsubsection.4.11.1.2) >> endobj 300 0 obj (4.11.1.2 Building OpenSSL for the SCA 6000 on Solaris) endobj 301 0 obj << /S /GoTo /D (subsubsection.4.11.1.3) >> endobj 304 0 obj (4.11.1.3 Building OpenSSL for SoftHSM) endobj 305 0 obj << /S /GoTo /D (subsection.4.11.2) >> endobj 308 0 obj (4.11.2 Building BIND 9 with PKCS\04311) endobj 309 0 obj << /S /GoTo /D (subsubsection.4.11.2.1) >> endobj 312 0 obj (4.11.2.1 Configuring BIND 9 for Linux with the AEP Keyper) endobj 313 0 obj << /S /GoTo /D (subsubsection.4.11.2.2) >> endobj 316 0 obj (4.11.2.2 Configuring BIND 9 for Solaris with the SCA 6000) endobj 317 0 obj << /S /GoTo /D (subsubsection.4.11.2.3) >> endobj 320 0 obj (4.11.2.3 Configuring BIND 9 for SoftHSM) endobj 321 0 obj << /S /GoTo /D (subsection.4.11.3) >> endobj 324 0 obj (4.11.3 PKCS \04311 Tools) endobj 325 0 obj << /S /GoTo /D (subsection.4.11.4) >> endobj 328 0 obj (4.11.4 Using the HSM) endobj 329 0 obj << /S /GoTo /D (subsection.4.11.5) >> endobj 332 0 obj (4.11.5 Specifying the engine on the command line) endobj 333 0 obj << /S /GoTo /D (subsection.4.11.6) >> endobj 336 0 obj (4.11.6 Running named with automatic zone re-signing) endobj 337 0 obj << /S /GoTo /D (section.4.12) >> endobj 340 0 obj (4.12 IPv6 Support in BIND 9) endobj 341 0 obj << /S /GoTo /D (subsection.4.12.1) >> endobj 344 0 obj (4.12.1 Address Lookups Using AAAA Records) endobj 345 0 obj << /S /GoTo /D (subsection.4.12.2) >> endobj 348 0 obj (4.12.2 Address to Name Lookups Using Nibble Format) endobj 349 0 obj << /S /GoTo /D (chapter.5) >> endobj 352 0 obj (5 The BIND 9 Lightweight Resolver) endobj 353 0 obj << /S /GoTo /D (section.5.1) >> endobj 356 0 obj (5.1 The Lightweight Resolver Library) endobj 357 0 obj << /S /GoTo /D (section.5.2) >> endobj 360 0 obj (5.2 Running a Resolver Daemon) endobj 361 0 obj << /S /GoTo /D (chapter.6) >> endobj 364 0 obj (6 BIND 9 Configuration Reference) endobj 365 0 obj << /S /GoTo /D (section.6.1) >> endobj 368 0 obj (6.1 Configuration File Elements) endobj 369 0 obj << /S /GoTo /D (subsection.6.1.1) >> endobj 372 0 obj (6.1.1 Address Match Lists) endobj 373 0 obj << /S /GoTo /D (subsubsection.6.1.1.1) >> endobj 376 0 obj (6.1.1.1 Syntax) endobj 377 0 obj << /S /GoTo /D (subsubsection.6.1.1.2) >> endobj 380 0 obj (6.1.1.2 Definition and Usage) endobj 381 0 obj << /S /GoTo /D (subsection.6.1.2) >> endobj 384 0 obj (6.1.2 Comment Syntax) endobj 385 0 obj << /S /GoTo /D (subsubsection.6.1.2.1) >> endobj 388 0 obj (6.1.2.1 Syntax) endobj 389 0 obj << /S /GoTo /D (subsubsection.6.1.2.2) >> endobj 392 0 obj (6.1.2.2 Definition and Usage) endobj 393 0 obj << /S /GoTo /D (section.6.2) >> endobj 396 0 obj (6.2 Configuration File Grammar) endobj 397 0 obj << /S /GoTo /D (subsection.6.2.1) >> endobj 400 0 obj (6.2.1 acl Statement Grammar) endobj 401 0 obj << /S /GoTo /D (subsection.6.2.2) >> endobj 404 0 obj (6.2.2 acl Statement Definition and Usage) endobj 405 0 obj << /S /GoTo /D (subsection.6.2.3) >> endobj 408 0 obj (6.2.3 controls Statement Grammar) endobj 409 0 obj << /S /GoTo /D (subsection.6.2.4) >> endobj 412 0 obj (6.2.4 controls Statement Definition and Usage) endobj 413 0 obj << /S /GoTo /D (subsection.6.2.5) >> endobj 416 0 obj (6.2.5 include Statement Grammar) endobj 417 0 obj << /S /GoTo /D (subsection.6.2.6) >> endobj 420 0 obj (6.2.6 include Statement Definition and Usage) endobj 421 0 obj << /S /GoTo /D (subsection.6.2.7) >> endobj 424 0 obj (6.2.7 key Statement Grammar) endobj 425 0 obj << /S /GoTo /D (subsection.6.2.8) >> endobj 428 0 obj (6.2.8 key Statement Definition and Usage) endobj 429 0 obj << /S /GoTo /D (subsection.6.2.9) >> endobj 432 0 obj (6.2.9 logging Statement Grammar) endobj 433 0 obj << /S /GoTo /D (subsection.6.2.10) >> endobj 436 0 obj (6.2.10 logging Statement Definition and Usage) endobj 437 0 obj << /S /GoTo /D (subsubsection.6.2.10.1) >> endobj 440 0 obj (6.2.10.1 The channel Phrase) endobj 441 0 obj << /S /GoTo /D (subsubsection.6.2.10.2) >> endobj 444 0 obj (6.2.10.2 The category Phrase) endobj 445 0 obj << /S /GoTo /D (subsubsection.6.2.10.3) >> endobj 448 0 obj (6.2.10.3 The query-errors Category) endobj 449 0 obj << /S /GoTo /D (subsection.6.2.11) >> endobj 452 0 obj (6.2.11 lwres Statement Grammar) endobj 453 0 obj << /S /GoTo /D (subsection.6.2.12) >> endobj 456 0 obj (6.2.12 lwres Statement Definition and Usage) endobj 457 0 obj << /S /GoTo /D (subsection.6.2.13) >> endobj 460 0 obj (6.2.13 masters Statement Grammar) endobj 461 0 obj << /S /GoTo /D (subsection.6.2.14) >> endobj 464 0 obj (6.2.14 masters Statement Definition and Usage) endobj 465 0 obj << /S /GoTo /D (subsection.6.2.15) >> endobj 468 0 obj (6.2.15 options Statement Grammar) endobj 469 0 obj << /S /GoTo /D (subsection.6.2.16) >> endobj 472 0 obj (6.2.16 options Statement Definition and Usage) endobj 473 0 obj << /S /GoTo /D (subsubsection.6.2.16.1) >> endobj 476 0 obj (6.2.16.1 Boolean Options) endobj 477 0 obj << /S /GoTo /D (subsubsection.6.2.16.2) >> endobj 480 0 obj (6.2.16.2 Forwarding) endobj 481 0 obj << /S /GoTo /D (subsubsection.6.2.16.3) >> endobj 484 0 obj (6.2.16.3 Dual-stack Servers) endobj 485 0 obj << /S /GoTo /D (subsubsection.6.2.16.4) >> endobj 488 0 obj (6.2.16.4 Access Control) endobj 489 0 obj << /S /GoTo /D (subsubsection.6.2.16.5) >> endobj 492 0 obj (6.2.16.5 Interfaces) endobj 493 0 obj << /S /GoTo /D (subsubsection.6.2.16.6) >> endobj 496 0 obj (6.2.16.6 Query Address) endobj 497 0 obj << /S /GoTo /D (subsubsection.6.2.16.7) >> endobj 500 0 obj (6.2.16.7 Zone Transfers) endobj 501 0 obj << /S /GoTo /D (subsubsection.6.2.16.8) >> endobj 504 0 obj (6.2.16.8 UDP Port Lists) endobj 505 0 obj << /S /GoTo /D (subsubsection.6.2.16.9) >> endobj 508 0 obj (6.2.16.9 Operating System Resource Limits) endobj 509 0 obj << /S /GoTo /D (subsubsection.6.2.16.10) >> endobj 512 0 obj (6.2.16.10 Server Resource Limits) endobj 513 0 obj << /S /GoTo /D (subsubsection.6.2.16.11) >> endobj 516 0 obj (6.2.16.11 Periodic Task Intervals) endobj 517 0 obj << /S /GoTo /D (subsubsection.6.2.16.12) >> endobj 520 0 obj (6.2.16.12 Topology) endobj 521 0 obj << /S /GoTo /D (subsubsection.6.2.16.13) >> endobj 524 0 obj (6.2.16.13 The sortlist Statement) endobj 525 0 obj << /S /GoTo /D (subsubsection.6.2.16.14) >> endobj 528 0 obj (6.2.16.14 RRset Ordering) endobj 529 0 obj << /S /GoTo /D (subsubsection.6.2.16.15) >> endobj 532 0 obj (6.2.16.15 Tuning) endobj 533 0 obj << /S /GoTo /D (subsubsection.6.2.16.16) >> endobj 536 0 obj (6.2.16.16 Built-in server information zones) endobj 537 0 obj << /S /GoTo /D (subsubsection.6.2.16.17) >> endobj 540 0 obj (6.2.16.17 Built-in Empty Zones) endobj 541 0 obj << /S /GoTo /D (subsubsection.6.2.16.18) >> endobj 544 0 obj (6.2.16.18 Additional Section Caching) endobj 545 0 obj << /S /GoTo /D (subsubsection.6.2.16.19) >> endobj 548 0 obj (6.2.16.19 Content Filtering) endobj 549 0 obj << /S /GoTo /D (subsubsection.6.2.16.20) >> endobj 552 0 obj (6.2.16.20 Response Policy Zone \(RPZ\) Rewriting) endobj 553 0 obj << /S /GoTo /D (subsubsection.6.2.16.21) >> endobj 556 0 obj (6.2.16.21 Response Rate Limiting) endobj 557 0 obj << /S /GoTo /D (subsection.6.2.17) >> endobj 560 0 obj (6.2.17 server Statement Grammar) endobj 561 0 obj << /S /GoTo /D (subsection.6.2.18) >> endobj 564 0 obj (6.2.18 server Statement Definition and Usage) endobj 565 0 obj << /S /GoTo /D (subsection.6.2.19) >> endobj 568 0 obj (6.2.19 statistics-channels Statement Grammar) endobj 569 0 obj << /S /GoTo /D (subsection.6.2.20) >> endobj 572 0 obj (6.2.20 statistics-channels Statement Definition and Usage) endobj 573 0 obj << /S /GoTo /D (subsection.6.2.21) >> endobj 576 0 obj (6.2.21 trusted-keys Statement Grammar) endobj 577 0 obj << /S /GoTo /D (subsection.6.2.22) >> endobj 580 0 obj (6.2.22 trusted-keys Statement Definition and Usage) endobj 581 0 obj << /S /GoTo /D (subsection.6.2.23) >> endobj 584 0 obj (6.2.23 managed-keys Statement Grammar) endobj 585 0 obj << /S /GoTo /D (subsection.6.2.24) >> endobj 588 0 obj (6.2.24 managed-keys Statement Definition and Usage) endobj 589 0 obj << /S /GoTo /D (subsection.6.2.25) >> endobj 592 0 obj (6.2.25 view Statement Grammar) endobj 593 0 obj << /S /GoTo /D (subsection.6.2.26) >> endobj 596 0 obj (6.2.26 view Statement Definition and Usage) endobj 597 0 obj << /S /GoTo /D (subsection.6.2.27) >> endobj 600 0 obj (6.2.27 zone Statement Grammar) endobj 601 0 obj << /S /GoTo /D (subsection.6.2.28) >> endobj 604 0 obj (6.2.28 zone Statement Definition and Usage) endobj 605 0 obj << /S /GoTo /D (subsubsection.6.2.28.1) >> endobj 608 0 obj (6.2.28.1 Zone Types) endobj 609 0 obj << /S /GoTo /D (subsubsection.6.2.28.2) >> endobj 612 0 obj (6.2.28.2 Class) endobj 613 0 obj << /S /GoTo /D (subsubsection.6.2.28.3) >> endobj 616 0 obj (6.2.28.3 Zone Options) endobj 617 0 obj << /S /GoTo /D (subsubsection.6.2.28.4) >> endobj 620 0 obj (6.2.28.4 Dynamic Update Policies) endobj 621 0 obj << /S /GoTo /D (section.6.3) >> endobj 624 0 obj (6.3 Zone File) endobj 625 0 obj << /S /GoTo /D (subsection.6.3.1) >> endobj 628 0 obj (6.3.1 Types of Resource Records and When to Use Them) endobj 629 0 obj << /S /GoTo /D (subsubsection.6.3.1.1) >> endobj 632 0 obj (6.3.1.1 Resource Records) endobj 633 0 obj << /S /GoTo /D (subsubsection.6.3.1.2) >> endobj 636 0 obj (6.3.1.2 Textual expression of RRs) endobj 637 0 obj << /S /GoTo /D (subsection.6.3.2) >> endobj 640 0 obj (6.3.2 Discussion of MX Records) endobj 641 0 obj << /S /GoTo /D (subsection.6.3.3) >> endobj 644 0 obj (6.3.3 Setting TTLs) endobj 645 0 obj << /S /GoTo /D (subsection.6.3.4) >> endobj 648 0 obj (6.3.4 Inverse Mapping in IPv4) endobj 649 0 obj << /S /GoTo /D (subsection.6.3.5) >> endobj 652 0 obj (6.3.5 Other Zone File Directives) endobj 653 0 obj << /S /GoTo /D (subsubsection.6.3.5.1) >> endobj 656 0 obj (6.3.5.1 The @ \(at-sign\)) endobj 657 0 obj << /S /GoTo /D (subsubsection.6.3.5.2) >> endobj 660 0 obj (6.3.5.2 The \044ORIGIN Directive) endobj 661 0 obj << /S /GoTo /D (subsubsection.6.3.5.3) >> endobj 664 0 obj (6.3.5.3 The \044INCLUDE Directive) endobj 665 0 obj << /S /GoTo /D (subsubsection.6.3.5.4) >> endobj 668 0 obj (6.3.5.4 The \044TTL Directive) endobj 669 0 obj << /S /GoTo /D (subsection.6.3.6) >> endobj 672 0 obj (6.3.6 BIND Master File Extension: the \044GENERATE Directive) endobj 673 0 obj << /S /GoTo /D (subsection.6.3.7) >> endobj 676 0 obj (6.3.7 Additional File Formats) endobj 677 0 obj << /S /GoTo /D (section.6.4) >> endobj 680 0 obj (6.4 BIND9 Statistics) endobj 681 0 obj << /S /GoTo /D (subsubsection.6.4.0.1) >> endobj 684 0 obj (6.4.0.1 The Statistics File) endobj 685 0 obj << /S /GoTo /D (subsection.6.4.1) >> endobj 688 0 obj (6.4.1 Statistics Counters) endobj 689 0 obj << /S /GoTo /D (subsubsection.6.4.1.1) >> endobj 692 0 obj (6.4.1.1 Name Server Statistics Counters) endobj 693 0 obj << /S /GoTo /D (subsubsection.6.4.1.2) >> endobj 696 0 obj (6.4.1.2 Zone Maintenance Statistics Counters) endobj 697 0 obj << /S /GoTo /D (subsubsection.6.4.1.3) >> endobj 700 0 obj (6.4.1.3 Resolver Statistics Counters) endobj 701 0 obj << /S /GoTo /D (subsubsection.6.4.1.4) >> endobj 704 0 obj (6.4.1.4 Socket I/O Statistics Counters) endobj 705 0 obj << /S /GoTo /D (subsubsection.6.4.1.5) >> endobj 708 0 obj (6.4.1.5 Compatibility with BIND 8 Counters) endobj 709 0 obj << /S /GoTo /D (chapter.7) >> endobj 712 0 obj (7 BIND 9 Security Considerations) endobj 713 0 obj << /S /GoTo /D (section.7.1) >> endobj 716 0 obj (7.1 Access Control Lists) endobj 717 0 obj << /S /GoTo /D (section.7.2) >> endobj 720 0 obj (7.2 Chroot and Setuid) endobj 721 0 obj << /S /GoTo /D (subsection.7.2.1) >> endobj 724 0 obj (7.2.1 The chroot Environment) endobj 725 0 obj << /S /GoTo /D (subsection.7.2.2) >> endobj 728 0 obj (7.2.2 Using the setuid Function) endobj 729 0 obj << /S /GoTo /D (section.7.3) >> endobj 732 0 obj (7.3 Dynamic Update Security) endobj 733 0 obj << /S /GoTo /D (chapter.8) >> endobj 736 0 obj (8 Troubleshooting) endobj 737 0 obj << /S /GoTo /D (section.8.1) >> endobj 740 0 obj (8.1 Common Problems) endobj 741 0 obj << /S /GoTo /D (subsection.8.1.1) >> endobj 744 0 obj (8.1.1 It's not working; how can I figure out what's wrong?) endobj 745 0 obj << /S /GoTo /D (section.8.2) >> endobj 748 0 obj (8.2 Incrementing and Changing the Serial Number) endobj 749 0 obj << /S /GoTo /D (section.8.3) >> endobj 752 0 obj (8.3 Where Can I Get Help?) endobj 753 0 obj << /S /GoTo /D (appendix.A) >> endobj 756 0 obj (A Appendices) endobj 757 0 obj << /S /GoTo /D (section.A.1) >> endobj 760 0 obj (A.1 Acknowledgments) endobj 761 0 obj << /S /GoTo /D (subsection.A.1.1) >> endobj 764 0 obj (A.1.1 A Brief History of the DNS and BIND) endobj 765 0 obj << /S /GoTo /D (section.A.2) >> endobj 768 0 obj (A.2 General DNS Reference Information) endobj 769 0 obj << /S /GoTo /D (subsection.A.2.1) >> endobj 772 0 obj (A.2.1 IPv6 addresses \(AAAA\)) endobj 773 0 obj << /S /GoTo /D (section.A.3) >> endobj 776 0 obj (A.3 Bibliography \(and Suggested Reading\)) endobj 777 0 obj << /S /GoTo /D (subsection.A.3.1) >> endobj 780 0 obj (A.3.1 Request for Comments \(RFCs\)) endobj 781 0 obj << /S /GoTo /D (subsection.A.3.2) >> endobj 784 0 obj (A.3.2 Internet Drafts) endobj 785 0 obj << /S /GoTo /D (subsection.A.3.3) >> endobj 788 0 obj (A.3.3 Other Documents About BIND) endobj 789 0 obj << /S /GoTo /D (section.A.4) >> endobj 792 0 obj (A.4 BIND 9 DNS Library Support) endobj 793 0 obj << /S /GoTo /D (subsection.A.4.1) >> endobj 796 0 obj (A.4.1 Prerequisite) endobj 797 0 obj << /S /GoTo /D (subsection.A.4.2) >> endobj 800 0 obj (A.4.2 Compilation) endobj 801 0 obj << /S /GoTo /D (subsection.A.4.3) >> endobj 804 0 obj (A.4.3 Installation) endobj 805 0 obj << /S /GoTo /D (subsection.A.4.4) >> endobj 808 0 obj (A.4.4 Known Defects/Restrictions) endobj 809 0 obj << /S /GoTo /D (subsection.A.4.5) >> endobj 812 0 obj (A.4.5 The dns.conf File) endobj 813 0 obj << /S /GoTo /D (subsection.A.4.6) >> endobj 816 0 obj (A.4.6 Sample Applications) endobj 817 0 obj << /S /GoTo /D (subsubsection.A.4.6.1) >> endobj 820 0 obj (A.4.6.1 sample: a simple stub resolver utility) endobj 821 0 obj << /S /GoTo /D (subsubsection.A.4.6.2) >> endobj 824 0 obj (A.4.6.2 sample-async: a simple stub resolver, working asynchronously) endobj 825 0 obj << /S /GoTo /D (subsubsection.A.4.6.3) >> endobj 828 0 obj (A.4.6.3 sample-request: a simple DNS transaction client) endobj 829 0 obj << /S /GoTo /D (subsubsection.A.4.6.4) >> endobj 832 0 obj (A.4.6.4 sample-gai: getaddrinfo\(\) and getnameinfo\(\) test code) endobj 833 0 obj << /S /GoTo /D (subsubsection.A.4.6.5) >> endobj 836 0 obj (A.4.6.5 sample-update: a simple dynamic update client program) endobj 837 0 obj << /S /GoTo /D (subsubsection.A.4.6.6) >> endobj 840 0 obj (A.4.6.6 nsprobe: domain/name server checker in terms of RFC 4074) endobj 841 0 obj << /S /GoTo /D (subsection.A.4.7) >> endobj 844 0 obj (A.4.7 Library References) endobj 845 0 obj << /S /GoTo /D (appendix.B) >> endobj 848 0 obj (B Manual pages) endobj 849 0 obj << /S /GoTo /D (section.B.1) >> endobj 852 0 obj (B.1 dig) endobj 853 0 obj << /S /GoTo /D (section.B.2) >> endobj 856 0 obj (B.2 host) endobj 857 0 obj << /S /GoTo /D (section.B.3) >> endobj 860 0 obj (B.3 dnssec-checkds) endobj 861 0 obj << /S /GoTo /D (section.B.4) >> endobj 864 0 obj (B.4 dnssec-coverage) endobj 865 0 obj << /S /GoTo /D (section.B.5) >> endobj 868 0 obj (B.5 dnssec-dsfromkey) endobj 869 0 obj << /S /GoTo /D (section.B.6) >> endobj 872 0 obj (B.6 dnssec-keyfromlabel) endobj 873 0 obj << /S /GoTo /D (section.B.7) >> endobj 876 0 obj (B.7 dnssec-keygen) endobj 877 0 obj << /S /GoTo /D (section.B.8) >> endobj 880 0 obj (B.8 dnssec-revoke) endobj 881 0 obj << /S /GoTo /D (section.B.9) >> endobj 884 0 obj (B.9 dnssec-settime) endobj 885 0 obj << /S /GoTo /D (section.B.10) >> endobj 888 0 obj (B.10 dnssec-signzone) endobj 889 0 obj << /S /GoTo /D (section.B.11) >> endobj 892 0 obj (B.11 dnssec-verify) endobj 893 0 obj << /S /GoTo /D (section.B.12) >> endobj 896 0 obj (B.12 named-checkconf) endobj 897 0 obj << /S /GoTo /D (section.B.13) >> endobj 900 0 obj (B.13 named-checkzone) endobj 901 0 obj << /S /GoTo /D (section.B.14) >> endobj 904 0 obj (B.14 named) endobj 905 0 obj << /S /GoTo /D (section.B.15) >> endobj 908 0 obj (B.15 named-journalprint) endobj 909 0 obj << /S /GoTo /D (section.B.16) >> endobj 912 0 obj (B.16 nsupdate) endobj 913 0 obj << /S /GoTo /D (section.B.17) >> endobj 916 0 obj (B.17 rndc) endobj 917 0 obj << /S /GoTo /D (section.B.18) >> endobj 920 0 obj (B.18 rndc.conf) endobj 921 0 obj << /S /GoTo /D (section.B.19) >> endobj 924 0 obj (B.19 rndc-confgen) endobj 925 0 obj << /S /GoTo /D (section.B.20) >> endobj 928 0 obj (B.20 ddns-confgen) endobj 929 0 obj << /S /GoTo /D (section.B.21) >> endobj 932 0 obj (B.21 arpaname) endobj 933 0 obj << /S /GoTo /D (section.B.22) >> endobj 936 0 obj (B.22 genrandom) endobj 937 0 obj << /S /GoTo /D (section.B.23) >> endobj 940 0 obj (B.23 isc-hmac-fixup) endobj 941 0 obj << /S /GoTo /D (section.B.24) >> endobj 944 0 obj (B.24 nsec3hash) endobj 945 0 obj << /S /GoTo /D [946 0 R /FitH ] >> endobj 949 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ•OKA Åïó)rl›N2Éü9ZªRA¡27ñ°´[)¸[ºÖïïlWË‚^$0ïý˜y[Š *Z—BTK ÛÖXx+Þ½¡oFÔ¡Šsåð‡[ LÁ+T\@1M±_8±Eo=C¥BÈÌ~À—Ù,C yÄŠƒÂ•Ë»—Ùrý´š——ì,ãf׺Ãǹ¯ÏÇ~”ž›}Ó7ݶ™¿æ a$/¾äKc¼\óXwŸõûà›Û| §â1'p®äðqH'`Ô ð3‹zšüßÚ±y±n VG³1°™ž07l(%tî[þM^Xúendstream endobj 946 0 obj << /Type /Page /Contents 949 0 R /Resources 948 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 955 0 R >> endobj 947 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./isc-logo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 956 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 612.00000000 792.00000000] /PieceInfo << /Illustrator 957 0 R >> /Resources << /ColorSpace << /CS0 958 0 R >>/Properties << /MC0 959 0 R >>/ExtGState << /GS0 960 0 R >>>> /Length 843 /Filter /FlateDecode >> stream H‰tUIŽ$7 ¼ç+ôb‹‹¶«Û†OcàƒP°}©`ÜÿÁLU7Ð6 ÈT¤$.Aëå·×òòåµ–Ÿ~~-Ç£–±¬tµrãâŸ??Ê÷ãåõ÷Zîo¥ŠÏgçsF)owlÿŠí¿ßŽEKÅO‹õ!ÝZq¼[oQîßî|;ÂÅ`¸–ÇáK¦GQ—¹ð²²$h¿ûñ×ñõƒ=¯KZôUà_*Oƒ·!ˬè‰Ï7ŸÒ*WYL¢›D‡m‰æ°zá[“˜Šnâ>?|°%6Kø ›Øiê?ÃÒš)0*¾ßƒ2!} j´rS…[2 1Z“ÞGA¨u£r•~îωãÞeTä²އ¦1'ïÇIŒ‚HGGŠ`´kf ò¸—wa±FÚFBA[c)L‡4SzZŠÓ¼ÄÓSF¬äDZÊІ9ù¸> Hº¡ J‚xi†þOá@½-M†xôÉ‚î³_¨OC8³Ä:JXl 0$‡(•vàª~FC¬žm†¢Ëj£4QzÐŒT³«´$Ù‚±³ ¬‘î5Þ[š¸FÚ3föòùˆÏAk€¥ûl0,¥·'XIo Ïy*æ#Až‡?+E#;™J¹–ºp”UQ–§Â< F ‘åReBC[¬ÐWçz %A2×¹NôØV𑿠BqÕ•l9uš× ^D5 ™]ÀS—÷ã‚H¯X4¾¢oÆØ ŒÉÆÞõcUÑrΣe©úx"E]æ†`¦Øº:AcÁѶÓ}¸oüxbˆ Òétž^‚fO„€PÈúÄÙt“ÍÚ16 Ì‹<{a˜ïºõ4ÖØ(®)tAtR÷´[bvL·>³o [Õ³ü˜“ÓÓ–²\AYŸ`IõÌõ„ˆ‰sz£“$Œ‰ýÁ˜˜IO !=§ ¨Œø†vGc £I#/'~<1‚ÀÔRPy±´ýl1½Ͷw1 чd }¡þa#fßËþÚF¯ÞƒÇY}ïAô Ë9b :žÎÞF" ‹>64”~0IGD˜Ë ذ$ÙtMâ¯%Z½Gð¾¥Úñ§aÑÌ‘ I¼ ý—/øýzü+À0huendstream endobj 956 0 obj << /CreationDate (D:20100303120319-08'00') /Creator (Adobe Illustrator CS3) /Producer (Adobe PDF library 8.00) /ModDate (D:20100412113401-07'00') /Title (ISC_logo_only_RGB) >> endobj 957 0 obj << /Private 961 0 R /LastModified (D:20100412113400-07'00') >> endobj 958 0 obj [/ICCBased 962 0 R] endobj 959 0 obj << /Intent 963 0 R /Usage 964 0 R /Name (Layer 1) /Type /OCG >> endobj 960 0 obj << /OPM 1 /BM /Normal /CA 1 /OP false /SMask /None /ca 1 /AIS false /op false /Type /ExtGState /SA true >> endobj 961 0 obj << /RoundtripVersion 13 /ContainerVersion 11 /CreatorVersion 13 /AIMetaData 965 0 R /AIPrivateData1 966 0 R /AIPrivateData2 967 0 R /AIPrivateData3 968 0 R /AIPrivateData4 969 0 R /AIPrivateData5 970 0 R /NumBlock 5 /RoundtripStreamType 1 >> endobj 962 0 obj << /Length 281 /Filter /FlateDecode /N 3 >> stream H‰b``2ptqre``ÈÍ+) rwRˆˆŒR`?ÏÀÆÀ̉ÉÅŽ> v^~^*øvD_Ö™…)p%•é?@l”’ZœÌÀÀhdg——ÅçÙ"IÙ`ö»($ÈÈ>dó¥CØW@ì$û ˆ]ôý¤>Ìfâ›aË€Ø%© {œó *‹2Ó3J ---Sò“R‚+‹KRs‹<ó’ó‹ ò‹KRS€j!îAˆBPˆi5Zh’èo‚Öç@pø2ŠAˆ!@riQ”ÉÈdL˜0cŽƒÿR–?1“^†: üSbj† ú ûæÀÆOýendstream endobj 963 0 obj [/View/Design] endobj 964 0 obj << /CreatorInfo << /Subtype /Artwork /Creator (Adobe Illustrator 13.0) >> >> endobj 965 0 obj << /Length 981 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.ai) %%CreationDate: 4/12/10 11:34 AM %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0.658824 0.8 (ISC logo blue) %%+ 0.372549 0.376471 0.384314 (PANTONE 425 U) %%+ 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 33.1201 594 786.96 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 3 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 0 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -381 793 0.92 1268 743 26 0 0 117 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 966 0 obj << /Length 11082 >> stream %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %AI7_Thumbnail: 128 52 8 %%BeginData: 10932 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1F52285252A8FD04FFFD05A8FFFFFFA87DFD4F52285252522852 %525228525252285252522852525228525252285252522852277DA8FFFFA8 %7D7D525227FD04527DA8FFFFA85252275252522852525228525252285252 %522852525228525252285252522852525228525252285252522852525228 %52525228525252285252522852525228525252285252522852525228FD21 %52A8FFFF7D7D525227FD0752275252A8FFFF7DFD215227FD2A522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227527DFFFFA85252 %27522E5227522E5227522E5227522752A8FF7D5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E522752277D7D7D275227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %2E5227FD1A52277DA8FFA87D2EFD11522E527DFFA853FD1D52A8FFFFFF7D %28FD285228525252285252522852525228525252285252522852277DFFFF %7D522752525228525252285252522852525228525252275252FFA8522752 %285252522852525228525252285252522852525228525252277DFFA852A8 %FF5227525252285252522852525228525252285252522852525228525252 %285252522852525228FD1852277DFFFFFD1B52FFA8FD1A527DFFA8275252 %FF7DFD265227522E5227522E5227522E5227522E5227522E522752277DFF %FF525227522E5227522E5227522E5227522E5227522E5227522E52275252 %FFA852275227522E5227522E5227522E5227522E5227522E522752A8A827 %522E527DA9275227522E5227522E5227522E5227522E5227522E52275227 %5227522E5227522E5227522EFD17527DFFA8FD1E527DFFA8FD17527DFFFD %0452287DFFFD155228FD075228FD08522852525228525252285252522852 %5252285252522852527D2752525228525252285252522852525228525252 %2852525228525252285252527DFF7D522852525228525252285252522852 %525228FD0452FF7D5228FD0452FF52522852525228525252285252522752 %2752527DA1A8A8FFCACFA8CAA17D5252275228FD3C52A8FFFD145228A8FF %53FD0652FFA82EFD0C527D7DCAFD04FFAFAF85AF85AFAFFFFFFFA87DFD05 %522E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522752A8 %FF275227522E5227522E5227522E5227522E522752FFA827522E5227522E %FF7D522E5227522E522752275252A8FFFFAFAF603CFD041413FD04143C60 %AFFFFF535227FD3A52277DFFA827FD11527DFFFD0852A8FFFD0952A8CFFF %FFAF3C3D1414141A141A141A141A141A14141461AFFFA8FD045228525252 %285252522852525228525252285252522852525228525252285252522852 %5252285252522852525228525252285252522852525227A8FF5227525252 %2852525228525252285252522EFFA85227525252285228A87D5252522852 %27527DFFFFAF603CFD07141A1414141A1414141AFD041460FFA8FD3D52FF %A8FD10527DFF7DFD0F527DFFFFA9611414141A141A141A141A141A141A14 %1A141A141A141A14143CFFA827522E5227522E5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522E527DFF525227522E5227522E5227522E522752 %A8FF27522E5227522E5227522852275252A8FFFF3C1413FD191436FFFD3C %5259FFA828FD0E52FF7DFD0D527DFFFF8B1414141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141460285252522852525228525252 %285252522852525228525252275227522752275227525252285252522852 %52522852525228525252285252522852525227A8FF7D2752525228525252 %2852525227A8FF52275252522852525228522752A8FFA93CFD05141A1414 %141A1414141A1414141A1414141A1414141A1414141A1414FD1552285252 %7D527D597D527DFD065227FD1852FFA8FD0D52FFFFFD0A52277DFFFF601A %141A141A141A141A141A141A141A141A141A141A141A141A141A141A141A %141A142E5227522E5227522E5227522E5227522752527D7DA8A8FD09FFA8 %FFA8A87D532852275227522E5227522E5227522E5227522E5227522E527D %FF525227522E5227522E52275252FF7D522E5227522E522752277DFFFF36 %FD2314FD0E527D7DFD07FFA8A87DA87DA87DFD04A8FD05FFA87DFD15527D %FFA827FD0A52A8FF7DFD0952A8FFAF1414141A141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141A141A141A145252285252522852 %525227527DA8FFFFFFA87D7D52522752275227522752275227522752527D %A8FFFFFFA87E52522752525228525252285252522852525227A8FF522752 %5252285252522752FFA8275252522852525227A8FF85FD05141A1414141A %1414141A1414141A1414141A1414141A1414141A1414141A1414141AFD07 %52275253A8FFFFFFA8FD045227FD0F522EFD04527D7DFFFFFFA87DFD1052 %7DFF7DFD0A52FF7DFD0852A8FF8B1414141A141A141A141A141A141A141A %141A141A141A141A141A141A141A141A141A141A141A1427522E52275227 %7DA8FFFFA85252275227522E5227522E5227522E5227522E5227522E5227 %522E52275227527DFFFFFF7D52275227522E5227522E5227522752A8A827 %5227522E52275227A8FF5227522752525227A8FF6113FD2714FD0652A8FF %FF7D7D28FD22527DA8FFFF7DFD0C5227A8FF7DFD0852A8FFFD06522EA8FF %61141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A141A141A14285227527DFFFF7D52522752285252522852 %525228525252285252522852525228525252285252522852525228522752 %52FFFFA8525228522852525228FD0452FF7D5228525252285252FF7D5252 %52285227A8FF611414141A1414141A1414141A1414141A1414141A141414 %1A1414141A1414141A1414141A1414141A141452277DFFFFA87D28FD2952 %287DFFFF7EFD0B52A8FFFD065227A8FF7D2752525227A8FF8B141A141A14 %1A141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A1428A8FFFF525227522E5227522E5227522E5227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %7DFFA87D275227522E522752277EFF52275227522852A8FF52522752277D %FF8BFD121413FD0F1413FD0914FFFFA8FD3352FFFFA8FD0952FF7DFD0652 %FFA8FD04527DFFAF141A141A141A141A141A141A141A141A141A14613C3C %141A141A141A141A141A141A143D3C3C141A141A141A14FF7D2752525228 %525252285252522852525228525252285252522852525228525252285252 %522852525228525252285252522852525227A8FFA8FD045228525252A8A8 %27522852277DFF7D27522752A8FFFD051461A9AF848B1414141A141436AF %AFFFFFFFAFAF36FD04141A14141461A9FFAFFFAFAF601A1414141A7D2EFD %3552277DFFFFFD0752A8FFFD05527DFFFD04527DFF3C14141A141484FFFF %FFAF1A141A141A85FD09FF841A141A141A14AFFD08FF841A141A1427522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522E5227522E5227522E5227522E5227522E5227522E52277DA8FF52522E %5227527DFF52522E5227FFA852275252FF60FD061485FFFFFFAFFD041460 %FD0BFF36FD0414AFFD0AFF60141414FD3A5253FFFF7DFD04527DFFA85252 %527DFFA8285252FFAF1A141A141A141A84FFFFFFAF3D141A14FD05FF603D %60FD04FFAF141A1461FD04FFA96136AFFD04FF141A142852525228525252 %285252522852525228525252285252522852525228525252285252522852 %52522852525228525252285252522852525228522752A8FF5252285252FF %A8FD0452FF7D5227A8FF3C141AFD051485FFFFFFAF14141460FD04FF3614 %141460FFFFFFA91A141484FFFFFFA91A141414FD04FF611414FD3D52A8FF %FD0452A8FF525228A8FF7D277DFF8B141A141A141A141A85FFFFFFAF1A14 %1A60FD04FF3C141A1461FD04FF141A14FD04FF8B141A141AAFFFFFFF601A %142E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FF5252277DFF7D2752A8FF2752A8FFFD08141385FFFFFFAF1414 %1361FD04FF36FD04148584856014133CFD04FF60FD0414FD04FF851314FD %3D52287DFFFF525252FF7D5252FFA8527DFF3C1A141A141A141A141A85FF %FFFFAF1A141A60FD04FFAF141A141A141A141A141A3CFD04FF61141A141A %3C616061361A145252285252522852525228525252285252522852525228 %525252285252522852525228525252285252522852525228525252275252 %522752525228525252277DFF7E2752FFA82753FF7E27FFA914141A141414 %1A1414148BFFFFFFAF1414143CAFFD04FFAFFD091461FD04FF3614141AFD %07141AFD2B522852285227FD075227FD075227A8FF7D27FFA8527DFF7D7D %FF3D141A141A141A141A141484FFFFFFA91A141A1485FD06FF603C141A14 %1A14143CFD04FF61141A141A141A141A141A1427522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E522752275227 %FD04527D7DA8A8FFA8FFA8FFA8A87D7D52522752275227FFA8527DFF277D %FF52A8AF13FD0A1485FFFFFFAFFD0414138BFD06FFA860FD05143CFD04FF %36FD0B14FD2852A8A8FD07FFA8FFA8FFA8FD06FFA87D5227527DFF7D7DFF %7DA8FF7DFF3C1A141A141A141A141A141A84FFFFFFAF3D141A141A148BFD %07FF8B141A141A3CFD04FF61141A141A141A141A141A1428525252285252 %522852525228525252285252522852525228525252285252522752275252 %A8A8FFFFFFA8A87D7DFD065227FD04527D7DA8FFFFA87D2752A8FF52FF7D %A8A8CAA914141A1414141A1414141A1485FFFFFFAFFD071460A8FD06FF8B %1414143CFD04FF36FD04141A1414141A1414FD2252A8FD04FF7D7D525228 %5227FD0B52275252527DFFFFFF5253FFA8A8A8FFA8FF61141A141A141A14 %1A141A141A85FFFFFFAF1A141A141A141A141A60FD06FF85141A3CFD04FF %61141A141A141A141A141A142E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522752277DA8FFFFA859522752275227522E522752 %2E5227522E5227522E5227522752277DA8FF7DA8FFFFA8FFFFAFFD0C1413 %85FFFFFFAFFD061413FD0414AFFD04FFA9141360FD04FF36FD051413FD05 %14FD1D527DFFFFFF7D7DFD1E52A8FFA8FD05FF601A141A141A141A141A14 %1A141A85FFFFFFAF1A141A143D363D141A141A14FD05FF3C1A3CFD04FF61 %141A141A60AF85AF601A1452522852525228525252285252522852525228 %52525228525252277DFFFFA87D2E52275252522852525228525252285252 %52285252522852525228525252285228527DFD06FF3C141A1414141A1414 %141A1414148BFFFFFFAF141414AFFFFFAF8BFD04143CFD04FF3C143CFD04 %FF60FD04148BFFFFFFAF1414FD1752285259FFFFA9525227FD2352A8FD04 %FFAF141A141A141A141A141A141A141484FFFFFFA91A141484FFFFFFA91A %141A1461FD04FF3C1414FD04FF8B141A141AA9FFFFFF85141427522E5227 %522E5227522E5227522E5227522E52275227527DFFA87D27522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FFFFFF60FD0E1485FFFFFFAF14141485FD04FFFD041436FD04FF %3C141484FFFFFFA8FD0414FD04FF611414FD16527DFFFF7D5228FD275227 %A8FFFFFF3D141A141A141A141A141A141A141A84FFFFFFAF3D141460FD04 %FFAF363C3CFD05FF141A1461FD04FF853C148BFD04FF3C1A142752275227 %52275227522752275227522752275227A8FFA82852275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %52275252FFFFAFFD0F1485FFFFFFAFFD0414A8FD05FFAFFD05FF36FD0414 %AFFD0AFF841414147D527D527D527D527D527D527D527D527D527D52A8FF %FF527D527D527D527D527D527D527D527D527D527D527D527D527D527D52 %7D527D527D527D527D527D527D527D527DA8FF853C363D3C3C363D3C3C36 %3D3C3C363D85FFFFFFAF3D363D3685FD0AFFAF3C363D3C3C60FD0AFF6136 %3D3CFD16FFA8FD49FFAFFD11FFAFFD09FFAFFFFFFF %%EndData endstream endobj 967 0 obj << /Length 65536 >> stream %AI12_CompressedDataxœì½ëŽ]Iv&öçÒ?tM*î—¶1@æÉLY%5º[ @±¨ÇE²Áª’Ü~zÇZëûVìs2Y]7Æ@ç“™+÷‰;"ÖýöÿÓ¯ûâöËÿüöE~nNñçOo_óñÓ¯nzó×_}õí×ß|Ð/~óË›¸îZ7Ýþõø7þÃÛO_¿ûøáWú§—iýñQ>ý‹»Oï^¸ùÍÛw_þòæ¿\àß½ûæ«·ëýÛó_}üýÇ/>~øê_üæ¯î^¾~÷K>xtÿú›u[ù˘þ2†›•ËÍí߬î>~ûáËw~÷ñÿþÕM*ý&7ù×nJÌëÏÿû»ß¼ýúúž—a´)7¾¬­–õC]:×GÒË:äc÷ß|ûþí‡o~ýéã›·_}þøÕÇO_ÿêæüÇ5û¿yýûõ—×7ÿçÛ¯¾úøï7w_½~óÖË×/ß}õv½çû×ßÜLY‘Û¿Žé‹»oß}õåß~ûþŸß®(¹8¡#þý×k¨5ªü,àþÅ_¿_ß¾ýæ›5Ûõ~õZWL¯ˆÿÃM°~÷úÓïß~³ŽÂǯ¾ýFæøÓÚšW¯ÿøV¶7Úþîo?üîã?èü^ä×lòZÀ™nbj㦗|“š='ö›^ñȨŌd C÷µÐ¿^{ûwŸÞýþ݇_abý‹¿úôî˽ß=Ý û¦o°vwÿ›üg“\ïûÍ7o?`ÒëœÿæpnÂË¿ùízâÇ/ÏßË‚-¨²¶÷Ã:Kë°ØßügýËúø·°Ùëï_¬½ùõ§wdÌÓßê_Æ¿þêÛõ§¿úôñÛ?üõ‡ùxú…„_¿þæ_&¼ýðå× ± f¿ÞØ'ôÕ»{k°…ÛøåwŽ÷»O¯ß¬ÇÞüÝ?ÿ··o¾Y`ÿôÛoß}óöOôÛ7²LŸnî>}ûõ¿Þüîãǯ|~—òi¬P¹ÿŒgüZ?ðáï>ØJ?}n¸~ÒÂŒÿáž²îþüÖÿGýüú«¯ÞýþÓë?üë»7Ï=à™¿û“ìo?àa Ç?½ÝŸ×_ùÿ÷8–|ÿÏ¿z÷õû}_¿þôÍ»7_½ýí¿þæíû?=ÚýÛYœí°l }øðoo¿úø‡Ã$òú×7ÿåõ§?|×вMÿòî× CŸ÷2~|ÿaÚ7¿ý××x«Óýæ_õÎß~cüÕë¯?Ý(܇ò³Îï¢g—$É`>hýbÆ#é{ñâ;hb¿¹ûpøó_}zýå»Em—@ó÷>¼~ÿöË›ßôËÓSТñõæîËÓ?þ·Sˆëú¿N?ç`ÿ øƒ_øôŸ×JÝ=ÜÝßïîînïæ]¿kwõ®Üå»xnnïoïnooçºúm»-·ù6݆ù8æyÞMù³Í%–Ì4à ãq<œÆyÜc´±ä¿‘Öúc¿_×¹ßõ¹®Ñ{¯ë*=õØc{lëºowm=§Ö×ÕZYW>µÜR -ÔÇú°®óºÖ$ëm]£ËµŠÜ¹®¼®¸®PCy\×úÎëº/ë•Ê­^£ŒÓv=¸èg ¿®È+?îËVê׃^ûçõÿ9œ£~—+žÓº"þOç¼.þl¿Ë=ñä€xñgûý;þœ×ñ¹t=ìç“þÚüª×5”¿w\ã ¤ŸÐþÄËÿtxÌŵV*¬µº¯ëj¸tçﮉë×^g\üzðëQ®ÓýãCÀq%¿²_Wõ«®î×8= ¿æáº=\w×ù꺿¼NëÛ羟¿ôT­cÞןëØß­õ»_ó|ìa!EêyÒº0A¾ÆBšÛ…<çµ”ýq„±–²Ð >äkŽÛÓ¾³®ôÃx\Hj¦™ŠÖuµ…|‚œsáôÂ÷…Æ÷úÞ·a]q¡w^W¹]صq=ñvœnÇÂùº»=¯K6M–çñ.¬+®+­+¯KÐLPs½È¢$ýnÍäNŸ²hËí}ïÎ'Ûñ 4"ê?û¡+Upâ>ïëáp=/¡‡+^\I®“ý·®|u•«ëú«=¹”˜ì?¿Æ³×üìu{}ž€îþÔµVªÜüÅwŸ„ .ЬÿùÕ}QQûn×¢“úWÆw»Òºì{2È ?$ÿ³\—|ý@ôß…«®¹éñYï++q»Níý"#1Æ¥ÁǶØÏŒ·ëÀÝÇÇõ>)åu$Zê mn×ɾ_æ1ÇœrYG£ç±ä.ß/ž°Ö*–¼Î‡°“¹¿œÌG=kIM[»-[v^tèq­w\œ¬¬Ó"ø.ؾp˜^ËO É ÅÁ½‹"öBjÅhÁfÁdÃbÁ`ÅÞ…·IqVðu(š.Ô<)NVÅÆ©x´ÓÕ¸ e‚ˆ‚ÓB >’b ½À± j›7 >]ü!‘X Ù^ô[ä½Òwà¾Ò}ãB«„?§¨z)bŸÖ·µÌë{º_[s¿6íü¸®‡5ÊYÿõ^w~ •ZK~E–·¸cV²BC†õ¸”dž«â"-¡pE½‚]NÏùåì`/.X.rrŸ~±äd[\n_ÑVšÜË‹‹\ˆ_\.¶]ó°äã„uçÚcýít PÕ È3mïuÄ[¡ëí²G²?ÁwæNWßV^ä’,òËI×û(iŽƒ¬™TÚ|Tyó ‰s¨ÄY!sFH÷*wÞÎyZ<¬CôÌ +¢ ŸëµDú¼U鳫üYT*>@½…ÚTÍ"ƒžU|Tô¬BèT!´ãyÂéÿôÕŸ¿NW€ñ=®ù]×ɼý^×ÝŸºNJÍž\G梤ÿQH¦aÃ:“ OùýApv}?ëÿü~qa}¿Õÿù]þ¿=­ÿ¦^ßåêz5¥ÒòÝø7t|—ÿ“þŸÖe_‹êŸô?ü‚ïÁ0ÖpGÙÀ½^g|?‹HsñýNä"û~Â/óp-þjRÜP9NdÙù´(}­E鈠•Ð aàSu–¶¸CÎ"ˆj-Šð÷¦­œt/eã»k)‹é‹ ‹~Ò(z…r£…‹/­gªø"_²£ÿºê´˜Ù­H‚‹±õõHÑu„ÕÅõ;‰’ÝàÈâÛrËc-mõNºD²4\ ‘1 a×Q¢Ý>¬OÉ& Ù{e±e1Xa¯÷‹µ¦5í¾^㼤÷°^±(FÜ)/>ºä¨“2ÑGe Â>§2ÏÇ5»¼0¸/l^‰¢¢:IQ=c¨úpsQv¤Â3XÔf]Æ$„±=ÚQTf'ÏHÊþ2ÝzШúÉÕ©£*uT¤¶ ¥üáBsÚ:“ëJ'W” ¹^tÔ„Žz«5`ƒFŒ=.VyZßT ×˸ê"Àz:TÍ ¢AUÄ—¡¶Ó5¨m¨®ñDÛ8觃²AE㬢Žé®WP/®S»µ ÂÖœ|g±ã{?¸ÍuZn€->ž‹® ~òÕ¦Fj:¨¬Æ%£üé|òtÉ(:Ÿ<]2Êçù¤Ò=±ÓDØiîÕJsIï²RºpRÓÌýb(b”™JãZ©Gæ²6árÄQ’%úîº\Y]š“K¶,Ûj±wn°*#阩jè»g}o¨­?­Ö×Uò~Öíþ’b~’÷“·ëJ½“Ú“î•^ÏEîÚ"æi1¬Ç…Šg!̧¥Ì·E—…"›aju3Ñb»^¢ÅÜEÉ%ØgŒÎø¢p“.*ÌÕñãi¡gRšŸ•úw1(G¼Ð¾¨BPÖ!êNU†Ò•6‹zVrô¨³‘ç”Óz/JB&{Ü)ÙvUж0%êÈ:¬ དྷ†Åh©F'ÕŽL?\ƒàª¥\ £y7^({O!û ¢Á»¾ùgQ8Ò— ùÚ`P-\¹ÌP/»šLżw%3AÍü¬aét°,=oW:Z•& JÛœdÆ$3%©!é;Ò£Û ìGf:£U"A¾M-GÅǪ̂B£iÉâl–Ò÷¡”žWóëhÙBlö+®h×Ih龄Ãà:š]sº=ûuw¸ö×<)ë²køÕWóktŽbyöKeµ“ýw«8lZÙÖ2 ?§`•˧Šå…Ry©RÊ£2y¾ÒÛ·"9\w‡y:*ð_²Qˆ5ÁõøGˆ>6¾}5xÕáO`jxÞ âŸNâÎO¥‡*>üŽ  qçK¤FX }HHÇ¢=£å›tSÃÍB)à·§¿øâÇp÷õ)¼\îLIn+5Ì¡?Ì,Ì`±€)Ÿ”iŽuëút®/ëÂÌ›Ú_."[|?ÃP6#Þ’ü¤³"?­7H]~X:Özó1ì¥j}Ùâ8Lè§Ž¤ó‰ˆ˜)²ŒÙ¢G^.z²Æ”ˆ›ÅbzVˆ¼¾}¼”—³äÃL~Â:YL_^þ +YbÔ•N±¶¹·Ý6y¾~º§ñÓ†Y3¹»w_(}šßÏ͹Ü3žNÞÄõ:;í+ªaÖd…9aªv†ÅS¤„½¹ªN=TF¸SýÁÔùOÌ :`=«)Ô$„´T̪ÒÁbK ¹…|ðÙ ©×`Û˜'• xXq6fRãa& ‡‘‹T2 y¹ù8xZ_ËjN©ànÆßné59ÃGµX2»à /ÃÀBJ?øQÌ“"¾”³òAõ¨œ„ÊÇJÄŸ"y„ÿ…JÁ5ª²?8Â?‹ò'˜Ý.ð^•ƒò âŸá1ÔOja*°HÀÉiÀý’,„ (ð˜ ó‚ì&[˜m iOÐ`Bª@Ù–Ò-iæg•C`pj>4Gj9¨Ä8P ÒŠM-(†Ñ RŒ†ëài5L½ƒsÜ(ÇÃõ ÿ59¡·¯]Ð¥%§i_·¢rçD„ÅܵÚ²éK„ÄÈk©½—äæHtêA=’Ÿ~^„H¯ÓMºüú,¦HÖ“ëô¹?\Ѹï}~øGþãü¡(nþxàèù€Þàé'øÑÁ½‰àõÎ~DpCnêÿÆßvŸ½Ä¦lÞ¼:‚Ï‚?øüÖV©¯ÂpRmáÈô“+¯‚àÅí„~Š«$pRQ€!ÝÑü(¢?ѯƒ/½!z?Û‡bè­2º£˜ ¨~ìñ á³;iíOO0þîB’ø,Ú‘ÿôy쿸ž¢ÿñ:Óg¨Âó×5­ø,Íxzýè¯Ó÷¸ç»‰ÑÕuúa·ÿ¨/Qüg4ý‡¯®t¸2²­—UcNhÃ4Œ¹…ó(²MK iFÕ¨©ÜžàK¤Ð’°Á ¡h´g>êL\1j6%ï4€ãAýMé´è˜‰)awj¾°¢¤.¨¢¡CqE¤’%XIµ”²ÈÔЀŽ[%N§ö 4)Ã9ÕS„øÐ†dµ,˜½3[¾ÒEîúš4øµ-*}™.R©s«†E ÒI ƒíjˆ;[ sií`u°¼òߦq´ÂšÖ‹|²t¹ ̨èdë•5v»^îá¨5÷‹e¾ØëX‚m³‹éœÔ({ðÀ 5†6ÙÄ(… gKS7”ÝÝ!XL«‹Òxš˜²“?.S?>Ÿöñá8§gãq¾#"ç³9É9ýð˜œË¬š‹œ%…œ•cbÏs‚ÍOH9]ç|gôæhp«E&?"ê‹‚Ô¥:¶¶8u¨¶HuªÚI§f“Óé«£he= W6Ý-^Ù¤Ï'7$¬+Ë¢s->÷ZÄšˆÓ}"bDÂë"oÐräî5G.)ù3Ï’xŒÕø w’ÀH’9©Ÿ­ìk)«(+uíî+ñ¸²L{Ö%¤Ë°^þÎcqåMí°®M¨k-n×v=ªõSÂ÷ïî4t_÷‡š3×Ѭë˜ÞÞß/|Jë0u¸"ç…æ]&z=>gŸÞ¶Mé¤|Ö´ ~£C%ˆô¯EýÄâ1DqD‡¼pr DpÞ>ãǾŽy9z¯Ý›¥Cþ©mØ>ÄkCjŽ*/?¨¤|§2ò¸¯ád1ö&[ bíˆ'+ëÀÊEþ*b˜!„*¼¬Ÿ‰Lû±C!Tn}Jo襪è…q%â.J¸ŸÄœUh¨ýdnùåÌ©gôS‡Ò%ó³ñd$Ùyð%‡Ië÷0ž‘)Ú0?IÂLϪ¥«@5¦׋ÿËáÿç‘/sŽãÖN.öÿLå>þ;9ÔŽ±ë;uúÚ…vAhM/âî,ÞFbm¢º°*œð[°dlM÷ ñM¢JšFµä¼“ vgOD¶Pº~‘‡4¹*á’aàâK‹þŽ'J–ü>+qȰªêšÚßî½c½‘iuÏ\«“:˜lu‹›õ%EuõÏtOWºCŠÒƒ¦&EMGZäKס9øá±Oý1@‡¡~ãિEéuÖŸà¥gÔŸ®‚dd«Ç²¥þ+žìdø®K4ÔwHv:Ý^ÖVx®¾B‡ƒo*»cºÓƒ:ú©NÙJ‚ÔCŽÓ­»ø‘Ô´š˜Ît«¢¥, =t"üUHÈŸÉi~šÕ¼…ÝËdò«ìæÓ“Lòí WðÎr~šçìÂðéVs‘î|‹ŸÊÆ[>Þaë’O»îñëÁ¾£Øw$;cٟij[¶×g¤lÞ×és Ò?V4>}.AúÇæ}ž‘"¡V¶ªÖµ”-ÂEd É“E☬‚2,‘[R¦¬|iŽŒ'X$YèÒ*I»¤½(ÅæƒmÒ‹1Å÷îôŒ}ò»-”´Q²FÑ…R¬”;û÷ÒFùy åµ}Ò¬“—RcûEèbvª–çv¼¿¾×-²$÷q“¾(M|âå°Ä î‡<·ÆõôO…Ÿ8ÎO“vò³ÒN~Ξ6žØÒ¶%m@cØV«~aÛö¬õ™ÓÁ÷Ü üËzÐ.xÂÁ(s–,ÿ>jT`ñx@Ú±¢ªp»ÜÉC '4Ú³‚FsAãž%FhEÚŸÕ~@ëØh=¨VäCÉ©ò˜(4UµbGm<ŸP¢ŒÖ‚¸Hâý-³¸œz] jñ‹£„ºäÓ“†F•œ¦Ê¥¬°¤%T8?€tG¤:Zšã@ÆÀ.ó˜]ó™Èp ëé¨ùè1>Xµ¢‰®íµ?V©"Í »²ãI ª4§^K¨VÒqÞÞ]H§ÛŠúŒ õôœUØ›ÉÀ.éGáí(¾™ðv¯ÇúNú<Ä~µ£Íe„Ó…ÙÅÌ-óÊÜâ5ž-úËí-´¹œ=¿x½íÉ /r=ý"†¦'cÜ£×éPÙð TÄô3SÛ¢J⦑V•4QãÃÍ4Ñ¥|Ý/\L<ÉÀ³ª ª€žÔ¥©(ð (M8ëùoRZhDºE ìŒê×g}ñ®Eä´àµÅ¼ÑšÔÁàÅ…¬8…ß5Y!8)QüíNO¸ðè’ÒI#ÉîÁ‰ÇZ1)íË`~WÇc£<ý)’ñCm”§?M4~Í8}ÆÓit¸¸?wðÙ+¯Óůé³WþŽë¢.äéâ×Ï”>d/?½úåu:ürñe¨ËÔÏva[¸NüüEŠž-ýLìïS¦H3±O‡8 gk}ÏRE^¬èô¹jE—:&j,UH%‡£Rè¥C hî6-I¡9_–uÌ‚?ÛV %ÁEYg& íѱ”I…ÞÆj4ôUçŽøŸa,Ó?ùfï14úÑôFT}yY8 ö)ü¾Æíá§[”°åO˽Ã_Ë!˜Éª¥Ûu¾ª:bÚ1£ä{—˜cæ«eÏ;Fõhù´Îvyft‘wtâ¶Òoû<ýÎÛ,o¾eé{N‰ùœ se9„]ËŽÂö1Mš³öb“nÊx™^Üíaëðq€«ì©]Ì©-Å.¸,yƒ¬³‹©-õ$¸Î½×êUŸZSãªË¨#& 0(ib€ÒÒ~·(Kåö{ §Ö)øÌâ軵ürެØ/Skx·^TwXÎbÑwkée·‘×½i}LqÑêØ rê6µ®¶ùT¥-¼Ç=Ù»­;cŠèÆî«ëw{þR.pÎê|9„è½y‰ro],*é’¯{×7àBC  ÚëÐ.í¯CÅQ–Db0‡X1×Å>}Õ*lrH ¸¨`³‡åVuj[o30­lÇ àNpËeØÂˆ^ôðŵÍæP梛6±µœe(–¶N€í¢¦K¸¶q¸á%ÄÕU*îØ€¹ØYXÀŽ+>ØÇ×ó?–2_ŠH‘u)pEÇ`4<ËëãK9®×Iâ´ólÄ©é6–øRƒc”-ñÆ&µZ©¸SOÍ ¬ ÉÍ(Ã\dXï­ë a¢äEkŸ ™k8ÀÏèkm\Áf³Ï¯—Õ#[ãËÑBpýŽIëUÜ«dÛ€aá#&[r0V›ª,A:Öµ ™¤¸ RØÖFñ“fPè…ÒK}Õȵ£c¾5“G,U‰@é÷kw®åà|×A)DÛßmás·©­U’LAVç•Mü¡ÀѺâ˜ë8>?ãÀÙœL• ÖjÄÚ¤hÇSÌZi«Cטä–×ì|ù_°uY´Y]ˆåüéJñ߀,Û œpj…vÌÁ{׸Èz9Œz=Jcà((e6` a0 †áÎ%ƒ'”Îñ(Á÷æEÏm ȼî\hË—mmPÖYÁ«’ˆÕa|d È7‹*‡ZÁfKî.Äâid±q£ IJ¥ý4Ü»”%°tRºEÖù¨EÜZæÄ²„±aÏÊœå… à›ùêýó ã)SôEÛ^a^yg³CÓªu˜6 ¥XƒL,°‹QÎ/ª„Úaer0¼i퀻z>m€…-±b”cpa´5ãÛM$*ŠE¥vÿ|nv<6D£tM>5°Üäû­;I[41úÖt—ÖR-@LÍ Ý¦lLä©p²™{»±H#ÉXöZã`â}[Ç¿¶+ª±n•Ÿ% ]wæH¤M¹iÛ:½=R¬­ãÞ’¤ñZøù'É ñý[SFfó>˜ÍÏÕâcrI2NÐbÖ΂›œ¼‰šðÝW· —±-‹,˜@×¢Ï4›’ž`¾Ä  ‚‹IR §¡fÅä³,uŠ¿M[ü³u 9áÖÐ+¥Ìj„¨K3u ´BÿùñY(à-"ãÖ%6w|èÞ—8•:&u%ËšŒŸuo4å¢ ®:;ˆ²b$ÒÙƒnû%p  (À*£lPe5ê ÃdhYZÁœWÐaÕ»—ˆ%ªÅ‚Ån0S6=Å4¢U·­=±ÙÁJ-n‘Íó& •e-C¢IQ-Q4@ÄAëáóâ+ܽƥ|‹t•ÕtD‘?£rž<FEy $ô&/:01˜PÕL>®”ÖY޳¸â•,‡à#(BÒi°l±–²írô#dJ•8^=?È+7õ®Í‡¤69qµÉšj!6|—a)ÈG“ÉL^âC„¤ç¦%W!Gcü¯ž}f±HGWÖé~–÷´ª)Ya‹†b1’£¤÷ÂB&‚V´„ïqkܬ”FÀMÌ<ÔT¤`0ÿÁÓ `g­¤Œ.YnÑ&6¥‰JbÔê´BØžbˆ:%BÄä‡`ª%À!'MçÐ??D†×[)A>y¾ÌëïOóæ¿¼ùÇÿrñ“úÑ>|yáEû“εvå\û¡î5’ÜbœD—GÔßjdàWàEŽÖYÉͽi6ÈgÀ‡AÄÏöŸ¾=Å›{¸Ûè@ËÌIÌô­¹µv¤GVÆ÷TëhdÞ6Êf€vß—Ø`¯‡«@‹«C‹K¾€•þ¶ntÎØ±œ63ÁÖ]B—^ÇlعÉb¢ï0'µ>’0B¢Ø7ÌôŸÅPk Zÿ²8Œ(Æ- f”…ª5<ñ`3OË¢u9As)‘žƒƒ®VëÑ›;¾ÌBQª0n3-²ˆ°C`v³QY2n˼w˜y¹“UmT[Á"Z5' ÜÞ>ŸÜ~8ܾQ’æú`YMöY° ÄY¨-´õ >O Å}£â^‰¤B`Åš¢ ˜ëÀ] o4¶NÓ ë<`º¥.%hšý—Âõºó%Vh`-bíÅC\‡äzØ)QúÛÅ.©bFUÂÜEËëÅ?Mñm±«’(<Õ9#ùvnµPÊRñÞ¨¸#%MZ)÷ã¢/ÌŠ r1§ì8yg¥…£OÌi^À:ÜE+Õ’L®Ï÷HËK˰ØW1Ñh® ~®R i7÷òˆW¬PÖFe/àþа§Å–éþ‚îÂöVçÁ½™+Íå¥ÐrTaê¦ÙH¬Y4÷ ¸Ð>C_ŠqZ³MŽÀ€w’“ö†Ÿ‡ƒ¶92`ë¦ü\ LÚÁmQ]T›7°=ÓrµÀ•r IK@è}Æåàïc" ˆYuàÞ¬¬Kï…‹K€û?ܽ„ßh9†M¦õØ@5[¥IU:»»¢ÔGu z³¦èK¦Ç’a’Á¶‹F Tœª3ü”BokI¸ª’œj °œ\êéà)Eb°ºKð° +w¥ûäRå·7Ð9Lß`¦®¶sl‹úŠÓo‹è:ͶPœ¼Åÿõ’.ïÍz»¸ç:´‚¹D.÷³ôu¨52*,­ÑöËfÐg…T3]/[úæœià -Åê‘„A!5HwtS*˜†˜¸hg¨‰ö¹4a&(î!°aÅÙ®|JÃÇ& ÈlZâ½My‰ ‚KW D- Œ$®‹­†¨Ðj;öBMÐëņŰe«%înU8›ØÓDó{C¤jqŽƒþ[³ø ,Lc‹Eµ# pë‹ÂáUÛQðbꘕóø.f²l³Šb¼}ƒ¢ú`Ú\?eó.àÒ³³Í8f3h6ªÊ0n-¡Æ )81¨jg™& ;}î TIšþHs·XqQiQÕs¨òu5¿XáÒÞ±É ºv{3¼ "ò†Ùn‘g ‘NF«Xîqë€8°øK•ô[û|ÍÔçRx:ÛmÄB £–Î8 ofrKjjrqçb– °‘>x]˜mÅæl³ÓX!;ÅDþm-S°Úœy¯ðØy¯ [|^À¥)Àš#&¿d;³fGʽê`&&(ÁWA{ŠšÁdÅȦ‚¦âÁ0.ÅÌElBe ªû¿Õé5ÈÙÁÅ‚¯les Q’F]X¯³~]ÂvAì™.s¦ÕœSÏe ûaK™“Fsa H¤t4lÆ»PÖÆPlÇAº+Usf3Ê‹1¹õú\²™SgŸ$¿7’x`I\3’óÒs-c*0*¤ÁØ<ámµaý"\±Â›Rƽêô3`œan©‘¨‘Úî­î7Sÿ¾G‡@Lzªíˆ>ù_üåí§oîß½ùæÝǯ?ýñæW ô‹’îˈ¿¼ùËß~óé݇ßßüâîîöÍ›oßÿæã7¯åÞ_Þü/ëÎÿuý[úØ=4ü ®D6Ä ö.QØ3ྪÆe §k¤aJÕ-CiEºØ xSD„HÍ‘DÁ}.¢D5=þq¬õ& ÊW˜æ:˜»Êdjwù?× ý§¿‡•rIŠÓPåï÷´ªGFHF¨%þ½B:Rª¬¾dJÀ÷QGÁKÈ  Ôã€{iÅà4§N4 ¡ H´2#ž %x´DìàøZƒµÛêäT-j"¸€§› EÍÁßC,™øs…œñydÈ`½‘T—xðì&üŒ;<ĆcDP¼Ùîwš¦C)¸Áb¹Èà¹pÂæÜÔ"›Lw–òÛý¨Qåro þ#”K̈hÂá ݘ&;õHo°—Ô\ ( ÒO€R‚Çmv4 äã¥ÊGÒ0r=ß@%£;Á’n$“=\tTŠŒ®Ï¸˜NœÍ\c°l$TýÙŒA%;j>øNP7—øî‰­‚ñ‹)¼gH—Û·%±Ïê00¸@D옊§PàqÔÐXÚUÔŠo¤Y2jÉ™Ÿ°¬±Û Ë4™ ê”Î[¡=ËÌà°;.´Öˆ³ÀcœBÒTĦ\Šä]Cé 9(–)P‚š€'•Oáw\ç8æ\±1Áý§Ƴj+o W¹Á,C”„‡EÚça8Ö³gëš-ïˬ†âqîØ[&'Ìà =±ÑceZ3SC1%è ‚xÔl``Q`àk‰Æ­Ê  lÓ³N™ÝRQyX$’Мfbw‡ü¨Ž¾µuL²“°Â7ôÿA?ï4SàÎÆSª~á=L™0ÜÊ ™Ý)$×€¤Àañ;ÿÐLC®pêT$‰YYC¼ÌUÖt-¿æþRš#vF1A²ŸÅƒ'Œˆ¡³ÎDìÀᛪ^_'÷-Þ|­VËþYBúsQé£k9XuÙí^ÿ}yj?—úgIðLtÎKŒˆERúê*û)uÔ.Ó;ŸÂö§?`R?S~g¤¦náÜ”¼£ßÔY«ÑÝXÍMl΢f¦ÈlpØ?p ¦ #›GÀ@ÛÒ}9j,>Jm€âAñKèlF7ÅñˆSÉÄ3ËÜÙ+€ÝS¢$h'Ó‡–#ãndÄ@h¬owpžŒà¦ÙPóäÜß|ï¨8÷:“ãÄŠ“¨Ý\|\5¸Ù¸6%ø» ½m-Dp÷`«f;•Õ™óê9ùò"¨Phc7Ç©…#~áÈAc—¥" >/vz(Sé¼W=Pp/Â|Ü<‹BN-2@gø8 À7¢sè?=`f‰Â ãû"‰âÒyÓ@äò•ëµP¢_Œ;xDÆè×Hkq©‘; ÅCLÈ9s+’ÅVég„oÜ!¨óµ›;l4 œ~È:¬D†&`Eqˆ¹KÖ”€8L4³jeðu¾:‚=mpiÀs$!j²ŽNÍØ)ÚËáO¾c‡Šï¬£»Ÿ/VßÈâo«©Lbн<59I t!`¯Í˜{¤QNˆ)`§«¼z«€'íø*`½¸æA"Lm Ø:±i¤Hà(Æù±ôG7ŒÊûÂðVÚ@:ólyDSÇ wˆ-”úS\q 9-ZK6¦1?aM™ xy¸÷¡¿ZÄ÷o'~5MA1Ï”áºú<:>ïaÔ ¼ÞF ¾K~j‘Œ÷`Ù ½.ÆËŠ{¥h H¶#&~FHà N}=þQsj¢fDõ ³’q\¦UöE.‰{ Ö̉1qOHÕ_¹7O4,8 ]àí¦7ì“PÔäñG`’;Á¢Ä,è³ÉŒÐ*Ñâ‘í1%vѡ̽›æÝ7àú‰‘YPpžînœæ0ÓKŽ¢î›B[Jˆª£1‚!_ökܘ3š<Òº[_"¦jÁ½}0ŒÊ⟙O”„ïd„,­…ÄaÕ£Wèò¡°úƒ¤VeÏ™¶fЩû•I`WãòêæC g™¬°¢ùb‰#3¾XŒ¼K¦»{v’¨„»Œ}‚ bí&0Íg€ñôqj-AµnàÅ‹á…G"w‡¨eXÇM͈LŠh‹fÀ˜'SÜse0B2kÀFfhžÅ¸­™O&ÀÂÍÖOõÕÝÌhÖ-ÕÁt1î1y0"$a¸·g5ŸÖT¡„x¯îŠÜ0ƒÁP÷ä¸ f¡I$€ð4M4ÄÒi ”:Éä¼L÷_¡õ£»–-}“ÝÒÕQ·©­{be°4…ãÄ4 ž>™r©ÃAŒnÈ .AR=±uîøâC¶+cÔ-AëA…­dÂ̟e­å,ÙÊ'àÂ(µ&‘«¯¼'MdÕ!"%¾^Çͳãž÷Á•Õú'žÇär±$ØFËä49¤yárØM“š‡Ò.UúŽ€g$q†µ{;DéÒásÄ绨{ÉÓ­*S5nȦ€¸Û§óÚÞýÊÉ–Ÿe2ŽÐ’Ü,Z‘ó4¤5ÉPhF±§#©‘^+Ätõ\’Ö€Šé‚T!pñÕ\l2¡:•#’‚¶/}Hb>+gLà˜8Ãû@ÒUîæzy†Ö`^éUÑüȨÌ}z%*ugå™Vð<™}/ â¶n Ñ” +£%ûõSDëôå–‘ä¢>J¼Scîýp(Êb iÓåß@‚ÑQ–ÚB³eTwƒŽl96ƒbв8µM*—¬¦Rè¨N–[¢©J\@vÔœ³É`àƒT V°3[eU2Ÿ/jkñZ3þ¤Tà±PÚ „W”ºJ¾þE2~h″Q²¯àX(æñÐ$÷x´4ŒÌ*'šÓp#Î`vqbdF·Ë²$$–åCF‘j(—Û½cÁ@ì ÄS¢&Žô;Ú6aMŠÓ±‡è´Ï_ûÃ}E=Yfe Ñt:naú¾€+Ëõt¿5uf•ùiOàD=IÏÐWå m'Ya•÷26}à!¡µ?«ïlÏaú±´œè8}sx.93 ³E…0:PI:ciRáÛ3As¾-©NJ+&ƒÇj$ÞÁ¨\Y=DœI¬J'þ¶XLc~q]üY÷Pó¢Y^¨!<å‹ ±Þ!DϦ2øyY6áQÁj0[¬±d“wJqÒ¼ÇÝYÌwh$„´J\£!¿¤ê™}úÃ3 ¾êíà]ºoĨ€êg¦§ÃIå$¡ ³Û´¦ ‹-füϬd§.rKÁ˜\òV½Ó ’öº›Z›%SÐe-ϸÈ®fD«FæfŸ‘!–N**…¸v¬²QX'ºÊ¦¯6Õh*PC€Á+ÎôºKŸA¦ð¶\ÁO&Ó h#×3@ d‘¬sãë2b0mé3QÐ,?Çž„¬R¸‹Á¼PJLLC`òBºé° ,l­§¾A߆ Dºm\BD˜ø:…eMɾ¸QhæÜÑPSÚ½–ðÓÞ§ÛÍy¦§Àë¬Ëë1ð°²*ò¤^2gÚéL° qçfqÑTº²0·ˆ+*°Km•@ bù©›l ¨ªì­à¢ŠR…ªrt"XÖ$ËýqR‡q§Ñ]é]2Ùx7³ñÛd†Øá 4äŸ_j]m2ýE56¥§”s'zÀ %ù½^ä(ºL-4Öꬪ%Ѥ;¥ÇÅÕ>”+|B¤…ˆ#ç§M·†€&¼–ê¨,ô)å=c½ @MæHXñ—¾V‡fѤ]ïÔé=Á~éTíTH*A¥[;àÀÄrmÙKÀ‰h.k©Ø=„àZéÉ G«m•Tæ×Õtëq¿&CæªmmZòt\>0€SˆB‹Æ²Ž Kꆑ•Ep‚ÚiÌ;QοÓ0 s?LÅ­ØÉªf¿'º€Y-/jŠú ¶ûdy"‰;™N}~þq¬þ<¼"Z«§0@psót‘¬3.3Ë` Ðz0Îø|IŒ.ˆÓÌ«:@ã Hµ}:½%Ìš–>øžà8 ®¾öÙ3-Õ˜ `¼³y5‚:`ãZ\©Gâ©ÕÏmÞ³ÃZÖnfó»Éñ|O°S@ù¤$xŒùÒG'ÀƬÝ]‹Rð3}K€ªûé¨ût\Ìfõ=‹E•7Ã8w^ŠÔÇn¬;ÄØãîÅþ£ùóóã²âRñäx±Ñ!'…/5‡-óú¾Ð œåç%SË'ãž}ñ›.Uv¸ø´HFãFâÄ©› ÌLú"0—~ÀDZUí:x1äÕã‰èm©Ï 6•÷Ó‘0€1fæÁ+êxæ(QÌmóêùÇaC⎡8Öìp CnóØ ARºqæ<ÉFE$›^ëÕL€gŸÏîÍ«YJò{Bû*0Ú?ÃÿÔžÕ>‰£j Ä\à`,òP«U€µDµ2÷sàΩ † Õ=ß k¤(ºxå½ÊéôÓ¤õ÷©«wÕ@ê¿47ÈÃʤEÜãé öÔ®FæÔضDÔíΑ· Ý[”¢G¯M ³áÔXWmzêJu'Ú£:B Ó¡™…ÌÖu!¾Ïè…UÊj>±ÉbÉÕr &dÌ­J2…È€ðáv×xlQã[>Üÿ$ÞÛñÝ„waör?œs½:õX_U|‰-9: ¯–½`st—†ÞÍ”¸:vB :NFAh4dßtõ¸ƒ¨à]L´jE©*f`­MQa«íÌlå ÛÑXûtÜÍ’ ô-gá™Å2 J~ZW]GV`nO£2¦LÂÚhIÒ‚ò½ƒi`…RIN½x]ªN;ƒ;›·Ì¸ºuƒ^L€3‹h £r¥¨®ï<\4ìØS½…ØCJš¾œ1@u¹À*@Ôs™~6ŸÎà¸h4 ÄÇ#ØQì¨AÆœ<÷ÊO>~¸×²•Ÿ<žRfd f ¸b€ €'y,Ía5zå¯iÞ°À½©3k7—Ù·ÆäŸ¿z'‘µ cXïŸ{“ DŽ ·4ö&@”ÔÄeÆ+¥¾ô̰ÜXX,X%7k€`U‚Xž‘Àƒ-Å dÊàÁ£8åÞÆjtïÉ Ãã Ycèɧçcüð ›WjÊÁ(ÃDK§2¢`²ØÀbñÌzˆŸzovìòÕ\6ð eMÛî4IÝZñ\¼Ø*2(òe§S4GC"±YZæ™döö`”¬`ç§Y²=€1è}WžNŒö4%*Öh@­Z`T¤c5 S¤IÒK$0{Ó%wõH7*ˆ¤Í,²/¬´Çõqß‹Ôm¯\™Nw—Ü[Y—‡Â ŒŠzjÍûÒ¼vl5ÆpÜjQ¶Œ©îX@´Þ’ò»õU{é-ÿPA³3ÎKŸ?½ßTÝœ\nn7M…±À:ÑêgYS}cÊð6Õ’½_qÔH^5–ˆîà'{ pËÃãWv¾4¼qâwÚÎA’­EÜAÛÆœîBX}~z€Î~²®Î†Ÿ,GÍ·–‚‘Ä\ú ÐÛ÷DúèlˆíÕÉÒ-Qê¹Ãi3KÞÐQR4KÓ¡n+ ”02™‚6%ѯÕ`î=Ó±mÝ c”ÄŠï:@ç¨W3Ø© aööÎL`Øq7Êm@¸Ù4½aÐOGé[ºx„mœ¿Ó•‘`õíÛ=r«ï\•xÈÐØÁO¦»;c2¨Z|À{‚'‘•1¡Ò«cT •n™°/V)`L¥_œ6lzFÉC;kv§'+•ÀêÅð²Mb»Ùá8-ÚHž¾Â>×ÔªüX'—BÄ8EvscÝÏS,Ŀɽ=‘ºÑöQ]á2³/:…”ff.:üR_MYšÓ°_Küæè.þvvÊRI/'‚ ï…éB@|lŽmÞ,f—к݌‚áa^âÇ÷é+ðÝ$áƒC¨á⽃É>X‚' ª¢.Ýç§F;xó(ã«Q7ìb—zm EŽ¥Š7ãá Ñ·+[äƒÑð 'y"ïÎtØû›Zy@ý~bc·ÇSÏZ‘©¾±Cè!¥>Ov1#;êé°Hõ%Ç ¦¯f~yP‡7<Û÷Âo¥;ŒêUûç~1vô“Öf·¶Ý,±zSÚ¡Ï‘¸};Idýˆì½ÿ$“l0öàù`7Êäýå<Ô³¢,íq:ÏgàÞD¹ÞqÜWÖ¸¦UIýîäcý¢»ézDOõ2‰Íñ½ï¤÷nr-£ai)¦0x2\%Z¾|™#Ñ®,q7¼á«rʳvv]§‘££á<©±»±«íhÃîþ¢~°’tmûˆ ¨SÑ€L›o&‘VÍx?Þº ”œë``YPi¯ûL¿Ôú Àb/¡îedw8¶ ?ÕYóvh±H8™ù#qY^î²$)géâ5o„YK]:4DÜýPBb£š„Àš+"ËÍÈ÷Í¥$ÈŒ²âN¿‡õÂÀÁÊ!‘_B¥`ÆlÖÌÍ5’7D„mE5½ÂF5ù`á î¾Ùë+eP,&²3°kG–Ãô]?š-Ó’·+`b¢C®êV’"¹×Â$cE4­ƒV*ò—Q<=i<~’ÒXY;x5„±Û»%‡pzGÚ4ÙÁgKŽ‹ŠseŸÄ€2†4yMfÐÛ®f8Ø)Ÿi­·{awÛâh(óklù2;;¿[ °ûuÓ+@du6½Éë.w=ºç3 ó6tHs êÁ¢­yº'„åc]éydk¸×YkkH©ÒÈSÛRÛý•Š+¿”gpÙ #åã|›J©¹HÑUÞ^̉u7ÑÎp`K¥f´â!˜êÝdœñ-×HÅÃêL+2ƒÆþp;éSŠN’µ2Yuœme„Rv¾í_©‡$‡éq–RMÊ‚À^ª ¡Ðr¥ì¥:IÖ™¢$Ê$+©H•8Y(ŽÓ³~Tˆ$c–rN HÍÂF^<¼¬.ª-ezE4¨ÒÖ?©ý´íÍ`÷€îVë™]Šì^§Þ–úI’‡erÑߎÔ Ô·4^ƒ°¾vs³°TnJ ‡‹kVo'ÚŒŸÚçŤCF#âL¨’¹¦@ 25B§/õ…v$dóÁî‘;“ÕMµ3[‹˜`áck–{uF¡ýÜi)°\«¾H0È]熓.ªOžäîZŠ\a4ltTS õ¬~lœ(w+Ãy0Ù /{›ßmXRðÞn³3*.q"aè§Íùiª»ÍjTp÷èÕT)ný<…ˆzWZˆ"“%u齌,èV„Ѐ##?m ›‹ ìË AÌ ~‡Ìú†æŸVnà8wµÔH¡y {PÁ[mSJö `d«r»¬~¦¦àgª2´JíÅ<¬C$åÕ`'ÞÙ| &&1á½}ÿÓ~—tT™uâ²UfÚ6)+4«Mð 4wKæhýJíA“Í:U@åÍŒü¯°ÙYÎLÛ H½}=ÜÏÃ.U_fÿ{º·ˆ>00ÜÞl_«öÑ‚Z¼Ÿ2{¯9|Q4La½1ÿÆT!\Q*ZöÈ k‚®oÅŒÛÞjGF¡#YƒÕŒÃ+‘• h1Ó{¬~äÎÆ¨YJaÑIqk` +ÏdÃ&v?>´ •j4ìec©}`E€ò`ÿRº]‹‡w×Ajöài£0m×™ðÂì1A•¥Ü¥ †×@SK†}žD“…Ѭ K ÜñâbÖt)›©âÀt(#²×Ú—¢,’½ Ⱦ9ÅÄ ŽÛ§o„rÊÃ&‘.ð]ÃnqT÷¬¨S Èà v(Ë n„œ'-vEŒÊs„ó¹Ek›7`…RigJ ÷‹]Y÷6h7ŠªùC6ª=˜ö¨Ôܲ·˜ÇšhŒ{ãÐöÎRŠO Ô½{‘ És¸“á-*€Ÿ¥]¤{cˬ"íc#œwƒ)Òx/ë#BÖ+@0¾ƒˆÓ‹€©né1Y ¼ ªaX‚Øèê•Ò¼™¥Ê–ÌcC+²ÚAT͇<4-ŒëÕËþ %l;¡iRëÖ¡ÈÜUˆü@ÛèKDò€æzHÉëÂN˜º36€ä&€™F6ƒS¹ä12ª%÷h‰Bׯ‚‰ö°DU,†M1»iL/&ñ:Œ^Ÿž­AíÞ“2p6Û ´Éî%=›Pî…o×ñu4°0 ñVê»O{Cg`¹ ÔÕd÷‹;Msª1¦êŦ×3Œfí´vU¸ [ÖèV{Ïîôü$gÆbÁƒ¯XîŽ ÒV ˜<‘½{0$?Ь1##dÝhÕ_.5rZ»K@‰!Ìöi–¯ŒÐBÔ®’±U“Õ\Cñ¢xÓó óG4>¬Ó0C'ƒØÜ3`)9r{[`éÂì ½¶GóÖfjŒuߤЄz:Ù (G7ÔªiÔ%ÔÊ–ŒÍ³%9‚4^\½ˆ¡2úk»T²¾e/¬†ˆb ¹°Hó Ïð“:0‘½›rꬶA6w½áÞã6–]‰ ú˜"e¦~ØèQ«'äª#JçA²7`EÓÔW†Yz'—‰V_z.' ¤ èY¦o2PÍS•Öt²-†ÛÎÀvUH^¨‘—¨݉'áìmz½š‚$ßf–Y¨Ä"÷Îz…;­YûÀyv¨Ø{«#Wæ;…¢ÍéM…3ÑicƒM™™ÔÕ!½G÷ŒL‹V}ÎÝMç< ³p´)„)Å8×\¸”#5˜ÊUÝ ½›B¯ÓP|Z¼Ã@1z&Ù."+½ô˜iyýlm—ÇÍ>ì¥t4¼±ûcŃv¾Pÿ#,£©Wt+ñ‰Fç÷Òï|XÕä !¥)`Þiƒ¬Ý /Žröíh{þ´€êe$Ö åP×oÔ«9\ dŸ¯ëg¥èíÈ×][¨Ü˜èù´®ß MÅ›{, Í:¾µj¬1ų=øy´î®UL,΋Â>á¢éÕÜ/@~, ‚ “½òg•FÖ` ÖFñÑ %]>v½ÍŠ®RÓ‹ÅuéøQËNÕÄ–¬‡¾³»3#úíŒÝP>"Û:p{>¨Å‚èÙ¦Öoéf‡BŽlõ4Ùp2_ïçWY©Ó{:f½@b2ÝÅš*c:ÛÁkF$ãN£³U`HD7«XÁ[zƒzn—6%¸`JÃÅr,cÔ½¹™M½¨]b"¶™´Üo‰S@ÄGÚºL¬z)z‚'å³c¸sõéìÂ*%ˆbæ!`á‰êÌØD¢€2Á(Ð+€©ŽE à ‰¥¶ܽ&tÅ\ƒwžê»sÀ´°;’nëz1µvX™^¼¸E‹ lŸt7J¢ÑdÛ´ŽÆž*<fâ’ÂÒØavÐ@¬¼{ŸÑ®sÒMàk`áÂþ²ìy6MSâ2ŽAÒи^×¶`P§¨Å VÇr%ž%¯÷²FT…Vn™îëWáö ›+LÔ F©lM`â^Fž¼W)¸óàj.ÇHê]⪢ëP÷:îšânI‰ý¬ÑYN𞹕=;‘›JeXa¬-CÞ¹÷1vkHtÒ©”‡$oƒjÇDFÓ•5ÿ Të¸Ñ|¦ö" Ä–‘q³×¢Ø*ÇeŽ8úã齬2!·ê³ÜÕ¤¡Ÿg{ˆzQŽÝE›öžç†yÐ6{Co‹å>ÜÍ+Ùàèí1Læl‘:\÷’tr/”PCt–nÏ“Çë¢.é"£Çbˆ´<ÔÁóšSbso—‚6V—ŽI^“6£k^‡7PùÑ`´¨.7ò]d­êƒ2v'Î>? é `µ§¸q¯Û‘Ö:–;;æGˆ,ò°î¤–·lJz’g“ (ý+€GbdoH3Ü3ÐÎÅÖ.ö8î謊K:%s b§¶.@°b¡S[k xŽÓˆ>€s€àåè>Çk›®™o¬§ÄoõúTAã! \»Ñf£y;˜L"\nöª>Àžå B%‰^€L–F€èÈd¿‹»×|Zí—e}Ûäî:†5·äoñBš !íPÏ‚ØvÎi Ì+€7:OvžÛUƒÖ¸7ƒd¡י€ …DfÓTôÊ1FŽ$‰ å˜Ûæ `ïƒÚ¼_-LufU'Z5Qzœ·v§*àaUȬ Óp2-zûúÛ®wv1éâÅЃw9`%¿¯Þh±Uî‹^h¢xÀĶ´‚{f¢£ª× úP[" û6´ãµã8>¹wºv•&þ×+½ülËÞf%Âó¦@Š•{w'íé vço­6‰ä¦a9á&&KÞG£Òͺ6M5Zja›HD/±‡Ôf—ZÚÞû IdáPB²íðŒ°ë‰ˆ»œµ%ô±/žOž8$µùyö/Üâw‹‡vÞ»ÒK£eŽ7jËÓeÄîè¬È«DêÔ~©jÈÂnýAM² •tN[pÖ°.!µ£^âK Y´Tv¨¶#ÆÂ.€žÝR¼Mzvh0‡Ÿ®ƒP©‡—µ6»”ÝÝØ//9éñgåBO¢ããú`jít µTo¸´º2IJN©¼1¿£•ÃÃ6ñ±ÊS ƒLP7ñéÖ_¢®w Ûù—0r'¥Í(ú£RCÌ&ÅhJáX–\‚í&(6VuÓ¹AzlRm2ÎÌû„[_p“½ˆŽ]è¤=¤e˜µ`ø¸ 7µè%Âd•MVî<ö ¯æËݤ4 ÷Ýö…)¼Vþ’[°l¬!Ù`Ö©ÏîE[ñ:!^(ÚÀU%£–@%Ä»LµàmŸ¶2[YáÔöqØFáá¨l]׺Ú/&*J/`A+ÁnE¡_X³ÌByPmDêo1Ï’ « mkP¨Yêó¶9èˆ ­Ùõ‚q®î2]ñÁà° §ž|xpj>Д‰"æ5»1¢¡«zó©O6 ü®)òJSÐϰ«v…cµ´±BÌ™”±€iº7mø2ÀL$`‡¥IÜvd¬0¡˜:KéMÀ®|³à™TDê´ 0É¿VO èâcPêLð½ÂF&­‰i’uÁ”IƒY.q&{Âï–^Ò÷!éa—Ói–’l¯•š:j{²°’GyŸñˆrŽ2êIäB£naÿ|ÎÎÛ²wcÕ ^ŠaŸ/Žc`«güûÒakÑc˜*ÛÁZ)ÓLÚÀºÌZ‘(¯JÕÖÀä›­I7±@˜¡ÚpÔ-ÑÅÀÊ3ù°·æe ‚Å—ñó,?<_» åÁýùÏ®x:¥hj÷êTÑ‹x Ð}@)S «;ût«uçÆMvöÉÒâ8@J¬§@7E°Z1×VdcUfj¤C%üÚÜ_´«bÈ)vqÅLžV1ò“Õ)#ª–Ãèûc¿§µÅÞºËF×êùÉÜj8óƒC¤;¼ã-ŽäyÀõÂI™¼âY¡Ïk—›°‹à,Ý&@Y6âIy5’N†—$¯A^³—šÙAB¥½—êùá;,A-! ô^ˆé¾l z yìôÁN¬5YÖj1tð·•*ÀVÄÜÜKHâa-² #l÷=ÔBköùè}r¢å„à^äÝhò Ã{Ô7êÏßüzÀÓ-“BË.|,oéܪ"pÐY@æë-ÂR!1ÆX©’³µL-‡B$4Öⱥіӹe¢PW§zÉ#IÐÞ|³Rö¥‘Ô4oRV*-[m€ÎZŒ5ó 5yÍ¡p<Ëâŵ­¾`™@–ñÔFǵ^ËõÚl™ŘI"K[Xo Â1.s*áÈíýùn›b×ïÀlÞÃÀ¶Ì»4†ÚZxØ”B Ò㌤ ÚåÓVk‹ÔÃm(³ÑWNÙQì¢ò$¶˜GÆ/E&­Õ¥lpW²%:QÉÞ-c µÕÔ¾W€—ëQ °T¸‘M­Ð¢t¾1;@Áìü=-wÒ€}qé“óª¦AÐ~\ŠÌaSxðbTåEÊîp<[KfÛ¼âJa}}‰è&§À‰YÀ½zUÈlÝmÂèh[÷°ÓÌ(åçöë6«Wm¯;õ'µ3*©%Xqiˆ‰=šœJ?lXòbˆR'£Ôz jì^Ó“ùŸ^ÌÂÍH`d_™Áb”f‚¡³‹åú •C:é7«#É»fRžè û5Ñ+™=XHÖÊyPA“yW ÛHÎv‰ÜŠ|E°ÃÑ‹z`îsN^^ZV%0ä-{ÛYw¢¢æöc¶™R"óÚdº—Ϭ»¤Ët† ¢!• ÜçM¼T/˜qñõèµÏ¬öUª+Á³1 •‚Dòšê"i°–IÀƒÀ0 œ½p†R°,aŽË¦¯ÁKÓ—âu‘‚™ ˆVgòn­ìqÃÞHÙì]‚ǃÊ}™r€b?ž'­š<`@FÞ…ÍX -v8ãÀb?Ý4EAÇ*ì~Î(ߦh#ª#Á±ÒIÏXO‚FYÆ—Œêð—RNÉJ§±–6nòv•Û³W"êh˜Ï,;% ßEçëþÝpôþ—pŒj°¶ÏÆ­»>Q¤ÄC Kʤ%zœ¨™öùè}v  a¢Ó…ƒZžädB;r€èQ8t7–tt B¹(¬ë`,Àé”ÈÊ“r\R-Æsæ©é ÜæK v0÷WR@)® /"@3ÛuÊn½öõó3H¨©lqzÎ\“MÇÀ`£ÉÖnÀVÒÁ‡¨p~>x©IîwôVÑBb È,æx¨[=f6¾t©x—E‚1ï‚ÍÊà9–›-ÁKm ¡ûdy Þ{ 윦ίèE°=øqûòô¶ÉìQ¯žÛ{Õ›ƒ‰ýÑK{åéô/z§³L×+˜çQ˜sù&Oöt *çÏ‚YB¤±Èg èlÁ‚c0ÑRíˆcF|pÑ/OöO Áœ¤&š‡¶r’‡§ý Ïy0YV0o Á5’“íæap‹ È’B×ù޵–Ï'ªõ‡JµÝ­œú”¥u¾µ<ÜŠÌÈnÀm{dlc‚¤  7ôÏæ~teÃÉôù z;®Žf:© çö¸¯‰,ÇŒjB<_aדe‰'™­WÈ„`d•ý”©§Ë¾l ‘»ª…è†(Ùòìä.äÁnU*# îv>„¢ê! qj·XÉ»˜+Z«©!Ñì„¶XÛÁܼM»€‡Wx• ìW3 0™Lé`/!­d‚)NdëYaÁêɵ®ˆu=T¦§*6ØÐ¬œêv˜£í.OJ´ diãù!P1söÔ¸hiiüüŽ7Wg°½Xö±Á;_çÂaa—÷_w2X9œ‹}L!𢺓Tš¤lŠœÝv´/ådnÃ[—wÍèrKž¬„ \`,qžƒ'8FºLÓÀâÁ¦™vÚ¡Ônð{Scle¤4<3š•§Ý*!# 0G÷ÓîdFh<øÓ8Ȫ]S?Ôw.à®i—Ä ‡0ÀÔ<º$š÷Ý€»Ât€©5Ip?Å©êBôÍŒØ8ÆØþÔÝå%ìûÁ ˆb÷Z‚ÃA&Ë}Þv‚ž†§Þ¸Â‘¤¨’?¼ìõ÷ìˆÝã\·…žÖ5tD à‹,töTŠr mt: 9A(3,4®˜† †®‰'X>ïù†¬%/¹P‡=¥\Љ?©{4s231_ŸòFbYâÿž¦ø´¸@ïMÉR ü `Ò†dÖTOæ ©£ô@A‰­ì*~j^^ ܘZõb(Ñ Nè½)PÆôßÕÓNƒ sIr# e 7,pÙ¢—+UoR¹{I0’k!6>Ë’ ²{;µ^홋;=§JëÄòùÃE<æ7¤íÊŽÕÝlÈGæç϶ uPz+˜%”ªkJö°pUrJœªWNò*@çh“ c*f`7l"3÷–QóBÅÝ@»BÞ3t-™ ÈŽ5ÌIÊFšŠ»È2ö‰mïD]U;t!Êìô¨ùåæªMù'µk̦ì§h÷K›oE¯Ó|xƒc´f*^‹ã@LŠåûÚÙ€vgt•¨õÝs‡âp<ø…S9UØ9^Ç%£×(¸Ï5â–oÅl—üKå óRN—lä^ Þy˜GMmX:jøu2Sñ’òÁ Ø*FjÃMHö,2¦a¥ä…¢“égÚ>øðåxY¤Cªýƒ¡%—Ò!²>%/t›¬tæ}ø²Æ”â¶SÚm4â¸F8¼˜ÃÉ»r§xÈv¼Ó¦ $“®ñJ³ O)¦)ÀÊ$KöÚNÁ ¥CöL ¥œX­;ÅCÏ×äóiÝn—wú_­Pˆ™[¼Înœ^Ú)[ÑE@À°{d7·i™ÏøG4ós]^ Ü 6g˜ŠÞÛL€ =l,Y7« ØœpÛêÕêP–.Uwî«i¼ø¸Ùk1åÛªB…®F&ÂL,ÝS£SsÊw,+ššËsÜ&Œ(¯4<«UEùà•>ëf¥“‡—"óži‹yWþr?–®#‹$2“\¸W<ÈtfvÃ#2êìR@ _Ë}7,žÂܬ£s-5S>TZGOM>(oÅ'kš#çÈË”…Ž·ÚaæÝ„|¾@òè”,Xªï– ÙS#†Yî‰ »š¹–NO\+æ>¥èR?TëOÑ#ø/Žì±,¨¯kp¦&•·{ŠQ²è‡Ú×­’æBtf@¤èJN7!'EOËØíÅŠhZ¥—SbñÐ9L&³<¤Æèì†f¬2¦'„`v‰Øå¥UNð"¬-³Ò¡žÇ§EÆ0ÊûÆ]v [A Pã]¿®8giÝrÛñ°VHK§DNËä’±«šÊ{yUS¬¬|¼²÷3Ú =mÇ㵋·c,WS4‰©bô.¢¨äç;€Ñ:?­°€½Ð5€çbðQÙMViœÞôI%>öM§e&%/ï;ô ]cmÈøÙеnjìýµíK§g§ïÁ‘Þ#%vw–Bhž€‘Ò¡ ãte®&GYr¦ÀèazïD³^6E9Ø»›g´¼H^|KÛú–-H3¸oºñRˆFaÛ¹îæìløV=dPð­ñ>‚Ûä6ö¨ÙEf¬¬và‰áIkœM,"¨“É–7p j Ö¸[$¬°•B.­²8.oo ¥Ó°„ gVž"ï½zæìÙÕÍ&ÅkQî&õ2Ô ™Û”'†SkŽf¿]EFLö¹:WßìÆ×[&¾N7Öm )‘k`®ˆäÞïݪŠÅ Ð° „Çp’uV@KØñ¦¥cÛç+]œ1ìæT•!»q +%š"Bl€F #^ľuÚ¼âÎ×cr6”(®÷ȪŠe×& àɨrZݦ+ªP g$ -¼9x·÷d$oÝ%Ї+žö:ÔHބ˶Ț71+Q!pT–ׇiUL§·¿Ð€{.xš™Qø4*ÏC,±Ü."øÔc›MÏÃJì#|ix~[bt¿ì‚è„ÌdH>‡ÉRS5±£ƒœz&ªDºå"Rë ˆ˜[9t^þRòGY"BÖžÞi Ì«“zo¸ H(éÑ’´x¿¦$ï¡v}Zɵ Ôµ*3 ³ù¡Vz:H&¡Ò¤ü<;¦O3àÚÊ”ƒ…J;²ã";atãyÚo’û°- žìÍâ:öêUµàúN±,½cë¡*YªælÞX³GÆeã™»e±ú‹¹`ÂX+ÀF]Ksä ÈF¾ÃòDÎ`·Ý¬ipöU¨×­@*¬ã eIº§³!ßÕ]‘b$sr§;1%3Õ·<û³Ð[SøuJÌïb®ç±Ö“,ZÙnj­ƒRô¢k·6¼çìÍϵESç¢VO!ôŽÊA23±*üϽ2[@©ôqWwP ê"ÔYÒ%ÐÒ7mûˆ‹7˜ÃN%bËë-°áR<ÄVj™ ’?è Íkc‹¾é ¼åA^ÔÖÈ9‚±P jP‡É°{´ÄøïLò³c2dgуTûû&ž98ºžkð ð nÂè—æÞFU 4oC½5®†µË–ÕùЕ™‘sLTÂsínNé»pOf¶æ‰5- ÂÉ:0™ÑN²0‘ëæ ”1xú|KŒUÝ&²$‚vi’j™a=zd+6äN"½!ÿ/oo»kÉ’‡=Á}‡þ#€4Ü£ÊïLéÙömÈA™„!ƒ&)ÑÀã!½½w¬±²Nï¬KÁº4ô¬©“»*++s}DÄ‚ìDÕfp:“—YrEŠ.“ûûT2q™ðÿc‹êáŽÙ©DU“ª6(é ÓëÊd,q{ÔºZ5q¥Ž¤RT#½p¹Z¨ÓvÒî?u9Œ\b;šzˆÛâ¨!o3"Ïe=xcf8áÉ·…PïØ_(“ˆ¥ÃK1æØÚCK®z¡;\kT_ )tŽ…¥!ö+•¢@íG¸…sèãæ*‹ÆÐû-å+$S瘝놭éãVPÇOüXl±8Çï´—lU¬ûñiÉÝï4Sm8íß&ÇïS¢A“jžIˆ9±º¥Y®» œ/_Ã![4%?œ²éëï_~+/VFž¨Ù‹OoÆpbúp]s·¾~-©Ø'!é¾n~«¶³ÏMx‹Øy7YÞyž±›VtGdºQýäú]·n)æ¶ÔïáÜÖÕóŠn =ïã îp.­»cÙVUôn„d5t£Õѧ÷U¢¡ŽW”øûþ.VD±ÍI;ºI7/3Ôðj%œ@¤EÈæ±}ð =YL ɶ…´¯Û= Ò2R”ÔØ”X¯E.~» ˆA¯˜ôޏ ÌaUK ©ŠÁÈžJÍé¿ß8€€Ž-Ñ‘B m/iœz¯†Žõ2ÕÂ{ëP¼wh–YÀÌÝ5Ítˆ£ñeŽŸû©ƒ­õÞõÖ>Kmsÿ¹E`õíš÷® tc’±³ ¡®åqe¬¥ÛŸ÷uyÛÝ~ÅâR[÷Ý–ºF3ž£'Žïpqvg— Þ6§T=šM›“¿•Ô¼Ky p©ÉT¾$pÈ¢“®áa%Œµ¢YìÌ›ÕÕl¾ßû3[ksÝWÏê,¯ìP¿ä(bÿêW€ë­Ý ¤­záµê´Ñ7í®ôOË"Õ±ߎΎ߈"¢]þÅŽ8v‹Eu©¶€§jn‰tz»,2övn›8Õ½výÑ”5*¯h‘WXl2a3˜ú·ó¸ßo+{Þš9WêCfÚäÛÌèÙÔÍÃô\›öÉí$CÑ­ëRvv4éU…´X~YОߌ‚~‹MÈÄú= Á?Ý<ûx÷=B¹|Èe¨ÚÓ¶®fM¼Gâ~DQËnÉHô$€î%Ë8³¯¯ˆ¯­Õyº’ú~cºã{Éô‘?hï•Õ.ý¿ !I3–è·Ö]ÄAÄŒ’fÄ0ãy¥a`:}9Íð²€sú ²BEQöµèïv!$"Ù´¿î(>l|nJ[hÍ—ƒ¢ƒHEé±ìÖæ[êPu”q—E¬Á̺?N¦¹ƒùYæá±RÄŒü|fha`êþÏßÅ=ýôoß6êâCÓ`õß™£‘¹’v0’ ·[»‚¼R…OܳþÅTÞŒ1”ÆYgÚýào ’¾‰:ë§4ލÊÅ»‹ªZYäÝh±{jÛ’­AÓ™€H,‡¤¹Y¸Ç ž¾i +š¡wÏÄ©â}x–Zx‚$t êFïS{;¸K ™Ü橇šõY5ßidËD#Yþ]¹uº£2¿’)wb^Fô¦¼ ¨#&5E#Ý ÿFÆú­Wòn„K#³œ¢I‡Z¦ZõHAµí˜>5Á(¬Z§âÂõðf8ý/#¯ÚÍØ@1ä–=K !à|:'ÞÌTà¦FÞw¯mÊ’ßiLÑõVÏÒ(Èáý›} .5,Ãñ ß~‘Y¿+êÍ5Îu)”­‘ŒöªúóÍ ê¸C{tXJ»ë%ÈóeÓZZ0/ÀZÌrk%?XŠðGöyÇ´”`Š ×-Uy^tÙá©B7æ•"l[‚9Œèݼ± 9^û[.º¶Ï%4'…ðSL( ¯Îh€x iת†oH " æSøƒg`%šxm‚¯Æ×ðƒÊ «I»¤[¦âöcWWóz±ùpå^Åó†UYä’Í •tk/×Õ®Ô¤h_ƒqãƒU§Y-N n+:Ú[ÞHˆåØo’¦%…ÖHúGI!>׃½y›d®´%“I ×Õϼ’‚·ÕC¢ ;´g™‚ëp]Z¢j]†Y(ê+-‹².ÚMJwÀ¯™Sî6)´Ðv)÷î±[}æ8rp¼d‘W‡EÄ3­WÂÍ[ô5ófXVÀW¬ú¹5¯OñãHqOÑ" ßWÕI`Œ}‹®²êD yò lFÆû C®Öá>‘š…Êl¡žß¶ð‚Ü*½­ÂÚ_¸»ó;äê·Œ”±jl–’›·¤‡“ºùÝËd*óרlJ˱Îïbx ˜ ÑS)ïdüÐ7³EöA Ö>¸Ú™CZk„Ï1|)i\ŨsWßêTûš!ÿ1cO™[êi3ûçÍ+¬óþ­®Û·/N=ôÍ–2oæ¬~ã|ˉÞTÌwUU¬b®@:¨˜‚kWçµÛª†_W×#l,R4xÄ¥\+à‡x¬# õŒ+ίÏ»Áýµ÷ÌÕqÚs;ƒÛBw­Gau·îð…¤ò«Dx¹Kè—`Œ æî¶ ³ƒÒ?evëÐù˜nJ`#ø+Ò-µ‡£ºnÁ™/å¦ê!ñ°á[öSj^zЬbé}'Üën…·ס6Ÿ`¿øòâ·¬ìF&‘…Ðl5v€_ž€ùñ˧I¼¶Â;VÇÐM…¼Ì ºÃt”‹n`—ÅvO“›jׯÔûÁôz=Y ÜŽW+QÐ!$-f;ëÔ–› )°KP ÛÄôªëÕ=#vRqÌ{€ µ¡Sêê‚LHk©gÝŒƒØ­,PdžÖ9B2â¥`Õ»²šÒé΋¼´göMúhD»sÇmg¢Šs×£ÙÞ!³üÍqׯJ-B¹y Ø&Ĥ¥¦Š[AèáCľ,œÝXå<Œ(Cˆ+Ò¸!µVnPÄØÔ€ƒÑ[‘ή›I0‚PKèñL©h×%šÞŒH¯ˆÀ¦póÉÑ*˨ÓqxíÔ?‘=ºÇ•~­ê$=ZçÕ0¼~÷’¶–™ê¤fNS™*º '†¿ðÂMÈí·zÅfݽo/­Jê†Lœun‰|w©1Àvù/ ^yi”«J©-Ñ>7+¹¬àvwwil2Š×] øÆŸÊ!…³ÄdÀ}ðWVHÄ p\ù¹± Œj•‡£Í»lñ’î΃wúÃ`y@B=Šáe§üAˆl‚ÃJý¤Ý’í7èló²”tžfÔeä4àa»x¾bîÖÝž½9;RoFÒCÍ×¹0®£(±­²5TØïiÑAº¦ ÏÔßm-ËœÁñDËø%ÕßI|4GpSoMÐjfû/N(OP·]­S€vIÞV?˜ÂÌ"Rõm‘%t±[!ìǺEô ÍÁ¡¹Ù ‘̼¢7´¯²òj/xk+zºÇçTo!’¢mˆ1öj©±Ó}åêÜmývRý¿Á˜oÊÿŸ¸ßZ4£—$3yÑU$½ÖBöµ›è‰ÍÁºûöÒh”HN‹n˜¸–)u4X ñÈÅc½ÁÒp¿#®vhHp‰ÕKÏ¥ŽHõÆ»«õFG÷B>‚*—ÕÉnÌÜéª;šò¡«7J ¦¸ò+ýLê×Ê NRRI*K¿sÅù\]?ÊHK·zõœ!ÚX¼/¥ÜV·ï¸B6¦úö§Ð@$ÙŪî}víöÝ‹·Õµ®âé[*[;ùr 8þêaZÚ9šv¤œµ:›I¨â2rÈZVi ÍÆ÷ÐU1m´™Þ4ïxŸ4y .™æk»…K»Eæ¶"ü†›Üßú—¨‚}72fAÆ/À¯-ä(Ûï‚Ó–Kån#r„ y?ʯ:s¬Q¸†•èW¿µG kíêÑòKޱ!›­ Q.C „ÑÕ¢»rë·ªÒî/tkŸÒ\XЯUmD¢µ \ß‹hh‘Ű.$ˆ¶žŸhhþ1·3¥T®½ä h;Â#4e—>B¤³ß$ÚQ ?UúŽ€¨r‡Âµì1oØ å »¨šþ$­Ã ‰ žòHV‚šÃ9Ó1@–÷ó…TÅTNTKkÆËfË psŸõáÍ jÂ)'Eî-àþy€îk7*‡¼7mF?ê~“ h+dn+nE“êí:µÇ8ëö Ó›é!+ cÔ7ÅІQéêMi+ÒÕÝo0`Âñ\ò‘Êΰ i}¯[\c¹»@rô»²‡FSr ¦„žVܤÆ-߬Ï/#1Ûþtc;µ#² æCüÿ 4¬h9­9NLWU¼sk¯#…‘h{[³óÞm—õS·n#Zzà‚HáÆ2 xÕïïeУ|J¶E‚Oc¶8ïjتŠgJî· ˆ`ë¦ÞĸwÒ©ŸjCô]’3%¿2]‘WP†œ¹`ìÔrH]iÑÏ*T8ì´Õ5 =a%uq'Ô读—Ì-L™m¹£Õ–ŸS=M~:Ön¥ÛÞoM@Œññ!sH ¤[ôg‰V£[v-véî´ØË[”›1ÔYÍøí|[@uü¥Ê'D –Ð6ög4K]«Þ5˜ê”˥ƒP±`ªÞâ0˜kĬÐ@…ârú8«ïw@/"­[ÿIwÖ eÒź‰BWj1¿}Ž%o ¥Ù£]ôB¶\øÛ¯}»H—BF<òÛ˜áJŒ€¨Cü#iߊ {[3Ðç7 ®ÙT.+Í(¹"-’¥’•²¾½Õtf¦é¢¡Õrt t1h“*JªM¦„›y«œ§пá8 ÿ±­ TFš‚ý†jпŒÈ§W$) žša)"-O-ȼS³æ(|?Í’w*—«ÂH¥|ÅÜÃ%AÿZ#AžŽ©ü÷­ª—ÇVn¼ÉQg/~ºA¯Èéx5G&î†CŸýnæ¯Ëáà0¦[7 –NÃröQô/êÀe Ÿš¯!sî—Êñ£¨S•¨FÉ–’àî¨RlÛ[BÂÔî.qšS °{ä½ßØ÷¸cÇû¹¬tKqÇâö]¡¤gjÓ‹;Ÿ}6n¼è |ªñ7Þè"³wš» èlÆi£&ï7¦;Cr)C?µ«£tXƒ¯¥qud%ßÇààH ÝâÔtì’»v:«ùLßσèÖW€—.ÿ môgóOƒì‰a'p#¥#&7µ{%@°B$›ñ}½Pô‰MŸ<-”>7W0 "KúR‹Ì ²[ïaí§aù)Õ|kºaÜšGÖ¬!X +‘µ²n檯–Öù~[9£•Äreíe0³Øj"“ƒ§OøÔîS–RzéÞ|ô<À âÏnÝù~š‚ÏD™ð¤[ƒ9‚Úèqs—B³ò7§I…©uI„`С°¶×Ký$~ºòÎR‹·;S«‹¾»[½%ù£&rE޹FEÂp7Õ9}ýú­½ü‘µÙ§aÝ¢»Ý)DÑüe…‚÷,ë#˜èWdÊ"„!úy¾; [•ÀgC.MH@²v&ë ¼%àskè!ãi­íEÌûŠ€3ÚCý4µ=¡4Ók#Lm5ö:˜-†@V—½ˆA‘¶Þ&6Z(J½òÞ)7±û€w^epwÑÈÎÄÊ­™ø7›‚5¿²á ÄæûèÑÞFþ Yug0ÒÚî`sëy|±«¡w«Ô‹BìfV^å",Ä[G³ÓéáÙôfÄÑQööÐDD´'Ê¡¶c­ç¿Ÿùït±mͼ}â`Ï'õÜv¯eêK˜1+W©n¼Öñ ý7ýyd wPk M”âûïÿˆ72CUÕz#‘¿ Õ‹ " !ŠMh7(®¬¢·e/Yò«Æô>þüN·Þ\_h9)ݪ8úÖ+¹Š~ym>!ŒÑ[twük÷®S’ìAÖ¢FÃjéó~º5P4¥ãºÁM)6”fðwZÕ»¶yÅüûqˆïñ6˜>DzBJZoƒ(À­BÕR°Â¯ÝýõЬüòhö[ÜEUð’Ùwô¨.íV ØŠtrtt‰Ô™‰U¿UUQƒ‘÷Ø“öÓÀš5ï{çzt±)¥Á¨lo:&âe§ E·¤vµ)š4 0]!|z°¿gnHÀ”áË¥œºònÖj›Æ€PhóÇâ7H ÀǪïâítgåöÄBhÏPR•nÓw^½·žB)'kN+·©ìöìÞ Þ5tB¦%d€StýiêNæB)´P¦Ô¿z`ßow—ÜA²½kè9únV:oýapµaÃ`6¥L™ËZÜÌ›Ežœõ–…AúéǾÅ]ìãÓ.ùøõŸk銫ƒ¦–ê3§ïãêõµ ñDZ|Ð,Pàp„ªå/Žèë†\d„¦Ç£À{ë€?ö¹Šs¼ÍE&YÛÚ&‘&RŸ+–x»Ç,škæÍ™9*äïƒè}#UYßÎ:c³$¾Áx€N2t2Y©'Øûìê9Žóý<¶~4ZQ'Jç둤w™?Ó“pE¦#0hó&z!òMS¥3âüÚ&¡Šð›™¶R"n Åjpï·Ëç‹Ho]U¸E½bk{çnÚX·Ë’‹ùg{+Ñ æ¥DOŒ•ñ>½Œ%zwm­ß1ɱ.­KoiLòà-ÇÀ*™ 1yp6R]Æ’¾¡õ…ÔcLv3õ¼Œ“mƼußRc˜1ƒÓx9ÈW:±U)Æ Ž1ˆnôŠžOFŽI°ˆ=›ŒÁ•½….›×wÌ)¶¬¨&n&JÎÌÓ}<Ù‚x»wª…¦ßT çd%_q‡ß× ­dV×çˆý}7KŸã¶ï¤hy3‡ dì®§0v¦ ¢3±­ã“µñš#šl]¡¢2Ç-*‡·uk¸,J Ì32TÂÑMm#戺®õ˜×=Ô¨äÆ-Ÿ믳12°MRʰ°võ¤Íb¶PسáºQJf ¦:Ý07õÖ9¹1ѼIÍEÈõÖnëüÌ ®J.°¤qÓTŸ¨îîá,·~Á¢ä³H² ·È ˜ó§†ÃßµB‹özAß&*ë¨æœ3 ûº5 Á7Ò¢p`f 4-d ƒ3S€Ø¡&}:û`Q!ÆèV/⊚y QÜÖˆž}yïŠ (~¯}¦F«^­û±Øa(:zýúnïçà‡¶Ë¦´®’\8ÆÄ\H#JÆwÝD»Víø„±QÓýÇNâ¿çfáÔR?·2oía­¶ÜAiï9ùš‘=¯Þ‡ÕT ¹Ðé”X‡,ŸŠ~;¦„ø=¤}Ër¼ðËØûŒL‹ö†ÑÙ‰Ã7HI¬Â<µù³ì=:™ÛžËaŒîÏ‘~{¿[¹|Ív¨ÔO!g|ˆlt®@™¹òt²??Ū:Õ¸ØÔ†Ð~‹ Ç·Ûú·«ky£-ݯº£RÊ7‰P8Ë!Óü>Èö·v¥ñbäÿJ¥b:)ž~¢°.Ô¶x=þȹnRéMµÍµ Š%Œ¹ˆœ±§ÎðBBðn¬².êwÛþ3G ³Õ˜ÝL"íºÂM^â‡ÀVu»Ì¡Á\H;ñ9S¾dUGÖ1hwŒÀ*Tó–ðîȬz¯ªf…¸«H¹ÍÌ~ (û%®†EõÕµÛz\ž¤ð¿Ïžÿ­hìq]AN]ùSOc‰,c‘N5j7´èwŽë {=CìG\m¨¾¼–‚)µ ÝÎe²Óœ°Ýw]·7<çÔm ¾$îŒ}JlþJÁ:»¸v3˜+«§Šw›TkUao®`Ä\Î*:~|–‘"œîÃÕ€ÜÜNà»ÌC@,#Ü}…½Ûái\n–MŸ¶+7x¬Q^¡FnÃÛxǺÝÇùöÔ?ì¶XðƒØ“€†™åÐÔ,ÐøûÍi_„AÛÀòAó¢‡û”ù €!$sÝ;oœž: -ê4….mÖÒ±´£^ÖwB,u 7o™?FŸ+ا–íÔ—8†»÷ÓƒL®tÆ*5Z¹¢¡µ ÍCöë†jzdþÓ0]úZûu»9ðÌI–9Dq”Õ‚GzpN7í·Ñ™Tóû[t™^fgEÜ’\«³S§ÇüX;)îf¬ò˜Þ‡Ý-ÂÊusyV»ùÜWt: ãf |OvwãeT®+”§ßî[ÜÇOó¬ûpª¥-*ÖÀ8U(\ÆÓ>¾ÿÓƒ^ëß3:"O&y§˜†r»'ËöavRŠi÷ªÙ*ƈ‚ŒAø¿‡ÖOõÜ3¡Y¹_³Þà"-•fè9ÝÚ) ~z™¥«íªi 2†°T†7AXǸ¿ß<$Š*¼þ♚%ZŸ£:«§f$™€ì–-æ1›èÊÓd“£—±F+œ¾–ŒW¨Ko#˜©Ïœ£ðÚFeVÇ“7P£¥‚Ýiã¥×à!U¥©áOå´ªZX&SÄh1À.F°]–›úmJ¿þj¨*”ö.‹yQ½ó.ž›B¾wöP‚NÒGÖ†M©²¥ÿdsmèâ{©þ^÷_<ÌwÍåRBùü}heTÕ ûjÑöì“PC3 i¶”"EPÓ5i´bQL-×g±„ƒ²PÝïûítg+ŠÛˆëöê[R[Fºy3”E˜–ªVk°áç *Û{~§y·±f÷$Z–Ù úýÆâŽyéüøõßJ¡'ºí\Ëß´—OCÞ&fm ! ažbÈHöy®[·H+Ð=<Í<ÜGÈ®™±uê»ÿûh÷'þÚb±2G.U褗QéIbä×™]YÞ×÷p¨OÇǸœ½ßÜÑ®–ZðRJ¢7:nfc&ÑÍWàOhÆ}´ñ0*-ívè_Ô JN[ur8 ‰F©hn$µjjŠß®~c6jèY6ét?ö­}Y·ÆÖfÈ?äyÅòñ@äeÜJTò[Cn1òÉa¸f¾iÀ%•Y‰éyÌ´Š0sž‰¿ÿå¯~Y_þìÏ¿üõÿùð¯ñÿËüÿóþö/ÿøÿÏúßÿ§?ýÝÿàÆ¿ü»ÿøødþ³¿úÃ~ÿñwû¥ÿù/×—¿xý÷¯ÿË/ÿøúÏõ%}¹ì?ý__ÿã}ýãÿ~™þË—úåûòýûëËßâÚûË×1_.„vÈGY3Åפ¾œJ¿¾°~ÿlÙãáx0ǰ{û7¿@†-žÍ-€kYööÚÝ­Å8@¼ýßÛïZ5µáØÈâƒf;;Ülªâcvéµ|Ìhé#7Ö:yåë-\5³æ}€ÞùSž•µZH©˜±e÷#Ìl*Íf;rcf4wüøX ÿâ?üË¿øãŸþ§øñ§øÏøýÿë—õ2ý™E˯3õÏ¿üËÿãOü‡?üÇ/ö—ù?~üãÇ¿ýÏú=.ýó/ÿãëÂýú¯=„uÇë|¶â˜)3¿>¨I3vj·-=œ‰Ú˜í65<¡ÝŒ×àæ qy3îÇHÀ-Ð×ÊŸÍ£0ÿû׋»´¼â[Ò ?Ýÿo87ÐñÒ )£sjò펽øhÆòòy©Äf´Rª]½ÙÍû–½šæ£B5•ƤQ?ßÀoúÞ-™â«Q€Þû¸ôŽ=t#Pž~i¿M~Íø|ÀžüÙh«×ßð¨ï¶Ó[70(?¨Ì+'øön3ÄãóÄâÚ«ë%ä®›ù£|"ƒýžžþÿ™5WÔÌ£jb­¹°Ùæ^å8.̶ ªoOÓ0 êóüʟכ¨ý3?ŠÖÃöuÈöåø ,3eV Fi̶æååe7šdÆÒ]Ý2 ž.4óËês§íø­^ý‹ª[¡Ñ 3›–µ™=Ñù26Mä¼öþÞ¼ _G‡¶ò®1‰B†–1}Ôµ8*ö³Üi,ÞMÎÆµ¯ÅÌÆß·»2mV³µÂ¿Ï øâÑú[keú ˜ŠÏšÚµt>ä×FÃiíR¾Ìóå¦äB3ÒÖnä–ãJ•ÆŒ8Îg¥¹@†™÷ï¿üq\×j¶<—“{ý,B…Íl6éqú°À.µ80.¾-ÈDTMÀç5ô›-O8sèûŸ)zà/'÷f¤°Üf-Ñ^6¥^Oþ7v)r]{»57ã˜ýóg6ÄAéÍY‡:ò­q\«N›ÑT¡Ìøúv' DT3Ö~éE€æàôàò»‘³KX¸ô´jXf×fîw(D¦ÁÇ­p»ÍØ/ÞVöøÃ¯$SÃÌ.5‹h,Ú©V-õËq¾ÓwiËÐç|\3¿ücί1RÝhê¼nœqsO×Vá´»Æyá›™1=Ãw×ÝìÔ åj°t¹ÅmùVq÷w§ó©4€¾ª—¹ ’çã `Œ«Óü†[9”‹.Žmû€ïåX O——–j*Å1lsCê Pe_’Ž`usi‹ÇëÕf¬=ÇôŽNcïZ§µ¶=·}üòn\1€7O{‹ë…»ñÊÜI‘è¡—j2º¶#KíFÍ™qµÊg¼íe®^.áµ¾k%kľôcW§1·¢ÛÊ\!nnaž+®SŸðµ+v¡<ý0y™_næ fÝÁ+äÝ–µï`ÄÂ¥Xßm×.ä$9®®k‡{W˜ÞÓ¯ÕÏ_¥òÍ8êŇK;Hßuþùz5mmèÒâÆÖ:ðB Ç+ Ö*ôÆâf^S¼Ž;]íö?Âö»\¯ò“5ã¥Y5Yû}ߌwÐb²LÓUϵÆOËðy\± ×ÔÑSº/Ãz[Çlƒè÷¥õÂÝÁײbðËØ‘ñÒpÉŸJÝoŸ n´2%àKé¾íSì08¦Äû„TMåÓ»*‡;¿‹€f¶Æßn¶Öâf4­7ZÔŒVq§[or<ù6.M®¼ÅÎ4æ5nžq À#ßxÙ0M×(äM­&cÓÁf‚ÿ9Ö³fv\œ-´€*ôLZÖæœÑßîê0šnÝkÞÙ…éC¹±m¯©ë²•5ùc³šÓ£‘öüÇP±ÿw¼v¡žÎî›KFbêÒö6=dȆ³«o?–üŠ}Tù¨3®ŒSq[ÈјqÉm9¯‹náë-VN͎ǺÙtés±%ûã—‡Kc>ÿþá^Oõ8šYti÷K3V´Û¥nÜN ûßg?­ÌldL:"Å3 'ó Ia´f~³7eðJÝÉI©1€áìigµ8)“æ/!!ÐÕZµÅRܘ·.6£‰:ùwQÂÃê£(‘C”¡qcƒ.^öB½ç‡FU¨ò õ•Ç(SOÀ­fžÓ7\ëN½ø[׎ xºa²(Ämfže“Z7š¸†åù\žsciʺ&×9€KŒ›‘;«Í ³.K;+òKKn–+¾Ó,7Çš¬úÄ^ÃÁØco³Åuij.å¸mʼժlÚôÈFœ.?~y¼öaÔ‡;8Þíñ¹Žs@8²¿råó»#¾¸%íÍh§â7æþ˜,ÇÃËèþûŠÔ$šõ•í—íÇ.æ$ª‘w°D‘šðÕ²šƒéaÀÒݼ1ï‡lFùöD¥ºQ…åŠñ@îör¡0Ÿ˜+R}‘žJ¤ÿÖK P›.³ðÖYÇÏ3¤{ù°)ñ§®Ö{L¢!ùd—&¼e#FyÍì¿ãµå’S#7a§{ á=~m¾wæl)Ç6Mƒ8¦kx€{íl@ cìÂWsÐSFåo~³lMª.TÍØ‹™MÛØŠRùŠ@»²Ü8£v†ì} O險#çè¨W+0SŠ“ÍcT ½+V”ucNáÇôØ„z„¿Íôü†…ðùßQ­wˆ,U™#ØŸÝ àÛõÞUéŽ?}0Ûßÿw„òwšô:àä½¶1ÿů;³ºí Ä%ÀðÒÃswXÞËpèCÖai”&ˆ“Y–àFñ¤q¦$¿=2XY>€Õð6/#€#–¾l&D=i¤‹cÉLŠB¯›—Ò(¾#bsó]»»‘•igï‡næîsÛLøÕov)“)/`dˆÁÚISå[`ÅöëFÔÎËXp¢ØùÚ†«›À˜TÙ‚q9 àeFn7:"îe*Žêy)êíÆî[ ´}™T.&u…©îð †åMÏv$Óªnd]ÂŒ‚Ĺ¹/à^‡ÙÜsï×¾'@,þîé–ÕF‚ióº=§ªoú2fö†u!°UÑáÿd€Î¾×wÔšýú^\v`¾Œme7fW‚2co—z.óß{Qô9LËV‹µõjˆIb™ï‹h´M3³Ð‹kýÈhRÍÇèvRÀÆL$îjLNa™Óo :-ί}…øØé;RŠVוæÄ½Œ&áo´0»Ô&F c™±òT»ä•iðX‚Ùdoì,Ìt#×5Zyr Uk×Ýh.‹x­NΖ#ª}€Ë\!ëËl–ýT¶Xåõfû{z2=»Î¹?‚ Ø çagϵÌu}kï3æ C9ÄÌ®`ÆRÌèÉO|7Ú*±Å9–æšíCK!ËÃH#§x‚zùŽc †z<±ƒÍüŠñ4ßLæAEÙ«»fôäT”‘]ÒV­6só(w0’o“=UÌÈ"Êm?@7< 6wcð¬, @îØS;¾\ýëî¡ iæî1xƒ&(ÊFCF™Õ7=ñ2šË¥¬žiæº8[¨ªh€Ò|+Gת+#³ ëšÙÙ{fdÙÛQÖâ罦m:ø©2[ `ŸoÛÆbóÆä¸jq/·¢‚00µ™þiÛ°½¸Å¼nʼnüJ3Û}Ûëzy¬×N«°CÁ×^—ùæ¾4W|‰À®W®îáÉ<ÿ±Äí4¾45O¼2µ^öø)‡q=ÑoÓÕ–öcG¢Àh3çF•ãÑ„gMîòËÃP3N_[‹¼\7:È >öBrÃÜ:øÉi\ø<Ë·óå¿A‡Àiè¡S«>DëÚéçßáò7äFC4šñ¹ÄDÐ[„2fÌûÞ¸‘Ît»Pìôóø·‚R]È—–õ²“—û&ŒYûy8NoZq<º-mo¦Z|ZÑÒ Å¶uœ_NíõA=Æ€“`Å_ð{3.—Ž.)£qTAÝÏâWP.En¼Šî?ÅÇQ~á¡.CÇl‰Eásl:r*^Þ‡Ìјû‘}+šÀ¸ªÁ2™>@õ—äOÖŒˆ†ÄKw«‰)'IIïðöÉ-ôdè(š±hX&ÛÝÒ”n«ˆ.Ðk»œK+îÎv7ÆmM{L+VÑPš«åtX¯aóu¬Wx[Éw¸ì±¦æ€„ú<;`óuù)SˆŽ´—àu¨—Í^²Vaòƒ—.ÿèÑa5é-2EƒeЧ{°Ù»Wÿ cÊ„2$ y¤æáj/cbg`3Úêñ+Ëv͇'-ð[ÖÍÔŒÚJŠbÄ‘Ûm²K“c›[üV!åÆ>p5ÜWy‹->#–_Ñ $ƨÂ2Ä?V~½x„.˃Ì£G5ü‡G.oßéÇ/ŸôáÓØ$ŽÊqëyئ¶´Ãæ÷°Q7Õãö{ÞªÛúù8ŸOÇÊé:ŸU‡cíx>–ǃõx?×Ç£ýÁ 8: 'ßâÁ ypXŽÎÍÁ zp™’Êt07yW×U¹4-UîïÕ0¬fôT¾­‹®1™>„±Å_·ª“° غBg˜ëä¡Ô3Ï ö½ðkKSðyÜ¥;úqï8'ΔÃéópR=œj‡óïá¬<ž«Çøá´~8Ùß}€áè[½ƒÃòó6›ñ Lì³ø‡'°ÍŽk½v:ü#¢̾„Ô<÷Ù·—üñËã‚8.‡evZ‘§¥{ZãçáüÕ<Ä$‡øå!ÒyˆŠÔ1ÖzŒËŽ1Ü1Ú;F†Ç(òo#Óc {Œv#ãc}Œ·±ù1Ž?FüçäÀCáqxÈN3ÇœÇc~ä˜K9f]Žš)ô)²9ù¬å¤/3½Ú.•ý;ÙÂö÷RuvsóÖ¤…}¶ þvé%š1ÅßÏeïé,ÔaL¾›‘àâÞ\ñËÿžb6ž¢òtÿhYX„¾·´ðóí Ù¸ðF[ñL.]k¿×«ø cè@Û5Óу×Yê…± }Þk8øJÏõ|Þ\`*j²§~TÀEð«Èke™ÐKéÏ2„µïÉ‘8f¾ é0°JŠ•Aà­,ÿŽð„W¦±©Ò5::P.ºF3;V3OcfŸ¡—± ÔáŒðz¤Õq[FN4㨞•Í*¹¼æ x™N£^AŸ:ÕpÿÎU€‘°,<¿ãR€œ86l€yݶûûî¨:O&Zäö2Ž`5ô짪mæ€ËôÎ'P^ÿeä¹Ú5'óâÎ4nÆãµC¦©Ïs6›­´nâ^8€â™a“¿¾Uý˜sÆø«•¡š:µ:–®0µ›Ù¹Ýžº–/õÐê Ü`/s€­ðn¸âPR ÿ6ŒË1ÓîOáüç%g¾‹«û2&X¼¤*¸€dñ+-ÇîðÉ};ÎþÝO^ƒû9ë@@é $l6 ¶üïÙ “ïK„{?åpWË'Öøúvx÷Ë‹7>Hԅ׺΢­9£É•˜Ã"tð“ƒÇ$ÅÂ̓?†å­yÉ,ͽ¼¯ò…™>S,z!>¥&¿¯¹âè¸v’ÚDU—¾Žç$Çûßgò'ðb|ã„‚Œbkˆƒ5…Y“ŸíB¢àÒNP6J¼Òâ!E¦ów’.Ò<61câ繆ŸÓU=|–«ìÚvɇá'Ô§/dÒÌ47ó‡,ó¦ˆm/שë-vQ‹ã±Ž(djD¯s 2¸SS¾Q4¨ð÷Ì_2,•Šñ„~âR±Œ‚ÐÕ>A*^³©º ~Øã2d@‰¸YsœüPœ2Œ'XÜ ÚÒ›"hâx.à+×OâÝØi]sÈž¨ïñóÿR8" :k·Æ®èâMB¤\z«ÌgO%"†ùˆûIõ÷VœóÅ)¸}qȬiFÈwÃËñ•6©ˆÊ Ïl †ZmU ƒÛù“xxøbì A¿/2'àEXÞÅ¿ƒDÊÛbFÝÀ%NŽØ[å•MIë³P™¨-gÈ7ÕTÓFWL½¼—!øJÚÇ_ ð_6ÕRß\R ôñП€Ý°ÈYˆû)Ç h<ø÷Âäd¤àg:/îå01¢¸æ»GA§jf6&ç6¦¿î.¤êVÂÈP½¿´i{£$3dc¬oÝ\š‹Î`œ]›+1€ý&G¬XùYhý<=µÉùwâÓÞ´†îÆà¨†Çñ†È³xî„`|È·ùwŒØ(éQ©;ñÕÐò“9Šá‰¯˜žzàk¯m¤{ÉU*‚‹% "œ>¯p§ãHõÍCAdãiL–‚‰È†ãNǸñµ×v‰§5ʘ¯ÍqC³…ÖwÝJÂ¥º±™G ‚ÞvÛ‘‘"u!êœhõ>Ü MÝŠÛÃj­8ælÅì¹(ɲœ_%ñ™«>Dfã§ØúÜ´|Å‚ý±¬N€ïÛâq¨–†v­rˆË]e7*Ó¶\Ýd-ÀÓN"àž<³V´^›îÖa•Ö“ÝãÀ{þŒTIMµ¢öè»Ì+JMKÉV#‚x2‘MÒ:Ä sµ‰¶ñËVUý§‘k¼ÉFG7¯XÃý;ÏËåª%óšOÞA©·Å¥Q-É Ñ3`H®üû2nDœÖ¨:u²(c¼C ù=zÍKs0Ör‘7ÈÁ3v/UH0–á!uà᡽.ï8Áy£yŒ|KX&)IãD¼­Õù…O—@ˆ]Šî yzƒ>lÕn@|hÿ<`[ÊLf•ö`¾’ÒR.&2ã­ž‚LÝ—“ˆ<`«],#˜Ëƒ¢.vAOãøä‹±½™š½—F^T¢/¶]G^Ô%%l3n‹©¾+X6¯¯Í¡Ô ÕIº‰½Ëw 4Ð8ç€ö¼‹:8dìöæ-Q#‹–ÐiUg”×[ñŇ ®õ’¾ yçùü1´4§¯iþ³XRp:†Ür&=Eö*y¦ÀÙA¯~Dۜҫ牾´¹¸ Mùa–Èûïs$ ıi3R°×ï”`ï¸"4ïŠj°˜ù £…¤û#JË9Yn,}pýï¨u'-²ö—eåó$ ,‘þÖÀ>ñ—BUÄ™^…Û˜XfÞìž_« óû•³Êˆê}"íXãwšÀ¢CÞl¾‹![ì/Fv7³5}1³5>t£º“ß$ k±äQ"·KëÓÅÐé¾Uü½•¶1Õ Œë³Ò´‡!^:Ç¥d–õ­Ô5PÝHœÊÚ>i³»x..†Ð®[ÉEŸP55`¡Àq§t9ÑùSn¤B3]Iˆ`N®@LÏìûST~˜=ÉW—<Ͻ®jwÙ ßîƒ&†JLWd>(kUãnSµRsµ‹Rt5‹j°îÐù& ÈÚn)¡cî‘F©J.Ü:çðj—~ŒôE|##k€×tje³èw«±`’ï85¸Ÿm„c|ƒWl¹'=à<™ÓU‡90vy‹/ŒS)Y;¿}€îÛ;)=ûîØŒ¡çÆÇ㌌?B# ÔCÉŒµë%x ­Ïü½–%u%[[~ÿ·jîŠs´`ÃRΩîàvÞVabh…vÒ`zöÀ¯$ܺ‘G«è~n ½Å‘—| ×CêyÆÑ6|½´­€Ø4‹ ¾hÙIR²Ú¾^¼ÐýÊ$  ~q厕'¶õþÔÔ¨ó®ÈEàÀÛšÎ=újqüê…`¥‹ ïIDm#¨¹–`Ðl1Õ #12˜«Ù4Ù5°|ÅS‘¡à\Uæ3We-®Ôù8Ý.MÊ[ˆß^Ò­4¡ó–+)ïÖZ!“ “)bK—+JÝKõP­€äwµ3<†Ep#Ÿ5# +TÛ[^QÕ_~€É–0“r  ’Yòš&¡Fî ¹Ü‘êWò:+Å6†ÎÒy¹+˜›èê8é#4ÍU‰?Ë'»/‰´] Ú¿¡Œ˜DzQqÝ)ÇžI°=7K_ÀêþRg¤¯KË*Ê5ÆžÚòV§xÉt¦g• ÔW8ØÔX¤£©@‹+(ÿiÈ÷3ãã— :0Öežµ÷§åŽcQ "Ù¤bÞNÞ”aãrú–AŽ8tM˜¨ŸÁ؇0Šs9³”hfU_!”îâóè-[­BaÙ$€ì(”¹(~²yLÂW›Š¸¢0b+þÁT;©ë0×.-¥žÃÈóдÁµiÝ”U¬«.ŸÌÚµú‰âîÇuczá%œB´¦­:¤Bh•†‹1ù•{Rø4 7³´³‚?½Nrh§˜BÍzÍéïI»òã°.ÕkÈm[Ÿ¬'„©ý]ŠÖ.ªQVwÅü©\àÌ%WÙÞ—êMËpx”íFb à 'î¯ öEp~åpºwxqc"jª‡¦€ gÂÔ<äò?OQNµåhKY¨%&?MS¯óB“õŠÝRà k½è¸Â%k¶öŒ÷[ɰNR“f!^ =3ÙÃ&_÷v„þ÷=2!=ɫ߽òÔ:í¶,ndü=€y«),ƬJ˜­©ÀŠ[-U*{õµƒ9–Éo_Ø*n¨˜fj<©ýo‹J=f¦TÊ*WYÈ-±%`M_®¥IíTJ,’´ÀÍ/N_V.S2êÖc>ÔÌ! g2ÜnœÒ„#H¶@»¢fÌreì¶wõá B³¢~Øï?ûbðÅ&-¿ðõ&¡5ô Rfm*³å„›= #óÌv³÷„¸•½6ÿûOXFÓ`w”ã2T”m]̦¼Ž¾jÿûÐmLY;tBuè./{XÖP/+JÎÀiÌ•8³ÂuöBK7ÆrYTÓê®7b\BM9{6F–ábuˆ¢¡<&© #ô>1,™­… ³ÍHÕe`X‰b2é–L «r5Öc:J”O€Xëâµôñ >"`mK{µ wsiÜ/™Û˜ÄVg—ÐLšPHî¹É7VXäõÝ;6Õc&WöømpÈX–%6Ë[½ÓÚÉN"ÎІèò$a¼jj3´]èÍÌZ nÖk-v-O¶»0i‡x¤­ùü¶Æ (X\ƒM ¨AÄÉ£VÀd%§K0®±°ì‰eášÄ—±|Ê_/%‡0)b¯.⼂¸!1ø©E! €³´g$‡Kº‘•ôµiߪ×h©Ào€úw/³èÁHdMŒN"SYdÑlà?2¼^ù¶ ÷OfY¥çºˆtF*•Ób«Ý X‰uiR!5Ž”çÐOש3  DW.Äìñ 4Ju©z'ý1QY'h+¹x›ú„}îÞ]vhÑWCB'wã‚ðŒÍ—Qu~¹í“ƒ×Rã KDŒšw`ä'Ît£²®}gU4¦™gU‘!yiÒ¨›tŸã$©¡Ó²’æœåËãÓ˜žtó Ê´$²´ éÌlAö$ŒÐöjjd˜äâ±.Fõ 1ÉG¥ð¥Ý|€ê‰M7»ãh„BšªJ`†õf6µZ‡ÿû®K i_äm#?"Ô²©pPÍï¶%kÒ–ëÅ2ØÈd‡G)píW cÓ ¦éky~ Fëú¡!œst£•› ®%—ªÌÔ®!xã ×Ïͩܤê\§z¸È99œçƒ×û`4ÇÀ¨Ùt‡×÷!Ä2IÁZó.ÒÏ$Á#¡ðH=<`~æ^üwˆs´êS+ÉÚ6úA³À‡ ¤ø¡:– Ek¯íÀ(hÁ¸6p^hîÉMÚ1ÔIrðÒ ÍàÜ6ƒò[¦µoÀ÷Ö$è‚ûÀ¨²VwR‡ÿôtåo/õ{ [WwÚŠç‰ä+h`Í+ȾOÞ2ÌW嵪a5¢ddeÂŒrWQs¡áNæßWlSa ®WÀv)ƒ·e˜÷Ýfák€‹D1D›Ð¢îÙzmôô+q[^½‡±y½×úƒ‘þ¶ýMà¼IÉÚ¸¾<¥Èb(0ìíf‚ vÄ€c* YÒÈ@ÑŸHƒ­6Ñ™pøAê2ÎÙJu¾Öú©B âìdö Çž†0W(x¦@WÐsÝ}G‘} ‰òcPæH‚e0<&¤d„÷Ø©ÛâÐ W#çß’‰à ü-œëzíS.îâ ¸þR¶¡ýé~Ã$Re ,d°v/"Ù„ë% Cò`ðG zåFò’QÇ^‹Æ+ký¦Œdä ŒûùÓz׌ÄíNOTùUiÒ>·§‡Ã;®bQ½¯­îƒ¿çt/_þ[Ú«–îè ì¾vîw¨_‹™“ܬLo‰å®¦x/ÓzÙëï™»~ÅK†cEá3Pˆ÷ŸÊ8ô[ÎÊ|ݤkkf´Àf$–Þ¶ðÓA°5Íì˜ô÷“óeí±òåË‘é!Ëiæ xõZ~3_Wx¦T¹8YÛW²þv…wÀj]KÜ(?‘¯ ¸¸ºáõ«|Dä Onf,œÄY•ÖöìtOÂùšÄÛ=ƒôÕBñáiRœA›¦àÇ7nt¼¯ž¤ðw@: Ò!ž‚ÆBÞh÷¢,!Ìž$©AT m¤(zŠU¤Ì#òNÒUO‡´~ ¾ ¶B5¿£qñ[Ë•hsˆT¡ãuúR8‹@à/©À¬Ç’d^ÐGàá‡ÎbÛs³É[E:¯¹*v¾EÖ9[7°ÈêFË(OÇŒTm4—¢[öÓø‡r‡^E0³Cb€à÷Ê Œ걦³®½L1Ï]¢W¹÷‘(kŸ´†F @š¹NØ(aüÁܩ䟋X0‚m‘E„+Š[†‰‹ÎRE´ŒKTÐUädàXD¸ªëݚѼE 9òÜï€âè|“‹F«]x¢šÅ@“ýM;MJÑH;ýÛ”UhæVEbxÅ ¼ò&uˆ¾ü_œÑÆÆà£W ûR\·vr’o|š‚ªºaß=6‹¢3ÎÑêó¨±fB“NB´ÀIº+¸´ X4 2…/%jÛó.>Ö˜†˜²ïæA0…7kŠÞ·(ŒM<-+ׯ lQ[*hëOl³é”Y„(+³Ç"—îu‰†Š9d`®Ñ´ª3>¢†áÒ¯˜,¢ Êóê@3¹Ë±qž¡Zj}Žåjɳgœ½.ÕøL±sðöÝ|.²`J›³ ùÚ–ipãºä•ÎYBQÖkp´i‚´„K±‰Pq4ì“BpQúÍÉ lI®J“r™@¼V”jÉÓù>õ8ðõË ’8x*—éƒèÑÓÚ%E½/ùÊ&aLÏËa¤>ÀŒ}ë"× URFUÂÞ¹‘uÜiÊ·~ô¾Çïü‘`‡$z]œµ1ÊfàYCÏß6NÔ>섯údLe á‹Mõ…Þ]pýÚ²ýl*ÖCC9'W`tùNÄ?XUfÙk°ØÌªô¼¬½uÈWH©‚PR³º9]ÙÅ]ºVÃ^6<)ÕcKçsfž½f[•¶qkƒûó,Û#1swìE7(ÂPÖ¹8&× ÍxmÚS}sƒþ‹©çÐX…ö(:Mæ}'*Åó¸Œ6ÉkP£ð\ÒÏW°ÃõÑ«O¹Í©ª›Z?`GÜC“Æ&o~‰ÊÁpmnP óÂègMXQ H‚5¹&‹¢+Ùc@« éTjëÕMøHHæÂ9%F²^xÇŒô¹Q-ÙÛ˜6¹A ¢´P¦'ΦIJ×CÒ1Îeq½ðèM¥™¡'#©ÈÈ{K¬&ád!D!Ð1u©öær‰à uàпÍK$óâ;0 7渴›.ŒØCrÔRѱ€JÀy…ŸÙãx‚쇃Õ6®ñˆ¸4Rp‰LÃð”ÆÏ]õJ uþîi.-µÚlŠ…ñj—§mc§Âq!LÉ7‘ ,´åXsxT¤ Õæå`¦Õž”àÉ®›Z¯h¤JõWƒ§1ß:B·rÖ¢lë`2Ô^#{loVÄ~ƒÆ¿ÇKí•Q[J'ϯû ·†^­U¥¾òÅ4bè •ç¤[jXTGô¨(l‚mÐGž/#«ÈgÐGj#'WµÑzÚäàEÿ1&ãF ¬zµTC‹¢,…Á'Ù7îŠ}ÄðžK¡ ãò0Îâ•Ê·X§è¦–—q¨-P¡5 ´Ôv“Žƒ°ÂIøMüU£Q.àYt‰×‰t*°\î¹øßïC‡©]Ù¼Y®Ÿ¥UèáNòÙòãßÿºKtE„#ôyÃ%nÿNõ­07Y@ù¶ÏÇ,'À^|#Áüûgl^\*å ¨y ]} šÄEç7 Ί1“&§dó?-Ë´èK°êk_“Îe%È›g¡Ãؾ¾äé‚`@ï—#‹``O þ¦ƒ{³e13Φ7#ˆÝÆÕùiå=@ÆæÐ?yLç+Òvdèð®£gÖ(÷©!ˆñ¯3ø,bt7q Wùm: …h&û@ÎJUêQuáQ¤ç…¢»f`—¬Áß’ÿŒö2#"N‚ì¬?ìRÄ@Ûa˜PE²¼%é±uXóEÜÛÐ_•l™@ÞÿöŸ[W˜ËÝÌtÐÆaÙ^EqêbÎubwÆ&• ücÍj܆ê/©Ë«þn¤ŽQ˜dZ»Š‹‰¯­á3¸(™T?Ià½è’c=gcн‡À3";Òá]¼)©-·@€o*hnñá›y§˜I:BY~(_ˆÏC¥ŸY£vëûóP]@@a3fŽ*'wÆ~e xmc0;s«W±3̺hË.gwE! ÈÛýçJf(ŽËOßÀÖu…™ðD~ðOÅlGÓ¨¡;§ãf¤w$ŸIkbȃriò‰`3*ç#©Mîr¿½\ß„I=,A xæÝ8z'2ß#ïïÈ<² OÌÃ#KñÌg|à>y’GFåûòÈÔrp|ݳ÷|ä xÅä#_ùÈl~`AŸÓGnõûÈÙ>²»ÏLð#küÌ/?SѬõ~û‰ dÍŸøõg*þ™µÿÀï?juúJGÕ‚£¾ÁQ ᨛpTXxTc8+7œ4ŽzG툳ÈÄYŽâ¨\qиxÐÃ8jgU69ÞÄ;Ž*OŠ Gõ‘M’ƒ~ÉQéä,ŠrÔO9è¬<(²Õ[N2/Š0ïÚ1G™'=š£vÍQåæA稞sÔÙyÐäyÐï9*ýUNB'¡¡GM¢ƒ~ÑQéèQé$ tPZzPe:*8½+==hBõ£ŽJSªTG«£ÖÕƒ.ÖQC먶õ Ìuñ:ª}=(ƒUÄzcÚd:fGųu´£’ÚQsíAŸí¨åvT}{Tˆ;¨ÉtçÎug5»£îÝ£FÞQOï ¼÷ Ò÷ èwÐþ{Ð (ÇUfOr´gåÚ£ÊíY÷A;÷¨³{Tä}Pï-BÐ šç§hm%/•=À­q–ÅÃ@Ê“æå. î€i;’@~ÃÒ¾Cu«P¸EPÝItXàñeXº®y-å×òÅ|Ìú:ͲûÎù ùÈ%9²N*ïT–ãåóÀ¤9snNìœ#çÈø9²ƒŽL¢#çèŸt¦28Oü¨#—êȺz`hÙ\GÞ×GìD';òÎ8j':Û‘÷öÀ‘{àÓ™w'–Þ‘Ñwæþ=ðO”Â#÷ð‘§xà4>±OLÉ3©òȾ<25#k¬N"šŠëÜû]qar‡xÆœä7öòÓù}¢OyÖGFö‘»ýÀó~à„Ùã'¢ù‘“~"¯?ðÜœø#{þidåŸéû'¦ÿ“*ÀQ?à¤5pÖ%8*<¨<(#4ôŽÚ G‡Ň£:ÄQGâAsâAŸâ dñ zñ¤qÔÒ8ën5:ŽjGå£JÈIOäA{ä¬SrT4yP?9 ¥UÔWŽJ-'I—õ—ƒNÌQOæA{æ¤SsT´yÒ¾9¨äõtµwŽ:=EŸgõŸƒPÐAQèQ}è TtÔ4zÐ?:j%U•˜P)ÑÓ*y c$WTÜŽ5ä;ÀE²7T¬°’ÏAñ¤Í‹ku| ÏeK†šwMî:l+ô¨Bõ XuÔ¶:ê`³”µŽ*\Š]Gm¯£؃fØQ]ì]‡ì¨XvÖ6;Ë =(¦µÕŽ:lOšmGu·“ÜQ5î¨/÷ E÷ [wT¸{PÃ;*ç5öôøÚ}G•¿EÀ“xàQeðA‘ðA½ð¨sxÒD<ê'ž•Ï¢Œ9œú©~˜Ó¨ýz‚FËO2‘þ×E=Õñ/‰W^£e½l÷³ž-ê—ï2™ŠšOê›g΃¦çQÿó¨ú *zT =I•>ªš¾  •RUUO¬ïJ­GM׳úëƒNìQSö¨?û Tû¤jû®€{ÔÊ}ÐÕ}Ðà=¨õ>(û>¨õ‚–>ªuŠÏšÆGýã£Pò£¦òQ~ù¨Ó|Òt>ê?•¢U¥_ŽNa¾?$Í+ŽØAAì Iry ˜É80r ¢XcŠÉà r[¹„™„· À ˆÑTÓÎï§Oá_ÿ'­žâèÝcu•WJ¤´Á8ÕGræ|)­ ¸xßš]01¬(¯6[WÕ­K­©nj k+2©$Ó0Jà¦nB¸­tj×ààSIÊ!¼Bý0š4Zµ?ÀļcÓ¸û‹ÉÉ–ªŒ7ÉKñpzˤmÊTi"ÀH‰wT&Ð;¦g `9[¤&Vâd­…Ñ&扙Ƭì¼ul5c¼×>ÚŒ;Ð!Ú¼H#3[¡t`ÆÉt×ÎNMÃM6.£’b”ÆJ—‡ÏVÒÚ¼a¾º|)9ÀQPfì}´ Uj‚˱¿|vÅP´»âlójíTt4=enÀT)Ã:GåÕláž»‹†LëXmJêgÙ¾¥/cËÀ..9ÁÛþš×u^LoF–ÞFí’-á{Á:w:‰I™ä¿E*)ʸ–p]JâI$k”#z îKxxYuS×f.êÚúÚ¨­uÉe5ѯ¬s¤ï¥W–[`V[”†ÍèàÕEDÑì ™nÅÒI^ü€¯èŠ!æËù©Y¾Éì„×åNº˜3ð‚3|T.Xü”ªÛpg­ÆifV¿Ìõu(Œdƒ'½® «ÆÉ–Ÿ‚åíoæò˜å«£ò ‹ÞžíÖc­sHHHMÑåàrê²Mf/Á²Ü?•)ûž#®—ûœ6€0Óe£O®]l2²# + e„KyEÊç¬*õ—ö‰´#‚í»”âÌ)3ƒŽLyxÛum¨\+¥\õP|¯/#Á¸r5%‡¶~PRSUƒš%Je)¤‘(ºb=S5Êõ¦"F]KY…”—åõ¾ZÎë5—|Yò€Ù7˜+Näœ#ù{mb™Õøøi„_®¼Ÿæ*§ˆg¶›šC¯Â*ˆÂ]çëw’ÐbAÄÐgñôƒÄ“—1×AɺTfd‡´½lY}u¤X“â›ÖDÚ±c2Õÿûªöµ¸û+éÒ׷ĉZÕé—1­Å9¹1‘‹¸Ô-`‘@1…‘\éé«'އ4÷v™ 0G}ÀÌ“¬gž:I¨Û—Ü´ü,ÍM—èÒçþ²í÷džӖ;÷BeöTyúV›Ìu(Oo>·¶¥„$ÀÕ[ge˜{¾¸‰0zœ{6Qun$2·±ÃŒ* eÕx׫ÅI’ÂÑBM„ïõÚ‘a–~j Þ÷•…8nI “4(Yåî*Ô6*8C'Lái a‰‘¹2Dæ¾RÔú’+iòsMJ.ä t¾äȘ]Á~iÄ‘¨ØdV?$©¤†ÊÖŒúx Q‚|Íðê’Z#&á4…L†E`5/7ö(d¢Dʼn…²k«ÍZöä’šI§M¹˜šoX×Bÿh­ƒ©šs}q̱ë•VfóåµC%ÜV'¡Z+Nùz-š®'šqÈ5©ÐÊ©ºD©·ÒlÕ]_@[ŠaØE…˜¤ì9ŽãvI¯–HÒzK1ÂLMC\K…•K®y øt]_×j]7K°Y\*Ï©B|„<¤,KõÇ®ú3èÇ4ªröi\Ê{6Ðýû¶½\ ¥äÛÌ–yê²ÝpJ.öM™ôg€ËË+Qç2ËåÿXùµb!F·\–©w¿ðl±šºðú¶­`õ*K ,½KnJð´g‘qT]6AËÊïDå䱬Hž®: ðÓï¿?^~¹6 œ×ªÄ®î¨ÉéáñÆ+4»ðȘ\õz‰`øó¡úC|D÷)·çË»Å^¥Cœ2j’U`Ê;õ;JɾÃ|µJo_6 °TÊ;æ­7=ļ«ñÕEün‰‰ƒ±;ö%ï¢nµ®Ü£„Ö¼“›úÑ#qä1ŒÂ#ñV}€0™N”ºýToB#ø>ø>ƒ?¿¡¯T½,¤jæìƒfIg5í̦»ÙD^²ÃÏ‹\ŒîQé§S£ˆâ¥•l0Ç|uêV6I¢š\«4É@]+a¥7yXÄ?ÞWºi'rØÁpíÎ,°8ð«Îë6‘~É íÞ Y ö82ËÅd’zµŸÀH(ëò4„•î]θÐ5GÕ 8ÊêÈ €e/ÊF) 9ºDÌÍq 5Æ¥‰ï~J¿h´(ów6ÜûƉAd*á?¬3Vã’vp ­ÆÈ7›¤°«6 Q<9‡ut³£†ö07–ô÷¯OI³åj»«,ÁAûßÞáaGFˆ‚oÅW¸¿è!õÇQö;7´«W)¥J@ JW¢ àZ Ñeõ3EÖ%Å ÁÜ ¤f;¼‰P6¶‡„êþ”ݧ¤š'éAo=£¨p«ìèÚꈎa «Â¥ªéP—^Ä­†Ô¦å^'ŸVHÿ¶E÷Š„ sxšè!ÍîN|“&Z|Ÿ(CÅLŒa·;m–ðuØØÅiè|N®œ’‡û{@æ/KÔ;z%¬æ‘|+æ$þ˜%û¿`;­ÉEn`  {€á×òÒ"± ØÈ¨À¶vIïpI/ËQ v[T?­Â:bVz(Ò)…YÁ'à¿¿ëBs ÚÆ¢êsK¿iªúïÒ«'}Ö³–ëI÷õ û ${T=ëÓ>hÙ>èÞrjºGåÝ£FïƒöïQ%øAQøM{ø¨Qü g|Ô>>ª$?(*?¨/ušOšÎGýç³RôƒªôƒõQ«zKZëoS¬à8‘±ÏJ"×»ãtØ¥zD?Ð?À:ýÙWú7x‰F’Z!Œ&²Iv¬ ”âat? ZdxáÏ)SÄ8UcºÏÜI1{ÉuP¯Íܼ" J²7Éhû·BhsyÁô¸À^º®É—¼< ]†¢XÚÊæ.¹vÅ”vöi°ªù} ó<—¾ÛÚ£ x”Òæµ¹Ê§•«-»i*ˆk3“1µl!‹•Ãx znY,7†¾³™½ZÐ\ªQÆ‹FÖsÍèŽP¥x² h"‚1‹32_>ît 83:ÍÅPX6RVµyû«+­ÖO»ž«,îEv¤ZÍ-…hfꬮ(W%`\Î?6cÈ+Xa×$ÇçÆÎ’åÿL©o7†ô$€êL4SwØTBÄ$H‰ê O¨zìRÝ8@#a\v­WÔsÙï.Ôcs¬ f¿ôº6ç*ñWî(V,PüWi¶|©¦ì!-emmõ ‰L,¡-ª©rñ×J8/n€x×\’Ź˜?¸2¨°ˆÚvI"1•_Åü³ ³9ÇvHݘ„ÓÚ1]è\¿}_ï©ä>+»ó‹É`xj<¢ùõn[ùüž_«É’É®0l[Cí&Oª%Î*| ¡Mš3 `¬RÎä®·T2Þ뺵+$³*¬k¿!3ég³ÕkéÀg•CN¢š!W·4»ÝÀ88@Ðák÷~;ß´Ê—®%áFBìnÀf¢Á–éÀ¨À4EiÜ£õæé£OOw@›N@M,sÓ&T\çÎ1}‰ªÊRft2ce[…o|ºu•Ð=ŸCx%øx].*¦d¼¿„¡\@-qLÈuìDz`Bô¿ì§‚M5ìÚËfœ £D­Š2™E u¢k Æ[±¢:Oã÷ø‡¼?Ç @þjÅqGÈb^ÂèÖ²µž§øÄ0.9V9ôÞëV™Í¡ÈS£zúxä݃£#ñàt”£+óàö]¤“3ut»ž´£+÷àö½9ˆGGòpä¥dÿTb êZTá'{0~>ÑÓêóa‰}üò¸ ÷§%þK|ºþ\{ì“âÎÑú¦F_$XŽXµW‹ótSZÍÀzøFÞ\ÿ÷ùã—Çþ¸=¼m%ß´•ðHË,CHû<)Çëâ›…cæF/5N”àÑ«UãñÏÙØÞÅ}VÒ4³gBÝ0mïI_6s3àYÉú.ÅiY ÈJànú2õ¹"ƒá ÈjX]þ}À¡÷5y©N ¶>r£Èê.ŸPnºWXqS”æ€Æ;Ù¨˜§öÕ|{Q}ÌZ:­ÅµE®$ß§ð7í¬5¿!΄áníÑåój × Hîˆá'°Ã×\Ä ?ñµ »E¢-G¿7ꘗ2bóšACåÐX8žØ(<,­#š¿ÏÀ ­ñ†•p´F|¨´xúÁ`]%`M Y+KX¡ ˜¡|¦5o-ü±ÎùZâYqÀ`<à5ÎÐŽwÈ-òßœó/j#U•ЪrlÖ;£ªZGyÏ ”}Þ QTB´Ör®Ùp„—uñc,x5Ñ/ åÝç® ’ƒeêdž'5ªFfzÞhd¿Rt8–'Ž…Œ2cÿvD}üòè¯=»ÃÎûk»ôq?ÿ¼÷ÿà9¦-mÚ”]…W>®ÝLÅ1†É{ê|Ó#CƒÕ$DŒ”C0Bð?uÊOäóÙýù”›åwÿƒæå˜‡ÚB¾Y:©›údœbR[Aµ·§·Ñ=8PHaw`š¢z1ÆèÂY"'˜Í4qßÄÔûV¸Ëå~W“‹áÈtëâ×nú)dyoŽÐ[Ðô>Ó`ˆhö,Ýî§üusŸ)KcãWC­ùtÆýÚyx<9O§ìNFdàk´›'Çf†_Õ îþ¦+Š p5#3i%àßïSðÏ"ªö~Ø}üò+ãñ}B6¾£ xÉ'h¥ÀØõÓßSe§†¦Œ”9qo÷K´»T]¬/× IV1€`'m }€Íoòýp­‘ìyðÞû·ŽÜ4»wú|?ôè~è4þЕü¡ƒù©Õù¹)ú¡ú±ÓúSSöCÿöc§÷Ç®ð‡òÇ^ó}é=ìÝîg,uJ›ù ¨EJ3Œ,É[½Ñ ‘¬ø;»ß, rÞÙÍ(@þ¾±ÓiJÏöºÌrY ׸RŒx†°¡ß-Ž\<Áž+/–,Wì`öº8¸&Y]âjŠÕž50¿ìj@¹ë’`û°„q_€µÅJŽÞ"ñ¶Ãrר.I¾ØÚâÆr9êTë(K˜›>ñFCY×.C^H©ÛßCÅZJúç!~¾-6Âu¦XeŸV´:…™Šõ0{Cü95‘¾¹ôqÿ´œv‹7ßþƒföÐ3søö<çad3Ð:µü H:bè¿Ba¾L'G|ý5tçzBŒÑ¥x5ê M=¿ÊxƒêN¸Ó嘋Äi0*Öiŵt>i[˜áQ Žf·e ðŠ^e®Ü™f ä»rÏPð#jü€/Ä¢"±‡˜í-¾;"¡»ÚZØF,(4©ä@ôQÚ'Ž´Bì믉¿…b’²GùÙìùEGÞQQÒò)‹ˆqv»À•… Ù7WmaY?XF·Ç¥ Iݸ³}©Û.™êx‰÷ Æñ-…úH Lãû$žfºÅ"¡dÜÍŠsÈ7Ѱ=šÀLíE–³ŒÜð`~“¨óaË–YÙíBÏ!ÄÝ@îë3˜î »û ×½Ì8]?MŒ—A2ý o!=6Ó̾;«) ídñ½OÝ)Ðg Á3)ðÂ=Њ£€;&ó`+A·„˜´Ìh¹GÚ¨ Kv‹$ùa;¥RLbß´VŠŸ¦–øwÐ=S€tT"3äxYÜõÞáôœ+D ›sŽ>h–{W¡e²R¯`ƒû^KÎQ¹RÜ&‹&QòÜŒëàp3›Ôc·ÁÛÎ1À¼9òb¾ÙºñÚ±ßáðœÃIôŠ-q÷A3ó&Õ˜¯&C.¿hz¸¯&X.ݱEöGôõ• ì“L )È0Ê_¥$§€KR+Ê¡GfHÕò+5–ÃpD¹ÿ} Ðåzc_]ÉÝ»ì™X˜o+èJ—‚ªŽæiŒþ; ¾YnÃM[¼S¸Bô¸«Rµ ]2˜¥mwû)èÓ'®ýIµd Q½ˆ¡'5U‡™µT ö¹ í,Ž€j~0þ®¶Äþ ßxÄÙ€^¯þác§¢ì¬Ã„MUÀò±‚><âúj"ÿl›lì “/P7†07<„iìǨ¶ÚÕ…£ÊÛ»µ}‚YzÑ ØíaÝahÞОs(Z­)î>`7XýÇS%cqpÎhÀÑvGs¼Aö¹ƒ:ô/£„kœØèSKo½:µÿWÐ-"}åµÚ¬yh “@§X¯%,ñ˜_:>,/{«×Öñ#>}é+f.9JèCsLG—íWõ–˜‰ „·ìeœÄ5d¹Slý»¥â5a3•÷–Æ4îj† aNj–9­›£"øòÚ.u’º¥Í¹,L†„ÂÞW¼Ókw͆ysø™ GjØ9‚f´]©$µùÃÌ ö°PjŸÌªéK»¼Ñ(\d!b|QO™µ±Ì E·[Àîßå¼ÇEeXE—­Õ,!Å5h{‘PµfZ«Ò‡ Åß%Ø‘)Öm«ZáV4®¶q½oV cKêF/pïÜqQOÇbš|IlÔcg¢`Õnfñ¾O°ëŸ!³´¶Xj«P½«?žñΉÃ}ÃìÚ]žñ½G$ð#jxx]ÓTÝ#Y3Ú±„êªá®‹¤1l£ü¶ï ˼;ø¸º¦ $ÁŽÄXwpýð¼”›Ó”*ÃCˈ6AÇyÞá»R²Þ:¹Œ8Vö5%£.Éü+ÂÛ·—pÊ!¿åÊ?hfn yõÎlýÐ^…D51Àðõæôµ©­ÅWS'JĦ´Ð;AîY4©Ì‚ LšJu÷¼sÀÜ–€· nñj€~K2¾å€-_|Ì,Ÿ²ÐÓÅ©½ @æ:¡¼¦¨‹÷±^ðT[8V!~®X¼¥±ï€%„bùl•Ÿ/$´QknÈkãÿzÍ%j ÐeBÒ› wѪ™WG)¬“lÖQbë(Æõ Üuùz;J‡TÆäÈŽÒe2gA´gñ´w¡µ“$Ûƒ|ÛYêí ÷ ÷ 4w”¤{¯;HÝEñôÎb{GY¾ ¿£ÜßQð,"xÈ>HÅ„¢‹GyÆ£”ãQöñ(ù &ù þQñ®¾X«K'ñTéhîkœ/ìxÅw`ˆ—áO ’3ÜäQøì(’v”S{^pWUÛFY‘˜Ï×3Üàë34ábx<0Sd‚‚B‘±ã %7"6Cµ›BýÔ¥Ö¾— È0²ªl%ïpÝvÅaì™ÃªY»mq‰×JÖ÷œsò!?oð ß>«x@Ë †¥¯2E©rß|K['ðŸ ð‡3Æ™ÎpkÚl)š¡m¸\Dï#mb$Uúq»7k’”½)®üÙtMÃ"cȼXº3ÎKB–ÚãH!eýX%C½õ‡-xÔÙ²{¤3’§ Ý8BÛ˜„‚¾\!œN?Þa2áo.bg³b³Ý¤Ü¯TÛbÒXÛ3ìl½løèPIo0y»H«Ër[‘"¸\~yØüN›äÆzÞz[ôq;O·…Gª™i•Îö)-hÒ€Mo7bŸÃÖ!lWSPøiñ¤¾Q¡êR”V´&”þûUt|Xt¨Ë!2'\É*X‹…•~] ?‹Õ\qÞ$8… ‘ >äD—&ÐRƒ>ÀsÔœ!§mŒK`Aƒ˜”ïpµ6 Ò ¸ ½”8.j™zI”_Îmt°H‰Ð±Ñ…%N–ºº¹?…À–„4ªÄVEÀl”XŽä¦qè6ˆõ*zæH#zÄiçwÛØ0ËôøÄ ÀNì´UÓ2•²·Ÿº!~¤í³EY“ôwÈÛ1tDpH˜¥|Ó;ê5õ°:±0[*B+-çuû}v¸7$éˆÓ«Aàs3iÂ&àDdß—©´½êwUçMF7V”ö©c.‘Â`¤<µ•ž.þ”Qc yjîÍøH¯_B\IÀ×¥Ò¶ 0z‰ì‡i"WS/±z¿h`hf®\Z‹Í¾úM;Iö)Á)éá!À9ð¾Îå"gì4¿$Ý6s×I–søáàÆìmZëØ2>ÉeŠ©I\^ÎK ÞGh¶›TH¸§PL™6ê&Á#íPŠ›¬ÆÏážC‘â¥c«RìÙR^Ô^ZW`Í–ÄŸ'w½á"`nñÃó²~Üe£Dž–«L5ú€ãàiTþž¸ÿÁóŒHíûµÑÆíôÿäà?„çxá[ãsÄrˆnÞm‡ªøÎð ?d®P^Í d¿eÇ2÷Ô‚æØ®æÔØæ¡ α_Ω¯Îc Vž+Á n´âº?ýˆ•ÔÖ›YHg3‡°á> Fô§˜çh7¤bº<‡ä‰Ä‚ãCé“'ötÏõ« uÖ®˜Ïú}ùMMèkPÊ !Ku·)ɸGÌà_ø€D|@-ŽG,ä#nr»˜b¤Yt8^T·l¼„ð9 #›ŠœÂbÔª–¬@jWr¸öç#¾ä MÜøú8о,¯¦]H=k[2å+è\EÒß8/ˆ'»ªz'˜+4h[ÔAûÈDÿ2íSÅó«‹‚kcz«ôkH¶Ã´xëÆÎE@1$S¥¨3¥ãvM¥¸pÿ[°@KÄ’a‚¶ÔPÞ·NoÎå±}IÂlõrâ>œM†•‡ÍtÍëÒÙlwt«ËŠŽpC;ï^†˜¯”né<´Å#"TŠm幈ۚí¥( ÅSq¡a¿Ö“¤èá—Ãï&ãeìYk%N‹×Ç'>®‰~V9¾jžæí†ÀAiF ö+4ò¥u‰@i«ž¦©ïÑXñRG ccÚ•¯  Hã’2¸Ij†o‰ùŠKG”ô ÅêõwœÌ·v‹ùNÓÕ!*¡¨•±EÚpD¦OŠÒã&u’†zQÕÝ,>õ€ßvZR$µÞÀa©"n_ á‹«Ü/H§ª.!8îcþ°˜7QþLEHT†u¥uݽý€ %î&3™ŠÚÔÔ áÍæ[>ÀN2TCÝÑV$²&d“u¡œRZ‰ZWŠž£ÖlÈ…6_7«¶† å»²¿‚“nòQaù]ù·‘4Ù‘Å–•¤92í¸z´¸­^áñºZaÂ\¹çuw9hôÊòÕCVµn<ö×^$£Â~Øk £—–¡qîÐOÐrȤDsn+KZøÔuµ®KbÞŽ=fD C Ïwm%å×ýV|Tù×ýÞ–0Ø uD nÂ%gVÅücu$C¼|(¯U‡æÛÇ”š€h €ä°ºaž¦=No¶ß-òBŒqlGë©GwT.†Ô­· ~êrðƒOnnËk¾æèQÝ ‹½´²Pñi÷Þ½Ê!üf(N¥ed(÷•½Abå–Þö8'Àh¶¿òhæÖn.BøŽñ–ÜUeAˆ«£RÝFM´Jâ¥þ>ÇûW¸Ðr´l¬—·Þó÷n_Í”ö4A—4ß’Pì«{P~>•ë-'r %·›3 ¯ÚmIn‹UÄÝØzäZ®µ5BI¹1D4.^U0“Àùê"£m·“th‹å¸uGâäíN¯³u™Ópñfð0LýTq‰ögè¤2È †*UÙ×Òrsr\Jºåü:ö¿Vó…çr€BI!°5=êðüT,ÓÍ4!æ,Гƒ£™2S GhsS•ÍKµ…N(T©7â]ï1@ >ëý—KsWœ%¿Úg—º[‰ÞhÒT…ï¢ùj·„ee`œ[Šƒ úÊ—¼G&‰MNÓñ¿Vé’ëÕ6tï)\–Øl–+ÒL&y 70ºQ¯ÿ—½w]Ž+¹ÎDŸ€ï€?Š°ç ¨÷Lwœe;‚÷ߨx 0LXO0ä" ’Æù +©ƒ”‰arÅ c”®±’Ú±–2LYI.qqž>1ç¨è°¤ÑWvºJèºqGÙø'xî£T0¤ùAµ…qfïãÃï©/¼ꆤ”_‹szg);é;‹d'éF¥øSÔè.Ó|Ë7ù9§Oa…8AgsI\VÆB.nAÀ¢Üˆ»ùWøý Uk˜Ôµ’6L¦•­¤ ­¤« Û†IpĹµÔºqÞ0eo˜Ü·’¨p)æ£uˆ¨À2²>ƒ”}¥DD$T{ùpÒ@]=+ö¨2;8ie¡´¬ZiŽbüî3b²}D¤ºdäöÁ±Ý¤Î¾¢VådóZ¥ NÐì&¡brè® ÈÉ/Þô߆]ÅÅÏ#<Õ­”uu²)œPÝ86s •i@gÇh ¶Z1)Ut`ݨ8ÍiÈ3œ8Q³ ã ^S^쥑áëOºCB‡„Q=¢‹yØèNƒ3–Ä) ‹)©ì¼XN\#‡ti/ª æHO.¢zð€Y(Xy£Ýñ&i'«öFÅà Üa®î0¯w˜¼’-¼›W<Ì@ç*¯ä53 ‡™ÒkYÕ£ ìa®öJ^÷nø0O|%§©ó­ÉLeà”Â)M‰^jÞ·…ÉIS%Û~&`¶‚†Œu§”N” äÄ™ïÂkB¥è2kvðè*– ¨7&øOè'‚üÁ2XzáÔ%èñ æf™9»$Ó=±ÈÕ$†Šì¡"5ÉݪZ•ÄZEœ2¢Âd Àši–…4áü=Ķâ!¯ñjšÕ0%k7yk=ÑKÂazj’Ô3à¡ 7a–­xœKÊG1(D¨z<Èh|‰Ì¬bW;Än¸I§ÅW8îí4U-¡ÆÌÎ7ÁÉ=¢ÜÄC1“D"óÌ2› .˜ iÁøzÁæ¶Àq§Í$nÀßĉ#Áþ}kîAîù:™î˜vwLÑ« g Jõ/î•ø^‰öXþˆS!—™ë¬ðþ`-‹Α üÑúiΫp…GzÀ9=d§^ÏŠePs-‡y™v"±¢qé‚ô`XõñÎ*±÷î`ïoT\ ê`kÍH®dϪÕCÐy”Áš„@Š{I$ÃúMS¦Iº³Åì”äÐ ´AõicIÔŠØ¢öiFi õÉ•1è=ÈùÙ`Õˆ#ç'Ä_DÁ|ð} ’¡éGÀû vy4V%)ª©v>ÊFyÃŒ„µì…•L‡ANÄJþÄ0×b˜•1ÈàØ¥UM€}°’µbeL0½´% 5pÂYÄù½„š+䛚ÎJÏ!ýç(t5E`˜N0Ê;¦(dC§·™.:/Ò÷Ôãøž$‰ABÅ0õb5M£ë":38™ ˃P§pç#ŽàÉ;ì³7*ŽÂ¾‘œ¡ø»,ÝNX­EÈ(×jõ?†­|…Ó“³Îälš©GB#ažRäÇVZ?U×6D*[i )Œc^ƒRA×›8i wLz@b! !LÆRW¡‘ÐižYÊÐèŸÀЦ¹3À§Zeõ\ŽAÞÇJ†È0›dÈ<äpï²ÏzDÏÁ†z£bP,„A™Sꑦ/©˜-,>ɵ¨oøªÀG«ÞÖŒ$¿%ár–ÍodZZpçDñ°MHš=~>¤n=_gyòÁ®àÀ˜ñ¸|‡>ĬÑí+Hø!j~ˆ¯_Áâ¯àö‡ÿ•l”ökV ²yð6 «h´Ôvx†oT-Gš© 'ñkœ31Øš,F¡7Mv{8Ié¡N`""Òpt ¨·Cd,¹äéü¤N/ů{óåû7 ÷vq;)Œžø˜èèF§Â"g,›©=%#duF9I OMïjò«sÆ“ÎF9°¥ºÈ Êÿ2ÍN÷ L/Sµ+m šhõ8à ¥©-`5U·S3œk097à–_FÑö]¦”@ì¼”…›]êÞß;ñŨ²)Î#çPpÖ@¯ŒJÌ~© 4%juÒ•s†ú‚Ôߥ«›s§8ó¥þÈ䌃ÐYЛPm4‚‰>Î\¨—U…3#z×ä ¬,‘ ZoºlKÃA]b yÙ˜ü$kOž4¨ ÁмÙ„W?ÁÕ,CÒªA™ÈêýæÍ{d’Qÿœ«Ð$ihòóe’u-pûb»½¡E”ÀXP3º ™O߀,³_XÝPØb2ªGÕ5ùûû²½VW#ØJé:PÍÂÃ5D:ØÆˆ‡3o•úœ!") Uƒéªœ¬ÎØ€ùÓ ò‹¹"„Šƒ1¦-WÛÍT¬TU»@ý£`ß™Õ~œUhFüå É&Ó8É7Üu¡Ù¢ò k'D¦çEÅ= ü“ÅÞ8°w.€= >LHŸfÀž3î’d5GgªãÉ8Ü(,?;•o .7„Ö Ax«€½¸o\… à…C â*hqpB!Wa“ˆåŒ9nAžc8è tt3RÇØÕ˜ë»žm‡Üøîê;¯ˆ‡`ã,y¼w£G ê!àz Í^q!ßCpø |:_§¯@Ù‡°÷@~L?Þ!úÀ×ù*6l"[œq9„JfN]L´ç+)dÃl³AVÚjþÚn®Û0+n%n˜k7ÌÊ[Éàfû óWr‡ù†ÃÌÄ•,Æ•ŒÇÌÈ•ÊQ¾å03s-‹s˜ñ9N ]É"ÝM8f¦®d±3^G©±+Y´£„ÛafîJï0ãw˜¼’G<Ì9d'¯d2¯d=ó£Ws©‡õj•mUpvbÕœ¦ÊþÞœ„ª§lèlêëœæGB,N35|’2C2OÅ@ÓlƒcÔ‹bîª0¡æ²(e0«uF∀«3Ú ÊK 啪ˆÄ ðœéª§ œ;S±d"^Ÿ£(É”Í+™ DBqŒ$õŽfp4ˤy »nT\Š”@¿s¤9`$lê&ìgŽ"5ô²Y‘.–ÏéôH prˆñ àB³>ÙÏʾ ð,§&¤šõ¼5„Á8]C4‚©â&ä¡ÍÔ2ój „d­Ò—°í½3îÿ4£Ý½3nÁd' ›rEWªÆÐ½•‹~µå½º^,I:jUŠˆ“Ì{X˜5?د'õY‡ç€Å;P¯L y@“à­´0ú%®=«šWÔoágžhÕevgo0ÅÞÂ…ÔI:lêW„â…¾/Ò»)÷eB´¾5©,3Š„7Ô‚Cl3YÅ+FËB³ÁøÏè] _©‚)Ðn4ÿ‚1ÜbjÐ&@µªqÆ“Øt¡x¨7²$$ÍïLÁ¨¶•·‡’@o`Д¢s Eô†«ˆçìB¨AFÂ"rÊLóÓ'as·G6ŽV6 K{h¹»1 h´´t®¨c`w£QF$ùЖ±áÈòTN´™ÀŸ+¾£ä<ÊоX-›äæL)Ì»U‡gÓժǡ< —Ã8¹¶+L×$ô ¨‘#Â,àpêAÊ0ˆ·†0Â;¤ÁÐC“ƪpÿê8¹´¥CÊ rÑjõ WŽ8Ù£ÈÝd—WÃZ”앃¦Ñ–½ÚíM.V9–ͬˆ Ö%}%uI‘I×€|ÓôšÝŒ¬ÑN º€×Q„TC×ÍÜ69¡ÀX²p0 •C‹ø@.È5€ê¤ X!%< , `ŒT7XX¸ZŸ¯’bþÔ¬‰,´’MiAÇ=W” J® (ñ´Ú½U|XÃ)øÉ.N)ÔÞåŸ2U­“Z$Ç!BJ*­S¨~ÐÁ8%á ÿACÄ€ŒÌÝì*lþѵ’¤CÜ%.»Qqµ|Ç \ÕX˜Oò7$ž1A,‚u0Š8 $X§+!Øá«ñÆalrÅ\‰x–Eþ¡²–q6=’ìÅøžÌûQ’þ0›%ó?Wd.9ÄXXJcup„Ù€áÖm5Î&Œ¬$äÕNñ˜æàEAõ'±²'Tg‰†Ir…ε®ç¤ô L4p×ÌÐd$Ö #, 7Q|ÎuÝænHˆ7 Ïû»y—äK}—pH¸N38¤$®ÇWéƒûÊvn­á&n×Á¾k,‡kŒˆ#îÄžÅËÜÖ–Çxc…¢cHç1¤þ‘„¬ŠŒÉG†4%;”&hik¦Â‘üÁ ™Ô-l/•& ‘ù¬›]íUfÏs8@Uºr¬¬@£³jç\ÕðÝdŽA ßÉÌŽf…ºfHs3$ÄY!Ïí¬Pò é{йë’QݶŒ´j@lîyήÁ»Ãu£Á׫Ôj…«jÈk5dÀ“ehµ†ü[+\]C^¯Ø [™ü3 \¼ŸLç±IV/â+Y ̽PW‚ÏØÒˆÀ[:É”}ÊUÃR­ÕXiSÀ’(FL†Å“€!!¶C’t%x›QA8Yf¹ Õ1ßuWˆ4í†È”2ÊÊ8ÆÚ)ÊvRLÜhÁ sÉØ€“¤t]ê ÐôkЇ–…Kz•llHL6¤0Ðíúvòðo4.3ÈÙf÷ &€nîRFܨøÑ)#†v`ØÙá°¬£Òß['(ý=$CЦ¬$zS üjô{e±§#BíéÃÊÏjÿ R¤‘¡Ý¤Ò0ÝLÈ$Ó´4x²RŬSÁéÊö…å¦YìÍñ°J´¶ÛZm°q±A½±•Úd+ŭÏVª£ SmG9¹ÃôÝb¹Ž\å•kÅØ•¥ée‰#Jz ç°ÈŸFqô,„×"|Ö²$ôdÉl—ßtb‚j§‘Ê–ŽÐá¬ÀŸaéXÙ±‚דÞgóo‘0£¸_©4wF’¥efÂrá~ñêÕͤ—Cå@©foyÙI0/ø}tÍ¢˜=½«÷#Õ\Hú\˜æ Ài¥¸¯L“)³Ð£j{Eq"®.À©Q,l%mH¿«4£esõð a³E\äVb±‚9Y8¡·ÊlÏ)øBEíêzÓUœ¬œ"—fƒvƧŠàH3 –·Œ¦Y$˜!$ÔÀõ@@ª¼á<¨6X-A^c ´ÑI$²Éª €©‚vwÀÄ0CN”çˆÅIVŒ=Î1¦^5 ‘!ÙȈ˜dHb²Bw2bF’¨¬Ð­ ©YVh\„/«„#nŠ!‰Åáŧ ÁÙYk œ®ËÁ ^Yí+;c¸‡†û-ۉŶÙ[}¾wµwÆ` öÛˆ™cëj¸Ñqj*v´ò"ti޼ Š[\£–ÑP +ÖÉ-UV‡õXWj·ë¼+ÂîT}¡îúh5ÔĬ\Wz.o vƒH•|Öú¤`<{ÉcÔ-)üFÆ‹^ðï¹]v.¢áµr»­Ü„Ã;så~ݽ‹‡·öÚ ?V†ZÃPÃj#C½e ãü¼ŠèîWFTg¸"†kg¸Î†·Ë¯TGVRÖ\—gÖjòûjå›÷.S& —Œæ]F”¨ìHªOm…:‚òR徑/L z Iºtõ(v/+éU­¡ªÓ g@¹Z6 (‚_äÄVä¾$=³¥ó±_Uɳ7 PP„¨ô‘‘DÞA®éhßÈ¥ŒL3Š)Þ5æèœø—ßî8ož­ÎÉpöVg: c ‰Q6¼è)£TÌÚD çteöw¾Ôž|ACN”1{Ê ÓÊ•eDß²ÊôòÁjñyú½ùQ‘ Cù½§+tМ™ä4-áIB…'®l©µí7ܨ£M=<ÖŽŠñ©2¬?¬$ÿ0YMä  ŠKÃÝV X"ˆ‰ Æù{3FÔ#Ž"3ÓÈ~*ÆÍ@¬F ÐYa52 ­p%­ð*Æ+_?UEóÑo jgî»qw/ܨXÓ¿i!DðdR·,£ÄEž2ÇHåv‰âo‘ÍìôsDAËfvøý¶É<7̼¦3l¹’ðP¬%UOH©æ$¢O¤éG“ñ“R‘À ÆÛù:óÔKÕˆÎjÌ|5\Oƒ•·Ê3ä•2Ь°Õ¨Ê‹[ iIÎ2x8žŒrtœ/ˆª%ND9õ ‡pöªXš1ÏRºßL·Ó ’_¬;•…r.Ã]Â^Dcr ¡!åaŬ̞.ù€ÓTŠªx*F8S)“]óAè8•÷ƒWSã)1zD‘ªGj\Ôºo:€Éê“Yÿ}2‹Ý@¸u’X¨ˆq£5€›ø2.ø‚ÅÂ=U‹U’UD³Œ¸šâ=U©Hiµjº0ðê%-ü ;Ĥ³Õ+a ‘N­S­Y )¯Vè±vwÖp®n×ÁΫ§ÅðdžA;çÕÏ{«ÐQðrä"hÝŠQ§µ È0BiàøFÑ‘óµHÊ(ä²JûCØ;$ö]%©…G4ÄCÊâ1¹ñ ²[D[ÙM&Bg³Íl"ä#»r]¥ºèA pïN“’¯ÎªD%ÍÊN¥¨=°Âê<2+¡Ç=M¢2GÁIÉdWWô0×'•U5ð½¡ïÕ „š­M¡Ed÷°5 ~™r>ÐÊÀF‹âhaÒx»V²–’åoÎnGŠ+AI´<¤Ýu< ÃžDìFìot’y’"Í“$ã™ìˆy™þ NeÐÀ%C)1k»lepTL;Ñe9%LôÂÝtÎ$\}cŠª¼ ÷š@©é}…3ZL1Ê&ú2ËU*D œ'ź3ìœ+oVgŠ‘P¨R•Îê“ÂÂ]2Ò*·È‰¬ya—C,òœ©‘JÖ5Ô(Íä’ÑìÍÅ *¬ýŸÿo:å—Î%¯õY'8ÆhH!ÚjNAgæsfåш0¶ ªÉl3=9eAJ ¶\žéó1…Ïù*ÛÏhH!4. =¬½E¸%30âæ’xí~ÉïWÊj p‹uO†um‚’Çä—<+š”1à<ãã]‘2”ÉŠˆ'ä¥;…z®U<GVQ_©¸>*Î>¬â¾SñŸܰ¼Çuû(¿ UW?¹{›¥àÇŒŸW£¤ÌŒlJõhÐý¯$bLè ¥€]HØÀ½3àa(ÖÀdÜ jëó `œ%Œ ’² ¶E[Òz‰}Sú¬ÚVÌP˜a)cŒˆgÎiÆñyU?\apÌ›À×L˜4Ìà0çÂѰ¬šV!2ëy9 ïÙ =F5—“4;Ð!: a’,'_.G¼Ê²V s˜KaW$Ôl\î+gÃüSpï3;¢‘sp‘ëˆEWçã CäLV%zm¦Vž¶ºÕƒOº‹*¼ìÏP>ý\ó®£m›ýF¥C²ô!­úÏNÁþ Pæ»TÉâtB Q%ZRï(9!dÖMñê—€A 'øEUÁ‘Å4ÍÅBžS’|7Ñ˸n¨T¦…ëÀèÑ…zDp¸.#/¸RÒx¢·šú2h0%YÖˆ Ütƒ²žhàÀ²ž |7Œ‚lÈWr\êö*"-Žñ× W bÖM¹±§™Þ-¡;¥{©•©õB¿"­U°x%¦•tŒD<*‹®4@|EóËÝà"·ÄTV¡Í»xË\­à-W*öjûns8°CdîaH ±RµhPáh¥ÒJݤa¥a5¦•ÊMÑæT¹19'Ô2ð_S€§¨¯Õ™£_Úˆ-+/ñEe˜á°Fàæ]ÈéN™³J¢Š§­Ze–o[)õ6, 7, ·RlnX˜nXÂn¥Üݰ4Þ°ˆÞªÃcàºQ¦*ž…6y"Ð<ʺIBå’iAYƒa¼²eHèB³Äª UøjC@š½­ø ^é@³ðä‹uXç>›É€¿Ñò ±ŠÓ¯LÞ$Ôt~vºD0(í™…m2 V§= À¨`ßÞëa¿•R?YÀ]|Ò úwXLiXtiXžÉðÈ#¯ñ®Ü”¬‹t û;Ä Å+èã!Ryˆi~1w>‚å$ýñ°¼÷<»WªŸ}³iFu 4¿çÑa£Û‘îåÿóÙtFÚøÙÄÿùÓOÏøÿ{õ,/ØüâWÿV¿ùç7¯~}÷îí÷¸¸¿¿º{#Â__ýùú͆øþóÍ›‹›«Wg,=Sñ?öFÕÿû§¿ö¦ÿLgnÙƒÿÑÿø?]ô׳xöÛ³ÿýÿMg¯èégG?}mJX­3 sšE/—"'1Ä—óïv%øÙîÆïéƒ72”èƒÓÿe˜Éþ#IÁäÄNbg…XNú‡ZNÚ ÐBôSõ â¦Àúªy‚ôˆ_ZxÙ¿Ú9§/«RCÁ=cîƒðƒÕK´ö¥Š'Iâ7j)„.T¾ÂªF‚´ËL«d–‰_ú…¾.¦„ú&¸Sî°$’Q«™e¡>IþÁu×:µ¿zÿq«‘j ëOÚWc$qš2ÚsYõVâ3»Y1 \Ö¸l@4{‡*7!/œ lÃs+Ñ>ЇUíSŽoA²×ÉafU|‹þPÓùu:=ôz¬<Åôä4éØ ¨ƒX“ö£iŽ!-ÓÂjk  >ôà…u-×0ÃHH® · =ß*Ò¼CM™ÝàO`ÙþœYŠšÑRžª-²­wa~H•ö oSÖ!['¢óH*eRlŠ Ê±|»v¤0ÿí‘ Òó®)â÷5Ƴa0=™ŒxúFÅJëHã‹–Ú/îÂ:;ÀßÓ1){Ä3ÑÆ? ¡¬Ž]Éy’ýÞ ¿=­õlÒ£R¶¥ªó\F¦¬q´rªQ™“AU,%’X&†#qÈaqˈy#e©hªaà æ…™-Á£ämE €w!©‹ÚÛ¬{(ØÕÙûZÁBU/ldâìãG†… d `Õ¡7º˜Äš6FbU’СWXQ4µa#¡E*¨‡Diñ€‚èù*–$vvß™|3@NH<_ßSSnˆ¥V bŽÞj›¢ }´!Da³Ñ­ «ú ©×´4:Þ‚œÚrbÌ_|kÑÌ+µ™ºÃXMNJÕ,žÅ²™°l *ŠÑ³ÉȶB´P«÷RQl·èYYU`Ђ²ÔyÛI§:“—’žïýÞ5œ/-x4Eótf¡ì¼î×°ëm‹ŽE‡ýÊåå³Í¦Õ0±À"ñA´eogµ·nl½NúÁtš¡êH8Cëâ)Ø«q‘±¹½–ïÂ~p§ÅþBТ¿lC4еì¶X"Ô­å†%±¢>hIøbÏ Dx^QÜ×}Ì'Bñ[ :à)B½R, S´èšðfB×É4ÂèìÙasÌÁ(ͤWYĤ1,]©±¤ÉãÊ3’ÞÔo`(g¾w,Qì(Áê|ê”­[àŽ%hXTMw®GKuQ*´b‹½Mˆ˜ÓZê[MYŒåA_qjRdÒGq¥( ŽüÕw”ÄH‰Öç-튵¨ù‹ôk¥ kÄu6™i^T6_÷òÂïµÆë¶Rί¥_¡zÐ$SÑW¡ ×$JÕŽ;ÚcÂíPQþˆýš²Ü‘~Ê Ìû ›Žhq•hMâT ‚oÁá¡ä‘ ³µ%±ÓêÒ2¢'­[ÝDJÖ@n#Œ ¡‰G€’HÞt‚ $Ö¬X®:[ôM¥àkiº U_wÂÉ„ßs¬‰Åw)Õ!ºRbã’è #öp £0?Û9B“% «¡þ­! MÓ³a¾“ܶrh%[íZyGÚ­ ˜ØyY‰Ÿ‹© ¨zŽ…N¬V¥%™­‚¨™@“£=HU˜ü¢³l0¼Tq_PIÐ/u,dÆö¶fý"íŒØ¾MMæu [endstream endobj 968 0 obj << /Length 65536 >> stream ~òÐ~Œ<¤Ã‹$>“ÚÚ€rHG{Ö =‡ž.i¦©õˆÀ‘ØCël)â$Šfä¹¹ÕùÂc” Ð8=«Ù[Ôªº¢è’@£‹ÉªVH)¢l–’5PÅw°Ùú±¸Oæ*<¬oèlI8‹[†Ÿ0N¨"CˆûœÝòRÏø¥‹Í;·í&»çÊÂÖ™ƒÀ|Ëä CñÙì˙մ7]õàÓ¡—%3sƒä;ÑÕÓʦ=˘‰TM¨š*tè «Vh"Þs‡Y0Úð* ¢Œ«eg ”;W¤,Ä´©´ ¨!;]»xÂØ¢³¡Å¬ ƒ^™„Îëxh¶o¹(V$GU„@ss G ‡…14§ÇI$ϺԒ~ÃÉ}Hò¯Y¤^¯Œ»¹¬A`$í’.4™C9—èÙ ³Sɯ×'=‰ÇÏÎ ÄNuÔFH[èÕW´–$‘÷M¥#-üyê^c¡¤U­¿öbܯ—Úáhg±xÀŠ›ÉS¯wD4÷†ƒÍúžÓOU½q6áîuVÞh·˜JÊ¿€k ›yÕUì½­æ‚Òg'¸ò|ÍÄ€ã)Ùu”SзEEÃLzzi_'\r[¯Ÿ÷•&ÜcýbñÁ2s{} •¹à”çÕùr܈~—\)ʘW:—Ï^)‹Aö±ÀI`—â;ÊŽæ¢m³°y(ÞTÈm‚KÅlœ‚¬äüÕ4BAòÌqEÉ7¥6'÷;©0<GžaøEÕóGœqÞcµâfsÆvÊ6”nqH#〗vÌ™¢K>bɹ ¢ÅËâŽúÕSE Ž‘00& ã&kÀK«hŸ—”¥s­¦b¡1E2¹¥'oNs?öº·H§}©ÒÙ Ì'úìÍ´r²P<ÁL†LÎÞAÅ1ѯ·ô cgýäܤéb°Óšy ¼å‘°˜ÕmÕpæÚpwˆ°z(äSž0'“éÑ'äò£˜õ +[8 t§š_ °ûJ:@§.&µ˜Óˈ'±Ù¤ e'£bÎ%¾+í[eØÐÆÜ8Y|J_¦Ë¢@ã"#X-³Fmn^Æ66°tê8——é“(Äb€‡J:Nq U%£É¥ÓJÄ\Ÿ*l|¿8Ä4u…¶§&úÒ, ²0ïÚÙ— ʰˆO/Ê៧ 0bK˜’öÐAKg<—EÂMÉç…A™]x/6ô TœGÈ¥– Ö);\Ѓè1ê¨U'ÝsÄui³5gJ¹ê„¨¼¦Ê[æä<öM¯¦b´h l‡’X'€“r_ª0LˆgÛ‰šˆÌ¢,–¢œó³ÏBc4òìì\f×:ÚåÛºT‰©¼U3wŽº=¨]/µÉ Ò)êS“wkBç¡"ÏU-H¬gD0")â05·‘}Àl1‚°$¬Íf£k¥ Î=-¯Í½šÐ¨Ô¸ªÂ#´#á„PI¤áÎå©W¶s ´¡/P¡J¬ïeöƒé¶õ8øÈ! Œí´‹VäñÀç(/l̳!&Z=;Ùµ„*e5®6\€D|k' nµD,}H…¼» (8â£øµ¦=r`Rwm[ Hð숰jhÊPCéY‹3ƒŠ£EØP˜ÀFH ²&ñÃFµB×À¼»˜*‚aÜΰU×ÄΓ‰Õb~2¢7bRj@Ÿ ’R'ø^Í¡—%ªÌ~hY7ZG’€Óó$šÑKâ_¹Se‘(˜D0J1@Ø| yþ},9M ‹…ü« %ÜUÑC•÷”H‡ÖúfˆsE“¼ùâ쀔ŠG²¼µB¹ákŠˆ#sù[Xt¡ŸoìèàG1VÔû êH>ÜàŒÕ×™«‰€O@XåÚ;¼ñ{®Ê)ê%¹A_êÄÕù¢e ¸=‚UÙø¿¨8áì­¨âBb4^z1H;XY©]6“ÚU“ YWáBcg<Úl‡œªeqágP{—…ç¢RÝóÑÏ|DXmž$\Sÿ2Öá.‚AŸ.BbÝpÙ)(›ÈÁ3´¦XBÅ‚3»å^I²"+y Gœæ¤²ÍfËÎ) #¨€Ò¯JdñF¥s„©P\饊'ót§lªâvsÛÑaù³¥ƒÆ¡À°âñ 3 U;rðãqeSû³º¯*7 ЃZáNôÒðná¿ÕQ]6MÁéú¡Íav9dLBÙ´9:5è³û*ô²eå‰,¶ b5kŸ9æ*Â9Dƒpe†(`2.÷<—Bœ;th® ‹ÕûÅQ8ÓR}SH”°†³MÈõôRÛÄ0ˆ<}*;r&«€ÖÿÊØï­©0D öªƒÂKâ í*;áBFdœ²fv'3KtËvµ탧„܈(Õë©”‚ÙÊzQû¾ sÛ†…±8`ǪýL¿7°‘îH8ÃÒæòOô¬7­=Vp¬+kßéZ®˜i'1ÈyÇûbnÙÅOO¦jçy5••¼Ã¢oùªOFˆŒÜs@¼0¿¯æ/FßZ úšd¯R7š4Жˆ¯„rể=6"ÄâÖ¡â÷5"„â žÒÒÛÖÜÌö[:Âd¨* à±Ð`ŒÈ9¢zî‹`o‰4`É|{jKÇY¨X³ièÔñÂ4×`¼0ða}'5ž¥Ó IìVŒHë›ÍÄà%Â%\\ „Îvv²H³~¨âà·´°îü@ÛäVì¤Ùd›tÈ&}o1¸Š©®½½ šM Ämè@æõ váØæf3Õâét¨Î²iVZÏð…v€qMui•…$:­|U@¨¹­Ä9[”ê Ð*™"½,˜Yae©o$_Áj~Rb³‹A,”þ‘š´Ê9±1"êŸÅ Õ Qå—*–d¶_9×h'Í='ahˆä.hY FáJ uy©Ñ€èUp”qp( Ø N*Þî°AP´»n„âÉw‰´.ÃBAõ`€Ì`üÁéËšÇ%ɧS-RèºHhX+þÌ3lꈧùbÚtV·05Pq­môΕ %E8[CÅ9´ê º5çëQQù¹cØÁlåÅêö a ¯Á[¤@t“ùuY—“r²O`dÌQµ ëÂbdíVuÀúŒ:!5˜.í—{xŸ– ÌÇz¢RØE]-,|ú}ZfžGz6C«EfUB7û2 ú ¿`|ò2z©ÚI1o±YoÄúa˜$ãFAªzgíjÞ¶ 4¤>˜zÞæº¥…ãpjsÇz3t½30-A·ÈV}³‚«à}¶ †¯]= VBYqÞú(WMb rD£T"¡fÉD‹¯¯ #Ž2û*TCèw=>øV´k»‡Ò"£©# ãCÍãYœtsþÍ\c Tk뱤NÝ€^é±68VMáßÔwob[”[‹çöl*ƒgKY´«BóÏm*×Ãg/[·´óït³´š1ŒaÌ:3C¼°_˜DNÖË/ǨÍHµ F-¯ÞÏîbP¼ÄÓpÌJ˜@ÂÙZY½[íêp˜ <£ÀP§NPJòbS€­áBJa¾ŸAúµÕ®¾èî'`Ì+jº1…¼ƒZ׿ª%5ásš‘šI-ÀëÓhàf>@‹«IfBd w®ó Ó£Ë íÆš"¶\·Y#xzŸ‰ŽúàpqA ÍôŰWõ1B—Qȵtr¤ACyÄ~d!ùj*1éûMôü„W÷HàÓ3ˆÊ¨ÅX’æ`T”ÛL„s`ì²y² wè€mŸŒ—‘ÊÛš„­NœùÝâºTÜÜ vbJÅ<®Ý >üh'‘%rf‡MÅÔX­KsÎTúøó×%b%ÍŒrGIy‰ÇÌVŽq˜(8xj=ûºª&cîe¥VßÐ:*uénà ïX L”¬|ÙÀ°U²ìÖ0EZŠ;cn50N‰ãËz• Q¬.Cu’xR`oTv.®Þâ-±ÅÈ€á{–ßÓ‡]Êù”",–Äg?1 Y:í¥¼HÓžW²Bz’[äi ‚ˆŸš}ƒ[„xyL ˜-¿ø^^k=±O°üKce–F§ú¤uÜ"»!:"¡*ð¥#žav;¨œV°q’hW-° O"cÊ/"¨Þæ0d 7˜÷º Ö.h®Çm (,3 ³”^6ãm‹b*))<[\bAª k°('3ÈOK—cŽË+ TKæ‰(”Z™×  ´v´°ÔàÐàbAŠÉ•SÄbÒs]Y13*‹°AdµÜ”Ñ­,2L¤qT㉨)ül£Q®h'+ÆÊŒÅ,—š LI6ÒßžË\B~ÎM¬F-Ošö„>9gL(ñÓœæšcíò󰸹“>8»*`e³p#G //פ%ú¶e¯Ä¸0'g8qs:¼¼ùôef4!îŠl"æqAÿ“G¤•õòY½9ç£?-"‡·½«,»YÅšWÁŽè,Íka¨6Ãc•ý‚~Œîk-Y´ä1¢ Õ€m{h ϰü>ÚÊ2fïâ-ìäPÚ‚ØÙþ˜dÒW&ÜlÀ3hADØn.{`áãbÚY²œÐ2UÛYJ‚³Ú#Lp[Âæü g…y›Õ©Íܨ–÷kq¢A5ÑÎ4C†½#Ukà}6péqͲPZGZïìrÒíB¼Ç‘œÑíLmƒušÊTFÞ²€]„6>ƒ|”=‚Õù ý”SH`?çn%= ©ôŠ-Ý‚^Ê6-Ž^ªügöÀl 3­0ˆÕ`I…i‰­BF a|°E[#”ÕÌiU‹ÐÔ`PQ®'8!+–|Ê`£_Z¦ýÜ*8Ë4YJ*ÂPrVÈ‚ŒÐuÚ>%k?ÊnkyÒ|ò¹ÐfY¤à"XJö²žÆ3¦45¡^“0$ =;O ¬º .¯¥©¦T{"tÁ“±ƒîøYá „ÉèÉVw\óT'Ï™Á,þyZ’¦eRiØÅ¢X”Ä×'OÆKõ$pèV9że–Böe$ø2¶ÜGêW"–uWLwTÏ®eFa½„ØN…b¨_®‰Œ³ÆêcÎèwo®žÝ×ÍýØjý(·Û.ºN'x«òç­,ÞjøêD”‹inÜúÚ»Ææór0àïà kæx+ð8rñG\ÜMy#s@jZ‘¿T“²áæo ŒægÍÓTqi*/"Œ»=xa]ÓŠß8Ð5 0p¶$}ʼXÂÜk· w‰¦ð!ºà¥ŸÑ²/UÕZÐLós.ç.%uŠŽIå™ t3ÇK¶$ð¨¤B\ˆI£ñÑ”oªA£Ž“´(øPf/Šçœ+ÀàðJ ßáJiЊRµ^ ª‹¨6[z2?Í´hš ‘Íi5 òœËç&g&ß™¸«NXCœ(WKH|çsU¼’` "¸›‹áLãäD↩!]ó¥J]vn–ªLO/*9¡ŽØ™\*JZ…}I¿ÇÉ’+S´Ìh¶œ©…#5[BY\`Ô󌄎rØŠP WÕˆtÔ¬Ô™Ò­h~ÔlÜQ²&Ϲ,#ìHnBu×ÒØÒ@’Ê ô&õ&ä9Ï7JŒª;L “üÒL‰˜“þI¦_MºMÎÁú´t ÒSä}i`™•"`z2᪱Œ!#h’Ô«°íxÈɬ¯ Æø¹¢ß,~©â¤±Òøõ©lÓ°‹âø»ÂìÀº/Ÿ`2‡R±OÁëd5½)£ÕÙ¥E¶š±¨œJ£6gךŒEŒ.9- ¤ObËÙd¥íÃÄK•(”°>PŽwþ¢æliñ èž›C³ŠÈ W%€›Ùá‚‚‘sÙ×)ª’‘©.F„ðÇŒ„¢úÄ%Ðts±(c4e¬ áÊŽ‹AoTi˜u FÍ¿ÄÓ Ps«œIû £³‚x3rY»‰Š5*|, tOµE°%ø¹©6å3~½,ïQÕ²,¨¬Áà`\:àº\"³¶Î í Ê„ú¶8qÚ¡îjN›ŽÊÜÊ–6÷ŒJJè!˜ÀÉ•Þ44œ¤¸‰}”íŸÏ'C«Ýsú¬í´j4Q ­"ŒÉ.ÓdsSQS5Ÿ—*E„)Z$¥Ï€„É‚>¥H$_.î¼ød8/µ6·ë š»[ž—¦£ÔVùB¯íƒ˜±fî7ˆq( âšpÅPDÅí” 1™'§4”w¬KôÒÌ—²± »jqADaë${cÄu’(†ìaX¥$Íе™Ëe#í⡳åúì AuqªFØLƒÓÉK šÊnF8Õ"‘²;ôÕ.B „ˆ5ñ©RÙ“XÌÀéFY“»éÕ/´k+|¨$±:.˜Vuy<*€‰î|=›’åí×`_!I(]~,9³Ñ³Gç3r¼a3m*Œˆ²Ê’Ä×Ó/Î ↡ൟ+Šòÿ!ïúC~Ö;lH½»—ÜÌø©SšÚŒyS¶ÁhIú»§Ë|ìô›^wçFàØAX8™Í(ÑvçäÞwìPd¢Øìgt 9†IB"„ ‘XŒÝ޽ÜâçýµÆÀHøÍïnßüáîúÍýõ›?ŸŸ‹˜‰¹—ÿðìw?п¸Iþéë?þë¿\¿îÍ<û¥ýyöOÏ~ù§ß¾üÝí«+úó7×—÷×·o.î~zß?|uö»yý¦ÿÓyïÖÝõ·ïî¯ÞþãÙöË_ÝÝ]l=qùýõëWwWoèßýÙ/ÿíÍýüoô¿îúáŠþí¦_üãÙ/¿îͽùóæ?^¼~'ü´ò±Óýµ?q?Ž®ç{¸ç{„žÿêß¾ùÕ뾿øÆ=8‚ëWžùìcpÓóÿ×ëW÷ß?<}ì8ÇðýÕõŸ¿¿xxî³âöÛÿsuyÿëÛwo^õþýúvmÑÏCúŽ¡ÿ|s}ÿöáqm<üß÷ñœl÷ïî¾}p*î®Þ¾{½Ç×ÅsŸýëÒ(Þ½¾zsyõàXä7-æq¼¹ýúþúþrí4˜Gñ–ûë×W{,·?û˜üƒƒyóîæ÷—÷?î3–峟ÿ2íªîƒ£ùöâíÕ¿Ü]ýßw}9î¡l=¾ÏÙ±Òu÷ž®?xØ]ýÇC[hîó{æýO¯ë7kKp©ÐCŸ}A}}ûîîòê_ï.~øþúrì3ŽGÆjÇæ¾ßþpuwq{÷ðæ'm/¼¸½ùáöíõý>[áSt€•‰ßýËß\}wöÕÉ`:L[S<L'ƒéd0 ¦õQ|wwѵè׿»½~{2™ƒy\“éáü ™L»ïNÓ‘_'‹éd1}Ø^8YL‡®ˆsÿtm¦½ú~¼VÓ¯¯~¼zýõ÷¯nÿú¤ƒMñ °öÇÛNOǼøöõ»µsì ™rK³7âéÞÑkáoï_ýæêÇë êÉ>6ÅòéG»ªÿõâÝÛ·×o~½¾ÒŽQq½ýî»·W÷ïéôÚ{mò'¼/^í¡§¼z Ee®ï¡¦¼úÛ#nßßó>xB÷íW—¿·Öã'´k_“6A˜¶ËÛ×·wÿô×ï×ÍåñÓë=œgúØé$ú0mñáéï‹ïÝë‹»·oÞÞ_¼Ùcyíþâ{ëŸÿöÃ훫×ü‹Ï>®‡±oßÝ}wqyõõåÅ^›fã駤埻©ÿÏ“5÷Ó>?R{ÿÜï5õÿõpïÿëµ€?Ü^¿¹¹—üinW_ëyòRoÅ“FrìföÑúô÷ýG«‡ü={óeS¿¾¾ÿÃÅõª&ô„võþÛáhwô¥{XMøËšGaÑuz滾f=-»îŽÒªûKØ£ëá8»¾ÇžýËclÙ‹»ëûïo®î÷دwÙÓ±,?ÀM¾ÿ±ûHŸî·Ww¾¢¹ûÕ/jö?]Nx’õsìI?ZÓÃ]?R÷Ò¯þí›··¯}wuõ_GŽKâNX’ÿ˜‡=^Goèïá´;Öóá‹ø¸çç&ß]¼º~·Ç>ÂsŸ}¯®__ì‡~R6Ûooï~øþöõíŸÖOŽGóÿ²‚öÈ 8Öét Ž¡Ó1D{øaäñŸCO…¿OvÕ‘Dç?'²ó‘ö쓃G~»Çáôûõá1ï~Ýã¬9Ö {Êâ~ÿ`7‹ûa¸ãÊâ~x‡Ÿ²¸?㡵ÿÂ.ãE¸ìñNWÞ'èûÃÓþvOð8PãŸyÿþpdëÅ÷oÞ\½þúêõÕå^¶òî/>ÜëáXãk÷vKüæúí¯/.¯n®ÞÜÿö⇧tU} Ô­ÂÓñt:žÆÇÓI}zÂÇÓ >ާÓñ4<ž–aŽo~ÎXÿÓ9¥NU×O;dßRþ.wÈã>í¿ãò‡ë¿]½þÃ닟¾yÂécŸ·êÅç& ˜ÎÒÃ@1éã¿ïƒ[<ú”2wæ¾òÓ™KýOgý¿_õ¿ûÿÿUÿ‡³§¤s{œ!N„{‘)ÜÜ®R$<Bˆë7¯®¾»~³^‰q¹¦~¸º¸ÿÍ>{cñè#|•ÅÅ{Æò˜o ’‹Çó$(.Rþnø-ŽEoùvŸêªGÐÞkGk |ÈN–ü1mëKTŠþý»‡Ë÷ýöþÐhÏÑ&ïwNë_íØóü,åÔqc´Pvõí¾þ ãöh÷÷Ã~¼¿¬E´]§gޱëk»eÙu÷]xÿe Å´ìz8ήï±eÿò;öâîúþû›«û=ô‰¿¿;íé¸Ý?ì:a½SÄòï bÉó@1K?}µßœœ¢”§(å)J¹}Lœ¢”Ÿó«œ¢”G¥ü’ˆøOQʇ,Äcô›½³ó¥|tç)JyLÛúÕõwß½Ûƒçüèwö¾9ÚÍý´“Ó\½}w÷]W¿Þ“FxãéÏ>œŸ®^¿¾ýëƒcz}ýçïïû¿Ÿ_3äãÚ~þò÷üJá`ôPxqû¦›áoö8¾v~ð”ÜI²h¿úóÝÕÕ›¯úqrõU7?¯ÿ|ûÕ×·¯¯î¿º»zõÕíÝÅ›U÷òSò3Ê#žüL'?ÓÉÏtò3üLe îälúÜ·{}8vñ_×7ïî×j[-?üì‹+?<Š«×ýÿØÏѱxôѼ¿¹f½ø%íšÇHüFtô—ºsŸÐ²~ûÃÕe?´ï¾DøÓöWìQF_këq÷`í=®þÛ]-ùqÍ¿8Êq=%S·Å?ƒwééø.ÔS!¾ ud° ãä»8ù.N¾‹“ïâä»8ù.N¾‹­±œ|Çgä½~müÂÐ'×Ë`'׋ôák5O¾—SÎîgþ&GëI:¥ä?þæ~}}ÿ‡‹ëUWÖÚÙ{ÃØŽwW!ÄðO8¤ðcMÅßcÖ5®ŸRñOwÙ¾wÙ@-óaúÝÑ^h{k§»ìQº~¬wÙ‰Væt—Ù]ötÂû_ƒ'J™½:ðH/ÿ"(e¾þþâÕí_O0VÇ´Å'ótŽ™/#­ù‹H ~˜­é”üŒï¾{{uO¾»zµßÊ:úmò´!«—²{õpµD~滾v!-»þ·GÜÆ¿çýð÷¡{ÄÞÿ¢”ðcùŸ*’ò>ÁÉ::;èÜ¥_<¸÷¸ãÚ«ï{\A{„¾Ïöçæ3uqzøüõúÕ>¨2}ìó!ì1†ï¯öhÙs'OÀ‘o'OÀºÂð¹Á›'OÀi¡'OÀ±íút={týä 8žKñä 8Žïpò|‚œ<X¤÷û ,ŽÖ=YAãy¹|ØÇpôÊÝc8Úuyùsâ]>7gûÝÅåýÅëßÝ^ï‘À ¿zhhû³ç<}}¹æ‹ZÚ¡ôØ\¿Þ‡pbãáÏï½zIùæÝÍïûüqŸÁ,Ÿýü ÐçÓÁ|{ñöê_î®þﻫ7—{XC[?¥3{ŸÙøîîöfk‹Ÿz„Ïù0)üýí§Åí#tþDærd.'*”õor¢B9Q¡ìŒæK¢BÙç²ÿ»aBù$“ÿxw÷í»×}zŸžÛìÉó$ìcЫQø÷Lpòµý_DNµåA¯9†Úò¿‘y*-ÿÂ1Ǫ¤<|càcíeìþâЯ{ëŸÿöÃ훫×ü‹“Nù4tÊ'¦±œ–“Âò*,_ëùyÒXWcùBзV,ýHõ¯“Ã÷ñ7÷Þåê~gïíñ=Þ]ý…àÃV þ²I_tž9B“ð/k,»îŽsÖר|–]ÇÙõ=öì_cË^Ü]ßsµ½ýé.;ÝeŸD½;ÚûlïrºÊ¥ëÇz•íq ëU¶G×OWټʞŽõT…ë8¾Ã'¸üžÀìº<¡Oÿ /ÁRE¿ˆ±'²•B¡§bC?ÓXN•ÇuÿkÿéÛ÷àžÐIü·ÊÑÄîlÒÿŒþ2Ƀä¿ö8 ðÜgèÍEoêaî»kÍ€z}{÷Û÷ èwþ—•nõE¨a'â€cÚ ¿ÿ³?‘Ûãsó9=¬Cmþù)ÿóoerqÒÒÿ/‚õ#¦#‚íoíytj×ÿÊ®Љu´ÃíQLù¤Ò~ÞUõ§ï®îþåúî pø|Š›ãéÄ1ï/¾ÝcäGí¬÷g{¶y˜ÜÓµñðãÑï¼{sùïOèTøVÒór6}©ké_Oké³®%÷åK¿~,ˆ›”ûwoÞ~·úñ¬iê»ø—¿ ½éCÓ(ŽÖuðAêìÑI'ïÁãoqFPýêõëO°¹ŸŽEñçÜ —÷sáò>ÅË?¨âÈ/~õonúæŸß¼²Ê#$J$ùæw·oþЛ`Ò„sÿúêÏ×o–ÿðìw?hüO_ÿtóííëgÿð«»‹o¯ÞþßÞ¥gÓÙ¯úÿô×gïúÿ÷ûgÓóX¦TëÙô<Å45ú£ú|ëþŸþGœBóž$xÆû“;ûÓųñ§Ÿúÿñ?úÿ§‹þzÏ~{ö¿ÿ¿éì½ïߟ—ÚrIhg5OôWëM·©·ÛZ$q{^û Iæž×X³È|ˆ‘…á¹›B"a}îZˆg/´Y×R qz^Zig$ ÏK–úˆz[gÿ‹Ÿ-Ï»$ʳS^_VR©Ò¯§ª/«.ó“åy*>ðËZÿ™kÒ@~JáG{|LÒhÎÑi£!'OBÿ<Ç)Ÿ]jgcªýÙÔÚóÔGÆíOôÞ’°w ÏB÷<5ÏÂò<'µþ¥¦Êâú<†’´©æ&/SÑÎd_>ûލýgnò:‹.{þ Ô®wŽžwþ¹Ï)£±l ýóVMs2ÉòÜó¦¬FžnsªIúàK¡O[k{ýÄ Ï'—?¯“~Ü¢¼*ö/Î3Û_boÿülŸfêxOÏKi.ʼnÐ;ß´)x/=pSÃ$º>_HìúÇñü²>19†,3ëšö¶ôÎx¦–Š4Pûx¼+"î‹×‰08Yá¹—^íÎ6>CÀBr^–ߊ}(a!Vav…Áóƒð¨˜†)MÖ@àO6Åþ•æRÐîFŸæjñN¾dŸ™›þ!rJú²˜|ˆšúbLº>r’…Û§!FŒl sãB¬²}ÞKm ô)”…Û7-^£2¹}å³å|±°m /› ûiñìô<÷żÕj_Ôñ­”¾\Ë䤷­dy–6os;¾õÅôSßOÈæe•Æ©ïTþ”%ôö\‘‰ä㊄幫1Ë—H>‹°ÚÁæå,ã/Q’‚}M‰To5¶ /«Sÿ¾ü%J”êNu¼ÿJÆþëBWBÕ´2•)Ó3å7ïôÜÑGÝXå½³-V¿½#z³…îr÷ôô3Åmî³>]A‡µÜ“¹=/¾%Y¸Ag‹n£¤½ö#îl8Ý/ä;ä¾[ ò…síËõFÅE?{n—(‰|I",.V#Ï, ©+ürêÝuz;ôs^ûåSÒó¶¿2j¿ú”F¹rbß$úû>)èõTû²âwõëÉÉ•Så௘é+Ê ÒúYR¹ÝœíÀìG'OAnÒÒòp—Eлm×€×OÐåió¾èÒ©¾y³ô•Õu·y õ75~ùò¾êSÒÏ…¼}·å¾\¦¬—+okö£6áŠršì~(ÚIÿí]×´~C õ''ZXüÒBG9È>U¾ø$«©6™çeÛóºÅq©Ÿw9Hy—q]íÛºzU è¨îBߟ c’…SsÜkׇíŠÎZ6UƒöV_Û:Eýß_²´ß’¤Jpw[n¼÷\–#7ÉÒûUJÒ%’SÕ½çú-5á»…0ñ>£«MwN—ðϧ*+˜ÛäSþR§ËWyïUj¼Ž6Ël‰RûŠ‘Éî‰^¤¨L,¦S»NEoÒ–Hû )àÛOî1=À+µê÷>Ÿ=&Vad%´ K“˦³Ò©nÂK\WÙ…Ígûù‘ùôK¤¸Ê ²õ³µßŒzP.Å)öãƒwWøÛÒÓ™í:?spª1§,Óúù§"çZMW¢«§ªæàµ_©_"²:i+MŽç;Ñ·%¥/È>oX\YÕûI•ëì±6iÇW={GYŸâc•Nµ¸~&ÑûNö•§ ÅÅ Ú 0Ul»¸ZªÇœùô÷CaˆMVq?Tûm®çŸ8—:Uý¢Œò*OlƒÂºu«V_±7X ¡ù ¤îÉ*îçjÊQÄ—8ÝÒ ãÒ”Ö@ÿF ¡¬â~^7¿õ,Ùb¡N}'²°o.?éQšÓ4s}驾í³ç}’+'VìŸ5¦­9htqêÕûtóËZ?¡§Ü‚Ìkî?`¡7ÛÀË -]SEÛõýÑÌV—§«í©5(û‹–F?Q¸cýàî/Ô£Û{Ö(«ÍMï®ÐŠ,÷K_,·¤ÏöSB—¡­‰„xUŒ+rl4×7³«¶ŽÅöì÷II.aÅW1h»â½ÛÚdçæ–ƒ|^¨b’O#úL0°úÙλƒ÷'}Æ϶ż›_n‰û¬.¨éüÄG„êÁzHå¢g Ýc/ÔÂR€ì”*wJ_^¾D=äXñFsjz¤óªö¾]œ2: Ë–„A6Còy' ·/ÛܯqWµh»Òžy}÷‹Ê¡ýª<…]è •™íÍ&>wú‘ßµ¬¬‹#¾*û°Ô8ê°«ˆrv÷sÁ«¶ÑÜ)dR—õÙ~éð¼ô^EÖé›#u z™ìJ·=÷À÷å“E‹éŠeâÞ6OZlÑ=Îû² ­TìÆÉ9ÝL*©é·åc®õ{9÷³WÞÕWŠûïk ô û;ä÷$nYÅ1³MNÂn&ó°hû@æ3ëž]îŽØÏ_ôIU!I&€DYñ©Ñ _DÙ˜h#òûûÙÛ×½ª]…à¾Ò=“›ÖGYñ]¥í“ ÉÂ' ÐàõZïûŒ÷gf}ïÞT ²ë-Þˆ]8AåìŠSï-Y0¤.ø0qÉÉ2éÂ~$÷wŸÉ`»õéDXh'Ë'è#›ØÑÅêC¡ÏÕ;TE¨çtó¡kw¼ŒI3¡d5,Ù¬¾=MD¿¥—¾)ø@¤©ëÂþµHq‘#f‚ÑÍ“~'ñstXð* ežô9 Ö|Ç$î±¾83ß5höGmVÏ£Lª+,­+Èý^«2‹¾6§«»‰Ï,“!ƒ ¬V>!òâèk¢Ø‹Ð…¦B±ìXH'² ·}ÜäåÛôÓµŸ‰ABš¢n{¹*hÉ,|qAž`q•á’З Šó”2ΨÊ>Núnfé£î ã¶ó çJk¦l÷-O÷ ¨Û­o– SÙpiÄÄöH,ëó/TíÌbâ÷á–Xœê©ÉH÷m­¯²×±™ýè*6¯ú$‹Gßeu&™ 9Ï]ÄšW›OÄÝ~ÒïÅbU.ØIï÷r'±;%y]|'½€—ET\ˆw…Å„¢÷²0Ek >eiyƳ·wž×q_SÙë2O!µÑéMÕÖÄ]ÕŰpÉ_"›¹Ûää+úñt1^qýGº•Hér“Óκ  ÌŒ)ëBbŸªî)‹ Ü…jTõöÃ$ß›\¢ ÷f'Ý¥z#²ã³«ÛŒüßM_EŒ|¸àÉNéæaQm¸áþ!oƒ:šHóžøÛÐlê¸HoI—!íߪ⦈ƒÖ»ªZ>)éÓ”e`AmØ~$NoàI€:½|Q9æ<Úeñ” îw·ºYÕ·‹ˆûüp¡Ú-Þ÷BßUüq"œ~Üß î“~ÛéDJvÇH\¢I.jÏô²à+NEÆ7 Ò…4Ñ”D½C&ñV÷¹áWÈf¤ ýR§Læ¶ Å8ïSÛímµL]è«—{•Š´êĦéÍ'Þ¸…nVï`?$¹Ö’(/ÔýMŠœéͬµ:1rÈÑšÒÑ‹ ˳Nò2ÒôÄf@—†Cp8ŽèÃfL“S‹6d‰êWbã¼Èú¿c úiEžŠKÝaâc¥KL~_'ç è‘Èîjêrð¦vöïE%¥O]1±j€ˆ„!Éžgrz½-i$¶ìØoÄ÷Lêûži^b“SÖ“?n* !7àÉ1å­gû—u²b“yõ{Õ\?dz¾P/——«™¯ 1`&:ox‘gßÜD†¼¨ãý#»®£‹?HotqyñgMôe‚|Ή>¿ë¨#GÞ$^¼–dYûä­'¦¾4ÕŒæ;¥H‘oU¿`›¸º6¦ áiö-´ÍgKõ¦­ê‰ï$V¡=ð¸2¼è¢]ìžÃYÔ¿¡ìÇ~Ó¡@ڸ܃âÒsj2Í϶$³¢B¶5â©&š·—ºJŠ88I³˜ä´ *{ŒHˆ[X±¨¸f>Ç—Â~@xΆëHBR4¶RðqúÑw£Â¬ß¡k“!é8(À祆xhuõ™÷8DuXä'!iËj7&(Æ•Ðb²+y°¯³Á’©²|ÅFÓ7õoÐ&µòù–QI‘º_ŠºX©Y]Ü´Œ(H€û™ž•H ´:YÜ‘î[Z…#£$ ýž:ÃDymTµ=y:§‘£Iï|vȦ8ºH˜’s‘®÷¡,ãMQìB,Xº\‚S) ¼ä۵X÷ßúAÑÐM0515 '®gi¨ «Ú±RIÖ¬“ƒÔ† ú'ÞòŽVéH(ÑaºE\æK—ðAzPäcJv½ÑÒˆ|k÷õ÷6]Yµ$µÝµÑ**™Úˆ©Ê"hU¬ô˜h¹égÐC–Ü®ø†¯mÛ¥¾É¥¢C%³9ˆS©/ætNNÔ«Æš|“lBr׋“¥¯õ~/DyÒÉ^ a…ƒ"ɤj^êªJ%è^™è"a¿™k7ÕÃ÷DÂ>óò´  8«‘„õÁá짯6£Ã‘ÙïÃØt «úßçóy¬E÷…3–NgYÿAÌBy¿‡2LÎ~=mà$Ç íõ:ìnA½P]?³˜±“ÌòŽMýÙ1•û´Ïb·?à6P÷]²1 aCû„ Öi¡p˜úY’騽»zŒtw‚~É!{ …Ú÷¥‹›x#*b´ª\褴E‡H ]q/ÔI’Ä%C›Hϼ)ÀGÞWgÔÐùdåÄ!ˆ À+y1 ÅÞsr¡OÕ¼Þn³Ý)ä ì>ûÏg¿øæ—¿º»ß@>þâ›?ý¿ýý·wýÐN7ü⤉OÒ¹CfÅ~3yú ™tù˜Ù/¾ù®ÿ—béÜ]“~›ƒ@Lø4€Æ¤‰`cÖÀ^À1yú è^xxL>ÎùЄÏr¤‰›8 Ô„îD³&>І&ö£ÉÓÁÑÐÄ€4û¸» )ý¸‡Á¤¸‰ƒ€RÒ‰ƒiÒľØ4yú tš|˜CðiówÙ>ÝØ„}’¯røIZ8§& ‚T“öŪÉÓ Õð5>¯&_tÂG®ù&!9µEnæ(ÙþA<’»ŽüÿµxznÆÛÓu~Z1,;/|¡}z·¼{GH6ù‡ƒ°lÜÄah6ibÏ&òƒmÒĘ6LÝÇ£Ú¤…ƒpmÜÄaÈ6nâ l·pºMvÚAø6œø Üä ?ãfºìÇ£ÜL¥øxœ›]~tþƒu“8í&Ëå¼ÜG#Þì*Û ó&¯;õ†I;÷&Ÿô ä›,¬ƒ°o°3@¿‰åxþMšØSõ 7q Nš8'9 Ë ·ýކƒ±~N:q"Nš8'³|*N¾õA¸8nâ0d7q6Ž[8' „ã&CÈIa三ÃPrò9ÂÉɺ:)'Mì‹•“½°'ZM€—Ã@ÌIaæì ùxÔN²ÆÍ½°ÛúäÔÙÆÎÁ}zz×Âø9ó}<‚Mä"1Lò÷O†¡«Òg'úëªÝ,ÿÐïøªÿ 7$âd2© /²h´òƒÀuЀ×Á…rÀNôáC vШw@vf|<ÌŽ›íÄÐÝj'­ì ¶“§÷…ÛÉÓîæ Ür'ºƒíØ™/¼Ã>z‡øñà;™ÌƒàwXŸðÄësι@xâ¾:†·å ñä‚ã!¦q Oš8’‡»ôãAyˆ yø‡ ybsΓ&çI ô¤‰ƒ z¢¬ÒCÀô¤‰ƒ€zX@õlÙíÂõ þXÀž ð Èž4qhOZ8¶g³ó‘À½ycÀ{ò‡À÷¤…ƒ|bÿá+ü Ÿ4qŒOfâ ¶ÓGCùà”ùh0ÖÚp>iâ @Ÿ4q¤O8ÔgwÍÇÃú0ûlïŽÀ}åÇÃûp‹|<ÀÏ|*ñƒg缪Àüd¦ ç×ÎþáÏþô?û_ÿmö7)±Ì]Åä»7¯ÎÞ~ñÃÕÙ süý÷þÔWý¿ýÿýéÿéÿ‹Ÿu¸¸¿¿º{óûw÷¯¯ß\ýËíÝ×?Ü]ütu·xÞ^n,xÂ_7`´ûõëwWg¿½½ûáûÛ N;åaj;+ÛGÿù0¦º~<±AYsßt®IêJTÿ‹sßgòl ¤cfr*ËBFˆ˜Ô$ V$æ0,‰9>+BÇñ:fÑdHèÃ(hË‘ý€Ràz_¼OHäüágûÙQTÈqÞùIi ‘ÊZD졯°)†Å˶…Üê MÔ ¡hÇRž’y…íè~ëš±Ú¯q’’pJàÉìdñHs„3LtIЉB¸’_nB^"ñ,.)áY9JIÈ`-}RÀDŽînpLP»‚“éâdÉ‹]¼>몘|Ûò8Bû½\Ì$MUŒTríÊW$ìY˜Ú®0¶h#È 7g Ö#@:ü(+pŠUãi@7]s4‚OUA¡c¬›“BWD Xf&èºÕ'ë'Íne÷Œ«¼‰ÈT="!'gçÀêR$Ð/¯óZäa°hrô µJxÁ8¨À 2§Q«B¨Ñªø½…wdº®c[º—§-Ìð#Ž^©©ÆF³H‘XÖ*†Àz«¨áU¼¢*,ËèBF”œ³ï–3ˆÙ>kFF¸ÄÆîzV”ŠÊÄ]ÈÑÐmaLàe¡P› œÕM-*g&Îì@Y>‰6ÐäeYÀ®<\¶jD˜T'iâÔFž¶@+YLæËk³‘ÅMg‘dJŸÄdÛzK¾¦À—‹n!Vaõö¬bý åÓôJ•~UXøþñú²*¡vé,A\þˆg[ ³Z„ ý«ÍPˆŒæe-„JOéòˆxW×€ãb͈°[2ig!-żƒ6…½)±¦6…ÙÕE$tÂË£X_“6:k4 V‹—¬eûσ­¸a«QUØ 5U%²XÄuøB3§©èNHâ'H™W®¢²˜L~½”'Š!ºôЙØxû¬Ü3yZX$ÈrÎÿÉÉñPE³9çÀ?;ÔùêiI3õY-›7Ðy"çÇ?Nzlm°ººšä–‹HO§ƒSñ$+ˆÔE‰j2>²%õú4ô/©.äþ÷*V[Ƴ¶©ž O|§`@Ëï£%"Ü}"D©d’=ì¾!XÆü~/Ÿ]0|°MÈ÷í 0ƒ>(ö•¬ƒJ/”RFÔRo ù{m §9[¨ë8Eýà­-«vJ¤¢e°A&Á³˜p0üì$Ò.Œ’)(B—åMêø}ñl[¬^©Ùž#!ǧE¨¨üä©ÌÔ(wq÷™—xijˆÚ¤(©sFGLeÒ}Àê8+²6,.¢˜ÕÞQ§€þ½²‘T' $UYéYàÿÂÊ‘)v0ÑŒì(¾h¶Þ…NÂC”3¤†>A±›%™Óå ú ¾:ߨ+yÎ!uF1 –Œni`)NMð/‘ÂörsDss”½‰)Fk¤‚þ:6ÙêNÀÇï½Cf…lƒä—wœñéø¾JEšùOÁ¤܈6ªï¼™–ÜMŠ‘ ’£!ýçûŽ5Š–Õ‰EÈÀ¦:oø‚„‘ ‹zMÝYH½.WzÙÇPBá1SCÖMYÈZRn­I=#P`¥˜= 袨ˆA€"ŒMÐÍQRYÑ@hU“`Ùu'ɱÕÁ¸ÔsvVÂGhVó4s1€šÅˆÅ‡†œKr-MŒû#¸Ž¦ó8UŸ¸P™Àα ÙJ]Øœø›2âÀÔr>-ï_(‹œ¤'• U¡ª#TR„ܽCq­†êPQª@’[¥ŽýéBU;̓Qw£bÇÇ$‰q×î€?=[* $V§º¨ hÀ„A¼ ³ªhÿ»ÏÎB_ë®ÐP€¦O¾UºÝ)ûyTÿ,¼ÔÁÞųœ%]eΕÁŽ´(/‰¬nAóÏê¥wq!Þ~–Ñk"”Xƒ Ñ€‚ø7Ÿ…‹ÌBöØÀ÷AF¶èß©lµJ™¥^»Å§3 ’¾ðÛB,jÿÞºîšÚdÿöÓ²ÕíèâØœƒ™uŒj_u1bYø"t¤þ¹².ccÇúXÌžÉMá¼02eÊ»Y¶ýæ'ç™*ÐK–£×aÂ>SØÔlí“© ( ¶‰›xõ› °^óDbÃ,…ÿ£ëz$.Û%äIÞî}\ì¬Ë­æ çÙWï7¿•¹LwÚÍÏgçŒÄ<7Muk‹Ä‹g›Ïê×z­b¾d7>"%¸2G1–Oj<9˜²dÅN[Œ6ƒ7ûAHÈw†IÐèÈægˆf*/Ðh2¦ "“P 5ò±ôÓ³Í&¼dümö@£K÷ ¹ë»¾¬·™Ÿ£É„MêÚ‡Õ…ìø–¬õZvp@8.»e±ÙéBÅÖ”Æ}ö™xs¾&K–XLÌ$±*ÌF6˜b~–®V .ºáÖÆÙ|V7Ù¦P‡!†0|vØê°6fBñ;#È9íü|ÛïF2Ñù á\7¿¹CA<º)!ÃséÛŽMªðųå“¡­ÅΞc@‹õKÖ™×Ζ*Ä›#Úb:4ˆ´µY6_ö€Ë¥í6Àì7Û=Xç¾²ðÅæD»‹zS(éí&D³Øz»òp±ß±U¼¹üTøã³í>,ž…6·³0 öýrkYgÁînvÌ¢v³Ô„/¶z«í¾§UlR¥SÚ>¦l¸£5!Z]pn.ÛígtÍ[çã²yê“X³¸ÿaà5(bŒËVã\šfù,ÑwXªÓ,t‚Ì] ÃöE9E nîÆ Þå^ så‡Åõ î"y²”V·>âüd•ˆÛåæº8K(mgÎ&òXãæ#[~N.~î® ÖšhÇ U)ƪW\0>[ ÿÉâ: “xê*`(Ó>ì%.ô^é^ô",(©¥!ÜJÈ mM~ßW<; –jÑâÙY¯]UCð.¿Vq·§‹2Âq~ÖOp…‘Ð¥¤O²oíÎâ¢é¹Âtºf¡›kÛ,&Ì;0Bm §V!ìSè­¢„ã/›$cM¸ÕƒY¼è^¶!ÜŠüÉê°EC'€Ous)Îhœ…b0Í–¾‡v·…܃wžÅÔÌè¦pw°ó¦Ý|rb°ÂÅ`çVYŸ}Pd¥…!%t¾apÍî9ÏÜÁ„”£ ¾‚…‹Àõ$’ÅÐÿÊì"ˆ®ëì" —©p±{•Ì9©ÄWÅ­*³Œì>%7¼pĈ!`àDPQÝ™$öL<°áíg›øw)5«C1T&nÐ¥Tý…‡‘¨šú ·e샔·AFlø 9aBD2– ÚR,€þ’Ÿ;%t#qžÙCªç809.ážÝµ*ÜöâF„^H›Œ> þ@„!Ä´ð _>Û³ësè2¡ÆØ“Ü¡;°µô9z´0Ðsу !b1´«îåsÆ)0yéˆÎÀ@'…úŠ#:+ž‰EÈ9,ëBV¤…ª±Ø¥fÌB’±FÀ¾7ˆéÑ—Iu¬ —ÆF<`äj»ªfE,ÌÎxi×úßAøøû”K~ÞâóPb¢¸BÉ^ËE+=ĸXvâ¸]Š[±$Fñdn 9ì3 ÑÀðYøùç…ßwK“í !¯šT€¶OÙHéO ÀôÖœ{rÞ+b{ÃyŸ‘’L/Èg›Q‚¥ç?–=ùl[ŠHÑFà@Œ ™)$ö-èI”DÅ«ÒÈ€Q áVä@ìo £å .vÄ.Ÿm‹‹ËÂEèa)ôVø¡gÀ×D˜S^ Ñb"Þ²¼iEKHgÐXƒ$ë¢ùYM™_†T¼DÐ~Ò@E•€åòÙY¨´HÛB¾déÐø+Ix¹€‰’6¹?AÈpSH1Uç,RbG)Ò®Ìõ2‹Æ'–F–’)?[´‰’&œ¦Ž§,Z"¦P|sÂy’&I ÔÔè†ÜYï½qBIúm"B¾I1õ¡YÀi)æ ȶÈØ„Õa"à”2ï{bHFFÊ@K¡.·"VdÈhjñÝ¢˜¢¤’Ǧ‘α͘šE’1!n3R—B‚²Xtd ¶­yKêšé.ExJ/7?©)B’ÂÌø$Ò0/ž¬r_>Ûøèo ­YXgq7M¨‚–ÞXtD/¦ù«óú¤ô‚í]>Û«sg±J³˜Ó†B.uã̉ÃN÷mè ‡“D{·ˆ7…NÐЇ"1=4 擊²2„HiqØŽ…tñ¢|óFM,ҥР+Æf·TˆôX¬Þ8·S ¸§má¬xÍߋӃJÚÜ5”ªt=‘àœ”:¤cÊNXŠ-xº*ÄŠ„QS¿Tˆ$Ý€ÄjsHV¢¯„^Ò’eøVa°ßÎbÂn £¦,Z]B§c‘›R˜—}…t_øº%Ô¤}4 `w{DóA³ë…ØKHú³äØŒãIfS£”‹KmÀ[´8 J‰„’ÍÔ[Óf\š™ÐQu~”Ù~_j°¸ªK1 ÙâYõÉ“ Ó`´E›¢Íêµ¢hsÓÈ´yØH˜7ýŒÒ@|ž6<µ«–l¸„Ï9AE¨¤Hȸ«.eECG§¸ü…q_c™–Iå$Žª¸Rƪ BJé®à©f(7°ñ,ûŒ^ªXù»á5¡ÓH`0ŒO ‰?D¡kD»ó³ì_’v«òl,â@ƒ(úfÕt©ü×`è§eèN„ý±Í'Œf±ºw*“VM›>NuÌÁ½Ù€:bÆ=XL"Ñï´Ý)·(! wº%Ä$ªp{n-$L““„/-¦<Ä'œ3– 5sþ¡‚¯;_C œJ™{0‹5¾EBIëÝb\[ëŸÑü—‹¯0‡§H(é(sp†Ëbn³£ô¥J5‰Ì\ª‹ 2f ×KUùº@nˆy‡n m//…´Yä mîûo'Ä|¨ Hòñ2ͧŸ&š6ÇHÈ®äÍÈÀòY=·^.( ,ϲSBõÕ£QA•Y '¯&‹ÍÞú峿U_±êUÇÉ;s:ò‰¾ùì|#Ìg¼^Û7Ê$܉ˣŸ¹A¼+[Â* f›WŠðœ‡¼ÓÀâNb¥æK1BÔî4á1‰èžœäÞÞn`q[ç9Óú‹PÉY›› P-nkJý)°œŸÝÔðdžãò›Ê 24gY–tПm‹£:æ6„¦2ÍB¬½ØiÀ4©•VÀmC Ü,ŒJÞ¼PÄ’\J—ªŸ!{) øùÒ,Z¨³õQ gSíhžçKžx+”|à7ƒšã›Z2žuFÿº!dt2ØÒÿÏ·Œ‡Ö’Ûê– a¸ŸÑŒCa0`SÌüÛB‚CÂË0NÎ25³¥¥†ÒÖl/í'³ú!üqˆT»ì|ÃÞ\Xp”“ g6äl°.lH³äa.žoØ»jXÂŽ†xøìlÚng3ØR—&óº ^ÅòVSei´Ûšg26C¿âɸ<’mÛ0¿õÖ“ÉNÔ)B6a ßrE,œ!ó¨2²f•éžcL”³\8NŠp,n|/Ê£ `ž…ya½lˆSɻϚŸÈ68„Û~¢¡£)QdGæ“· )qªÔmOW¿ë¶¾6ìNŽÓo»àf¡1äÍž6ubwÎè…co½ ¡Þ:`6ý˜C`öˆ[¾‡Ðð1Š|Œ7ÓW@ì³{{àó^4 •Ff—ù¥zÂ5¹ÿâ~jËUu۳ߟ„;8üK& 0û”öP4 VÍ žÞ¦!¾.5JÑmÁt¶ÀAv= •êš³à%Q1•K Ÿ‚9ÑÑš•u [ò ]3Bo¹é$l 'å-Õ©m½ÌŠ,…;¹ b ó’câãe¤fbéÄlGÁæùZD¶6„slmn`C ßÓ0Gc78‡¹NáÓËo[2³3”Š¿v¤Â$Ío.$*Cš&i0Gb¡y KñùFÜt UrÐy)#ÙÔ\î…¢|ló¾9ß úZ\‡rê&¯RN•9_K”YIªÉà“FˆY„šß·ˆö”lœ8zlHúU([‹ QðInØ2šmÂÔ„¸õÅf[ýIŸåk“Å1&´;‡Î›rmП’ˆÑL{V8ÿcqÚ"6µ!tfî!Œã‹0û¤ÓÖñMjް+Bˆ8nãü_<«w…ƒ—L´±sÎÙbÐìÆ DªZÑ3Óž¿/ Ìwà†wà.~A0ý¡Ö&gôó™ËiH‚²&ú9ØOQBBL®$‚¨óÔÑߨXÃÑËIQ•PBUÁ¦BëÒ¦˜òuLN³HWàO¸=S\P ³š"¢]“†y˜jÙiÒ¹]¶„ªÙHN=9œ=:i5‘ePHƒ—Tá؆˜éy¥AÄl ñ*¾ØêAœò½XjàÍÝjŽ#†P¬péÌ¢ øFJ–"߈ójHÝ"€ß6±'­Í#ÈHáýÿI{wK’]Iô ò¶|€:ˆ§G„œƒ+•:9+u‹wý÷w‘4#¾2»0Z–•/†‡‡?è|©Gݹ¡;Ý,X©s`5Ù×kÕ]¤Aöƒ=Ðç&ËD½Aë4­¦M[ž&´îFe¶??f8©J3ÖÁGát5çLTó@b3;À~mV?ò_½S™îÜ{*#`ªè…ß“¥õÎsÎxz9®ÕÓþ|Þô¶ÜLísꙤ»òkuvÚ]:Ø®ªbÕ}Um Ô#Ⱦ¦ñ+o©Í«mŸÁ%7äà œyDx¢~Ü™£Bqó‹ìôù¦T5VxMeÅ#ÏŽÛàñüƒúš°ÝǶ̌Ï%@H/ˆ6ú¡š[=Ô'Ï4ŒY@G†ïd®Þ¹c)èÔ3è×Μ¿èþ™Œ^f£YÈÛ˜¬îÙ(òýGرœ=ú¨¬ìçžzôF¿ \3Ò¶PTã˜=8Á•¯N¸lÚô-èV¦bÝô>þù1Ã7xešTKªƒ@xT]ʤº.pA*Ï|¼Á ™¨WAñ¶WäUÆÄâÄ.p€Úh¦ßÁ¥é z¹Í  ¸ÅiÖ`¤4yÂ}Ní;ˆd…"ÊÎö›NƒAO}WNaÎF »½ˆ_‘°dóx?CU ŒXœF$ÏJ3V1gYí3òÔ4„aŠóø{­YÅ®4‹l¼i­*åMWD§D”Ì VäË빌½©(ÛÁƒŸÓï óåW ^ŽPwðïéÎÄ86YÙ= •7&D¢}âç^=«_XŽä½@Õ¾_í5EÏLO è¥kîÚïʪ%ÿß…›Å?ÈÄhs؈wℱ¨ª%¨íîäKKuwD¬ÐÉ=®ËßêYi”„•>¾DvI=äÝ~ôù1ÃYÃDÁäõÏJƒeKí·ÂÇ+MPÔņ!²ìRƈ~1è®BŸÔÓŒ5>¬ËõgêrçõV®¢¾†€=­“K˜W~Ì"x}v¦ÑÛ,€c¿kN9#NGði­[{Ô¤”ˆÊçoZ i¶jÊ5=â\3àÚ©àý”´XÑ'ÙSyŒÎ+ÁVȨÏ»õö p'ÓŽi[éXÖ=ðPùÂKcF©UãrÎWµZD®c÷àžP°øЭ¬Ÿ®M1¾ÊôX~„ÓP+ ì¶õ(€ó+´¶åÈìHóÎ\pP`níùüôlÐ/–¯ ó e‚J^„NæÖ–4÷ûú§á­‡eÛER ¤[œH2:‘r ´m:o{m´hA—o ú>úôT©ü´éÍ’vj+ zK¾„`¢ÔÑ¿/˜ª«€åx³úœØ’~áö’ÄsÛwÏ€ªû68{«àü#ú(€Ô<,cn[ -ø/U‚¹ê.(]D•±T;Tó³÷["IiC´ËÿñÑt'Â3HÃ~ýÞòõ&75UÝÚÿ¶‡WPUÝTòÄ àå<Ÿ~…hÊ£Øð­ôQò®]Áè'*)ó5¾>f8¯;¯Œ4mw]ùtÂì/èÚW,fxÇ»úü=vÐÑPøÛ›DOéš~4äéè—ÿÑ–Œ ûʇ‹ëB‚p ¦¹ÇMbpð7v|T35kXЮ H°Œd:Û [[‚bìVp£h-i$“!,Ke%'I–ˆ»¤•­`‰Ä*).ŸYsü?ËÈIC¡„‹ç²M áFôjÆQf ¿bnž3ªLù»é$¼‘iq)o$L/æ|\O³eXêk£Ø_XëñÐó0–“‘^N°¼suJ•¬¢f¾É(QaÒ¦Ò6,-áI`P+N,Û·ØËerÖÃReÈfôXjçã”ë`«µ–žÌ6 ø¶m½Bmœ§MVœeèR©¶¬éËima§Òäécþ…‡q> Î1Hû—,к;‹=¨ŽÉ âøR50ºI œ›¬ü¾üuTrç¦]°àóÀ…ªzçç_ýXõ²_¯©øÇô¸ElW9“²`™åÞÓú gì§AÐó¾t‹elf…ÃC0ßÕ*,ß)1e*„C}§àce…h*[' ‘¼+`£¬¥QQ.Ԡßpʉ[q€Mi¾®¥”Û)0@æ>Ã\úë;µZwÁŒòùgÐgoQU¨©øo—Œ_~!ªTs¹yèåIÚ~Öå à|yjmëîÃH§ÖÒow_½zua¹‰fG.Â#Ƀ Î{RÚt”AÌ»ªbö@o>y-åm†=@˜¦^r´-c¢šT¹}i[yÛ¶nñQùHœ.˯ ÷©šHþÚà¼f)Èø!5·,ïzÍ:3‚Wn/iÍgò|y+åD–(‚zæ–®òÌËñ;ôSÐãWÊ{íR¢áÉa¿õ¼×Wx¹l¾#ªˆý5V$o¾ìH0¼lÿpD~}Ìð@¡šºB©´”©æ`­«™¸BKǪŒ‚áूSM…T¾@–% I3ºEC‚€ßoð·"Ò™› iK5ÝO!5Z•Z·¥;&b¸þó1ãê±c•V!Ýš<ýÀ¶¥}ŠÔŸˆò5UùŽoþúè£Ð:V O°ÿ¼µe¾Gë­€F€³.ôššâòu¡ƒMWì"()޶ÔjéP·ÿ§E†»×*QøŸ°^6–Iéc=âB¯2y»P0_÷íÒóÖ) ~ü°s k$³:YP„l¤(WZ¶…ÂT|È \ˆ\ Ê.g@¦kìßœ’sÅ?‹ÐÙHfF&KüJºÆ!g[rÜdf„xµÍç’ªDÅG·¶®vüÌ„‰R<Hû®dQ¨-ØŒð19%tÜÊëFI =ê#u^Ø#Öcò QSÑ$½:޲lÉËÔΈU²d\À‘ö«‘E)Vkë+8H¨Ö,£R aBB%¤]£”C˜j<ÆÔ¶¨­Š‚ªé;Õ¬É%1v»u}™"î_¥â’ìŒ3ÊŒ©ÿX“Fš€õžåædÖ8øï·Þ¦Ü^áÛ×­” i[Ÿ\±XåÚz,V¹J‡P^AÁ ó¹òqì"þÌó øçšmëûý1·Î>Ôjh =ßÍÛÝáÜiêaé×G¡å»²Ê"ðˆDñ»¹Ë•F¯Bh¬jÑͲ6¥³Cåf ¥P›Zy»eûÓíÚ Ý“ŸµƒÏ¼×ÞÿM:ZÝÂ+Üi,,ã©ÇM±òáJ=Ÿ­-ñF®ðaÒVAÞß-^p£ëQ¦pŽ òúݤ:ÈÞVDzí`½—œÚÅ"Øz€ðM±¸Ô‘Ë+uô@á$ÌS0• «Àp(HðÁkÛêAáÙo¹R?µ-0Mt«ÓçÇܱl›yšbA(nÄÎùw…e¬™¸¤­(_6Æ=àšÞï®ú¨V˜TŒªk¾6º™½Y7ó..FÍN=Ks‹µ¥›??æ¶tÕŠ¦'R+¤ºLµ>w:;X¾Qlái¤€‚“¯4ãÊÕZ=?¥†_KqHr9V+c™-) `º™H#HË‹[̇Ú6‰Ä0]œ ³\[hÿ¥Ùàâ&÷P¬re‰²„Àä»…²îˆÐrÈïáá €ÞÆâ©ÿƒ¶$f(oˆðí•¥•!È¡øð•éL­h mQ ,~B‘ U‰òpIfÇH Q/!$åÞ¾ˆH¯úš~ÿz*˜j¤³2=‹~@Cå…Ô‹éwÿ¼£Jb Uf¥ô½_ íJþK¯7 MþÙ—¿å+Ý+/°œ+ùÉAc6Yû>! ªÖO`³U¹u¦•Ü…ª¥Îœûˆ_íx1Ïô²_óñB¸ h Î‚Ó ÙÛH¶™Va„Ûάj`Îί>àÅw##[„9òr $ýb1î%«%GÉb‚ˆÑâ3l üŒàWßÀ´mn**µÈ­HQm€lh[¤?`ƒ üÂÖcœë0Aäºóúß ÷D,°Æ¦(,@EÇ(ªz-q³~%[]ƒÇº¿·}@õV Y—瘷žoÛ ëSm=½EÕ"jïrèLÔâ%’\%UËcºÓ:¦¶[ñåUËMÊåa[fÝ6P\ƒÔiîÁÆZÂEûl±ÌzË=²{æì© ‰€ƒÅÝk I~ɯReö6"ã§·1z¼Aòõîcˆ‚ßís‘¿lúŠ/˜Z‡¼À¿ÚpIyòj›¬œ\#%‘ãKø—pûüú­Œ½-8¹>Uª€Õ?§Wè/!2’ê.EÄ:±z*œätd7Êš-ä5 ²1©ES¬bRáFA°æ}}ÌðŠhyXQuOëñt8)úꄃ´ZJ¹&}˜*HgˆôÕ–æWêBÒ»*Ÿ"iäȼ?OÎW–û%Lz:‘Ê/%ýc ³p†’àð@^z1 ²¶Ú/e$·iHBD!¯³Ì¡5\kZ:uA|ÃjŠ*7¿“ç²Q›²mQu6Qwþ ¶%@¤²å% ‹þþ HŠY”(¡€‚¿m‹š‚Ì*ž^7¾Ù]^Ô*©T£Ú²0¦70k˜v"Ú±­ðä¾N›wµ ^ÏOü>8¨ Í@Ùå¤ Od;À’<’' ÅVÛåœX-Û±XZ„e£xðž×wy$€”ò¥0Ï{oh‹ªbåcàŒ¤“ƒ³$ùgÍ8?‚xc‘§rè±Ó´Ã{€‘OþVsû=NÊÊ•q¾¯´4äKa»ò4©'Ò"[a»r%äR‡=ç5­õ±#[37‹O8—å‚îto+kìÄ×5LÞ‘%ܬeÞ¼-Á{Òæ°{ÝŠif êÍ•‡¶UH48ò*¥Ž^©$5p?—rÜ~mïÜ‚òŠê= I³@µ‹oÍ/1ýé.š¶ÃT*‹BêþîI¯ÜìɤÌÏ(=°¯mŸz€ÉÑ­—:g~)µ °”f¯Xg›ó³ÑTzæÃXÈ=oé¾j¯b¢ ›¦/Å5¯ù±ƒ4P[Ö=D¾M]9ÒÔjàkö>ÓàBó iä÷Ö{Hƒ¥·ÿÞ 2»vƒ¥¶Æ—‚êkÑ—ƒ—wØý^7Ìóânbfp}Û}´*ÑÀ¬dà"Vp]—2xRQȽ«BŽ;Ο“ De?áe–S à­˜Saÿè_XJØ’ÏŸîóT"èRQ`b²À¨€º¦¤‰•»ÿ`HéA®(så.oÝz©t™IUF¤çŽ#§¯;î ýp¡Ÿ{öñ$ùœ˜ð¨É$“×-bè@ËìAP)YǶ4"­»ÛŸŠ«³G‡b':'³#EpÔyoïA…Ç犩G‹Ä9¶½m{¸}Ú \=°WÀúƬ-ûÁlsæ>±ó‘Á賈Ùæs¤më9 ¿fÅ׃»äó *Çl.a“@I»ãA|*( à½j2ýè:@Žô )eóDè°ƒTÉäô`ãuP 4+Hö´& ŽE[¿wú!~s÷/K‡ Tܸ¡ÇƒÊ +l¶n–èÁ¾§Æ:˜W!k»Ýlû$K÷“R©ÚŸ+Âé{‘[ÎØ¨ÍÒ»pû+p}ÒܩуûN~@TÇ ’Œx…ô}±­KÝFþÞíIÑ4‡0bÆCš\ZÄãA—<ÿÜ.y_û¨/ n“W ùïzã{å&…;ƒOݪfW:¥‡‰Æ"[·ÉŒÏ³7ê<ØÑƒ'Lºfð´qͪ9®ƒp 'ìõ‡íYùmìÊî°~‡¨&9^Ó›½¥~·è, U剥cPe’ð¿úü& ÿšUËϱz.àåZp–ùy;h¬£´s+€í€_°:ĤPmk7Òx²ü4o¸Ç¶ßm¾°(êÝ_“jžŸOâ ÷u_?9,-´ë¶£*xÙ]óõ‰¿Ø­;ع rC²{”GaNÕVnÚËl¦S ‚œ[™­ -[-‘8Ób?—ÒK¯O5P©µj¦/¸‚9;†I¸nYÆG%%¸å¤’Ky(þ®Ç)纇—6£§¶}ªÆEõÀAŽ!‡Flc9Þ*àâêì  ë?‚Nœ––-^0æF(þ?n’ €ÓC ýa8×mn ¾Ñ‘.ºZ3«ù¬y$Ùëž”{Ã)mƒíÚh*—{˜3îî5clϤd=PÛx/³fÁ’鵘ýNµŽŒ<³Z¦çõb%¸Èò–ZÄ%¨Ò ¾÷;k¨„e½Jg» Ì6kCiNýg°l¬òq¥m}Ú2žçn²š•ðz›†e ®¯%æD“‰[Û¦…º@ÙÍëI(:Ïàü­Zô Â>ƒbýÿ¡-_¶I­¸.”ÛáÍ’^4QÉh‹€×i=ny/ZhãF’rŒ›ÃFXzø #öÚ{.¤ÃCX ;¡™Õ1³Záõ¦Þ®wR3Ø}"4ˆ*…®_`jèqP˜¤.ÆACìcŠÇ‚蔬«öÕ·Ãm ›ÛªÀkŠèÊ"n¼˜®:žÀØèµåÌd‚ó§¸M3 #Àf˜ 5£ˆì¥áÎq†9¶^èAÍÓ8ËÇ>E‹ÂöJçê.²hžuƒºðσ–û¶wÅí,Q‚̾"«oìtÝZÓJ“‰ØÇ>®•Ð@.PyW]Ìf$Cº+Âb¸žÐ. \WÚî. Áó”Ú%|™kLóœ¨xw_=SˆÛŸÏSùªRÖ{êòVÌÝéKÙà\µL·ÑN×ð†òôê|'L´1ZpuX,x¼[# ¨ ºKåy`ñæž$ãûÍNtNeéV3Y`öw˜yOÚ…e3‘nµ10’û{ÌZõÀ¡‹[·¸:N³Ñé8¶*â2r<¨Ub¬(ŒyG9@¬9õZf=’28˜Ça Ë35~o‡ýŽ3•£e7F÷l‚bÄ^!Ó7;þ>Hž½-ïvNh›ãÊè1¯§ú¿B‘¼rëµ+ÏÆt]…öß‘[ Þ”¼çW0cTâòÚÁµ›œH²~eœ(晫0dÂÍ`ôîR·Hþ¸:7:Àð×<3zMŽ!5«#H18gŒsƒª]ü^áäsÿ°”ËÌ6SM6ST;¤Òq¿éÒ™aàÍÄ䩊ӗ”œªâgy »dÐ “¹½¾«9cN!óå¶êÕYþž¿ OŒÃ¥îü}¤Š8†»oõñ0é³°ú%  ÍEõ°À­f¾àº—±¥ñÓÀýDÑZ&/”«U-‡šD‘4þ+mr\ˆ7©{^¦Ði©ÒŠ€ïõ)‘²3µ-P¤Â{Ø{ž>¹ª–²ƒ¶&€I|ía?€Ôv&S/1,6ù%vöy…‚Æt«FŸXñE™ÕGì?_Ö&€$åÞÒW¼gÏ»_Ù9µÃé,&&D&üù“õ\ GGfo ¸KQ ÷È\ð”±Äé‚(Oz”‘˲ ‡ö™ ¼»\”T\å9¿šAs  ³¸·Ë7v–™\Ó¾Q}ZDº¬ëYЄÁÖ•÷áû|-+<«¾»ÿù³Ö–UË1pÆÞ ró±¶k–á^ÓIE` ó¥ôà¼jlã½)¸Þßà ¯Æ;EF˜üI®‹'ÕI+|é©}ŽeíÂƒŽ“òÑÿÔ4XòýIiœG‰¡¹1Ÿß÷êw~ èžt&ÿù“òÕæÌ…'K#ûà.ÄÚ‡ˆÃÁé‘3ĵ‚ð<<5ïx.îôÇŸ+•!kz¤ÁwÇGi‹`q{™cðôŸáŒÊ9ÑxêÒXÓ¶hd,Y°‘×3Û9E2(t”éß-&#ý½ŸÈ¡0_ÇŠäa¾Á×ÈdËP猚A÷8e×âÖdm¯šþ;CAXpÉÖOUXWÅ¿/Ç g~5”k_vÖP’AŸž_pbÌÜèS::¦øÌÕC7éT\=Ãg‰Á,Dx&%¯[­©•-_o8ꦙY?¹·î'Û¦fY~Ö'H¶f·2๷߂ Çä»ñ£­Q %w†¸.›:³X—Û*—¯­gIJcq2”Wí%b»\ï÷ƒ–n㤀ãɰ¦t+g” ÌÔýz¯ @É ÆœÍžÝê0Ìiî7{n[n°œ6Äx•ëoCL÷‘W\}@]ú½µàªG§"»œ¿î»ª’§§òijkÏÊ®=uâúa½ÈãûƒäÊJS¨rÓCâ!Íü=Ïÿ+ýЭ³äx|Y)K¿ þçJ à fMC½W¹hò%¹ß "P–¼[¼Ùš§Ý9p+åÛpí$·þýÁÃ<ÕR7ö–:uyl×CcHH!îm×t¼Ó^ºGTå·cð)‡ðŽû¥)86³ <¤gÅŸ5M—07Äõðxä…)öŒˆk¬Ÿøî뙞µ·pç/Cä-Œ=Cžßœss¦ËxöÜ]<ŸÐA¿JÕ˜¸eÛ}/‡gAÏ®=£8höU—‚ö¸ßŒ pYòŠfÖ‡.3Z¶FTq«Pû7Sµc§1¨Õʹæµ\¬Ï³ÄÊëwë¼¥5öŠXÔ%œyÄ­~[~v¾ï•,wÒ3µïÕ_å*_¨˜yðÉЊîÓ+¹#VAt ׎uTPÙ<ï³DñÂ?'¸.t L‡d*âÝ!©ð}QµxIÂ¥X" 6Œ¬=rÜðVBkF¬«ªG‘²ùö|î5­¯8gô­–4|̽&á¥v;xÚ ˜Á D˜iœKÄFK¹*åÇë÷×z•¶ß:€žI>\àÂGƒŸçâ6q>ŒbH ³”…Gò†lcDJÕ“¦jm gþ®lg§æ : ŠâÃÎ##&.†œ°Ò¾¿|°³n/ým­ƒï>ÃL¸Uï5† dí¿ºº­VÝP'ï•v#Ö¤´a€íÐRƒòâÉÁ½ÀÅcF6jKzB¶ÙÕôåÛí’ËÁ ®ó÷*Õwœÿúß9{"¨ðˆyÍÍA÷V [æO8V¤4fdæ 3‰%?Þ÷^¹ÅÎáãðy¦}:Lüž °>$®¹Y×ìîO¤Ìެåmvÿ( màH÷“¿”ƒG97—L%)T|0S®°Ë«F™i¸ývŸ9·¡¢±·’0›ÙÉÌÇ` X$ VÂ@—0Ñõ¯€nž%¸]¬QWUd¯²:P*ò]ûKS[%:µM]öù®s* Vn7"U[žDUnìvÖF„¶‡nÄÚ—ÏY”p•“š``sŸú¯ ­$ÜzÎvæÒŸ–T°Ë,7BËödäá•+Yº¬¯‡J~mÔ=ìF›&Gƒ—º“£ø§H€,)oT@~:ðçf/Mzö){¢UÑõšÈ­­U+½qa£Š‘UÛ{à{Ö LøGðH[ 0CïåavKEýeVˆïTY#Þ#ßïƒm¯ÙVß‚îí¤Ô“—Œg#ÆâŒVñºUbžñÕ!@a:ªò¼ä\_Ø~¦¨é*HßTÛ›.³š<Á¿Õä%œ¼J×3ß,(L-^4¥$»€,/‘öΘº2þåQ®‡ Ÿ'Üa«r'Ð_ZKþ[,÷×ÇŒ^˜° rä‚ÿ?h‰Z¢vï¨ÊË?eØ®"äL¸óŽV½n2ˆâæ²·–^ð(+,;¹<ìÐ \g‰<¬|À¯¿iû­Ô¯äÎnŽcÍÒÚQ ]N3+cîÑý8¬Šá]@õ–Nû’ÊC–=€\á¥(©Dr‚Ÿ3̸½ª$mìˈخêÚM%‡I[ímö@qÍ $™t2v‘\®7eqùi>§©ŒÿýÑç=ZÿžZc2ýƺE ÙgKϹm~QXÐ ÷®ƒ„émݤj”5Zûa%Íäæ;í _È;j s8Ävöõ1ÃLíÈ£bãPI°@m£æØ6ßQîÝÂÛ`’w50Ï‹r£ÁyeÑà.™SYÈ krý¸Œ pGõ?Za”pή‡0ïî/Ýà‰X®e Ô/ kð¾×}dÏjÊ™@÷ ü•W—µ”›Î¡ †³ÆÃK²èf•ÃhmKx ™…‹÷a «æ|*˜9Ÿ zÎç×$àÊà $SÕ8ù$S#ìÜ–žÉñdÇ· &V\Éi`f`\©®…qÖ-Ľ+­ŸÎý¼º½ öy[!cÈF}!£ÈFh‹»†se¿Ô÷ÙFæÛCêQFüÄ f­wyÕ%S;‹x–‹ã+ߊnÞ0®•DÐ^̯º!rÏ@/£Bmö¾vì´ÄéZ”»5}ž3k°t·íp¦hA '+Êw'itT+ vÁ¾®r´Z1wdîo¬Áh¥ÎÏ ×!:{Þ|žkr [|Eìÿùsk•°/P…ÛŒ¼hÂÞnÀ®±&7×ûy?+VÛ‚$ 6® Nz×$9„¥4æÞ­jë7ªè¤ Gè[Óe@û^Fàë`†¥ Y.~ËÅ‘ñÜך |ƒ/enbq}M«s¤Áͦa„»˜·™ùz=ÝçžÓ;¯}Ú õ m·t$¾68ºX±Á}½írâ~.%e‹=Òá½¦ÍæBd[¬Ïs᩺!¹ó65cÌëy¨.„QÄ4@ÇtV“ ÑNU¾°¯x@¼vI­dhª•Â;É–á©LùA.°ånr•Ÿzãu_îßHaäfâ÷>‡ip4.PgêS&òª¤÷iàmfæÕãÆ/á±ö]ù’*ƒRò~'Ü·ÔÅxž3ŸÀøJË 30F.êËdN'ÏbÊ%Ùý(¶§;2žC&Ìôý*˜JŽ?Rv·CµÞ ‡êçÇ û±Ú_¶ŒÑj¤ 7òÒm1>KXL¬ªe¸Þ„HAºÕˆ'®$8«·æÞ]š$ØdÖtˆa‰`èí=}œÉ22Êìˆ(£hh;HŒá!–>†,’F«ÔÎL×·øÃÁÙ’÷]#ÎÀ*süÈà}KS;øø`êTÇ5^”{…eÞX0OĸGK²¦=RâÃÂ*Ï ½Kºp†$.1™h~Š RÌ`¼“ƒŠBHn¢¿ƒ“ÌJU"9H,ÜdâEL"Ôa£h`A’þ–%¯ìׂhn„#¿@®Ó 7>l)O|  ™Ë‘=jÀ;s7Ž\·-P".+åPb3áb $.shåùÀ†¹gôÁSŒ5» àe *Ëøaš•±Q a ^?3~ºÆ`rÚœFhÚÚ´°BVÝ¿Ç@Þ±5‰lük;çáJšƒ®Î‡3JÉ0{ùÐŽ×5ƒZÄn9j)M£w^ß i‚…ËÞ3Ùb-²šäæ1ÿä“ Iî;XAËÀfñI2'AǬ’` !¿{Ökâæé R‰)à= Ÿg©+a˜#êF4vùÊLb“AGîÃf¨R%Æz‹ÚÞ1z3‡ù–wàõµ…®{·>1‰éjß2èE´_›’€øg¾fRÛ —ˆÜEœ øvH¨Ÿq.á R˜‘úYk`™±¢©°žØð … ™ ®ÜŽÿ&½<‰ _;ç’®ï‹ Þ¦üÐ÷^”„’×0~?H޹‹Ã9Vë «+ ˆ¯ ›9ŒTøë£Ã#Ù5ë“zø4Vû,»SBÖöä`“AÀ¿+®Ìbm©G3yË€˜ÁÌ•¨‰Ñz m3Ù¢ÚyoÈ=Yà–­Á°¦¿KáÈY˜0 ›­ŠÅu ¼+gŒžŒüžFÒÁÊ£±bM™9£€÷'pŸ™m`°ÜY63õHMcñKì•èý°èSQ4@¦Ìœbˆ²:7ásaÊ“¹p4÷e¤/pÞIyFT]€g÷«“yS•Ìu‘¦¥¡næ‰ÉMÈ«ÈÄOÍZ†•)n!à@5UϾ#3Ï‘[¬­“¥ß1›ŒníB³ðÁ†ÊšÞ”oU(-ô*i¯Ò ¨¬¬Gµ½ I¾¸Â‰_3Øä' Û‚É–/z1lJJÀ-ó‹nFLìÂ8QZE–ÏМ¡Ÿ@f¡ª^Óà|˜‚·yd˜\{…CX/Dc[*lKÂÁPy)`~Ô·VZ>JÂÁÚL9™‹ËçjQ3s@Kµu¢Òp&7ÄR!¸yÍ2…ýº‚±Ú®‹,Å(éã˜8½ñNlmŸŒë¯ ²ã9**­Ð|¥ˆJ^E~I$H‚ÓJèmÝšMVÆ«"0Ýp&“E(îšm/¨Ä+aÔû‘ ÌM¾çŒÙ¹’?8ë¥j!2™ó{ DeÞ,kf;’K ¢ ³U²DÛ yì 9"Qãz}ûHd·0¸ód±›ã$Hƒe_Hîë/`húÁ µZÌ瘒ÃûÈçÖ ¼Á•]®DMÅ ÙˆšÊò m·xóf“’Ì,µ ;wW³™>g¦Ýï UÛ¨J‹PDƒéWËÁí*v<“ˆÑQ{š|X09w#[ÙRMjöüÁ0Ãöâ dæÒ)ÖÕT°±5Èäzç1Ê•£ì“ŠJtÙ?€ÂýøS%WNt5Þžü›Jý¨„´Kþà¢Q\¸A#£²(©Ù· ?ó$ àœÀ žïù?) ‚eܹðDE3Ãå'óhy‘=[âÂïÉ[åY_Ì ’lt]„xéÈÃ}ŽÌjBõz†¿Ú7ÌР¬›ã‹Ë}2ÕŽ,‹aL“êN.@÷tåòÅêa9Gf\"Já–Éå¤QÏ]ñ• ƒÊå/p…ÑIÞkÄeðkz×z_2nÎcbÝ¥æÜ2n¥/¾>:ÜòøxZ( £µ¤†õà¢«î½²Ì ¼&%9¹5ÅVîbäwµY¿î„ÕŸT Ò`msõÁÖk»»¶Š}.ÿÂ)Ùƒ ¨Ì(Ë#n©¼H’ pY÷ØÍ‚×JŠÜ™®ÕR$ü`Wô›ñµÒ,ƒCpžÞk(v”Ê"*¾¬ußêµ]¬·#~XMìÓ€«sMwLïÖ²nuH¢@¤mÇ< ŒïìX¯³3DLCxÏììŸ.F{c`褊2R½Ö Bm¼êψH6ÌD~öX´ñý¬}¾ØïR[à˜˜Vnc¢õ÷¼X×Ûª.q܈ÛpšõdÔ4‚wÏ|"dÛ …nã2¼UáOò´§Ï#ªNS;͈R´òTÕ%§;Ã"?K R]Å8îsOcp-´uªgövÜ{ 5½kV©³p×(ëJøW<|Øÿ|E_²(=³`³Æ<é@Dí&³]Á£62ÀÝÌ›W9~–Ý£¨,®l¥á(Ø »àÙ5[Nlü÷9g_0Z„?Èà×þñ`„úsÞk„QƶŲf¹› Œ÷R¤$'Ò LKB– ³²ý,uwXH F¦òKå¡UQ±Å•ÿ´zD7ŠýöY38Æ-„=(ãfiu|Ù°U*–%3Ñü^>–ÜõpfG÷qu©šjK¹Î ½å+ ›²Ç6x}D7-:Õ.Q\Ç×å‹À`V=Eg¡̳Ìèh“ùú;PêKx³ |" wÒ-Š>•Ðñ-˜àò8"|W>ÆÁ| {…ÚŸÁ»|ÝaÊå^ɼkÞmXóNO’€–ں̖¯h›7qš\W8]ÛnJð3äpÛ¹yaÚ ÝŽéÆ•o6P‹^¿Oò²<‘=Žè扌v¸VSç÷* V×ÖT•Lͮʀ¢Øe¿ó¼>“}$ËRö 3‚€2ç‘Ì­·^ ;Iq×b—%à×Ç gÁͬüª¥9³!Ëx²a1x}R±º17ö²àÖ4ØÊ)ß6PœÓQ Ö~NnÀÚrPœ4?¢_pí÷©—ÕÔÚ"Ó²ƒk|"neAã¥P×2à†jy­uqªðëc†Gm«óVyÈÙQãŠp ¦õðDð7%Kví¥kxÐò÷qÔ[¿˜V_Ÿk-6½Â,Ï#J¿D$MÐâ»Uþà×Ç 'cÎŒKKÛ¢zùß‚ïrŒXÁf·r X¯”c^¦VÆô„ÔäŠ-”Á Ò7êìb^”=©Qépuð›Ç`a ·tm’ΰU…gŒ›öç£(|>߃,´i-‘™ÁÙ?ýþȘmy¾]ñÇ=u`LÿÏé÷w­²öYY*»Eïv¸Òý áÇäxÁPÝÓ?oØrW¬U¡ÏÊXäAócÿ’P„ÜÌ>±xÌKl;(Fc±B1‰GYm†eÃöÍ›ùö#;Ö›î çÉiò‘ü&Cö† ª0ØM/ÑÛ—NøÈ[‚EêÄåÑä]ÛÂÂÊhÁ×ü#0Ùø^)5B}N›¢Énk?ë0Þ+ö-›#[• ã’M²,'YcKxÉÚÛÀã¤wÚBˆbhì@M¡èÓÅ~1Ì2œþ)ó“ÉêKÞ¦.#0Ôø0ìÀæc$9¼@÷Ç œðëœ_3ȵ±å:#:ãóݹsBÀ¡1 ñ DmS‹)”™g’»î,6.Uz¾¬;ãI ”Ìtéõè38;᤹¢{¦ÆÚ?âždúåuõ¼€¬³–‚jaÜ÷>º2kéÓ Á¬…æà¶RÀEû~œ2;) žýòboO2X±#3ÝÆfº¤ÞÍy„¯@=âºhËW†îÃ’0Š[J@Ë8äY9P›'ŽÅ‡ä¦gT7lGGæäùÉß#¯Ò¢F:hQs»? «Å‘°ð—õ1 ÞFfZ ÿ9#¾¸š×ªIÊX=Æšš$õ¸5c2mŸ EТíþÉ€k¤ÈðŽù¦J£dÆVûN»,GÏ'œ\Ü~q2þ¥Š³ 8> »,F:5Y–v­‹:¿­žW|-õ¿§"Kôæ €q]¶>Q‘eÀ¼µÜžê~¡~¨Í` yσòsð$™n’·C5?¡écwj193Ï H%héØ4ñÔŒcÛߘ²¸+š9˜dÕXñºWè³·Wð™~AÀ·Âx‰P%-ÅW™ÂršA¾‚MÁöÉíñ´OÖˆåòos!i*бąˆÛ ”ƒá€¼Ò³l •Õ Xù|=}‘^ȧ®x¸¼rãA¿ªÒ™íÖ^ÒÓÝ~Ë5a×”YžMÝ‹Žgž¹i·‹/B.‹"¡ëõâ‘¥óýºÀdîŽæ1˜1š%zc®tÞéj0ÿ]0³¸ë5.ôÖq¸éá=þ‚¯;I½éÝu0)5^šd˜çóÈÄîÁèë Ì«è—ïtÓFK~-õÝ68ùŽˆ¿ÕïX(ÍïhûZ„ÒØ,xxzq¯+_¤ìµù{„¬ØWâ‚=¶óêÉC“Z¬{NÍ· EeÔB:ÁÙÞ Ô‡ö#»‘Y2>%OÌ9F›BóÛÇp¬«œKE¬eŸ—YÅÜžxr+¨ŠÌÅ$!Å=d ]ól4q&Œ‡­ô(Ó‰TÄ^}ÔÃîÈdú¥ìGÚƒd¤°ˆ ËŠ¬Q Úapj,Œ”ØŒ¢YjA$FaµD”ÕÞ_Îé„PC‹A$­ð?­Áv’Ù¯žØÊ…jM»»€êj®¨-£(ŠYëÞ’ö¯FÀD½ôÕüx3ßKÀúÜ?û,°¾`\$Ã3l]Ÿ> w+3b/d- ôP{[îÑé30gáMõðÞ’3רÔÂz[u PdLû -¸Ï ·IdjXpÊß{-B¬£Û^¯œ…ãf8j˜ÝÊxÒ\HÎ…n0rØljcöïzy ºxRjíÆþ¬“{$¸Pòàü–—ÖÌbȵ¸n°Ï kpCב¤2µ¬+i‹+Ö}$9ºï s¨Ÿ|€ìáäçØKFYÁ†¾áܧ8¾íp ÉÄ/ú‰y"T2÷ò¤4nÙ'™RnäûÃQ.ȾJœók‰Èñ:Pï¡L)µ6,7ðuœý ÆÂý6 ÀÏ`@oàAƒåC‚<¥f¯ÿ.]i?3Øræ?ñÐÔ§t-¸îòÙ‚{ò’(3ÈÈǯ·yué:Žº@zÍÔ¾çéïk¶YqÄy"¶¶7¼ã/~XÆË…Á²æP‘®– |j $?SQSøØ“Ô5ªEhÔzÝsZԺݑN¹ëy&…Ó QH¼iî Û±"eySrÖï>X©“„(;0¼á Ië©;HCþ)¡wRbRÀuðmÏR¬#8âæŸ²‚/ïc¸$]Оù¥™S'mjê€ÛŽÖ!0zÁ6Ïê@pF,õ}Ötéþ’Þžz‰#I؈;XZÉ‹Jø—›îœÐ(È¿s'e¢²&«M²aÑþKºP&•‡r&EÏWqÿóCzZ†Y 2™[Í‘qÈÁ àœƒIük0¦’imü=öBÃNb¸Úóùü9,æRÀÆž¢´â<4Së ©›ƒ4Ì—ýTýZë@\åžJA¬‚p-çÈ`=[bèÑÛe 뉸iÎì¤îuФ¥ö°oÁzÀ¤Šq óÖJó|2·,ðÐ<ÊãÑC) s:,ÌÑJ‚ í3îÑ@_r™ä%ô5E¯(Œ8hÉ€(FRÇ„¿¦ÒÑŠ‘Ek MÏæwçß@+Ë7jûýÃjCÜŽ… ý(è%åN’„0l-?nr—~sÔw^ÖŒ^1g÷CVë|­$4Ák1òœ*Ëš†"kz1ÍîdªÄŽcÞ0¯G쪡5Ãá­øZ[1‡%SËæFJJ(.¶d}Z3úÂZF¥ö€˜(‰[Q€¾é»TFH[”¦v-ǹæªÙ‹ïheñ¯)v1@%ÛPÓ‹=½ƒ•5D\æ¨ZI{j#+0£gÑËj ÚÙ^ŸÍFõ“×”þð;HxB7{¬¢Ñyƒ[¬‚`@³Wê0¼A‚ÊUO Æb‚Ÿ0žcÿ›¶¸¹õ–²¯e¼µe·7m ðóc†‘}÷àô ^²¡¿ÂkMïËü^ ^¤‹ío†y—cz«Sjw¹zÁŸ/ Î]úD îüþu8}T¯uèÎŽpF¸Ã¨¥õx‰µ±IÛäPï°<¬@äëöGÉ+œp˜·×=“_J¤¨^’ {Pm½c|DkVï1n‰=^bOæ¬=88\žA®3GÇ6)²‡È‡geÚ´Ó”Å>b ÔЛKX‚-Ê™N0´Kž¨ëʪjsƒž ÛhxœÃu¯6°Jª7pϲY"àÂ]ÓM"oû±}5I&Q…ñqÏLî # ®Þ,Hn 9%~=ëëc†Që­KM°zp…•,zp’oÐι(+¬ ôàŒÐü’J)œþ‘Ô‚±·x€_GÔÉÙ)p¦?töM•:ªxo‹üæAi ‹µü‚ÐYõ¶ŠÔ¥{ĬtžQ¥:@Ö)Cþl¨Ps²d¶Qo#ÛΠ;Ùƒh›R7KTð]À·=ÀåOÁ¨S¿/± q†§¬a¼:Y°£'ÆO±=Ó dÕa€ï¿—¶‚»­ƒ -m½âÞ´³`€‚"€éð R@¸Rno›êSýÊðõ1ÃnÙ ðÈÛ€ #ÈÞ"ѹ eA€dwÞJ}X*¡à#ðÒÙX`e·º gÖ10c†k€F®ý¬`nã_,,eà‚ÂOH €;yôIIÖ@&Pš™%¸¿Ì„‘w3߀ÍgIæÍÒÕÑÀÖƒoÛò½šÔêß»(€ÌðOÖ¹òªÊìK¼J-Ê~nÒ2ÜIïÿ$)“´Ej|´¼¹2vÆ8X"poû$«QÏ'ÿ¹ƒ€L}ì¾MmAíÝ[Þ¡<¹"ïVÀeHÛ?&¹W´G[”Á~è÷V\)â$í!è WQÃH*@˜ y9h®0ë(HfF–m6ëhDy=¦PÅí9dæÛÆúçdÉsDrÁ“\#ò‹‹SkË”S‘»G$×'äÒŠ~¤£ü'pT J V´æ¤iáÒvO×­€[Øèøf3ÌR¤nþàW”ì&9?™GxEjÒƒ‚÷¬ k`½¬ƒìAÙ÷¥m=L^q ó+,m)µ“T ˜†f7T k WY_a`õÞ-wÆv{R­7Ó| ºÔ¯fî•ù@"@üY3WüÙÓI³§-{PmYZDzû-¸D¬Í×Ç _à1’‡50ª„&Ȍԫ'ù_ž…å› »óŠÇ+ÊxßH7oqÆ7pË”¼g#»Ò]QJÏFgÌ}G¸Qp‡•bJxE@•’g3"œ<ÚvMª™@TŒÂóMª€Õƒ-³ üm[y¯i ¾ÞQÚ(R l=@ •¾nÎ ý¶9ßøm§¥h%ÎN®Dl<‚Õ.½D€9wtnôKÆ[uÀHÐY\‡‡W)Zó¬ÚƒËÁ®"ȪýdÄ‹ÚE"«×%™«è5BsâûÃÂÓþ,ƒÊ"/þsÛËV\˜ºd^¸Ö:9ǶŸsw0}„ _0ö5(,¾Ã~ìN¸#÷ó;•+T5|i³7z`"ßl·g€âl]qY³¸Ë‚©O#hÅj¶… Ü•lô6.ìJ€Î¶(Þɨ™Œ¼“QÑØ5ø\ &ü ŸCõ »_{è+ÛŠ+t°À;X—m¤T˜sæÏ‘m“!< ¯¥ÀGYÅða}-ý×d]¤åo3êÖm8@p3XÀC¸üÍÊùRõ…à^±O?ý ª×åz&P¥:[ÒçG‡oÖêú,©²Ž;Œ5ßAì]jî¦Öv»¶§mÇ >ˆð5ìÙ†óϵ%F%@®÷/üüûÖVü³m±ùÔŠðõç0XæÁ¥gÜœªÏr]o#ˆ–”[0B, ãDiú(Ñ4: µ¦ƒP€ôÍDYÒ‡¥b¥Ýø×ÔÛÑ_϶“†¢´n•Š<—ùag$V÷ï×ýb#‚ >§)꣟áÃþ«OzŠ˜å­ª®ÿf<ˆÎ¯¸üüÑg"Ð{›Û[&³ÿõ¤ ’Ô.½ÖáþÌ“W4 áoÛÞáµîsà×ôZ[~WNwÞ(œWÊ.wÝÞÿúhK¼næõµÄ¸Pª;¶·uE/Ïvoc…¼Ú[o÷‡L­i0øÚÎuzØž±y(ØzPrW:JklÕêÒÀ›±ý oÁê¤KicÀü|@Ñf4ž@#“ŒÖFöyË¢•Ÿ¦%UÍ\9ài>›AÚ„Iîëc†Ïe›†k'SM®né“á*KŸ€"@ÁAr<Zél}Z€ÿþ»¶“Üo{ðõw½åÃÈ9§–ÑÖ–¦ÕÖ–c¨+Ju6à&²0¾¨Ø…Û'¸÷mú,e”–ŸÃ|ý5umÿ˜:…ÖLë³µ¶¤Ásï¦ñ&‚÷& Œó­#HBº€Ÿ_cžr­J l=ø¦­dJ­•€–üqŒ«3C–­¼W#øF¾>fÌýºÛw‚ŸoèJW4²§_Qø­+“ê“’íèb‘8}Ôd1nHM@×?Ju-P^9Ù›$‹úiÔY(ÓãŽb}ËÛ(RQ„²ëm ÷n}®KÐïN»¯W¢[îþŬXtö€žÑ©â0ý ¬Gº%TÇòaùÅ~¥ùq¬ŽÆØž©å4®¯À–ù Ë ö Ÿ]× ¯ó”=>=¯Á ovñäÍ :­ [„6¹Ò+[”Œ p ÜÞŸNÇ}Fødô`„ß¼¦'Á~3™Úr`XÖWG[ýî ~ÓÖÌÍÖpÒCz[Θt¥ÚpMÎÙÎÊí_ûéJ“‰a÷ÍB(#¯¹K·–Ø¢ÀÈW¡h†9©HyŸ\­V ç|ß‹ Ï" à×´„Z[‚{Ôù˜A¯˜ £OöÌ-ôÑé4 Ü¥V4ˆ|¿Ìó%s[†´È£4¨GV1A"AX3XAEòfÁ$ŸQÀ#‹Öi\TiCµYÉШ{#`Í­œ#9¯ƒ^@î¯iÒ]e4©9#j`®¨¹4ž”ÛNDv¬ž|m9cýí"¥Œî.wÐP÷½åÊÃIXoV¡Ôy€¶3¸1Ó¢Ãù°Á8?Ÿ]IDßÇë[ð*sÔ?´Eoû¬8Oº‹|{ýÛ ÈyÐ^¡æ—¼ní|Ò­Û *œ^Ó¾ìÁ]Ì•*À¬¹ãímŸ:9 güûü˜'( ûÔ8Ê’ÁÓ¨½ Ó”«¶"µZú„û|pÌf“I*—@¾\ ÒVÁ”šÚiŸ ‹‚2 tÑ9˜Çÿ ¿µ%ؤØzPŽ`·ì{^ûè^ +œ¡¥ ¶MÀ½pÙ} Ö~´3Àµõ M¤VyÓ`碀õÈblk¹¶û! Я ú ®7+Gõ¶f· Ä£>?ºÜÚRÿôúëM·ßö0='{:AÞåÎ#à4²_÷øÅÚW(°}…gÇÔ[Ÿ”ˆ×¥h½‚±&@ó±ZÌöýë¿þׇ/3ËÅqõÐíõµOÃŽýõ×xý1^êÁz#vÛzt‘1Ô3Œ<€ƒt” Øupßðýö´[-0s8<*6ê ;!æyÒ¿€ûò‚V°Ë©ZXÊÞ Qç¹` .±¡töN— æ_˹9(€ôÝùa<ˆLôGeY+üÓÀV.øœ–K°Ç•í޹ུ Àˆí¸fKîäeOAÎb šAÊàAðZêñ@ã eOQ¥Éva”Ó±ðÓ`±ç~ÍñÉѪãjmÉSÐBr®ˆçÀ“,5ž›˜ŸnK W‹H¹“jlË0r/)§\‡Qñ¹~ÒÉ)·–2äì‘ôÅèÑd[NzÁ3,£”pÖ6Bm„μ¤rÌõˆH›Øn””®ÃŒå»XáÎ@”Ò¶PÖH\70™BÍù[®QƒØÌF Å'3(¯p3zä:’ëÔJ‚^ÿ[¬PóW¨z:6Õƒªfc‘E1?õéÆ s GTŒñCÙO¾Âˆÿމt’ÈÁh/ŸŒ–Å®íD#Kz™ŒQs-«»ÆvhU‘¶‹ñŒwò/‘ƒÖÀâÊTË©m `=óp#FñH"»;ª›QÀ@‘˜;I’­F$˜±,;qsa`¼øM®ª„ûìÉ¥vgQ Y s‚!`*4²“yœÕZ©cÁjN2“ó×àð²Ý"p§¨‰bQÊJå¡ ¾êªØ³"íË0ð•YÌÉs¡ ™Ÿ6ñó…úú½FôY´=Pˆ¬h–D¨R:ÉóÁu7 øVjÑZ=¬…ë0ª<ÌÚöRrã`N0ò ¾°cU‹ÎBa"ÈA_¡@¥µ²ºP^Œ+jGtöNb[Ažm!Ý^:ÝAj¸:ÕÌ)61£(“ ]¹¶ÀLb®O¬Ã¸R:ßöˆáà@ýÇš„d•Š…Œì‚1µ£D‘:Ýûñz ¿/¾ÛUžæÜH˜ÚQÊÆê®¬[KF,FÐAöàõßË# 1ay]v«ª'J·Œúb¿ÞzøGƤkZë±ÁdtmDD&ÁÏ¿iû øö¨¹\)”ºì±ã™@üžÓõè„Ëâ £žÜKÀs­Óaß;0’Áidå[ ³ÚŸ{zƒšÉhə̶à¼j§«{â°_) 8¤ê\*i›ÌLÒÕ˯ŸÓ\¸ŒvlËQ-lÝj€©(ïet‰õò}ñ×Yõ^ÆÈ/}ƒ@j¹vn#àº70jž,îc¿w.±xÖ>2âŸP_¾PðRõ5x‡³¿€±æap²hï]Õ LÀV\el-¥&*˜YüõuWZжÆûRÁíj^Ë2rX]'j5sk²Zy]ð×ç·ˆN”C¶˜¸ŒÊv6SΟJ»`±MS”¢YQVÌ‘Á„m6ÏÀ'ÜxˆÑÜ2‘,ÈîY:9^áaY1Ââ*`g ÿ‚Ð71ÇÖõ¤Š7ËeÎB°·ƒ …(y@,Þ1q´ ìWÄ=y´N_4éªBÀÁÏhÑ”°Ydul¦Q_aüY’ƒÔv”eÛ+^:j³ÙgBÖ’¥èLGeVæŸNÒUÑHËÉ­„Ê΂åbÑxLýV©Ü%t6ú°bä F¯ÝU‚±=îäñ°3î¸û!8Ÿ†·\ (î6‹ºßYE\@δq&r‚{Ìo™]µ@´¶,&™ö#‹ª-Öm˜E,h¿ÏZÎã>ßÚb7—*àjq¿æ=HABÑÓçÊ\€-‚$fs§MÈÓ ÊZó»È%ùÇž·Wn) àÃ;Ë«WNØé#°mèÉ—‘¯xƒ©¨³âµ/NZ>ÙÌð•ÆŽ•,š ¥.…¢Mg,ZrÆìj3f$\âÕ©˜œHPËî¹G ƒ†NÅ#©8…QÏåä@|ü{¬ût¨í¬È£òócn‹z¡ž[âyÓžNvIPªÅE2M1u» {Té&ࢢñÓWkÁ°ˆîÇÁMn#Hàçt¬-J0[‰*vfRiíÜfçNƒÑÏ:Èae÷o$©¯IVx*˜©åÆQ ¬[ ¦’ÝÕ׎¿3Iàæç™Wm\-}ö:ËÚÀó𠦎¬àX.1W¤\éî Úƒ¼”w%[áT,ê¬Güü˜ÇVp`DG®AlçúÉBU¦XÔ€{ÂC€ÏΫn*Ôhú,øª‡áªÓA”Žol¹"@t€¼þ*XôÃéªü•[*Õ­N)_Ü`VSoà’Æ_Ê ,MøÐ!ÎRãj]e@/P‰fmÛ˜îòXqíXwi®äFZ[Aî’ºm´“NAßÑS7é&éèÜå·\óY½'Õáä˜Ü F ›æA§ ^à ž±ÑŲFˆ/Ê™ÇYÜÉëHí,rƒ…ÙQÛãòŽrÆ”"waËÈá“*')ÕãÎSq%`hrë@[Py:¸x‡×‰ç2ð+Ãà óéÆ:(1 {pf’Iù«ô@ÁûXgÐ.×ý¦]™;ð8ø°sÁÀ¤ÎûìA÷é 3£ê‡ÉX©únªÊ¸k ¤v¥,~ÿaFÇ YOõ ¹@µ¯§d³IÇpõn¤´+rgý΂ªõ»£¼òªß¹Ò7Ô¾Yk$(£ âJúw¢=<æ@pQjƒåCð…1ô‹DÁ^¹ŒŠ¾žíó,G~„‚ÁÓÚæmçGyK ¨‡¥€z­F„Ð$€A+: ¤míÍ”ä­pƒ1©¶ŽŒúi‘B9çCÊbÜB“jñ1ëµ Yt¦Ö¯Õl±4'Éæ’RÁä¾õ `PÖëÃ^;˵ßS·î¨†Ì1 ËÖ 06×?&ëÈÈbGc †/ă§ðÉï°Äá{ádvF™X" .[V™8¡,AadnöyÔkç¯Ãm¹: ®$–vá®/kè¼,œ†±õ¾~Mòؘ²Á¹¾ÖVGì ¼x.æóŸ"ÌÍÄå–YØãÖ%Ãë¾K»QÁϳÌÌQ¸ä£ÌU)Û;¶çangl;ƒÇ-FìôëF缬eû Ò¨Ek ¬rb_q¦v™‹cÍ&Ázƒ¤“ÄVg¹~Ãä,Z‚BÎ&/'̞ܛG&¨Õ<&È•4‚ßψ]G(hŸ¹2vô`Ü5%`EèiÚ`-èó>™¬/n¾g°|ŽLîBC€ój¬Ó³FÜo"±døúÿs«ª¯®€°¡‚Œú%ó])Àk©õ!PpÝ÷<"ª‚"Š+áX7øÌཛྷכ«½óàÛ €›QlÐÓ{ö‹;2¶(‚œGœ{´¶3Á6€ãœŽªÕ<üÉÙ[°ÆÉ,{/IdqªåÆÉ‰ü…78jΟâRä,¶nõÙ s|„£ÊõøW,[®«D@vÜe?¶i`°¾0^7•ù# ʺ-#´jšGW˜[&;Âêª-ˆ‹™,*+³ókZ 2i¯ã9dîõ`Û«/ð\0½¯‘„Ô8'Œ™©ß†Ž2¢²³Ç·o$i>È[|G‹ˆYgMy‡aïü5=e¾4£GÀOüúu|FÅA„'äÄÂà¯mœIj–yððÃg¦7ƒÖ¶+IqÂg»Ž÷¿Á™TZ`m0 ¼ž!¹*¹êQoÖÀ庛T ®¢Ôž°ôÑóš¶³ù%'ùƒv³ùí:]sfîú ÀÓÞ BHÇØI”½¨Û”n,ƒs¹ß¥®,êi±Ëzõe³ô€kôÈËb!~BÈ;e3ÛŒŠ4¦L“Jص(àÜãDØ£¦"¤Ž8¾PNR· §ŸŸ¿Ùƒóff%Oá½Ùv¿Î·øò¦ö¶Žp›ˆ÷†äÐÑ«Û ×KßN-!nYOgÚB‡›{{ÉÚ®Ñõ•ÍkEß³j²™qMjŒ¥ÃÝë1 ØQÛϳ€¯ÔáoÛ ŽnR[ª·ÔÄdÝ­i—‘E¦ãrmh›é–K&À4ß r*gÞ±»­°nŽJßë\¦µ]”–ýAJ}fÛ58ó\²‘,|S½sG7gØÝ{ nÉQ”ÚU|œÔ¹#/‡¼sC.ô»–ßagþöµYßó“·ý¹fl¹NÁx½ÔA‰íÈ“ç*¶0ôºNW 3Æ'çÙ.½>²|Æ•aþV`¸S ”³Ž,îzü`˜b“ª-Qî…¶Km÷--?û ð½€@·‰å p&=(:ìÂAÛ@~µöÉ›ÉõÞ&í1™¿j§nöÆÍÓChnjʉ®GRª€vÃ’?7š-²¼ŒÎå2jÕ¶sü@Í`£‘…6’:r“–Z6²“Ñt›TQÞ×û[òYU¤H'È¢&R™”jSž¥3?$¨/CUmë]@ù –©±IÕV­`nê? øöa´µÉ+¨¹Ñ^÷xÞÇ0­éIÿR+ܾ֯÷u¥’ÃÍlu¬$„”ˆ‹Æ×4Êö/mË!.-Õ§/7B:¶‚[¿6<ÌŸ3Lotéüh »)§¥xOd•‹zƒküîî—‹€ØÑÀ ì°ÑŠäV£`φ)ú ‡0ÏÕ¼Uµ „ºÞkü‚tà4°â2j—gÕ7= Ê¡/GŽD4ôۦ߂ ç[}.90ëÃÊf¨,Ù e´k3¬x™œYÂÒõi HíãQ­(b‡ÓºÅˆf0 Æ?¬o ¯û¸F/è¸ô†•% Í‹®û†çŠ0‡ýȬiT²¥»±Ê§€Ê9yÐý6aúúè[©¹7;Y‚}!k¤b'Ù¿Ëe»×‘#È7¨è ù.£2eyYì"7K†*X!œ¹™6Oríp*“qQ™k\Ò’^GÃÙŠfsÛ¢À‘FÿÜJZÝUØC~üd›y âÅȹ›”h5ܸëQ;V6¦Ü"%vO¿­¸óõu·âí¨ñÊèÁZ]€Á;#I{a_’¨’â8wÑP{œDvjÛ ¶¬=®U”9©µ¥®žºqµÐg¿= êh!ÃnÜh+‚Ô”º”µÐÿâË`´M•·Y¦ÀÔîÞSZô·Ìz‹'R~„ JWPJ0{oǹûÕªÃN÷H¦@›òÁv€ñÿÇZÆÈ6õü|¾/ëMNÕðbƒ \óYdd©¨~YµÕÕZõ™ü sP h;ŠŠïVk7¯¤+µ¬„‘;I•FZ)ÛŒ÷€wøòíూ79uä"4?àö Y‚ì¥ $?±P‡„¼+¯2:&9%}C=Ê]P?ÏŒ”Þ2³WÊ/)DeþöÒö, ÆhŠLª ¯Ñ•é/GZt—›¼ô–Á3gF>æ£Âñ•¤Òƒô[ISù­ZO‡‘kÓÁ¦Ç&õIGÆiJ¶O…n4Œ÷ÍGq 84Ò_JfR3‘ËÃ$±ˆNÍ@ØÞkÏ7Ĥ1‚ «ÐT™ÄVkrY0´Ç+|Ò%{vHÝÅßÌdûúhÑá÷²z[3r^LA©?Ùä…0Å.^Éø|Ø/¦d†^Œà¬`“.e¡“»Œœ" gÛ0#rOãÖ²ÙÌ,€¹]/ðØ‹'áu§‚Ü Ï†¹2^œDN´°<ò²Pð`Ñ<‘(!©} 2€µR"%ÔUG63cz´­@\­ö`®èj2ZW_áÒ†.à$ÿC0!8¼êÉt•{cV§¾äR ·•Á7Ãö m¸3 7@~ ÈñAn®%§s€)ÓGêe}×Ræžðè¼,ÅcuGÞúš!Ïu$™€õ*‹ªw\k¤ìáD?|Ò'uSóÑ;¿cþ?Ë¿þ×G‹Ïe>òŸ€¹Ð¤ž½Þž9ÌÄß#â;|$3\ƃfÏ 9ÑËä̃\wR|xtl¥7ð•´êu:^…‰šÔÑöf(/“^[êòŽð$‡GV$Úƒ#ÆÁ=Kô<÷Að®œÁ‰|[–*68rà¼^Øo§äé ›v·>Ñ”9Â’þ]åaÖÌ/ü> az[Öh{uöÜ!Àí =½Rù ¸|IéâŸ+“Ò ›æ€MdX‚9I‹kÃS±°;“—®‡±þ½Æ¹þ#Ësl ÉØ… Üóͦ|~ü¿ÿõ¿q/ËõóÿÄ9Ï´Î#9îÌAqðDcI–â‚Ò|kƒ9Ä8{~ÄFA#rx)X;YôMKv’Úà( ¬}7ct×Ë0Š&€Ñ}×ËøÝ!3´ ¥þŸ.·µ O¯ã\ßÁLÝÿA@é‘ò ùÃ~ýüº"àgÇ)a­· ÅHðß3,½eÇXݪ3MÖ¾.¥þðÉÛôرáÕ©*SIz  ¼nr˜i[dêxUW?UKÅ–ø)ÏjÆOçz)Ã" sÌT³`&SÓï$ó«tÁŠ€“­áÐÖ¥þŸoû0÷6Áz/,ýùu¼Û®ôp§iÇ7[•mcÿW¥àkycœåNü ØíŸ ø®u?ö"‘,p‹ÃþÆ–ˆbK‚º¨8H°î»é8ݹåEК ™¸Ñëåý³Sñ•À³€oA¿|ÁÚRc‘ºà€‡Ýabü¥Wíè9[Ýhp*‡i.bÛ_z[È!å„QÛàýIs¥V¾i)‡ã‰¨ÈÉÜó‚½Hé/5w\KÓ&îüt÷Yñ(„_Úå¹ÞÿšÁ |ìeXyû-YXaÏmIeÖZ:8oŠk]'‹ÍµA%R̈´¶u#œÚÏÉvkìZ¬Å“ök¶œìפÇú¥nb–ê -ÑÙø{Ñàþ8À3xŸ÷ ·T‡Éi'k ;pîØŠûǽÔ5À»¸¥¦ n4RëäÆp¾§co4 vêNít,uyÙï7_àçÔƒäqRÛÓòßQÐW66MÝZ‚À°ìÁÀ&{²´dì¬a¤¹Ë IŸç\S³!¼òj!ûf#¼²QKUäª0C Û¨j+z|‹n•<ª„çó߯!]*Øž¾>fØUþ?&¤Ý€©Ù䥿ž±?¢ßÉ(”‚˜4Tª‹Z+h‰æ ¸m9¶M@UÉúUîÐ>]jj,éxMôzÂñGŸo„Ûñóxf5§:“^ðŠZHÛÝÀôkœælo[à2‘&šLp]q9† æôî¯_F_7/ß‚Z®šjz£BÓO¿Ç|!È@ãѶ ÿÌjŸz#‰~ýþheÂ|qj÷·ª¾Ê'¨aÍWÕï²,gÍ ÌÍ뮜šÔŠfO¶GîÚ“g€{ü Ž;yǡ¤¨F½í· »pò.\#®ëý¨n‡ÔtôñD¬øÜ2š'G;ªyʳ"KÒLÕ@þçM±Èøújk:Ïäj&8ŸžàœìcpTz "ZΛ¼n­ûrÑêxÉü²d¶óœ–miµËvµìZÛEjÎy9OûA*ÌA®ÚI@Áò°³[µ˜Û+ärìm¿a¶œàëm Ìn)(¯Ö}Ý@˜ fìm)²Í¶yÀÞ¦}M™Êyv›OP›OéÈr,•’-' ‹‘5Zv(ï}Ÿ·n_ ¡úsëÀMéÕt9°#çµÌ{—É­z¹WcZŸqyÖ£Zrh—‘²«ûÅ…¿/øZ÷ùâÒ@>à¬×-IÀ´‡wл5ï§Ò¶Fº®N¥­Ä@MèËB®·á“ø¡ÿ3f¥ /”íMä¤à÷—¶µéÕíU6½V ¦%.µ¿?æÖ¤P™Ý@®½—Ùû€E4,Ðëd z`~”‘+6{@¸õ@oûÚR.ö*×áöÅ´Pl–œG]5-”!§ ÈcBÛ*˜=PÐßëó" u‹# “ ‘½½#©m:¤…©U{P8«=”Õ§Yˆ8ˆ#\ó ŽªxQŸQÊEØzPox½[ÿî‡uoû-È/ÁÏ7¤l`¹ôØ8~1)ÚV¿Øþ¤36A|ÆI]`Ûß] P;YÙ%ezäÜWC¬:í8Vù¨É#¢K/íëÄÍ–µ/\xaJ¿–`P£¯­ _‚Y¸ƒ ùß´U©Û¶]ß±‚sWRðÛ7óAœ¼M½-®ò}Àke£xò¦²¨´¾î­á›5Ú ãTº*|S'¨ƒóVõí¼ýaåøÒûz[9¹Q¼-ÓÿL[{[þÐ6 aáŸnèjã®­ªµ+y]™yWŠÊ2ým£LC_v9ÝnÙ­>ÜòV%à .ÿI£&ÜW£ wÍìH“ÃN¿—‚ùÁ ¼5•µæ¬È%ªS.×ç]`¬Ø#{Gúsu-®A°Rkñ †5„´±D’d/i¶prµLºOÁ¢Ž(H©ÉŽÐ«1Uð™(Oå„£žôKp-.¤¼R¢¾UPè¤B)œ¤¦Ym¢?U%ÍøyòO–ö^ô²¡æÿòž'ëgÔ…¢‚xäòÑ~îà¿n›¼»D¼ÁxXFÉõÇÒn"Cl E;ÈûSx3ø…·þ߀ß$Æ€bî ¤hä \Ô÷Û‡€p'ôàù¦’«eé¹h ß7?ß|Ó¶õ Àº^ˈÕMºõV¤²e{…šºIËÈxò<"Î…®O@Dš•ëX³-b×ÄZ&Ô²VœVXIô?|ÀèAFÚ‰ÑÖâQ-£ŒƒEé¨nކÂnÝ0s^ü…– ùL—†„@~¥ÕÛRož{² WSqçHK8‰ØQPZê ü  Z–C) ëÔ#Uì™úkLaWäP#.ó²2^V‰ÈŸÀ‘é— ÎJS51dÂØVLM Yr51šÔifS7ˆ¶º8áËô¾kp¾rn—aRÞK–\ÍÁö õäaõˆxSîá œû–‚nFýëcîM®òÈO®fÔ熪 oÔ½ MrìÖk ¿˜ZÊÚîMw´l};+ u0+K鱂ó. à.TKYRâ°äQU'Xž uÒ}s¨Ê³¿9~ëìÔSº°´§·|™“*>]Õ‰Œ§¡š¿Ïèª)¿ßÔÑsb/ –Ô%…iÌ ,íIø»U@²gÿ i}Ûƒ,„ØöÔ ¸j·ÄóBØ@Q©N=.®fÐJmSƒGÈÖ—–+ª«ç-QÁ¼%*(·ÄT˜U;O÷´sªîd»4h‘ͼ¶Ôåñ~µKƒEäß×Û­C‚› ܪ:lÝ~7-/K¢·& ºei ¨â¡Zµ/iʤj_Ý/Xe3@TZe½ùÕö›g!¾«? C0_{ö¬z.à–eÿä]Iø~·6X°u’V±-ê4þj/€üŠì­¨Þn,¢¦scpoNÄûf8[~„Œ~è 'bmëcðûcnCCº ä²È%†kšÄà (•"s1ò3RRŒX+r9=j?áô˜6: ¾k Wˆ€1çßGœ^”bØx€}~Ì-y?ìÇÖ;=—Ô2`ÔÖ/"ó”h×–¬‡™;têCUÓö}@ûïkaIK€ó·km äì‘¿KùîÖÖg{ÛÌ þç£`Íöº£k2H•3£Um}eô7«E(Ÿz cüÜÛ5’Kú›­Á[úï~v cݧ5´˜Enï ¶Õ ®{ZöêÑiq,©V7«ÝÖ*&t?´Å½Kâ…¥%¬ŽÓÝ@œ_uGëwËR.¯ SPXš&7‹Oü#èVýÉÔ!z  xù ä&Õ”éºÍ‰.\·9Qçë>©†S¹{–áT4©eú]@*ÞuÑHs Íò°Ì-3¯ä¼¶èæJ›U#kšfôJSà¢Kªu)éR~Y\ÁòïH©èRÒ먤ÿÕ{[TÞ¬ü;R“I§‡:(»º¶Mg¸Tìâ+„€Ìç­×•tàúbR‘N óR³¤nEZhx© ³ŠY\ê]]’Xµ’·LÑ«šÄ°â÷,?œðÞ+Ü%¡YÎ1¬qÉEÞ?B:7ô#¤'¥WÒÆæõMym~E~ñrUÕÝjk´²æ\ùÓd&7©,®>²Ó&“¶|@açÔã¦zPú¤–xw•¿‡M²Xçó+c¥=èHu.÷ö$l1ýçfnLCùô4ˆ6¬÷r2²ê¡DÖÝQ@(ŸsÛ<ìsÛ¤€É:§zgµ 5·ãv«.«ŸÜÀE*Àÿ]ÛInõö(DåÉÃC{[gZÓÓK9im LíªÀöº%·nÛeŒTÝ»ºµƒÀd–ÛvÀkµôZãü Ð1ÿ˜NvÑéK øôMœr©rXQ¥‡ê|6/5•Ì„šMýªÚR%/]ŒŠþ_ÝJJ¡cÂöyÚzO¦S(ï_Óï¯ÿ®¾BmŒ´/ì0îÿÉëÕšBdÓ¼Üà8ÇTIT{ŸƒÊןg‘Ü>j¼¶Ïc›¬òœTà Î[ËV®$µ¬AB5o2" 6C¹§Ô^¨¦¤ A7´òQm!TÇZÛóR¤ ¯Žy d)Ö+4}ݵ̬¶ÍG{+=˜^–ÇOyXh²ûÖé+Eá9©3EU«<'U)HU6Ò+ÚŽj ¥‰>¯šQjÞª5%VÕ4-µµ*bVʦfl®TìVß|‡ï‘»øû¢ŠA ÿJylºÄ+KÉk Eè0" :(= ˆG}~|Û±?¦7˨íXúîºÜt|õ7“¶¨úÝ¥ò#L+øÛ¶ß‚ 1Üôœ©âÜ@Îq§©–/˹¬Þ°¬! GÕ´Â*È[.u£R@\ÔfOgÅs·¶ß‚r,?6Úþþ˜ûÀÐm¹–-5á_‹¡7¹oˆ§N±ªÌR—Ò6~Øaèû“ëz eÓáÚøýѶ@H–VÝæÚ2¬/-«H??bl¤Î0çÄ|q“©¢ ÌµÝ!Lܵd¹|;YßÖûrùF@zªµ¥8æUnºÅuq§_]· ñ«ëîаmú¿û>"c%õ²P£JÍ¢ŽìÁ' $áY@¾‚¶ô€ƒèA’ÌT½T•:µjÀ¶rÿW0oÐ Žt –bwšmvëwåÓ>翚µå4:ÕëÉ_ÃÞr^Y ©ì"§9Ñ®Ù`.´ „¬ËþHšÝ2Áða]*l´@tÃB·•ˆÐ²t ôÇ!¤ù<ƒ~uYuP¬*¿à„óï Ê-—â9’¿¸œð Ÿ$bÃT@ú/OãNÍ(2¸? R@Áù éò>‡’¯Â­ÚÇ =ü* CôÊ 1ðm÷¶î¨æÔÀà RÍžeémz×;ï:Aú¶éònméo=(pÝ%ž†j Äc^Ä=Wøü˜Ûzþø˜['tIo+Їk):–1P§4gP6¶& Öhpel"¨†è£XõŸsÇIˆK«(i»H<9 VļW‘O²9UìÁOˆ²¹»MÌ‚ôÑWD.Ì ¼ªàQæÍ0Ââ÷ì­› ÑHž:‚ñÂE'm+/ìuß™mß‘ç}Á”…tµzK ˆ"_’ïf`ø•ü!£ÀoK˜ëpš²Œhû†A1m|[\†ïɯ°“½,Qe‹‹‘ÙaOåÇü„} ÄËê^J£Û÷`‹2R8 i7¬ø‘—M#%lqÍ.ÀÛþžŒé©”¨¦ruª%CB†Õæ¾e5/¤Š(ÑGÔF'›Ã >Îu Jª¥š=(8îé ‘ÐÞÂpŸ˜¼&rãþþçpDé ¡òt¸g:ßAº»áƒE5ƒA™\šÉ¢ì ­-í0bÇ(W·ÉaÏûß/uwìj"5O(ܲ~´¼®ô  9"µ¬Fí¾®mó¾ž1A¤ÝGoËbqZe–cŠôQ›En4«IYs^›Í¦$¤ 19â$þ‚݇A*GW—GÀ2æ’ýùÑÍ9¦+#,sñ;ˆ´}vëó£·mF"D}÷ A‘=x7=¥€z]ÙzY€´}}Û–Æ/|&tÒÐ&6žú8b5)›^›µõÉe~ýÖœqûÔüJ³`™[Ê,™KDAšGšµRÖM­†¶ô¹H%Úª–3Œ \xܧÚÞËØÏŒ÷ÒÐQÉ€è02 \YÞ®ƒ\Ö Ñ~ªtCxÞï”p#=–Ä>^¦øÌÐÑ£NÒ³º7€þ:™óz¯Ž‹iSžÑOJ7hž*’= Dñ©•¯’N)tB×.ý¢§'[Átš—~×ìVgÀY™Îø…JÔ¹\ bªñ‹–Ž)þñ-†höÌ*ŒuÏkyQjE©º¿iûÇGW~3£^ÛŠž­ ;—¿&íVà:Í-¼vaa½V) ;@ý¼a¸©›®uóº†ût«’[‚Þ)åBðC[^‹åcé­V^¿®eMª_öþúhk¯…ûSñ6èµ:©¶ArbëXm¬Lnƒê›]ñ\s¬q3,úk°®×ÖAù*‰­r“üZ/Æ" îÕèïàƒ•[ïÛ ,©IëýcÛoÁéQ¼ÆÃ ÐÛî(D–Äâ½¥×™íYs¥,jˆè J‰¹ˆwÙ¬ ¢R¥‚G‡¡q¨€*'jEæê“g98H%õ±3ËMgZÖC—]V<Ñé-r-i¹àËëÖõ¾Ê»ô–YùF–XUr‘Ũrçì=Èõ¬=PÒ-> àdŒè¯Ë¶R¾¯Æ@Š ª©+¨ ßRÿóÖ6¿Ø?‚Þƒ÷Þf Á¾X}[oÉ9Ãé‘•,µm–kÔAD¹Æù“gmHÝþPK³K5…û¸óØÛ¨[Ú?.ë{Êüž3cU3ÊVð‰ó>C¹XK¶i!Üq'ã¶­Âfw]Ãõ­¼–è¼Wg«):ÛßT Ôê¸î~sûN€Ã̺¹:],#Ë¥ÕLnm ¼®{Òmì0»Îc>. ·Eóèd‚_½þŽ÷9=,ëËÔ°—Ù‘ú Ô˜*t,_‘mgÐ+Q@Áò°’ú ˆ¾RE”žu‘úxN®Çj"AÉ`¸Ç¬rKÅÈÁ.gqÒר¦¶YÈ[ ÒÖ†ðjÖuU5\AÔ"§€‚%–©@Ô"×µp~…&€Ýº˜Û¥Þu%Èëá¸}X=÷q½…cýÔö[°õ—ªÝ.×¢Â`ifÃ}9óZ3$‹ÊÏRQ=^l£Z~¾?ì®@X1;ˆÜóT>°„n™r;¦d…²¯OPö”í[–Ñ’ú(ð‰»i\C‡Y šÉ «we‡u˜9o} fá:ºÔ0Pd¦r¸ã¨l˸ÞÏ+ü}Dyg[µ·fËw,ÚF<“5‹†a9ò{&ŒÒ‘p`*Ï}¢°3øÜ.Æ™…u³4÷½Â×µ.“ài:1Ø‹ªÑ3Ûªá$[¾ ÷`V\¤dx›Ã»ƒæ•]Ê CƒÏuŒ·¶¨šÜ[ÞÇ]”…KÛ›À0u%Øí)·ƒ+™–ÍÀ=KCeü™Á,G’68Ç5†µnxu»ëN#Ûþ0Ì£ Î=hm \Q¥~=¥€’;˜1¡=8—óy{ÐM©Ãj‰"à‘pcµ»8Êú1Ôm¬¯“õ¾8ë—°Z]‡R®|¯Ï{Û5ŸÚ£Þ{ǤmÄàýÞ¼Êþ(€ êUÏà¾^U¡9lÄ6^÷–,ªÁŸaKFJÚ6§yHëjÂ}Êì®Ý ­º5 v÷_ßzÌþ”Žîrp+róåFiù,ðœ2w¸YyaHyXs÷æön´„û™ðx_Wþ>„‰Î˜ü¼ÀÓ’Ž¾Þžïz~¸_w§AÈ–ý4x9.¶´_ªùV%ôáÕ–=ÀùN±½äžÓ5XÕüº¾˜Ý~¯ÛyÁ×ÓM^/%y[ë—’²Z²ù>ÛŸêj(¶²¸„Ò¨E˜m—Œ$b¼ ˜‘~il/ìaÓÊ@ œ!^ñÓAĤ€oÛ~+uêÁ×G‡_w¥qÞÿú¾ÒÙƒÇ,šÍ–!ãRF‹ºcCsîí×ÛþðÌͯP&ù ?€n:¢qÑPڶ̘ø‡(±2b¶TìÒA—aSª‚eÓjri’K,lZ}´¤²xo+fÌol›j‡-»žÌoéAlÛpK´mZWkd¿£ï, L“2•Åè[“-cGVbuÆ6Ò"ß[fYú¾Æ²š¤‚Y¾S»÷üœƒk»w¶6UæñÜoý—'e&}¿4¬‘`Ð8ÐoÚŠï¡ZüD^zÚä)P<%5¬Íȯp~C »¥öéç„ù¤T5/KÊÄ^Ÿ:‹jdÿêÞuç’å¸{‚~‡þc@’ÝTÞ/6üCúd4nc Ë:VÃ0r‹ÖÈ8Mò øö®ˆX+"kïý‘òi‡Ô9±ëËʪÊKäŠ+Þm€ˆïñ¾Ž8…“Vïpš½·AÛ=º­ÂøöáñZŸIN›½w‹·:Aë›ÙޏÙ͸#Çr/üXû¢Çz·Â•ìAjZׂKý½cSˆ‡…‘ïàåµaômél@/1ò?m¦il[¬ýÇG³ÑŸ®+¶ÂØ(έ46¤x,_:ÂÉ9£º7óÑUz>GŸÎ;÷§ß=}m£pÿk: ç•aã6íÐóŸ3þ}ùeÓŠ¦žê:¤mÆ´ªý¢Ô§-!òÐŽ%.ZÅ•l KDì±—­†QGås|Æ»ñœ.íi,• ` \ŽpjˆO$\FÍÚx4¶Ì™©e6@sDŸ/£Eñ<:Lù¶?.–-qÞÔ¼‚Ø£qRcß>²d£n€bÍt0ÅX¬^¡ð.ÌëIö|7 ÂÞ¬êÝm×iÿ§1”9ä8𔀽E?ßb€B¼³TÕS¼½ø§˜ÛVVöýZ#š-?Ët¥ñ±ÛµadˆûfŒxú­]½ö3ÌÙ²“õf$4;5ð´æf@ÀŒDó2o+.:]ar®<nq6¨QìG£Íl@cjÖ褫Õ="ÓÇ­_³dI² ‹qZ|óÑx-yåc`åÖÀõ!4e]Ðr ~˜±Ž^î`»7 Æ™;N="–¤Õ6’†gÉu—QÓß# ÍÂŒ •GªÏF>.ŒÏ ~¯Ý3[R×eÔ´þn[õX=¼mÆ¢Ž0ôuÑuh^ë-Û ?͈މQ“:Î(òݸ<£wJuï3»ÆFºÄ$s7¿iLèQxLRÿ^òÿlØæb(3Í3òh«¯7gÔF:ßÐ@² `„k—j&¥3XjÆeÆ3zš=‚zï­^{71\1£>ˆâE±C¦H¨¬ÇCº±,Î0´\Û»¾ÚóqÃxí,€/E¾ÚÒ!”nLQIØ„Z‡a"ÏÕmnf_¶qÿ}x4#â~7"6/ÆuØ?ŽkIûüfd«’8Qõ­œD1›ÀÀA¸_ zÁ½U§"ˆ9=Ò^oàdˆíÞ8æAtkiÉÇ#8ã]ã¶ø¢U6 ñãÍLdá]ã­aö©|Á(¹ßJoO ׆1åúhÜüíé¤K%ﮩŠÎô÷?7BÎc×ßܘEQà$äðö¼6(9÷í6m¥BaÉUa$R0j[O׆Ñ[½ü‡©XÑ{=¢ÏóÍ>=€"º+Qè3ÌwãÑêiœ#ϧ€ÁÜov3Žl+Œo¯M¦öuÂ=·:©FG²t[úáéZ¦¢] `ŸnØÒ Mwpꂯ׼Â-î:^v „]_¯¥rG'¯;â™ÍÑøÍ×F£7#ïÿР¹ûµ4Ûê´Ï—bw„ _Yø:îIëÁÞŠ§35ýïEž”°ì¢iׇ/á‹BéqܽÕDïQÎ,ÎêF;ÖßåÂŽkCÌïSÌ×'ä>Ë™QØÅ…C6ð×!d²QñÖë Ÿ­†°˜ã.XÃdÔÑuñÚ£ÕÄ ¸Ûep؃v|èö $é¦+hVèŠDvèrçÆ;üyH þzÈ |KµâC‹\Ì ²ã.«õŽ‘H¯ë&=7pô€×ºjѽW8ºw \bÔÂ8§LTÀÒ®IEA› JSŸÿÐå ß_Œ=BgMíófÄËŒ·º£ðbÍÆññ7£è7a¯@{ÏÞ: x(]Ãð̾›¡8ãùnÆc qÇ0ŒYàÂQÇ<nv3²[0¾}x4³úП6zQ÷{ŠÌËnñaâQ3ûpCC÷8u êÜHáuçN5~â`Ý·ÇSª"~ºšÂ >8‹'‘¨Œuß:|öSÐøðïCOœY§?ÉA–ã sœÚâJ?³G5cvžXœ§wx…áMr~SE^ñ›HÎ ¥åšìI”åwÉ]lצW®¹* õ-gjÍ7a;id§\ïF|(›oäf16è`‰±W‹j4É–Ih@©4úN.³¥z]ç“ë›Ø÷ku"üZ3V™äÊéb-Ûñë2'ÑÊüh6«‹1òf¢òeëÙÈטö×eÖ“®š{·p³Æ€ÄXeLÿðtmÅP¿¯}âÙ˜:ažË¬Ý0ßà4S½ £õÖßÁýZ§ÉH<§3½ŽvÅÁ5Qð£Âü(ãá}ÁÈG yضvo »<Ìu«nÍì}{è?Ì÷>u£Å=^ÙRá2šÑMš¯±ñVt ¹fï/ìlÚ.×6 p`ú"äfnR}ÇŒM1š£: a|Ãx×]Ù˜-´‰Üc¡°´j‘û¶,ü¨Ä”Âú!ws†‡pµL²2&è«7£v hhWÍ%®µLí‡L*]Y,.¬u\‹ŽÝ¦÷i<¯Ü®éf©éƒ˜F<—Ôé7­òŰèØeVí1^›–òªåÍêÉé2öksQ^¸¿nkàÚ´vm÷k/cQºµ²–Ša¸×­®ù~ÛÇG¸N™HJÂ>FQôI‚U¨ vö¿šPôýY±Ì›±ã\].šsh›ø ºèI„öŽ.×.J|íË8+½×Ûµj6ãÔH‹Leܯìçôø\ÇŒ›ÝŒ|ØËõ#F¯…ù~³›‘ïàš<îLï`xðý˜IrúmF¬Dl ̾”Iñ#ÄaÙ»ß W²vìXöâ%ÊA»?U¼€/3ô\ ãÅ­Æ0D¦âùñip³ÇÜ/üxܳét‰›Ù·‰0»×i¬Nî¸õÁˆ¯p40 >èW~¥³ ˜ém÷:ÚÀ -®ý ¸ê8<6†ì¹/ŸFÝØÙvm[²é}€ Äð¸9 ñÊâ£_«j‹3ƯîëÌ;×NÐ|nWNWA9V¥Ûµ\·Í(¾îcתš4]çt|õ¼Ü(ìŒ6‹P‡òã_‡ÃÕŧÌ3®4ÛÒ|©û__®™&lWž6¨kßl®Ò³QDÕšŒHvÙòý9¯;ï=àkÆ_ í5õÛs_¶¡j ¼ÎþúÚ)Æã'ê×V±ù*ù1/#äon¾_nÊ,#ç2NŸ<ýO©S¨Šç÷±Û»mB×Ò³R GUc¼»73'ëÍÎîífœÏ3céåi¢æãq£mzJfÔD’»½!݇јÞ7V/Oüüdv-¤ÖØ[1N“Š£+žà›¹­‡Ç½–A-6ó®ñ:©-oà}ýéfa<ˆŸüìíqm¶q º¸òö.£ö§ñ›Í˜L=™ì]SØü FW+̺í7cÇ¡;–%Ù–ã,çËÝÙªï†÷b\‹#æç»rž<}G>OGW9ÿý‡ÿâßÿå_ýöwó/_÷/¿þÕ?þöÿëËôÿíõ?ñûëä¿×_×먎É&vI˜é@\h›¼ót=1éÊJ×&ôÄέF$ŸÏöñÃóÕ’(ã ûâÀ¾ö‡¬kE!J£Ñþ‹´•úÑ‘\¸›lP ¤]-”ªíNƒ:Ÿ:Á” û˜tÓ\,‚žq“b•:­$¹5Q ä´©æ“M»ì2Ä®šÄs'ÒP MXQL¨8qž“Ï[?xUb¼’MT!wÛv¯Àí­FÖõ4`ÌÉ×å®!³àúå^Ôƒ³ðÇ'©5ñrJ¿3ùŠ7oâaaù?¬†…p#úyG­/é2®Å+-“КÀÊÄXà\_Fø“jìóɨíF}& ­[×-©.Æ2éR]o£V·L4Ñ JåèðÂûP`ZˆPG|±M° ‰“Ò¤t–g‚«™‹ÍlÙ~RÁV¥âƒlbZA7Û‡¸ec[Ɖ L×üG41ö*GÊg´«!$'ƺa\HRzµã²‰ø!î7ýžÔĈ•]8q-ZØR&š.²Í„ PŒy˜ç:òqM={ÃÐ,*™öâÆ5Ó,µì2z¤:ŒÝj²‰bký:y£Ò-X „¹R鳊´˜~Ò¶%IYÐÚ„—1 ®ÎËhóÃaX4Ò;’î~ð«_dʿ̩Ê¿ç _fë¿Ìë¡`M¼£ðR[àI‡€M¼P-x©oðB ÁšxG9á¥ÆÂƒÛ7ñR½áê¿øá¥ÊÆûÚ__4ñB½ã뇰‰gµ‘—º$Ï&hâO)ž¼’F±„+6ðRqå¥6Ë“Ž ›xGõå…>̃’ x©9óR›æAÇ&x©zóBçIK‡M4™ì6Q~hç~5[Ùþ€×•0®ãÐ%O®àʦu¡¯^â+-6ïD©çfPŒ.YfG 9阺ڭ§–w#˜bœ¿y˜ØâŒ»^øÀ’±5ÒÀ¬dÞâµå–69UóÑBYË/ž¼øòæ©â‡úÏÊ|ÑDFRlº ’×ìF;VÔÈ^ENçs´A]¯Z uôVêó©Ýq=6±ÄÇ‚>™¢"Ý– †ì*.LièŠ Ù±Ž&òæ''Ò‘Vs^ôñ¦k•kî”-P@©=ç°»í¸ö‡óÚÃþù°—m”ñl«¯û°ûââÙx±¢,w嵡lâ*оÔu¡@6AéÎÎQ%¸PÁµž,•WæócÌN­>r?ÔHÂË+ðvÑÌ›}=Þ$•UGõ&Fá«L=ÔÜ7õGUÝÿèE¢Ø?yHrÍŠêt¬ õfU-l;¾ãø+bÜëÙ¸“µ›È{a/;*S¶œ¸AO¹ƒµ’›‡NȈ¢D÷N,í,SGÚç:lઠ/ë+<Ôb`/+7¼Sãá¡D4ñ¢zÄË:O5)ØÄŸ¨`q–º¸Å`/+h¼¬µñT—ƒM¼SÅãe½§Ú lâe%‘—5Gžê“X/«™¼S÷ä©FŠ5ñ²¢Ê;µWžê´°‰—U]^Öy¨M€¯"•eU#•ÑÔ3còJܺب1P9¼Í®E§àbsÄ8X‚yÙçUãkMØk¶ú8÷+-O½hÎSÑ6ñ¢ÄÏ‹b@/ Yï”zYè©x›x§ÔÑË¢H”Ø„${µ¥Œêmr0« Oê÷B©F`V©¸l‚>Åð©q4GQ_k:«ô=ÊkN°÷°l²¬al168‚îoË~Ñ&òrÎÒf”âZ¤L@MÀe;V‰Qœ•ñ¹æk÷®oˆïh¶ŒIÜÏö 1ŽÁh½®oÞÄ*QBP.ÅØ#ë/Š8E/øC2†çý†7#ocôâú óhûÑè½…¬¾Ž+ÙDüpÜð4Ρ!›»q¤Ò&†ž„”æ`üU1^»®×ö¸òúv#EùaÏ:Ž>?ý°ÞU|3ʲ¢ƒÇ•ÓòÈžº'LÁÍ‹/o ghU/î ’j5\º1ú+£k¬†@̶Dü]$öfœÙjk(š(B(PZ“ÄF,i^Œ¥àݬW$u†d^]÷ÙÄà2',ߤÌW1*Êm4áÍéæJË$³_ˆÊV7UŒ-™êز>¦“…¥¯ ‹¤'6q}Ô‡‚€—ñ:RQÍ êë:.XËÆñÍ¢ø&s6ûÂÕ«f,ž,¶X„Z~À¥ÑúC¯¼Ö¢jœaL‹F?é˹nh€PÜE ãmd`y“ådè0–­pø Õð$Û<Í ãXg¶Ó¸ëžö*~F“ˆæ&‹ß˜Ñ\S»:Û›(Fž0ã8†Õµlâ¨àòlYírF¹áe^³w•çÍ^~H“/\56zHïRcYx:Ï£‰–&aÐM´ZÚTqß…v%<Õ`ÌÇ'Òù5bÔuÆÀ`“)£ä@™Q ØG׎ÊÊÄÛ4þ‰ªŒÃÞ;,¥âƒð%N}öòžëøÆkP=­XoG ~ 2þõc»\Ù°ð£>u¯§Ù×xGsS8¬ó…R ÎejlTlh_í½7tÝn2RæÄ8QQºÇ\8½—y<àå0 4éͨG«øxü!1dK »ØOz?_ÅÕDö×Ü+ 6Ÿ/p0M3?šX„¡”bú9~­ºÅc­íåW7õa;W¢†Ù—,ÍÆÊC®/ ×è,‡}­ÏM8 *ZZÒøÐ•c3B*P}ñ«UöÆ~0Õ25æÍ«­D‹5¤¤FEøxÃaÒÌzC£+ˆmæŽz|*PjÆeB/¢Šhéela C€ž†S‡hU³:j,WêÁ7FqJ mãµ€l3¢^òek%·°}õ ¦p»6l&‘u·Ná1¿âZf'¤ í¬K„mVΊ¥®ºŽ̈9÷žq˜ÿÕ›ˆŸ}öéÝ÷+!+cªšNà„ëÊX’ÆÕÿÂjÒ³s˜²ü±¸ZENþ€&ìý¨q¸1«Ç+Æy¼7WQ 6µ5"Ÿ½ÛjŽ›™Ç;;‹æz/’ݰ[d•MèÒ(Æä¢RjÔÀ×ñ xBäÕ~ñC¦w“MÛZóõ O2L5úÄÿã=ÕÔÁÜŠÏ(2,FôYÏ÷Fáj¦w]„å„%vÓKÞ’Q˜Ï!…‚£ü X/†$G¨omÍÆPŸ‰ê[ñyî»,—‹ xe2`õ›ÎЙ-.pޏB¯áÛnšªG$òPËG2”•i|´ÙгGc²d”Ó˜¨ýø*9SÇ” ‰cêP[#šÀD Ù±M¯«ÑsŽÅ‚W†GÐ’ ª,bßg»®Û!WjÆi\y,D³BNÃ]Ö2W1 £›ˆ1'u°Æ´?ÓÝM½lÆŽE&?X–ºk‡ÑdZdÃŒsßzÑ ÚžvN“ü0‹O©­Ðc*uÏÃx´M³fœO}¹WṟªCG&v¦aÊ¡O#ÆË݃êÒ_nÛ.õqžöcá—ÌÝ»V° Ó·Lîóºªñ ]г ïÖ®nØO9:U-3ãåÃàÊÜÒ8š0N¨v¯À«TÊI3cMžÉö6³¢ ²ùnh!Ý÷ŒÓÄØDü Ø1ü£Iý9¨ÚWBÛ(zQ!öâJHbDì>´êÄK[Е‘½¿o¯ç«ófôyÄH½¼#L/?\ß’wª2cÕ®K9‹J7¾b$zwS~ÈͯVÄX8Ž©Q'™(MYñoÂXGòÃÀètÿVŒœ§7c¤dé&H#?§þs¸ä9ãÐ7wóKµ¼²•DÙ9“)%É2ªÙv–c-üʨ“W»LØØjLTIÓ›EÙvwÉIh"ÉAlˆϗx¨§Ö[ ÅB ã‹Ñ„T°§›ä‚`ãÖËÅÊÈvÉ¿Ïþƒ.ÿ¡hF«0s( nAšS‚¾Ÿ¢]Œîœ?£"ÄhIdj4úÜìØû¤¸Œ2œµm ¨‰Lo1*ËŒ¨S.]ëÝýï´È¡9=K#k¢òWmâ½ ž.w¶Ò4f¬Š÷Y‹ØÊ ôŸE놅FÔrpoäPz³PšQf°_‡B[eÓ@æØV¾µ`y)þÃ' ÖmcuÝ£Û+‡‘Ïгóxuƒ e%éà~¥Ù‹f~©þ0pò|~è6{6Ñë"Æë¤t6º˜dpËöýÙÑ@¨øÃ' ^,8¹-ndÛÙT~ÓÏþÿBtðèÙ˜[qµÓ¼=:ß^Bª´~-TŒÛXнy•p»ÐcDŽ-¤,ƒ«ÍʸEÖI&¡üZÕy¾Ïö#ðHn^FÍ­yߨ™KÏM„^d° ½H„«î#¼2˜ 5„f¤E(Kœ1òƒnA!È gXîÎ)ðŒC„pW’F)™‘ø4§ ˆ’®A<¹ï´BSÑðMì´Ÿ½íh†2´‚FMÝÁfȲi¼Á¢9”B6ºføg€€Ì&2¤1ü‡G#%voF(>7AMà I‚ÈYÊ-Îp¶4*Â&äEÎrs…ÀTŒ¦& „i’nÞpHýikqY–4#’³¼NwÅa?(æQWøÅ‹Âć`Ծ剆M8CT‚HtuîðeìHì¸gÉÁíä¤É),êÆ«“­F²Ô)Ö ²ÏGRÆóŸýT3)¾1©vn‚ z"ýÌIâ×ö‘Nö8ªvÈëh‰MÀ¡¹šp-<ÇùÝÕÏ4ߨ®.ËÁjºÆÞålÑxpc„CQæiúrŸ”³o™¶2„8ۃȕ³Á&$K{ðêúËXÐð•‘û,FCöeh¦œæ$çB´í‚øÉ$oÍØ6³Zs£éQyFÛ»~@Îà^«â~µ„ìwçªÄQ@Å×W†Ä6SN—òï+§™ÕPÍÇMáPÝâUÈæ50sÔŒ-Wœ€cÚJãÅ‚åÑDÎþC÷L~ÅÈÌ%OI’±Î^h¶yü€ö UリP³75ÁuŒ²……dr]Éz§2¨$4›QsS>1«‹¡¦œEÖ +𱬉Ó©_Ó ÆÃ5ÊØÑ€ë‡Z{(­F/•·)ƪÞ4bi{ñjÍѰC½ábBÔžW8®þ`þ–üЦ_½ùtÇ»@ˆBö–\<4GC$ÀOÑ–*…{’õ¦QmÏŠ3»VÕJ [J3ÌITSZ &ët=Òd^O´píIlºdO3JvÔÕÙîµCPxŸo"ž=kò:dÙN“bDÕÍ.㺞ɚDAmzùÕÙ5à½fÙ4Íó ÆÙBj~qŠi|k…[b\ð J?Ÿ"YìbĶ2‡äd|9G§1è/úƒE©å–¡œuz46ow̳×ÍOPá‘2m*Y GxN™Š’áË‘©9lÝÀP ¯˜qf7nkÊ·&ü”UcñBÃÙkÑ¿êEÍÇÏÆ£ o7üô?ru{Õî{ïb²¢êf¬@.Vòº{øqøé"HÛ)ˆ=ü~Íð¾*.3<}qªÚ>žC³PìR¥Æƒ±Ä†ê»#yç£ ÍW7›B0oÈ…¾÷^Ì"…øõƒ§.?zê½ Êj›b’£cÆ w™WÉ„–]qÜ)y¥ƒU¢3¡6ŠÛË ÑqeÌHá÷áb ‡H¼*°&BÑþ&¨O=üIÀ!½?½yEQùâ)Gm†8•ê}Ñ<À ünÄ™únÔ•4šHiÖã‡O¨.Kpà0rÌß›âAdü€™.µ“Óæ©|WYµ¡Ø0` Q·¡ø*=&S¢îF–GÈF'`ÃÙJM´Sœ;óVDn¸L! ˆ Dœ£µŸ7rHéGŸ?©XÈ2rý0X BÎ~q}CÏëüÐ2ªí¤ÇšlBˆÍ ƒh ųZ6x >“Bc•ãûÈÌ’Ê „‡³¬óðC}¦-ív̯ÞB1ö3£ÃˆXŸœÑYû¡‰l暪±º±M7:f¡Uý¡ ´½Khß­…©žr®øÜ :Ãû—Ùi®¢, X¨Å8*ª¢ˆJÝÊ0¢ª ›Pó¶ZFñø:l&Fƒ 4d0x3"·ó€dДòpü@ið¤Ïã§XŒÓ?™à¡!µÇÿûå⌦ÞUÆÅæ®Ì¬É@‰Îl6!ծ̛–/öÊ?ôV/£¦'„1ZXÆ/NíPãj‡½r¢ Í:=šÈ ±.Tö½¹<íÚŽ ˜9? y%¨òƒ éAÏE*MÇNl”ú8Œg”ën¯FµQ¡ÊU`ôižP¤Æ~¨oÉ8òv×UL‹¶k™éFå>‹Q£$llzH²Q†Ä8ÛDÈ B¢ßi+Ð=à§̈QzxðnD¦ÃÝØ‚‹rþ 飙W#ðòI5¯,aç¨[ M¸tÖYgA„[y¨Þ ’©€Á¶EåÐ •ú2¼ÃÚ*t þkסÜY40jÂÜ*ÄØiä./Fc§‰+NûAÝ Ñõ®,&F×R\®B ‘¥®?l\Í•[ŒVShFC1ŽnÇé¯Ê{ƒ±±]ž¸±®E…Ú²l”ãÅUâ¡EEÌ ð$õ%šˆ®áÿ|5KªFpmbdbWw‰nbF =6a‚qg½7‘­µuEpd³Ç|&ï(fitåd]QÝ\7~ñ%g,§DÝmɰ* õe™›eoFÝuzq5ÏתmË"…Ô7ìycjµ„š-A!MhùOKæ W³Æ9uDz’/(!M0±"jËÆP ºQpþ±‰J¢²;'$×*ãF«ô½O©y°@b¬–!kgbl*,aaˆ·&ÆZ%#61ÆÔtW bœ‰±>6;ä4éÉ‘y3^¾r3ãN™]«Ù²LïzQ­! ãÊUv5tSwÍ–ãÊ»jYkßh— IŸŸ~ñF›$‘(¸ÅïÅbAÏi†MÓ³`£aþ4Ø>©ü)j¢jm"”jµ^ßBo•?ÜËÂÕŸTÃuAkYÝR6qþðòê1Ó³qÝ›€>¬2Xab²is{)Z­=&¶1NÜ…2$×0<ÔzUí*?© ®ŽÃSvø®ÊW…6ØÛñƒG§&#h2ªGœ©8*<Òò¦¬0–º жÔGD)œåædÕÍt4ÑŠ„.‚ «Ä@4¿Jˆk!R¬Y rŒYªIŒ–Ž*FS¨(×¢6]ÃØ‚ˆœ¸J'´ðÄØSFá5? TKÿgœïÊèß^üà:ê/ןÔÙãÜ; 3i{Åq¿K¾'›Àc¢Œ¬º{Çé»P$ÚÏœÝ3¦Mt"ÍéD´A.v…Î^½hÄ2ûü.ÞâEIth뎦o×Úõ-bIŠ yxfu{º©†£ÚDÒœºÀЂMîþùns°~ñ˜,÷/ozèÔÙãS3Mòoïýð¬Þö¯ù÷¹‰š)^ú-~(Z®¡&gjËv¬®'Fã¡(Ó!ÂBÒDmø!á$)å·"ÚÕ«Ho œŠØ‡8 ÑH­ru÷*óÕ6Ðå—Ïq¼LÑohÔŠ˜ë·°+Œ£vT‡£+@¬€ˆ c£¼Û©!² ˜¥ÆRÅc¢{šŒ1såÁa¢{š±춤l]ì`´ÉòŠ ±É8{ó"y#E.ž62™¼azåv·É^0é±k÷n+‘Zo« ðÑo8zrBBN¬ð¡5Å]VßO(Aжý0quÛ™¹$¦saÆÆ&@Z¾Þ~XÝ;Á²àÈà}~Œãþ;ƒoñCîüadgáç‚ì…¾&óöf¹Â‘û-#nd‚ÝMv±g”<¨ÍŒ8×Uuœ90`ìM? ¼èó—ÛGÃ`­Íøh׳9‚z±¥&F2f' P‹ñÈ›—d«ƒ´Ýýõ&°:‹>i^Ò4)ÁG¹Ü!°ó†ÓôŃ>p& |ó$y”:#âÛèz0¶Å¢è‡Jž´mj„‚LMˆýkÈF?)ŠŠ 1¬qÀÒ*ÿ>pC÷Æ·©‘£]^„O).öÇ?ûóÿð¿^ÿ”?þÍ 7çeûZò±öÈô-þûå¼ÖíG¬øˆxyy¿¸öìÃǾö|ÖJ¹>B è¼zd¨ÎþÒ£FâôÓ&ò&‰À8ôïPÂY@ÎDN !{ñåIš¶P¨ëúøEí 1äVÇÇÛý¤…žÖÇ—8zøŒ[}óšÅ€ä 15\Œ–ÿxD=hüMx~¿š ”ŒY¾ÆÎ¸Ê<¡ßâ‡<2ïGåÓ8{s”£P`õT^½ý \q3*&`ùù(Ñûa¡4òBßühlk†9 ¡X®¹Ö™è^åÝZ*(Ž%WƒR"Í*ÑM‹ždo÷¡Gƒç)Úvâ7}óÀLýº:~™Ú¥(Ëó$©ø ô aG2‚n·ó’¼O}8:¨¹W GCÕ€úöâ­ýeÆËGÁ±“ñ÷…òEâ³óêDU}Ô‘ÓðZlöý¢{{ÓƒE k/×ùüçWxÒèüæ?˜b˜é˜‚ó9ÈÛßÁµú£Š§«CBÔ_¹¬}ÓØ¨@úB)” Ö“4ý·ø¡»=à ÉýÌæo»&Z¦wcPB®5 ?8¯–Pc§æý |éâ_¼Ss*}üË¿ýÕï>þÙ_ýmN¿þúÛo~ýû_ýÓÇÿøþñ7¿üøí×ÿôË?ÿø_]Wý7ׯÿÿÿåõ?zmþŸþñw¿ûåoõï~ÿ»ÿåW¿üïýÛ¿ûÍoÿñ¿üíq½ïÿÒö¿ÿï~õO÷‡oÿǯÄ¿ÿõ/ÿù_~ËŸ½ýã·ßüóoåÖþ!}ü«ë¿ÿðŸ>üþCþøW¿¹þùo®ÿþ»’¥»ÄƒV‰°1¤^ôå À!âmSÖ#©5SÄõVåY+8ø‡¼ZÉRnúúÏ?üáú—{ýÃÿu™þÓÇöñüø¿ýïéã?Éÿg”§7lD~U‘þö`NÌЃrÇaÀ5«ÊXºÑÊho2shÖzb,3ãhB8ø…›ó†ni³aÖ}ófË!8Y@©Ž{‰Ø$Ää£_4¾}¸=ÍÚn<ñÑD¼šãf‡{{ýv?K‘pûÚöŸ¬ÿ±úßêâïbéqßðqž–艴«:e?Ë}xi†\Î()Åã=óÙˆž0Sy2Ÿ}ûQKï0ý¤Ôrpxx3{ì,•[‘MÇúpù)šJìùñu#?þ‰Ús/?9—Ú§!Â’WêõÐ{¦*ž†õç§b¼š,ÏëíñybÆèö8m_Îï§ÁŽäÃàþüôÃ1^Mšç·Íõú?Û¥úßüVî÷öãïÿãÕèmµþ Y°ÿ¿X««À4¢|r°úsÓ]Û9“&ë¶-ä0Iaì|ýp»Z5U¬GND ·Wíw¶Yz­ë~¥ø<¬DFúžªé«â^¿ðÅ\<¿’ Yë¦ü0«ÜU¦–ªn·r0Êý%«Ï¿k·º€Ÿ¡Mä¦fˆ—ý1™5sT:5[4ÉE¶å&¦b//½X98Kal•HÃÔû­êvSd¼·Ú² E³U/4d*o×}¯ƒ”©ü%iƭè 6Pé;®ÝÇͨòy¡h Ð,À7 ó©jÃ4cQ+IDüf3í±f¹ÄúEÂOrp* õÉôϪ)<¢Š#ø‰z6°¢£*ixÚ:D[…ùW÷4â"©9¾Â”ŽAÊë.ºM4ÇJ‹pì;4œˆþ•E=4µµ qlÞ¯­ò×âô`> ÇžÖ‚ZÇ×;'å^hTÆRIU@rÓÒŸ´ÿǵÃÅØ¢QÉ‚b…e>Ê~ì€Ð¡Ü%Ü›=^ö ªPÚýÚG«‡ñìA˜ÞjÊ–ïÏU„2Zöã;(¬ƒ±\Á È’¶‘à6­0É¡€§´³†‰$7kL[ëpk¥Öt›ê"¹”F[ $ÍJ‡ãÚkz“‚ºZ¥¬ía܆˜s)YÔróг¸Tò¦QaN‘êMŒâC<Ë„§è”g_/¯Õ‘©<Í,vÅ zGʹ¼í ¥$‚ÿ©:Æ>~a½<Ót7¤žÏ$©‰¥>³Qgž_NØX3Tä{€:J^ìµwÏ”CN«y:s¤z¿v)ó¼ÝZ=ŒgNs÷ü+­µa²D‹Ú¦’Ìï²­P"þfNÑ€l&å‡pØÝx¬$§yzU“”í+BvT_®ø7)üdiÕ™‚’PÅ#b;{†‹”=š¬u¤9M~6 s&P ÑR4îdÊ‚§+i©ƒ2‚Õ]qº÷׊¢IGJ•ÌÍXÖÀ•šuiú`²¸TBiÒEwBuÖRTIÂüŒ0ËHd¡ `ñ$åË÷µFú2H2=®•µÂV¸£Í0Þq`n­Ê{2cè_q`\&`q^»M9L,ϧºMøûQP ]\gÛgâïfL‹U¡¼ÌÙ¤L˜œLZñ“¥µf±#«hл*]n¥%G6íÃho l9¯U9Á"Ît‡ÕÓ°hVe¨ìŽà4'T{ÜÈoxœÇk¾‹Ê8wbû% / â»,J"LYù*‰ïâäž@ºRn¨þ½äçN¥nÐ9…1§ *fO¢‰ÈT¨ý#£HÌÒÁ ¶“¬ûVG=# [ül&wJ΂fkíY”&{öñß1øÀ ÛÄ%'DSì]-†ø,^¥·ä †¸ùì²WU`×z0,PZ“Ny}7/ì%ñ «×­Ð  F?؆Fß®U E2,„Ò -[‰Ðð~Eô׈bˆ¨<Þë‹uAhÜš:®—Ú[ɬëxÏ*}ñŠ–È¤”=cf身O©½S«!Ikà•O7C/¶ž[\ð9³Y%“׆Œ95ToÂK‰ýÐ2ïmñ\¤•_afbµîpe"YRC+ç°>…JÊò`u81‡¸[å8¼ÝŠ2#aG9u&«`æÚ3Æ KÞH¨ÃNk“‹:6÷ð¦/F ²ÈO}|}3RÖ$Yé…u:²—wENú쇦3,I=¡ÔwM{ æjˆ¼=ßî úÑýSTÛT¿}0GjÏŒ—©;èçæŸYÕ#•ÈGq •›«NÙÔo¾äØvöM¶¼¼ú¡ÜAWDœçoHÈ Í'L“…ÓÔöÌ\Kôæ4ûÉœoYäÍŸ›¦×ºð<ƒ\qùßôFs¦ç¹¨'¬‡~ž kS_LÓ`%AwMÈFH«ãϋ҈‚¤*»Ra6éñ‰RL/㤨RœD­R«ï¥&ÐÍÄýÇF¾«h¾vxïªý«¢Š~¥A$kïKDØ×+2 ÂHþòúvŸûA]„‡~çË臖AÝõ±VpÞû¡Þfêýàíд³endstream endobj 969 0 obj << /Length 65536 >> stream ¨¥xø¯£Êq ý@Ç«T”©<:%`B{â›Ëš´\VGš<É·ÃxÕÑ]QÆLÃ`Ú §\³sñÀ.9k¬é¨B_>p&ÐêPêK:æ’o°¾¼¾ßÇÅSÝ$á¸ð};/7ã*,w£pŽ\—a XkÄqü­âºÌ^è}ƒ€YeeIȧŸ æjÚ¿Z´ÊN¸R“Çàa¿£šŠˆT¥$› ºº®u"ö/•?|x¹°~~w~¾ÝS?¸£¼¿û-`ŸßYë^,T?¼»¨=ßíßvÑoïî¸Ï»ó¯÷òÏïnÄÏ·ûáOD0ÿâ÷N™xŠ ñ‡ŸâŸÿ¼¸#¿#2Ä ìwĆ”Ãúó£Cöçß²¾+BÄ>|GŒÈ˜¼ß%rvóÏ‘¦ýó#EÖÂwÅŠ¬‰ïŠiß/²¾'bd-|WÌè¡?'jdïò»âFÃêçDŽ8(¾#vdM|WôÈféwÅ8ÑvÉ^æ÷Ĭ ßE²¾+Žôð~N$‰,ïˆ%‘lùÑ$òy¾#žÄùŽˆ’5ñ]1%'&ýü¨ïˆ+‘»ú‘%§ÖþÜØ’ó[~tÉXÂß_òLÉŸar:ØÏ1Yße²7ñ]q&kâ{"Mî;ÿÜXßåÏ6ÙC|W¼I›xqbbÀwÄœ"SíúýöŸ þFRßÏE¿­߃³…Ÿ€û+z…RÚß…S²íï@*­‰ïÂ*¹µZyK2¹Ç«‚sûó#VÜ-~ÌŠ}øùa;n1߸ûÿCú¿ùí/ù«õ›ßüøË#V©°8ðÿf«h°›¢ RHœ¼&ËKV´éœåõݹ޾ ®›'åFB‡TE(¥´+6Ü˨¢e¦åUvÉÉŸ ºšte H±„  w[Ý16-4¥eåéÜUK‹+¿v 5Ó‘ª?ì`ª¨Gi&“)2FVµ[êŒ[I8sQðrõ©NÜ»±™„ï×wsñ¼Õz·¼¶É@O_‘E¶õ´‡2„ó¯uÚ©ªÖf \XV$©‰0MAÍEKöS»äõòÚå æ‚…$Šˆ£U-¶2¬jžExíŽh@PìÊzyÙ´åNã:zfÕIH,pÑ2©}€âVkÇK—fY¶!d'Õœív7}`sÇÃè ãïVñ¼¯ÄÇ=Œr¸_ùÑ!<Âym÷š÷`5[‚ÂÈqó|­fÙ›q„±ðƒËÌðL‰»º¯ìmònIÕ ¼Äã+¬á»âDÇÕŒ¢€VZ°V5™ B°øºí¼®•‚Ô¨­>b¦}/Ò¡’/>î˜ìíðÁ!®=Çì>¾Â<‡2ÇÁœlUªÑð%z_U«·ÅWàd*þ¸ñEÀ”Æá­¶³Ÿ"¢ÃO>Ý8£§Ù¨Ô£_,YÃåMI¹TùÇz9]]3®‘»‡X$¿¡XðoS4¯¦ì<›L›N ]Ò>oòô‚r1/®¾%hx5LfUµ“a–;M$MËÏl.ZsÞ&š€d畬‡™ )Õ™õÖ¤,:Öâ©Bí«.Õ&š£“;‡à;µà(ÃVEµÚ±¹Y&£5P¨™²²KhbùF4E«ÄÙ€¤°E²SúWÄ„P7ôSpq“«¾Fÿä‰Ï*‚פ*Ë›a9žjõom€ó‘U¾Äƒgnþåá#ˆK•X‘@_­-l”V¯a³ ê‰h@é¾4£*œ¼x킼±ÎS/¤5)>¡gô•±«Ù%Ò&]¥X™í\2Üé?CϬ²¸$©#(ý¼^µdìä9DbG‚­òͤ\Èe’žr ôäYkMŠpBïÈZ«ÌRœE<Bc|`S¾#ÝËPyò E=dê€M?X_ží0FÏ…Xr5UÚ\nTÚäv­`¢Öa­VˆN$¨¤K´Þ2×lÓv454&àj-·A¾1Y…å×»n©³]IÏ3¡gž 9 ‘ª™Ö-ª“ÝÛ¶ ߬-wYÎÏ{ùîßV²¯ŽÔÏøQ#\¢§Ecæ5Ìüsp)'vÅÈã3fõ>£˜‘¥XÊjØ!•¼Ñ£CÈù+Xªx¦/Þu:„„õXޝ!u-4 –—ÿýØ–¯>͇³¿·"k›>qjq¸!•8YÛ4ñ°ej)Xû-Ü… ¾îÕFM±âwžÞ)//N-È43e0Ômó_E< Ž3ËùØ2¤¸€yžU”*–@yÙÌñ~þoÿ¯e˜NJÍl ¶‰_^¡ÆµXľ²´‚¸¶Åâm’¦_mZAT–ˆÛjƒõ¤P7YOëRQÄ2‰¼ë*¨6ëWYZ¦HýHXH›—[+á׋ç`µº‘+Þ>ðKè¢)*Ö†3‰b-jn–ˆÖ‡®¿kr™ÃfY´· *j)£µx-°Z}¡C_œª}maÝJNuÔ£ÂdOÆ\ÂÃ4ñ!9(pµ“imº<*•¿ÈÊE™–¾,Pco@k-™ø»è“ø^4Ê?PExc\[í†nÒ„2ið^påW PûZäð M×R†u°x½ù°¹šòr2h¦…hÕάW‰¿_ËÔ“ ƒAåÁ×ñ²Eöé ÊÌÄSI¯±@ˆ ÆÞý0’*Ü|âßÙ·×R”+_êÃÀÁN¶ÛEÌHsƒy²$´î]PèP!i¨¨Ù<Ç‘Ì{4Ç{š0°…Û ~+~³‰‰õ}AVa†í³CΦî«îËp”Ú|"ñ›‰×w–œëÝvÏ19c©.g‡=˜=T•SF¶¬WN3óÜ&ÝäÍêè;@lqÑS…²¤õÞ\u`»—h©“î«ÊýüoN-7ò”Ü^+Ü~ƒ7_M©MÅÎå7YñMÙˆråLÞÛ£ëžâ"ˆ&U&H^ðñ«É[é±s°öK³:uZ$Ñwx‰\L {W#VÓ̒ΊVå¾bÝæÒO4u „™¶U l] $æÛÊæØÐ/ãá9Ò#Ýøç—H@£Sj\*!Ê8¡ìáwsq"@aBæ|6uŸLë~!€Ë{-\B\ŽeÁê]†îéØÃº½úç‘uÄTƒëYH \JÙ\yÀ!œ3D½xš`Þ-GšEkéÀµ½úC*JNÈ+íIýR€s@\¿‚G¶ÀY¹Q¹(VÇ]ulÛv.’±>3Êiq|eE¦Œ‘DT7^ÅÀ‚K£v†• w©Ë]àkãÝpQLAí:èʰÕdª¥æž•QÜNpæ¶ÃƒR'u<;áö5Š 2}åQ˜w™º \ØBežH?‘oŠy››§o„9ª¥ eÅNCœø_^äÏ>ÂUŽ\±<8‘G·—}Éø¼Bë1VEHðžÔsRj€*‘Ëö}õ¶am¢Sß|Òµ—š˜æ%,f>£·%3ñÙ5 nÜ+Gâ¥Ëñjw´À«î7`Ÿi![º2°¤¨Û"ÆÅ‰§‡6ÑY•J~ȉDÚÔWæ ¾;»ÖŠGˆ1ÍSðò†Ù„Út('tm`­’ª Øó$vÎ"šÆÑ1ÒÝâÊ6@².Øûb±±ò;+Óóöj½³N¼\_®£/Ö\'G}Žk…NkÐ+°ÊQº”cN O`4ÐÊouQÊîȉE;l}ù.xÂOZL„-¡ 64(þÞjÝé³}ºFé0ùÁH®iy³ Ý{k·6ñä¸gêØ,q0”PÚ¹ÒAŒjOGE^Q%J3³à 8"g¢Í&¬¬Š£;Ž[bÜQg¹d§,,<,vë^$Bâ´VÈùa†Èá¢,ü0ë&þÑ’/#¤§_œ/ÈýŽS¶Eè¿çœm¡áï:iÛ«øž³¶Ónri÷òKe;Ñ\\ÓH̸O¶É5Ñer*&Á$U Q'FjRöŒÓSk9ÖÍ}}=£,ýtBXï&Lþéõ¹ÌÖ›W§¸—ç½WgC r»Lî+/…?$HlÊú6HSo5R™_®4á× iú˜D²ç;t¨D°yˆÓY`u’ùœÈ¡§ T’½­N¨ù½’g-ï¹*öÂ_:6¯\ Wî’ ß—ÎÕK7ì…ËfM¼pð^»‚Ï„ßì?wb‚Þöí×?ýò·ÿò«¾‘~(+âù‚6ůWÅ’ø“£ÅÃ/þ9j][åq5X$dPWô+8·IH—ÛÏ8PŒú˜½f½;}×j??}°9â«BìÅ T­Yëò O¤Ì+¿H®¨‰*íb“…ä'œÜj«4SX–DeþÈ]ÜÒ/8§–I&ã.^ǶõŠkµ.ËO¸vØz¯¬Îʳv3í.g àkP¥\þÒ`Óuä'ºñ‰,Ä>m“4©ÄaûãblˆÄ…?¶½œ ’Eõ~µÕfQb#صâ£RBòšºŽdÝT+šG -T­mñ¡ yEùR™H¾”€o±Z‚ϓޣ–n°íøŽ|Ûi¤B…‹Þˆ£±:ýu€ ò^»iÂNÃò¿«VW®…ªùò“2Ù¯¡ú¾6Á½ãʶaT`b VTÕJ5.£™O[ _e»*Ä«fiÛËm¹"œÒJÚÑ®¢ÀCá‹ š29íŒ4œ%®eóGÓ~Â[Å7 »œpÈzQ׬øËig5è5s²ÊwF[tÝj‡à潎 IãþBÖ biÃ4å?)x5p¯¡Â‹?aà®Öê'B8Ûš?¹ à!þ\íX·Y£]¸±Ø€ºíT?á¤)éO0ÐP@p2äH ÌZ»3]!ógdö€Dš Ûøbù©Úi¹QtZyú„›Ÿ€ºé ²{é¾WSµ&QûÖ"‡¨q X<"HÉË/"k²ëòò\?¢ õå OÉ ÙšÁÅY]'ZŠ=ÓkÕcÈ™-ª«yÈÙJq_sJîóÇÙT?óì9Ñf¤˜m.Ø2ûä¸ýXFöÉ0ÔTaÕæÖ>ÌH§¯(—¤nŽÅÝÔ“Æ`JVâ'\[´*å0â’¤#£Žðd*VF«1í¯õ“ØëæZØ3rµ¨ÐŽÃ‡dÚX¤CäiHVNoÈ"|ɳºÎ™’´oJÛÊOÙÍFµ$ í£Vm7^WM(8 AB, Ï^·±Ù57e|FŽÄl`ŠžR:’r«xü4vN’+}ÅÚª–6°ÂÕœ”ü—õ²»…¾àZÅk쨅’ bÄ*Ú¬ŠýO¼6o át!ïË*Åiм-3.h’«ÞªË(zÅŠ]PHWR¦T*[áÂ.!7ëU–­ÛV÷' ¾‘c©ÓD³B ¿€§|5À`ù'²—[»ÃžÑÂñH(¬×KJÙ':ì¬])Õì}0Bs,ý¡Äš†Ú¨97[µí72“xJÚlfpEØmlÓ=¨ Ê«O +ÂtÁ&ˆøúFaì „z9éÞ]&žê“·¦µìë½Ü,[]L¼E&52š–¿Üìf$wÁ™Ì§ªÆo²)²,S½=MŠÑÅNÊXù…Sôg˜áJ|×Ê' y½O«©m'ù €A#Ú‰b¯LjÊ%=óÈk೫1«SãÊðáÀ®U£Nt5ZM177–’GH–>™Ëb‰¥Æ¾ï6_ß°*ͱP©´‡Ïh–l F tY‘;°?`çƒUC[ÌØ×†Ï«øW[”|€«àÏÉPOhÜŒàžjêñ ”1W@ibä®2S%Ïe“ì:‡eèZ³5„³9þZ_вé„çdí Ö . ª 2üQƒZª»;\àÀ(%Îö,ådíÔY‹²ÑbœA[€ÓI³/•]¯NÈÆh( šÅùÁ^ôcf+ŽþɲÝlBÐHÇtÑóZ™IIúj¾ .8²!EÅFë'0K¬¨°€Í Y«­¼r5> ßÕÃ×&rDw؆ŸÁj;­pÞQÀ¸Zõrꨥ•a&d& 2†y5Ï™g%Œ]Ee*]\„$P+kˆ=C²o»raX«ð2úÝšðÅÌ•Å*R¶I›ÔÒc“_¬Ò{ĺª™?dEùå%ðgÿßüË¿ûÁ?þÙß ð×?þòWÿtõÿÃÿò‡ß ø³¿~÷¢¿ý›ãøŸ$ "›®HrKRÛQhxIÎQrPH°‹0„–¿4î^56Ÿ‘Qk9ø¨Žff–¿–µÿIs®¹ã5ç&Þ£H÷f'Ћ9q'Í¥x¦M¡Í›’ú..§ù•ƒbWæ?ÊP›ïïV0D<=ÇÙö>¦Ôm¢üÙ zñܶýbÙšf,¨à¢*íÞ-³‚¹Îõ°B]F»=¨Ù*Dš1“u½C­æ«fÄqô}Oòáé+«1#x©ŽÂ¿Í ASålgLFÇØT¦Ûô>¥éÞ˜Ö§23Ò®Õs£#Q'ÿºZ¥°…`ȶ`8ûš _HÜÔM á¢0,R)Éñ¯¾BŠÎŽUE”ïÊ/Ðít ã䎤U­ß0ô#ÃÜ]%¦%Þ™C§Ò1d7¨Ãë¯[Z‹Þ&«Ñ FTÂRc£¢A¨˜‹¹¶E³mµ€aØ5(jÁŠíÑœ9Ôå4°SÐ* $ªVƒíh7ç(MVAV˜ÍO^Èë±y@WìZÿÃ=RpÆŽ¯PÆQ9a[MmKN¤gSy‚2°×kyrW±ËtŪ‘>T°Âò¡Wò5/+1hûßy8Î-Ek)tV'ë‚ó•Ö™±Q[S“8:š•âTc£´dÕˆŒþnSò \å´éWô(‹|°N'Õef°>)ý–44IBª‰¬ô<é3²Âåbý#M»²m¤…_vdž™µ^!ý2:éɸÝfDôAÝÐðÖ¬X£xkka\(y®ð€ósÍ7Ë.U¸žZñ|{iDM±4×'þ/h3ÛÀsd2ûX»qØ2BW ±ñàvaÞåjŽGHÊé×°‰6ÏBèË“«guOMË—© ¥{NHÐ}ç ®»#UC£Ÿ¹NÉÃüÔíU”/åäÉ?Þ\øfõ„ >÷€kª°ö"Ev4U h7m§\^ΆÀ’8 Èò-†üß!ÙñEÌ ö*b!ŸWÙúv·ÌY¯X4<’kã¿«µB¢Õ‘áZÎîz®8i) iÍ4¶fÈ‚§5ËÅŸø8ì’˜ÌE¼3qû–²¡­jÒd2ÆxI7év^IGÇ´¨69>Ý š‰hÛøñ“Ì\–Î6‹Sgâ·gž)þoI °¤óBéW3²r‚IF0Ü0¬Ì¨† ÚàJ˜ºÓx ¤£`oøÚCñÌJÝ…,^!‡ƒÄ¨ÌXK.5bHQ™IÊb¸’wGNFª}ÕZ,:hK áÕdk“-üĹÊ|›qW/ú\^7 ²êº9û§Y¬]iˆ˜É’I™xtôt$!rM¬ÐŒŽŠÑc(ºa¿} y«¹ ,¢ ˆ?ÈPë“ YáH£\VuôÉè¡ØM»Å`ì<»o¾~1r+ÙP6Y_ˆÔÌ>H!ÂAT3HÝî†FŠëÓ8zêf‡ø=$« Š;å3Ÿ-Ø 7prj©kÑêF»ÓH©ùí©×b<ÓDÙ¥Ä]_Œy&°ét«à`²ºÅà‰Œ™lϪb4¦oXƒF^à×®Y<ñ¬3™ÓÙïÙjËëYC׎ßbH¬½kù\ Ç•”½¤_5Lëø„kÑ\§ bpšmº<½Â^·æÛ­üŸ3yðd0#ucg,£4ÓØ&•«ØòªNËæ%iüh1œ’÷‚(F©ûà¡Äšè)êgœð¯Æ'hܧ‘ï`B#YfzP&Â^ð¼[¼FVMPs£H嫆E+‚Ýj&u /ÂÚ×ÒW<äg»¡fG¡ˆ°qÆ,* ´ÆâÆÅÃh=ÓÍvÈge{¡§ý8Ý-iJ{@DŠ7Jó„$"ËFƒcv`«Ø2m”âò»¹2„i5Î…øéQl8ä·­d·¡h g'g—*††}qÛÊAhmîJ^Ò™ Èœ=,†Š”å½n+@,JF-FbͱB©ùœüªi…yõyÈKaΚžmÿ0ˆvMZ–å¹DŽÇpϲŒÙ£cYÝ„o0+ÝŠÔÜœ n`;4ÚP¬z±wë)9ÛyÒèìYL“ËŒ×S!Ý_£|5?ÛfŸ¼ÍŽð!Ò‡"ù.Û°gth;…`gFÄX¹@ÕùÄØÌm_¯yC„leò†š9¯2fZ[ÀH9oŠxœéþL±±H6ã¨d„k¥H@/¥2cÁ¹CÍFSsò˜·íW†›Ú&V6¤n¬ ö&ì—H =¢׵^IbQ['BY}¿³N<5CݤbQ#N¯Šú¹¶všÈ¯ÂWjÆŽ/_Ô¥¸T”š‘VE3Þ^gŠíÄÞN‡N ‹Œ0q!gļ§…Zä¤dn®|DcwMeà¡¥LÍ&®5מj«šëà^Bu0ÌÏ'EØ™Ÿ’¿º†V_À§÷*ÃUc­Ã‡a³ü<1sE+žñ–]jWŒFéãB¢•š-4¦Ì>ƒŸ%Q|¨#h¤ÆB<ÖËĨ٠ ¥­5\ºë8eq¥7v«oŽý ­phu,K Jc|«g]h´ä5ʪCà3`ñÞ7‘S:‰j´§麊Y½8&è{¹Úý² µ*»@3×÷+6;D hÜìâÉ•[³xáºnJÕdq¹Ù=˜YHfàÀ_‚\ä$ ÂÃÒàtH×¾JJA¡È…J‚|‹ôP° R´6Ù.Z¹ù;±é Ñ04eë`\[”ŸpmApTC¸^¶ (S1±ˆÀ¼A{ÊÚš¡ ì[«P\°¼1y\2Ű ˆ$Âè·Ã°0Kï­²Ú–þ¥FO¥Î^yøš(œ"ÄЧ±7H Mµ0"*!=/-”y;Ê l—AQc-;=aFŠŽR+7èºÎ Ñt/[ÂÖ3J†j™ÛbwDçU:Ëq=};ŸqÂ#©C½@&—¥mšQPÃ;çö×Ìh»ÖH’öÄ·[N™®°'id–]«¼ÝMöæðo<‚{¿ü_vmbCò)“Üð^—];‘åUh”} ÉA6èò?ÕrÖ´ÂôG‚+#PX±!òí´÷†K]ñH6 %[ت©ý$+&ê3ÓU3…˜$±¶âž(+†òòœm\Y _l7±™Ÿ‘Ùb㈙“vvTp4ƒ˜;,Ë‚O p(rvD¤vŽÃ@Y3â* ûÐGƒdÊäv•B¬¡ÚVs.$äܱÖÇðÁyËpC×)§!.*YźzWï:7d#}Eסè$ÿd+”àÉ\L¡q ú”úÉN-nøjFè+… ­MÕ˜ ±nU¢`Ö»øš•©è¡yËÚ@ç"0íPlÆ}œð±Ä.d“Ùú¤›‘¡£^O€ì¥aþ+{F€e)ÛTÃ4Væî·'M¤þíÂMºW3⤲ !f¢Ú:žtJñ«…z!…‰ÿ<\~‹4Éûö1 €‰´)~ÃQ´¾@Ö"÷ÛnæR¦*æiض{Ÿþ Iö¬tÒU¶ÓÐmQþÈP´Â#ª1ŠKÊDo»Äʪ˜0úÐ*ôäÄH”DÍ{šFÌpxWl #$)£ù{â®Eï]•ÃXý;B“K«Ðȸ‘˜Ažœô´d““8‘w"xfÜÍW¡aKž˜Gg( ¦4ƒ&+W9|Å2nk\«‹/(Àeàl1٩ͶgõÔž€T1kCQðÕâàTUY3º²‡äD×M¨ ÒÑ·16¤¦†%æø!ö%FÂ<“´]KÍŒS€Ÿ/íæØ›-àÎn™p ETIÙ¬‘áY&É »ûý7§2ÑøO`ß3«Ù’`VÊé)å+ü¤àiÊü¢Ì5_Øx˜锽¯ÓXF ¿@MíDÊ2õÚ®×Òéˆb T£‹)ápÌ:Ë£àD³±tš‘ I'î.èòŒ ×$E>‡Âð¢7m°j,ÈŸ&ÀkäØ øLÿW̠Ή±v™Þ<ÊpdlÖáÉòÃó=ô8X˜Æ¬DG Qã"ç¦9V<HË˃Š,üdäkÏòÐX½ßc‡Ø~â)ØDmÛ@²s‘°LÅ ŽØ‹«Ûp!D)ŸcTéˆk4ÇSuÀ¾t:¿hâxVšñGldWUËì%M¾VïÝ.!ÇBVÓ7³æŽžÁHÃ9«ÀœBÙlK9–IˆŒ9+ÎéÊo—;¹¯Q)F!|6âœÀ]µ…eËžáP(ÜP´ÃÈ]/þrºk× f¾ñÙ Ê[°;³ o!%1æ…, ÿ9+ )š—eßüÉ#´Ã’æÕ,¢™qš²rº– '!¯N— ¢¤ÉôþÌ(ƒï £ zòâ¡52ðÀ»V=µÎDhG- øü¶äFÙ() „#Ð ð¸;h¶,QÅ_ é¬åuuÊ ÁFZ-þZ!T%ÇÜÕfmµàÚÙœ^dÕ‡Ã~Jì6£ÅÙˆ»bF’‡@û8ÝTœwkò¯]¾QaR@²Oåìž9Š87ŒØzr¶—Øy-Aááy*ÝØ,0&ò!r=@F­ ©Øè0260RÖŒ8ž«qÇBy…ã`[†™h‹[=-¥”HÏT ¢íd„TЇ»²<õ:É›²u*Uä™DÊ&…±Ð«‰|Ì’ Ü®h%8®’àV 8qØùÙ Y`="œ¹œ2Ø3×éaz+€o’s0C™dYr–¶f ×ɦ9HYC­"1p#_v1ñ¥XzÈ–â gå)—›RröU§¦»33¢‡Šõ•Ô‚-åÞ•7sî±Un2>«Oe©[eN”‚ØÕº§%娾é+Þ’¾~Qm÷ø&YNʼn˪qê‰CB%¾ƒ…ÒÀ›"ÊžÙáÍ>phZ®µ”jâ9„7‡©I‹Ç,wÁÖLk›Íòœçv°?¹Š÷ÂÑ—ð&<Ÿ€.âK«¢ì–&2e•Rä+RV;ëÕHÖ^p.#ëŸËˆ*Ê]d÷‘Ã/î±¹lj\íp¹‰»núìpêŒý*ëÒø÷àûˆD‘$|&î hoš„ž1†Åø'â?ánúô6-Y(ã °5B²Ó–æ£Je•æ×v«³iP³|ÁÏ8×*/Àç`NTÊç<É~èl9µ+<ÂÊ[«NkMt¨ƒûSÀœÎ7¬Ó¹FÈR`8mœ$ãOáî*ÆMBV Z«¶M©Wcr×ÁùÌŒ}`[‚T$q²\EFH'“•ºyB‰œkûÉ’Ù™¾®i"W..+êˆ- ãÙËwøb« êþ„|¯ßU,Ÿ—¯’Fb¦:qöôËh™›L@§ºò;B!™µ¼ÄÁÌØ±ªbOÂz]DŒ8ó¶ –UÏ ýn¤6Á1)©7- ¿À &Hµ+“8½äH:€Æj‰A†ýrÏn…œ81ceíÜž K!‡³/,SŒÌ÷ƒ•'gz{¢Fnµ8«Á—e²äˆ4*T—؃Êt>5£ÂÕrD37B ©a_ÑRpÔj n0=öÖaë2‡:—“PuèÙ’´*Ù¡¾VfÔnUã*œGÓ_á rrõ³ªjØšRÛþ‘ñ„DmSã.L]Îä¬r±Þ†~8иˆ¤^7(»ÜF¶2Àù ¡j1¿!2`ä½£ä]$×±(ŒA㣄=ø Éã)ÎîUô±à„„Î8«ý&‰d¡îyzÛŠ§åYºº¼¼wÄ ®-A2rÇjhK`kËŸ‰È*A÷'rÑmvZ£|…Ý*“ÃhQ{5®êˆj¤cFÛI¤]1šK¿Áå,8ÊS¨WIÃÄT)ù§(ãF¥iÝì?•\–¹Àœ“|WÖSô¼E®jÌBMq9-Ä·_vƒcjFAD¿ò @ŠiLÐJ …¸ÇŠ‚F&¿®F&¸©däÁâØjkÀš™ ÁL‰vr Ë?›ÄÏžl–(BÂDùq5Vê .“ƒß«Šñ‰x@¾qbFtI5šžÃ¥¶âØÃ…ßËz(äËv§äÞR–7v€—¥ Qò=.ì:bF›È x ‘JÉoÑFá³ê^b=h<@*Læµ.Æ¢¾Gð㦡aÞ8#’æÏw8Œqh“9žb47e·ƒS)fO^E=¥Oú„ÍÃõ:Æ{ÓÈ;p„lvæß3b¸ýœ”]_ЈÓëX&Ô<áÓkEÃÁ:-×(v´'ÔÙ1åêJ"F(3 sb„–z¶yL¤3VmÒlÒfŽ¥Ö¹ë$…áXW< Þª|Ɔ”py*¤ßH_QYWŒ ±„É7:Ü$¼åìR«¢.e#CtjZ'tæ0„œŠŽëÉe ÎiÃY.,ƒ‘‰®b”÷"§Bœv󡥯5hÜüˆ×ü¨\ŠU4õ“2…°ÇÊb:k/’X+âäÅz°çѬ3™/X c@úœröpž–AÉNÑ+ Ù@*±êF-À»<¶G$­‚©ÛŒ"k L}–*ñÅ¿Ÿp°Ù÷W/b¡H˜9ÚâlÕL$ìŠÊÉJ½ÊÿÓz3¨@“¥œ…€›]@NùIYò¥H­¢œ™¼DâÌ\ÍS`dÙv!5:L˜½þ@2ž\¤ ‰/'{é²ÄÇùAµ‚ñZ@Ô\FM´y%ÚÈžraC­Þi§CM©&GV+}reÀaTÇÏ&”p!gV=YPò®% q ̤ärÿÅ28“ëØúNž ¤rj‰ìGGªQ?L·~]F§m¢œƒ§pW§ÿi+ç/6Tx)–Çg¢’Ñ–Éï®Ô{#K\)°h¹*jU±9×ѵ'ÔØn¥k"W£Õ¯ƒ dÈÀzºxw•¸bs†žV8â¬f$ƒ²p—4ªä@Ì!;«AÌ@PЧ kH}áË@Ñ\=Hä— £«¿ ùäb„sÁL‘ù1;óHõs6‘ ¥ÆI '˜|&‹£j»çAá„ 5óT¶¦ á4u– +s „ÖŽ}Ö6‘G›N‡š~ÉF1qMèRJ\)ûñ‚ÂÅɹi{Ð!YY&6C±%&ì$1ÆS«ðs7(š6ë"[¢’PL#9±$¹®6ürÇvMEw'¦ž(³ÕWÎiE¤Ô88¶¥ýŠ[ —R[ìô/,»²Â#ЬaFÄ “ì äÐ'†Ùr c¦ˆ¢–Æ`ˆ!k­P¦Lóuznd·f”m3£'K=äffüO*ö(d8ì%.(´û€w«³Ê¢&;™§](Û®àhœGMr6FÅD‚jŽÂ¨ï•Í4#âøܤX¡²œì¶ÃZ”ØùqPHœ¬£- f‘TôM\³P¦³S¦³J’º\œ­ ¼œ™,R¢•  gžʘ/0M4'®EhÎŒ…ŠD¹lÇgÈJ[v¸G«öµ R%ž§ð¯;9õÄËèNv^!#Ùy8:3ËáQÖÀ2%9‡<DU>–i“«Ê<é ÂÁ#† ´7\‹œ13z|ßyæãÀ©F/Æ–à gó:Cõ]ýhÇ×Bsq„2à8Ü^* ç–{¹-êo#µÅ^ ³}‰%Nëw²«iâW~ÿÎT®Ï„chœAÓ¨ fDц4Öæì5™ßcoÎ}óš‡rgRÄjT8²V3®\U0#ª¨­zL ß K rßü (ÁŒ^M„2ŠÀŸ54åÅ\‘áC±Ð±­¢–}P§Cª¦ÜhÆÅØ6 >™™êÃ…aÙ288‹ïÝð5B 8‰ã©e™H‰‹;’dÕ86z°ãô#Ÿ;lj‘.Œ•P¢ôÁõ“™°6CÎ<ŸVO”~ÖÐ \}X¾è?9 W‚ö²`M§Ñ…æ%à>"áùΛäÁZýŒ £Î¾Ä¼Ã æµÀÔØäêñÅQc'Å ­*­á‘Ñ­™FJªj!—ImwK̽÷C›}A„}XvëW †Yñ›úvõ´b×Î(µbi@·kéµXmäê"ƒæŠŒ´#!³a{•K5Žû…Ï«øC0ËRöÁ’ ‘\ePü qQÄŒs¯Jô›8ºìT9ZYÍ„JM)q#5@*݃%£>·ÖÈ#Š1Ê“m­,1$•!W¯B£œ®‘‘rÌrP¨—ØÞˆb'ÿ7so»kÉr‰=Á}‡ûGÀxŒ¦«ò;ø‡t`Ãc´aCjsDe°ÉL¶À·Ÿ±"VÖé¾2Œg` ¢šk×É]»>2WÆŠAëÚ[ 1l© á”ù»å †³%¤iWî`4áÌ$_v„ÄO°ñ4;בe05ÅÉP}‡Àiñk§î˜V™Ë̪ŧ@d*Æ­"{1Z kjŠágNã^2ÍàÇÚw'¶¨ f“öX¡RǰŒ}ŒvMŒë9h3~ ‚ÏG VNŒêµ`°rË#ÑðQ$Û(F5.2 üþNÄN ï$ÉQ|lú2´³¦‡c‰>Éh;zåFQÇëàV)Þ²ÒÞ4ïFËëßRˆö°ŽÓºòCÿYÌJã8ƯUÝš¾} )`ä¬>¥ŸXäà¸Ý28v¬`àôã«°ƒðüMdž頌4ÀÈ?Ç{£1éÇ%zX\­*¢˜’ÜkSÞƒŠÑqÚÌ6jåõjBжä^+ËsT¦:<‡&sŸø²ÝôS‹44~Wµ®Ú`cêÀÐCæõn±b´+þ;qÌwýiÕí±ã@pˆÖÍÛ"?§ÚUe4!W¯àë2+Yä÷Hÿ­Z6£²m䋎 ƒ¾qéEUP“' dYC3œbø"]6®·bö(j0™)-.Ñ^'Ùx`¥~fÄÙÔÚº\ÝXuJÔ ¼ÖC|€ÆÎ–Í?“\µ´/Eü†~nO³‡}Ñí¥í®á¾ix ¦ ¹1îýp ×< §L)Æï@–9,œÃoûMhÓ± ./Çè‡-‡{1Sü̩Ʃà‹NA.¿¯°\œÝ©ϧ;»Mº‹ü’^×ñV¿¤6žïºàw±>¯cµ|&Ÿy_^A„d7Å«t4òK`Ýñzœú'Îy®­t¢¸cwøYa¥K®x¯l½bù¦—ßL¿;µ z¶Ñf¬%¾o·áo=Û Þ©SÍAéWªÛ„¬ÂÞ³ÏÔ$pþ1žgÚõ+µ‹ZÌŽoš‘Œã´ òÖ°$X¬ho‹Å Ój  »œ_k?~–ñwÊ¡ÝQ ðl»®n`X¿wÜi*>"AóB¤ô”ÄŠ¢E¤d}qû)ÅâÜ ƒk¦-µ’F¸ÃŨ=õ½jd]†6˜‘zWÇȪe‰Îg"Þp]t<“Þìz‰UßVò·Uñ©ÝG–a ßf6.˜?/ëMu+ø0KI¯afŸ½-Öå™%Ü„ /-Ì\A'EƬÇN+þYuØæ~®‘fÅq±4-hcpfãBTJì",Rã¨Û% Š \'8îÜ…þ!ü)2wÌjt^É$=Íà•ÛaòГ^"mövé蓤’ ú°].êë!~sHë©GsÅ{ÇÎyzS‰;m€µloïf’ØvªÇä‡íì%—hn²áý÷~%3¶âF^–½£ÏVŠ\Ñ+͈zŒÓ²šŒÖ¡–9K—"]¥Ç,46äjË’ÄGç iYÒ¶£Aœé—D±µÕ‰TmæR¥j)x¿hÐÏö‘ûdö°ë º‘>ŸHà¤ã>ҰʤSµë⸵¡´®k†Ên<çjÂ=Aúh9FlÞ#̬aŒp‹äÅ•xнÌðc×®häUtð]pÎq¿‘C QÏì=g¥÷‹a¢iÖD,"Wë!OZ±);Øk9hÔ¶!±q8p[ç 4-¾í(>YI04‡Ž”Ji.}4KuÑÞ~ú>,'ÄÀ³‡’9•ªià2²ÑñN³ŽC)‰00víÏŠ^K(Xloù27Ÿ®6luÏÄè3M*Ä0:ØšæÈMo£7Øj¨\!K\µ~ÝÑÉÿ&ÄUU „Õ.„>8E`[¨HÄÞïº]bVaï'H·[jà·Õ{#hc‹cø(ùÊŸ›æ"º\4bX6ù÷Ø¿;Q—îÏo×’|¨ê%×ñ»É" °·ŸîNo±Ì±¬«ú@§…¢òE"ÿW´¡­P8ovZSQv»µSvâÛk¸¯”Ý¡]pè>±qYöÊÍQ­ca±Žýg›“Å5¬qÕ¢ƒôJSFØà¾ =–¯~‘jóˆ‡hÒuðîÚmvBZæ5±Äo*J¶×~̳²¤½NkÒ²Y\\®…€x+ávŸ$‚su>YÐ…»4<8-§\;´/µÛbËQ ‚Ñ&I rÊX¥ªë,¬‚‡}‰ $+˜ÎÈ5-$ÇoUÔà8ê^vFVi]uî§[(ãL£e=­Àà¨6Ïb¦óGXþÖM™RŽ–,®43ŸKÐ%1(-¬“­jgЖSÞóô%ˆµ?ÂY¥R½5“1lÝT­(§i;Â}=Â1G·,*ò´å”M§1Ý-Í¡‡’„)™¢ŸÛ£ ¢F GÓa»)]‹p÷c`¨½§‘Ö¯±]=ïº ÑÅZVè-q{þ¬êXdöå'Â-ÃñÎ#(H¾úo\0¼´52`í\­8¦l‚ˆàû~ T*º‡ðÍ™‰ÞŽg~BÖÆ¿@ÂÉÀ™e°Ûzºõaá˜H‰T¼»l‰Ë`kpKÜ7U ¼¥FY©Ô7ŒG!˜0˜Í\”¼s÷>fîów.% .=òe8Ê3;çr¤›WÑHÄŽ5«ÕuµRÆáð f½¤+% .ªKMÀ¤W]-¢ážá˜ÌFQÏv”Gb{5t‰´wÂÌU޾TžëíZœË”,ºåŽþö~{™&ç~: f( )=Ï@¯2ù‘ÝW _Ó,ëÊòÈ:çUO¶|E?Î Æ5@ñsn‡c=G9o7UxœO ¬¼®¦E7«|s«¼îºŸéÛÝÍáŒà5´÷ÂÅõHùæ Xõf,º ¦î eï€Þ˪‰ÆÜ‰Í˜'i)N#T×í %aVÑäm~•æ"]N<’¨½©n°OyæwÉ¿äö¨I÷x‘qÅŽ~ÚÂlÔµ#ÝŽ5ôe&4MÍ̼¶ÕDýn®§uÑ!¶¹PDÑ´(®ÓÁƒp@Ÿ¤CH¹½ucD_Ñ.èõh'ð—Và–Ïa]bÝò‰‘ÚïeðÏ.ã™åõÿo¶ZjñOk NsÒî€Dõl·zð³ŽõUá>ÿ¾F›³.ËÕD2¯pp(­)ζ]Žº`eËÁ>˜uÚícÌ–úª4=ñ·[Rq·é%Æ©@}š@…b"`¿<*Ê’™‚ƒY$+mYÇ  9`P®7Ò·}Sa̦öó<Õ2H{¥Øn+©JqÈ­,^'6HHóÓ£P˨¾ª%ª1ˆÝV+FxØËðJÛ¼ºÊŸÁê\©n÷<ª¡íJÈ5Y+ˆ @›‘öÇ÷_zá“,vÜ5yÄTàM°o¤/Y™,wÛy™owî"^Ixz Ò!tòfÔº&;LfŒí²°š…º ¬f †·pjÛÐ?a¥ _õïGlÚ amd«{vø`§(í®y[ÕþFô)ÁFµÑPÓ¶ú ´©YMÙ÷¶,帕Ëú ŒwˆaéÈ´™ÁÛ‡ 6ï­K « Å0rù"UëÅvÌ[ !§eMjwžƒð¶$GØgØSUçHæô#‹rÇÞå]Ó»”÷‰í¶¬‡{¨uÖS%‚&¸3\Œcæú´ o韀 Þ"–Õóï¹Ñ'#žÁ. Y^VûÖ¾BïØëQÄÀ§ᾓX×kênwâ§Þ·ýæIdó÷]ø³Öݪ þ}ˆD&ýàd¹¯u:x<5mñÆÇò "ö•,ÉËíR¡1aÍïz_˜ Õ.b43‘o:Ò’zòVŽ%yÅIÚ%”ÖU˜¿r2Ô²dÄ;ö‡G€dVÚëf!sÁÜâ0£ >²_šöÀG"h«õFNµ¯îêfft+‹åHŒ¦ÃN7íxc€šl TUKá,ÙúÑ£FÿM; W°{°°õçåž¾ 㨳S†(I͙‘̰³¼Ú½ãµù¬œ¹=šL#8‡»‰ñ¬Yå}5áX;ÙKµiŽ%Õ—mƒKŸpn¨óߺÀòσi]¾³a5†UÔž»R xZc’'+.ÃŒÎÛÙQÝîad˜`c60ª2Go$Âø¦›k—Ìû Ö%Ü3b>‹.%?üS§Ƶ ‚ò£Jjw>ps§•æo¦½òÜññ‹L=¼ÓÙƒºš)J6Ò;‰À?åB ˆ|Ú*âÖÂEܼ[ç`НÉì²FT©r€nY>+ââå)®Èeû |S—F,m§-:~_¤Œe”G=*hº¦™ˆRÍ•D¢Ýï:{§='(ÙÇ£º{Ê8Ε'ÕU0*è:×N@èNK+ÈA8sÛ3‘]¤ïºƒjÚã‰;H/*ý²ÔÅÜ ê‘ºå½“×»S{„\Y)ޤ)!(šÒb¤‘y—{g06âw™vªûü±Û4¿T€›;uÛwVE_‘œdP±Ÿ± dðÖ‘LÉŒëEVÌ \,RxÌZ¸Õ/œi ‚ ’H~‡<•¶òX;¦LËÝ {Êø6šÔY2OX‡ê˜¢Ë^Ú²¶Øwùøl›à©ís`³~¸¦¸qµ'º<  !,rP±ÄqÕ¯ÌçH€ÊxxOÙ,3\¢m$§Äa‹r-oXkú,!¬k˜æ<ƒQÄyvÉã€u :ÙC¸]†Da£«W¸j¤k] Zï®æ¤-"õáÔm;ê§ Öìç†î—ôºug¯‘8U`$SœÍV«ÉÂÐkÂ+.1˜¼lWÁ`ÔÑëxÓšrêPxxߨhÆ›Üänð€³ÝéÆh‚òÂAI5îlMUöp=žcC°ð a?"2쿘—»Äÿ®ôeaÃ’+‘º‘?êTÇÃâgÈ‘#†ĖV€¼ï&{kÏ|v-m•KÆóLLp©ÎÈ_%Žb_Ifoqr fñ+=¸ ÒéißGÖÔšei ;÷ ÝÆ÷£jéûêJw?ôöný|Ç*Çʨ¨qᑆìki½"¥Ï:û9¨2ûö³D¬äÇ·). ÕUÚ6¤VÈ`¢ók‚ëYël]nä<-QÙwqéua_wœASþK[;´ÖeÄçJ¤ÔÖ•­ñná¾y#¨å U%çÒ_öé—ÈïAMõMî k^O·”ipó#¦ 9'?¿|¾ ñ#Pr)Á‰î&œ1¯Še"Øìæø1\MÂ÷ZvgÙ¨É0— wcI?»]Bvéìu_ƒÃFAm–Ð:s/—g/ ´»»\í‚AÛjœã|¡¦ —ëí$¬¿éÉ’t>ÄŸÃeˆ÷u˜[)ïxüV+—® Vø¾šî·r¿ñ :Wœ,n ” ìxûð`„µ—x«©½S~A zìl<㪒ÚÛ;âØÀÛ»õ«#h•Ó¨a½x•‰Wª(¾¶7#7|€[ƒfE»/)ŒfÏ©qaîòR… `µ‹Ñ[^D3þŒ×lHi1-*¸Wn…®Ï‘¸f6EziãqGAK§ÖÀ†=?H7áV͹tWM•ób²âØÒì3¶nÞ‡v:ŸÄ£ì‚K]FïWja×xrbŠÄ£^„xÒ HÏìLPL W<±BëîÆÈ)Òä8}B—ÎÉÛî^híQÝF8ì¢Ö–©×‡Ì¬w1(P‰áTŽÛH„KÖèb‹…[¾Ì´UL¬RЏía'ÉpngoÓ8Øx(0¨½Y‹]­ÿ^ú3€ ÕmÕW2º›˜¹F^fwž–ã>²ºQ²…£·ì=ºÎÂՓøiRïÉï\qŠ6MgJj$w’Y)ü``ó<0Ús!#·PŠ½Ç¸f«ÃtÚ¹3{¹Ïéf#Ì Â4UOþŸ8m5±âg®Õ¬`?gO€Óz¨+óQ“1)ãw¥Z}*®Î9¯ëA7ÀybSRÀú”àÙLÆ>rã+¨–5è3çfX[tóTû“ûE ~¬À”ŸBJûÙ¸§À½EÎOÜdÔÛ(-Oì›6)BßÞˆvÿ`k†dgz\¯èÇ6Ö¨4vOù“Iú¬m­5rÛÚ¥ÝGÝ+n;eq«wñ»æ¥,¾ìpYîþɦyΣI)Ù07©'ÁCĸu2÷t7sÝ^rAIt X`¤êÏ™‚0+&Iý\aó-[ðs»ýÒ\-˜Õ:C` ±¨Öñqx½A¿V”žÙfÆ» ß!r}•KÜ€gÞ¹ÀCÇn )šƒúÄòo.?õÿýó¥D¶4W6z¤^| &惲`”àÈ)ÃÈ£€†îÖ–wS ‚-Bý:³Í!˳ÿ^æöóþ$ÜGò¡0}@LÓ³™¹å3Jìèm6½påBn1Èï`}+ˆ$RA³F¹gè>Vœš!B zuK°ˆPŒ)¯ÃAXŒÅzv‰;‹J% ñЬ&Qa_‚+™q&¶ó,EÖd+HÐô¼‰ ?`/Ä"\êÈ|â¾+8@Q·UcÝÊÚEጰ2—׆°h.mùz2èªÖAPú`ÄWIÓf÷ç\ªmW¿“9;±ß*ÏGQ$Õ˜ñÅ[£¹ eù?¶»Þj”fCàI†ÃQ›bÍ~  ; ùîâé¹çûQå†ÃC¯DG}RÃΖf¾k}0o¶&2€•[«üaãö[Øþ¨ö³ ~´0ìÔèÙüÏàhž&wµ¶ÔÆâ):r 7óX Í~jkÕ>I­iK‹²ÞmdÑœ~üÔËí£Óþ( T.ÙÊšpçÙªRÜÇ ­Q3û×J¦&É–Ç8›ûúÐÂO¨dÅ9Q6¢#ý`›W²9µ*x Š  É½Lló›„–vYjK¿’Å”Ù^xfö’î]°­¤Ô”ï‰D.ó<+Œk«À¢,T/î£{ª¥FÖõ,ç»Hϰr•ÑjÔbv[½ ×WÜžÏÊÛo‰ í|œ¥–•AkéŒñi–yÛê«U¿YÉÝöêüúÄ ›åwì7L,V…Nëf ×y«Q3ô«‹9½ öd–jat®3÷Qâ_tl“æÒ’™bQ¼ /ëŠa¯'ú¬1¬ù›Û®Ì{šeܧçû))£ˆš;v/Á¯U‘?«Z„–3·•Vú¸~uÔ YÇ“;|aÅP&—=÷tVÉP¢ð)@¤SÚðFó$-åÑSÎ=¥¿¦š Ú§òÞaû›/äÉ¥ÉÖ¬ªB=ÚSЄ•‘ª‹÷®Mù14íO]ΦuåR ‚Ù#À÷úͨùe2û­ýçgówWXÔ4“žvY] ;’º˜—-U܉«•lƘÑÈA³ŸW0›ôXoƒ ÄëýÛ)x§åù¼…ö¶:<¯‰lŽ`¾‚+3Ú)ë0OŠ¿3åÄNž*«é¾Ñ:B…È(yˆ·xwèJî¦ô}\1-ëTBÙºÒ†³@‰‹)ç{ÎâCÓZÀÛ´:ïå>oS`:“e¸µ¥÷)ÚÔê'7Ù¾†g?êä ¯@q·]"ŽE¶Oć“9ˆpƶ¦,s?lhsÂàºÏ:Ð,6ºÜ~% ©ž7ó5»½ëI—Õì [i ‰h¢j Q¿ÃUƶìÁ؇ÛB9íòú0EO+φè•lߣû‚·Ví£O{$ñ/d@4 ¼^„K}Œl×W>!Þ[ ±å:J h‰/vëC$I±'ËñL ë`1˜ÝÀ7?œlÜyµº( •xeœl5aÔ%g#hîäKäƒ$yGióÍÙZ÷ƒÜœ•ä—T,G©†âûAEGÊ)d‰®F¾x ¿Ã=IÁ¼ lû0 P^.脹ž]á·d›¯¨÷û "å+î”âÔ—½³"g^NëÜ€9M±r×!F½b•ÝϼÝ~2^4ÄYE¼"™ü¤ú>æÂ°ë$Ž©zÜŽ÷)áMÑ'v IŒ+UJ€žÁQNGz(´²ÁVK!9(ñd_‡W²²Ùw®g}gIæ:Íß;§Í;V`«Ÿl6Þ5@r}J]`¶HÔ‹È6<é@tY€Y [w¿Ï¬(ÜÙR‚à²X"{<ÀåYW(`ïÚ'S—Q­¬½…,tÛuvïkgØ=ýE©Oà… cI~ÝÏzÂẌ́Ĕƒ»µ×àiY£í²Œ¾4€Á¶ýø]Åé® óp#%•bÙ³;,ÃhÛ~ßÑ’G>ð›ïPH!›¯xBeó5WÌWî6¯ùèÁÅÆ?Ù`û\µ+É‚Äiö’óL쬟üúâNO&‚ž—Ùg(ºåÍØB=¦Kã›LºÎÂ1¢zËfòzM`˜Û]¼mJ õOý0È餘“š‚y%DR)hœÿ! ¢Î”D7CA=ÛÃÌZþ(‹2سȌ`wÙ^ôÅpg¾œ`Ú‘Q<êBÀ·–[¦R/°&‡´ÇÞû`a—~@9°—{}û™jb6=r ¯_ÀNê«éOßÇUQ¾=_†úB´Ãë²*b†Z×6%‚­ÝyýÏ_»9®ÛbÐŽ‹Î4mx×_µa—œÁN^ii¬ù¥¸©ýJ„§=SRîºÛ?ø¦›Ý¹ §_e€†A-#lzô;Êq¦¼m™þ¹Ð³†5ŠE~¼Õ̳ý:ÍØxëè‹\Å;Q¿+Ö2áE½\ÿ2„%Ö€çb«ß3»òUoIAfS·wœL!\+;{VKêt¼‰\F2ÍœêÑJáå,ªˆ^Îü¾ –ñæ·7§c-]sJáluïÞJV'°6«¶:#êéqL•ùåBòŠ÷0%Zvj È‘ò³!ZÝ/Ù(uÉ­<Ÿ-c™~‰ÛS(ÇÌÚ³°Ý,BZ)à{Ó?­Zdò)¯”-­6º‹´¤hÇküÍÇJæO³’¡•u„HµÉ?}*wÊÔxNŒÚרf›1‚šk€6›T¯FSÝýzZUÐ4?Ö©qZwPy¯%¨r‡¯Î M~o^þ¹÷³‘WíµKò ±J¯ø© >ŽaI½<¤âº¶åNV«Qâ’PÍhI0¿‡>TUËråù¬}GU·+TY$“Ú“‰uE"õMǶyO‡[¶è彄0ž+c¸}=¹+9Êc=îʯKÇ•óeØnw36º~wÂÞ:F¹³?iôœ)ïÓ2ÕÒŽ­SWËÔS–côï/£.Œ \÷ƒÑ=š…àtÈq$/Ë)8’Z 1ºü Òå( ÚŽ‘’4ØO3H3~)ŒØ5Ë#T¨~ZMÎÌÌ·†ëÿ»ð¤VS#eÊø2ÕíÜˬÃ:é/¯ŒSj% ,«¬u%‚­{ªÈxo)ËS:ä¨;WŸÕ™ü¸[ð ¸6Ò²]ݺ¬ÍNá´g_GêÊa€mµ‘m]ß³¶ƒ.9Mu;ŸCp¾‹"[1•ûÎ.ŸÍ™+@\ÎÂNžg5§ç£ÕSdA$ëèÇгTÏÅ•zÅ™Jâ zrH{f|xnƒ©¹Ùóú¸O_Òý!ûƒðrÁý©’CòÓ0!vzdÙF.!#r-‡“vs]éƒ1…³²IÍqz€ÜáÞ a[£ÛwÁa9„«³û•Я˼#z¬n¯Cr3#û×CºŸÂ™f´ ä40Ý‹UΜ³TÉ›QÏÔ©F;¶LÅÅS„•òÌälàËR÷)×ßþºg“ Ï`ä/óžcœRõ´O*ƒ)quv=|4»Nlyl‹ç¶<‚ÃÇLêqV6b?F]©ó1ŽªŽœg9p'ÏÊmËc‚¥£ƒ's©Ò‚ØïŠÂ8Üâ$ݯÖJ¾ö°Ð)ƒ6¶åj ­ˆõ,‘z=\Ù>-æ†<"Ö åMÿ°:³îK¢XÙÀ2ÃJ,µ>.Ëå—¸& c ¾æÍ~v,¼Ân@b~:¶C1üy Ï¿t3¸Ó…á>ökwú5¸¨óè¢Æ/Í3(«]gn»Z§š|J×OiB„¯<öàx·Ê%+ûÖŽŸÏ–4ƒ¾=Ö¶ÝÇ]Òu#¯AÉŠ¥î¶Ï@‚7<['—^eeͪ`ñ ¢à8õ²õ$ØÌjf³'‘Èîà¶Ô+ìme¸Ë kKD$ÕJîL üõÍgø~ª0ßÛç$qò­½á›3y¦3.SRÊò¶\­»šœi„U\[6F°K"keÅ”»™ËïæII.yåüAõ—ÔvÚëkÞâ‚>ƒ’Ö ‰gs‰•½v_Ã`C´Ù˜ÍE…GOàJð³v˜s $¾dØÑW¶9î'}T¦ÝÞɪW1|-£K`ˆÚWÂZá×Co¹Ÿ\U;ñOÄEvvû¾þÞAƒBOuÍÞ’(·ŽeX“v-oËu²^ኌˌ€,ªsp£*´v%þRxf  <“õyÁ™ü÷ÃðY~CB3­ °Ñ4šy<ç^'¥›n(C† Ö‹/{ÈÇwy937hfÌqï¢E!yYLNÜ€(o¦awrªÕE9N‰ê’*)+ÈͳpƒÛ“A’ž¦ sÐŒGgi·ß³¸™Â²‰ò¸ãäÇ‹õÿ#3ç×í‘Ò€l»uûoü7 Ù~8î°ÿÑÔy£¬RÔÚ·½¯žšxÅ^&ÚÊSgvLÂyý I|{ìyaƒ-8`ªQEÖí1ãP'¨‹ÇÞ¼ô35 a®­²)?W;äuÉä`³e…«bx9(ÔobÚ…LP‡ðøØ-ÚœÉÓ#ÔŠ}·¡È}Iºç:,?‡°$áæ±¤G‘Hݨrôù¦«+ªÄ:ezj‹r‚œ=ó³Û/èRfAódå=>ȼÚ[)÷\ǯÚÕ\üI²Âc`…mK‰n8>ÿÛNÏô+)Ýn,_®°™B¬ØQwKZ¯/ªzuÅ)À´1²[ùò¶QvhO©íí¤€ØAÛ±df¯ðöO’XQ{iM•FÈôݶy÷~ÑxþÑJO>ìÁø*–Õ×wÙÕÒd9Å÷•5\$õï@¡ìÐ7ºI0ø³Âã2É8ÝŒ%%µ‚ Úzöî^5y£ö\éZ¾ÔhÉKšñ”y'L*Ħ©O¥Çž¹è£{nœ"ÇÍ&ŠôN±í”´gf“ò6Ûw¯zÌ—]G¹bŠcå=ÆÛ¤MR1.)nº0<å¨-×wŽ ²sq‡÷áC™¬ˆZ²×ΕïjÏ´a$ÇQÌé¹p ­²é‡³#2Õ9sË;å½öY9¸c°L]²‡-Þ´ò.«ÞO(…i<Ôo[ Ïžú:Ýíi˜‰érdsé;àt„5™½bª¦yéÅÜu›1(_]DOÆJ,aG§Ë$žöltÀ6šu£3ˆAÍèlŠÒ$P¤ÔmÇUˆä˜w¤8Eâ ú öè]ü¢4V)ûxø¶!b¡€tšZÒŒ[UlØÛtUBêº|3úçìÇ/Ëþª‚ñ±DgÙ(à#4îG©D•dÐfÖÑ ö)Û k`JHbrWz™À"±ñá6.?ããÎ R_ÆÂ‡<(¿é.èõWŠ<ò˶‚ÄolÜŽæÕ¾[Ç4„õ™ÃîÀú1êF9 ôBp2ËÞ¥xIÂ/„–ZPÌcC„ü´´SfÐ&½iü1+/#2ü#ˆ¼Õ)ˆc—ÌËjÏöôÎnÙ~s*Ç6¬£˜W¦³6¨H#‡ôŒ'*±/pÌx5z€_Gï¨0} ÕØÀné|×Wj3[ŠçÁnFöçáëƒ'Ï+¾Tê"ìCŠA¬ÙÅF‚Œ¹²› QðÙ—Æm÷Þ!©Ì RÈ«nÏ‘ðÙ©XÍÒo_ióvÅvoÔ|N—›ÚqÜD²® ÐS§7lmßø1⥴q®Š•4 þÌ>?¢>è÷Èýb+lJÏ),!iL É~áäÇÞ·µh=%´skÜm…”}%L4R¹Ayb#ˆe;òâêÆ9‡#‡–ù{—úü:5^"¿.6ðâGDéAövðH&ïÚè "î§„û:fŠxï®Qµ¹Â ‰a¼ Ÿµ=Q“/)'clO„~jÁ«‘‡Ù¤ön¬†ØPƒÅÛõ+¦ÁžW6a+1TŒìžˆmù¬¢£9š§VJ¤%Z«˜¿¦!WD¦Œïxj¥aþfì0¢u—œÍoaaü’ãò½BF¬ÍJ‹të®Y)îÖ›Õͯ<ÒÕM4 ¥âûž²fæsk§¬¯k—ÃŽÝo:öŽÂl¦œb«¦WhÖx5¿xÓøÎa?ö ›ÛÙâùÓÅe´ïÇþüoþæ¯ßßÿôõoÿðÇßàXíàÿ¢fÐ-|`4 Ÿeûí‚'J%/­bn{îäµDGË.¶Ø_V‰ “„›]WèÿÅãºúYöxÕ4Iá0™d‘{Ûƒ@âAX¸÷8l&ØXº¯ò ¶DOÒH ñ}Òö) µïKaœ«™åkßËoá2]["¥¨Jô”ª6;¤kgÊz(Å2¬$O izxê´Æ¦™“d}Ȥj΀PI–8c–‰pÉ8rÈÔÚ%’ëÞÝá¤Ô¦å¨×áÊªÔ ð»›†Ü¢ùËZK^2Yb\s-(QlЫ˜ÑùàF´ÛýIóûwãiÁ][í|?‹XÁN±Wo/8>†èR?‰A““v l.¼Á~²È©*®@RâˆkèCªVB‘%ué݆¬Ñ]Ù³!,ž,ÄF{´\e:¼Ü¨"\ Z³!DË'ƒæG²{jn‡·U]J´ªŽc0Â`d¥Wì.Þ¼c"ÍÍò'îî‹Ö§µbòŽ`*Εg°’t_…@­ñh)c0Ÿ·T2ü¶‚\ââ!ë)aO¾Hy›0Lc'áBà5¹½ Y"c0Ü )mgR$a(|Ù?Qés¨©@Ox½•à:©œj»˜áÄ&AÒÖbáì±´Ä/èf¼¸idõZ2ئQ©+tñÀ׬·5®ù|£C r¹íš1s¨Ö… ÒÑê<]d»~íQÝZÙM?Ž0ÛãÞJ*Ëùt¼×z—€E}šeNƒ];¥‡p| 4ñ•¸D‘ÜMûË#²´/賨Ñ^«äòmÌ·‚Ååuf&ipyÜØÎ%M¢ÚÙI†-¦ÌÍÖ‚Kµº£6å’¸ ]Ü»‰ÍsD?’»¹&¸b+µ¯ùy¬_—S(àÄ kN¡nk¦t²§X°BÐY˜Tš#%¹£ˆû\Z‘ÍzÞ‘³ѱBnÀ^âkŠ,.Z¡Ü‘¡‡b¶fE:DXpãÌ–ç%îÀâÛn`Z[Yë,qfÛ\jÌ{ÁWD&@C—.ú½ŒTÍ4:ãwÅB8ÕöóMdžÚš@kwÅäPÐþ‡`•Qr\•Èfq·-sçXØŽ*ÔaMÎL$#φ˜P ¡3)€ûJ|Áæö  ÅZ†uB’o;]šfÉJ/ƒ—RÃc¸±Ó[c qÒ^!¦ñ™êÚ›Êô‘x÷zÓó¨ŽE„à “"D¬*‡M‰Œ²8‚§N –]ÚÔ¡Ñ{˜¬ÎŒÞIõB-y Çžá=ºeQKPs yx<œêí†,%¦·w=ˆmζe©…k-&­V¯åŠÍOpÓ˜S¨ÃqMD'cÅä* ªÌ¼®cùÈ(j9AŠäDl&¨R®;gŸèøf°ø$íöã±Úí±”kHîªÓ:'ÊD•ÔÆ^äÉ:S§Ùô­?‚^.ˆ­ÇNäNÇk¥™³Ú™n_vöSìMåmgzØ¡;ââëhÙ3jO€;j8ïšþí¤?:¥!!POƒ=ƒNþQ‘̰»zqèüfÛ&w¼B$ªêk£ ´Š¸9–å±ûÀ2¯>\í:´{–ÛׇcÞ†1ø²RwD>û.”EÜk¤7âꦡH¤Æ cƒèàÛOGA±§ï'`šÀ»×ÌVt¬íÍ'îÏß•´ˆò«Ú¶¼B»2××^̰޼Mú5¬8•;ƒw{ãIàã±ÊÔ÷d¤uZ¯ï˜_#Ë܆ Áùu±h§&æ}ìBöƒ2|i«¡úN¸ Ë\f·ºQg°I–˜ó»e+¬_i*Iö…îœAý?Á·Ÿ¾ÇwǦ¥ ’jÓî®eàÖÔ,4ç2¸‘öDê6U«`áaP];e0ΠÇÛöñØjz.JcŽÿ¢|,Í¡Þl\½é©ß;uDç^%ú­ YŽòðòC8šžÇÞž ibtg›¶fƒ0Ú»QÞ oÑi¤WÔˆêïí‘Ai€(øö“Ã×pxØJû”Kwº W ŒI‘½`§Û•oÕÛ=w!xõú Jt´=EêSEDxôÊ3Õ;AWмªÏäS“>àB`#ƒñ$;ø&œ[/#rÁ–Ž>òPÅ#©]/J¬±og0…<«[T,!ÇNUÚLDH˜™‚o?9å³Ç±É ¤áPõNXìž©¦>?ìWæ÷ÛÞ˜™æV 1%’o[¶Í§üž³ÒÇ’Ó%µTOÜ÷ï˜ù¦rì$/sOšIxÃ6b±ÃÌ0›ØAS¬³>Žm <Mz{Mï ½Cœ˜bº|ù\7ê&Lºân^XÏKc ´¶öK¤6mC” ¥ñ}L^|WÌÍñ]ª°ŠÞMw{-¶:²:#ÁIûN{ß¾mD‹—òX›r·»St'Á*ÈXؼèUÞ¨Èl»ïÈ™õÿaMd'‹ZúÄð0:Ílëš2½Âf8€QvI mÓ‘|UX4@ì[[î{˜‹l„"µIŸ¯ÖTBX3$F«v•ÝVªñƒlÝm\“§ÄPå^ÎŽ•,ilÝ6>pIì˜7#8—ïÂHi*¹·ïØJ?>Wå®Ð¡Š ø„ªëñ…”‹%nŽ1ÀdµãVÖÊ`‚r˜÷œ7?Âêð\Ù¼Mã¥5rN¸ìs5Ô>V7´)£¶[UC›ÚÙ=Úô##b¹‚AÒBPÏ‚±öŒù@&±?8{´Vڣ蹤JÈàÙëbûrJ¹RæYvâ«0¤X´¬/ždŠ·Ÿ~1llÔ5æ–Ù4òZQ7dÃòk qÏ[%xË!bÜàh!IH2¹€ÍhŸTíwÒ²Åí ´]ÈÛ£y=o\–¯c—ñ4”*Î:Úÿú*iÕõsµÃc²Ôõ¥Ö‚OŒAC¬ÚÆ=íi/‡gé§AÒ÷\ÔÈe'Íì ª‚öÓÝPhŠ®²Œ»úâh‹üE­@f[;î€Sf¢qtœ/‚"¦€"w`ÞfJ?[Út}_;ÁmÞS’B¶]ñxÅ| TÌém2¿Ñ óñ!bçg¡©J—ÇfS]d¾âÌÒÊwì»PÔ6f è TÙ(­^nøšÁ1I*"SCîaK´N{¨,6ïífwã¾Ï´ò}xÞº êÏá¬~7  R#Mjºîðt1»Å¸Ã¸•ÊU8è6—¢)ljûÿ¦çQm´óX¼m9¥Ì#_Äæ¼[NEÿùÛQ|UQÀ¶y¤(žAÝåϸÅe®™æöûJ¡Z$á!û~ p-²*Ã2Fxé%yq²5g0ˆ¼ôHU]”Oøò®§éAìf yŠêZ¢½¹<¬0,ñ}L„—õòÄ'Äaxéjù¦W-ü½4”A©RÛþ\có4Œ ’ë.åIéQþæ ïáÈëò8V@Ú`Lç&°I³,K鿦ó-©[N¶Æ7­KE}Ê»9èÒôÚÆjæ %À÷‚=‡òC¿ ú)£qðM3»y!=e øå £ftÀ–+nâz¤á ¤ëÒµRtÑ{ˆ†F‘À!(~¨‚iC~ø…™œÀÔâ1„éû•Éøî>Û¹ùFÝUÖ+U³×•2wCÍAWÛZBPÌEÀò8«p™%5pÔ£u þA·wÙ°®i•,n¯l»¨x0ÎE…%&ƒ¤Æ¦>K¸€–䨱R-G,ÌÆÚ¶ŽÐ?R¥ ù­š ƒÕܰê Ó¹">µÃ.p4»þ¬âµŠÁ¢épåÖÍaƒø°ŽH9.]l³™Úl×–ïÐâcøX7]‰ïi2ˆ ›(N79‘û»lº•‚‘Ã1jH"èg$ìQr[Bß…¼ Õ}mi’v§+¶ú"fàVM_Œî4OŠV2t²X¸6û¹ ŽçF$ë:6ÿ}ˆ·~O0Éà"ss4”C;üéÙ>±®¤šʉ.sÜ¡$êLI21l~æV–+3s5Í+häXÃÃ{z±Dh1W³#BÖ|P½99º{Â{ráUPU?}‡ŸŸÇ¶GÓSúT*­à}®ÁH,Ñ’¬ë¶å<ü‚u÷%(ì~î¨pÝ8Ó®ÎE³®J¾0í¦‚#š'€(°­Û¶P¾3õQõBX õ ÇHq£-­enD©ãXhÚñžA[GK¹ &9CY)PX ãÖAÃ÷î¸{{gMýØž OY'p¸BWÌqr=×c N­ëË›“­t…ÏÀ‡c‘ƒG?î”6‘ƒWy íˆè‚³ÝiÕf*¼†ÖA Î¥Ó"8oΙÖ³&@‰ÖédÞ½fìIŸÊÚÙ:g=éÈoÅ™»Í‡ALÏæ¸=Ã`7ÑMñÊÇv©žT>A+Ê ¼ƒ³Fâ¸)cÏ©ºª· ±oïÒ³{æ„ò¿pÊAà¦â‘N¹Tÿª?m?à¦ÍOñPvûUaêJÆVO° š:¢24Žø:2~f¶i=Ôêu¨l#Ù’_<‚Øg«þ°ï%µœt·g"^ÀåàÒÞq<º…ç+&+½)·¾yœ×Ríøê,Ì–J÷xS˜HŮܪT;÷¸-zLã䱂 ²žs¹… êNGSuNYÍÒ¦úŠ"<—«jîm`q[\åJÝË©ª©ùŸ˜ØÎ³ Í*T û¥èUÐiÂâ½B7çî®ÙeZŽhÇ{ è(¡:`â¹ß§þT½#"¨^B«¥è$75®ù¼@¸CïkäÆy¹'×Ù.¾,Z5©ÐP¼`¾“†ˆà*þ*'jˆ T»³ë k]è’c{ÛaP Á¸žÔiðÇóJ;N™ Œzº)wb¨5`à,±G :%ÊuS,b/ö@ûÆÿ{Wa’Ûè—•báŠ5Ÿ݇q´.YU¾†dñÅÓZÙcA¾)²a–4^ªbhº¹¤¯=€ðRR'ÔÝšÑ?’ùþp¯Ã`WÏ."’ le–Ѥ]Œ°k€d¨VLU¿!ë´iÂ:Éæjf°Q.I$҆ŠáÜ^7¾3æmÛÕüÐóç/Õ"‰Y±&j, W‚¾EÞ-à´èt1‘ðeÓ$ÛÛ-#ñe}ûlµ«¿’{ÛcšÊîóË…¥2ºwõL=hDEá›öß"Ä‚#êýwÉUN*îTïÉÚ·½Én´t§à!T&¶»®¬¾‚è †©ôO³SSLá¢#Íœ‘zÚ9³Y©(X/|£§nù¶ («ƒn7ÞI Æ“€Ùñ³aqIGôI u»\J$çЄXÙx`© V¾³Š¼^›bËnR“¡Ö "ÅÚVM€„s)ê"Aþ³QF=7ÛÝzªã˜ ’ù¬@Cuâ[ôÙ‘³­v’¦ÏÊ,Þ©¦‚·ë×´Lô¸ÂÎáìpoÿ ½T\êÄlÙ[|Å…4NÇ#",Žê•ý\@‡о’$Y•à 9k¯t§XȱFã´D•B0J­È¬‹õ}(û6u³§n˜Ðߦ°8rû zÂÔJnú BH¤³¸ý•,è`ÇýùÁP¡-ŽÔ™°âhn¶*¡±~Mgô£¬,náYÖ =û6²JÅ=¢QÇGФ&†›7[Ê¢Æ0çîç4SÒšïzDÕĈͯD ¡«£]MÏ *ðÔ;-dcŽâp7yWíEóˆðíd7LñÝýª“8®¦wÞÆªÊ@@SçÝÁ¼Ãýóc¥ÑHt9ŠV ^ª>Ѓ¸ý®¹J"d$ÚDqû4ˆNµÀFPä{ ˜ªh5ÅDúôlV˜Ç·ÁÛ]{×á”ÞÉÁngº+.4Òª[òéq‡@`MJç5. Úí+©¾3é,.‹¾0hÄ6ì; ¸ª¶½/ O‘”<ä&$¸pí8Îàrî°®Û‚1}TAàõʽœT9è…×å€ǾÖ1A7[æk&ˆz…5—ñR%`”wXnÝU š\agÛ•J¿úPŠWª&®ÃXÝI‘t±!µ õÓ†%äŠ0€éŒ½*G½O?óA–ó‡Ú]™ÀðTïuõfÁÁ7çnrÓvÜAÓ#«ñêb)€%=˜weêÓ^5M.–Ì5b€’Õz³Š¿«ÖKÏàyìå–>㇙y­%Z –`³AK¸ßi]ƒÛí#  áàÛOþ²’Çvc­ê ,Óc€µB¶ï‡êÁÚ¡cÃOÃðÕ°OúNI¥õðEX|·•’èÝ©GdsÚUOÜl‡gk›éý8Túø—²Ä9Ýkï ÑZ•®ŸÇBv¢êåN3«‘Á ÛQãtÚa’Ý+\tÚ˜“ƕ؟V©ˆùû¥8Ìh5PYjQEm“11а$Xœ&_óƒ%{Xš?—#5½*h˜Ð¢VŽUÏ·êßOÞXÆ|ý¯˜ÝΑx°«iK¤àÞ±-rÐ/KñûPt1µÝÖˆ2Ì9íŽÈàã0±æK€{™-༿ J æÑÎC¸õþݱÃîˆó(•ϔئtÕ½ó=ÿ³g¹¸HÕ‹±xÝ;q£ÅýˆÜÜW-›­%V>´8T3#ÌVøz¿ÄÅ-‚H´®’1_Àó›Õ>޼¬.5ËÁ®0]’Üÿm¹Ý¡œkló ‘6Ê*YxØmã¡Y:¼ÜŒ'¹úðrÁ9 ±z¥‰˜Šøù—GG_SÖ뾃G_ ÞD}+ƒýö¯À+õxt^®âQ¤üuS¿*¬ª ÎVb?4Ž›ÚMN;ÄYdFdÙx&n»›Ž‘~˜W¢‘#jàq`‰zØ98ë—•~®fm¨Û_Ÿ„{VÄ=í$ŒY׳¦öâ"Œyö[·¿É$°™]†£'[†mx׈]“ã;wè·](XA«"ZqتB Éâ©^ÒÉ£=8 ܇,N¹,µ‡4@N‹å…hU«y $ >’‚™*TŽ èÖ<­DÁø û'ÐZ ÂÊN°ÚÄÞeHI^×`Ly=[pZÞÃJÍ1×ïªÇçr&B*ìÍó²x;·Þ”=جª¹»ö0‹g¶ëSó8óÁêiÈØ¡'Áö¨$› Us«‡†nRŠœUŸÖÈ©y{Ÿ„k ú)R­È„¨ 5"ú«ÚC¢¥†ŸŽîÕte3Ï~·aK¸¤§ìï,ùоžÑ“êÁ`уÌ& gÉêi¬äl²Zýw´¤í# jù(tM5¨ä r5—ºþÙ#ßÄ^xÎó%ÛÇpBMÀ]é›÷aÔH­ŽôÕì÷÷û9³£‘äÕåîæÔ-[͈yëýwG{Ä‹îÎð¨Ñ±MŠ–å:Ümö½K%(ßÁÚ¯VrÓ¿Ö±ê¾#‹^û’ñààròûb45‰(y?½/,ÉÈç,f‰ÒõÖ…‚¶Ý_¾b7mçoãr¦'ÞéaOØ7™à:Œ©#˜î_Àû»Ã.=Qÿ¢)o'ž­`3i…›š8ƒ‘¤Çb/'ƒ³¤t=–†‡lôJ´¹>Áa6ÙæY_ÁvpiñÖïRÅ¥dý”{Çêåq·s \V-¹­’÷àNzÌJQð)+aÚÔ)PòM1‹Ëº«çÕÎö.$N=ÇG 5”ÎMêœÆ .“®-§j|vT§ßnFì'83 AŠ›ÊN‹;-×¢îd>­sð»Rާe4Ïí…ó˜nWް3R¦ø#ùIiM ™×ô>%½÷¸ÐsÿʯB~)L² ’’L*ô´ÎHÆ¿ºô1Lô²4‰ú]Aï܆În‡+t îD¸ô(Ó³ð¤$J:¢È”ůîVÈ)$=ïO pÍX3´î§|w%ú9Î<ûì³ å`½ÝS„™fÀÔ*‘ÀØÐŸf N¸=3ëÙÌ)maN¾1oe»²]D<Ü8Ž-.=÷ü÷$%Gl]žý•(’Íå=À†¾+kÛrr6¦Ó¢íEÕË\÷ˆ¸öS«ƒñmö›=72áà"®ìÉG¶ú1uúï/×–Mbê¡úœ´Có5•©ÅãSé6‚§ké5¹Jͱ'~²ÊC0×JCl·Úþ­‡ÍQ~e>šäÉ¿ºÉ,ì?ý¾8_Ó~…Ì77­ŸçÂÒ#¬¿2_ôe)”À÷¬ ,N×/÷ÉÎWMOíP#å㬾5MDÐö Ìå"Ä6ˆv(öçÕD0’¾šëd̃³èC«¼bpuôßÏ¡©˜Ø³SveF+Ëÿ÷AãF„…η€Ÿ$´@kâÔü‡ ìÖC⇀léfeÁó£àsðM»ÕÊÙ/]!@… ®ågjîü‡Qçå刳‹RY”álzö,/8*̳çÒ5ÏÞ²»½‹Šõ×ÁRo5ÌÏ“I—v‡´u¿éØ#ÆoèÇ&.HÑq»ï<¿ ´8h[ SNÌcGNF¢-ä¸ê+P;U 05ΤEAìüˆT‰Fø\œåó²þû|¨¬•âö3jŸ _蛇Á½­ rÑo†Ÿ³$ew—]kX(¦þnwwÒÿ ¹U-aCŽ<†‰Éè¶}¶ãJ×L±Å þ3#øuf9ò0äs^ÔTe¨!–ÁŸ±0Ÿ°o>P§$7rœÐ.ããã…àòµb{ž)ñó^‰líiî´žzÞ¯aº ©qm)Ò­jUÍßÊtg„曀-›:¬ôS§©·'”×Cq§æ%IY†ã»Â kH1‚NŒ´û ü†íìHÛ¹zMÁßFe%{œecXW–ö÷!Š^©5Ä3ØàtcíÛ>¤ëÎä8N“€)•ªàp»|je  Öelîˆ(˜ÉG2¢Bi›Ž DRmú¾[ûPoµ`ª•ä]¨=—Ž?YÄÑ7tÞ·¾›ƒó´º¸RÁËöB1AIR¿wˆ1Ú³òéQ$’9u]m‰˜`†/6ƒ†ö¬G{Ë*‚ƳµaŠ ¼SôG6Ã&>i>Ü’6Ž‰Ïø*KƒyÃû?ëüÀü+±ûÚow1¨ëƒÁÚsyŽg²1ÜÃÌý¢Çýš/#ÜÿÎìh¨;P/·Ã9ƒý”$m{q[á‚ÇFzø¨¬çÆøX¿³Ôie&:±ˆÎÔíp›7‚ R§n×ë"cI ÐïºÜŒÒ…å”Ç“LbiW¸ÔIMfÂÝê?†ÎôH‰žáéc•¶²Ps‚ÙáÛÊ£Y_¦>+Ø,hb†ÃjÉî.1M;kr'I˜5åÏu‰Á|F ’0{¯Ž­åò˜_ÐR]²Äræ30|VÜ¿Àd.!žlÌ:*#åaÚŒðèß[ݳ8Kb„…#Ê^sPj…ê¥63t· =ø 5{"R·ºÃ‘r‚Å;ôÔø~µÃâµ°ÎRu<Ö8]fLåQ®aЛ%´ůÝ@7ö9·g¾ƒðÅÎW´÷íýÓ¸ åþ­äµRð ÖÃÊ8Ç=A©ç®mZŒc*û̃XŸrd–vÊúJ=âv /5>ƒ;ÄDZÊÈçé%$ª9ïGÐg |˜áâ-èiƒÉ)µ$·ôzN©(Ûm¡¥n´â¨>væuÙO=è…®ôÖºSxý2þ¶¦}„¼ý¶Jýã¸×l 6˦¬Û^¤ìÉþ»ãòsEÑHÁuÄwµp*hüaßþAc[ËÂR 4_ã:BÞ—û‰©aëü)Ë%W2°ô x¿NçïN”kwKÙ»2sAÏ.ýõŽë PÓ{m+yUŠA8©bñ5a0éæít†™Y"GÑßF™iá„KŒt$p¹’^C¾ó¥ !Ö/mNFvßQíÕ,¥*W= Þ§Ä5(ÆSœôxGðñ´§,æ Û âà?‚‘IŒ4`ГeImÓ4ƒ\j[nÜt4DŠw5{ùZ~Õò r»×§±wè­ ÿìÔ´ºûžnH¿SÂim¹}ØnTpä\>ÏI &FºãÊià!’°_iœb/qY9F/óc ØòꆴS‰í MÛo¶cÅ‹‹îsT~¼^»ø_Ñ®ûÿåsý»ÿþõÿúO¯ÿ€›÷ë?ÿs) ð°õþ«¿]³dÓù–ëW}°Ó]x¥ w­æiBÁ¼Ø/qt½E½¿ypÑsÊØ¦çpŒ–~<«ø`ŠüWÑ#Ví;7͵›@ ÂÊMo ÑŒ$ ÉOZ²tqÝ3PmtÀ`¿°<Ç] Ùø ž« þ ö‚1DTâ*ÀÚ¡/c¡ý-‡À3ˆcMI¯èl:vé!8ä’Ç+IJ 0…ëð¥Ë­YûÄ«NØŒG7ÔR&ǾCÜÁ[†Lã’oѯ56}Íg|`Õª:´z#¸•^W´OžE5í+†êcÇV ¯†Ã´òweŸ‚ÁÝ:W¨+îº}m±AcÐÛ/Þ§LÓ÷¼Õ!c9(%µ›:TxhöEêýå<+¾pØ2nàÅ»:C{æ[þÀ:ÄfâViºplº£ñÚÇLÄÞó~Ħ™ß¥QžÿæÛD‰&ë’×^’ ¿è as×[Q—‚\}÷-„2`‹£ô·‡É§:7=Pãh˜Dðîãƒ)ið)Çv€gÓ ‡]‡èNîñA—lY§gd ýÞ\ñöï yˆ¦ÕRÄç…é|Œ€o=.ê^‚\3iç<15*Á(—R.|* J9°I8¸»Ù0üiÆ¥öM=0ô Œc Òpêí ^iYrˆÃn†JE~ ¶Ä¶­!Î÷÷ü-‡3~p©?§ÄÄS“eçØ;ØiØBßtåÌ¿˜Äë6JqÛJH¯$Dnfìô‘÷X/U‹¤l¼X,{¦S#Î"èp{¸S/Ïâ"2„®iáø×Í¿}ô•ÁðÕ䑽çÕ›Èc5ÄeE&P(ˆÑ¢ófŸD”T¶UÏI”ÊRÉVåI TÑü¾Óí‰ÁhFe°ÇRëÝf4)æï m˜8Ö¦ÈÊãF×O&2ùñú»"(2˖έ¯Ã²ó $Õ´Ý"éÙ㋎†“@ìã§›}²Ìg"dØo²ÈËÇK]t(aÑòX^šã”ëy@iÊ9u°µ°`»ÃIÊäÝCDöE„¡eÆÁ¿­`QŠGðµù,:3Ý}¤V=O÷1ëÜõùšÜwÌV[8A U5\ÁmÏ!òÕæ]û!ü5I¾ºÂ·½•9BÉñ]ŠGŽ[ä`øÅæø¼[\Ãlæ-‡ˆÎxb-1·¿†ÄÞ¥hã¡ËSÔ‘ÁÒ 0½ôW>ÓµM‘å.ó”qߪß¼­¬rÇž>‚^a$$§§¥^ªZñ¼c .;ž²xÞ‚6‚ÅÚÚ¡¾ç¬að‚v•Ú‡¦›8‰š†AÎC]ÛC¤Î¾0¶VBÁì¼›^[q´@z4eÊÁÐXE³'vìßÎÑ…0=º×‚*„3­Â~‘Õ¼æ<€Í ¾^OßAb•—†¦T9±1ȇÊAV¡"åøbÅ/ÇJË.\ L²F£®ýÂî´DP=¾­½PYÒÕ·€j2ñj¨ô5*¶žÞwzèÖêæ™-Æ„¯|IðØw®¸F!HS‚½ò²V¾¯ór%d°õAËCð•DÊ–ÀüYîD‚^ÉšÁº»†•ßæöZì«^CçÇ'tmèḗ–Wàs~l%ý† <(ý6ÏI° mžr3=žŠp޽¾ZÏÜ š3‡#¨ÉÁî.,[*/‚}t?üŽja "±ÞªtDP«‚š4ÚÇç ³xѽ9“÷‘z½º—svH_Ôz~ ?ÇmdJÚ3x/»äÞ]; ¥å›ùî¼>½ëömI* õ,²(x†à$K]rÇR†gá{*k4ÌY¡E–ù`ðA(o­‰ )T—P™:‹m~>º<‘!fŠvRùs>÷ÊŽçÉò£#·šbü:Ÿ.[c½&ŸË·Ð ?™^~9buÏ­:p9Ü…9ƒ·úíÜpõQOs3ð„õlp¦–Í'íAÜc;Ãâ$÷ sZU.ÀÓz©!•€zšVÕ“0¡@sÛµJÎŽØ5ÙÉbàÐëÖ‘ôÆ=Û´UÜ¿K¼àì¦%¾„¾Ü ŽPWxgðvhݾ…øÎ.v‹Ìª…Š{½íÜÒÎVúRGºÚWc„fQ%z`Î\¹ˆÑØ?CpDm_ø_VÙ#*žÕÖfd×úìª=fµO‚f¡Õ¨ÓG°F®ÉöÜ3ï`0,ÉÀdåóù@|¨äÆrÿI­LæÏèL߬f>6—)1×jˆ÷Ë£MSƯ,+·UV*V{ßÂny‹çe½×C_¢Ã{­¢;kYÄ̰U–íl¥¨Àþ }â/©PA¡(oµj¾·Í7´Ûàÿ·ÇØM¤?/ùÖÇ&Ü}¡_ò·¸Ñ`Åöù\Õe¢þµ–× 2hëÿuÎy³º]ãöE½³'K]Ûñ¹ée™ŽíéÀ^•i'Â68yì÷ÛMA[ D9Ká¸‡Ž–Þæ&ï+ü'3¯ö»Ý H{¢Ï9'ˆO»‰áÓLu±š[ØÊ€}!zàIÜÐÝÖ…-R ”Œ Ds0K«Çµ °|Z¤ò~­ŒÕ-Ùz^ä3Â7ФéuAJ’ÖÁU–‚Å ¸ƒ~›ýªœ‰z#‚ò«¢”P³ÆØy™©$+Öšú:¯‡ë>Û¢=îiEØ#¬t§–3m ûJ,å±ñ´Wâ gœyŠÞû´¢´ªÞŽ–íL2s0ÂM+U_ ëÄPW*n̆ÅO¡ÃÀð tß0W›´f×`Òø£^Ó)1°„¸Ä€\q£ëÝ«5UÆv?'¥º<ÄzôtŽ‘š&véÁ3Šàè›díÎC¤ &ÚxŽÒ‰<±(Õx¹–d{ài¢± -×ÕÝã6¶{çúrКZ+­ÝÙPw¨+çòQŸ=8Òï+6Ñ_ò²I ¥KwósžÉèLµú²q'%ÕÔ| ꯋT+6˜¸Æã>ðÁ=4 Ô´Þx%йårŠþ׃Ë{þ|t÷Â*3$!Ùp¡Hü—œ7¾>Ÿ2ÞJ µÄ®Z# P×OÝ”Ûåq[@7~ù•3ŠÁÒ¶†Ns“kÁ¥ºYá¶§‡˜{éíp{ȽBkzöj3¬ÇÜŒ¢»/Ý=|^ïŽ_O±+iùe¯´Ð³‹îìÒ®.DÐ,Ms•üh€4aiØô°ËN !£ø_ç¹½ò:­¡ÁIÀeï·&FëÂà&Iþ¤…Å{Þ¤+ì(ñA°èðP´K)k‡\±w*Þ˜é8ì·0ZÈC!ØC¾U)x¬ª½Ûzæ+‘0G- ÑB63Ž&š«ÔNx<8¬V¦¸%¬ñ z¡Ñ·ÿ-Ë Þ·HÉx–…_-¯–iʇÎÇúŽ_¨.’•­d½<¤*-ðÝ‹UŒíÐ÷žga•;õ´{uubŠ‘æ_x Q{¨hiˆ^u 8¿àŸ]Yu\Ùú5rÙÆó1̦e"ZÕ¢±©;KÌŠ¶PwSˆ›W¸=ô@û—Oâ¶3´Y‘îTO¤Šòôi.˦Ão91¶D«ÞÑrYgΚÃFh(ºÎŠÅ$üö]ïûH8iDÅ:‚´·ãSB߯ët—<-{/Ó™¼êjhÊæ¾MŠjjÎå ö;¸ b{cˆÙå_aû)¬—Õi£ð J$k5!0}ùšËj*m ;Æ’@ßrÙm©Pé†CX õfg&M^ôîé<Æcˆ"÷§yZz{4{oz8Ÿ!z)ðÁÎÅßmz#i¥?˜œÜv>2éEp[?2×þ4œJÇ=DIsF£LÜ¡7~¦ð8ƒ»<‚oçö…&ËÇ£å:N¸bÀ×ò¦q™í½åóbÑÆõ`)Bf!öéôš‡¼³õyø“¸°K®Dân024ìj|oi8/ÿ£„ÚŽ[A§Arö]—Õñü÷E¶êW$dz³wà÷wúSH«©R'c¿îmÛkÇ b ªEAMŠç8‰2Uôz?ø#¦ËVù}Ó€Ó)e,šQ¸ŠKêÄ[Ne4UZ,7JI³©jCnEp]û1Ä5‡JTö¥¦³®í‰,d‹EOžçE.2ž:ƒûGÅIâ¾] …“ïÜ:Û¾ÙZª\vWWd;Ï÷RLóî!­<ãð¶Ây©ÈåVÖAóPŸ…Éæ©„…/»Ïä[¬/Ž¡õÞYj±Ì{¡\ÑúúÇ MÂOl³ˆ6™NšMRø@&P;tO#è’öΗ¬oÛ:¾ôâ-‡qí(9rùèÂû;û{¶ïBõee  ƒ*>pJ‹£#ØÊ=c ¯‘XMòØ!cÔ‚äWB`]Cˆ=V2i éœU#ÔxGw5wÁW¾Ej† ŽcXyÖ@§ãßÑ­ï¡ña{5:p§>l¿‚Þ¬Gkçî­m±ýqk-7Ž£]u£–\6:–GN‘øÕå\¦gñcJö®0Ãë¢â°å)‚šÖ¡b-•Ó3Ânw|@_e¼5xl§÷ ‰´8E5´…N"-ÄÄ0}°˜ž5@×JÁG΀»œÈL’ä]_ùÀ‰¨§t;ÕºG{œ„,øÀ™ê2ŒD"Uñó)·CÚ¦Îù<‹á/d û§çÆÏ‹7~)‹¾ƒœÒõ|Ö(SF°…為Ã94b׌›lÙ`X©« O‘^ÁîîÝVÖ´òù¼5¶þØ€µK:v‰êIéý1Âkmz®ÜÃ…œ%®pIü¶7‹áM}þÖj| *žîjžiÁ×&S1!mŸEµ.þÏ9£¨ï5zq=B …t ¨b=ZûDEE#¨(!Ò•~G1tÆ#Û³;PÓ:m#ãg ;ú¾«h*¼méG'Ç$Ïàƒ+r°Ä¤ªÝ/5r6Õ…À”ÕER{fY¯^§4ô7Eh}Î`‹‰ ÁP½CЫN¢-W8–¨° ^)g÷`ÞÖ“e}R½_¦?ó1™dqz¾ºäH_Ã>À-/í²”ó]_`]lóޏx5lh é7<ZA™ ýmMz!wjÓà°»ßùñ<…€ ©Ó¤,‰:+/¥P„E-ü œÒî:½xTåÔ¥ÝV^JBp+dšž?µO6›÷‘e½ÞÔìè7š—féÈÙû‡_Á´™H¨ót§ÍwïçyyÉÆ×òÞS¯.;zwW‹ŸÛa ‚²†0,l#¸¶ƒÏæá‘}ÙN?Ý -pà£ü®(ùbÃÞ>ô÷Ä~ÜØÊà­­5]ú4Dˆs+z}ðA_ú@×ùÙ-yQoéµôø!ÍxŒä2H\ M P †Šë¾?²Ø¡at£¹ùMKCp5Þ͇‡1A¸ ôçïhÍ-úIYÆsxi\zÜüÂ[úxAh¤å?ô龋1(ã†>¸Ú‘ÔÛå>Q6œw4=¶9÷KsOåÄD:§4•³Ê>½é—E‘‡`»a¢-aU§©v»éèåÙ"#î%Å+qâCÕÅ¥n$H/Þê \g×jŽ¿Ûl,Ëíç¾<ꦻe…š_U‹uÅÓ§!Ft¶^ÖGF°Q‹¥×ÇÕ„@MXÏ­ëtyß*늟õ ÷ô™“R÷Ct‡^zî}èðxw°u©ãÁfõ×’XK?âƒ4} YÖBçnΦ<ðÑ{ÍÄæh¡ÌY¦|æÆCpoyö=8C/£kŸÝ¨îxäf3g“º¶­žØùò:ùx¬LÿZîªÙe{?Öffx˜'Õ2º”S—D"ƒdILûc>Ò$Sê6 Ç'BðnEâo¦ïô¿þ´I¯Ÿÿ»óû?þü¯þúßÜ×Ïïøúÿð§ßÿÃÏÿPþú‡øíCûô¯þþïþÛ×ðØûûÍÿøÛúýÿú§?þîÿÛÿñÿôoÿã?ýæÏ¿ý§Çñ[ª¨…±ÿþøý?üÛ?ý÷øþûßüö?üãïùWÿÓ?þ‡ÿëŸóçÿæ§ëç¿~ýßßýóOú Z©—ÄNoþïßýæøÛŸ.úè§îp-CÒ½ (ò:öW”Lµ†ªËþú§Ê©×Ïÿóëÿ÷+ôÏ?·Ÿÿ—Ÿÿwýüøâ¿µ„½ö1’Yú*!]¡ÍhM  ë¡êNÉé+Q¢X¡Þk»ð*Õ#߀bK®ÃÈBÀ.ÙŒ)3Mt/ 2ï’&2ôãî*úáÿ³-9J$3ºJg“‡Àmöq">?w‹-÷ÅþUÓ¢ éEÀ.Š÷›¥¢ƒ8¤“ø]È‚xò8ß9m’íßöMZѾ8ç:<‚(X¿f-ß][lŒ5%_!À‰¤¦7ìÇ›ûöÓ¿ÿUîýÏyÞ~“;b˦\QÞüš¼NÒùLõ¶Â‹>++}ëþ”_•”m@¼²‡Ô·Ëhß{éY¸åqÌÙj8sÞ–d—ªÂÜj|~|0óƒÔí] "³Ô–iÁžçs~ÐÛ°ìÈ>,%xé©–7£Ûlw›ï‘Æð¸wzäzZ} H¹ÎÙÕhqMvÄ0c†]Ñ®m˜ DžÌeežÇlK­¡ßƒ×è{·yþL¡óA ¯$| R6 •ÛçÑÝô:ºþÂY/Ãd߸ŸÊ/õûˆJãkwj׫?^mVŽûüñþ .ßQ¯Œž÷¿ìÇ_,â´P?>¸îúñÁ#‘e(‹é­üðSA©@*Á´Ào#úø·šýˆøUŸ,³Ö² àC6 z“]ˆ‹å·¦ Uô‡QPóÀRù@ÊÚ+X¶q¹¬Æ(!B91 Šz)3!6Ê I³PŽ6ÄÕ: S¸1Bq” (þ^1¼…°ÑXì’ÉÎRʹ"èTÛ’ßíl¼ÄÝíïöø«U*X«ÿ»VŠˆÒn0W‚hA®2伓Жrã„'AÛj1Àš@SÄPo­*oÆ|z½ª}—¡ØL'¥â¦ÈÍRèH)ƒ¬Ì7¢.€—ÎöÊ L븉bœ¨ê5k³>[z¸á;ä§fˆ våCeÅC‚JnŒÏ2¤¨8'‘hè +²3Þ}jl°!TšbÙ\쨘P¨«è˜×Ì^1QB ÛPºY0ñ!>9‹šÎEÅʸٕ†X¾ê3ÍYAȱÊ(èn×™9eÍð¸Td¿=vÎî¡_¦‰‡M¦B3 ·%{»œâlHh&jt¤¶‚º}ü}Éúh”K@ ¡ ÄÅàp±Á£™ÈßgsI8kðµ») ç:0dÐÄãV-­%éZ⺣¿ŽŠBͲ<ðr¢¾³vA oêSUé*™Ê;&[ÍúSoüÄhAâwB1Ë3sS—Š4 _z°49îQô;Tõ[!ÄGܯŸÆÉè&”ΜD]tZ)θNÆË¢9 åJU#·WÍ7&< s#t#U qþíü´mÔW°»ýÍÀxѲ !›&ïdòf¼‘ÓfƒpOU©M–îp¶+ÿ» ë!l«6‘åÜÑoR*P¸¹•hŒÀåyB{×f„£æª’ŒœLÓ®Zh°¸¾ _0f1Ý1i'c á P9áÙGÀ—&jz|}ÅVÚ/»=—¨U̼<ä™B©¨¬J7*ñH¢¤·;J&Ÿ£¿Ä3”âÀÂLÇÑÊPk `z€Ý**>¹Q {Ò<`Ÿû¸†è/~‚ð[ÿ+&0KèaNâ¬@†Ì©r ÑLd vº­® ÆS5i“mâª#ÍZÏU»½Ö ±²±bw·/dlJE0…rÆ:?ÂÅâö3/¿¢ãRLŸ¯ª¦àå&j!a|’z½:Yp-C‚šKµRÓk™^â<À8u¨+Ëf£Ëó¸:`ü‰³V^{WÖ‘»Ð0d¬oDTO4,“¥ù¦oÒUchÒšìÞ-ÝÃQf¸(–÷§Xœ*›I^ˆ9rcÇÊŒÈöu³¿WÕsú_*ºJÿSƒ Å`ô÷ÂtIF»y#°-øf•‘µªB€r3‹S mÚ®åïÁ*Ë;>±´ÂXÀ ;Ô!Šïä_âÅpJ“ßWÉØ»¨¹”Œî«5W¦ñbu†¬.ÉZ¬­]„*LVbjÀ—WÅ3…Ô=¾²"JÚè $¡‰[µ@Û¥×1‹ª;pB»EcWÜXì€[ûnv·Nôm ¬wéÃMRr”7Ç4~FÝÓVUì"Õ!EÏô*Ynñ-U‘›À°\|Í8›'ŽéáƒîX\z\›ƒ"€ Öµ˜X6‘æ±ùWkÄ‚ÆÍ |O&„¬¢Œ°ÌŽ0¸p¸þ¦a=Å„›ÕÙðQ;(2D®|Ä©å¦0…S\[³ ICÖA!2ÉuEºn<8ßäO<H-º×,…Ë'•¿J²áà¡HâÔ~¹£Í\"è% r/wnO¼˜ñ™õI°„ÉåОâ•q/Ö–‘eòª=n'4BÂËE˜{´´t¹hˆW!×ÉIuûkvÿE®¿‹eÜK‡ñ„ŸF]¯YDÿ¶­÷Ý­_dÄïÈ¿B5˜j•sºr…êÉ@°…§’R³œœ,½!z­dÞé‚ëθwÉ&žØø,ß®½t\hÆ€Œ ªæ9Ÿ"ÖÌ`ÒãÀ–­kº*^Ï.*ÞÅ¡0Ž)‹ Õœ=®»x.\!A¿Õ*GÀÄ0‰À7]ÉÌÖ9”«T…š¡r]`¯aÖ±W~2årŠcÍÄÓPÚ@åï]ñ½PEl “ªœVɬÎ*eôM"§Â7AdÁh˜‡ËãBsˆ÷Ž6"e ØÑ·£4gU±‡Ç7›“>ÉÚøy#¢S–ŸMƒa×ÝHt1äùÖ"#+¬Eó1IµÔ‹Ö:h³ž˜ PM1Ý(¿ø·B CJ˜Z ”­V7Ó€JyÇxºÌŒ*@¼É­ŸÓîö¯LíH ^uPgp}þšfž¤ŒÅ@ãå›â ³‘ˆ#VÂh‡u>7Wl¸¸R’å ƒ d€>TÄÑh9U¤ Ÿ*^s«0ôrÍQËšS—¦©eñCBœ¦A›¼e34ȧ«E ÐU͓֫r.„Ù% ÂhÍÍüõïØø5½_4+jŠÜäMâèAy=š§àQQÊt-ˆ—Išt±«0åˆ^xà²ØùQJ^?<Í&¬Â²jªÉfÓCInd}ˆÉ¶%UÈàPÊÆˆ‹a1;yX£øE¡…Þ­÷aý5¸±3èÞ«ÃS³-Q7/¦Á äÌ®¨ß)} š"᡼’ÕpàÁ<®îK1aÙ6oç!M¦CÁŽ#jV> !mÀRýLŒ)¾F䥨¥Mû4ÐÓè)r`Kê¤É}Qîr/ æ¸TvË<|+´nð#ŠV_,YÆjÃjSÀg‚4{³ï‘P%¦À7¨ÚÊQ¯”lŒÖXogwCwv•¯`œ™}üüåb_k–Æ v‰žØÚ¼‰nË"zÄG(pü–m%B).¤ï£a²’F“Ì>S<>U%;f]jŽ„Ó³Ð½1—IçƒMT€´cx»ôí²^±Ð-w3ÕÙ—ñóøüØNkÊ﫵µcs'Ú;}°l·ÈñâÄÜÕÄG*¨£3À\°óxp40õ—l ‹pÇ»i.ÞY.Eú»]ïvøj3"»:9DQ:gÕBì³ÁRõŒêb‚Àâ)®éÍe;§qît{»d©mÕ‡ƒÈGŸš%Ýïf¦³@úÆ—»»ýƒé&XžUö=µrÕø%°@eó%Þ3lXp0:æ,BÞ+”Ô`’@¾s pI¶…p|+º¯†"k^RdømƒGÀ•×výn·UÇõ­œµ)ì^Õß*Ó²!8ŽƒI^à~Œ‹…á9W”É[1,t6sä$”ÜÚ:êN¸³šf™b¯¤ –B’ „k¸­–àSrD[“-Ú2¶Õ„£³•A+¤îQŒM|jóK ]-jÙ—ÍU´»}qÁ fddo{³4j™YSÞÔ lm–F!º³á·kÍÒˆj%×䣚À[2¿î UØu«oBŸÅòº¼J ZÕC\B…fB†":¡¤s]9éÌÍ×}í'©@‚ R7Á5’"*R¹Ó¤PWp—è¥CïÉÛbÎhðJwÍ®»T;%$#8æ•Lª*to¶9•‘‚."ý¶ƒ/ACÌMŸøˆÕÓªwê´Ö‰^Æ…ð/Ù‘¾V£'¹9ýFõlàøš„J8Ê_‹b½4ÍL"7š¡;´±41w­þ4ëÍ6¹ê—hìBÕÚ«¡¸yÆû‚º$)ipFM+¶£u+·³µÑºi1ŒÅé ö5/›­À´ Ù6u9   nÔ,´Œô4ÕÚRª±1— @ѧ\ ¥ØÞ¦;¿-- ÝÚ¬KhÌð/8°µYµŠÛɵ¶6k£ØÆ¬;±zÆè@›˜ÁϪ» ¬™MÈ´î2cÔ n3á¼$sR‰» nùr€¡¦˜ ©ïCü‡ñ–èo‹žWYˆD¥“P‘“kñå몡#Ͼ\V6äU—ÇÃéB(Ó„Q+? ¼ºn‚ãôá)¹.ÁÉÈ«ÃA Bº,ANÙ;«‘ZÎÐió2èÈÔ<å'#f´{Ȉ·<›s³åð7ZåRM"ÀMÝ·k,/–- B¿MIÏ[L|·»’>Á°ãÉ@ Œýïe:‰1Ýh÷`Žeñ¶ àUcP/…¶‚kIBà Þhõ„÷´e…,œ otCŒÒ ¹–Éõ¡Ð¶.æ ¶¤´$ñX^D4°8o öDiS„`Å>¨Æ”åŸ<„ÌJƒˆWuˆõÃÔòaü½<Ýb*Ï #»ôöX«ÆÉc–Ì$ݪÅàm\6jN›%šmÙóZІ–{òÖ„?ÕíwþÞÒb´µW·»ýßpÊ» "Ny´ØQ3?™©àaúE5ÕÉÙRšS7-8¢ëV“«_xQúõ…WÏÎmQ?=7OQ˜¤D~¯åÈL°¾K׀ذԋÖÁ€—I!tÕ4jñÌS!fm]8aË?ɦ¿hž`1¨®ÙÚ X÷­´Y_X‰§þ]— ›o€ˆ/‹Ø|}ÓÍ ž á›ÕMWª~y^Þàmq0Ó'ÈêY-?­&ž$¬sÁß7%z²©ñ÷ˆªIX½Ô(ž3Y½0°˜>CG¼öMâžRåÒà*ô0…¢h½yo‹<àT ñüs0¾ª<¶‰YYõ í”ÎV¿Hm*ü@|±v%¦[Cø 7[͉fE QÏsÁ£œ‰`áKœöJyH%n‰#©mJ“%!8´9Ò®\¼s £‹ÐÓYR|>©‰Øóc¶†¨"#†Uš0zãõoÞ7c¹PÄ(ƒp.*̇‹öœ²‚WpVXET~£¬Ää3z«\´x!KùJ•Õ¨ägU¨¢§G P…뀖8W7Î%úúbbª4ÆÈY…‹*O¡Ôöø‚@WívAVƒ>Á^/EèAÓVE R =Ú@:ó=r³·3‡/ñk§òjup½F+Ÿ6§ìem:g´XvT€-÷§)z3¹¥>XåðGr-‹‘8ˆ­Òíj-O3šZÓ §3²œ(ïÔ ²tÔc:+‘Jvþ6wjÝ»íUi{Nê%+¸±˜m´ûdRt<•ÕîŠC†""HÄN W‹qägõ®á…ãÖlÕØŠÞ£Æˆ¢n+ÑnFDd:ÐúÎsÐz‚j)ïp±IÀ›Ñ 3Á.¢«¢é§ËÞÒ•Õ–²11Ug ê{q Ü®~xºÑPT, 4P94(¨öÃ.ÊÌâ—Z¦€<}á5gwÕC%²$0u¢ aãÃßݺÐ6ñ¥*þïrÍêÿ\Ãå§÷c€/«Àó¨Õaeb‹Ú³ïJ'kCñ·ÊÂ2QyEñ&"mAä;PüÍTÛúk”uqI¦×Ö‡E¡Að̃fÕÚAÀšúB<d.dÄ« úU8¬†›™QG‘ t;UPš«t æÁÄn\=Ä ‰eÕE-ä uíQÃÌbàªþÑž¢ ÖØ¡D¹Ñ0 •„4Ž›îoá{4¿²›0×xS™Ù]ÉZ¸kåãP„Óæ›ÎN7jÑÔ$§×ǪeS)Àu¢"® Šòó*ãElè{p¤‚ŒÆÝ±¥Q,f4À]û+í­VUÞ®öÀx+~ìx­Æéñ‡Šm¯†Ž[\yÇ`¦PñæâGѷܫΊ}8Ÿ]³¡TRËþ¡s¤95FœklbŒ/Ãëæe{ÕFµçFû¸˜C‡˜­·NÈÒ=ÊŽ4 Ip#˜ÄRªHÜÑpA8쎎?}&Ìì„_rNqy:A.öïWå9¨ƒÎ£û W» ®TFiª¾neê”<´@Ëxð&ûô×&‚Ú…›^¬ Šm}…x¿´ÏZ©ý%þསõÚµ0š-•½©ÃëGbËž>=2â¸úRߣ°–J‚r"ü ÔÑh›âx+$íäu$#UãÄ3XÀOn ëô”isY=a%t.ª¤G@ÔÞæ˜“•Þ2Å ’Ä!!Ç.­C—gǩ˲YÒ(4elÇYã‘_®mW5=¤à•ÂÅ´„¢nk”m×V|…,ÚH‡8¢×HP‡Dñ×äP®ãä6W.Az›ã^Qƒ4&ºfŠ’ô6ÊØ7¦Ž‚ I&AÑ"¶A ½¨,`ˆs2B“—xˆLt]ªCJxÒ*ƒ€ë¨—ã°öBâÐ, 9˜¿‹ƒÏžÒ8sí{å>Ø9Ä´S2¢0ÒëÐÈB´8sQ=ÌjB¾­(Ó«ÐÁP €ÖPI5ìXT½ÒУ$­ÓpŠ™5–=ä¨ÉàH'}+W”Áœj™ØÜí-€ëdØk¦ƒ¹Ê0稛>ÓìMh.ɾ³oÊb ! q"ͧÈuêS¾„€þ…÷Ú§‹!šR¥hÇæ^A¶Óx£,^“A@ÒÃÔ®ºîÔ®íD¢{O(xA6ÈÄ)›#HSé,˜:êhÈ­s&dÇ:”=•Åã¬!Á6‘ᥣ„3ô VHש0.é6ÄÉøãÙµå3xÆQ_¼Iû%“Ôbº…l’ŒO&E°3§AðŸJÕ[K}´5këó ¼5Šˆb2wP³\d[‚±2ou;_5Ža¢©±. aòàXIJgÅ¥ŽzÆvN• zèY^lÔ˜C™¹ðY Q± [­%,¸Æ& !*ÚÆ=VåHIƒ ÎËIïƒqôW±H¤mÊ•P8©tí€Úå¯ÙA—_ÎIY:âÄ1PPRu  3©Éè}Ôi£Üä ÛJaóè˜Þk1Äil¬DƇsÑŒTŒíœI 2$PA9“{\¹*‰ŒàYU·vX>ƒLxåm©;Ì’X2®Àß„bÊ”¾÷ð|Ä "äLn2¾j®ÊÑd 'ÉdiTH 7eibV›#ÓF›¢"„2„ýºn—ð#G¶ßÜú¼qééî䙢š¸”oMSqÑ Œö`±:»FŠX ª5üÚ…Ž`G3¼Ì8KóäΫ©^· LNr##0)9K¬³Ü„KØ8 8™“¥)-—î©ñé¡AÆ{F¬:ÎÖ.Q”Ú¯!|¡8m4_uerƒ:†ÞÒä«ñ” oÄ»J÷JRÄost „D´HÙ $6Á&òFª’kñBÃ}ìhLy£SgÞÜbvàI\Ùnº~Чµ ™ªMÙ9‰Ž¤ÝH%ôbªvÖg¤IÛ±EeUd.-`;¢T0p#§9¦hcpº·GõùI»€Fýš“æzx×'_CÜP:Μpl°láèÐ _Ì”w™u|M¸H’øâÚê£">»¼ð$æ­Ÿax†š@) ÏY™È/”ëJ5 ·o ëA›¢ä§]ŠGÐfµ£c„h³ÝRP½ê·É\û8Ö1«„˯ƒ~ DƒoD}Íc©öP.¶Ûp~S:°*£¹tÏ%Ü:‘íÛó5óM&„CmB¡ÿÞèÈ '&„ÊŽµûfÂRM³íeN#T@Ý!ÒM8¸`§"…@Eáø2gjFÚ"ižRžI­QEDÊY’ØM²¢¿ÅDÃÖzÅAYY¶+3)xD‚¦`òš^ 3…Aߘf£!¸#€ÌÎJ8ºÅÈIaA0ÍÁ¨öe„PVÕô)^…¢£‚zزRÆX.ðjUq’ C8u=Ø”‹ÂHÅÕI›Ä&*†`Q¶á pGÕ¯)jŒœAPQwúUÕ¥á •^Ø‚/Ž:lR²Ð’²²=;:p‚njTáB‚IV\tåqyiTraòbx ºxÅJ÷Ë•—òÍiV›í³Ò°c8 ™Šª|1›Å”>‹Ä¬ŽØÌn(q¤>Ö®ð$ëTXÐC͆¤42˜Lº ­ ªÊ‘ÕA6ðõgXÒnQ<šKÑ1¿ˆá+dWðøé*“I÷z ¦)œ"€p¼ÉI?"+U8¯k…œSc²sÚ™–ñjf +gÄêš*ÑIÇä·dÍKq»Ð±ÚÝ×Raw ïœ:4+Ü$m9uô¨v cvvì=¥ô¬ã•+Ÿ‰ˆ²¢G‹{GeßUÂAùÒ8˜­$Yµ´X-¥Â}¨õÐÂCãh%v \Ò CÁ‘®Y§ïTàRaý¼ç´¢_¼bN44#Q×$¶3N¹µ}ãäcðƒ>båKÛÞ_ôØ2\ñÎÔRNì!Xiô`ÏTõÂLM¶Ö{n¹“‹ ÝmæZÐ’+‡÷FÇøÄÆA»î+ä¶Fl}RàÄß]ð3qu º·4½ÚB|Ðqç­OÑwT"9oŒ±”»¡váp‹Ö3Ê·n›KVT^‘—}d¿™ïŒÇBqgñ}é¸ïuȨ:³[Ü9®F  ÐUnMnœN6;—¸Ã9„7˜$­ñ®qpµÐ˜ê²"–܆Ô43³Gý±ŠÞ Û›| €ÂEeudíÉé&2ð-ópf¤7"n}ÛqeKËÇ øŽ¯ËfO˜\ƒ; R"ŠÏúüØš‘Æ>¸3s±4ÇÈéÆ·Ê Ù0Õõí’#v€/ÆU Þtà׆äÐŒ™Óɺ¢£¿%($CÜ84‚Y¦¨Cƒ›WE¾Þ€¾A˜D‘<ì ÷³èþ¢›…P'"K­ QpÄs•-µ¢üeˆ ‘6§§¸X+kÚÞycå©J™¤fC$Á[NlDh²äQ”Y̸ȧM‰2ÙŒ«{cMNÿ —‘q¢Dœ¤fYDòá8=Á¨¨Ýƒ÷U2±U‘¸hUl;[0 «!ùû@)'³ÿª1Q& –ªîSüÆÄ0õÙãͲƒ#$¶¬¿Ì}`BÈŒ->ã.<øjÎàj£/`·VƒÓ¯P|0„ "©ƒ«.wÆíuÐîNcá–$Ç¡ÏBÝ£„;Æsî1£Ã¸IªÅQ[—’ ½ ÿ°«•ÛD~~ u/7Žëyg*ÙdÚŽ5#âc š:šÄêTeȱ‰¶!Ç”\4ÚêXÅø†q_Û÷6B´qä æd™‚ïkÅ€sJ_²qèÚsG6O!6Û©°k°=~éÐÝrˆÅíÍÇbjsžsåîMøôù+ONêwè!­ñH³ùwTÆÓ7&1 6/yoæz€Æ-çeö¬C4á¹#À©%ȼ>f[„ÀÊí¤R¾2#l"ÚαiÙYkÜiQs &ƒu2K®kJêÉÆèðЬ‹tSó "±ê›WÎ8XéÄÉe׃5‘‡+;t†d¤p‡p¡Wü&£§`·JÊ«í1TýEbãIõ°5zÇ m‡™. Ífxø¨a.®Æ×”YW'³UF!n&šWÍÊ3c²Ë´?•kU¥©u°!ªÀ5fPWDøZ”tL#¾h,H˜x³¶­,Fmë#}Ê’ ¥ÒWÙ!êнW{{žvQKìT¨0S†“ªT(q+^JÜèáà±7J•ªìÔ pJÓ§E/B à”’‹M0e³rª®ŽG}Í©;­ f:Iå’)(ue)Œ@ 6W±d+œ)Ř]]K°}'EÑÜf(êÐr>Æ¥Æ4-n…÷°xXœÚWÇp“vÝÑø ]™"˜†A?(/¢Ô^ð=ãTVîУ¤ƒÿ«zѵÆ7O0-O£”*f¯G r“æSQTˆíÀíéÐ{gÅž¦j¬.®xðÚ( ¦ÏöfKi_Òå:|ŠßHµ*_”4&%• ¨K¶ ‘²9ê=ü,}šTíàÔ)d—Þ` ó]ÄôÕÁWU5æM¸ FÒ—Ú{šFX­ñ‚}åh ¦¶^S[Û°·›+CEÃ.qöp°|ãšÛ鯥Q½ˆtMªé ú)TØW;ˆ×W¯w<Ú¸6wD°Žkå§4ƶý×üáŽbcô\T'–ñK!D°!¤Ü¯jUý=mŒ \þ%¾HŽfÎßR× •;v,ðïôý5ðí(þ³šÅG[ƒGyÃÐ2pì šögMgS·ÈµƒÊpT@4XJž0Ï:äÁ;‡Ï"=zÅ‘JÂ5U2ć^íl2šNæDIƒToA¥:i߬!N[¤ë9`ïÌ:c嚪 j/“R ³:°1(-Knº«Écñ“\ùò8¸sìàï¥}sl‘ í§Ï‘ÂÃbgÀìGGµ¯ºö0µ¯Žn|1ÎÏ  Kê˜+«Q\ˆð s¼XLj R‡«ú-(Ç< ?œÈAvkõ>OÇ©¿]R6xøsS»å-373‰ô-Gtdãc ŒÜIÖ'¸ü˜m¢Ø¯aéPµPÃóŽ6uÁ^rc¨Ë!`i²™ƒWV çƸË÷ˆW- fµÖu2üì T£ Õè)5ÆS$æ1V¢Â¸ÃH³²ÃÊÉZÆW8lª&àÆQ(ø×e¶\šàäÈ›"û2+UM*Kxjú‹‚õÆœ ÚŠ>Eoy óÓò’’ä&øfÙÖèéú•æ¹zŠyšr¨Ú5’y ÞˆR‡ò F Ó òGg8 þÈdóve¤3²4 ¡²S?Œe'¤tt£d½£`•ö_ÍÜNÐ$Yì,°@Ú*á0ubLU4ŠI£ÖXÓÆ3ݽ§{¶›|êÖ*.¡5â·X ·gÛIG=v]’aq§il4*€×UÔPîê«ÀÇí)Û ½Ê%éMÑ–këœþ*³¦ÄÌQæRç"ùdò",Y©– •”b‡ì¤5¾ÀÛÓ:Þ¬ì€8«¬Tê» IN?äój[׎§Çl…×$â0qQ‡PCRÇd> â„Ö’ec^g-_L¼ˆºþ²NØh*Ðòò(®½Û 7Èi\µ¥PŒ¬á©t\M§Ã0+|‚*F®ÞÔä*~™ý¨~Xv¨TUl^ÃhƒþÅüç%ª[¦újîèȨ‹ ·–ú¢ñc½¬™zÂk‚—Õõ(7¶µ­mIËÝ]I;Áئ#\~l' ¾ ý9Ê.•û’-w*#œOEå2OŠkÖ•Xí•òŠZ„ïRÚ G`òç`¢BØ”]/~vÆÀ¸6Ý1IâÍë8ix)à•­Žƒ¯9†Ã°¹«FðNØÜÂ%LiAÂÔDǪœ‡ì1xíÝÃöܵŸŒ«æËSÞº*LX;àÅ®DÍœ5ÔFa{¡Æ¹è£JþR:¼QœN eøh–ÆDškGö»¹µªžÊ„Ð ÈrGz÷TSªôµÍˆ"IúI­’j§1WÈ×s“ §Lð^8(ÆÃ—*%î˜UL|-ŠGÔ‘í­THu±ÂïEökeÿæõåæifMî0a¾T%ãç4™b©’âlNœ‚¯s•¥´uMEÂÊäð-”±jhM:Çš½š¦§A’òiÞÜLAŽð‘€€ÌÛ #ów²Ž^*¬å­"SúœxdòåÀ†8É8lSq|kÄΊi„.wéT{3Bœª(­=ëÈÂUÈZ6nñ”ÕÙCÒ¤q*O³ iŽvGœÌmÎԣɓ`'Cðõ&ÒØ»(Vˆlu”è(‡"ÀJoO[—@Q(»Lň]œ#Þ@QWÀ&>ÕKQyX+ƒ4É/¹ÔY‡ >ñBiÇVp'mú:‘ÖÍÞ-\q,œ\@ÝÔ†„=5fhaÍ1Û/‹u„ƒM­-j4gÚP£œq­ÉD3@雦¦OPµAâQìòUÐ "œJEo|GI(¶K–ÏV¿L‘¢G ‰"×y§dJ¯4Ï•UÜg$Âc2"ûµ¥yº æµÝf,çÎÙX=Mà½e–ÇÌò‡&T$¿Ù‰h’d­DR Öj j¢8 ëì!­rƒ¹ô¶?§ ¶1ƒü¥‹©-ÑóX­J„ãÒû B¬ªý jL:äŒGªFWrÅE•ºœ«ŒuÉP ®´¨¤£ Â,k± 7b;¦‡œtˆ™]¨Y©")ý‰_ÁX$§S{ËÊÁ-™3֔ݗ`í Œ®\Àôe3ê^Þôȵp(`×–$ƒÉ4Uœî\ U/9éÕ)ÙJ‚&¡G¤êÌ„Œñ]fäîP’l‚§b|WùÊ6}ú8-¡&º&µbÒ¦\AŒûšªX\CŸ<¯¥‘c5²<*(W«WQ™X7FJ+s²‘Ë65Ç”Lžx†Zƒ?@°ËÏlÃEÆTÓE™§‘Ú¡uÈ”y;S¦ÀUH;[FÍ?àŒ9”Ѩ¨ Âox×F¨š8Bm5 R›T¥š=Zm<2pðšñº‰ÏÐÕ +Ekg2€ U¯öÑàe`”{ØRFN"ÂÄâ¦a0Ú™|ä[ë‹)$Ѐ»SxDS*ݳQCžöç`#¬ìiD’´®žj[‚×;£²åq«ÿ(ÆÊäÃ(r™uË„0.Õ 9[óÂ8ÞV{;\V™kPyeÁmkh»O=¤0©¾&YUTÖ³7:D&'èµ{ÑœJXIÔ¨¹VTëH8°ªe-Ú¡jT¯–°/P#ä’œ ;d:æú"Ì5ÒâèˆÅ÷bÓ¸§˜TÒ/#¨¢uqÙÞ|³ 9ë £5gƒ£ Õ¨œ¯êÚ)ŠwKpýi.Þ ÔáݺºÏNõ<É%tÝÎ<„ €ê í1LC(/+íó"-ÁªR7ÀÊÁTd›ÄZŒ¬ÃuGh‡ó k_ü²Zþuùkè`ÐÚ"ÖŽt*^92dM¸00eख़˺v¬Ù{9ÑÚì41ì^ *$Ù„D·6rò ‰Š§Ñ061FÈ{ŽDWwà50)±©#B L™èígbf½mŒbÀSù[œð‰ŽçÚW?Xt)åÊòÌ{4:Še©üשg1='G™Vä®ql,:ç…äÏ ]Lªàlz‹ZåNË—ãô<þfthׇŀm±a˜¸9½hüZ‚ÿÌîßçQLWõ¤Qð mF¤®Ljmœ’é,–*8Q^ÇV|Åʈ‚FàµìýÔU7 ¦JXNΦo[—, Ę%ËÖ8·»”~©â@·Å‚¬r”ÛŒçoŒ:‚ÃÂ*À–Žd^XŠ5šA³Z|ÓÐò«"l0;zn:Èú nÞ´ÉËǹê¡!²ËÂЪJKeuY ¼UZŠäxµ29αk»¤²QRàW7rgòì´ñU2vÀ|…ò´¹¯^Ÿ¾9Û•sU›‡ƒ_ت›jòÄ‘&cùTaán SǤùЏ SG€Ý£*Ÿ&¾©%¤··4%[°£\ˆN+‘A`®€#álAÉÃèUôT c<ººJ{)ð‘—yã]„Ì%å«:”—Ë›G2®C&q‡GéÈß!Í3S„#³€nYÄF-ôˆ–gi˶¡‹С$dÒ¸:ßñä52H×r0!E_Úî!aµ¨¹LÁ§«°k¶‹ïµéꮓ–wuàÙÝÙÖµŽh†e–š¿‹ì×I‘áàöëf;%#šÆ0ŠÄd5hõ¹ÑuklÖÚtëR«);åTWàQìHK½´¹pȤ"ØqH˜ì…¿WE<ʃþÙÊ8öDÈ·—qÄFà©:ØUTÆUåÍÌþºkeóК*óšÏj‰¸¢U†„¦d%Ê$*jäßÈ4rï•ôš“˜ÁÞC¡‚ƒ¾eÞk!wŸ4 FÕÚ%¿¥‹Ù³é̬ƒ´¸Â%=™¿vÏ:\‡Î0šÉxë8ÆmS&²ÔŠƒ!šøºÓüZô¶\s³U–à!16}Ü0­‰£åánÄdNtÎPbæÇsJf\K•B›iN»öz`ƒW=ÞÊei£31ÜΖàôjí\™7:´B˜l¹ÖæKä”Õ ›xßÙ•ê]¶æ<ž©°üpкl¾\¹ža´ w4-•ÊÀÎSÙL°£6ë?5R¨s˜šˆ1ôa:Sm¯Üs73…›Ú»¤ÇÇŠ %çÃ5Xõ>5" k~b“™ÜÓDDí:¤‘§í»NÎ4/.Œ;©˜Ðã„ãÖÁ|ÁoE “\vi>¬P#“¨Ž!P½ÜÀbÀE°ÕŒt P£+øþ{“#6°6ü¤k…B†òÞxç°EÉb·ôòîì7ÔL?”ý˜ß9C±N«ß8k:€ÃÔ‘ñ8@Û­²µ% €ÈÔs«ˆÈŽìwÍå UQ_äåÛótC|ë¦*¿?ý¢Ù¯º¿&QöžŒO{⬣3椪2t«Óý»ÿ³5Zü”û¦±KP3•#‚H|%Ü^í[›áîbúQJîÉ-* ÁP¢nÀÅÁœ¨ƒ¹qÍåZt(”•Å;½†Œ( ðãšaÖs‡9â5=dG­W.Û͉™V· ‡ÐD%J#xÜÖÄ1?Xl«Óû»à¬¸Ñ! ÂÕGlÍ{Rqƒy×9TÖæF›79È‡ÙØ#"š1ki"ÍzÜÁÚþã¨9ç _\Ž7ärµ–†Pª¹ÃOÛšPž¶ 4Ĥ_Õƒ‰Œ Eï(ÈP3¸4ñi· t’ׯììhôài˜è$ 4—¬Õ?¾ÊQsÉ>yX(íN’"¢ba”¢Ø¡Ù+JXõp5Ù iÁÊfE+úË*ÎörÄѸFWEn„jsÑ®g!éáhr€öݪØ.׆ ëì½ûêCgÕû´«g”O¦X&c²ºQWYÀƒ –Ua:å•LʭƱÎVñjS”„y´C·[ƒ…¹1‘iÛr£-Mž¾Þ.[²¼ Y‹œ˜“½UcS ¾ÎŸ…1Ë[[ãý~í«¥·¥¨áÙlÜÅMÀk0#¨µÏ鋽Ž6ÄešAŽãñ )e21ˆ-8äo&&*Óó^‡‰Z:C7ÝŠæ·Ti¾T¥eÜÄ(I^vn·(ä¥ \¹)ËHíÊÕÃè;Aª‘¦©çWuKc¡BõM:¥„52 §äu¥àkáF©.¦DC„Q§]”©B:0Q2J½¼­0Õ¬$øB°1Ið™êA¥ízªMth~å œ1‹se4Qz»Å!ˆ—§Ó¹II@DîˆÃúÆsBzD^yy¸>Ú×èC7WÝ~¡á^ÒB 6ó÷FG2 âˆÂs‡†ý‚Qƒ:wEZ6¸lÔ ¢èœïÞkúÏKDwb¿–À7–Hä m¡Ž u„Ô!DܶѢëWÚæ¿F]Êô[©ãK©pZ £"CŽØ­ÁñPªô ¹;” Ý3Ү̎!è]¡¤Ñ;þ\"Æmâ oyy7Á"y(å=ºÞ³MÕ\ë¯XLJ¢†:7t’ù!eº‡<Mä·AîV³”~SˆYå E ªjý ɦ“è‰uçV«•Ûu1N4.äŸJn†÷´`5™â’.1ºŽÅÈ!ëáiŠqu°²²‡ÜšV§‘åª2Ï0ÚNû½ÑdO^bÁk¥òÍí„A§tnÄãOþàÖ—uÌr2 ÊÐÇÍ8j‰’Yì)•Ð’fþñ-³Cßõ@£g"-ÕÆ>ª X'h£Æ_ó³šÚ_Ç ¥›£Òx—Ú¾ä]‚”<ñ j^Õˆwͬð°3: pg ‘!£(bâóœkè<ûñ©ÑÍUÔÁÚüXÄ`BÉk›VhW94Ø ¨¢g•¡ë‰7áP³Àyƒ¢RUði9Ò“Ù€¦R?oò¡ 5èXJ]ÓHò¡ô8#4ÇIØ„,¦g«¦ãã±i£ËÆ¡E\¥_±»I¶Á§¢ÅØ¡ÈÊ.ßT®*¾wXŒA32Üh,êbpã` å N¯VòE‹®â6’ØŽ’ 'µMÔw’éÖ¡±1.‹ Úˆšg® (ºò™RæÈøªlÇ™‘Œ:„[³G1»G‡²÷Q‹ç‰¹E[Ófqª‘džtª³R¤Æ ººŒº;ú¢¿Æša• _ÛìúqHShÈãH£&Èi&Wd°UEI…H#^VZ85&2øÃ™iR°Ô' š*´ ÒQê’À¨¨­Í4íƒUO+ø&Åc²#Ø,èUm1;#ô6*±66Í ·u¹* ¶¡„ªÈ}°R¶hbçÅ(¹ðL–¸~~GlkúFàR!ò’žTBŽÁ r1Mát¥;vÙDû¨:«Ç… ]rÆŽ ¬+ØGÆùêj×툽3=G‘Ù+4­Í΂âo.ç†$÷N&¸}‘* 4 ;Õ w¹e¯^ûæcž²ª|#]?6¶Ú÷¦ŽfÁøl<âPÌ·©ºÛÅ%=¡”2¢VÅTzƒ1:4 >=º?2õy{»‡1ÂÒNŠ{æýi”nguG`-¼Ù d\†Í!FÉ8Ò‰nÃÁ™]݉˜(-laxtpS:Ûµ|»Õ{ú×Óϸêä½®Ø=yÅ•'Ž^uÝÁ»óŽ}úY'N<õŒ³¼;¸{åÞ#®¼æÄe¯¾üè#ŽÜ»ò²cßwðn«_}ÿê?«ÿá]Wÿ‡ëÏ;zò䱫NÜǯ8qì>W^uþ#®:zݱ«¦ßÛÅiìKî}â²ó¯Û{È•Çõß{è'´åÔs¯xèå'žòèUßwÀÖ‡n’ÜÙ~×4·­«óÔCT%ŸcoßwðôóO^uʼn‡<õðá3vw¯Ùûá+O¥ßN+Î<ã«WÿÃVÇb?xæê¿ÜÊv;øHº*ó–0?ÿ½esm3›5× «JLÙ q—çeßš+j=Õ/Fq4ÀÔÌ»C@Á„ŒÊ·ª&=ùìnçߎyM£n>ƒÝ‡bŸØáËWOðÔž8qtïØezÕÑË®8¶Ú¼û¾é”ÿæŸ?ô‰Ñ¬,}þ×Cø¾S½Q{Þ;ðÕÒ=|øÀ>{Ð…ÿmP×ðn´z«ÿ¢×÷Pþ÷iÁ“ÛþH l|¨#›Ær$Ü1S]s‡Wä5*¤—JÙË}P£PGϨžƒÂ·l”dû]ã ›ò”$­ÎÐýÍ„X©±Wõç!¹G˜'ª“厊JM–³–FT¿tÓ+¤FaÔ¥ÔRÙÞU‡ªHPÛø¦cMZY‰2|Ö­ÉÚÈÐÙ1r2ÞØ[Ô"“ãPE6Ú“ØÔ)›SŒµrÞZ„E‘Æn#´jYÈÖç'¡·Ì6󠻀s(Z¿ÃyÓ‰šÞ‹Îp›ê5„ªÑ(Ÿ™ˆQr"£ÌC(¿™Gàzñ€ØPî®ê–âäÃ{RKðÀÞ°‰RŒ”‘¥9E‡óŸÒ°M9¸!Œb‘ŒÅnUe‡V7‚lÕð­DXb›†(j4gÅ~ cÖÀ+IcOp¡{Ä…$™f)Ò¢›\´;+‚“Cd!sêJ!U¨™Ø+kPQgZ_q†ÂøÂÈ,»ê5H£×€Fº$iä²-ñÓH³{ôI"ú}MßU;ˆTxÊÉ NÓ+%àµdäÛà ¥š*Èÿ"uF >Q0 ÷z&Ùb9`í0älF ˜sVüærÂc•iU€ÿˆdÃA‚"JÝ:ëV5tÐ7GÕ1M#T‘~¢âI_¡XÑ{Õ!ªéƒ(Ò‚Ø?&ÊR vŠÁN{'~[­÷âœáUŒ–Œ9B8œDá£ÈгWštˆTŒl,ñ¶M ÞÔ¦µOÔt7ýTÓÔ ZZ ¯ªÝNÖ×ýÙü5[1®Ÿî¢o½ Á^¬Ý³ÐšÉìLTD¼y} ”Öô!­ü ÖJQ1IM»C(° Mqš 9ý­ Ñéн6úgïà YÝìÏÚåT÷ ºšôÆ:æ¶ïÃÜç×ó¸F!<ßÅH±Ó=t γ!öÕ´[*hpãxLÑßtÖ(Äeš7ŒnKŠBªº®•` €(‹|#éI·)i#té½(Vr#Û‚Nß‚åÄH‹¶¦Ež”Rõ¸V«3ý¢HìQ;ËîŠù?Fí˜å3<ë$®Us€;º%DÅ0b“9Õ¤Ô1ÜÆÂä_·¸ök%VÖq¡ ô”raq„ÚÒƒåN(NxTÞ©Õ®Ž6yÞ B®#g=ûiŠ:|11ëq$^Ò–{.š?œ'Xæ{ƓȒÚ|nE„¤—¿V%öåû(z2n¼=Ú¢íÁ%øsÙ·µUA¢Û²„ ÈµXodùâ&FÇ¥-k¸i&v±â›"•ߥN¶~I]Cì‹ï®àúJÔæÇLb=±¯}ù]I=æ=‚²^µ…Í…åÄK]î?äÖ²XÒ¼SÞ¼¸-ûÚ~¿žÇ Ûîbì®, l/îP•­ªi?íÚ]ùÔÖ÷xº`(myúŽ‘àóÉÁ•½ãœæ½ß§’‡ 14¹ÇùE@ý·œvtAWËòl4ìý|Šîÿ8é×iý×Ëq§»([Nþµ{Žøõ–Ùm< äOƒÄÚ‡a‚ÆјFc­h\Ô_±r©<Þj¤²f<:6¦`0üÒŠbxXk ‹«+ÏÒÂ4ã€4̰٣Р÷miöIjÎ/ìC…‘ Û5c’91X5™žä°ˆ˜ìd¤R”T E×LZŠ’Š®Çd³rÍKS™bž>m1¬É“éÈçÀ 'O¦Ô¸4ØÉ‹‘Ú¶5óže ‘ù3й$Ç/ÝJÊDäV&ƒÜ›žúÒ!!!z×…òkR§·æèÐorkK·ˆFsð¬à@QZG)G–îVçÒžç,€ppe/uxqPFO4Ï ÚDž¿³Uªj&˜ƒˆÆ`jDÏV'8 ?$Å®¹áö æÝ5ßµÏéxºôÚE&wò‰™ 1ùMšV޹ìð·i ÿéä™3M^®›~|Ÿ3&q&ìà g¦â”lP¡&Âí%¡]Ë–~jD6xÖµoºûg”l’"›,Ì>F­X‹‰Ð‡ìáæWì~gé¬~Ñ6£2´m?ìÃ!®Hu0G´‡ $Ó–ØmGšE‘$jÔø°…œz‡ÄÈZ|Š:Á5E³hG1•)îż” ´eS”¬sŽ..cjÔ©CôQô8E꨹!R§Q=ÔºF,‰ÿq£iÄ-”á5¶( ¿–(äÚ/òikÊ`}ì"” s8 ì:_´H:wyß3¿Ð<É<ÊeÇãÈ"Õ6?º,©ÄéÑécÎãp/$‰Ù½|}I¼¦1^v2ÚiY$ƒÄED>HóJFú"Jéä´2)ŸãR_®còš&bû±ê œìràO_Q˜f?/dýöˆ+Ô ú‰>Íñ53â<ΫX?}–‰Å&Î7?“Äê6C0êf2Ì•¨ä*½,{Éf°íRwF® Kóà‘v–µ;.{â¶]êþL~{^ìÏ=ïÂ×¶Ø÷™g?¬”ÛžPr¦h‡SIÖqújÀg;îäcnýádðÙX4уÏ ¦/A?Ôå‘˺ ÓÖV¥ªM@çËø2,Š IuT˜Ì›ÈMÏCx½ ¤èÁ¯:ïUÐj;xˆž2ùöd;ýká*#ðbˆhLÃûLÄ, þ5¬5IxذfÀ°ŽjŸPkG°£¸µ‹ª²ï-Œ(Ö> ~²ÃÔäb­)#§U㌅ÿUM9Ž^º2 ¡†KêÙh&" ‹G4ªAÉÂ]“-gæ'éÁÑm†jÍÆê>ÌZ–gí}B`Šð‚+ØÌeö*úp×T¦]ã|Ìi·þëÕ¸qc\•ãÙ¼ èp,îyËì²àÆ6Ÿ=9¿ùä¶>ch-ë9bC¬u QBdY‰A²Àö! Ó/š|ae”ɇ‘m’`íJ”Ï>LÑGŠ•¼ïc6‡§¦ñ™kDÃ6c½SGªjMÕBÝ.óF'§þYÀ–áÌQú¡„™gyåPhDØG̪˜¢Â\ìP‚j€m“^ ¬Æ‚GÒXSÔlÀ3f!*cžýsˆÆGU†e¿V"IñÏ“*¥1ÓˆUhý3%•ºÔö1®,€`XmÆC ~v*[1ê…j] ^AÁù&“‡*9£¦×£WÜ‚{D¯ø.”ÈNÃWÜÔ§?ßòË}Æ”ð™ÜÁÐT³`w¨{oa9™Y±Hbªöüü‚Ý…é@!8Èë¡Dn¤Bï9”(¯?˜ÚÛ€©nŒ«¤x[îBÜþuâ½·”ÐÐXíÆZÙˆÁNxéHàee±97“ÿ;›‡$Ø(ñ™ï#‚aý®£œË9R@º´µ§ðõƳC°{ñ¤£Iñ.Æ…q±qr_¼oç+‘üu„¸ÿbÕ…i\[ŸH'¬­å`j³Óo÷u¾‡ék B²üöŒ-sþJ à™ñxæoÚƒÕ•î!L Ä€½¢A :èq¢Q”dö=lCœlsP¶”5R~ëÛ›%çÍpJÛæ¤‡´Üd-M9íÈ#9mÝ#÷¹¶ÑDét,Œ”êt€ŒìÚq3ÒµÓá4òºÓ16²Àk‡ ’¶l'$.kÓ#ºòlrõˆ“×ÏÚ•µ›†ÈRè°°Y8Ý3Ì“1Æ 4‰ý =…y„}ça¹ïåõ4K>ÙH#§¾f# üd#\ýd#Ìþš4p“4“4ðkVë@#L6îÀ-LÖð9¬ÙÎ1YÚ<1Ùäj±4à.c²ö‚c¸î±æC pÈä: Éð±ädÍ!•É}P–ÉÑÀ—5·pÀd&'rj&wsÀoÖœÓÖ™\Ù뙜ÞZs‘dhr¨¸hr½iÍQÀ¥É­§áÿ8ÔZ°``§Fda€¬¦Ä€d­…+€k n ¨×À°µ É€‘M!–7³PÌÀ¦­…m&$ÛòL˜·šrËàÑ„§¡¦ y7‚R†Ò[°&DßvMØ¿›‚ Žî Vh7mTâu«CŸݰ¥¶!‘­°C®«qAŽ9îm\x Ïèñë­Èǩڒ'Ú,9Õ¦1ˆû;^­r&sØG{¬ Fb–±ùÁ?]ªãÁ‚ç.Ivss‚»cökãOÂñÓ­+#—‚]@BíÌåXma T³ù=/Ì¢K(+­1Cµ…Y4|½Ýt]ýè©ÇÏ$t9‘#‹éké1J»f.RWnÄüÕ®îO)(ìCÙMÌ0È” ð€A`$‡LÀ;‡¤ÙÍäóÂðZ’k69K8ulHt­åYCÐjÞ„nÂgÓåÑ[®š5±îµyÌ“$ ³¢wÂöȘdsIçc6{4z”"‰XlQkÿrm~a²yƒÒÆ5“mÝ«Š+K{V/¸‹©÷"š=Ö»‰Ì³ŒÂ ­im#_!·Êj±ÍäIöd«¡W*Sÿj#SVMƱx+]ùSa§¾6ǚǟÀ¼‰tPXÓznÓ˜§HÁ× ¹¦ÝݳàÖétpC”‘A Þ ½Bµ@¹•ÞfOfå )@ª$³Š7ƒ0±"t `œàÀs¥ãIã«VJ¨­™gI ž_”˜†Jx†€团CQŒòÚHKš²2 uALŽk‹Š=ŽÉÀÇš?éì•ëðå0ƒ¨Ua¦7S“«ÙŽ®&éÀ­Ó˜çÈî¹m(‚4„Ћz35Ãùd2pnSø׸®÷—fSµNP™š ¨4„kªpÕ„Ð[0ŒUë§k! 2¨¢* È ]×g1ͼ‘ôAÚF¥5³ò(ª®Í ]0_†ì›ðÆ„e @kB“0€«ŠÕ¬adóŒ‘qìsê‹ ²¯dy1‹y†KôëP¦àpµMõ˨º¨õH¥ôèÅ2#pÃC¤€Zraeü$JÔSÂûkbüDÁ@fÞèÛ6¦1Oîõ)VÝå¶K m6o°Êwµ˜Íô‰iƒMlã!Qáiªk´ª²endstream endobj 970 0 obj << /Length 53114 >> stream xøëÓ˜§¸„®Éžu Œ¶-)ª%ÄÛ_“šÚÍ¥Ú4³XØ+-ëmT†Ÿ`°]üÍå¢ìJE½X¾ó˜&ÉI›fßúà“‘´OÅÎFæ(­í!LÎÖvœ §*‹bu‚ÛØŽpdЖ˜Ã:2OÍö fÜæËYÌS¤šõ¢{;‹ýîY(Wp@0R«wlâ­j£jJõ¶8ý)åY½½ôhC`w-qŠãÔXÞ@tôõ}âwÞ˜Æ9â<î°6èI[„ú5%ñΗ+sW¼ZÇIïµÝ„o²Øº[§±œ£Òs5­7s,ÚóÓÝðª4ûx¢Þ"%áú¼¸5²NÞ¢!å'(2©Ž.vŸMà²æÚù&lûªM娦{mË9ÆÜ5ÈäácŽÁ'½s×0E—šê „ȑהæZ¹F—ã–b ÎÐÝNhyç!¾2:óM(É*';“=çå4–&Ø.½@q†I±:ûU…¢Â°#+!j¢8Ô óœ óÜÓ4IÖ¹”´²òø®a©Í¦€:ãòºäpÇ{ÖF&B¬†ÿ^Nd«yˆäù0{+†ÀÖB¸&æ‹&ÏC±Y ¸/ßCEV”‡0 ³ /:¥ð£Ùv«¢Àç2^’=š‚Ý¢÷6„× ø~c"[]`%†/qÆJ´G$% ƒæIÙÎw jž¤Ždˆœ0ü*¥Ï&ÀFèÿ!R¹9€A&\3u ÌÇæ<–žwl]á@9M~·ž 4R"2vö»Â’­cc,+Ú‰S#4…ržÐN(ï#Â}!Pä8£ZãxFQ¨–ìÎõúH ¬ObžÊIÏÕ†ÒG{ ÜêWí÷ Rr.älk&ïa|¬W™IypR2@ Ž÷E¼nÇÇ.‘´iàn™#Ò ˆXŸ¥`Ü*†2ŒÛ4ÜþÐ9ÄÔùðT¡cç™gpɵ„Û® Ž §Â`ôP]Ý¡º |·ß-^u2Âî*Îk ÁíâC\.>ºA ÿóR'$P"vBÐÜYc¨šz*R*+mNæûÒºt}˺‚7ç±™¦¶$ °b#‰âJ2d™¦ƒVœ–‘wÈP¯k¬'õw°B4BÌIöƒ#ú)Æöµ-À+!¨mX!Á ˆkY‚ì›kÀ-rj/tàþ†FÆz½&hÞF€Þ`^űD-_æ9 Û1r0‚,&7FX›Æ6ÂW`BÍ .ÄxÃŽçnD\²;=F0Ä¡Ô'°aî¡)ò*ØïóºÛ°É^–©R†´2®Íbs2Hü¡1Ñ­Æ,{3cû¸OA†% ›áëU‡ðÒbÅ…³Ç°&¸j³ mu‚QÌî"Öb®Dkó˜×íÀ–©g;&éõºiq3ŠYK„|F›¨»síïp¸Å®›žu 6 Ùjóµ£Yä¥*ú Ÿ{sÓ$'ðß=™‘‚‹˜1…µX;à4ç£Ò¸"Rq”ޏ _jÔW’M¼æL/iPк3™q óô0õÿµzÏ»êʽc'/?vÍÕ †^pôú›HÈKj¥Z†Wo‡4DúZoPôJVÔÐýj%f‘ÎIRópíÑ fÐ{#ÆÕV²¨³!œ¥Q$Ì=)Úà°`æ[õ kÎ1'Qn·Fæ¹Î"Ðê'Ná%6|¤™™–8Æ¥‚îµ%©Y¯"¤#÷à 7sÃH]…3Ø¢i\ÇYêJPås9ÂIÏSÀÏ«§&ä7,†Ú$ÖABÆÊuM@Ïæ®ÊÎö ðkeô!iId¬¶Ûè–w`ÔA2@¡$2%ÁIü9TDgYÿ}Õ' À Ü—¤(VrUº{õÛ"AÀ­ðó¢ä;W^Ro®ëÝÊÆ\¼ÃÞÄ );Ê ãºÜ‚–ÒÑËÍAÅg‘B“–*R0¦¢jƒ_n¶iU‚¾Uñc¤¨%PR¾Êo†8ƪü}Sc’•{XõDWÆHÑÆnJ뚎§RbGX>-:…´‚’BŽ V¢±`E”åû®ŠŠ–ìON• ¡Oä+ãZ–Þ«oâ „²ybÏ‹[*!‹Ñ%¯Å9«…(Œ›–7°úækôS•i‘’ràù)-[t¦CÈßÃUmÒ«‡z-nVï!š"eUƒU|”Èî!%cJ<d€]Twù­—$Ð!Áî$A8ÕÓ&ê;b.û4èïSh"d!E 0X°‘ÅI‡#lBÝ\‘Q#ÓðgÊ^+QÓ`S#ïor}k›«8(sG%!_XeŸU'E®¯Ä®MªªL£&Të±gHB¥ÌÙ®ryCQ S´h¼vôø9GO^uÅ£ØH=rÆYgêðãW^µ']jž®lØË®|ȱKÎ8«_²ºóO^wüØ%㲓KÆç…—­=ÄðeW?vwü ÛØ?|ôê•¥¾jZ]j5—3Åè¿×±k¯Ø=¶zB׼܋I÷‚pPöÙÏæ£.¼®õçž|Ö 7<û‘¼óWþZi÷‰/ü…—<몳o÷¿ÔíwN>ç^qÃSŽÕ¯ø¥N9íAá+^öüGßK£?ìé/yù‹Ÿò°#_ùGx»s®yîK_úÜkÏýî¯ø¥N9õÂÇ<ÿç_øÄÝå+©ÕëzÜϼè¹×Þûf¸Ô)§?ø±Ï{Á3N|ÿWô"j8ºø'¯Þ“¯øÊ.ø¯þjþ¯;?ðš§>ë§/K_Ñk}í×òÝö̇?î)9¿¢×úµeÒƒù¸G]ò%®õÿ•zà_Ïÿ}êyäÕÎ_Ék}ãínÿ­ü?nsÏí¸äŒ[ïû˯þ²Mâ[ßñ{ÕH;õìK/¿ô¾ß³ï/¿æËµˆ¿õNþn:•[¶ó/yð9‡öýéWý—y±;¤»ûÛêÿ¾ý=pñù÷øïûþöë¾ñ˺حÃg$ÛØï|æ“ö5پ替óûÖþÈY÷ ¶nÕÎûÑ‹ÎÜ÷ý†oùºÿú¥Â½Ï9猻}›5ÜéÌ‹/½èÈöûý×~Û·ÿWgv›xæyçÿPŸ†¾õ÷_pÙC/>|p¿¿ø–[ßê›ÿk—J÷=ÿ‚óŽúö©í.ç{Ä•—Þw¿óòëou‡;Üú[þ+—:ëž¿X ·9ük{ÝÃιÓ>ôÍw¸ëÝîôŸvšV—zàE¼o\Û'ÜÅzÚ³ž|õ÷[ ·=ýîßÚ­þ+—:+Ýf­ý;ϽæÙ/ùùçÿÔŧoÿ»o;ýðÙ÷Îÿ)óçVñ¾Øv©SNùÁG<ïW^ÿÚ—=íŠ{niw¾Ïݯÿ'.v wŸ}.uJ¸üù¯{×»ßñÚ\{Á]·ýéϺäòËзüå>ÿ|ÏáûÓ¥n»¥ë».}Þ›ÞûñoyÙOÿȶòÝg;yÍ÷¿Éëmï~¿‹.8;o¿·û]ÿýÙ?|ì#þÎ_|Ìý·x}·¹÷Ãó„G»×MœØ-ÓÎEžS¶ÍjõÏÙÏ|Ûÿí³ŸþØ_¼ý†Gô-ý?xüI×?õšÜD‡ðÔûþèƒøûíçg=ëó™oüì?¾ï5O~Àwlö¹êY?÷¼Ç]rÓŒ ÛÞó¢ÝKwöÝaϾþ]ùü7Þø‰¼åyG7_Ëw>ð§^ð 7<õagÜâ¦\ë´\±wé½öy‚§œòCÏùÿð…Õµ>õ׿õ‚ÝÍ“Óí>õ¥¯ü…gî¾)׺ý}/ä5GÛ¾ýç<ÿwÿé‹|­·?÷âƒÝýÄséU/æû0ýüè'=öK8tçýÜ{>¾ºÔÿþ7=å¾›Ý÷¾î†WýÚËž¶{S ÉÛï\ýŒç?ýÄÝ÷ýÁE/{ÿ¿ÑµþùþÏë6õ½zê+^óêŸÂÅ7å;ôà'¾øå?÷¨Ãûõßåäk>ð©Õ¥>÷÷ï~Ñî÷ntßã'~öU¯{Õ ¹³e…nü“þÜ_}ý+Ÿzî~ý‡Ÿò¶¿ý=¿|ã6¤Sôä—¿öu¿øÌË÷}³Åz÷“/yÓ;~ó¥W†}~ûÀ~ÿc«¥ñù¾ç®Øø.ÞïºþÚ^ý¢Ÿ:ÿà>þU_=ýË=ýÊw½÷÷ßøÜK·G1]ýê?ÿ÷Õ´>ùÁ7?õ¬Þïß{ö/¿á ¯¼þaû®BõDäŸ3ûê÷|àïyÍ7G¢vžõNz„_üøüâñ}þ®—>å¯ãkVÓÚ7<öõ³¥uø ¯ÿ£|ôC¿÷KWo[µw;ñÊ÷ÿËjZŸýðÛŸ¾q3§^øø—¾þÍ¿ñÊ/ñq}íÙÐ:òÄßøóò_?øÛ7Fûîçþæ7öÖ§¼ûœ×ÿîûß÷?^ýÔá¯ZwÉnñ]ß5Mì{ŽÞðî 3ãÓùŸ¿ôËWvÖÓßò!Ú3nüÜß½ù±ËyÝáO|Õ»ÿìüŽ—¼ÇhÝpÿnyÇ;ÍÝ}žòæ¿â?ù¡w¾àèü•Ýåø+ÞûO4­¿ð¿óœå¾[®|É;þìo?üÇo~Þôa~õ†t«Sï6ŸÁ«eý>zÿ7~ñ_þüן4/ìûâ.n¼ñ_ßÿŠ-§üÄ׿ÿ#ûÈû_÷¸#£qñáò?·¾[¸ó·Nÿ~Þsßñ·Ÿá'õïùÅÃæ¼Óå/ýý~^®õé¿~Ëãgcã{òsïúпþû?¬¾ðiƒÿº é–w«aþ ¾ÿ'_û§|jÜø©¾íú‹m/ÿÁǾá/>!—Zíïÿ¥Ÿ˜ö×ÕŠúÃ~æ³}Ï‹/šFúÆ éÀ]àžq2±¾÷Ø‹ßý‘ÏòkùØû~õ:‹@Ýï¹ïú»ÏêµnüÌßýÎÏ+ç{ßÿÛ¿ø±÷Üð€iZß>?.}÷8ûÌ<Ù÷~üëÿô_dbýö眧­w~ø/òw¬ÿ|òƒïºá„íE÷zò›?¸úðþå_rÁç›n÷߬_ë»Ï8ÿ‚6Lð;]ú‚wý ¿±/|ü}¿|â.öÿòßíR7~ñßþê]/»öl]t÷yúÛþf5çOüé+/ã~ÃwÜé»çm‚þùÎ3~äè%÷ocᇫå}ÿ‚¼±·À¨8çY¿õáÏŽkÝø…O|è÷~åI–µsæ3ßñwŸ£%ó¦yÉÜÞå»®ùG·¼û…—ß=gZ@;+Û–W÷>úž—^Îfûw?D¿ñ1³OþÝ{_wý._ì¾ÏzçGV×úÂ?½çe»áwÔ#g„5cû´<üäUGï;CÇ_ñž¤“þÆOüÅëËA8ñ²÷|ô 7.þùôßÿÑŸw™ÓkÑ|ê¯ÞúôsÆûsÏÿ¡ºôîxîî{ÌÉ£÷ëãÌ'­v{î³ûÎç°íQñòkÝø™þñ›žóÕqpÖõï¤g¸zÁôk×›×=xéƒïß®émŽ{ô“~úä…ÃÆ¸óC~î·ùƒþâÇßû²‡Ò'æ®xÉ»ÿþsk׺ñ³ýã_æÝñ”³Ÿõ[lñÜø™¿ÿ½—íÁ–ÿoýÂ+N»ÿi‹‰¥?ú©Ï|•S<<]óª÷ÿ3­ðOü髯¥ö?öÜ·}èSë׺ñ3ÿðÞW=æ>+GémþŒ~&ï|áØ—O¿àÄ£®}èY‹£ó.<ù´ç^ÿøËï5ží=óíüןúÀo<öžÔpø1¿öþ­?ÄUÿ‡Þõ¢«Î;úLl•_¤Sö2ÝÙî|Þ‰Çþô£Žž÷ÛÛyü‰ÏûÙg]÷£Îšîú¿úÇÿJïÿƒo~"o§wÚ}Áo}ðß7®µÚ[^óÔKÎû©WÿÉ¿jÃ?ÿÙo^ÿà;é¸üÓŸ|Í4,½{Ìs^ø³O9~ÖH²žóœß¦eü™¿~Ë“Åæ¼ç£~ù÷?òé‹}â/ßôôsO¹ðç~_Äçþé^ûÓzÊ–ÝÇ]ÿì'îÝw^‹·ÿ¡ŸxÆ _ôœŸ¼x˜§_óÚ¿ü$]ë­O‘k}ÏEO{ýû?úÙõk}êCoyÆY§~âoâ¼¹ñ3ùŸ/ß“§xèâÇ<çgŸý“-¬ûtéãŸÿ¢<ùŠÉ¸àÅÿ÷Çy^z­SN»ôú7þÉÇÖ/öé¿ígžr×ã+ó»å'ÿŸ·^ÿcl ÜþÜkŸý¢<å¡ 'ã;Ϲú/¼áúkÎñÞÏxÇêû\½¯'ÝK[N»ìùoþÓ­-üÏ|ø­O»Ï)§œûì·Ëºúçóÿô‡¿úh^P§üà‰g½ø%ϹæÜE<^úøŸyÑó÷cã!zä?ô™ÿ_öÞ;Ê«*Mþýugîw?ׄ^=s;Ø]=ÝÚtO'u™ P‡ ˆ²¨$CQÂEP1‘d©¨€€¥ bãRAÁ,.IJ € ˆ„¥ ¡¾ý¼aŸó …hßžoÍé™îbÿÎÙgŸß½ßç}žïÖ?}ÍšäÕM{‹_¶÷Óç®7»š“®xD{¦]LÓPØoâœ{g\]¼E:þ¼ú›fN¿±_nê¬}týw‡ö|¸ht–æô½cñ‡;ЦÅïÖ?1ÖTÑ¿]rÇ«›µ¶¾ußÑ­.½~ÖÜY7\Vl …µ×Þ>cêˆó²SßÇ>ùîàÎ5Ì8~ßÛôMþe{>X07#ûЉoÖ<2šÌÄßt;ýÞÙêŠ ²ßvj˜:ó¶«/±•èŽ{þ‹ï~³òîü²næª/®Û•­™;WÝÕƒ~é<ýMÛ;vøø8n°3êo½kÖ„º’#ˆ¨ïÄ;gM`­ˆÎw¼¹íà¡ïÎ:¿è¶ ÿŒe¾ÍÞµã¥l‹7êïù艫¸•O|Ó¬××–lç~×ëú9÷M·»W·aáG{ÕÌËÝx÷›_fµøõÛwÈ&´ïãŸ}o¿kÑX¶I““¦ßvÍ¥Nq…sÆÏ}tþd5NzÌ|3Á7ïÞYºKˆ‡?´vwþ»ä†þÙ»v®Y0’+(îãmSÇ\Pºs<熇—vü³tfþ~ã‹“yö=þ¼&_USzÖ~Òóëv|÷íŽÍë?X»nã™pl~é†SKm¹~õƒ'¯j‹}öšZ±ß}òÔ8þ”V]9yò••t ³¹z÷+ ü{¿ývo6íZûHC~ÿû—vOznCnm9ðõÚgï{ûS«·Ù‡v¯}` ›Si¿ënž<ª{ÉN󜉋7”¯ñØô½=$÷ß?ŸzÖy=GNžksþŽ;?]ùúŠ ;²ò}³b6ïã;7ÜtÛ䊻>«Â߈åèG&Ô^Ð¥ë…C¯žtÛÝ —­úb÷¡¢;íÛõõ®½¹´¯ßš.ã»ÆL|“RüY¦µ*˜.tíýjí²GæÎ™3÷‘g–¾±jݦoöU¾/»¶/¿Ç÷Ão¹kÖÄ~aég­ØVñ³P»6¯[³jÕê6lújçwe†[ùe¾‹Æ÷.º~μ»n¬)vœ3¡rkÉuà»Ý;wîþvßþCMß“»L{ÑôsÆÈ™ ½çÚî¿É¿êÏæ¾Óägýeö+—"×Ú›~öÉ{¯,>kwóŸ|{ä<š{íýüÙñfœœ{ÝCK_]ìàöó†eû¯kï|uãOöaßnX|ËE™A_}Õc«·ÿˆ XѵË[óFŸkÏSN¸dÚ’õ?UW<¸í½E/ÎN¥Ü!÷¾¾ñ0ÆÍ±\ßo]¹hJm’þ¶¹êáw¿üI^vp׆׿¿ÐÍÞõ‡^“_ùS¼ìÀ®Ïß^tˀ꼙ݪ÷”ÇßÝ´çGîù‡ön_ÿæc· *µ¬™òèòÏvý¨½ñûo6®^:BŸSKŠ­z]sÿËoÿñÆÙ÷»6­}uáWôlU(»Nh?bÖó«7íþQ>íྛ?xýñÙW_vf剠ïͽññÖ=Çú¶Cû÷lÿüýמ˜uuß6Mz[_|ÍÝϾýɶoåmÌFxÝŠeÝyMŸv‡Ã9ŸÐ®ßõsŸ{gÝ–{ÈëØ·Çì¸W¾üÔýSÇÔV QÝâìç>óæÚ϶îܳ÷ûý6o:øýÞ=;·oùü㕯>5oÚøçÚ-ý{û˯ýØ’7Þûè“Ï7nÞòÕ×ßìùîûýªøÖC‡îß÷­yË>zï­W—<~ÿ­W è|z³#Z´ë3fÒŒy ŸYüâK¯¾ñŽÙQâÛ¶m/¿¶mÛºeÓg¯~ëÕŸ]4Ö­Æ^Þé´£ +9á䳺^>êš&N¹ù¶;ç-zîÅ—_}íõ7Þx³ôzã×_{yésß?ã–I×нC›“›SuåïKÎhsÖÙçœ×}ÐØ&O½åÖi·U¸¦ÝzËÔI×îß­ÃYÕ'ý!-Nªn×¾ý9çVºÎ9§ýÙmÏŒÿ $³âIÛîƒhR„Íž­ñ±&ÍFǶ«‚koÏhŸVµùþÏè*åÑâ z×’ÝX’œáõ|“£9´ÜP7¼^ƒwmrõÀþC‡öÜ·$¹Mÿ5— Ô»O¦\Zòj'Fhñá™qˆ;§6®H¬ÓR˜ìˆÄGÈv˜{ÂâY¼ì96*=lGÄ/‚¨yP©( ‚Ï!ôQÄ\L ´²æ©Pˆ0¢@U Àggl~ 0«É»lè­DÚ ¤=±#*ŽÄéËÏû­’ B±8`ÒŒLÊK¤ Âà$ªlù,«5þŠ¥UŠ˜Ÿ‚>ËÉH~ŠITÝ,`–>¢AP>¢þ#JP.$žñ{–&låã.VìÅÂG&üY@‘Ä©%Py‹8“±Š•+Í@CÙÞ$r8_IXÜ.rÀ3—²_ ïƒ>‘5HP,aZQÒ®’ Bˆ?DIñ'„¾ÌQÈÔçÙbÌ ²âç=KV}âòÉšö»¢€M ¾¤TµR‡¤ Ô:Ž[\€lêÍeŸ£r÷ÚÕ'ÿ."N¤½Lïô·h>L(V¤B%%òHdî6ŒÏJþ&LHa"$< °õ0Í1Üç&Ô»C‡)÷ùñXIÖ‚@Åa@ç° CÙòJ„8Ìï¬tdb—ønFÙXfý(:-¨{$Â]ã‚ÉóR æc]ÇE{ƒÎö̾ÇAéšÆ&Éu@Ôíci3·qÒçb‚ ŽÉ3ý˜ÙÉŽU§ÙåûožcäÙÑò¡¯:£y¤]\:U©›qëánüÈOð7ƒM'0³Ðß™Îÿú»£}¢ðz¤ë¨íŽ?jÊ ¿úh7Ög\Øî(Ÿ8wø€£ ïzý=|WþºðÖ9c+En5}õšþàÍ]|[îê:í¡éù¶ÜuÒ¸{§÷>ª' ßr[Ÿ£{âÔ±S¯8Êú½ôÆqB™wu»ª¡M¡ð?â‰Î#êüÂÏä˜GœŸ×¿S¡ð»#ðBüsƒÜ꒾Յ‰GèÁ¿ÎÊŸYw±S(ü¥©à!¹ŽÏªÏí ']tÖaGÖ¯r…öëúÁ7zJ&C¯ÌõÛ0Wèó‡üíÔÚKµœ”!yÛ^qùæ[÷һɸ³Vm3àÔÙãïœÀ³öÃFtlâ°Ûùö#ÛNZ¸h"ƒŽÜÞ£.¯±æöœ…|xvÕÒ+å*ôñuÎè«í»`á†moë…Ãë+–낉“u&h7óÃï¼?ξ½vtßÒØ\5·ß~‰üÙç¹o?¼ÚþtòÀ!殪!wÍÑ!7äµ}_“ýØ}X—ò' ýî?Tþ¼üå½ëÆg¿u=¤Âhì;ÿÉ©kíøØ×ë¯Í~ë1Ạ¡sµó—̽Tþž¸¾±ñÓ³ßjnŸVa"ºhî‹ GÈßõïhüò¶ì·áóï%(^ñ>ã¦Å‹gžÃwz|gã·OYÌã9³—.ˆ?~Ya0àÑמ"ßôyã¡·†ë/#—~ð"ýãßªŠžhç+¯Í<õ«MõN‘:=òéö·®À_'dÞšF-Yñ¤¼¤û‹û¿yBêg슽ûWÆ_Ì·†`ù> ß_>[‚zæïnÜÿö0ú³óÂí«è-²÷O˜CκoíúçúÓ¿{¼¼ßëj~Å{÷¿A‘TÉy9h)¾ñ½/¥ÇNø¸±±qÓ-ø³ãÂmßë+üºñÜõTgS9ó6’{çÁ&qÒ'û^£Êm×ët} Eá7lh<ônƒy×*Fµ½w%Óôü­ КAŸãuf‚HÞ±¹±ñóÙ…þ/ €ú£‰…ÂÐå­ ¯;ô0»¼ËúãáîÏrñÙ+q½ñžS W}ÐØ¸}!À4éÈëéÔuþÿöCº/B}1û”Â-Ÿ›ïž„».š4Eûv<üÀ©/z¾Ô½ýþøBÇE;÷/GŸ>yÜœ[zÉ]nœRcê}Þç%ì}eHáòWö6îX„¹®ÇmóíúÞçöi cÞ.uYnyè¼Â°7ö5~:wõ¿ûëBzÊø¹wô*œûÐÖ’ö¿mz_ßvî]=ÖÜuê Ý;@^ÑmÚ·u+ zu_ÉwozÐL í|ñÕ+hÈîw<›K£vÌ+ïЀï=cf?mð §ÞbêùjjŒO͸[HÎïÝÏrÛ¯¬^lMŸ·ôÐ'ºOœÜKŸødB¡ûKÔ©>¸Ž½rùæU˜¹†ß3Ñ‚ô;ŒŸpazƒéUS c©xû—]È¿Ž_»oç‹ ½qã§Í{bíUúÄeÛÄWËÚÜÍÇÈÍh¼¯OLiæg4®–/ïòT3;‡Þ½BFÙ{Í|Åw/Ñ]8k~3kªñ˸—Ô<ýuóØ¿R,®‹–N†M\[‘PÍ3o¿Y@Øo_·½ê‚{×6ž³oõôÌXì~ÏÊoŽôÀ÷kﲺÉUOþ¶oí]Š®Kî_ùõa€ûÞ¿»W¡ä:ïªGß)ãëÐÎU³/,}À\®zäÍ6–y¾ßñéêÅÓÊ7èê8ôê›måšµk?àkíÚ5+_]xÓØ¾‡Ûäu4jÜUWëuÕØQƒJã]þ×»¶‹\ÛÝJÕb*:¾Åà‡¢g‚câAâ@p“X„&“X} nêˆ0c¤îè—º¢§Búkê€H!‡ò‰¸â ªÊbà‰E;VW`d%¾Ô7“ª÷Y|·PÈpYSÍmå³?ÜÂKﲫZ29_x0Dó ¡ü²8§.*[~”f$‹r|Ÿâ!„’…ÀÑ¯ÚÆPËðÄKšîÕš(—D,ÅÞ!'%›(`o"Ÿ¿§!ÕvI''´N«Ð¾ÌúœT°´"<¼lùEŒŠ1 ÷ ¨…±ÚôX -U-Ïûi‘4¬Þš„*@íŠ^ê@CÚ1¹0V¡¢ZTè'HqܪÂI©›t 4ƒ8ŽD˜Iz©êñSÍ h¤…€k=ÀÏãkÔ•IPÇ“ LÄï ùŒÄªÚ«ãܤŠÃ<`qÞÄcQI®”PÀS™¾~¯0Ë@&BøÀEXÞE:…©HI0Ì@´¹ ììª.I8ÒІ” ¿±Oh'Ss‰ëôIKV‹òKìù"W¥žr©!g`)0i¢÷bû~QŸO¡ýê (Ãcdôl´–³£ ¬V%‡*'/ÈœP@<䤗 HOîiÀ_U-`Ò]¥l“ÀUhPÌ™"QÕ{ ˜Ãè ­ÂLZ6-ES4Q³( ´ЬJ¥UUr-²Ë [Õ‹6ÝÖµ sm•J¬w=qìrA^[m/‰D.ÚLG3ð=ÒÖÄ7:©öÍ5´`X%œ@Ö@óÙR®.Ø0ÜÒTÛËsc]odeRýc²yr_€9€† œL2Û´ÝëÛ™ JÃ< CíÇQs=†ç«ÈáÞ)^q¨Xæ "ΕÀŽY7&½:XMAà¶Ë§‚Ë12”1õ(¹ØÐ@ˆ\‹ÖB7€ fTGõeSFƒ„0\·4ƒ0¶ú€ÔÏItÃÈŽO¶:ˆWËi "¦´UYˆG¡bˆ…AÎ’0U$šN&9ŽbÆ“&:m…± R"’%ìé‚Z)KF d¥Õ(eÁpªZô¤¼O€î™ RÁ\©îȵ€R¡o»¢••*¬Š,o•ÝCi~ƒ½Šô"h€±‰ lªŒ.@W#Ov* }‡û1æ ™K ƒbNêbHxË@$ÂiÈi%’9Ï%>ëöš~"zcÆpÐ^-IWKŒT¬®/󹩟Č]i˜±¼%H¬ö$Fµ¨C‡\Õ¢×J –dòRƒ6vÌ“4”qͰò­=e’uñ€1ƒO‘È †ÕËj€Qm²­n 33-²¦Gè³9­R …ʘãŠéHf*}@êV'Év`èщÊ/ëlZÑ9 ½RûPoç&dTW­¯Äª¢Šòb€‰þEqxÆvSXÐaäÚŽ%k—´ [©¨_Ø*˜&`3“•#ÃÀ ”ÐuE§{‚È-?Œ8Zü5ƒ€K`jˆ Mî^D"è!¶Ë<—!1 Ùß@6ì M^0¬˜sõX‚5€ª[4¿<ÁùMùžÈ%« „.0wÂÐ긅Y/FÇà]‘IL\Ý„‘ZZø1`Qá2mX¥lÓ1R‡´»MZ ¡ÍjiÂÈ¥ñ:vù#ôa&S‰÷ë y-€(:˜cí°!½+0¿F®ö‚„t2IÞÎËÊ/‹oà[ûÃT€džµTàÄísÙ|Ñ6”3‹ÀÑm™éD2?û™F" ¶)}SP×ÏéA²µçÇÜ0-):ÀÉ*ÒkŒ–n“˜ /Hkä µ"Ï<5ø‘ÝVÅ}@J|äu1aüuè<#‰ )_€-˜XÕ‘F h¢î‹¤µs÷bô{´×ð­‚«Çë½Èª ãDº IVã#Í*Àç)¯%$…4_˜;É0V@0Ý89V0«£0e? „ YùÀerŧ"áŠdÁ#QŒ_Ï%.ë͸¦J £~¤ ¸Hô³ILD×׉µ š¶¦S Î QH·é"ë qb1¿¨º¼ØXñ¹­9’åpzŒ k9ûj@>ˇrbDÐgRÖ1DÉ!5¬²#gÞ˜±.†HLS[ìÖÊÓnâÈØLùˆ²Ñ®Ëì¦ÀcJt\6SÈxâ ›X‹ÆñäÞP¦‘POIäZ2HØJà ô0ÎØ®øMbƹWë0fLxb¥}irà-'Ãx{J}X6ó¦"RQ€E¾zDàèö4% q2pHɧ礲ÎsfþˆÉºdæz9åÄËÔÒµ#4éÅj|ÙÕð÷n ñHÚÚNlõëÍË©YêºT‰f”%~d'ÓÀeÝæ$‹­ué‡U¬5ªýŒã&5‰ÐбÀ§v‡ž‚nD¤Yµ]RÖÕ¶E(KÝÓëùä3àñ¢Ï“=¤G·öõ|ô£Ø•oEŒ”#'::7à¼ÎÑ!GÏ8¾ÂKŒñJÀ3ãË1¯ìíÈ[D­ß íê㊓Íh”ˆ2„´ð‰ŽyÞq¬H|Ì3&¼u5#7ÏÄ8#ÓÕÌŒgÞàC®ÜOCIÔÓ/Ó–òùèäƒ.=Ž=Uà]Ž8ÇPNhrÍïêZJBÛ,Û23c\±-€DYß5~RƒUTÊ;ÉÖr/·{ÐåÕ׳Lø^ì:ä ä/–¡mãZ¬ckJžL fÚPtŠÁ‰©¢ÌóŽ#ŽµÔº "V›çDǰÐÒ ÆŒaã ’gq$úÜþ8Y cÒ}çÃLÊÃb¦±Ý‚šKÎ ÓH€“ yAÖgõ÷ɪ ?/Å”+…˜ÒjØZkØZ,f¶– ±UKŽH邉&êAa™Ç³¶q-žó'„®8±éò8­¢ðÓÕ%À¬Ì.¬w!Mæ(2ßíª ‹oÚÏtkr¸ˆI  fª]vóðäøžXÖ‚Q&úHåú¿ÈÒŒªý/É’hl bµ86Å,ÕfôUŒd©p7~ä'ø¿›Éš½äß@$˹ÊðÈõÃ$²Š¯ü1ÄgÑ|u¤&¯ŸW»–ð¯þxìù]TQêèò8³í±‹ŽºÚ»ÄgtÞ)Gß×JHÏ?¥ð÷|?Š˜­|`Êß›Oíq÷Ø< E²|‡A›ÚÎ…àê¿nRѤìú§¼`Ò¯M'ë8jÜÅmÀR÷ÛÖMk_ÿò›œ Ü¯Z›—wŸzÏT"ú¥W.þSéúõ 'ä?¼´Ò.½ûé®pTð—#Äàpmžp’—/ñ g4Þï‘×-þõw…°œþéòÂv?‡°B«óÚø´î€lXòþ # …?žÛù‚ÒX•㟗7¡h ¿\Ø¿sþ–Ö5ƒ4ž°rËÊ …B‹š†a%*E¿KÃ"Ý?üδeÃuyEÂYc'*ú.Þ~ð«û §^unq&Qû(ÿÏ_y' 'Ìšœ§£ìzë¢Go¾ HËí/Ý6iÞý7žS”ljºE¹ý16™ô˜öМaN¡ uÕ}ÎòO>ÝÄ$‰»?[óæÂ±E/.œtÉEEâ= ÌÇõšñèÜQ§~Ù‚ª:N_‘ƒ0ïxoî%öþŸAi´Mß^ù‰æWzÀ%3ÜÑ×)´H©;üÁ+ [’ƒ™nYrÍérûï[ýÓe·aE\œ¿wQË—Íœ3ÖŒ5ç ôñ–]/jwñ½ë-Hw÷›7+ô3ìÒÌd§Ž™T“Ïäô¢hì¬›Ç ÎÄDÖqäÈŽ…‹žøJòØ»òvAp·î6j ýÙîÃ7手[žlÆH§Éw7ëÄ6§V™GN›Ô½P'AëïVVÊ o}èÓà…žóß~ûþ<ÔmçD¼Þ|Ldz°rþ-ße ÛùqF¬î~þ’Â?ÑÈòÜõ…6ýj©ú.½oÙ"ßoÝȵ:ÓôOšNz-X¿çëU,^³ýPãÞ7òuÒ©ûÉ…ÞZÿêÌ{¦ È¬~O¬^Ž€¢) ,ß6§PðiÎïóì¶ÆÆý;¿%¥œ÷s1G…B»ÁWÞðò×û÷lzÿiúôÂæ-¯\ß½0‹‘Á߯š<è2âÝ­y6×ì›ÈIÒå·/&°òîwX<ø¥];?|aÁz¡8޵⡱~rÖ9Àñ7‹³¨ÈŸÿºpæõ˶Sú·™å»P¨{q7P÷™”Ä–çÆñà¼yc–Éž—3…$ÄžwÿÜ!Þ¾¹¾wP8wa &zËã}ùæé›²Ä]K³æi….:ú]îß~ü Óg•À¤×ÏæÏïñlþåãþR8¡Ý™¦õÎ_$ï>°éù…N%ño_Vø™ùÌ3ïø(ƒ«ï~gª•Z:©;I¾Ü¤Øô}«ÆF¼SŒ"þlnÇŸ“ß.{j{–ñû³íLxb—^í ®{­Ø8½0³8ÈfßòQfÊ톼jqÚß®½'‹£Mzv£Y< (Ø¿þ©uÅtÛ;u.´º¨Ïé…‘ok ¿ûàžÉëé—ràÇ-_äÞ\\«›n7=¤¾áœÂŠàÿþ£¹ùÙä섯¾li¹¾ˆ½¶Î0Ãwâ ]²L>ŸŸŠº\?m̨q7½ôUÓy4~·ìòÂ÷MïUhx—»ðîçŠ5¤.¾kñK¯¯úôð¡ ;Þœ·ìõ‡.+ _Έñ S‹ò(ô{tÅú/H|»oÇŽÏžêSè+½öšâLF>ýˆ–7×WO÷.œ³€¿zõ•Eytœñâ7O{aûr0×–yí …Éèï÷Æäó8åÚg–N3ßôÚ‘Yƒ×Oκä{E%éyߪµÏô.æ®q$ùܰžþ^s]>“º§6îþâ‘Þ…¹GŒÈiÜd:Kaæ—ô÷º;òK¿ÅæéMo<±áˆy4îý`ÎÔ»×ðxøàæüº\ó,Šp YÜÆ¾Ú¸…óØûê°üç´»ÿËæ<_rmkjÆOpc3£Š®Ïo6Ožüá_ÅrµâðL~fZ;ìÚ¾…ššý—fô6u}5»pîÈ‘™…wΛŽüPéupí} Ý™=…kVÿ€ï9¸cËÇOÎõ”%?ŒÄwÇk×eÕíæ–F>6ïúæåñ¹hñú—›3”^?´.×ßΞþÞh ­¯LΩé™Åï®æDý_›^¸¥C¡èê>÷££$!ßôôè2Ëîs×±í¶G—fa® þ´ù·¾1­¢êçÀÇ>iæíÛñá³7WÖ_M?¸æë#æàž­ëW/ff¥øx¾ºÞþÌ;wîkZ‡âûÍï½ôÐÄ+‡÷>=È™}®™÷Âòï­^½z\ïøé¶=ûè’ñ7üm\ÿ:U:UñS[œû§ªÖ]ꇛ²TµèÒ¯fhÝ™ë÷é\S߯ëè¡uüÞmš¼©}›²¢)8 > ‰ñƒV©ïGßh$˜–„hêà'×fà±o¨Aü1(‘BgS7VL ðI »$76cšÂ”á°ê ^ÇÈKÀ¹*Î)0qF/þáHIã‚_ÂWå{¼£…%€¼å{„Âgl' Ò≓08ŒñKlàÂý8T)ö8j[ƒø¢@!: èC ŸðÁ‘§Ñ7©âzc X-}Þ¢mQ‰Pˆ%ò¼¡äÞ£Üjª]Ð<„BV.òH‚¹K- \K¼—Õ »†.3ŠÃ’T¢çupP®ž d2É P§ ÐÅb*xÛ £Û À…°:%V”FF í7Øé³Ø0ákVÛ¨%E0y"g\ªR(–=ÎBád|e÷­&·ˆ£˜âj—D“#¸Lcù6©˜ÛiG‰Bš_# óX‚€&d´“%'¹è“8Ð@´0TRü¬i@,ÌÎ@I¸–¬ÔZÝx¨Œ?V‚Œƒ %±£@][j`gmøˆ²~S®¾„Œ)ôµ!@hY»83.ãÔ-¶¡5:sëbJ8ò5"Å>¯0ެà ^Ša´:ur²pÈ,eqš~Q̈ PåIðs±…Œ ‰ -Ù?°¿\߀Õ:GC,a¾¬Ôð ^Ä\‚”©@GÄÅ\­oÖÆô#,$–`sGqö¤O‘꘎4Ø&qtS%¬Ý/ÄcÑþà¡æ;™¾žBðíúš&ˆ7"ƒ…m`ð©Ä‡Žî²è&¬Ò±fHb.Z'Ë@¾@[\¢Áì rKŠO“=(þe6ˆ2n„ü†a£‘{ òæ:”’ÜlZ»hBËJkÞŠ•ÎÂïÍÀ¬F_lqE)âP* ^®â.'"!ØbýYÂ3—$JÞŽ8ŽË Fá¡'+¨¬?Ye­•YÍ"”Ë·Ñt.ïÕ&|*æÏ@¢£y“« âÈ-¶¡Ýüh® Mç¸Q~½æÚbmƒürŸå`r³Þ%‘ÔËqŠEcIc^Z²z ›l/ÊÏGb^R¢:‘èHtŒ†'Jàû¹x:ðpƒ+G¬qThÐë)0SyòÏgÛ Á/'-»JßËèëËNsš…<õ› dpgâ™bgxScÁ˜ë ~0ãÆô&T‡ùœÊˆ)kV:ö3T,ÓnÇ8­\œÿë0ÓæÖã)˜)÷ 3«ÌtX˜iîn‚™ÒüßÍ!LwÃø¿(Ì´äúû#ßr„ëgÿÚÌ›þÃ?ÿ±™¨Æ¿o¢´ÿûøÂ‹Ð•Mã› ÛþW÷ÏÿŒ¼*cÓHÚ&Zý—§$…v]2‚èÂ?6]1ÿoé§_Ôs@Ÿhê×EóyÐÝÏ›Àƶ:v\¿ í÷þñ¹_«ò2è?;±XÃ^¯³G\ÓpA‰öëÔÉåÑvÿ9­¨úxö€=Šh´ã³´Z¤gU·ÌÿÔêœ6ÀÈþ%ÿE>éünÕÅàÅSz]È ûEÂ"¹ÄßwèÔï¢ 3ÙêìžÝN.e?eÀ•P½Þeõ5ná·¿ÈÿvúEçŸXøÕiçØluIÃÈrþ¾VýnºelûB¡ëu“z ¿pþ’«Ã¸×EIáøvÝ,kÛ1·NèV–E¡ÛÍ?|S—Bý¼y@œtVî;ÿØýSÀ“zu×ú?oÂ=·U ¦>ùÚEo¾òøœçßy}vׂߣ{”Êç\h*£Å—µ‘Ÿ;aÞœ¾åYjX¹ñËO7n\÷ê¬Áƒ.ïÔ\îÖ8Š/•–ÇÌ7¾eùi_ߺwÏk?\ñìŒQ—žnЯŽzê…Ï;wøÐÎ2¬zN{ð¶Kʳ(tyðãíŸ,¹ëÉ¥ONíA•ÿ[»÷ ä[‡‘õÝÑAþÎÔ˵G¨³«ªÁY—^Úº@—‘ƒ?ý`ÁëîzlÎe²õÔ’;Î-œ4|ò(þÎ3ÅŽjG½€ªÀëÛPcþøMkdÜuÚ¢Ç&µ-ËáÌ©O.‡ùiîìCÿÄßœ~¦ ãáØqä°³M'%¨¡ôŠûžž7î´Ò,úÜÿÌ=„tê}“K½:õ,tàï2óê9Ó[pûÈq£Í×Ä ó—>uËù…Bÿ‡–>D_Ôæâóxú¸dÎ KîÍÊÙ3Öìþn%Ävœòø’'çÝ{ÿt $ÚÞ²äíe3.(\ÿÚÚçé‹ÚÖ]ÌŸ“®zdÙSr£áÕ]f êï[òÚãw\=cÑÂÛP©ý¬\ÿîÓ÷¾¹õ›U“é—_*У³o\ôÂ=*ò‚ÇýÙ¿vÎí‹Þü𣧞_è?ÙsSÏ5M=ùÕ/¶}ùéŽÆÆo^0ÅN/»¼‹Î5æ,}v²£Ó½“{ÿÀW›wìÝûùÃÝÑ@/¿÷­Mß÷Á¶í›7îmlÜú̵CG ¿0›e¯}é …½Vߺ"äøŒÒG¾¸áÓW&™V¹réÚUOß·ÚÜñå«÷O¬Ë‰L]ùÁSÂY]÷̶<ª`QZ_öäæ=7eôг³/*ܸæûÆo×>2Jš±}¿‘WO{wÛ–h3veÞpרǶljÜ»Ü4ó€93LÛtyt㾯—OAêI ½öß^ûÅÞÆo^fÖù¶ó6æsh<ð.é&ÚØøÉôB§©wŽ;ïyíóæ>œ^ùÀKïÉÅ[½[û\ ¼æëçSžøØhï}è‘4»Ô<ôæójë5ïýo[qpÛ;pçør)lË3ã/(Ü €éþ/?Z6‰Fäi7>6ŸX€(Öz÷ú''\ÓƒBI½\Ïù惥¯ãWm{^ð°—NŸMx“°/‡6¿>ûÂÂ9<àkžÝYšEc£EÚn] (÷S¯= CóŠÈûàºGG·/üAØíÛ>¸¥< {m¼U»Á€¹^m:ã¢?þt>æ–à<ªO8&íËéšÅå¼ü ©qï£÷FÒÉÝ¥ƒ_ñîa\ß.QÐæÐ%¯¼·cá:À®Æ\&Lºý^¨PöúôAõŽ}wçŽ×îˆÜz'%õ¨¯áUò칇ãò>´ñ髹v»¹kÏÚ'Ö£È{_‚vC‡«'‘UmÄ+‡… n{oÑÍ×ß0kó ˆ¶¼|Ûu7Î~`Æ`¸íço<\ûw|¾î“ÍÅP¨o¿øhÕÛÏÝa²#„ìÐΟgm¾ ÛñæÍ¹eàü9ï7 5™¿ö­]d.u¿÷ã„ übATØXJ÷|pTyürñ°BÉuÁÜ£)ÇÞÏO(‡[u»gm3ëãÐÞ¯V?8´`ë‚{×6£]¾ÛºnõOO«`5âê:ûݯööù½_­yiÁÄ+‡]vFåLÛN{nõæ]ûç$’ãvaÿÐÊâ³j¡ƒ7 SsN,VÈm¥ZÊp.¦ ¨Q]v賿ÝXáyŽú—L±”þ¯b œ ÄJ ŸXš: $0Á] Þ™Ðr B Z8ùœ£-|sÌ= ÊLáž‘®O)lKaÔ&÷±µ)W(¯Y8G+6öÂÃéšalDTäÕ;rÔ2>cÆxH©Ø› "´A#¦åüc5¹sI‚⚎’_[»«¾Ëç "ÌX9€jàÁI¾M!_N-ïªÏœÞ ÜÆP.)Õ;ü‘pàgŒÎ©€Àõªp±Üó s1fÁe_o$4, 2Q.,8ÙCW°ÊeX¿0"dœòdX[œA˜#VwmÍä:7X£}éq `*¾2š%±ŠÀ‹p©šÇ––=rBáy°=Ù+Û’`âoÉ×Rø÷”ì0ÇU(/v®°ÐJˆ3¾#øˆX±VäÖö?/ƒ1rs‚P̺,Ï÷FJa V `âõTvÁ—¾‘q¡Âù¯DkðÕ Ÿ<Ô ôg¯® O@Ê&néP ÑÂá#A¬ôèß ‰nV-® @jj%šá&eøk®kEëÔE„%äÜ1‰2îþéPÞ/ôwù¶r”WZ9uj <‚À–óS¨×€¦¨AL¨ÞQî.`¼”>1¥ø”Eû;É‘[â ¹kB­à†Øòôfµc̼ϣidÖR¶¢³1‹æ|áX…›Vý×Â!Œ€¹gt²¨L“Âîè G]ˆßå«W:ƒÒñ®(WPzÊ1 /2i ‡ •KSâ;€qñƒüðhÓ<˜À2*O¡_Ó%™›@้€ðŒò‰sˆ âŒF DQ ƒ¶Jãaxúâú–?^iÇÚ°ÐØã$ÌŽÙ`¿5Js%æfÔc1«>ßé1¸=ÈÈòŠB0x ° =–ç7?ƒñai"Ë(V3+)+‡€vT—ƒØ²vz61›Š}?‡ÎÖ9xûa€ðêmš#å\]?±# ¸ósœ“06+² 1/ÅòD^Áèo\ f/wà,xbš “ k j.Ð’º­yÄÃOUˆQ›TA 'põDd™¢»åÿ/ÑÍ®ÆÿhHýÿqjÑQ•éfÑî&´=ÁÿÝ ´€ïùÿeÑÌ´TMùº›} ;Påë—•ýÜG¾þýúß4Ÿ\¨èÊÊ^õ»ÃÝ×ô••ýßN<Ü}M\—/ûâßuÿð³¼€øoN;õ¨¿ãW¿(NÌ<þñ9Éan.¡“¢úÿÅ~^(xm-"!èv~ËBé¥-UÊ^Ç/þ…N{uÓ€ï:÷>ÏâÔo~ÜñìºþÕñEþõŸLÝ·‚êú)ýG\¬0†Óz÷R¾‚¶@O9 ¥¬*ÁDüÆ´á šà _¯nùï~ÑÉòÅU¶]~w~mV¦€Q1$æ¿/üÊgÈCŸIרÃÕê Lÿ€/nØ~ÒùÊ1]Í;O9-O õ›¸Eáß*üÉc§‹r¹¹Î@ÔÇZœb¥¿{Þ<ûšS ¿ÃÙ9”…{ú¿~QÅ÷švï+ØÚ¾×©ÒÇ~Ó¦­–ºfî³óû ¿o×££Õo>ál ýo©¾î¾û¯×ÞÓúÕb>œJ{Z'E |ò½7§·5µÔ©w7Í‚à ­Û9…¶ãî^pçpáz8gôSùq•ùGÛž Shxm˦Åð;]Þ½³NÍå`Ž9ñ‚þ¦Ì]0ç*þˆ¶Cï|lîåø€3L×Lúô9]r¸ñÃýû×Ý G§aýØãÕiôªý®7ÜõÈÂ9c»“ëç¼i‹×|ø Ò¶©éuɈ+ˆ{ì‚g¾nlüúy8®;ŽFN ~ÚD:ÜïzócOÏÃD6g¾½mß·k'Ró›<õ¦k.áÞ~Ö¬u‡@ƒÏè4f$jwšrÿÄÃÒñ¦GL`2«3¦,‡í›gà5¾xÊ왓úKï¬$)‡Vƒ,äâñ Ôù.¼óñ{zãøÊ{g õÎ¥‹˜æâ“—Ú\që­×^.¥¶wo >¾Ö4Ï•S‡Q]:wñCLZP{û4ñÐ ÇèÏ]=†tQotís̲yz¡0èîÙ Eé=ÿ•'ع|É´[ÅOXÿ¶ø6ö¼àÆ¡3>¥Æù~í]ÓŸ{í±Ë)ñÂyË_ºš_0kf-ß8j¥º46̯5=ûýÉÂ)ë¯6oßüÃDªg­øàQ*ý¨…¹Ó•kÔòÀ?·ÃjÄ[9Ç˾U›rãšížÛ¹Ðû±Õ+ær[\ó‘ÍázóÏ?Ú14äµ¼ïoÃdNºáÐÁí+ÏyÓ·_¿Áª­Ó,ŧ·›žÒV§‡>Kò¾Ò ‰ž ó“¨ÞCßí€[òËÑ={gœß¾\W8£oosϺ?/k»ÿrÂ_•óâî{çS£æø=¶/½õŽ©#N×Ïÿ~ÞmôõbSõ}ž+¢yÚ³bÎK7çïÚùÁ²ûFX@ØÀeE”Û–Íœýr ãÌ÷_m-qÚm'§îÚ~n±dðw_m=²îËç®ÊÁC†¾xd~š’kÇëSòtm§¯>:'é¡íoL+bÉ+t›sT¾Ú=Ÿ.™RœA¡pþÝ«ç@/º¾ûâõû†žU(½ºÝ¾ôóæ|ÉÁÝ_¿ÿŠsËžG]Œœÿ滾?¬òó¡=›×¼tßÈ&]‹ç6Üûüë+?ܸ«2%Æ=[V/{`üÀòòçËÑgø˜\º|å{– |ŸlÙ¾mã‡ï.›?~`Åâ—¥nx1ÆUï|ÑÜëúƒ_±ÍÅŽÈãoàúo¯äQx%›ØÚÒÞõϼyíd·°|òš €ºŽ ýA¤F@//!™8ä÷YS¨ÎåH•cmSÖ`­Îr)È"Í"çËß×ÝÜýŸ²³v«Úð³åâPR¬ÊRRE§*Tq•Ô¬š½*“ÈâpôI0¹EøðË\QÙJ؇³\ËzN.0­GX@k òLjA÷=¡¯—‚E"˱U¦žs9ø~,’JApwFÁK-+‡rñgT üª"VN¦Y4|V¨ÖÓÞ]1¬­b\i¬œæPXW1¯<\O² Õ,O¢ÐŸÝ[‘£qh¹ãÚ°4ö¿C''—Õ6 ÑLM¤YùLØô ¹ÛŠÇUˆPÔ,ħ›Œ´Ü,œüí©" B ¯G¬bV†8UM Xƹt艪fs¢ï±R…Ïlš<©è2P€)'Æn"5a£/uÛQG§Šš8´&D¾i©/=ˆˆpºÛ›‰Þ…j^ý1iF–©Ÿag:Τ“pRˆ³…:™Q\™R¹RvÉVœg´Ä±z˜ÑýH£E|1 3‰>Â.ÈÐsáË&6ñ‹ X#ˆE'0áù¶c³F)gÙê†À)S„â^¨\KuÁÌ\dD ÃY8âG‡ñ%”‚y"7¶Ä9Ú©k¾†+ú!{¹©»Ò¾,»x1(5ØŠs/äÑI0-AÊ=6Þ˜„†`Ê}‚8l²Š#_5w–@KÌ~`ô*?XO @T]k!RôÓüÆdK` i•t„Í€ž`=žÃ$‡T! øfü†9‘;Džo—AèÞ“3ò¢¢, T”é`Æ­õR¬¦‡ž)SEêÈ`jÕŒdîài("‘ïY)Rô)EÈtiZæH„§ŒeØ*CY‘פE* —РH¨³$ì’®--„ãÚ±›*§†­å|¾j‡kPpäîØå ŸÁ,Ir)‰WÈš°îø6?èªB&-5ÏAi¬:£ ÞQr°XÚƒÖ” [º!ëã„2·X¬@æ6t+QfÊiEH2³+U¬¾ZQTåùr¯À.ŽhI‘ˆ†¹¶›Ù+Šdè(¡K"AòÕYLD_("OŽš QmTU–íÒ L?I¸–U€Ðqd$P¢%]•ïKD›NË*² aÈ$¿ð±Ì²Š T€“´±2±½ˆTß<V2V "¡IÇjRQ\?†žˆqjã1cº¬ˆSgÆÈóxÙÔqS– £3YÌ.ß :eêÀ’Ùe6C]ˈÊa§²åÉH¡€ä”uX2GiÅ…<¥°æ[ ¤|¡•RN™`° Ñ8Í¢‚Ä\E1º ÂuœE™1å¯s|½[ÖYI $?" ³^+Y)Á):±b¦U`]ÔêÄ$â ¹uML\MLTPècȶõ}-IY&âv¥Û§<ÄV«öb)Y™ !G¢…ä +H!rwdëN`.™i±„#‘bsÙâ©Ã;èjÛ³B‡ð¤Æ-¨)£ËfŠ2kzV 0²9 ·„;žûP97fO{· ³hê«ØfÌä”XX£8DcȾÉAmê GrÅœQ°2´McÝn” Æ™]ó4Ã9‹H¬–ÖF–0„”*ó€0Æ8Õ2'ØsËJ"g?¹DlõSý ­Ú›ô±ØÂÒb>È@•ëñ…a” 4t”5ö/+"ÖY5c Î?ÊUê(„ØÔñB­¸2éR­¸ B§%QËÕSõ3`lU‚M'ZXmi*¨[êe|g*k è±ke:A",.©ïÄRõAê LYXIHW„»I¸6WôjRò%ÍÇŠð£žÙt‘ÂÃâg⦎˰&KAŲ”‘$zˆEÐaè"î‡j—U Gɦ{±€Žì ŒŽ„β|P˜ñÅØ±+ €š—È"»c6}-ËšŸ£”ƒzº+‰±—d˜=³×ø>ó,¶$hnìP“ø.w²–•ifx“„3O cºû&av)p*Ø;ì y®G"¶ºÍò¸!¨†h{&›lÆ%BHZ¹¤À(+WNV‹sCMO”&˓ψ¬U‰mÇo•qóTdñ©ÄøÃ‡lö´py9ÉB´I@tc~jA›~ªBíi¶ÑòÓ§®…膱i& ŸÅÒ¨•ó­JðZŠ×,èÅóÇØSO”åeöƇs](Z´š‘ ŒÛX€–))UvNÚøq¢™ÖüIôžÙ‡!^% EÆ“==# ôH‡$¤su(‘b(ça-+q;õ´wÓ!(ÿ ‡È"ä…±Pà!7 Ëx«­/DÇvç®[;|= |#›Xš-9fÏCl+‚qKq»ÙárEo ¸§½›Öô½„MÏl¿†˜È5ÔyeÌ; ÿ‰" “åó(e³^:pÇ@9(Y.7Ò‘:­tÏB[OŽT‰PÌÕ…%·µGWeÌ8¸ eˈ6Qd…ï9ñY!Ôî&¸^P}Êî^NȾRî!©GŠ#N”̺Fa° ' ÿ@ &~ˆY™½øî$Ì t¶ú\Ž×É,1™pÍÖÆÇ†È“DbGlY™v\íÁØr@JȨӅIÛ±Fnäe:^¾®'&*N¹êØfëZÉî’ª¨•ÚjYAqvP¶ëIb!õ¤µOG¬q=ŽÃÖ3õ$:¥Ô-«ù!v„ð-ÜáZ*ÚÀq$”4*ÖD~èÚu9MxÛ4ÈþÀå8­ }6 G‘Ë^:Oj)!;øÈœ×‡`^ìÉÝN¢Î,ß¡š†^…t†ØŠ1¤I|芘j5T'†ìØçÊs•¿›ŽË(‘ÜÔZ 8¼h Çl'ÑSHäó†4óÇ(µV’r\–…D,“”ÆÊxî±6|Š˜naw”Ÿô¹“}üÀñ8wW~óT¡P£Òõ²É:uJ¾žOvÊý ¾rW¥R˜ rˆ#‹"%F6‹T"Í<Çaž;5H}9þ¢ùŒÍ>Ý…Ý$9û%Q-ÐÁ§jgÐx¢C£T\åd¨· +Y¡ãËÝÊ'Df%§f³"²ÑJ¤+æ²ðBùÁõãÌr51m)ŠuT2çSÕ•2…–žö…Q t‡øáa1¥ö&·?çTHßÄÒ†ØC4ÎÍ¥ÿô¨)÷5‰ 4íæ#Â:{%…uÄÇÑ*O…8ànßažö :|Ìî™ÑçDâã&,qcx ‹ Ðäì´R¿&Ã7XNÂX»ö΄ï¬V:ÂôÀ®Úžè Al&l~ “hd²ý€ýéy‡Êì¥røgßX|VB3:l¾-™ñU(T‚˜\A%EŒ#è „ÿr¾‹PFªÐ5ÖcæÁc–Èîˆ8KècQ1¡¯ÚOûµ¼Ô–ÁŒ©B´W·êYmùõ'âÐ…Gµí`,n‘€ë}cùÚ óó‰r8.!~N¶u,CZÂôËûK5"CÍÏ8¬r &€ÿÅ@™íºH4Ä`dŽÍ6ÊÞôPn¸8ôeÒ¡ðAB'A:äør„ìµ…×:ÀàUGÁ؆¯ªCåœ;÷ŸÇ<ÆñA Ä6¦ÔØ8ÃB3Æ–ÞLz *‘?ø£ý@œhÔ-Ñ~ôѾ#mï“á‚NèIµ4Õ3½TùeÏ ØÐؤ…(õ³\ÍUGf­” ”‚¹Ù½®-­g‘Y埀.À£CrF'²ßÚ]ƒäBCAž:QRÏò…ÃAÐh|¡5€Š¯}Þ Ì:C.;rTºÜQ ;æ@„¾7íÄOÃF¸¥zoD‡c©Ý'ú*—FÉ/ˆ–ºC]Ä*iЙ²Çܽ§ h‘W Ñ‘èU“ÑW-EŽÚш2½{±Ny‰“ÕK¬ÀIMÔÅŽ"‹ï…RU"Y$‘O yûÃdɉÅÌe¹¦ŽÒåJ ‰zr±Æxþ^Ä¿¸7Vv’|¤LQ^²è8l‘$¬¤Ê‡ƒxœ;¹-³^(‘CA&dŠ6ô¸i±¹[íî;¦ ´ ð°Z& ÙÂëÛ>0,¬„5š…gò™‰ërà鿆+E¥ÈŽ$Ä)èî´ $|d@¿@=DnÑI?ÈÇj‚Äå;qLjóÆj]bÒÐp³Äl*«»ÚÎPä+K#öÓˆ‘—¥6Ïîÿôì­t¶¶K¬‰Ì¾u²DÇ®°Ù†$;SChëh'ïŠ-Ïh~.SºVN>¹€Äe6Ý;v•× Ê§ãc…=\tÅ3”Aö‡c8Eá,|Ù±àuøfˆ= %ªË GA-† h.®н¾µd±H¹JHù©fˆïE<6·:d?”…¨!ÑãÀ%O‘@÷SœÅ1í¨Øéu,{*…2ÿð]•"ra_ÅYËΪcýƒöV”í8‘°> {Ǩð&…aÄva÷yï,²&í¡#¶Óà` ½°©é†³éV™ò"µb‰˜­lΕ¨pEჵ‰jc†gšTž¡SÇB>!ô6(1ÈB=|—Ñìò90Älj /œpcƒ€Žt…¤£ÍÇä<Ë®I©«aA„iYñ ŸO­+Ã3(‘£MÈy$šªë1¹,RW¶¢YŽÄ„qHt¬' l³¬YÄ…ˆ®&eËÁ&È5‘©¡f›‡ÔÁqàºzÞšò0ðkÆÌfÚ²òÎU³fp˜‚q¤•©âˆu‹9‘VÉ q-â,…T¨øéÖ’Ï DFûoöÊøÖýIžó\×N5ª“žZnÆlÑuLöÅ•Ö1ÎÂãøú!‘í!dÕ•À:ë—CE»“R1v šBYD‘¨°,øN%šªÂF^§»cØÊk?|3o½ß?|;OYTÚÐóÇ´¥·K›ÇÕïsH‹$J4½©zq·#‘ÉÕaœ„Aš[yK|3R¼cóΰ—úoÖAýýê†Wµ2°MßRÿt'¸³2ùäôÙÿ‡?á4Õ‰ØF/&ÆÕØ˜ÐÆÚ±îk¯îk"ÝfX©FÂþkH¨RèZ€- œ =tÉÍhà ždLÔ ï‹éÀC<Õ™ò•Õ$c„í‡ãêÂá[ŠpÄ%ÈUí0^’0YsB¬˜£rÖĦO1Þ0fÞ1jÒ Gœ²z¥dâ”c¾3Âct~ íB`¥ò#‡ 05ñè†%Êq$6±ö¸â{=a…¦¹r©ä@>¥ù³¨\ÀH‡–M1@|F°J2ÒˆNX¹´åÃ`.# íÁqÝ.âöS…­™žãñôR•ΖJt2Ÿ•m:Ñ0³Í;1ÁññË$(ˆX=¼Œ±&hŽ ǦðÔ©—•ÀuÏn9å³nœž[’JPNmq—Ë÷N_qØ/$®[Üå`_e™êyòp ­%#¡<ófõAøŠÙËc°ÉXD)Ζq§ç†8óqê…ÏÜî$<ŸÏ†¢n¼ˆÉb8'I·p˜JÂÍ ’p@¿¤ý7u¡Àa!õb_øOòá•°ÈÎ|÷ì¡:‚”ßeh¿Q锩2À8" @Ã-´=h²TÈ;û‡Â|"ÓMÍdæž„°äß sŠA%Ɔ½#ú‰d!˜p ÿU´B–‹Î†›BË+–Ž-[E<[Ò> …zL)Iˆ©ä­tÚlIØ@¡6æ·YKRn*쥸RȲ>D¬£@%JqúÙ Dè¥ î|­Øj'Gg9j\™Fîž)>Þ4Mhq¡†‘FârçÖKc Î*zƒÈ¨˜†5ö‚Ê %@Ê”DF”w>a¾†ÀcÒ.NôÊ׸ ðd2c„/6Þxâ_i „ %²Ãf‰0€|-m–ŒÝ˜ª¾„R¦½›Ã[Äi‹'™ƒ•x>}“ÔÆ¶áÏ€`¶^`CͲDc:Že®/mñ?Á€;b5‰€ì@)Iý{ÌR$–ND0Em¼SƒLÁÝécc¢‹+Ç­F¾ ¸¹¥T`EìI•6RžA|OYÒp–΀ïê‘Õ3Å•a½ ¬HNÈÒFKË™èWbêÆÀU;Ë@2òÆ\ÓYhh%±¼k¡vUßc…»VAF‹ÀØBi2,„“çêB Tª –_IK3ÖSÞ\c õ‰)ÂWª²6a§G.ú@ñÁøa| ±õPc‚ª€g#BJC¤ @ˆt–(‡ÄŠè%ÂÉF¬¢å"7M¬N£1u;îd:ô…â†݈«#ùBÌ…H÷" 6Uµ%Ðt…žÜë;Œ%:|RÕP|¯o÷ã¹—ù±£gÆ Ç: Ù)ú°Xý q°3Š*i”Wm-ã¤î’ ¥“Ò ™,)䤸hÙ'» Gj ænøêgÀ`‹„ƒÞk1l<^c©gÐɽ"‡h»M£U†úBº5ˆy ÓÁ*vXÚI 1då @j:tܦ¦ÖJêÇ–ÃT)Ûü”ûRlcÚÊ+FÖ@ê&!¤?uᙄ % ‡õ]a%DH‡JzÞƒÄÁÌ&*L.á}"¥6f¤òerg·P%P@ð#GbŽŠƒš°_àü‘¹="§Štµ8 J+~I±n©”žJµ©s/fE1l£•Ȉ§HŠ)I;W\=Â9ŧ[!ÇR§®2ò¥¼îŠWC!ª8dIù$Íã0aÍ€WÒ|¼DØ©‰ƒo()l¤ôVìƒQl…°áÌC”RàÖÕMþÃPWì.qcUÞ"6-3žFÇ•(ADÄg Šáˆ# íáãF¥'G–‹Ç6 úþ²ÖFØ—)Êã@˜ªª‹+²zNÆÃã(cŸç”»AøóŸhÔ'œwUóeU©Ð_kü…•q˜$*ÓÞ qÀ…1·tÄÁdÜzÚU1M‰ ZÚqÕY&nꂎ#ÝÊzQc&b`ækŒcÝ:Ó‹{¥´åD<#‡%´fr¯ôey¦{S€èëLð¢‰\Vœk:~ñ½¦lJäK€M+·éW©kUÄP_1Ó×äjg̾ú+Kj¶yË1>ÓåÐoÄ| ;H>SÂâÒŒAvkeÂÍüŸýL9„WÆËXúdv‘±ËZ©„5ª \HièIÊâØ]t=1 C…dšúo™­ ɉ憎^â©áÿôÅ/΀p)VêkŽ,y”,'ÀH÷‰X:P9xT¿Kg‰oDV´Y½Pæ/O ¡ž§‚c@iªÞ¾L"áL`=‰œ&ÚØÃ‡ž0D¢Ö•¯ÙPdt”)’Q±ÂØSÈ<‡•›k]–ÐLA´ó½!G%ó¨’P¬òþÂ6zL$av>ûÉ5®#ð"‰8¹{™ù3>&níH3¥^æFŽ,:ÀÍð ö@Îi=©A5 »¸›SÛk41Pc–Ö K…ÞÆf{¾¦:„˜p†f‚8–Ò†ÂOˆ—åüÛ~Ä®ž%=Ê9–¼L_Ÿ+b`È áBõHi”S^·<;{f>¦)–uôäÏ„§`QK!`E!OÎÌ”8ÑiÄL°”‰Ív7 ½¹V°1ba? ¤Í3ýáña¦Êý%Ù™œÃ´$x°/Ûø˜·Ë¼FÒ¾EKô¡+XÉ$!ß«Û/"…P=ÌŸOÂÌZDdÛÇ_Eçó…X\q´½O%1ä~sS™à‰â½¹±Š1oäÌ1\&:¨eõâó¥4ÑHPQÕ5mfg;f [Rž9С!D>±›>väa¯éi$…{Ó¢µ:Ùós ¸ÇË7‰Wl\î5œWeË{,–y:;'Xš€ÐBögšo ü2H, &ã†SZ{ š4R€;mÅä(ZqßrÄ`áµS›JçúiJžpØw•Hç’ PÌ! BW¹Öp\QP¹¢ XT0Ëæ¡'‘®H §5.¥VÏ|fï.Ó¤Êéï\AuÉ¡ð-™Þ‹÷ P”¿Ë;.×åc/v¬1ª–šı›tÊÄŠŽ*XYËü¦Ãt€„sÅ%gbÀÄ|`*ƒ‰¡NP7b©AjÄ‹hV€­a ž(ôâ´JM7'Õ½"Eþê~&VVr¢öˆ2K_Ú)¶„¦é’œÙT+{²X,ÊXI`N‹N$EìzÖl—ÐM0Ê2³Þ¯T錈å…Y# žæ² Q/ÂÉN‰è\¨¥@^«”ˆ©=pØa¨Z቞ :™™ë¡=aCbxÃ%JŒb¶âø˜IcËXA‚í|<E÷kÐ>NqÅåX{\;]ˆÖ'¡â 9^ÎcÞ\šœõÐ_ü¡g둎y)09"¦-_¦[ŽXǦßrÛ#€Ý¥gˆNxÍ,³Xö*]„¾¨L^1pÆ®Á]’#¶ÈªRà4¹W¹ܼx—²´Sð;¼ãL G™®q”áǾ}s áD™8(y!cË‹S ivY½6ÓXÇY9O5ð9$DÜ!ûTÚþ`°³J(z4«€ˆ¡¯«%æ¢D¢|bëÌJ@ýêëÈ"õlÆ€á.‘F39Æ‹0BÞW ¼¥‰Ãøà›_&2$ºo=¾àÃUl‚Ãij#€eÝávSF$L¶\Ÿ.X¿-c æ† º°Ä†I›ûø4´/`®Ž5«P¯rp;^pT•F¡Œ¥È W'öýtÜ€¦&|–º4Ñd9@_ãÕ%ÊÍÑ‘L ƉÂk“ÄÎ…¡+á¤LRÕ€É$Q߀+ì—šŠ6†utõ`µä»Ä4`—­8šÜ¼QiªŒŠn{K Væä¯ (ƒdlµå@ƒrPBF4Z†`¨u¨‹àªwe†u«r àgé?ä Ž‡+S£*œœú¢ á­ ŠÓŽÌäÎÐŽUéð„™Z*Ê”àè‡T:î)?RÝœˆ¹ÕÉÐQi)tU†é„Šæ'|CÊfZL+„¾.n ¤‡¾õÜÇ›OrÊÉiÊöÌ(®Z[o".Ö U ÙO‡´íkê„L«MÌE8Ç…ä ³.Ghx¡%èMÈUæÊÞ(ÉH…‰pÂñyŒfTjÞg?åÞɉtM6 ’dL‘Êd“i‘ùŠÅ¦ŒþØ:ð€tä8*àÓcœ ¸¼ƒ/?¿ÈøÜËO;*ŸŠ”ŸpO[*žËT8Ãá, ÅŸ›«[þÔµzCrXîDªÛCèǹO&Sн¾x c2x=SY‚2+Sg-A^j"’p9êöô#Bá|î*ERc®IäLYE,Ê›Zí•\¡ånSÑ+©ìd­èŽ-sÝÖÚ8ˆrGo¹SXŠWÙ…\ÉÙ\É1]ú…™»¢»»‚k\kT@ëi¶‹Æ~ÓÕ}áˆù X¼ )Ê…Ñ( r ¯Â–D>‡"y‘²6— › …=Z5´«¸‚c§Ò\/dE€8QO0ù¬ÙëÎaqEV(ñqèAEB !££+ƒ?Tp=+]EGu—vE÷7—¹¢³¼‚S½ÜûÎÏWòÔ7áÒ/qÿ×f3ž ÙžúsGÓp q V©GâÙ ¨ ¤‘rÅöÀÅsÅ&ÏÕ{ÙžXIõÄ=€hVvE‡_¢æsœÑ!i¸“xæ2ŠÞÈrÒÆ¯4ÁÂΉ[£â¼¶~Åãû²£þžö…M¸JÜ µ¶9ª¥("V!s1Òç…a¤TIªë³Ñ¬ßìå·d7C±¨I^~„×LÙ¦)-3›IöˆpŸ *­ 4©ÆJƲCé9DfEìf%œ'$”3BBèI*âC™Õ©ÿÊ‘'Ô¨t¡ß¢\ü´aXÓrþž¹TG·ViR´‡¦ˆ}™ó*QdôNãÅv=EË&‰Ä‹Î< b"Ú{å!™l¢pã{¢u¥5J“ e”(ci‰ÃL³©è^«äˆ«ä´ãݓ҂:X žÈ´qÐ9È…“€‚½4·36J,ãGQ e |)sEÄ~¸?»¹B(@Å  œEÅp„J •‚t[U1$¢ ¨žR1¥,æEr¨ SLÓ³ìî,ô¦bN¥€K¡\~L9ÈþĶð '’]Ɖ*¤>…#//ÅÈ:M<=Ù3vMÌõ¤®B¨sUÞ'›ÒDk•Æ'z¡'h¥‰OB,> Ú9dYH|¢·=«@iþ©8–çªxd›qM—B!2–øÀOuô‹¿ ›L;¸êöĆ5a¡_ßËë#Çe4Ç1…N4QDL´.[‰ÕsHŠcê#Br(¡"Ý-£·p—}ƒ~ßß9mˆ^zÞÁ‡÷\ßpß–-9™"ó?wÞPü’ð/Ž4ÿÝé²ËëjëkqFŸ!—ÕU9|äˆ~Uk×ô­^ÕixSˆÃÿVÅ?V× Ø¿ïðš¡ýú×Ê]‡ غʯZ_õ¨ˆÖnýSUK“Eþþ÷·XS_Uéþ¢[M%›{)‹&_Pü@ˆ:5Ô ,¾•²¨p¿çhaŽ˜5eá;¥ù›>Òi°iÞ~E7W÷«8 ªKíðþ—]6°Nï¥,*?ÐÆt°öƒ>WS”Eß~xÁðÚ!G*FWóª:× ®íŸÝÉuQéö jL'­2pÈðª.õÇ ¨k*wÊ‚Ÿi7²O]ë?UµângúiQ§û‘;oc:)÷ê$øzýÿ?»‚èWÔöfÛåøÅ!þ/r²ÿc/Ôÿâ¬ïÒ‹Í?=þRc3´ÉýI¾×/©èªÐVsbþÇcÍOòf§¨¦Í?}úæØ‘Zw¢OÎf,z±Y/¤µÄç¶læ7ÿ˜¡Òp7e+žvÐGÌÛmðàšAu}ªüÖUúôÖUâ=Ö¡ÑDYdF+)„åKå—œ?ua0K•”$úëV‡1¹i»´VþÊm“_JŠÂ÷‰½ò×-UÙòSR´¤¸ëŒö=ºRõ LùSä.õ£Ö8®õ¹ƒ‡\1˜þaLÂm†Œ¼ B:æªZŸg k̺Ög˱¡Nol]-Öb»þÍgâQÓú®â8õOô­å–¿Tz¨K}iºÃ>tf͈þµù'P—‡}Ä£¿v.÷šLò†¯ù¦!õÿQW;ÄX„}ð#ß&ŸVÕ\ݺ£Éºî?«N®:®ªE.Â'WÑ[«N>®ªuçšáõ¾¥zÈà>#û×7ñùPu—¼ urøWKæÆ3MÇ®jÑmD]Û†ºÁúôÁWRMgUG\UüÿŽ !@Ö𺌱ƒQHG¡3ûŠêÛ¾¹™µÍ£µëðšÁ#þsÈðA¢÷f_ßÂþÒª¦ÿPÓóy°™ßëd ´È=ÛºkÿúGìZ¶ÒêõI™ŠFü)ÿëðºÿhFtÏJ‰=s¤õÔÕ˜äµ5ëº_ÚÙÌ-uƒëéÇ’ŸÚÕÔÖ^”ýÒÁìÕFTÊíì¦s;»87þeøz3·]úÿµ÷Ýý‰ãÜÂïà; .˜’j ©¤N’ILI„±a÷™ýã~öW’›lK¶ dÊîìýÝy‚-«®stÎåNO6Wb{Ué¾(Ý®c‘ò 3|ïýƒ¶+«[ž#ÀR‡=mdÃLÞËÃQOû¼`ôü>ü .{Œž®ÚÀàoú.D0ÞRñcLhÀ‹&€v/ÂJÆ“æHnmcµóÒ=ù««ôåÑ•¬ôdØ3jv~æxÍ™ÛgÌÑÙ@r4€H¡Ò‡ÏlLÄá®{ñ+Ü¿+Ï’ô”`3XK‹šÔ¹bXxÕ^åÍ«D2¯ÿðª_žWý$¶3ëUâŸÆ<`Sêwé“AßU¶­™[ŸS§ÊTÿ×mOàÐ ô­ËÒQ†£˜Q󵫴ºãðÅ÷ѯhîx˜˜NV¡·ð%•€FZ?j/Õz`ºvúžóÍàæ+ØÍ¸>Œ‘7#w2;ÓÑ(ëìÞPASìãüør¤ö:Ý Øhüiì4ÆûÃöÛß=µ«©}t¾MÔñ»%Qô/€ÝÞûÇdF®…B£L*¯ôÔQ_þ®ýLÌI@~i@Ô°°!¤oÞò ï"Ös2%þ¶R±?P¾føf—Lèú(…ÿÝÌR‡”’7|ñwW~së<ð)]ßѾarõš’aàÚëPù=1å.fhŸÈƒö«íÁp2¶ IùUÓAò–0’ÿêÚÕ¹¥û“q×h »òƒdR0‰Rjî7\Z/ P³%Yù*ÖaEé|U*Í Ÿ6w;òüx¡ý¬·úç.<©ËUÚ^¸ÔŸ(T|±µ Œ7/C½RÏh·Û,ïï¤ hÛÝÄ"à¿èúþ·×·v í˨tQjÅáÃÈÿmµÆ;òXF*‹¡^ÂM]åd€ÅœÅ0ä%sÄÿ!ubOî)á’ 5ô_N‡øoºL’JŸE¢©ôúÄfž¥”åaP*ÐŽ²1áÝnÚ}¼YÔôg¨ô?ÅÐs.;S$¨|¼¯¡É{›™N#Òie62yv“ hhz»Cî ÿv¾Ó^Qmûœ Ö‚S¿ê ’B­þ ckÐBâ¨7&8:²ò¦.oÂn@oSŠF€R(ĸtÖLDÎ$S4³”!úÏ@ j»¯à«j«JûçÈÕŸ%öÛÝ_ƤŸ•€¬°îÀE5ús*ɘß1»B !˜¶Áà5 ¢É¢:cÍò4€ùþcwJêÊÜ,Jÿ/nþ£@„¯Ñ¯-/ ©/iŸ×.ÅN@sºï®`ØÿEí$”fÛ‹ŸbÙÿ9Vø L=É~¬`{äXaî–cNÒ­üÏ0çÔ;<ôcd±ËÆ)¤›ûCº?‰tÑ¥/“®Õ‰©0~iÒÍ}&åþToÃÕVŒ3¼…ÕüÓ8,hQGæ­òDöºÿè>ÿ©"û'˜ySM0Öþ¥Úq¼ýUN7’¹eDŽpPg‘ž§k˜^"Û4¾(‡M<Ø4þÓ8ù†¯/·Dõž‚Vß^‰‡îi€~k@˜ gŒhР·€`DÒ@ñ9?'DC©‹æµ²8æUÝy`ÄŠ¼vAEö·…©Í™X¡ã ¢ íT:gÀ+¯§–P ñ9ñæ?  X96lPª tìÈé5±) ø«÷·Eþ÷…Î5Í„+Ü b8೺p5keP@Qø½A¡³Š‚dˆR‹kšrÃ<€€€è\³ø[ƒÂHÁ1U)(xã6ЇÌÔ¯¸Ÿœ§óŸ0nLÏøYïO[‹ÍZk œ5ÝÞFà,)L–pÞÇèy3~L¿f°ÿÀWкýªEöý|Ûð_‚Ä›ÑàF’´hgþl~±¯?×ÑÆ7ïãfsŒýŽÑ¦jÀ6SÑòMϱabÒO ÚÚ fàþø×Œø"9Ø?,6FE `* 9Øæ­Öe¨·ÌêG¶ÄËøûèg9y5Ö|åÆÏT&½Ä¸¿ D†õós·}/Q-÷•=—ÀCw!…÷äþóx8覵¦DÁgoÉ*ý¯N-÷6Etkj"·ÐØè™¿£øû›õ{[í£KðwßúþØ~ëjaÊ[WÝÀST·ŠWV¾«cXíoÈYÍ>ëÚÜíð~ß‚ï¸{–ûEîžæÏõKîŒ/_ Ò»ùëøÃ:~2ëÈþazˆ–‘ãd^5¨GqÛâØK‰ÝÊþ£xüá?€{¬ý¢Üã3ïø‘ë(ü,³ú®Þ‡/J﹇ŽIÿƒ3Ê12fD£ÐKÁ:ô*]ç1Q«ùBÊ1.•¸Ùœ¿ÑE=ë!-95X>³},ÐÍ“o“2˜Ÿë;'gæÏÊúM=þYÚõÖ×é_ÈÓ}þ}QÝþ¹4—ónÿla~ÿl¿ÿ¯qáçÏsdß§ò¤?~À„q³÷>ê›Â˜rtp>spW{‚4[âH£1¶T¡¼:èìšõÉ}‹œŸ”D„VtÚb//¿;Ÿ«€!<7ÿ„œÏC§m7´âׯ½qW{7sDØz Õè±^£>»íöa¦Šö]ÐÓUð}£÷n,aʘÐÉqïåu kh™]÷6[÷rhyœ¦p›7q„ãûÍr¸?|†[ðsmÞBŽÇ:Œ|\³Zžd$" F·h)ˆ²áøéîñÅÉq5œ¤ð¥5ý1è´d"œW¦á(:iÈŠÞèÚxƒS åXÉ¥6ãY‹Žˆ9ë:R¬¦¥z%~1Ž# |1œÀ ^3/Yå¢;´_Ò#„ç´WÍïï­avóÿ`Ñ ¹ÕU?àfÆ!¦„†Êèu~•å÷Ñ J5?ê`ÉÝp¹?QÇ&u (áÝÑÍ¶ŽšþÕEåÀüêý-‡€y)]UôÚSßRcV¾wǯ݉ L”„€ ~àÁ9°R”pmØï¡Ñ–/€}ÿ+Ãön^X³¡ØcÆø ˜-ü…I ð;~wÔíô&ïáó.J÷Ó¸YdL€›4»ãÉ(\ëC=概u‚톌Š wï†ølµœ®Ø£È™Æö¨—Öž™¢Wî÷TÇ#u4;½£ðYÔ™)^G²¦ÈÅ×á¤Ã»“ñ0|.ýÓ%9Ö€Tx„h@í½OúfuìѬÈZ9‡°5܆ž}}7GcèX Œü¿÷þ¼^ˆ=wõådvEÖZ}vsèkÕ~íõ;JW‘]n¼…ÿŒÑÅWðm|i >þ%+ê:†@xÓ¿dÄYQ[ø\¥´˜ø¤ÏDµýúM¡3ÐÜ‚~€bºÈ-焘Ӯ«ÕîõÂ3¬ `!»ð_ÞzNÛ?#$xOH0­¿'qÇ‚ø¾»ú“ ½ ãðý³Hýwâbk1/6eGåÏÃÃ5U†6Ô‰±¢ã§Ó˜Ë/4••ªÏÿÂÒø'“Úïµw^,æòi)g¼ÓÖúew¿ÿlæ+dói®+ú­æL¸ú³WÃóùt±è»˜¿µ¼Lÿým$pþÌEe¥4½8>‹zíB«—eUFËŸ¼W†qH[Pk8úN£û<>QzÚQ¶ïÒÜßüÂq½æp¢´»%èÄøéÒȨŸ=…÷îXÖ¢f›GqÆy,ttW vaî žïÂo`&'ã0ôl̦º›ÃíÝiȃ—‰üÒ ŸGFûœ$‰Õ5æÃŠa‡JBV(Ð[ axÞ2ðœpOöåq7Ü‚Gz~=FŸ¨1r<)uÃÝÿÃÕNo,·zýÞø;ã|[&È}'l5å­¢Ó°åQW}5]Lȇ„ùÐì,6G§l# Jû;€B¯VMÏ”ï$Løú® ƒ¯ÈÙæ{2xÏØ¥ØØR³Ûß“Çaöa-ÛýŠŠÞ’X—Ù²1lË}hÃãmñPÛ†£ÚAö¶»*+à;0zýÚk¿ž*Ãç^¿{Øýn§y[Ëê{«Ûqµ´akÜœ´Ôî¸6ŒÕs¼k ÙlÍaü‚îØõjvZ©Á– C%³Ø¦éTHÝg¶ 7ºuûnLçÂϦ³udà<ô9 ãWõþ Ýï^@Cïƒ^À¼}¾êU*T‹àtÅR j-ófÚZ*åVÿêƒÚpKî˃¶ÉÆ2Ø©¥ÿœ‡šN–Q=mš¥9.ÌYð8sCM<à%„w÷å=T%g‚FÉX"<ómØJ·á©ÊØÅðÍF€Ã†ðÒMxö¦´PÔ.V±¯ÎÙR}ëZ°o&…éŒi [ûƒçaØ"3Ž"µN0âìPkR7‚¾a¾©ÆüGô‰ÆŽ2Wn”pÜà©›mÛ(w³2Dü²Žøç4ÄGÃÓ›²ŒÀÁcÃ.A zõä4¨ÀÑ1Œ‰ô”:ZŽ]¹ª—róZãrÞÔ†„‚m-ðÒb* ‹…jæ¤ê™= ú™ rw© 7] €Ã8+ÌQ›¿ËÊ›jGc†Æ&}0´Å°‰†çÁ8Ýé”ç¡©¹2têàónàöKqªÀ6º4Ôǵ.­t¶Ãö2_¤¶Â]¥”­lº MBÙp‡&ŸºÞ E_ÃÏÜñV¯ §‡Ú…×|ƒI{ÎYoó—Ëêw¶B‘ÃF_¾íþò'j{Ôo§£Ö¦=P½ ÚŒ{}ÓÛE¥gÕÉõhƒ(ÔOb(…‘¦¬ÑŒmKˆmÔIËX•H}›_ƒÔ¢…R·&:È(ß §•Ú#Ê -#…ªH§Ã~Ï‹WŸéÌýA»?q~vâå óIìÖèBÛ,訌õî0ÏD>`ªRÆö; /=µÎo”áÀkМ»€QµäqCþÞU¼3ÞËAZ~WÍÑbÁƒ¨Ÿiå}kÊð}Wÿ=TÞ.<µêgç–4 öaÉOÓ¢~Ù0•®¬°†ƒaû&c.îÃÞ@"Y¢€\þ=Ð"Šö¡•¼Ûþ…û¤¶z °¶@ß[óöú°ÔïØbu7¼ö P˜ù%}½d{Šüm•ê|„<á\€-ðx/}7í:;¿Ûïøz`ˆ޹¿æ­ÅJ›~raÆrx~xå¾étñe”%OÇÑœCKc}Þê©>¾&vãø]ò&P~]Ñ4#üZ%—Þˆ‘«®h—ª˜€ó\ ½}1¾˜4Š'K–Êu·uÕëþͰ È äq÷âuòÞȽ¾J·¬ñýsx·9$*CäǦàBh9%€ñ ^iªsÙÇLF%iR€ÃôÕqüO6q3Ò¬ð¦º÷•®Õâ­Ø+’®ck ävÌî7 ØÜ<èf7xs`8©–ºFdfxóg¥û1±H–ÈÎðd£8‰?¨{jûý»o·õÛ·û ¨µ¨µhðì|žíƒ¬.ÅY´D×#þµß)'ÞžLYǽÞ•Ø‘W ‚¼†¼$>fky¥`È+C^)(òJìÈ+Ù‘7Mv”Ûº€¿’Ó¼ÿÌí(Ì1~àDáœ(0 °…% { P{8aÃ^ŽÑ9;¢û5¶á¢wË ˆÎ9–K÷Þ .®sAqÃqÝoò5ѹ@Œšs`9[kÅ•a¨áòwyà‹á\ çî Mžwy;îzc$á®à×2îò.ÜÍ=øp—Š»<;îòAp—„»| Üåá.OÁÝ#`Î l¹´ïÙÑ—„¾;ú vôõFJC_’™ak}úò>è+C_!(ú ìè+A_!ú ÐW„¾}õ‹yü0R€½B ìÙ±W´c¯7NŠözëÒb0ìrÚÇ6ƒ!¯yEväƒ ¯yÅ@È+B^‘‚¼ÚeT~ø(À]ѻƑüþà- /ØÁÎâ}®•]nJãh,¹ÝÚ+™“½âzMŽ)›¥æóÑBcc·‰lˆ‹ÿì¬ìŒ¥ÉZéäŸÊZÿþ‹DO•Hde9‰Ä¢¡êèë?xImrG9ÛçÁ *üÙÜÍ?¼ôÁ‹çðFÛ|½´Ó­£yÄzð½´sõð‘,¡+n¥êÓÖükiþÌ”„×–6ÐÏ‹œôÞ£ŸÕ§öþüÙGß–ÄÂú6\aý Åv.¾´×àƒmô V~~Øü'÷%7z­¶.¸hm£º6Kñ`·Ð½$K+g)ÐfƒOî.îÝWž/ž UY^^ÜMõ/8´´B!­ Ê¡ØîáM'—Û¿ÄRqéàç¡øÁBîòY‡ÜÊÛí!øoGM¼P§ÑÈÃòóöÀÈñý6ú[:‹\x~/¸¨ñ0ú­Þ|)ƒ‡'#óáöø}öÀ /ÿß–‰;‚•B§Ÿt‡+úͱG)gÐ+¹¥å}\w»Í¬+èìw:A„Õîz‚ÑùÆ»r âOˆ˜›Ü’žòÉí«V†Ë$V’Û¯cþ%d7ÎÖDóÅ™ùz±.n_ŒK•çbýmoá|S®"©×o{æÉv:I=vî")¡ÖŒÄ÷Ôüy›ÅHrks˪ââ>»}ò´Åí=lÃÉ’[¹•…JW)MªÉ£Æuåp?Ò4ÞVÞÒUÚ+>]Ô7C±êu©{¾“Q_62{»_+_jWÍ̘‚–ïà›Ó2@Š”#}¥›·YmÊ¥¡z¬ý¥¯´¡*J¶Òã27oy«I(f­P¹—ï²`…Ir«Yʪ‚zdLªP&·O-ð³Þç:K·¼ÛuõFyHTޏL¶Ç×üØ-ƒ/“_À(Qam|ÈàlO°A.sê Ò™ø¦Ð}R>Æ—Ö `|Ør+w.¯ ÄAÕÂ5Ot/[Œí¾‘݈.…bêòâpDZ«2yJ/Æ[‹ç÷¤A“Bƒ¶ÒÜÂÂÕ—cÉ`2¾o·_¸Z)wBp´ö­°8×OIƒrµçöuÐPlIÈÞVÉkÍÞv¸z]¹%ïjíãR(_´bà³ìе§Ëïkú §ËË`_ì»**W™W4(¿²ÛªÚwõNy¨\ÂAnTÊ>dÇéËUÒ ¡˜ò0Ú;°†u š;æÖhƒ¶•¯þ†<èqueá#79BƒifV]•j´A÷¶…ÿ…pµ‡½s4(Ä1'*©ë±·ÌU“8h=59¦ºÜ}Ù9! Ö¢lD2Š::]„î¸|V[ÙÎïD €ó#ç |éVôv5î4×l¼]¡AC1¾zÿV³­õË׸«JÄA£{jþmá,GôhEé‘ Åа;oå]m­®Aï\s­«’=\½?ìtScâ ÍÇíu4(”bîµßï”hƒ–¹«å›yÐÆÂ¤ùÒꃂQаW ~Hðe=SïÓ=ä®FâeÐíÄÕ×ë§ÝPŒ¸ÖëíÖ uÐÇÇÝñ5eÐû,÷pr‘p Fц=>yùvSÙX!ú0NŸQ}?M.ÝЭqg`âZOvÊÝ®Z&Zý¶š£ ZØ‹\s mP9:®£Aá(š¬‰l+“ë»,4é"š“…õÄ×Éû#tSqú´r¾¨úV\± *½.qGÇÒ”ê}ay+¾gp‘´¢¾,ÀAWÝì¡‘ŽÜ/äj`ÐÕ%Sï‡EmÐíx5…E£èŽìÖN–µAÆkvVx™\ßÛ<€ƒfÜ2õ’_Í7–¾Akç Joð1}ص³´}­{—¥ØÒTܾl4l+]¸S¥Ö’4œ›é—¢7ã³}0¨piвÛ\&câ†õ[*,ß^6îˆo'rdƒÛ¿OŽIo!ç——·xY=] ½{PKEb¥Å |K`k­A._[äá[ÒD÷^G¹ÁrNDTIz?Pò'{åíx\à·¾äÉo÷—";'×Õ3ë­M‹î×÷TòׇÜC#™”&”·¹Çã­É2é-ÐÇ¢‡‡Ï§kù«Uâ×…ã/|"¾}÷ߦܜŠ[4wÒñÜÒ¥|WÝÒ Fx¿¿*o\ïPÞ–V®•^‰òv/õXÎ]Ü[oí;Ú­}ÛLˆ ò×Çç¯ßÔÇj’òöæÛ»¨fÒ[±ã÷áê[·@þúöáÔÐ oVîLìv¿}ü¸BÜ1ùFØŒ¦ò5òÛîÍqm=é’ß>s¯Ëßö£ˆÅ®Ï:WñÈñ6ékEÙ|<wÎâqø6í~+”öOÎJïð­“ Af÷ñ]¶uÅz¿5JlŒ0 ²™­âÞâ7Ä4û¬¼ºrxR#O3=uãråpveªr~I]}mBkò"¿KLà_§À¦|+GV%Ì~ÛÚ¾Ù4wÐxÖÈ™£Â`˜‚7ÈÏã€9>o˜ƒ?ÓÛl%€–­ª…ÓŒ÷)QayótUSm¡ƒ1Ü­q™žHŒ@;çÍb·ø ÙÄ=âÉø°Ø ÑÚ×Uê ÈΡ T[`ç<âú˜mØÛ¯ƒÖ#}Phç˜ƒŠ¶A ÀÞ‡úÿ½1l½oð>h¶¹ˆƒ÷lç´³´´` Š´kP(+m†Úÿˆh´öÂQT õÊZs PûoÑ•=­sk6}Ì>,Ò)¨ƒBâ’ÞuPÈÇjûKŽ]åS@_@ã¿ô8žt˜Ú,tí€eAj=ÙŒ0ô¨Lßb·€k¶9„tÂÕ5%ðu*ŽùnÀ_e¨Ãí#ÀjR|ýäÀø(¥ÿ³Íí[Æ:„öYVͦÎm:ÿÖé`qËwe}òy Ltm¸5Šw.œ¬ _ʼv+1øÏ‚9À >€A‹`6w~¥ô­¦éÉ¢ÍûØÞÖV5†ý8£¥1Ÿéî2«ñéÒ‡ÑD_®5aî@ŠÅÀ(ð :ØŒ}f'æ *É­–¸‡ƒ|ýòü\‚æÃd…4%Ë£MJõžT¦·°–BÿhðÔ|.O òÆÄ9Òù‰@Gÿœãv5a}ÛüaÃo}àh%É7ï·¯.Žüö/u¤ã‹fÓØÖ‡FA+\_ñûþÕ›~~K*°<:»bFvÜâ#‹{^þ¸™³,ÈjT9äåÅå½Y oÂ=C‚»¾/A!ßRqݧDb>`Ê©“õTïË#|sõž¬GóÂÙwãk•¯>¨u³ ‘ Àúá’®”`W½?Û©Ò5ÄÛSðŸ;Ümê‚]ZÁ‡¶M¡ÊѾVÅÅõÃÆ,KCþ±ûP/i4D›ו/©« ÅŒu%–Ъȼý65B‚bʦz_IÛ0Ý$CžsÝÓô’]WÇ·i«~ÿA Àä@€y^‹¡Ié3i,)ôÀd¾ Þ™êZÂêcvº“£ ⪃Š|¹f65žìÞËT5¥ý£ï•vHáF‹–eØN]îë\9¢ ”,Gxjg™×arÓ=¯µšÜo BéKñ€Œ°©Rœ …ymÉ[a„6Ä´^Á¤À×—Š'¯ee=u–šµfD•–`ò×±ýíÔí\Õ-– (†b~ûûV˜Ì¬=é´&ߊx ®/ã;¥bÔCVZóaPéÀx¯ ´)íX4kí²’(;è£Ò=N–Y÷/óSéXéó­ ˜¢ÊÙU(6Ege¹h^&·twf(3-ÊJ6œg茪ÕM1‹×ÎbvŽp‘º_ËôÃ¥›ÛU»áºI¥:³vœÜoi|Ñ‹¯)A¦ƒ—=Võ:£é {NK|jª|Ù{˜”ÊÚy,:Û1*WÕe%tØÍ>7l4M n÷é;«±@Ûi•ÊB1†©a7ñÑ,qm*~\€e"vÝÒ˜ˆS·ô‰Ù;,Ö˜0u»ˆ*ÝWþSâuz™Î¯wà qЇ$±¤{HȈÆ.z¬ú;Г× £ÀÏ(fpÉ8õwsiˆöñÅy.->¥{óޏÄò~Ÿ÷®«¾];¤ŸYXÐÁ$¸Î%ÅÄÅâGvJÀØÀò¨øøú¬ I‡Ž‡¿gÃ} eÆ"svUúЩJÓ°hŸ¢L¿0+쑴Ѿs>ÌšðèÐ. ×Îæ@/‡NHãJx¾v± ?Ñ®[²¹lÅí˘|A¶Uwn|ìž `tèv¸| » £0CÐÁÝ7´Ytò ÐaÐe‘n™ˆ'íñ`U7Í@tçaÂìô*LáćÎ÷Uï5‡˜åì,Â^o«‹'ÃθYùJÀsg“=qí»È³ŸX9û±’ÓÎævŠÍ£òI…ÕKˆ±ŸG%ˆïß)÷,¹:³ŸêÌá¯7–¾irKðÔi°ºÐ`Wvqc÷ór¼ÀÙzúPÎøhJÄÍ#(qõÓÎÑìTù”X!p´Ë™9šµ/WÃ9p4õÈ„pë•£©oôCGC'ïdS v&ÌÌрЌÎNû— …ö/gæhÈ~Aý̬S ^æpöŠúy¤ípÝñeFÇ!›.€q~û–­sTwƒíèÐåqÃÃBõ‰,£“÷­GP×”„Õ_!3ÚSg8’ÛÉÀdC166 :óÔê½™¬'ƒÎfŽ~€q:N“?{e&çê}%ˆ)Pp ôã£È1Î&íðöLÛ‹&bè‡N9þ*9~š€:ãgèÌîÈJ¤²Pãc×sÓïï?H²0 Åm,F’…!w²±Þ“ùèM»Ê:|°S!ší.Î.Å®gviY»?»~M•…Á¤Ø5ƒ~OêÏ®5ú™FR6ìHðð'—†0$<å…Vä‹Éù§–†7^Ne=tJ‹èÆ1¨ë3û:¡m‰ ”AROß ±à£Q2kº «,çg¡îµ¸äçU``ÜÄ ê.Ñtbò #{žRp¸®ž+ÿp:ç”èDŠaDˆU0¥ FÚ-«X ù†Ñ“ÒÃHcˆ\³Ûû·ÎXz(Yˆ«tóS´-ììÃG´`òÅûôv6ž‰Ýcñ'c*†ídÀ¾“Žà[šVb”Óà[#2‡ñš”ãtªXU\OÖ‚Â ãáùrñóÅ<¼Œ¥ 3ã‘ÕÂê#Ê¡óΠ Åæ“CçAŠÍ'‡Î;ƒÎq{ÃÔ9tÞt¶lÁrè¼3èìÙ‚ÓçÐygÐ9³§Í¡óΠ Åæ“CçAçÈœ:‡Î;ƒNÏ}›9‡Î;ƒÎÊá-‡.é™AGõÌ¡óΠÃ|žÉô´·ƒÑk§gí£ÏX§dZ¯§KŠ_àöf+ÎHŠr±ÛȬžüÓ%ŸXrvO/€ÓiXrêÖ-Gýâ”Xáä̲±‡…tÏ– – '«+—ý;KÍi}fÞœIû®H:Öõ¥¦%2äì‡9§„e>ú¸Á<àä›2‡üÉ>¾c6„½M)T³öK ¢§'û…‚8,¾¯ÕYÜÆ¶¥­b1ŸQj>K  B‹´¿MHÁ AuñLžÞ*ë±a%‘Iæ§Ñu~ÆŒ*Y 3tFÍÏBg¾ÙC°€ÍZOÚ•ˆš·M€'ËѪOÉÇèuÆöÔX“L}SLåšÅþ ž<½m_ó<ËÖÜ$„HÇaÒí&éÔˆO¬Þ ôÄ~†,0GßÝØ[`Ïã³9[1ðòÀ|s‡Ž†x ¼Ç¤ÆÛ1ÉžZˆ<ð`RôxSdÚ¿â"iÿ¦‰"py0}÷Ï+Ï7'†ྸïA˜³()2Ø™EÎ<¢êƒCŒœ33%ÄèG!I¾ bvÇo^q†ÖÃL¿L.6ûeÏ7Q'vªßÒ?_ŽÒ…Õ•áX™¼öu·‰Ôí}ÔA>u¹v=Œ=¢*&”n£Kv¯uð.nY¬ëXÃ3â™*ǺCÍCOqó£}0ˆYiB p0äÈâúLpxi.{þWž,xùÆíz¤ð ¶Òv=rß/+Ö¡EÒ1ùAq[ø¥Çyd Ù¹=#Š!=™M“bÉø¢nÚô±‡q|i.pZvLÉAÄ 'o÷Ž<%°û>w¹ñ’6%1˜óʰ ä‘¡F§[iqÓÀÉî‘ÙæT×ÝâbqäcÓ±xd¶ùCç (SD©÷ÈPcàßæä‘K[ž=‚è€Á#bIC›Ù#³‹3x{d°ŒT¿ü¼<2†&Pz=9À&Ç„ÉlQ;WêÚYÄ?nœEYÎ#'qû’÷Ž`54-—ÉÈ©3:dˆœ ù§¡m&fNƒ±£^7‡±¦yßb!]˜96Sþ¨fñN¯çÊ«£¤Ø3…ýDPrý’* õ⺥#TŒ¼°ì8IÏâÞYDAG°_ê§ïó·#ûùçÇtÿØÌùpz´##nÞùpÁ"T§Í‡sÆõ5ç’=â̇›%[=N…8§|8#Ùž7ï|8Ý£8¯37J>é–€¥¹çÃ7·x…ZN•ç²Å(Ç:З2‡”Ž•Ýšê“/Æé¸d˜®[²ÄDº¢$¦£ýËÙÓë!bŒ„dèÇ}­Eà^ØÃxžr6P‰Ÿ9“ öã{©ïñ|ééóI'Ð æ CÂQLb @†"´Y`#f¾¶ì¸!»óÆiv2¬Þ_1PŽQɰzUt^Aûev2¼Íå6`ÔO2¤E©Á~æ@†°·-ô®­†ìp›bOå0°3û3~·Myx¥¡¯&qEð™c3¨aÒ<2Rï?昑 :›_FêýÇ2Rù¨3éfªŒT9z” Äï(© Ÿ9ðMÐ v22S?,æ“oF*û5Ð.-ç ÄãÒÔ AF=¤,"4GY‹ûl#Sá,>4['H*œ¡ÁÒüƒóI…à ÆäÏ™..˜ßrÚT8»rN©p^è’v^©pšW!Ót¦T8Ó?Ævåç7ÂS%rKµHL‘Wg-RåôQ´ŽÎ¨1Ž»Ȱ3ÊE†Áu˜–j¿dxÚÔ†ݨãÛE8À¸ºAŠ1ˆ,¯Ž #œÂÁðŽjâA÷iUãˆèl+ž¾{εÁKªòuóqó¢òÆ—K™ƒëÊB÷ YÙN6/B±ÍáS2þ®Ÿ‚–ËåÚÍ}­#,oE+š8Bî^ÌŸ|åÎ;+oã¹XŽrq W·§¶U{ ØÖZùî––ìvCMvS&Ok¼cP<ÃŽ«q+G”As ‹ùóÄ-ÙÍ3Ãn$zeØÕ¾\R]Þo¥_h¹X G.–£Ÿ$`ƒÚSÀÔåü’UêÕ™ìK\ö)Yg Ï »hMNSåj‡§”As ±ìq剞a÷è•춘£Z?[øBÖã‹ôŽdZ†Ý¹G.áñá}Ðjõ²fóÀƒaµ Œ¿ô\¼ÉÊfƾû”vb™óngTa~ZYÛeè1¹6W-Ñ Ö|›u*¢æŽ%N±|ä²W̽oÈ­#L~eWJX'DšÜ¯ p¢§ölËœglE¿ìš°ÿ”È1W`ReŸxRÆ,?Õ?æjªJr„)ÅB¬N^ßJr¬^8tíÙ\à4´‹yÿ¸¾ Eä|½pÓ‘cYŸQ÷5V×oJ¾µ˜Îš+`M‰èU`¨Ç>%è¾ñ¬,I wªËÓ;s6³f¦l:R.±9eÓ‘–š{6^æ›M7kæãôÇØ–DžW6I®›¾ñ¹eÓ±Ý2k6]‰‘]¨³À‰µxž¸3±–pE1x¶é-¥Ùo„•é+4<[Wc!LvQAù­»â JR½W¯j ­%œ‰ à™O‘&§%N¡¾d­Qí™r5œ&¡u5¿ †WCÖDOÚWߦ¨Së Õ_Ù]_ Í¡Æë–â©N«Q?3åsu¬\WO»*{rºý†CÖT‹@%2øðBÝkÅ•O´üᳬx½ÆÝlGäF…;ψf2ô«p nõ 3—E'V¸›¶R^0ò¡WÊ›K>ge.yIŒîX|ã³W¸sÖ{uÖ¸Ûb©pÇz«9 Ra*í—EטâÞQØÙ#C.,¦æÝ’šX+G[,.OÓåÅ8Í!ó‘á²ß{®´~fôf!ß8èg‰µ°J “Ãóï‡~/œG“™™â,—7u~»û :±ªï¾ of&C3?óàcÔ4& (ï”3†)éfJ³¸/7s»ÚvÌöéý–vˆyÛîìJ˜è9eæƒi†WtÆL1„SrÆ*¼•ß©–Ó«.ŰœÆ&L»µ‰É>»e(÷ˆÝwá_‘î•zSƒO¹G‚>VNû˜EÌWS®$?ˆ±ç¸–Óλù¦Öa\ñAìµgÏq…EòÜ"œõ̘éyÇ›S8xÜAdÑ/—©=®’Æ3Ò̺eEÙæcZŠÞÅvþ¶ò¥v{QùRUvv÷r¡X¹”n—Ë¥Ì! ãlŽ ÑëÛ§§{—uØ.Gý;r>ÜFäÎÊœÒ|¶Ü¿³µS•lùpÉõö - Oz]‰mD†¤AC1˜°EÏýS£µN†:(W»(QÍ-X9búî۳Ğ<­¯±AuØÖ’ª9(–šŠ!go^ë”Ü¿hœšš¦Lžxz^rcý¿Ì™†çQ]/{{ç•ù÷NL74²ÒjË ÒZÑ Kîk‡6h×+ ïìÆÆ-ixÇwuÊ …=[ñBç g®=EgâúÀß&¦¯‘ZÚ­3µËÞ7ìù•ô–‰S­.&9‚ÒinmÒwÕ~òôï¢Ê½Â&“îÛåN—†óªbF …¡zHèù?SNÉq¾&(†žmeÓtg©ÌrWñ‹kÃnjõñ$.û„ 1l²Åî*ÁB«<²ÒÈUÓd¥ùEhº±‰v̺óDÎ뻊ôXŸ7j†‚Lʯê uJöÓ˜wç§Å6%úˆe#wêÂ1X"YaìÐG5S˜S¿zßs(ÇÊ/.Þæ¥L yG»Ô{´q|Jw§9%¤L´ó{–TNš¦ôVô5˜÷ïjÕß²`ócÊ}öΈgëÞó¢TeùÿeŸ?OˆÑ‹lM1z‘Ÿ) –¥væJ¦k‡z ]¾Í¤”+Ðëj+ê9¬×€Y€¬9€:çŸÒŸÌšè¡[2d²æ2U1£À„½¢žG®(C k K– = =ÇŠ Ž`×Àx沑i§oÞ9€fÆk“ÚÓ¬Eù¼+²Í«(_0/Ü´EùBDm€6©i‹ò*²}BQ>2›wQ¾?œKQ>¤õÁ xŸZ”^-kžEù¨õ+g(Êç˜R#{o?Å#B.™Rƒº~ÖHUý¦ºŠP×oŠX¸)êúQ ¦Wõ›ÇÝP°®ßìѶ,uý|ã”æR×Ï»ªóÝP>uýX­®Ÿ•Žèy7ÔŒuý¼Ca6Ç<êúy+줢iêú9—k¯êGô)MQ×Ï;ž)äïÐeªëç½´Pl>uýæQÄ¿®Ÿ÷‚t)6s]?#áÎëVóÙëúyGœ‘s§L?ÂCOÌä#xͳ¶–Ùëú‘rÛ,ª›)+Í· ë T¬uý¼M]CSšµ®ŸmrU¿àõøæó>u]?ïª~³Ôãc?P¡çŒ«ëç†2RçQ×O?P¡TõÃrxgMOñ¨êg‹»˜¡®ŸçQd’¾/Áêú\ #;UΣ®ŸwU¿ùd¥Õ¼×¼€ñÍT×Ïû Ë•+:e]?ïª~3Ôã P$Ø«ßÌ·x˜UýæRÏW‰gÈæp×õcÌ{ FÛÎT×÷€])Š2S]?uý¼A ëŠÎ£®Ÿ 1¢7Ç}/KΓ»®_0¿å´uý¼& 7ON‘óô¨xWõ =èQ×Ï[1ÄøØLuý¼C×Iâ”uý( Ô«úÑNF‚Öõó>± ÅæS×Ï;˜˜];E]?*ÄP¦€ÿY[ =ï{víôuý¼…ƒ3‹sÚº~dáÐȦ‘p°ÒÈzLY“ ^—˜"×®¸X|Ë8»¡é“5ðÞž¶ètiY>,MV.ÙÈ>þŽ»¼c6 ‚ 4#ª€;»í–(Ì‹Äï“ÈjfùåXF UQu7²ò¢œeVckKâõ‘´+å’êë~f8‘—÷º…âÊöÝâ—hdœˆìÖÎ3ÑÛ¯¹µÅæõB%ö6h6–»¯£Õ\³ññ˜ë4^vÞžŽ_C±Ãn³X<¾ßû¸jò£ÃçæëY¯YÏM®ë‰øãc9™øv+};y?M®?’_vÆJ¬_Vq1v‡™·øºžøÒh_%‹É£øÖÇâ{ƒëÄEÙ^;¬<ÔÁZ"B餟\ogw¸·½ÅÕ.®k\}axÌÕOŽ_¥·½ªL^·–ÕåÔq .<¢gZn}T“›…ã;¸%”öÆU¯òŠúr°ÀeNºØ6áž^}_P~é–:®|©í6j›»›m«¤VGp¹ôqNVŸÏ6_/?”Aî8r}|˜D+ ňk<¥W–b7§‹…õ~)vÚ¬,?5÷7³Å¥£\ÒLÛt_]Í7–¾´HÖÔhm5¢ô20óˆ–Åf‹iTbiWO±¾Í· Õ ÝßZ²–fIÛùåµ¥¡­^—>®v2ã• à0Ål+Sª {;àéÑÁÎóåÅñî^îé8Y”6·kÅÅóNùá`a­T(Ý&«a£Kݶê×qxÂOVR±I-¾·¿ÏW¿®m”{r†‡›3¨¶ß>Š^nÞV…ǽNŠËÈ«PÆ/ˆˆUø5˜›Ã7qû2šFÇ5o_XFÆ—‘² ô@lg~®%ÑO@ÌçàçΪ~Êzì¦ÐßââÆÆSí1qwÈ=ÝyÙYoD0ïC|¢)nðd¾XÁ_”c-óE qÉwB1óUõ²ùl¾à°«‹û¯Æ‹ãZ)_oDeóYk\ÿšn£ÈF>^Å_Ö8ø,£‹阃 Kïü^®!ÀŸ‚ÖwëkÌìû,©5iøUøsÕd8‹Uâ{h”³´Ö¨+Ã~Î8tm<ßÞ;A?õnÛ_îxd¦p™ÛZ2sÔ|ÁÛ‹z+$rkcЋ´6 —X,pB¿ ¤X5UL|ÝYç®q”,Sc©ÈÂt[¯:ç=f=’úC–8sÖ#ŸYP7’—ëJnë2{¼›èÄ5jJ|iFþ‚5ß »ïÆŠí^_?Yè%$&7céײ•½M¨ ^kØ-T¾ìóÚWÚ'’þWÿRÐÿšÜ}E¤.Tò£+vT“gX®ìæ(†‘½I•¬dh;»‚I÷;u´h¿2‘OOˆd祥«càÁ»fJÆœ@ËÜëQjÒhrõ,ñTn àÒ½ ßg’Õ«›=Ê{=’Yâ㨼&ªƒ ~æW4Š—£Í,êÚ4únŠG ÖPø¤ù•¢[âàŸü†Æ2Ÿ/×îˆ.Àîu1ÿ/øÔòkRo'ëâzz5" Åô§$¤§ÃU6R_ó]“öAù«½òÓÛn*(ýR?:¨9¹D>´u¤…Êê]’ËÔw’p׎ðø1M7±Û0§e:»œi–¬°¼i*Ä®…‰žóY’†XXíY´¼žaó+[¦·ÖEu¡wêU$Ë‹ÛUÝ®DE›…xñV´d3znm×u5as¸‚+Sk\¬i~BÔ˜ëF¥Œ£ƒ››Ó]­x¯Âf/Žépè@ &´CÕûõUqiýŽøTIA6«i°èP ¯ÒÚ³õQDHZ« Gð×ãØ‚{H“Iú ÂË™Unê+Qëf(ù¢ðÅ­=K~Ù\ÐëÊ"¶Œ«và Gôhñí»0ÑlÝyK‚žÁ÷%{ûÅR’ìE‹Â0Ú…Vuèówá+~2¢•ªÓTQ›æ‚•¢“”yÛ Uk hr‰¯hr:Ž!`᱇¨,‰¦3.¬{3v®Wd¤Ae RØéÐ]ë¹ò¦)þ次v¡Ïû+¾ýËcÚFd6± ÎÛçV°.b‘'£‹MÁê"ÞZ<¿§ìd‚T€Éž³°w‘šr¦-ö”Xui*(ޱ,ƒ£t±)ØÚ¥ès b*ÅØ£9y­rú±qMÈ goLJbô™™¬¡4<×ï^9,;Î÷3+ؤâú©ãî¤ ™º£jde÷~7Jô1MŒ~ªJ®sËOVÉ5__ç“UrKçÿL•ÆÃ¥ü“Ur°/4zŽ*¹Åa>S%Ú8TÊ?Y%û•rÓ“7·lIÓ34%xó6®)ÁÕû]D+Z4Gz@fàç­v-ç2ãx©HÙ@fofý|À‹Ã!³ÛK <€Âè'øçv˜Ö m'ò SSi3§@}™lìgz7ã´vvÞK­%·׫¶ètó Aܾ:>4tgýøâR—ç[ù„ ãÀkò€ö·6“Ø39ºö­2âq¡ôår;Ó¹ÍÖ~†“Z‡ÛZŠñöÕ¨¤7©¯%Ö‹ ˜KAÛ¾~/uáåD׃wÿo+”/¤pA*äÙóI¿«œ(½—Þ œ ­‡2»û<9è kJ·{Ñý߸2lOÞ»ƒqx-œÙm–÷÷ R¥Ûvº 9õ“µ+ºËO÷É4Ý:¬áRª<ëo{ ç›rå™»ÝrºïâÞ&t߇b‘äÖÛF$Öå#©×oMø³¦)mšýæð kÊûP;s+ •®RšT“GëÊá~¤i©öHõ•ú­êGåKM&üîž´«l'_ïJOÇB3¸³?Û«š…†Œ»›rþ¼é=¶åI!ý~¼Ilgá2®à¬‚Y¬2‘Tbg>=ˆ$ϢǑd;} _lGVwÅN$ut³YùXP ¦ Ku“Ôv˜YëúÆ× "=Z$ÐÆý²…lG»½EB/½ï}ÌqñtF³»òc\ÿë[wE§8F/èçZcO3×à±]#«w¬Ä±aTîsVs{ò¸h ±¬8è`±¼i¼(¯b¬éÑ„EÖ @—/»Æ‹Þ|ñU7Ýê›+Ö3|äz9…¹#¾âc×÷ÓPXVÍ=’É ‚¿MÀ‹sýB=~žîX}?¢8ð¬†Dõ `aÝÂ6hf[µQ@¾IÐè$-õàcü¼DÝ®h›“9½MIÀ¿°±€ü`€4·U‹c£ Œÿ VÉÈKk/ƒåËÚF5ûÍ$¾¸n×oÎðcRŒÐ(‚iÊV·ŽN± ‡`Ý>Ômâ pV,Ôk;ËÝ‹Ê~g3¢ÓÕí oaò…€‰žDÿqÁ\rÖ‚Œ#ZëñДÎf[—Z7ßjì'À_@äk²¤õU€IsûØ·–,¢¿ìÇ0$·±ÁLúôg«@:߀À¶5.ú€ÉatYÒÍqM$ ôeœtW%¢Ë%šÈé“BWÁ!U"§«¢×UY“w€ì¡ÜÜ‹k±«¾AuoE'v>šÑ*Òfʰã!í£dF𴜆ÇÄ7¦ûÇ(ä"Õ2ä£EÀ ,haà Ù,w7·€àâñ5ƒŽ×V4Õ7Ž«Ý[;)MÊù¼t~oå\wÝ[êù§(çÙÔs‚r^²¶.øI*:GÕ®yüÄ“T´*tœú™'©¦óöSOR Xý¿­ Nè"z¬:¸{(‹'Íîx2‚ ¤ÇR÷¥7hÈß»JˆkÿÇÿƒÿæ‹a^(„I?$ø´Ñ ÅQÛ0Ÿ7c~Ìì*ãJ¯=î ²ò=¼Ý5.÷+áµ°Öö´]ÇÁl¸GмJ@ŸÔ#˜ácˆ ï‚ÿ¿ùüsâÒ9A”„b˜KK"üþÁ \ü!ˆ¼˜‡Oļ e‹è\6ÏÃ? Y‘φ㧻Ç'ÇÕpV— ´Š›·§/ óü8|þgÃGá».Ü38 ¹<_ ‹à¥œ” ¿‡DžKù¼õ¨¹|:+ÃbGÿ+ä‹ÚWù|šËòaW/åÐ3ø¨˜–²9ðU^­À oŽ×á9Ð^ á,'¦‹°ã,è°¿)Hi tc=°f#䤴À$Û³VFSð̆áPyÔ ¼‚}»çƒf V[³è!ü_8Çš“X„€9Áb y)œåy0˜½&Ççòè\˜¦ã ˜˜o|•ç ¥òÙ4¾Î‚þ ð!WÔŸë)†Û`e…´˜ËŠRQÊ#È ðkØH*Š ÐFëFJgÅ<€"z»FÌçÒ"j‡æ´ox!-D®è‘”CS¶€ŸO‹"k^ÐÖƒ‹Á¼x´|þx@…´PäÑ3>ˆP’¶EÐ-ìD( õfQû-ré<ø"Ëñ›Ê!øö—å8кˆ&ãø[<ì ~“Uˆ¼Ž©Å,\8 ÔP°‡“‚@Ä‚CÁ!¢hC8¡IÔ8¿/¢þÀÆ#R}Á¨þLä{¸¼”¾!àu 9–aÐ3ðC‚ð¹BNÈkÔ›ÎI…‚9A!ßo–ÃýáË0ÜêOº&¥Ã%ò  9mDc=+ä:ºÏD>]¸ùö­Ð °!Û#¸p c¾—%Pæ²Ö`ÚEÀšà“BQ‚lBH£ÅÁdÁ 7Ÿ5ðg`|~ ˆ˜ã ዘY€â|!g=i‡Ä¬.ft°Vb:—åµ9ð|AÀŸÖUÈkß™ÏÕ œ;ø# ñ<ݰ'€å‰íö Ð"W€­Ü$IDà Ù,šg¾˜/ZOàxÿ9{«<˜9zºÌòè Â_ȬÚIJRÞ|ÒÀŸiÀ¾òhq€5çЄ8È8|Ž$ë ʈ€f+Þ¬ ÀIŠ€ŒÛ¸ýY -×x–4&äôi#¸A6%ˆØ!ÍÁÝ£éÀžÐÜÀAÐ1%+äá´s`»à„,q$`ZÈ¢·pLTÁç´¾²Y¸¿è‰˜G EÛ°œ¶Oæ3°À%¬•¹R—·íS0<”Ñ*$‡_  Üúœˆ¹X@Û"B\…s$À‰¼õ¬?3…dBÛl Ö^IYïc­çBô“Ïsö_²ù  ¹(äÂVO&q˜ãa$fUD{bµÒ) d ì)ÏóÚÌ Å‚ÆåÈ#¦£iú³þŒKgóB l[m=àdpw5‰â°­7y.¶õÎ#Y!*™¬±n×EQ^“.N>ù+QWã™ýÁXSÎÂíáûh8tÂê«<ê†ß‡.¦©5JšÂÔG¤Ö­k&v*¿t/¹×êã‹*ÿÕ ËƒÁp,»#ð&ü¢tÕñP邇Ã'à£9PDOj¡ÿIHÈ”endstream endobj 950 0 obj << /D [946 0 R /XYZ 85.0394 794.5015 null] >> endobj 951 0 obj << /D [946 0 R /XYZ 85.0394 769.5949 null] >> endobj 948 0 obj << /Font << /F21 954 0 R >> /XObject << /Im1 947 0 R >> /ProcSet [ /PDF /Text ] >> endobj 973 0 obj << /Length 1075 /Filter /FlateDecode >> stream xÚ¥V]ªH}Ÿ_Áã˜hÛÐÀ¾1ˆÊÁ¼“ÍÞ}`G’1Â\3ÿ~«éD'“Ín|èÓtYuêTõÑ0üˆfpÄmjk¦­#CÛ¾?`íÖDÙèC†ÎL¾XèF–…1YàíÚêÎÚ°38g” ë§ôa:§T³‘Í)×Ò½ÆuĘ©kUºûëÑ-OŸçâõPþN× ¬‰!F ci° Ó9ѯ[wDyTó÷rWì_²ãnZž%ÞU}.^>j•c}(T—UwùïÛ?eÇO NçSY©åKQ$jíÄ—òCé¹Ï•hº– Ê 7M{ÈeÀàõœAQvŠø©Y,»|×ÒÍê)÷ÙKù+ï¥ÖLe]lóNƒÛ„O7ÒÌO§lúèÄꋟÈqG?ü™7“3±{¤µ3‰pÖ~t%˜ ¥Œ @E‰0õ=µøì§K‰boáÄ3¹-áàftXœT¨IÓtÙRü‚|è›™.n‚û«uà·¹|Å$šËqåÅîF¦þè<ùŸþÙ'*Øqdë–9|î§¡—$¨å ÇPñõ~xàO^öŒZ½žõÀwž…çQÜFUᓵçúN0n5Ž=·á8ncÞ}MŒøPL7 ï °Ê¡³r·Á«ÏKGDI“‹Ûê%› ùÚI?£•J,Jz‘%Œà`¼)ð&ñÚܤû¦C>Б t2nyxÐÅñPs§ÝÔÂai!í4v…Þ"ð^èzÃHQãYp…gµÈ°Ü²ã3!ßh“\‡TŽØO:)¢M:dݰf¡wŸßÝ>}eßfd(âÚ‹¡sVNŸÏü»-sw•P±M¤^É·WIg<¹²¾¿J(%ˆ˜–Ýù”„ûÆíEפI)l7ƇúÛVÆ‡ì Ž”—Zžßy­úž#“˜7 ÅùîR–êüu‹zp9¹Ù[ͱȺÏQv×§ŽtÏ„{:$v¨ëÓoÓéår £¢Ú¢²!õ:½»µÕ[—H¼fÿõK÷ùõŸkendstream endobj 972 0 obj << /Type /Page /Contents 973 0 R /Resources 971 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 955 0 R >> endobj 974 0 obj << /D [972 0 R /XYZ 56.6929 794.5015 null] >> endobj 971 0 obj << /Font << /F22 977 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 983 0 obj << /Length 2885 /Filter /FlateDecode >> stream xÚí]wÛ¸†ïó+tWûB(¾ ^:Ž“u·ÉæÄÎé×ö‚GflõX¤KQ¾ €# œÍn²±tö´¥áÌÎûC†Í¨ýÍŒ"Tär–å’(ÊÔl±zAg×ö³7/˜ûŽT‚()„ý%òé\ C”áÙlOòòòÅ_s6ã’d&c³ËO£/Å ç"Ÿ]^ýãè´®Ú²j×Çÿ¼üSo“\sÝ}ŸÎæši„é¿ÉŽçŒRzt^µM}µY´Ëºê¬^œ]†`”DS&gÚä$“”u¡ 6׳áàÃVìîûshàcCÙ=ïÑŽ{— x6$a»N9pšÛCcÓ®³ŒhÉ\HŸE.õ]y<çö°þ4ü|U/6+›Íã¹2ù±?l¾žå™Éÿß$5>Ó;²}Ž`¸+äîù?CO$ Œ"Ôy H«î*ÖŽ"î(ú©9fæèº¨–ÿ-ú+j ¨Ë›åú1ZRdûÌ$)>›É¤CŒ”-µ¦I‰„‘‚:¤Øñ^ÚAß‘")v¤¾·XF×åÕp´¬¦qJ?K@&ÉðÙK&bdl©3MF$ Œ Ôy CZdæî~D:2.oJ¯úªð,¼+Vî¯ë¶\ Ç?Ûï¿zwaØÛ×fŸo6>™É C (Ÿ% êœqNLžYç<'\_³È¾já6Vü„×›êªè†ˆâ¶3ŒØ»*䉘øL&c 1L R&‘00LPç#&,#LQ0á“~$q7“¢ºŠ/ös¡å³¤bŸ±d€!†TÁ!†ê|ÄÚ)¢â"à ¯«^lÊŸõ¬æŒ.>ãÉ8C '¨(‚S$ 'ÔyÀIåœäJ†r¥/X:œN6íMÝ,[;ã¹/wÊ•²¹/›þž”íc]²–Š4DØREL" AwΔ$Y–å3e(1JuÉP™Xžo–«¢y~y[Øâµ±9|¯†¨d €!F¡ Fê|¤@’©L ¸£àⶸ<(nöçNñ9.|ê’¹†P„‹H¨ó‘ ¥‰V¹\ÏE[·íÍ#24Í5DÈZ2ÀCª‚  Cu>ÖR¥ÙXC(WCœ‹›eu=Y=Ãö®Øœ$Ä'1™`ˆE’Ó„DÂÀAƒ†àDj>–*”¯ëæ?E¿À~Õ£"¿“ùË×¼Ÿøì%£ 14 :‘004PçãàÁ)ZŽu†vƒGl¶ÖÑßnnÛåÝ­ûʇú¶›üæB?÷™‡OW2 Àcʰ caÇ9Ü9ö›Þ2ÏH&lÃDxØÊ~yþî•Ó¸\×›fá/ÿ½Y6åÊoŒG³ÎøÔ-nh€lqoEª&³φdg×ilcAÚ4i!ÜZuØâþÁ žnuÙŽ» õC–æF~Ы+ä8õꂆÈÕµ¥!ÂM$ ŒÔyà'D ™;~üæöéûð‚‚¸dÔÓòyNfb A†"a` ¡ÎCÚÞ¡…v+ßaÛûm¹ªýbÐ.F2—pžŽOn28ÀЇ€ uÀ‘9¸[{Ø\ã Çç]»Û:,;ŸU÷Pu5´KôßY¯7]Å÷{jâúµÚ#B²’A†P „H¨ó‚È÷ͼ_)èõ6wwuÓúf™ŸîʦhÃÒÁÐÑ/†‹ ¢Ïd2%À£*¥§)‰„Q²ã<:`vHuî–³†™@|°8­«Ÿ)å×›¦@»]Ã)Ÿ<ØT†šM§ œ KÏŽÓèEDí•CM6¤gìv-VaBü(-ÝHIõá6ü”ëÊ'7ùº†ØuÅC€‰„ƒ:«-"§D2*=9¡çèÄa3¬ØÎëêö!¾lkÓ®ó½"ä,hˆ±¥É4±0 pç#™!Âþ€ðÝE'nm«åBIñìz˜Cz’µ†˜ö0ýˆö‘00íQçþ.b‹v™{ÆD„?×…«Â^·Eµè«0ÃÕ¡èKYòùNf b,A=Í4K‘00–Pç%% cÊW$߹꾯Jäóyç7ºûøÌ&S 1j rù45‘00jPçãÝGrBYæËÊ‘ËãœÕõ­ÛôùT7áyŠáà/ÇJ-}³A{SNÝ•úžØ¢\u툜}g·ŸŸdñ!&>Ì?"~$ L|ÔyØÜþ‘å|?l ¿Z×U½n— ÷Ð̈ƒ2fûHBÎ’†PˆH¨ó–Ãi€ð-g'W«eµ\· hGPü.6¶¾Šþ>EÉúCL(¢$ LÔùx7 Šdœ‡""ÌE.–×U1\üìP†~IÜÍ)“ýD’¼ÝFHÚ9ß×1ý^, ¥ï±õCn¡&—®‹aX?<¹º·Ó¿Ä<>dUí¦)ד™ 'ûÌÊaÈ4ˆ¬ÏÐtÓ<’™]¯±Bg”ä9x–ßÕíò“ÙÛ+užùV3Â@€#õ„†È5¸%6FX$Œ4Ô{ M;¬ š_]xõP+_Ö}¼»*Z{77™:@ôCäòœÌÐh‡!TÄÚ sÊ.5Ér™y‚ÆÉ¡Ÿíý«Þ4¶0ðMSÞí~˜7OãÆ§7`ˆ‘åcÓ­„±80vPïað’è\» ¬GW‹±5ŃÓ=8fô¨)ªõ§ÐnÚ=Œþ×׆§ñuž=gp&QñÙLFb¨@µ0T"q`¨ Þ*v¼Q¹ñ‘oM¹¸»]¶°T4úP ý–Ñ—!™1`ˆ1eÆ‹Ä1†zïeŒ›¾ÜCîeg¿€Mûõc溿•íæ®+‘Ä>ÃáÓ— 0Äà€ò°é–¨X¨w?±ÜI™¯s|KÔåÅù›ã¹ýòa&öÕE‚©œAC„³-©Ùô~o,„3Ü{„˜ÑDP¡º.ƒ6>;ÉÚCL{˜}6½?‹ÓõÖÖYfgPTñQû°Ùr²iëUöZ Ã{îô¾\ø>=ÉâCL|˜~LüH˜ø¨÷Q|m'Ï4Úû}•·Eµñó (|fÔ~ ü.CÉòv˜ú ÿ˜ø»A`Úc®Ç1_QB}·a§½ßS9­ïBƒuØ?<ö_”nÂìÊÒ¶v­AµßzÛw v­øZˆïlÄ÷¹IVb²ÃÜcºGâÀ„G½Ê‹Œä¶’ ÊûEWö>¾Šh³õwóð©­þà>;ûe¹n˪{3cê;ÓÜg%Ys`ˆi³Ži‰Óõ>jÎ1¾°Ó\Í×mslŽºWBO¿}‡F@7ÑÏgY+d+™`ˆ±Õ`Ó»é±80Pï# LŒÉ€‚)Ç0¯ Šžá5µ'‹E¹^‡gÚáÁ«¾BÐÏ»á.¨æò– Åh‡1TÁØ #s=AѾӯ#¿iá¬TÆþÃëež|Ú“†QPV ©HS¨w¿ver¢Xæk í—®~<û[׬#KW_m‰Ô+‘J°C ƒ:#ŒE‚@C]{²ŒHßh§³~wæüM·3G‡m9Iób_m@󊤒ìÒ ÞœN’ ûWW0×ã;ý‰àîýXÄø~•wg§v¢³À|3¨\òS™Í¤€°Q»ìþ•Ÿ9ω‰½o¼P]â\Øé—˜hr¬{!S3÷¥.¶%òð…?“÷ö?\ ª?endstream endobj 982 0 obj << /Type /Page /Contents 983 0 R /Resources 981 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 955 0 R /Annots [ 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R ] >> endobj 986 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 688.709 539.579 697.4212] /Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj 987 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 676.5858 539.579 685.5919] /Subtype /Link /A << /S /GoTo /D (section.1.1) >> >> endobj 988 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 664.4876 539.579 673.4937] /Subtype /Link /A << /S /GoTo /D (section.1.2) >> >> endobj 989 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 652.3894 539.579 661.3954] /Subtype /Link /A << /S /GoTo /D (section.1.3) >> >> endobj 990 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 640.2911 539.579 649.1477] /Subtype /Link /A << /S /GoTo /D (section.1.4) >> >> endobj 991 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 628.1929 539.579 637.0495] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.1) >> >> endobj 992 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 616.0946 539.579 624.9512] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.2) >> >> endobj 993 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 603.9964 539.579 612.853] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.3) >> >> endobj 994 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 591.7985 539.579 600.7547] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.4) >> >> endobj 995 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 579.7002 539.579 588.6565] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.1) >> >> endobj 996 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 567.6019 539.579 576.5582] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.2) >> >> endobj 997 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 555.5037 539.579 564.46] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.3) >> >> endobj 998 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 543.5051 539.579 552.5112] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.5) >> >> endobj 999 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 531.4069 539.579 540.413] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.5.1) >> >> endobj 1000 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 519.3086 539.579 528.3147] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.6) >> >> endobj 1001 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 496.5559 539.579 505.288] /Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj 1002 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 484.4775 539.579 493.4338] /Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj 1003 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 472.3792 539.579 481.3355] /Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj 1004 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 460.281 539.579 469.2373] /Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj 1005 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 448.1827 539.579 457.139] /Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj 1006 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 436.0845 539.579 445.0408] /Subtype /Link /A << /S /GoTo /D (section.2.5) >> >> endobj 1007 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 413.5759 539.579 422.1635] /Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj 1008 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 401.4527 539.579 410.3093] /Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj 1009 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 389.3544 539.579 398.2111] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.1) >> >> endobj 1010 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 377.2562 539.579 386.1128] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.2) >> >> endobj 1011 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 365.0583 539.579 374.0146] /Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj 1012 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 352.96 539.579 361.9163] /Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj 1013 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 340.8618 539.579 349.818] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj 1014 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 328.7635 539.579 337.7198] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.1) >> >> endobj 1015 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 316.6653 539.579 325.6216] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.2) >> >> endobj 1016 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 304.6667 539.579 313.6728] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj 1017 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 281.9139 539.579 290.7706] /Subtype /Link /A << /S /GoTo /D (chapter.4) >> >> endobj 1018 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 269.8356 539.579 278.9413] /Subtype /Link /A << /S /GoTo /D (section.4.1) >> >> endobj 1019 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 257.7373 539.579 266.8431] /Subtype /Link /A << /S /GoTo /D (section.4.2) >> >> endobj 1020 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 245.7387 539.579 254.7448] /Subtype /Link /A << /S /GoTo /D (subsection.4.2.1) >> >> endobj 1021 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 233.6405 539.579 242.6465] /Subtype /Link /A << /S /GoTo /D (section.4.3) >> >> endobj 1022 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 221.5422 539.579 230.5483] /Subtype /Link /A << /S /GoTo /D (section.4.4) >> >> endobj 1023 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 209.3443 539.579 218.4501] /Subtype /Link /A << /S /GoTo /D (subsection.4.4.1) >> >> endobj 1024 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 197.3457 539.579 206.3518] /Subtype /Link /A << /S /GoTo /D (section.4.5) >> >> endobj 1025 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 185.1478 539.579 194.2536] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.1) >> >> endobj 1026 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 173.0496 539.579 182.1553] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.1) >> >> endobj 1027 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 160.9513 539.579 170.0571] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.2) >> >> endobj 1028 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 148.8531 539.579 157.9588] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.2) >> >> endobj 1029 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 136.7548 539.579 145.8606] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.3) >> >> endobj 1030 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 124.6566 539.579 133.7623] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.4) >> >> endobj 1031 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 112.5583 539.579 121.6641] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.5) >> >> endobj 1032 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 100.4601 539.579 109.5658] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.6) >> >> endobj 1033 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 88.3618 539.579 97.4676] /Subtype /Link /A << /S /GoTo /D (section.4.6) >> >> endobj 1034 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 76.2636 539.579 85.2199] /Subtype /Link /A << /S /GoTo /D (section.4.7) >> >> endobj 1035 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 64.1653 539.579 73.1216] /Subtype /Link /A << /S /GoTo /D (section.4.8) >> >> endobj 984 0 obj << /D [982 0 R /XYZ 85.0394 794.5015 null] >> endobj 985 0 obj << /D [982 0 R /XYZ 85.0394 711.9273 null] >> endobj 981 0 obj << /Font << /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1038 0 obj << /Length 3274 /Filter /FlateDecode >> stream xÚímsÛ6ÇßûShæÞØ3'ñ ¼t§×6q|‘r3wm_¨6ãhªW–’ºŸþ@‘ ®$pmä’4¶ÕÎD´ÄÕ®öÿ#vA‚ïáÞÓ†/|ÏzÅtÁuïbzPô®ÂkßðfŸ>ìÔÇ{=üã…´=ϼ¦7|×SZ3¡×oæXáï /:Eqø]9+£åxvuÔº8ü±¼½9ê;#ÙQ_‡Þƒòþ³½Ù¶ÔEȺ•¦ÍçŽ6‹«^½ñ«v}l¸«ÖîûWz‰b'P?Å éXQ–™¢0‘Ѱ2_Í"(Ë÷e½ñßù,lÙÂì‰!‰¬fƒ )b°j‚w“ˆƒ"†ôÄHÍ´q>#bN泟‹B\­‘›A¹øP.ª1†Ë§ŠJ'#ÇlF!ÅÖ‰b$ÅéÝò0ä˜PE¨jÒŠ)Ïσӓ¿×p<¿¦ã‹v`¹i^Í.ëãÕr> õªÙ'Iʪo€NÉ!+Ù’#CJrœu!»%OÄAINz‡aóЙh($>6aXc@Ût¼[qw8ŸÖg7åÅjýTSb–óú?ï­|°£A' °l!„‚!é½ÁxÏ”•>Â]ÅÆ1Fƒzcu}9Z6òOËåûy8þ­—O£Ä\år€ 6´ 8HÅAp@{œeJ‰Xb¯ðb5™Ü6£ýæ ÿçºÃ\0Ü¥eƒÐId-›dHUª›ˆD¤w Âj¦B/‰P ç‹ñ‡0ô—·×þõà1_?^†&Ò:»o"·Ptf£‚ )T°\Bw£’ˆƒB…ô¨ɤumÑPDÎ?žþA2ŸLæõ<Ãb?%M“ÙÌ&R¤`µ(RqP¤ÞÍ™Tílƒ™}»ÑÉä*›dHq€µ 8HÄAq@zdè0¸n‹‹m8ØšHþVÞ&G­Ü¾¤Ä$f‚ )@°H ‰8(@HL8é" ®älpz"ϼ8<~sü* GõÔ‡ñ¨Þx{þüøÈªÃáiøÛ¹GÔ{B†²ÕG†”úXaºÕOÄA©OzõùúJêû{¢¨ØØ<5±¦å¨ï´y´SHU6ÈÂKAaˆƒÂ€ô’ ¦ ¼¨Çû` w9xÜ@ª²1@†X ƒD¤÷í9ãεµ€óû`ÐuºróDæcAÂÁÉq½aŠ¢Øp0ŸŒã0„x)þÒá<~Öl%‘!¥$Î%¥d"JIÒ{«¤-˜‹¿×BÊû 9˜¿[þsðªZeår“YÈ–¸µ£F9–Ýwh$‚ ô¥\7ÕZiÇœ*d«n3ØÔöÙ÷gÏë-_?|/ß×[U'X÷€F=~?æ,›dHÁ€5‘Ý+ëSqP8ÞÛÃ]æ Ôð3µ7qÆñÀoÊë&,Ý•Ù(óÕ /|Âlý!¥Î ¥_"J?Ò{«ŸTÌÚ ùÄ'È‹k‡€[uù³»Ï­bó9³Elí( Q) wƒ ¤\· Á¬ÒxH†‚›© T^®æ8 ‰È–RãDS"'â T&½CÝ »[.M+rs'qbeXºÏ'á`4…ÛO7dH¡ƒå£ÐIÄA¡CzoБÞ1ã¸oÑQ5:oovo¨­ë÷Ô܃š˜Ù\j°!A͆rRtR“Šƒ †öÔ8Ìƾ®©\—ãw·»è”³«1Ü+SîøâÅ|:× 'ëýä×¢ì3713Ùª#CJuœyÙ}ƒT*JuÒ;¨n3Ü¡2cjÕ߬fíí÷³Ñ´¼Üîô:ï›Ú^¤ü|óC²%F†”Ä8͔ĉ8(‰Iïp…&ìÊ´3±ˆú Í÷çLÓÂ%˜zY¢oô‚ï  ä8 dH„5”Ý·Ì¥â "½Ã¡‹ð¨ã >lŽ//ëcý¦™¾œÏ[]7 nã8ü+ ÐýtÎØ‡¼L$æ%[sdHiŽóNižˆƒÒœôšKÇ´h§"^ùßÖ<®E5‚¦àlü믓fŸóE¨Õ¶ÿæe†TdËŒ )™qª)™qP2ïxçØ{ó5R’&„¬«îo,B.†ÐÄíœ;x9¾z¿üXVÿn­êÌ8aÜ/kÈ ÷Îû®³Ö}~;*[;^“•´‡‚çõrq½þ†‰ê[Eb¾ºÓÓ¼üëb´¸ åô,uøÜG¤/ûHB†Ô‘„塘HÄA±Az6„uQ{×°!66úèQŠŠç£rZMŸ¼Õûõ/’1™¹¤`C‚” ±RRq¤ìzO¹Âxæ´¯15͘»3Ô¶§rà ¦×oÊw墜]”Ý™ƒ7¿ïx‹ ˆñv#hÙ½Æ ¿•©¯ÉcJ[æ„­e2q¼M¦æÅz‹ÓÉzÝru?-·Ou¾Òɤ4ûÈB†Ô‘…%£8IÄAñBzošV¡4³ÞpÀ%~ÔNÓúj´¼xEù¦BÅX±ŸÓn¡éÌFR¨`¹d÷ª•T*¤÷xMHɬQº…e‹¬Î‡ÜΖ£?ŽúÒëýùðû€©ÌR `©(PqP Þ[PgV ‡@ (Ï˪ÍÆmЧ¼ßÞŒ®ÊodQó׸4³”Í2¤À*P $â  ½C])<³o늈÷íOë;¤5´³ûQƒDÒ™ 2¤PÁrQ¨$â P!½Çá‚{ËŒñª…e_W>”˜Ê\P°!ʆTª{Ue*Ú{ ŠÓa–Ó,!ªAÙו] KÙ CЬÅ@"ŠÒ;Ìo¹•ÌqÂ"î7¿ýn1šNGÕÙ#+÷ÓÛ-\ £Ù¸ C ¬…K" Ò{Ó†pÙ>ÐÂÖËŠ¶NØHΜ+TpPí5º˜4ûl Aš zžzŸÁr´,Û6&ÒeÅþËÈÚœgó„ )ž°¦ª{X*Š'Ò;ð¤<ÓJØÈ“ø<Ý]Ëœço‚Üfsƒ )n°v7‰8(nHïÀ´LÇÙPµöø.l.æ³å¢ZŸºËŽô¬àRÜ1i÷8¿¸¤Ÿ&ÅÙô´vÈÂK¨ºW<¦â ð!½>gŠ›HùRôÜ=È|í‹úŸyÅd2’ÖŽbéD!²EåºÄy&’{' Õ76'ßP¼“w -RºýI_Hy.IÈŽ J”‚ ‰t ¿:d™Ô¢jÜ— éîaFo ©Íþy¢ÖŽúu"$AL"ê·‰(×ñ·˜íäÉß Ìd~uU­ KÔ¦àÎx}×yœoý ¹>sÍjœÿó`Fþ¸@€f7‚f⯮ö…gÉï´­þåœùf¥öÿ÷#¯íoѪÀŒsë\…+˜6Z÷dhÒe=œŽÇÄÂóõ^(ôÿç»Òhendstream endobj 1037 0 obj << /Type /Page /Contents 1038 0 R /Resources 1036 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 955 0 R /Annots [ 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R ] >> endobj 1043 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 758.4766 511.2325 767.4329] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.1) >> >> endobj 1044 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 746.5446 511.2325 755.5507] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.2) >> >> endobj 1045 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 734.5129 511.2325 743.519] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.3) >> >> endobj 1046 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 722.3816 511.2325 731.3379] /Subtype /Link /A << /S /GoTo /D (section.4.9) >> >> endobj 1047 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 710.3499 511.2325 719.3062] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.1) >> >> endobj 1048 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 698.3182 511.2325 707.2745] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.2) >> >> endobj 1049 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 686.3862 511.2325 695.3923] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.3) >> >> endobj 1050 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 674.2549 511.2325 683.2112] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.4) >> >> endobj 1051 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 662.2232 511.2325 671.1795] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.5) >> >> endobj 1052 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 650.1915 511.2325 659.1478] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.6) >> >> endobj 1053 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 638.1599 511.2325 647.1161] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.7) >> >> endobj 1054 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 626.1282 511.2325 635.0845] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.8) >> >> endobj 1055 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 614.0965 511.2325 623.0528] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.9) >> >> endobj 1056 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 602.0648 511.2325 611.0211] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.10) >> >> endobj 1057 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 590.0331 511.2325 598.9894] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.11) >> >> endobj 1058 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 578.0015 511.2325 586.9578] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.12) >> >> endobj 1059 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 565.9698 511.2325 574.9261] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.13) >> >> endobj 1060 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 554.0378 511.2325 562.8944] /Subtype /Link /A << /S /GoTo /D (section.4.10) >> >> endobj 1061 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 542.0061 511.2325 550.8627] /Subtype /Link /A << /S /GoTo /D (subsection.4.10.1) >> >> endobj 1062 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 529.9744 511.2325 538.831] /Subtype /Link /A << /S /GoTo /D (subsection.4.10.2) >> >> endobj 1063 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 517.8431 511.2325 526.7994] /Subtype /Link /A << /S /GoTo /D (section.4.11) >> >> endobj 1064 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 505.8114 511.2325 514.7677] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.1) >> >> endobj 1065 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 493.7797 511.2325 502.736] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.1.1) >> >> endobj 1066 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 481.7481 511.2325 490.7043] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.1.2) >> >> endobj 1067 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 469.7164 511.2325 478.6727] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.1.3) >> >> endobj 1068 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 457.6847 511.2325 466.7904] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.2) >> >> endobj 1069 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 445.653 511.2325 454.7588] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.2.1) >> >> endobj 1070 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 433.6213 511.2325 442.7271] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.2.2) >> >> endobj 1071 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 421.5897 511.2325 430.6954] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.11.2.3) >> >> endobj 1072 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 409.558 511.2325 418.6637] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.3) >> >> endobj 1073 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 397.5263 511.2325 406.4826] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.4) >> >> endobj 1074 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 385.4946 511.2325 394.4509] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.5) >> >> endobj 1075 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 373.4629 511.2325 382.4192] /Subtype /Link /A << /S /GoTo /D (subsection.4.11.6) >> >> endobj 1076 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 361.4313 511.2325 370.537] /Subtype /Link /A << /S /GoTo /D (section.4.12) >> >> endobj 1077 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 349.3996 511.2325 358.5054] /Subtype /Link /A << /S /GoTo /D (subsection.4.12.1) >> >> endobj 1078 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 337.3679 511.2325 346.4737] /Subtype /Link /A << /S /GoTo /D (subsection.4.12.2) >> >> endobj 1079 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 315.0477 511.2325 323.7798] /Subtype /Link /A << /S /GoTo /D (chapter.5) >> >> endobj 1080 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 303.0359 511.2325 311.9922] /Subtype /Link /A << /S /GoTo /D (section.5.1) >> >> endobj 1081 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 291.0042 511.2325 299.9605] /Subtype /Link /A << /S /GoTo /D (section.5.2) >> >> endobj 1082 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 268.684 511.2325 277.4161] /Subtype /Link /A << /S /GoTo /D (chapter.6) >> >> endobj 1083 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 256.6722 511.2325 265.6285] /Subtype /Link /A << /S /GoTo /D (section.6.1) >> >> endobj 1084 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 244.6405 511.2325 253.5968] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.1) >> >> endobj 1085 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 232.6088 511.2325 241.5651] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.1) >> >> endobj 1086 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 220.5771 511.2325 229.5334] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.2) >> >> endobj 1087 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 208.5455 511.2325 217.5017] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.2) >> >> endobj 1088 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 196.5138 511.2325 205.6195] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.1) >> >> endobj 1089 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 184.4821 511.2325 193.5878] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj 1090 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 172.4504 511.2325 181.5562] /Subtype /Link /A << /S /GoTo /D (section.6.2) >> >> endobj 1091 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 160.5184 511.2325 169.5245] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.1) >> >> endobj 1092 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 148.4867 511.2325 157.4928] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.2) >> >> endobj 1093 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 136.4551 511.2325 145.4611] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.3) >> >> endobj 1094 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 124.4234 511.2325 133.4295] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.4) >> >> endobj 1095 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 112.292 511.2325 121.3978] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.5) >> >> endobj 1096 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 100.2604 511.2325 109.3661] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.6) >> >> endobj 1097 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 88.2287 511.2325 97.3344] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.7) >> >> endobj 1098 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 76.197 511.2325 85.3027] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.8) >> >> endobj 1099 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 64.1653 511.2325 73.2711] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.9) >> >> endobj 1039 0 obj << /D [1037 0 R /XYZ 56.6929 794.5015 null] >> endobj 1036 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1102 0 obj << /Length 3381 /Filter /FlateDecode >> stream xÚíKs7Çïú<ìA:‹÷ã¶Ž)§Û‘åÚ­<,j,±B‘ IÙq>ýb8 GšÂnäH”ÊU6%O³›ýÿÃFÔÿa#«NŽŒ“DQ¦FÓ‹::óÿ÷í믇‹ÆðªoNþùJ˜‘#Ns=:ùÞËj-œþ|øü훓—oNÞýzòÝÁË“ø¦Ð1£¢}Çß~þ•ŽN½ÿï(ΪÑgÿ%Ì9>º8J%…¿™¼?ø1¾!øß­iîƒ(a‰²Üd> çà“0ΉuÆG§Ñ‚‹íGÑ„ûPÛâ/gàrÁˆµTzíeóåÙÙlqÖ_ßV"´Óýuï7“MsÑ,6Gc®èá‹æJùb¶™-Ýo&‹ÓîŇõä¬9;fÉÑXQúuþ‘Îý/vׄVÜÍ)K¹¼¡ÌêlÔ½8†Z»14¼©ÕÍ÷o“+å8‚ö¹80RPïLIbŒq## ÑšI@ aGþ«COΛ 4šʤéa˜žO‹fžƒÆ©T¸îÝùj²ö,øˆ¾* wÀIµ£Ö±Ÿ?ÊF"¤ª`ˆ0!ê=@%¡ŒZ‚ì@x66ëuÁóåb³m/–ó¶ÓxDÍD‹¸j,€!†Å@˜r?†ê=b¡oWÄÄBuX¼^øIìljgãÈ¿{ýÆ×ï>bkñ€†CL\¸÷„‡¥„꺣ãÇv§k3žžn›Œm#"Œyj3BÚª™HvP”òzN& ÌuâA[BeÓñÓrÑt<œ9z¸š,Ö·Ã eØ1qÕHCŒ‰0åH.Œ Ô{ÂBùé'7ba;,>¼x×Qñn¹êkßÏÖ›– ùÔR¤ÌUs 1. 2†•¹ÈÄqzO\HI˜Ò° E\ÇÅÛËf5Ùl'¥ÛÉÇ—õ¦¹è^7ëåÕ¶G™6˜‹Y‹Œ•êa­ÆÆTË 1ya‚ /Ë›‰“õžä^Q«Ô  Eý Î&w j˜Þ“ïy‘€£j€!FÔ# Fê=À)áLJOŒu¼kV³åélüp²îk ۹ŧɼýN ·ïm|HR5ÀCŠ`DL¨÷„µ„K1¨01Þ!°}y¹œ/Ïü\Áó4‰ÌrXM0Ä™òbE.ŒÔ{$D:…áƒÒ=!·Ø+¸ö#ǹ3æÖ¸$¡þ7–¸„UûW‰œ˜ÛZr !BÎ@;„œ\9¸÷DŽ•DP6¨?0Ù‘s|¼nú ÅÛn…Ã÷7ÝpÒ>Í+b檹†PS.fçâÀ¸@½'. 'B ªLÅ.‡^-:´xHÎßÖý„tV³’ì0T€X¦\ß΂¹NœøŽDh:¨K0ÝòÍÕl¾Ïú…ò5˜®Ì—«‹IÚñçrÑÁý;>È-Á1 ÕúCL`˜eS.HæâÀ$F½'¥%ºA™œÆ//.7}Éú§NQ}JP_¥;IªFb@L¹ü˜‹CõžšHf‡»al‡À³ÓÓí&§É<¬rOÓûùdz¾í)œÖûSrˆé¨bbÃtÛrÉ!&6ê=‰Í%‘Ò ‹N®»]½Ž[Ü^ùï~?$B<æ±`ÈX5Àã*bËõ‡\¨÷ÄãD=ÜýÔ!›õår±n Ä|6@÷êªèñ»Ÿü?,T+?¯f]eZ2yï;÷ðñ«Å†˜¸0½™fâÀÄE½'q)%ŠªAq‰³œ¸Ç~îjËÝ×Þ‰}ÿj‡üT« 1õaþ-2xÏÄ©zû¡…õB‚‘ٹºÈgJEÔãwÞ·ÃÍ>ÏKÅL×r ŽJÚò!Âî=qd4Q ía´{W½uûPu ­¦%Ùa°¹ly.‘ CsHÑ’(+Kn7*žÙz3›®Çýy¹»1¬"RY·£ù‘ÜìÁí1‹Õ|C ¨’+ߥ“‹CõžQ܇ÁSQ‰Ó¯ÁÈî¶E¹¿‰" ![Õ,CŒ¨ÆB&ŒÔ{b¡=éD±T|â»O7ج®Ö›ætü[ó¥tô·»Æ)VîïX$ä´š`ˆ5så-Q¹80bP6Œ†H ¿Sbv7\‰6ú)¬b€@‰0@2q`€ Þ í–ZêR}‹ßæ´‚…—²ˆ¶D(!v4)ZÊýkKB2«Q†*P, •L*¨÷„ •Äp¶—wŠÊ-¦7ÔÜûÖ#$­ `ˆ!EÁÈÄ!zHpljÑ&•LøîC>͚Ϲóq¤ÿ@Fíh5”`½SLw-LÐi §+/µäâ@`½'˜,%ÆÛ¸¾˜v·+Úéý9¢+¦µ`ˆAeàÉÄAƒzOÐø.Ä‚›Ñùîšm»¿"Ï 5n×(ÊÚG¼¶²]R²ÃHZºòÂ^&Œ#ÌuÂHib•J•8nï„£ÝmQl:¬Öj`€!F ”Í•oWÍÅ1ƒzË…\Jσ¥9ŽE¹v{â—Ëf{ šx¬[‹€„V 1@ D ™80@Pï Á‰cB@@ú£RžÏ'Ûû—È )÷dëhLh5.Àà æÊ‹A¹80\Pï N‰“\A\Äõö$ž±$øS3u ™«æb\@e0.2q`\ ÞÔg˜†\ô‡©¼ø²˜\„›Þ>\žÆm)ÛÝG³¶×‘Jíì‚è¶8s[Ù{»14ÌÉ~ýýÛÄ3Š I3`º£îi}cÁœ!”ƃd}KÀè )x5›·ëpÊ=ø.ä^Ža{¢ µAC²ÌŒ–w=åA ÃÝÇ™kRÃ](á‰vË8 \[Ø–KwW7ÓewKÔúÚ”æßçM?ËÙ,Ã$' ‹ÏÛûï÷¨d ©b‚ÃŒ£‚gÁGÝÇÞ„Ah»îßJ.vkk{Tƒ‹ WHX5Àã ‚ò ãuŸxЬ}’À÷8lï§nþØ\…»š?.ÃÑK±~Û…ãítFïm7Ч©‚d‡1D`´<ÀÌD€ùN=€t„±xœŽØêßö/fëéUFêþ“i$}”ÏÁú…Vã 1> F( ™@0BP÷ a“ñd±Œ¶ˆ¼o6éT““ï· È§áe=@!ÃÕC ¨ cåk¹@0€P÷ ®3JF€dÐëE{ l?Úøaryi ÷Q¾~÷É_Ì­xšŠÄ,VC 1H J($™@0HP÷ æû*U„Dõ¼Ýœ‡»¥¯Ï~·‹*³nT2ÝÌ>µÓ!ÙcîŠB«!†$P%ÆÊ[Nr` îÓp•úª:A§/·9Ýå_™;ÿJðpA{ƒÞd3^ÏÎÝMzJ±§î)f½*`ˆAUE¡Ê‚A…ºPYG¸æ0Å+˜úÇÛã×ß¾~“{2¥!‚ŃíÔÑØÝ#°þª½œ!Ÿµ´;¨ÆJ& Ôwz¥!Ü1H5¤¼~óüû/^æ¶U+Bµ(¡ÂÅÞõS!“µŒ;„¨ÆH& 치ïtø½‡‚3€ˆ¬AÄÏ¢r»J4±Òð0J=ªqpŸàZr’1Ž> endobj 1104 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 758.5763 539.579 767.5824] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.10) >> >> endobj 1105 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 746.6054 539.579 755.6115] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.1) >> >> endobj 1106 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 734.5349 539.579 743.6406] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.2) >> >> endobj 1107 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 722.564 539.579 731.6697] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.3) >> >> endobj 1108 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 710.5931 539.579 719.5494] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.11) >> >> endobj 1109 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 698.6222 539.579 707.5785] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.12) >> >> endobj 1110 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 686.6513 539.579 695.6076] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.13) >> >> endobj 1111 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 674.6804 539.579 683.6367] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.14) >> >> endobj 1112 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 662.7096 539.579 671.6658] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.15) >> >> endobj 1113 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 650.7387 539.579 659.8444] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.16) >> >> endobj 1114 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 638.7678 539.579 647.7241] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.1) >> >> endobj 1115 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 626.7969 539.579 635.7532] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.2) >> >> endobj 1116 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 614.826 539.579 623.7823] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.3) >> >> endobj 1117 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 602.8551 539.579 611.8114] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.4) >> >> endobj 1118 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 590.8843 539.579 599.8405] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.5) >> >> endobj 1119 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 578.9134 539.579 587.8696] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.6) >> >> endobj 1120 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 566.9425 539.579 575.8988] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.7) >> >> endobj 1121 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 555.0713 539.579 564.0773] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.8) >> >> endobj 1122 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 543.1004 539.579 551.957] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.9) >> >> endobj 1123 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 531.1295 539.579 539.9861] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.10) >> >> endobj 1124 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 519.0589 539.579 528.0152] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.11) >> >> endobj 1125 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 507.1877 539.579 516.1938] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.12) >> >> endobj 1126 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 495.2168 539.579 504.2229] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.13) >> >> endobj 1127 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 483.1463 539.579 492.1026] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.14) >> >> endobj 1128 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 471.1754 539.579 480.1317] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.15) >> >> endobj 1129 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 459.2045 539.579 468.1608] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.16) >> >> endobj 1130 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 447.2336 539.579 456.1899] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.17) >> >> endobj 1131 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 435.2628 539.579 444.219] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.18) >> >> endobj 1132 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 423.2919 539.579 432.2481] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.19) >> >> endobj 1133 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 411.321 539.579 420.4267] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.20) >> >> endobj 1134 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 399.3501 539.579 408.3064] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.21) >> >> endobj 1135 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 387.3792 539.579 396.3355] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.17) >> >> endobj 1136 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 375.4083 539.579 384.3646] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.18) >> >> endobj 1137 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 363.4374 539.579 372.3937] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.19) >> >> endobj 1138 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 351.4666 539.579 360.4228] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.20) >> >> endobj 1139 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 339.4957 539.579 348.6014] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.21) >> >> endobj 1140 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 327.5248 539.579 336.6305] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.22) >> >> endobj 1141 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 315.5539 539.579 324.6596] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.23) >> >> endobj 1142 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 303.583 539.579 312.6888] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.24) >> >> endobj 1143 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 291.6121 539.579 300.5684] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.25) >> >> endobj 1144 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 279.6413 539.579 288.5975] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.26) >> >> endobj 1145 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 267.6704 539.579 276.6267] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.27) >> >> endobj 1146 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 255.6995 539.579 264.6558] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.28) >> >> endobj 1147 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 243.7286 539.579 252.6849] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.1) >> >> endobj 1148 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 231.7577 539.579 240.714] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.2) >> >> endobj 1149 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 219.7868 539.579 228.7431] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.3) >> >> endobj 1150 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 207.8159 539.579 216.9217] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.4) >> >> endobj 1151 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 195.845 539.579 204.9508] /Subtype /Link /A << /S /GoTo /D (section.6.3) >> >> endobj 1152 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 183.8742 539.579 192.9799] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj 1153 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 171.9033 539.579 181.009] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj 1154 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 159.9324 539.579 169.0381] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.2) >> >> endobj 1155 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 147.9615 539.579 157.0673] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.2) >> >> endobj 1156 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 135.9906 539.579 145.0964] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.3) >> >> endobj 1157 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 124.0197 539.579 133.1255] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.4) >> >> endobj 1158 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 112.1485 539.579 121.1546] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.5) >> >> endobj 1159 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 100.1776 539.579 109.1837] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.1) >> >> endobj 1160 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 88.2068 539.579 97.2128] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.2) >> >> endobj 1161 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 76.2359 539.579 85.242] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.3) >> >> endobj 1162 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 64.265 539.579 73.2711] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.5.4) >> >> endobj 1103 0 obj << /D [1101 0 R /XYZ 85.0394 794.5015 null] >> endobj 1100 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1165 0 obj << /Length 3487 /Filter /FlateDecode >> stream xÚí[sÛÆÇßõ)øÐ™J3Õz¯XlûÐÑÅv•&J*)Ó™¦}€HˆÄ˜´ê~ú.ˆÝ塸8b;±,Æ“!%áàžÿoö¨ýÇF*!‰áf¤$Š25/èhjÿöö€¹cŽýAÇð¨Ó›ƒWo„bžŒnîFR)ÂÕúd)¡iÊF7“ŸϾ¿¼y}ys}ôŸ›o^ß„³BÏŒŠö”?üô:šØ¾9 D˜Tì”0cøhq • J á3?¸>øG8!øëÚ4úI%\$<òQ8¥ý£b#­ Ië’A’£cÆ)=<½¸aƒy†P”‡H ¨{õaŒ*740wõyŒÀYµ*mgÄþ”R³¯qR|2“ 1R XŒ©~R"`¤ îCåHŒ!œó *¡p\f _9òå{ßeíGHòô9Èݧ³OÄP™¢2L3&r$ DcÔ÷FâTû²Q˜;…ÿU•¹”VÅ2+Çù/Él´üR핲ûÀƒ• f˜›d2–ôë¸&#âx£¢V„*m€ŽÂéx•×Õü -4Møó+Ͻ"û| –bBÃ|£RGÁÄFÝoäN81v¬ ä–Nîëjü.o:q/^}ÿKª'T~ rû| –brÃ|3¦û厂ɺßÈ­(IHÜÊÉ}V-î­¶·Å¼h>tâ>ͬ›ïfëlšHC7᳞sÚ² £Ý1é-âKëöáS6˜`ˆ%a,í'"FÄŽ{8Åçg9ž!Y²öÞÎÑ­YD?MWË€ÅYUÖÅ$_fí SÝŸ8jÀÓ v#Þ=o—0ÓŸ0p>,Q;ncs) KWÆ%jÝ{mçRNÆã¼µ°lÖsŸ•›uûÖVÊõßä~Fex»ó Üî€!Öî  (F‘@0œP÷'jk¯ÖÊáÄ#³ðÜVt&™« g³eU5‘:+$¡’»£²r›Ï7D(í§ó¯ófULbgJmàÒ—ì0ø©‰õš&bÄBf§ýÄFÁˆEÝ»Ée8¡F`ÃdÏMt I1Ke*Kã^xí(QsØëò}·xT•‹¼´]O‘ˆ—Sû° ™Š4D°ÚRÃ*‚îÞc•RB™+î°ú±.Êiw/RêÄvo|u¬{k%š†šöfUŽÛN‹UE¿h¤|Ö# 1¤ ª(R‘@0¤P÷þÚªMŒ`ž)áºjçÊlQŒ;¦~¼ŸdMþ¸w«U²ïʼnñ9L 0Ĉš¡ÄDÁˆÙq)©ˆÐ†û±êztsÄ;\V«Ûy^Ïìõ«-H½ùñgxê` ƒ­Èï_@†çÃò±ã6Ú‚„°îu·X†ÁÎYµX´Å³m4?tj››E;œ—r?¶Þ¨|š7*`ˆ5*(# O$ "Ô½¿²sÛ·c*0:ŒÍÝ€¹¬ÜôâCµ|g[×_ºŸfÕC÷fœ9Ø.º—Sʧ«n{Q÷›jåÏ0ËÂi\rúW[ÑYú;PÐ+¸ÏÉ`Á!&8Ì9*x$LpÔ}¨Ô&„œ»¢qQŽ;ÅÚ.}èÓµÕnÒd–•Ó­®ž_ ,üæ¥ËÕâ¶]u°>žQ%èeÀei0;Œ  Àn˜þ˜o/¿4šÐÐÞ}¯ëŸ³6سGMú­_aø[>¿·íUÊýä)ùd¥Ø!A)1Š"Q íøŽuŤ–DšT¯}ŸØÎùáÉý}^NŠqÞ?ÙÌžÚÿ‚Hÿk+ÆûWÔáù°ì¸6¥„É—„öÊ©µMÃø]Y=ÌóÉ´-¥íB+7û^×ð¦ã“;¸íC¬ñ@ñPd"`è î]¯K*J„‰'§eÇ´M¨«²§Ë"¿s·¨›jé–tª»G×ßóËëGênQ(¡ì+*¢>YƒI† P ”„H  ¨ûPDÖóùÜ£À»"ò6/ó¥ïY•¯ò;w™[s.Ê»õVñõtYb¾ÎŠÑK†ÏÝ`2€!FÔ†ñþ]±@02P÷¾Fð„0M¾F\üð>q~2éh¨ë¼öc/EOìö•µË÷z! y 0Ä :¡DÁ A݇òÁd{³”r”ˆ®|œ·ó¢š.³ûÙ‡ á"q½šNóºÉ'¾¬d;¶ë˜œ¿¾¹ÏÜ`.€!ÆTå"ÆêÞÊ ¥IÀ«üç•U¾ÓÝ^9ü–ˆ…ë«zT®ÞœÕ©x)<ø” æb<@IP"`< î"µ¿âR¸»˜´½J?º?_fw-Æðýàä È„¬E"Èl©ÆDÿrK,ܽGFk’J¾AFtÈ|ßÌüæâój¼…ãä6LôvÃÅøËèc„\ b @-P"`  î}C$Šè„ G‚t}ŒÇÛÃ0åÛâv™ù1ëõêþ¾ZZ,fö“^OŸÑÁ¼CŒ¨ÊK$ŒÔ½/JD§ß÷èÖ"ÝöçUQíÒ¾fûi±_Ïñ`€€!Ô ÖP$ Ô½H2¢ìï@®³Òî}/æn®C ¹çf87>µƒ¹†7P:”›H 7¨{Ï 7D1¹áFøNnÝdsÎW»Ïû7áǧx0?ÀãJˆò ãuïùašHÁYàGvüü½¬Üzèy~—›úÕ•D/‹qwkűùb»6Ÿg¨5˜`ˆQ…@)ˆ‚Q€º÷PE„¢ TGAxt¤¬É¸*ïàƒ’Tï ŠŒÏê`d€!† T‰þüÄÁAÝ;d¸„'i &鈹Î÷þ>'÷÷óbìîÅ:V2Ù¯÷nâs8”`‡àÂèˆDÀúwsò”–&:ºšv]¯qùÊ:PêbMݬn»wnÜØ½jÜ- Jêg²\ç1Xâ&1H3*ñn˜Ä˜ïĉiŸBg€Æ|Kãã¬þPŽ+­å៶ö^º…¿öd3·²ZÕóí–,þ‘êøÏ0X`ˆésÄDÿv¥X ˜B¨ûDJÊ”HlKä'&l×®_¨0ÉÕ,³²ÎÆ~LAÇób}7”¡âwj^þb ¢FÁDÝo”’aÀU¶{TÚFÀiV8á¦yÓ.Žå]Õ®fu+Y[ûdìe¶ÈwhÂòظšXÑ•PŸ_9ÿÑ+ 1å`êPå"`Ê¡î7Ê NR¥¡rj[¹Õú>ŸþV77­ÀMA¾Ñµïﻂ8]f‹£c½µlù©v‡O2X(`ˆ 3ÅDÿƒÂb`B¡î7BqÚ>QT¡'TY»ôÞz™&Õ"+ÊWex0T  5žåãwþ‡¢ôMk¹¨·w²]½9ëÞHªåð;»zuòd°NÀÓ &Љþ-c±@0P÷~´AS’±QIwíe—­­b6險ýFÓ8+>ƒY†+P.”•H +;îcµmß•0éîØ;m·sˆÃï²rå÷ÞgSd¿v°~ê~mh€ì×ÞŠŠ‰þçëÀó!¹Øu[ÇdZªŒËÅzYJ˜ÃI1ý:v<<»9¡ ÇЖ ‘–·¥7JY$Œ6Ô} -aÄh-m¼£mVµÝK¥÷¸ýö¸yAã 1Ü àLö÷²c`¸¡înÒÔ(›pÅ­¬ë||¼îŽMÖý{œ>–#ŸéÁCŒ#¨$“ýƒ€X G¨ûÀ‘Ð$õ÷&ž®—ÀG•íáÛC»ünö },H>ÕƒA†HPJ&û{ž±@0P÷$®ˆŒ;ÔH“ú®N.ÞåvÄ"ÒtѯÆÈ'z0FÀà É$ÒŠ‚a„º1Ai»ƒÙ†;P=&û› cuØ¡Œ¨Ä=Yãt=O²ÅÎ4o7’Iµïh"š|¾Ó 1š žLõï ‰‚Ñ„º÷4¥†ÈTy˜Ò-˜º©¶÷Õ»v/ˆb{ > P>åCyvNPP¦ú»G‘(˜Pßá;4‘Ô÷±ÍJuÞ4E;§¾/LŸîk;ºtþÒŽ`†}eÇFJ¦úïêÚ ûºÄqx6­"~‹Ü)a´’y†Šiù¿õ÷9H¹ðü³ÅɯÙì¸1CŸ+Td {ª8ù¥mŽá ¹ç§ilÊÜþψQŠü÷%n¾ÖQjbÇo=]1® á”êQûÕUn(Z¼Gn'XBÿ?ßðßvendstream endobj 1164 0 obj << /Type /Page /Contents 1165 0 R /Resources 1163 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 955 0 R /Annots [ 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R ] >> endobj 1167 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 758.5763 511.2325 767.5824] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.6) >> >> endobj 1168 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 746.3946 511.2325 755.5003] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.7) >> >> endobj 1169 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 734.4122 511.2325 743.4183] /Subtype /Link /A << /S /GoTo /D (section.6.4) >> >> endobj 1170 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 722.3302 511.2325 731.3362] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.0.1) >> >> endobj 1171 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 710.1484 511.2325 719.2542] /Subtype /Link /A << /S /GoTo /D (subsection.6.4.1) >> >> endobj 1172 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 698.0664 511.2325 707.1721] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.1) >> >> endobj 1173 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 685.9843 511.2325 695.0901] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.2) >> >> endobj 1174 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 673.9023 511.2325 683.008] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.3) >> >> endobj 1175 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 661.9199 511.2325 670.926] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.4) >> >> endobj 1179 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 649.7382 511.2325 658.8439] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.5) >> >> endobj 1180 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 627.1661 511.2325 636.0228] /Subtype /Link /A << /S /GoTo /D (chapter.7) >> >> endobj 1181 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 615.1039 511.2325 624.2097] /Subtype /Link /A << /S /GoTo /D (section.7.1) >> >> endobj 1182 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 603.0219 511.2325 612.1276] /Subtype /Link /A << /S /GoTo /D (section.7.2) >> >> endobj 1183 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 590.9398 511.2325 600.0456] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.1) >> >> endobj 1184 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 578.8578 511.2325 587.9635] /Subtype /Link /A << /S /GoTo /D (subsection.7.2.2) >> >> endobj 1185 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 566.7757 511.2325 575.8815] /Subtype /Link /A << /S /GoTo /D (section.7.3) >> >> endobj 1186 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 544.2037 511.2325 553.0603] /Subtype /Link /A << /S /GoTo /D (chapter.8) >> >> endobj 1187 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 532.1415 511.2325 541.2472] /Subtype /Link /A << /S /GoTo /D (section.8.1) >> >> endobj 1188 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 520.0594 511.2325 529.1652] /Subtype /Link /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj 1189 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 507.9774 511.2325 517.0831] /Subtype /Link /A << /S /GoTo /D (section.8.2) >> >> endobj 1190 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 495.8953 511.2325 505.0011] /Subtype /Link /A << /S /GoTo /D (section.8.3) >> >> endobj 1191 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 473.3232 511.2325 482.1799] /Subtype /Link /A << /S /GoTo /D (appendix.A) >> >> endobj 1192 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 461.2611 511.2325 470.3668] /Subtype /Link /A << /S /GoTo /D (section.A.1) >> >> endobj 1193 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 449.179 511.2325 458.2847] /Subtype /Link /A << /S /GoTo /D (subsection.A.1.1) >> >> endobj 1194 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 437.097 511.2325 446.2027] /Subtype /Link /A << /S /GoTo /D (section.A.2) >> >> endobj 1195 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 425.0149 511.2325 434.1207] /Subtype /Link /A << /S /GoTo /D (subsection.A.2.1) >> >> endobj 1196 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 412.9329 511.2325 422.0386] /Subtype /Link /A << /S /GoTo /D (section.A.3) >> >> endobj 1197 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 400.8508 511.2325 409.9566] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.1) >> >> endobj 1198 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 388.7688 511.2325 397.8745] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.2) >> >> endobj 1199 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 376.6867 511.2325 385.7925] /Subtype /Link /A << /S /GoTo /D (subsection.A.3.3) >> >> endobj 1200 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 364.6047 511.2325 373.7104] /Subtype /Link /A << /S /GoTo /D (section.A.4) >> >> endobj 1201 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 352.5226 511.2325 361.6284] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.1) >> >> endobj 1202 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 340.4406 511.2325 349.5463] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.2) >> >> endobj 1203 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 328.3585 511.2325 337.4643] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.3) >> >> endobj 1204 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 316.2765 511.2325 325.3822] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.4) >> >> endobj 1205 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 304.1944 511.2325 313.3002] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.5) >> >> endobj 1206 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 292.1124 511.2325 301.2181] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.6) >> >> endobj 1207 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 280.0303 511.2325 289.1361] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.1) >> >> endobj 1208 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 267.9483 511.2325 277.054] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.2) >> >> endobj 1209 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 255.8662 511.2325 264.972] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.3) >> >> endobj 1210 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 243.7842 511.2325 252.8899] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.4) >> >> endobj 1211 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 231.7021 511.2325 240.8079] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.5) >> >> endobj 1212 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 219.6201 511.2325 228.7258] /Subtype /Link /A << /S /GoTo /D (subsubsection.A.4.6.6) >> >> endobj 1213 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 207.538 511.2325 216.6438] /Subtype /Link /A << /S /GoTo /D (subsection.A.4.7) >> >> endobj 1214 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 184.9659 511.2325 193.8226] /Subtype /Link /A << /S /GoTo /D (appendix.B) >> >> endobj 1215 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 172.9038 511.2325 182.0095] /Subtype /Link /A << /S /GoTo /D (section.B.1) >> >> endobj 1216 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 160.8217 511.2325 169.9275] /Subtype /Link /A << /S /GoTo /D (section.B.2) >> >> endobj 1217 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 148.8393 511.2325 157.8454] /Subtype /Link /A << /S /GoTo /D (section.B.3) >> >> endobj 1218 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 136.6576 511.2325 145.7634] /Subtype /Link /A << /S /GoTo /D (section.B.4) >> >> endobj 1219 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 124.6752 511.2325 133.6813] /Subtype /Link /A << /S /GoTo /D (section.B.5) >> >> endobj 1220 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 112.4935 511.2325 121.5993] /Subtype /Link /A << /S /GoTo /D (section.B.6) >> >> endobj 1221 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 100.4115 511.2325 109.5172] /Subtype /Link /A << /S /GoTo /D (section.B.7) >> >> endobj 1222 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 88.3294 511.2325 97.4352] /Subtype /Link /A << /S /GoTo /D (section.B.8) >> >> endobj 1223 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 76.2474 511.2325 85.3531] /Subtype /Link /A << /S /GoTo /D (section.B.9) >> >> endobj 1224 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 64.1653 511.2325 73.2711] /Subtype /Link /A << /S /GoTo /D (section.B.10) >> >> endobj 1166 0 obj << /D [1164 0 R /XYZ 56.6929 794.5015 null] >> endobj 1163 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1227 0 obj << /Length 948 /Filter /FlateDecode >> stream xÚíÚKsÓ0à»…õAB«·®0…0@nÀ!㤠nI(¯_œDêBäeL.õt:u¯v­ýÆŠUoªWy@ôî6´t!Fyn¼t…+‘]Iˆ‡>åLàVIµ½’Ç aZ…“E·Ù,[öu¹¾<ûÑ0éõ o˜âýÑ!Ü}”?L©ât{w;ïM\Ÿ×»ƒ×¸­)ŽáÀöŽß÷¬:($9)B©"ÓgUÚqë$Ur§ª›¯– Ö^,ÛíUwÖ0käDèŸ ¥IMR„pÁêaB…B(BdúLHî$„DHúyÕ-ã‹fº ý;¡4É£ ¡@Šn"X3L¨PEˆLŸ Å2œµ>ÒˆPÃ|0oM;‚­¿KMM RÄp“Áúab…B(bdúL €{›ˆ|—úpu³î柮חݗøºµ¦ñ|Òæƒ)>¸à`˜O¡Š™>ñ±ñÀ«»ç³¹¹^Ì¿ÄÕÍ8=Ý¤Ž¸æŒå… ^¿5˜âU*„àE§Ï¼¼ãA@Þܹ¯u·hãø‡Nëÿ¯†¹#£½¡@Êî8¸á\¥B(odúìÍ´ÍÛ¾íbüè©t®”<€îSô'õùv/¸=ó·Q-ô °ÛŸ9½W‡©S£¢@Ê!–^ ;,B9$Óg‡VñDÞ;†Ûûë±/»†)PÓ=î~Q¥i R¨p[ÁËaT…B(TdúŒÊH.”I»I)öOJÝæ•·nÒtOšÒ|Ö„)M¸Ÿà‡Ÿ– ¡4‘é³&-¸ð"måþ¹û|}=ï7 “vú$vÔ05`4/Hñ O|+Bñ"Óg^Òs&m,åþ|¼G­çÝâjÕ/vòuXiêGÃB,ÜZV¡ ™>Ã÷‘"m)åþ±üå¦e«yËÞ !¿ß\G_&Q÷$*ÍùhQ(…{ Þ‹*B‰"ÓgQBÇåϤM£LOé7ËV]Ì7 JM·ª£ÀJS? ¤`áÖ‚wð …ÀÊ_`Æzî¼,}"þf7Ôݾnqû¥í¸ò»|‡W«„»ëjexkw±_/5…jÿùŶ)endstream endobj 1226 0 obj << /Type /Page /Contents 1227 0 R /Resources 1225 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R /Annots [ 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R ] >> endobj 1229 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 758.4766 539.579 767.5824] /Subtype /Link /A << /S /GoTo /D (section.B.11) >> >> endobj 1230 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 746.5215 539.579 755.6272] /Subtype /Link /A << /S /GoTo /D (section.B.12) >> >> endobj 1231 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 734.5663 539.579 743.672] /Subtype /Link /A << /S /GoTo /D (section.B.13) >> >> endobj 1232 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 722.6111 539.579 731.7169] /Subtype /Link /A << /S /GoTo /D (section.B.14) >> >> endobj 1233 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 710.7556 539.579 719.7617] /Subtype /Link /A << /S /GoTo /D (section.B.15) >> >> endobj 1234 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 698.8005 539.579 707.8065] /Subtype /Link /A << /S /GoTo /D (section.B.16) >> >> endobj 1235 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 686.7456 539.579 695.8514] /Subtype /Link /A << /S /GoTo /D (section.B.17) >> >> endobj 1239 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 674.7905 539.579 683.8962] /Subtype /Link /A << /S /GoTo /D (section.B.18) >> >> endobj 1240 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 662.8353 539.579 671.941] /Subtype /Link /A << /S /GoTo /D (section.B.19) >> >> endobj 1241 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 650.8801 539.579 659.9859] /Subtype /Link /A << /S /GoTo /D (section.B.20) >> >> endobj 1242 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 638.925 539.579 648.0307] /Subtype /Link /A << /S /GoTo /D (section.B.21) >> >> endobj 1243 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 626.9698 539.579 636.0755] /Subtype /Link /A << /S /GoTo /D (section.B.22) >> >> endobj 1244 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 615.0146 539.579 624.1204] /Subtype /Link /A << /S /GoTo /D (section.B.23) >> >> endobj 1245 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [522.6425 603.0594 539.579 612.1652] /Subtype /Link /A << /S /GoTo /D (section.B.24) >> >> endobj 1228 0 obj << /D [1226 0 R /XYZ 85.0394 794.5015 null] >> endobj 1225 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1249 0 obj << /Length 2174 /Filter /FlateDecode >> stream xÚÝYÝoã6÷_áGXëø%‘ìãî¶ÅÅî’¢½>(c kK®>’ºý 9C[ŠåÍö6ÀE€ˆ¤†äpæ7¿Ê|Éà/M–2iÕR[•fŒgËõ~Á–x÷ý‚“ŒÊdš))¡3óv•I“fFèåj¼ÈÛ»Å?¾|)Xšç"[Þ=œöʵI­TvyWþ’¼Û‡Þµ7+‘±„ßüz÷NS©6šûi ¶ÈRm™ >Ô}۔ú¯ššÄÅÒ¦6y”Ö0ÔõÒw[K›ÜOsmízì½oöEUcûc±'™Ûc×»=¶ÿÃ2öþã-<¸Ðɺ©»ªë;|Ý<à³ëwǺ/~§Á†Æn]=ŸIÖ°ß³U\ÝW}…£:©nxRcÓO‚3úSqžÚ,Ñt)Xâ"O ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1ɰó›ûE†Î•8þдØ(ÝÎmоª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂÈ¼Š¢eÑ(Vuqå 4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§BÎKn×ÍÁá <ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||OñoOëP¢ÀG'HM‘Œε"~4à*ÎðRÃþÞÑ<.Xl5ga‚¢È$*x–[8_p$Œ—Ñ&¡w@¿=V¥£÷`ùjͪ…öv0PÜ7MĘ B]KÕ%6ÖèÛ ¨È)£™'ãÎù¦C7¾~iÚ¾öØ÷ÿpûŽ ÞüØSv¤K,>ºæ¡©Â’C±þTl¨ƒF÷r‘ã ]”ûªöp-ú¦E 5Ð3ð9B¦êf6Ø£cz"´×MKAwhê’¦‡øüÌ)Rûe (þÙnŠºúã䑳Ng•¿<2>œ(§">‰zƒ“¥M6Ó2žÃ"Ó  𙽔€ôi‰à !‡¹.nëp׈K#šÊi0B¦ƒ!ÈEkwè#wL”L§,jN;ñ¢v!k`¯¨ù±¿0­¤©á°ÅÍ(ûÛPa#Rƒ–>h„TS×¾Ð'Ä´2y,Úªhž«q±¦«ù0|5ŽXœ|i %Dž+}i™È+và:Š .—´©QŒ°ù #A`O °“ìªÍ¶rþ?ÑËSÆõ,MtÍîËQÔRSm’Ùà¢èaõÜóÜ_*˜¸8LÈç$ã$>J’ö"’`¨ ­ƒe}8ëëÀásâ³”ã ÅÚh‰>®©7 /«M·"˜d"µŒÉi¸Ôn¤,F¥²ç”; º¶²©üÒH°†ž7S¹FÎ8 ât€ªÿˆ½p*¡² °{CE]ιKó4—9ŸÓļ¨É(,ýé©¿‡ ˶iz²ž„"Ï8ŸB‚Jp·;^bç8Ö¶<¹oÊã´üì£Ð¨Ž4DN†ÉÉr¢ P˜ @cRàâH=Åáàê²òÙæðyÊ•ŽÙ;Ò“9Ñvà–ö0ì°=f´‡T©’æ™=µ"½Þu(kÁ»€¡÷3®„ë¼Î£v÷Õý®j6mqØç2 TäLb°>”XÀy¡Ì™j‚Ûâq Ôv$¢ žD8^øú &®*‚îóSˆÏš|SXuYµ)©Ú„âüѳoSSiùS¯wUý•eg(£ãÜsÙºOëàïg7b¸„%Wð¡Ðñ€^Á;NÀNTÿ¯ÕâÛ»Ó÷›CHᙺQ ÿñæ·Å/¿²e¹`Ë,•ÖdË'è0°&TŠû…’Ðd™‰#»Åíâ_ÿ㬨ǨP¸ªÎc°5#º§K­â™V܇3üôEjŠfø –Q£­¢+O(Ÿèº³ß…Ù¤ÆáÜ,Ç[|Ö§%_P[B騠ò™ªýó`ÉU¸týqwyˆLä©Ê³ì¡”YÌ'}šûÿƒ“©ÿ‰3ÅWá$ h·Vž?pŠY8I ”‚lSø´£à2Þoýçˆk¥$\î™Ø¹Ó€H~ú÷oPrÛtýHx-Tà3Ÿv@¤è]’·`ºç×î‰ àÚýô•¯×=:å×n„èç–óÌ!zd¹ïªß=Çæ@¿OUÙo¯ƒ÷Õôý 7:ú¹AA¨²ü%ðr™2)"ÄúsZVicÎ; ŸÁÏh£WcÄçÊ+3‹Ÿ±ò#ýšo›]yJ¯¦úßJV§Ìrû’\Ó4lqþ²áË’ÈFCÿ9¶x- =×ú µ¾€Ð5༚ºÜ¸c3Í¡vÃH-Ôø·¿‹ßE `{õ1³?Æßÿà¶–úŸgÑ#!¥`jIB¡¿0{üÉñ¼RÜí¿:^endstream endobj 1248 0 obj << /Type /Page /Contents 1249 0 R /Resources 1247 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R >> endobj 6 0 obj << /D [1248 0 R /XYZ 85.0394 769.5949 null] >> endobj 1250 0 obj << /D [1248 0 R /XYZ 85.0394 582.8476 null] >> endobj 10 0 obj << /D [1248 0 R /XYZ 85.0394 512.9824 null] >> endobj 1251 0 obj << /D [1248 0 R /XYZ 85.0394 474.7837 null] >> endobj 14 0 obj << /D [1248 0 R /XYZ 85.0394 399.5462 null] >> endobj 1252 0 obj << /D [1248 0 R /XYZ 85.0394 363.8828 null] >> endobj 18 0 obj << /D [1248 0 R /XYZ 85.0394 223.0066 null] >> endobj 1253 0 obj << /D [1248 0 R /XYZ 85.0394 190.9009 null] >> endobj 1254 0 obj << /D [1248 0 R /XYZ 85.0394 170.4169 null] >> endobj 1255 0 obj << /D [1248 0 R /XYZ 85.0394 158.4617 null] >> endobj 1247 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1261 0 obj << /Length 3187 /Filter /FlateDecode >> stream xÚÍÛrã¶õÝ_¡Gyf…àBðÒ7g/3oºv'Ó&y EÈæ,E2"e­÷ë{ÎEJtvÛ¦ÓŒÀ¹ß`µð§6q¦³E’EÂJeëí…\<ÀÚ_/ìÐj õíÝÅ7ïL²ÈDëxq·• ™¦jqWü¼T"—p‚\Þ}÷ör¥­\¾yÿÃÕõ o®~àÙÛÜÞ½ýÆ¿H+ßÜÜÂG]®”й|ýÝÕwo?кâ#¯oî>¼ó÷×w×ïo.½ûþâíÝ€õ˜2% ¢üÛÅÏ¿ÊE~!…ÉR»8À)T–éÅö"²FØÈ˜0S]Ü^üm8p´ê·ÎrJI¡M¬gX¥õ«l&b£gÕÝ£#ò6MU5‡²~ Ÿë¦~ru_6uGùîR¥KÞw® QYÓ·pÝzW¶£ ͆¾}¸áÛë›7Ãá¿H©ö»7þK]¹¿œ²4NE¬$`E"ü¿Š§:‰LNxúŸí xÈ(…Ȭý hŸ„³xvLZšV‰Ñªè¨ÚÙH^I$²4Y$&]’1‰ëR)µlÆ<¿ž­TªYþt©åHD'üïúçþFY"2•á=.ÿuÈG¶ø?a˜–ÂZ8{VÃÇ4X_d#ϱîùÐxÝ-:¤ý›w‘mÑ:¡¥‡~W~BÍŽ¥\þTýãËÜ"D²?9»$Œ$8Ìße—Òpš$ð”ïÊü¾r(¯FXüyygà£Ôþ>¯$úZKaæ½wwyJM-T$Lñpób8UfÀ9N@Nôvˆ~ošmÄq“oyöö¹ëÝö<=ð¦1Qˆ@žÌ’lUS³l÷»¶éø‡ˆðí½>¤zY4ëýÂ,ÍÓ,¬7ôuŸÚаò›ø”²îú¼ªBä„™¼.è¸}ûѹöô2ÞÇáFHÊ·n÷ÑUî™f®ëÞíj×#eãH‡´0;²˜™D ’Îì²k6ýᨹтâæîÕåÊÈ„ñ‚é/ß»OŸé ÚýT:N=`‰0†Áf_9²'¯:‚öDA¹ÁØ#:!€Ìô%)RZÓ Qò™F„ð7ÄÏæ˜¾½̉d!ZÆ&’OÅúWÑæwcRæÕÇ ”'ŽŽÄÅ6Hfr`vJ,z‚oNë¥Û‘€Öå:¯^á4D²ë!qØ÷Þx‘÷ù}Þ9Hquèiºë)rºŽŽ+ëM³ÛÍøI+Û¼]Íñ¾%©bÚT ~©åcÓõ4_a =§ôGÊ‹‚¯ï© žÊµ#¨'·ërO˜4ÊŠfýÆfß÷p÷ÀæxVÂßÑAøwÆîYMFô µm ö鯶¥B«„|Îëªé{e³Ëªi>ÒhßÒwÊY?A_ÎÞlP%°œKµ|¦!H´âŒÝ‚Ƚ^MRHÞ=#ŽØÌͦžÍh¡1]Œb઄8´{ö ç+ºïJôH·u®.˜šßönWzY XjÍx{ ï–UiK”†ÐYf§œ®½ÊÙ¥<ƒ2ø÷¼:aìj<ó@6-݇<7‘8`&´ )²ZÅÚ’Éá"9Ie|õÄÇáÌ`<^V8åL†Êåô ØÇŒýeƒûÏ$LÌ7s’"ËÀM½¯Æ6a3oô6JÙÏLEyŽ”ª"2ó(ùê°ssü6 dKi@Ý…±!Š‚½UÅ Xãó­IªGŠu_Ö³ä+’HÏië„ÿƒr* ºêšÉŸÀü1y¥Ÿò[úu}ûšá=]¨tRH­Ó©Ò園¹6ß ! huÕäÅ׺Ü¿wà¡€®‹ù\ãë$9ìŒJŽž¹ <¿}õî!‘M¢Àr‹ì°<Ù¹-*È,ÍX£Šàõ ¨ÆJÄvZÿ˜÷4À‚°}Èëòs¸>gĘ¢žÀý|½æ¢Íû7OZC_š_±m*¤ÂDpl>þž|HÎ1ÚqªTlË VŸ81ºo08£ }Žd¶|›{/KuS¸Ò©€/a¦¼+öÑ/™á«Ñ)˜äÙÆžsvš&vdápxH çóÑÔÝUŒ6ª‰gЦÄQl¦šd©•fç¤Ó3D—H†)ëx ü„8W‡0k´Щªà Â"×ñ=õÉz›÷45²SŒ8ˆø˜ÂKçœ8Å$Sc¯Ñ4ý oTIœžO¡Š ù”LvGizÄY|IäX Rþ„5}»²ïÿÀˆN£œ÷çôÁøá£6Œ=á[^á4œ<ö4ôLA`·ár0x>;/þé3øMÕÞòj.Wó([ª]¨Q›ºâ„ç>4–ê">%Ô2ìÊÊž]Ë–_÷Á{¢âÍfEï¼]BîS¾m+oLäprÐX³ÆBU± {ŠSIœè ‚T&ÖͶÍë97§#(QMÌñíäúëz-ærD¤± ®qÝì«‚®¹w3Í“ $á‚f¿C<Ó)³9UFØ$Rƒõ“vZ%¤ˆ‰v0g=&TÓF f}:0½ †2 Ž5\e)±ÊsP¯–f*÷„Zà Ø¥„ç((Ï`óïÒo…²° Ô±©ºWsÜEo*…|ể‘©J³*s½Ûßý0¸Í4Id¡` 3Ô)¡£A¸/ƒ}ŒA¯ŽIÀŒ¼"àUšLy5G ™dDͤÁ[‹³Þ»g>‘™[|X93DƒÉäI€Ä9nbtXÖ§l^&÷ᨃŸ‡>߈½èK >ÞûÌGðxxJÈ’CçLÌŒ¡Mª—ÏpÖ\¢µP&%ň¤ó1ÜãÖ#&>‹À»{þ²Ìc0•Äždßy¬ 9›ÂN<\k)ŸÒˆê8­À^ò 𘎆T¡GKG;&H®EaHôú¡§}7DAζ5fƒcéÇ&\A„‡ýslЛq9nGÎ¥/QèL;:*×63ªšŠÈLò ¡~DCèXÒù£ V ëOÔ÷3—“ø¬1t`(j7}³nª9çnE¬‡"‚GPBeöÄVHIš0Ê»®Y—rá7ÆE±8’Q4K†h–p߉0pž!ûpg0 ij+PÂé(;­öÔüá3h2ëb6‘O óCˆ­¥:l-¡âeÑò¶ H{÷ÂÈ£)biO\g·oÛf×ýšÁi˜ Ù>Kö¹usÏŽáÁ먰' r€¿‡òTP€ùg"ZÛ=,hðaÒF&ðÕþ¼÷vªï*ºõñíj&¡N‘Á”_)(ǧŸµ²¨/ q~ÚHQue§ÊôœS‡„fè½øJ«pÞo”UbÉ´ùä«/2ÁIA ¼/j®æ6óÕfÌ-•Ì, ´œeÇp„áÆíÆÕ^2¨Ø‰‡ˆ5?ëqšI½tþ9$Ñ³Š¢2¨Z¡l]¨T H•²/hÊ¿o8—Òù¹gºr5§+üe+5ÁçüÙ#@}‹óÓ]9í^xʲ8Õç] Ã]Œ¾w¹Ga3~óÀ/”šœmëvX=à Ž}?ÅhߨÂ9ÎŒœ´È |Åb‚|6;Ê-z’¼æéžï‚HOZg8`à (7ˆÁ†ck½æ›ï]pX !Ð\ ‹d Y¾6£œc.åP§&jÒw|á@_\ByÍVã_jûæÉ‰y_qWèïCë¡ ï);«Ž½ÛŒò„4 ‘tôÚÄ„¶)Ã;Tèu®r£w¦³§( ®£fw"®höx׺©;°Çn|>”°ÃÓ¶PˇýjÎÖzýÁ”rþ!È£+Œ­$üE™ Bö‘Q™…­Ê"ôãÇœ/Áò±r=?5M[ô°ÌÏ[€Ì°u¸Âz ÆmÜo<)¶ó=P¿+{’‘OíRzwdîØPÖ6ôV`0ÐhõðlÓã>§¦|êv=£lÁá“xý1‡š[ÚÍ„C9ßšÞ4â¦Å7ɵkù ’ß ÿe¬ˆ¦¯¸Çÿ¤ùâãý×þ{Ôñ¿Ä T0iª_ð‡)¶ˆÌ€ @Ÿ!þêó4Ï©Êendstream endobj 1260 0 obj << /Type /Page /Contents 1261 0 R /Resources 1259 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R /Annots [ 1267 0 R 1268 0 R ] >> endobj 1267 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.8897 207.1951 329.1084 219.2548] /Subtype /Link /A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >> >> endobj 1268 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.6691 179.6723 249.6573 189.0819] /Subtype /Link /A << /S /GoTo /D (rfcs) >> >> endobj 1262 0 obj << /D [1260 0 R /XYZ 56.6929 756.8229 null] >> endobj 1263 0 obj << /D [1260 0 R /XYZ 56.6929 744.8677 null] >> endobj 22 0 obj << /D [1260 0 R /XYZ 56.6929 651.295 null] >> endobj 1264 0 obj << /D [1260 0 R /XYZ 56.6929 612.4036 null] >> endobj 26 0 obj << /D [1260 0 R /XYZ 56.6929 555.4285 null] >> endobj 1265 0 obj << /D [1260 0 R /XYZ 56.6929 530.6703 null] >> endobj 30 0 obj << /D [1260 0 R /XYZ 56.6929 416.0112 null] >> endobj 1266 0 obj << /D [1260 0 R /XYZ 56.6929 391.253 null] >> endobj 34 0 obj << /D [1260 0 R /XYZ 56.6929 164.815 null] >> endobj 1269 0 obj << /D [1260 0 R /XYZ 56.6929 137.4068 null] >> endobj 1259 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1274 0 obj << /Length 3415 /Filter /FlateDecode >> stream xÚ¥ZKsã6¾ûWè¹jÍàAäÑÉÌlf«ÆÉŽ•ÚJ%9Pm±L‰ŠHÙq~ýv£ %Á3›ÚÒ` øÉYa2¡Ë|æÊ<3BšÙj{%fÐ÷Ï+Écn ›é¨ïWß~ÐnVf¥Uv¶x˜ÌUd¢(äl±þuþý·?-Þ¾¾QFÌev}c¬˜¼[|þñÝÏß/>þxw}#¥uØ—sïâ‡÷4üÝŸn?ÞQûîöSï¹_¼ÿDíß„ïîîá!¯_üëêý"r=Ý™Yþãê×ßÅl üוÈtY˜Ù ¼ˆL–¥šm¯r£3“k(íÕýÕ¿ã„“^ÿiJRF™)”KˆJ©”¨L™Y­´Õ˦Ym®o´•óêp-‹y/b¾®Ûú±ê5õ =»aShÄ_Ý®îAz6×óÛ“šnG£÷]³¨«é‰´­OaÒå+OºãE»ê˜/œw9Ù„vE&-aëÈþÝ=}AãWÝaÝÓG';ÏËLçø›†¹ƒ­àØÙM®\–ëÜÎ@+²Òå‡íY¸{O¬x²8Žê:&wgÝ“Ó ¬f~oöTf¹Ð¹ßÓ”°R9È ªÝÊoH‹ùªÛõͺö&æÛ¹œQJ• *–býgµÝ·u¶ê¶ ‰[—•¥Pl›]Õ&Ó9œ¬°§‹ ʸXϤMÅ;Ûu‰å¬Í„ FÙ—´·¤r™ ½úš©Àã§l¢b+åéykçÕWÛq‘´[S£æ9¡9ö[0ƒU½ˆNG ‰ÃÑvœÝ«t\ǼÛx]„ïIº]Û=òŠ4…QñR›¡y®G.Oìé•l°?>>’îƒqÒQ ùµ;‰®Zùó‡ï{jA¦½!åØÌ‰è%½†§ìˆòèÅ¢ ¸ð30ÇxItkÀç dãc ¬A›ß„P«c;¤ì‰Îã‡ãrhÙ‹ݾY%ýö‚½…bþÝÇ»wÔ¢õÀ{Wmë-\‚é7pžáŒñ­ZdåØb‘Ú› v¬k8]jî ÄiÇ)\‡'Á3íiÚôæBox‰mÕ^Ÿóc¥ý÷mõìGƒªÖ«¶:o¤…ãõì›qˆ¿. ¶ÜÙ¼Ãî!åUVDÄóhyÑ~_¯š‡WZÏoÂ+‰ õD"[+îÍ•óÿlêÑYã,„&ODé»-Ï`hŽ.%8r——Å™½¢5–FWÝÓûKÓ¶¤Z$tDôhï½á…N“È>|"°xHA-dðoC­6–·<Ä,–ÿyå{å®þ‰YŸ0™5žÙfÅœóCâ#ªòÌÊ\{TÐî%Óà—Uø—³(ÜÔµ\@®ã?ÇÌ^ PÌÛ#„]‡f¨v0 'o†)¹¿„@`>ȤùÂÊ;\¥9¸À–?>¥è<ÖDóé <=VÁ³­«ž›ø]†¶uˆ~ªSnñ;6chñÁ'"NΫÔrr|ù%À—`*ƒ÷Cþ¢ à|‚s@^WCE-:'IÇdasøPÎq£ 7_\—jŽ~ÂÀ‚'”¯ã8I% ¥këCå" ûsjPi¤LqW/ÝቨUÓ9BO\(ÈûFzµ q¯y~¥—ŽO3LOeIߤjª,!q’áþ¡>Í™å> èŸë~xG ›?»Ýâ[q~ð8€W¦~Þ— îˆçŸ¡£ë_ìy˜0âöÖW.|ÿÒÇK~~nPšVŒ3³œ=·Ôµ¯VOIQÕÂ¥Ñ%¸2çϿ얈`¯LëˆÉçn @ê ¡-Ð×õ?¡ txÕÁ(1Âùãqt0úØÇ‘C×µLm›§:ÂÄ$è’y¦ sÔæ1eME&Á$£1â¼äc w,°¬’C¼WJˆãV[î<<ΨñyZ­ ão¦\Vk.çEîëÕ -4¤_gª1Rg:“ÙEyJj•A¤_Ìr“ãB.YOŠ£n¦Ã.9¼œe$³„¸ÁfÊg–’U þ%¢30Jø¼õŒŸ|•“ON|—)þpî8' ‚Ý/›:ú°€KHa ´WÝþ•º}¤ã\fè‰AÒQp‹}èQ\½ ˜Ðc„Æ]bŽÇ]DMÛ³¸>Å}'€»}K,à¿Kˆ´CâA;w¹ÏcJ*²©Ò½ÿ•à3ÍS©³ÂÊKçé’Êl,T`À„‰À5,õ ñ,…¸Hs (5Û®ò¥.^ÚóÙz¡¼‡8àlD®}°EsÀÜD ‘’ëuCu0h/Y€ÒØ,Ïeyj.›ã¶ò£I(ðÜ“jlª=w<Ö;ðQ\YÓóm½ÚT»¸+ L؃7fg¤X›ShFN¡«ˆ>à32o45³™Qxê5½ã¼‚'Ó‚P)¼<`È$­ÍOËF¾Àí'K´Édî‚fuÉ S‚Θ0g0©/ΚËÌHm¢þð‘•€¼ÂœºÍˆoÒ1C ¾ªz  „Ùt/õDוdå’fd>‰²òôW"RZ*)Ööµ…pHãAQc€æ‹@!óòX:«¬>'NybÏúF†Ø=¤¥«òXÈ^¿B<جH¼Ç=ÀQJ¼à>LYÆCÛ×ì2“ í\VäNÎ' ­¤ï) ÿ[!3A³ŠVg"¼ã+¿¥³ÒÊLˆ<¤”^$@ Ä¢' È!/zq®ÍO»îeÇzªh$…ÉT鯙ÖiÌ5œN ßyM ¶|üßùò„R!èyìØ5Âiq^·f@ÔÚNGûºI©ž¸9=C@®ˆB ·o¾Àbº¦úž&\Õ=¯d‚Ó÷aŠKѨðÀæ@pðQ}ÿtNÎÅærtÆ–çÎB‡BÎÅNY/…@J9V_•=õ‰aaéspÓ ß±P­×„Û.„ºÎEç_1KŠœÍÆû˜™;>¹(†t}ß,=¶8®(£ÃÒ ¯†ñ±Ëë4>¤QwIpÎEÌ_ÂÍg%§*£•Æ„Ê_MqPÕ }Ýr& Y<7ú“9¦èí73™þ¸äu›ÂÎk‚ôR0#Rø¢¾d¶Ãæo"ÌÏ}(D˜1Ž‚7ÃGŒÔÑozu@f’fùþ%L"zª¢C‡¯OÁÓ'#Æ]^Ⴢ"›âä>1°‚×§Z#<öuœ3qÞ——„ÊùK»¡Žgj)-\fT«ëãýl½d¼zñÙø4Ãäð@Ù“du2`ÜŸ¯+Žæ•ûJ>kGAûÁdMjù˜–º±!µÈœ«jrÃX5:yh“®£}XöÛö !¯u2T ‡nOƒ[ˆ+’e–% * ÜUµ¯ÿLß?˜MdoCh P[Éíü_[9®´¬ö¢"Ò(XÜø.1Ñ7Ü ›»¡}ùW_”繪‘´­Ê\nÌùµ ÝSOL_(”bP¦ ×ÔSðL° ásÔLL‚ÑÖp…°Yž¹ ûê¸ß¸`ñ¥§Q ¡Ï9u/gæ· ï{ŽÙb‘çâ¢>J˜êùÔðbNÖnÓ£ŒG€Cm}¹÷3 %0ŠÿzH8ج –þvA•c«ÇøÀ†û,¤ÆAg€hCõoœ€}¼ew8ýš*çÐð‡#çô/œÿn1]/‚0Péú\í8 °ef´>+sŒBOD‡+^ .ùRéØ{.¿$=ÕõÞFñ«ˆ š‰?½Ž7]áVý:.½¯k¾Y;î©«ZQåoÀ:®Ä¢jè„Ëð+R7`Áór%Õ;ßÑÜDÔà3%<Í«çªi«eHùâ„ mÏ&Áªa7^d5UËuıJ/$ÚôúÕ”S¼|0DÊÞúëä˜ø§DaJÄÿÿý·ªñße¹ËtQ¨t…K‹/‚#Sxú¢þ~uÉùœ”'Cendstream endobj 1273 0 obj << /Type /Page /Contents 1274 0 R /Resources 1272 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R /Annots [ 1277 0 R 1278 0 R ] >> endobj 1277 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 463.1122 539.579 475.1718] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj 1278 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 451.8246 133.308 463.2167] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj 1275 0 obj << /D [1273 0 R /XYZ 85.0394 794.5015 null] >> endobj 38 0 obj << /D [1273 0 R /XYZ 85.0394 570.5252 null] >> endobj 1276 0 obj << /D [1273 0 R /XYZ 85.0394 541.3751 null] >> endobj 42 0 obj << /D [1273 0 R /XYZ 85.0394 434.1868 null] >> endobj 1279 0 obj << /D [1273 0 R /XYZ 85.0394 406.5769 null] >> endobj 46 0 obj << /D [1273 0 R /XYZ 85.0394 301.1559 null] >> endobj 1280 0 obj << /D [1273 0 R /XYZ 85.0394 276.6843 null] >> endobj 50 0 obj << /D [1273 0 R /XYZ 85.0394 200.1512 null] >> endobj 1281 0 obj << /D [1273 0 R /XYZ 85.0394 175.6796 null] >> endobj 1272 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1285 0 obj << /Length 2457 /Filter /FlateDecode >> stream xڥ˒ã¶ñ>_¡[4Ušø¬œÖÞuv\ÞÙdG9¤¼>@$4b-²Ž¢|}ºÑ ’’8Ž«R:°Ñh~7$V!üÄ*N‚$—ù*Í£ E¼*š»põs»Lóà‰æT?lî¾ÿI¥«<È™¬6»Ù^Yf™XmÊ_×"ˆ‚{Ø!\o>~¸q¸~ÿùÓ»Ç'‚ŸÞ}bìó¿ž7>ü5ŒÃ÷OÏð÷B$i¸þñ㻿o>|¡yÁ[>>m¾|~ÿÏ7ŸŸîÛü|÷a3r=¿™²üûݯ¿…«.øó]¨<‹W'„Ès¹jî¢Xq¤”ÇÔwÏwÿ7œÍº¥‹’a U"D%å’¨âžiÐèÞ™ƒ{s|õpe{Sïîé«™Ì]Ûý¦ëvÖ0ÄÀÎ (™•Ž7t „ßø«”Ѿ*KX Šé€ƒ<Ž¥»*³D@žD×—ýª8Zn M=»ùKb€ãðv)!i2F¹1†D¨Id€E6[³5ûª- § …ЭOº®—n¤ÝŠØ©†ÕôÐêmͰYŒšnš¡­ my¢¬hIaë3aN•SNìU@7ؾ*ypêŽu C`ab5r´CþT&£ÆàLa¾¤ ¸á { nx¯g§þž7››+ì%£ DäöÚ8V²ˆ-¢ïj2ÀÔÕö¨•éixpÝ+ð[f{¦oÓõ– î`PsŽögÐHãÖÇkÍ"t,©|Æ’L³@dÀeèXêí°½åié.qDR ^÷,ÊÕº1º9°{m=d˜]=êmg <(¥‚$ŒÔ¥)úÀºêvô…K‚A4tÈdŽ`Ñ”ƒ â0^a˜ š%Y˜žÍ~{7jÀ½_Í5^×߯Ӯ §»+>ô`÷ݱz¸4n âôóŠtiLAâ^¬=:)Hã±Å R¢$3áE–ú[¸ó`™»|5MÖ]¡k´d€€ã`é(7FîÍ|ÆÜ*Þh(Ìëe7•Ùòœ³Š ®%~êŽ'},Q6ÿ³nøðJ&’PÌMfR…ˆÉ,§ë²sn‰óeÀ ·B•AER2Ë0`¡&X]jcyt%Ž S‰Œ™BæSF[ÐÆg¥@|º]ªJ°óI£)¾¢l–RHE„cñÒáÍqW4qüb‘I {ʇ=@ü>*¯p@• B3¶œœî!k÷»3 vd’ mäbÝìÃ/î×ññ°–±¼%+ NI.5$BBš\ ¬9ÈÂßM%n×újv¡ƒ˜•ú;ÓŠ(„ÊÕ¥d£¤Y™Ž™È² RBúÈ“ùÈãc˜#p!-#ºÖ1é)º9=qáü’f»LRŠPdˆ¼ž/"2 F G; }Ôt(é µÂZÙÑ÷ô5ÿÞë¡·~Ïžn—ª7Ýö'§Ìˆ*Tú®Ú»è4gö× º‰e4¾ó¡ÂRèLsßq‚º+Ä»PeG²Â#Q¿§)2ê(ôÆœÏÊ<Ò2 _ªW¿y_ÙÅÜíÌ5‘˜r¡…(,.k]ÄP0T‰òÕƒô±—Pq!§éGܱ5<ÍlbM¥Ø¦;Z S¦…€Äüœºã2±öŠ 41ÑÍ–,÷úBäí]¨u›«˜úDOâ‚ÙLë–3žatÙ±º÷5vxnïH‘šªmÝóìAߌå³ìž¢Çð²÷CdÔ“õ±0¤RsA„$ÏW¬DŒ‘ß!]ÆZ7]2}e1¼¨„ë1Üi$žo1ž-Û¯N›$†hj¿F&zÂRå§Þ*'MÍ{ˆá`æ[?ס'œUo›rj¸ÂúuquðÏ _ºÚüé®= ×?<>½'È·^³î' Y܈¬8H·† 8hÁ;ÑÍpÒEë”’ÒÙÛÀT©áßÿ?J1BŽ- LÖúÕ\-à´s³¢]¬£¦„ÁÝÚìYË¥‹œ?NóNolÆ.Ðúzö[£«öcw2Sæ‹$ôÉÜzä\ò«NÚÖž†ÎÝaž[oßeãi!ä¶*x@NKø®ß_÷Vo-ó§”k9ÖÝËß3\vÐG(%ñ"BRi‘qêHs_é#J—¯ºµú „0.¤Ø¿e`·7 A]{yÑz}àLãîe\¬Ísk³ð‚ÂyúRìlýSÃìÑÉÙhr-àù«C2I Ñh6Ë•](!•7ºØñÁ½ÐlÇAšå©¯òÜ%Ø á(v³d”"¹nO“›î&˪ÇÍ…)RA)³Ëx;5äT´)òKL¥·U]Ù3!É”ÐPñDSƒöCXG¹ËéAɸÖÈ|)ÅãVWö (çWt ŸçüùêhÒB:[ÐîuùžG3½åŠ2I>½+ŠÝ•ðN¯Kue ÍŒ€Îö¢~K¡@œ&¡ZR(œÁ­ M­  ZãŠÜƒ[æž.ÇñS!L%:P–ô˜¥Hé!”·i"®"!G­š¼ü…3Ãø(M¶æÒ?/ÕºðõwÕNïÉzê-çÕÃÿ­@úÂ?Dþ ÇD÷ÿï2ýý¥Ê2¹ü—ŠÌ OÕÈŠ%ºaÜÿ?sËùy;:»endstream endobj 1284 0 obj << /Type /Page /Contents 1285 0 R /Resources 1283 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R >> endobj 1286 0 obj << /D [1284 0 R /XYZ 56.6929 794.5015 null] >> endobj 54 0 obj << /D [1284 0 R /XYZ 56.6929 717.7272 null] >> endobj 1287 0 obj << /D [1284 0 R /XYZ 56.6929 690.4227 null] >> endobj 58 0 obj << /D [1284 0 R /XYZ 56.6929 550.0786 null] >> endobj 1288 0 obj << /D [1284 0 R /XYZ 56.6929 525.2967 null] >> endobj 62 0 obj << /D [1284 0 R /XYZ 56.6929 393.0502 null] >> endobj 1289 0 obj << /D [1284 0 R /XYZ 56.6929 363.1913 null] >> endobj 1283 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1292 0 obj << /Length 2097 /Filter /FlateDecode >> stream xÚ•XK“Û6¾ûWèÈ©qù~ÇÙõV­k+ž=Å9`DHD  J–}ºÑ œ‘SÞÒÐhôóƒâ]¿xWåa”ÖÙ®¬³0â|wèßE»Ìýó]Ìk²< ó,MapgvŸ§U˜WI¹Û¯…üüôî¿&ñ.‰Â¢HòÝÓÑŸU”eXäeµ{j~Þ·âläô°Oò(Hþxú7m˲*cÜÁeem7üüñÓ/´ú7©Çy:H7úsV“ìå`´gaš ‹)P:6 ã‡}EQð/15W1±”é­”dW‡u‘,$Â<ÏS+å—OŸa[‘­˜â*@AøEaE-Bâ@Ód+.’6›I4ʨq]w#Ö³”Q°Û°¸~l¤6áÃ>ÍÊà×q¢½x“´EéGäå–ÓEN|¤i…ÁKá5â8¬ó<±×`Uàú|.Pg9h#ŽG¼Â‘G{Ÿ±§‘8åö7³¹µÈ<Ëé8N½“$š^Mâ¹ãuBÓ—L kzEë0‰jòÚS 2Ó(ÅÕŸ?¼'ú(…™Éš8 ¬ýR¨ UÓ§7"Îtƒ ‹3#}ŸyÌFGòýÿG„ šÄmiÇ«=Ê,S§qh2ZÙ'1¨oä >ã;ÆïÅ‹5T´R\nDΚy㑾¦…È‘Ž»½2rì͸*Ýò–‘¾PA5”bEÐQ„žÜXß´‘½•’ÇqrÇù³ÄùÜ©Ýc/©| hWü(½½Ylovœ;çå~îŒ2-©,Ù<²÷»n¼ªáÄqˆšêØ|>þA콃ÔzäʱºFä®m3‚XÖ –¤ IeÂïTŒ Zš\2.6&¾SsîV‹ŒJn‹ëè^]Ð4c5G‚LŒTÍ{Äp’¼È§ŽTVûC'4‹èÅ¡Uƒ|-ÓÊhMË4`šÑßF¿é ®gCƒƒ•wz¼çab\rc:OJK§ rM’¨ Ô‘¸·q&Â&TC´´ò¬“a«ìonƒèQYdÏçFÉk„“âªÒZ¨xm¯öx/ù¼UllÑY6HÆYƒX½ ¾?g9)©}Ys 2¬ù±J9‚þ#ûqºýA”.%0©³ w"j*xÈ3n’Š(Ñ­-±5U9d<ó"_ hZã|jY/ýE‰áÝN6“dy 8xp]7b~{é0h”~’e±½„3×rÓ,Ã,*r¸2Ư{ë³½ŸØøÎê±×꛼cµ¬Ë"-XÔx¦J’VP¶ØW¶Ö6DÙ6ßNõÊ0«åU¢ç™¶¿À×¹`+åùöj«U ^–@Á³"ÊÍ—üŠÍVzÙtg¾ÀæÊT/šù@1[ÔÞ%t\Ôy§ðÈAvݬipûqA)µ15âë/túK=ð~jVÐ$Žclv ô<›Í0/ü<‰†dà¢ÍÊùC¿Dy„W{÷áÉcÇÐa…0)á–qU!r¤Éé´#â·5Ôtë÷ë 5×Þ+­÷Y|@åaµ5-k]–A8,¸z­mœ%ËE’ç܃Ã~Õ~½ì­Žo¥¡`¥˜ÔPÖ…¤%€%j˜eøÛÌ)ÔpË%qÄßfG™‡e—¯²OµÙÇÚ" ŠkäØšÎ$©&”Kv Ó#øúUrvXÓ'QFê­õŸ-„Y ¢ZyhAéÞÂÝ,øhhµ Ìk±NãØóƒF¼´ùåA¨ÔjZàêæD¡›G>>V›£ÐfËÕ·;¡ËìþÏýqy»àðÃpQÓ8Ø÷(Ík=ËöÑ™–EPõâµ²Ú<‘JD…B¸t>I³Øæ¸»2®ËZÐudn±3ã…ÆÂ¾tš'ÿ¨ÂõÍã<=í€xfQXrÂ{î%URŸ›¬cPwMß%2¨vŠÐ9ÎQ °ÄÂ~ûNbÌ‘œÁ*Î#²­œ.ø„›XbI"èÓ 5ÜÛå™I•ƒz âþî^̲EÑÅk˜èPÄÍ w®@íÄÿýu¼J×b´ûWdÓ3Ò%©p °{ÙÈb6îׄZáÿ$áÖÑ\Ä`ÄI®ÿÔÁÿ»^l¤ÿsnŽ ¤Eþß…ûìq[ÙÚ«Çž¯çƒ/©K4à ÝTnX®¦Uà¿!„¯¤û#P(þ­zEº%ûeÍ[™Fu˜&‘„×Ëß`l÷÷ìÛÓþ sèêendstream endobj 1291 0 obj << /Type /Page /Contents 1292 0 R /Resources 1290 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1246 0 R /Annots [ 1298 0 R 1299 0 R ] >> endobj 1298 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 268.1131 539.579 280.1727] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj 1299 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 256.1579 143.5361 268.2175] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj 1293 0 obj << /D [1291 0 R /XYZ 85.0394 794.5015 null] >> endobj 66 0 obj << /D [1291 0 R /XYZ 85.0394 769.5949 null] >> endobj 1294 0 obj << /D [1291 0 R /XYZ 85.0394 574.3444 null] >> endobj 70 0 obj << /D [1291 0 R /XYZ 85.0394 574.3444 null] >> endobj 1295 0 obj << /D [1291 0 R /XYZ 85.0394 540.5052 null] >> endobj 74 0 obj << /D [1291 0 R /XYZ 85.0394 447.7637 null] >> endobj 1296 0 obj << /D [1291 0 R /XYZ 85.0394 410.3389 null] >> endobj 78 0 obj << /D [1291 0 R /XYZ 85.0394 348.7624 null] >> endobj 1297 0 obj << /D [1291 0 R /XYZ 85.0394 311.223 null] >> endobj 82 0 obj << /D [1291 0 R /XYZ 85.0394 189.9853 null] >> endobj 1300 0 obj << /D [1291 0 R /XYZ 85.0394 156.0037 null] >> endobj 1290 0 obj << /Font << /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1304 0 obj << /Length 591 /Filter /FlateDecode >> stream xÚ¥TKs›0¾ó+t3AÕtt’:3Nƒû˜4Ç()SŒ\ÀIóï+!°Iâž: ³«}|ì~Ú…lx„"I%ˆeˆ8&¬7OÆwé‘>&‚‚qÔiæ}º`1HF4ÙãK ,Y~)âÈ7¦Ëùüfá³fɹPŽáÍç°¨rýb (aªêg[Õ)ÆÌipo'F%ì`û€ñmþ.ëKÑ´+3zT†ðB×C„“»mÐê _µÊKì4Ë‚•Íèòìѵ}ò¶'·+RîJÛŸjéÉù¬ïÓ²·Õ»ÀVoRªgU:5/: ÕºÕõ«3uEó»$hô®ËZ«¤iëâa׺BÿÚ*Æ‘]…#;`ÞþÒþ{ã¿¡0FLzX¦ñÐS‘ŒÙ¾(Klô¡ða3?VþP%6endstream endobj 1303 0 obj << /Type /Page /Contents 1304 0 R /Resources 1302 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1307 0 R >> endobj 1305 0 obj << /D [1303 0 R /XYZ 56.6929 794.5015 null] >> endobj 86 0 obj << /D [1303 0 R /XYZ 56.6929 769.5949 null] >> endobj 1306 0 obj << /D [1303 0 R /XYZ 56.6929 744.7247 null] >> endobj 1302 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1310 0 obj << /Length 1159 /Filter /FlateDecode >> stream xÚÍWÉŽã6½÷W}’ˆæ¢}êt$‡ @ Ì!“-Ó–0²èH”NO‘EÊ›2sÈ%ðA\ŠU¯^-¤Ù‚Â-Š”PQ&‹¼LHJYº¨Ot±‡½ïŸ˜—IRAÒD˜ÌìÆ©(HZð|_+ùzý´ú޳§$ËxºXï&[YXoÞjy4ª_Æ<¥‘Xþ¶þ%$/rfQ0‘V 'ÿ“<(þEõ§pðMw)åû±—¦ÑWÃ%)3žy-#4Ï§æ‡æ,2u3ت ,Ÿ~ý’‘>5[…Rƒ>ø­aÜïÕ`Ô§Õ-¯T¶ºÛ{•©q´A]ÛtÊ ítÀ¨ÆÇA‘e,r}X–<ºØŒ­oÖÆH™¦Üyc ¯’ƒîä¦õDd;:[i°ƒJõF6NôÑ±æÆƒ2¦éö™bÁ"’Œ{F2Z2gW¶Œ¥ y8{o÷TLŠd§H0Â3Ÿ hRõêµÈª±îÚw\yýl”yj“ yY×p@d)¸Ý¶úÜØXØéh—,jýî]ìpÑæ…ýÊ£O‚cßHôÁiˤðJnðÚ•Îáuö|ªŠ,ÁØE16^¾jÕ™a.ÀM©ÙÉÓ42Ú~g9µðû£Fè3O¢×ÖKþ>ª¾±±·“úqÀ™ÍàÒÚj ¦ÝŽÄ$ Žwv‹¢ã€4Z@oˆí%"-Á ]Zæc ä}&`iAŠ<^óÐe$ç„'Œ&0å^[Ç„iN xfŒE_aNX0˜ÀSš¨¿S•/ŽJí‡/bƒ¦Nʯzßœ–±1—²éLœ¥åK­ˆÆV…BIØm JxI1|«ÄR{}Ö8!S8ÆM§,ývrö‹çf¨qdü)G%§ÀÚÉ®×r›6H–¬Ú‹½‹…¿ðÃJNXV„ÐO^nóëÅ¿_æ’£5é´¼$E‘—·rÁûºÿäøµ“mÓC\4&Å=î˦“}^)S­l9m7Ï.HÉhòd×.¿oýˆï`¢Ñy'øŸ{ ¸@েÌé¿v€F1yçŠÜ…®öÛ­ÖǬ>}ΆÜn{5xB‡ÀÍô§î¼Þg'²MÛóDöGùüŘ˜÷ã„.±~Ö÷]Ó+­®d[ëÁpúùeS§M³óôwzži~ÅôÌ•@2BIOWW‚¿›^GSë Ó–ÿ¼\g¥» ÜEÕýx€ ¾qÂôrœº=ȘZ\ ö\FØÿxd²ó‘ód¦·$4%9‡‹{¦úÃ9šfؼ!¼‚¦ÿH ËI)xáõ8kØ;ߥo…­<©»çÃ¥ÛŽ›­>L/‰ÁÌ ²”Š,`îö$àžÇV”ðlרæÚ,˜Lá5]Ö·[öhLs&¾Ñ¡0ÌC/—U5U}hõö5¡æ^uº…®û]}á¦×=}»ž^êáý-Rb_ósoù _dð!AK"8YXù½±é_Á£µa,Dqendstream endobj 1309 0 obj << /Type /Page /Contents 1310 0 R /Resources 1308 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1307 0 R >> endobj 1311 0 obj << /D [1309 0 R /XYZ 85.0394 794.5015 null] >> endobj 90 0 obj << /D [1309 0 R /XYZ 85.0394 769.5949 null] >> endobj 1312 0 obj << /D [1309 0 R /XYZ 85.0394 575.896 null] >> endobj 94 0 obj << /D [1309 0 R /XYZ 85.0394 529.2011 null] >> endobj 1313 0 obj << /D [1309 0 R /XYZ 85.0394 492.9468 null] >> endobj 98 0 obj << /D [1309 0 R /XYZ 85.0394 492.9468 null] >> endobj 1314 0 obj << /D [1309 0 R /XYZ 85.0394 466.0581 null] >> endobj 102 0 obj << /D [1309 0 R /XYZ 85.0394 201.2466 null] >> endobj 1315 0 obj << /D [1309 0 R /XYZ 85.0394 170.5419 null] >> endobj 1308 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1318 0 obj << /Length 1768 /Filter /FlateDecode >> stream xÚÍXYSãF~÷¯Pñ$WáaáÉ Ë†kˆqB¥6û ¤1V­,y%ÇIå¿§ç’d#›JJsõôñMOwˆ…á#–ë!/¤¡å‡r1q­x9ÀÖ¬}M32D£.Õ»Ùàä‚ùVˆBzÖlÞá Äš%Ÿl†(l_]χ#êbûÝøj<9»œ|Žq©oŸ}?¾™½ŸªU¦é'ãïÕÌ-,¹®ý³¡8»ž\\~øi:úŽ=»¼ž ?Ï~¼Ÿ5w­"˜ u¿>}ÆVÆý0Àˆ…km`€ Cj-ŽËë0ff²ÁíàdžagUníE‰`D™G{`rH¦ÀCn€ËwCä1Ê$L''ч±=[¤•ê™¶^pÕIøêaÅËÇ4æ»üÔakÊ"7ì”Ô Qøá®ðV%ÊP(Ž©«ÒMWƒÈ(òÈËJÏ-£Õ*ÍÔ`^”{heE±ºâ/Ï™%IÉ+3¡>Â𑾿¹æ{$i€6ÍGb?ŠÊUtdP[÷ŒUÈÔÛU£wUó²÷8æif¤dEe‹¢ª}ÔK ‡•ηÏ#MöîCá΀\ò= •ªí©›~ƒ6ÿ-Z®2ŽâbùjÊ·«Ã%÷GÏZ{y³sö\Ÿ~1×ffQ×ÏÁÝ4¹¸a<Ñ}Îo$Ôe”Wsþ:ˆÔÍÝÝÒ‹Œ"'!EÄ „5ç´O Cà"—½âò½t3ûì{â/Ñèö%@ßà0»ÔG/BÓ:T¤×„®ÏìòG÷_¾Éov½fß´C·§‡¿¢ªvÂvç”énü~î~Ÿ\Pb1rääRDIhò0d[ ¬®Š(Ñy8Ê¢<ATm§,%Âr€ ¼t×ìØe526¨CP@¨Ó”©; `;³¨ã‚D&àñÑ0bÏfW£|Ï>»ߊ»êøÔžýr5»C¨gOyU¬%þ±¾/ÓÆWÔXÜÑé´½açQí€@Àó°kieÝn¿@š„PnþŠøìúì@åo e 9S˜n6xïøÔ±!Î %̾œÀ”CePò0%Í-> OGðÿ%Áž~xˆ ïFL0† ÒœÄÇ â죂Û`v•޼·E…¼%*ØE¡ã¿ ¡¦cÞ+Aa‡AiŽ&í«ø¿Ž‹ÐÀˆ¬w dÝçù“g:õ¡° ˜8I wÝöÇ?ób |HÜï\*“Iv‹LÖ»bF¼ÂS‘…Å@ ¢IG<\Û-MÚ„ÄÌ<Ï~w99Wë:ëÊ¢ŽjÞ0Yjé"qwä¯ 3!“£¢mõÙ΢z0«=9ðIF§~(K3ÑFªI ŒUñZÄy-*¨ŠÔ¥M)~Ë ö¥Þ,Õ]i–÷Å£¬Ž¿ÍübAa zð2JŠe¶Õ#¥ —hg¢_ãF¨Q®Tº’ã¾Ç=ÖÿŸNUÛŒuKô¼*šº º?ºÁöGx¶«™Ö&h› ·®tFT ÊTˆiivíÚÔ«×eΓ=5’´Š£.mÃU;GÝ©ÔE^à9"–JØCàxy¥™Zÿqdkà“µ› jÝ Na>¤¯xÁã/jY»—|‘´7ŠÂ-Ý M¤³•PQŽŠ2Q£ýëq€:ަ­Ö÷£J\„¥r8.ù ¬ "~AªíŪNAÕ1̃`àùFŒ!Mr¡äå‡~-zP©Ä¢VÊKu¦}?N[êÃFÓ=¦SYl‹3¼îb¿§ ”Cˆ¹Ê[öOÂ]Có¬ûœ„èéÌEc½â°õbz|í/×<ÇG,„i¸Ï(ôY«•P=x¢ºù7Û£û_`#~›endstream endobj 1317 0 obj << /Type /Page /Contents 1318 0 R /Resources 1316 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1307 0 R /Annots [ 1323 0 R ] >> endobj 1323 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 61.5153 126.3509 73.5749] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj 1319 0 obj << /D [1317 0 R /XYZ 56.6929 794.5015 null] >> endobj 106 0 obj << /D [1317 0 R /XYZ 56.6929 372.6686 null] >> endobj 1320 0 obj << /D [1317 0 R /XYZ 56.6929 334.1957 null] >> endobj 1321 0 obj << /D [1317 0 R /XYZ 56.6929 266.1213 null] >> endobj 1322 0 obj << /D [1317 0 R /XYZ 56.6929 254.1661 null] >> endobj 1316 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1327 0 obj << /Length 2693 /Filter /FlateDecode >> stream xÚÕZK“Û¸¾Ï¯Ð%NÅDˆ9­×·*öÆ–³ÇUáˆÄ¬DjEjÆ“ÊO @$Žìò)5`³»ÑÏÀÐEt‘K’ðB,²B™P¹Xío’ÅÞýtC-Mìˆâ!ÕË›?¿æÙ¢ EÊÒÅr=à•“$ÏébY}Š^üõù/ËWïoc&“ˆ“ÛX¦Iôöùß^áÌx%eôGñâÝÛ×o~úøþùm&¢å›wooã,)|yýÛw¿¼:÷áöóòç›WK¿ŠáJiÂõ~¿ùô9YT°àŸo‹\.à!!´(Øb#$'Rpîfv7nþîÞšOC–“<'2gYÀtŒ.¨ \¤ld;YS)í`Ñ·1MXt¹WvÑêx¯ŽvÁu,ûºm:½XdII!¥a™,bN å™gF¨e·¼¥”Fm»ëѺµ?vV̯·<‹ê~‹OýÖN‡õxYª}ÛXØ "@&‰HÒ¨°ÜÖ 'EÔ©•Ö*Õ­Žõ2ïrxŒË¾«›ªîªéÊ»²äu¹iÚ®¯WÏ`‚ñ¨¬öuSw½¶Å½%*›  XݷǺÙàs«64÷e½3|As­«7èÚ·“¥w]¯ö8Ht–ó&\µM¼¥yÔîvFªù@«£•º;m6~Þso¼a»a+cXâ½;²,‡8Îr~v®wïKo!d3p÷¼2ë"F ’Hª£ZÓTõ&À‚¹<·4Ï\Éó¬°[Ð/Ä¥ <͘ç3Aõ.Ù1X?Ë…%mº]Ûþv:x )E3Kx@çlŽå^G?Ï£ÒÌhósŠÝgWí~nƒð¤Â‘MŠ.‡9 ;ÁwøôûIÑÃðdË ëØÎxbe¤` G˜ÿѺ¾^k­Ö.êÆ†Gÿ¸S“ jOýáÔû8Ü—=¹¨~ xJ²ÌÁÀI’†ë¼%ЇT®X]ÖyO5Š¡Ì>É9{Z¦# ÈÅEá• 9º4é“dQÕîKc!¨uƒ60õE¿Ü ÇÆ”ðüÏD&¡ ‚@´ñoˆràD‘§.lZxï4Úëø6#ítÐÆx (Ðk0vØ©ÞÒ·kÏ ³S6 ÍØ„t@V¤ÑËx[v6–$hžðtRÁZ]ç(¨ö/·± ,êj-ç릇B»rE qdBÌ•øÜA<»ÏL|›Š¢ë/®ÖÒè®ìWÛ)«‡mí&Õµ:õXç©cìØWTU®¶ã$(ñgWw6êõLñ´½C? gKÙ(m>N“èùîò}{À6ŠÜ}=Ы•êºúÎ%݃i?©ßçja¥]f €"–C6ˆŒP‘ñMIÁS ãPªØ01äq™Ÿ4±HÏ’´5?våFÍêÄ%¡¹ߥӀ‡ÑIurT.Åâ¢ìÓ˜j’>Ê<•Ò¦šm‹†lÄ™§„AÚZ²ÏF.¨l^c©¸d$(ÉwŒ>IRdYj LôÄýãAxŠË2™{¥p•!Ý  p–x®veט¦’d’‹ Ó?¸2N q‡\1Äl3J2>²ŸÆ¦ãòS|ݸõf^PØ(¸ª¿Î-ÕôW]ö9P¯¡6n`.¦9”÷"4HÕSwrå•FœV¾°:E’ªÏ‹§;EF.|jWuúò75)º_ÄFŸàñ‘î&kôg?Œ ¢ë€®°ahža5€Cö¯]ÙÝ·Ã:8îªCô1[ŒÏøzX"»)xÁÒûÌðq.MÂôÊ”~‹åA&r<@œÅEÐÓ Ë`/ö$.RÍã"O5ĹC¡ºh¦(}Zª§ ˆe“ÒÊ5°ÉòT°§18ƒ‚øŠzèR÷ÛÊHí€:ê[ýGu8eÒ¦^y‹™´m“D0ef «tNdô£%®Ôº<ízí|³ßÄYØBA\÷~u§ú¥|µEXÓX[ü#`ž&l\­|€½Ñ0§Q½ÛºUÖ]§\ÐÝ9ð\÷nC|j̵´K×áëâèÎF¨úÒ«¦RVÊÃåfyXD†¡> DƒŒ~Wò˜‡žê*4àEJ( ‡è×ê4ä1 <•Mlqù¢Ú5ÇnùpïzF¼ u"yŸ ×çº(+`:mBñÛ«¤©Ú~–ŸßÖz†ýU†3ÐaÜû<¿_¯ó«÷ v‚_Ñ&-Ë÷–Ðùs’LŒ“é¨úc­º¯ç½¿ªîzWnBˇ¢—ålÊOøQ‚x# £cÇl»„“¬ðܯb¼ocàÁ ° ‡åþßv×ùöKð_×^9ø>KRñt{RÍ·WO5=öµXFO2ö´dOuE4åv-¹œ—}yäøÐ9ézÌ2Ž[r=p[r.³ñ6\¿DçÁ i›xðV÷ÎÜö³!=îµÍ—»]ûàdmí$´¡#öÉ´ ”3ß'éù 3Ë4H„¶n6Äðd­`ds€F>ã¶<ËÎ1 ïLØÂ\yך^ Ã{˜.u{²ßéh²C»ÀÔ‚V;‹|S¯ÐákÇ©glÀ„IÏ4px€P˜aúp+ÈdÑÛ±Y‘ÐhÍQÌ€Ý*áY0÷ÁÔ¿OÙvÏý.sÙÇ#Lq°,ÓHÙÙI²3wÒþ -ÅBÌ#¬? #XN‰,èwµì!yᩮ±—ò”~—Nó0ÂSRÔ6,‡„h'”ÍíÉ'úZæ\ã¾×µ;…ïžsB—èÿE9±‡©ó9Ü ŒÊ´w‡qjç…‹J™¨„_¥ILXU8ñ°5ظH \à ž_mNzÓÜ §,« °op¨B1€óÂq|°Ñœç - ·±02(¸0 ·2Ç ÈÅxõ*¦kÁ ;b\F:ÌÁ¤/pGÊìéóÉ¥ñ7Þ“†>ïÏê‡]ùè¸Cø½Úø«‰CyìÇWþÔ5ôQá—Ee‚!°JÂ}jŸiæ¶¥q)PÅ«­Zý!¸¾@Û@ p¬xJ´§¹=vrB þ²¡ðÙ£,ˆ†— N8çŒd¬`—·Àvÿ¤?í.îü›¾ü2õÃ%0'üµµQ†Ìè‘2ÂÒTúÄ„íû&·×ˆã> endobj 1328 0 obj << /D [1326 0 R /XYZ 85.0394 794.5015 null] >> endobj 110 0 obj << /D [1326 0 R /XYZ 85.0394 769.5949 null] >> endobj 1329 0 obj << /D [1326 0 R /XYZ 85.0394 744.949 null] >> endobj 114 0 obj << /D [1326 0 R /XYZ 85.0394 744.949 null] >> endobj 1330 0 obj << /D [1326 0 R /XYZ 85.0394 721.0357 null] >> endobj 118 0 obj << /D [1326 0 R /XYZ 85.0394 672.3079 null] >> endobj 1282 0 obj << /D [1326 0 R /XYZ 85.0394 647.0603 null] >> endobj 122 0 obj << /D [1326 0 R /XYZ 85.0394 136.5325 null] >> endobj 1334 0 obj << /D [1326 0 R /XYZ 85.0394 113.5963 null] >> endobj 1325 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1337 0 obj << /Length 4102 /Filter /FlateDecode >> stream xÚÝ[Ýsã¶÷_¡ÉK噃oÍS’^®n§I{ç$“¦™-ÑséˆÔ¹n§ÿ{Xüh9½éKÇÁåb¹Øß.hº ðGReÊ0³ÈÈ$¡r±>\‘Åî½¹¢žfˆVCª/n¯>ýŠç “ÅÔâö~ÀKgDkº¸Ýü¸äÏ®Y~ýùŸ^_¯˜$Ëw¯ß^K¹ü~Üõ7~ýöóë\,oo¾ùúÝõ*'F,¿üýç¾ —y|ùÍ×_ݼù¶çsýÓí®^߯·¾)%ܾÂ/W?þDxá?\‘Œ-pA2j [®„䙜‡™ýÕ»«¿D†ƒ»îÑ”æ„$™”B.V\dÖOQQ•®$ŒS,r›ji2ÅÊgt |M3iŒ\D*«üoÛb[ž)4͹È3•çôcD°p"‰¤HÊŠT‡r³ZïÊõûuSß_¯!ËW?øçOaÜY‰?ýJò/ª(hYhÀrÙTÇrÝ5Ç'$-+E¦˜¤ž2pMñÌá%Y`y_íK+\‚#ȯQ‘ãT¡4Ë)U‹2ixÚ‡<ÑjHu¾ÑJÕDgÿlê³ ¥\ƒ¢¥x^€H•€ µ"À¬s•E¸ÝyÅŒ¤¥&£*7^1 1'¼µ€MäakŽ×T/›í±8 »G[øs(Ú®<âøo„°}‰ãûÆO¶OuWüÃ?So<£¦n+x°^?]SJ—Ùœ(U¹Qê#|`ÈbÞ-#ÕE·TZeZPñ1" XÌ»e¤JíwÅÍÏ¿|ø]tÌuÒ‰ ÂK¿£ë}Ѷ b&Ó:ÚIä×$øq qR†Í©{8u Žc²gCǘô×GŽÕc‚)Äsýa¿V”fFJößrQä¿IªmݽKÁ– b…MŒ.õs‚ËÀ›…'x,Žu‚ ã™±Iñ…\î‹jRѹ­ÖÓ—¬ÿ_òÜž¿O Ï'ZC¡ÿ“×}¡  ÿõÖ‹}Ü~†M*—ÊÌä¹zi*Í/¥R@0™¤œ=ŸJ‡Tó©4R â\sx“ÉT@N£2^„H•a”LÁé‰è3â]u¨ö…M`\.»&‘X…Ì¡3‰õU*³*°ˆ¨×;ˆ™Žyå~ŲØ?O-ÎmN‡‡§»]‰sóí¤NÈ›]” ÇËö¡\W6 —+ÂbňȘ"t‡yÚÚy÷ôP­‹ýþ §ªz”á7Õ½…÷¥C¸4&øCÑY³ÎæŒDÀå‚\0’!Õ¼‘D*ûÇz³ž.šçu¤y~Ñ@”Xt´Y næ|¼è­Û Í–¨‡CÓùkçI0¢ËMÓ5ÎÚ}Bü´Ç «éDƒ7$":xxµ‰DŒdV Š)ò#4˜€]l[”¦ ·OµÁæPÕ½ŽEçL9#JIÜ!¦ã½§·¡5%p©ì s"–Í=þøƒZá„/ÛòøŒÊ>(EÎÀ½êu‰T_Ü|ý;™Œ½J"XpdÎèõ@®'1s´§‡‡æØµ^žýNvÑåP´Eñ‚Üñv/“N ¤M&ˆ ¡4-ÏJP–>QØ©«öUg½ tQþc]>t‰T¤œ›GßvűK,¹È(²´EØÉ2@¦¦,å,S QQ}¾²æ@–»êšB €?úx€WžµV”óeÝt^`Ü…rƒóU=cüÚ‚êç”  Zš˜»~Ó"ûõ®¨ërÌͦãâ`õ7÷h³ÿ)%Õ8­?5' _Çk½<¥DâP 3-/؃!b?VÝ®9u¡Æña´y°¾á«¥Êß}¬¬5bXmöÅÓ(Ôž\ÝuUÙöEb®sïßΕ&ÒB6ú1=Œ‡ùZ)],•$ø¥–JŒ@ó¥R¤Š{öLE$9Tz:·mrTÛT£2Á9ŸbÈö"Röñ.É‘1Á¦.r´~”B}#¼ù=]ä÷¾LÕ?p°4êÅXԇшԣ†¾Ž>ÃÈmO–eÙO©X˵(‘[£3¡XŽ®<3K(ñµ€Kˆ´½*×Ã{Çío6ÈWCús°pÆ5Ø Mø:àþq?ˆd9f$H¢ä©.¬O9mÃÞŽˆý—MÙAäˆÍuö¡,àfq·O6ÀE¹f¿&†Ìš%Ø­( )£\E>اùŒ®HÜzL5¿œ*ØÌMiPi=Ø"Úí)¢¸‡2çdÙzÀApO§poÿŒã8B,TÞ—Ýd–=Áíº³ÚäŸDÄíåeMµ­ºÂ~h ÊÊ¢;Å7aœÃzE‡wqÚAq˜w`f ¼lwÞßxVå¯;›¢¹ò 6ǰOÏ@Xµø[7xûÑ%î±Lx ù¡Úø'‚D|°Þiï ¶K¡°K# ƒŠŒ…‰8ß"[­àeµnC¥³)ï‹ÓÞ—EûfÞ¦}Ytn` \ÆŒ¸h¯š(Óÿ©\¢/¸Ûóó¨¤óŒËÀâÓ²[jË\»X@]Á#CÄO=*µ£}Ó¼ÇQÀ¡#Mä"“Šª³-‰r¼£˜I®1k˜–ù#xM™Nþë)Áj $³æ²©Ž þŠey‘E‹Ì7¥ÕeíbŽ[«¬qä+Š• ¢_B3%§ÝÏ»Sµß`qè¸ZTßoF¬èWPõög c˜`CœèCó¼ž$§ò¨'o°zåß–µ­!K/ÔÝþ"8¯«z›JKLfBÆVŠ]eu¹-k|zU$df4b¯Â—È›²]«»Ð.á9 *6­sÑbF@6Hçà‰Ì!âðä«!}HL¹"ŒY÷.ø1ç 1(Î)W#i 1OuAˆsnz¡~hžŠ Ðr‘›+á;Bvì‹j©JdKLÂ¸ì ¿mè½¹Ç$ÄldgšûT “Âöúé°7Ž¡6ç2}iË ÃÈkÙïauÌêvu(w¿lmS2¾åéè­b#ï] #TÔ]yxÐÚ”¬ò™\¥tfEÕ6!,·+ŒRÇ´=fUg°~Z>+’ç/e2¬^ƲÈ®æb£A˜˜-uíO›Ô9#TB†ÅÃâ^g6³€ƒIµ6RÀÎ÷÷ì5Škàæ#‚mÛ¬+›)…ÁKkføØ‘}CL!έâZ¼ƒ½0Hs¯×'T;ÚU®¢Ý?ád/\Ê¢öìÓ»°|„q6ÐRZ‹ù²q󇯀ÐÁuûÀP @†¨dŠº0«Z Ó€]I'>;Ó&Rò²Uæã}·-‹¾Ü¹Øj¬ÏâK–x¹Þ§¶ÄÞÅYD·mÙxÐïàjÖ•M@äy‹–¶ ó›IR,“9“ƒx`{†Ië†ÄÓ¿vàÚ׿c¶P“jDHÕCÊ–fÂÍGH*§zZæôÁ ]#«®xïÊ Êú†Ÿ]Óv8ò­jÊ–J[’ÍÆW"áw¹=ùµ3®¨€>xzoŽ”{g¡±ÓëðÌúžŒî<í4kLûpYÝ{éšDl_…·ÙúªÁª†è‘ýZxÊa™³Á;H!ˆÍaœÝWu™%›ÀPs«œ½Ì ¾’XG‡í‘át–ñÛ#,бn‚Ë÷.´ØkÿUçŸn“¯)˜²VŠ5åžÌå=ÚKµà·HY&hœÇŒ1“ULÆû‰RÊ(×/ô›<“,öú’Æ¿ª îqœjðCrª¢æD\”Ä07(›¢Ågqžî8=ŽKÙ¡ÈHßH{.wS#ûx·l¶p,R¸n&ëK¦å­H¤Í£¶xYàÚ9 0UúH¿26xu÷”’L•Iý‚½54 ÖMnñ¾‘cK 7:9gF°˜EŸp3­gc¢õº2Ê,o:ÿ²þS(_jXEŠI¥Ñbe áɉåZUQ0%3PªQBbavKrB[âVKUÄà‡&'òåˆZ^ÚP_€ð У‡5~=5J›çC £ úØ»:³lÀaåhg‹¸(^[Á_…’XƒèI§Êã8¦—‡“Ë’Ì7T`¦ÀŸžÚàpÓ ç@…¬}³¬9mw8íNz€´.Kÿâ2ËoÝü1û`•]%°SÐzg÷ü3´¿;¹‚ó GÛÑLáá}õ¾c@ÿÙ c"¡f‘MùÄKFE$0!Z›Ä~1¿äó[\í§D©oW‘ãjÈpôȳ\ÓýÊϘ±û 46컎úJ^† ¸I¾]•ŽgÆÆï‹ñŒ˜x=Œg°À.œÍu Î<t• ûms„xsHÀæPùE§š­¶¸Œå¡-jÊTJe c½Zm|¿«BW.ósM0r\$ÑÕSˇâØ:¤'TÀw0*ÖîLÇîT¨Þl…D0"By%Ôm _Ù;A9Ö D¾\ŸŽá”½çŒEùˆŸ_ì¿ôŒÝ¡X¯™ÞÁwQÞô`ÛãþÇs_[ø «Ã¢lXs?ú½+Úr¥<Ó²^7¡’^ƒƒàq«wÞ~õ¥ÿ _ íÓ»……„½(¹kû-¾„&˜r™pNúJ¼ÅHUà4fx¸âPn¼ñåø\z£àsnøó.ª3ݯ0‘ÈWí½,£Rì' þð\HV¶Ó`]iÒœG]8TlK»ÄÅè0q1Ÿ¸à×&.F|©f'ü÷30rÍeKÒ—jö¿-Ÿ…hÚ6?ò€B÷w `1g×vàâš<[ÀsÛ+ԗ¨&>TY Pl>éZÏT vÏ©„5¥éŒFÀ`U_Ì  Èp,²Ã—…·²Xg»¦ËP‡Ø9ìkæñ3§Ü·<û[Ôº™'îü3jíŒïáçbxiýÁÝÄãHÇÒw|àá¥uº1„¯&ßÙÏ4sð¨X»Í¨P'ÆLôÑ<Ù˜U†ÏVBrÁ;ħû§I¡3Xi â!Aýº/nb}†§N¾>pVd }‹ž*Mîzýƒ¸ø¹§.á Iû½Ü¡ØÏqMþï!†õÄ';ˆM,&…Ò87Ñ,ÝVWÿrâ†|GûÞãGùIH_Ÿ|–jöø ~Ç1ºÿÉš¿}ºc²¾yóÝéŽW_~q¸ã7ÛÞ}Ñýð½ØþPGnÞÐÝ_ß|»ýëÁ<ݼy½Ý0cïýÑ/¹ _Fäü÷gsÿëÅ¥ýÆ&u`A¢ý`ý¿ÇYP¥õÌGŸ,;ÐÀÄ e%§äüÛV@©\±„èÿ:Ìfendstream endobj 1336 0 obj << /Type /Page /Contents 1337 0 R /Resources 1335 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1307 0 R /Annots [ 1339 0 R 1340 0 R ] >> endobj 1339 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [97.8684 502.256 131.7211 513.6481] /Subtype /Link /A << /S /GoTo /D (man.rndc) >> >> endobj 1340 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [91.7912 414.0448 148.0099 423.2602] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj 1338 0 obj << /D [1336 0 R /XYZ 56.6929 794.5015 null] >> endobj 1335 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F53 1333 0 R /F22 977 0 R /F14 980 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1345 0 obj << /Length 1558 /Filter /FlateDecode >> stream xÚÝXKoÛF¾ëWðЃ„ë}?š“8‰ÔIm¥(#ÒŠtE:®Qä¿w–³¤(ŠnÜÔ(‚Bícfvvæ›Ç’E~,²ŠPáddœ$Š2­63]ÁÞ‹ 4qG©~XÎŽž 9â4×Ñòr Ëj-‹–é»ù³—Ço–'狘+:d+MçgÇ?žàÊl)5ÿ¹£xöúìùé‹·çÇ #çËÓ×g‹ØP'ó˼¯ßœìø.ï—¯f'ËþÛ2*ü~Ÿ½{O£.üjF‰pVE·0¡„9Ç£ÍL*A”¢[)f³ŸzƒÝ–uÊrJX¢,7¦“l`:Fa,ud”#ZpÑš®ºnòª¬±¦tþ§¿Oıָ(fŒ8¥xK—f—ÉMÑÄu¶ý”m‘œqC(üØÓ–Ns|ÌîÀtè·eºú ¦HÎAW~n7žs>МbÛ’,×yÎø•R^dOp’_†ÿ²n’¢ÈRœ&5 ™‚GÁA´•x”5«#¯YUåå„Vm5äáÀÛê¦è)Šê‡Í:ÃÁªÚl’2ý~âø˜Yp”Õ F†8¾ór¿ ¤v@ªˆ3F‡ƒ½ŠhúmVTI:¡i‚`´XSJFJe™­œt‹½qz]mSp‹ÀŸÜÔYà^‡A™l¨ƒÆPøvÁì¼ÕÕÍ2ô’—ùwÜU9:¤¨VI±2„Ë&Y­ó2Xü6Ããp¶]ØùMYæåUØÍ›5Ž.+ï®~¬Ò´ŒUpj²MV6õ”÷èº^…–½eÝ…4ÄrjöôlFƒñ&ˆóÉb8 E¶­ ÖUÝ<Åùgüƒxª÷èvQ†d!Ú #F°lè{V þ¯“óeØHÁP¹÷O;Åp±3úv*-%œs6ø(§ &‰6|JQ"™¶ɪœ8ƒÉœ÷ã¡ÈÄ) †4iOåUô÷;4Zmx WD+f÷£ü¼¥3-ÂQÚð`eÁ(B ŒûÄt••GkA¸±2_#’¯¶ÉO¸Í ï§=P?ee)îpo…ñ~BŠdÊC  ÓZ”¹/K*MŒ%&g<È;¿=ᮺD ¨óðaó·“¢®ÐdBh"9ENš××Eâ•f<$&à>[Ô¿¾®ÊÔ›ôÐ’Œi€rgÉ>Tu‡ª…ë‡ØmL<ôÇ¥2k ,µ©V’t·0aF f |ŸöÒ{ÍèˆÝc©5ÑqÑdÛ2iòOx1U-þ—ÜÈ}‹¡ž>¹uaŠép lŠΧ°ÖòÅÉ„Šê!í=ÝZÀG|býæ:¤ˆ CøÔ¨Âi:¤ ècbŒ¦6ó„TVáÀM•æ—w§YH´Ž«‡˜]sÂ}´#iÒô•ôFë- uVRF„ ±P„1ª[6ßBòE ý´ŽùU™L‚ͧX ½“ؾfÛ&É[{³ùÛ³Ó_pT~˜ð¾ôÂzè0XW<=iW<ýv…Mò±Û½ÎV¹7à çɪíùž ]RãjšÕ«mþû&(Ôåè´½ªéÅ(22Õø-×Y<5¸ÂŠºÝ¾8ÜÔ}5žÎˆ P*û8þèsÚD†>XPÙ{Û‘q=aý‚—ä"©P©'¢mèÕ¨¢|W§ÈÀl÷j€|d…aÇ1*iý¥—ŽHiE_ÒöíwfBòH2O‰-ÌÅé‹—oߌ Å)¤,åk(òߩًœPsèIב¾ÁÚSó™zÔfï OûDÊZ:•‡½@'ÍWd„.ëìzÚ‘*iA‘ÔÙä\[j%Ñ’Â b¨®q÷2üÿ€X8Ÿ·á­úÃ3N[Æ;/OμÅC™…âC=§Q<ÔóÁ(^Y—1û‚Úa0û#oî‡Ùã]õ›ƒ{T˜Á3ÜHö” k¡C2ºCÙéÙò~í$>ÆÆJNBlOÉÿbuÑoaÌqB Ó`z³ÿ­íà› 48ûžÂ)(¼wà½AS ²ð™ÏØ»O†Ù@ù¿[÷`endstream endobj 1344 0 obj << /Type /Page /Contents 1345 0 R /Resources 1343 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1307 0 R >> endobj 1346 0 obj << /D [1344 0 R /XYZ 85.0394 794.5015 null] >> endobj 126 0 obj << /D [1344 0 R /XYZ 85.0394 490.579 null] >> endobj 1347 0 obj << /D [1344 0 R /XYZ 85.0394 463.2745 null] >> endobj 1348 0 obj << /D [1344 0 R /XYZ 85.0394 433.7571 null] >> endobj 1349 0 obj << /D [1344 0 R /XYZ 85.0394 421.802 null] >> endobj 1343 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F48 1258 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1352 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj 1351 0 obj << /Type /Page /Contents 1352 0 R /Resources 1350 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R >> endobj 1353 0 obj << /D [1351 0 R /XYZ 56.6929 794.5015 null] >> endobj 1350 0 obj << /ProcSet [ /PDF ] >> endobj 1358 0 obj << /Length 2408 /Filter /FlateDecode >> stream xÚ¥YKÛ8¾÷¯ðme RHñ%îžvóBf€6Ý{ÌÌ–änalɱäd:¿~«X¤,Ùêôƒ1E‹õbÕWl¾b再1aåÊX™)ÆÕªÜß°Õ¬}¸áF*‘))|,¬¦J™*r³J§Lþsóú}ÎW9Ë´ÎÕê~;ž¥Êt!Åê¾ú5yóèC}\§¹b‰\ÿ~ÿm“™) Çm ް“\ú ÿ®¾º¶¬+ÚñööŽïk7œŽu?rà2Rçƒ6ã r_§œ1–ÜvC³} [ò•ͬÎuØ!D&•¤3ý)BèäöÓýÇ÷¿Ð¸éñ×$Ž>÷uùèÚ¦ßÓçð膰¾Ûußú@äz¯,Žûúøµ>†…¡#â–$ ,ê&ÒîÜ×új›Iº-MâÑõ/‡Š¡*œgV©Ü«ò½këa.TR¹Áe@ËTò±¥©ãšIݺ¶¯i¹á¯-{6Ïu&¸)àä¬smNÉ3-… d[H·|ýO´ ŽIŵ‘É+œ(Ða…ì€ÃoÍnG£ò±.ÿ˜ Û×Qzï5CЭ×tA_0 )å VC€cq/) Ñ…V£zÇ¥òt$£µMœùÇk«Waã–~ÁÃq¦m†Æ »¬hðy’ÃFútºrØ,¯ø¢,wuyFgyÆ5¤˜ ‘Æ49=áÉôÇ‚Ä\*!5ò¼ p…`ƒÐ‘*' ÐkžŒÞÀ9ôÆŒ(„œ”Ѩ >Ò6+$dC2¾Ûõ]ú¬£ š´1L®Ž–ˆÂÿØ9#}:Ýpm“k¾3ç ªÁ9æJ¤«ÅL +×𗄏à„"ø[$÷‹á•N#ÿB 5’é@v :te·#Í|^ö‡ºl~c,‡ é3›Ð ¬RèyhB~úüþ ¸µ:»4Ëe<Ï´°UþróëïlU}~ºa™°…Z}ƒ–‡|µ¿AZk•Œ3»›»›ÿŽ!…"ÓŒëçyÑ>¼Âv¨ Vi”.9à1÷Ȩìve1¿Àª°6“ÌÒ½ØXié‘g™ytŧuªyrÿçÉ»KËOÉA4¡T–åoéêË ®¬´VÑdìu=ÛÀO¼þ¸ÏWo;Ðh5Q*2N§œ½RšÍ’&#A#³\HK؃ (|-¨–ë Ò:WXòÂ$ß×2€¿ï@Pº6l€ M£M=aaÎe¦†@ÒAæ8.œÐ#ïWdW= qHj@ÌðnOÁy¡“€»É¬8——ܲdƒüŸè´ªÞ®TÊÓn«}ÝVý‰inÀéF\Dýí§µdÉù†Í‡èP–‡ã÷uß»©dâÏõå>jü •}N<^Û"U3Ðï®s•· dÅyr‡tûÔ´K–b€{Y~Q =Ÿà °FÚµ;døô¯-,ÀÖB¨ÀÀƒ$Jƒk98¥;õõ’Pé¥5/9Lf…)"úóáa <ÚÝÐ; Ì•3Þ|RdnvŽÑ È|ŒLGË÷ô@Œšð;qÂ%R°`¡ÅjšDþ^^ ¨¬¶«4ìýÛYsšê ÌÄzÚbM:H—(?Њ…~'ýÎÛ'peSRÆÿß¡Bðùró3nÒ6nòc_rà×ÑϾ; †%[ï%\«*ˆt¼­€b ¥v®Äè÷ë‘®ªwõ0ÎaI°¶ Çø’59.úÆ¡aðã͉qÍ“¶"žð ¡0k‡d"[øªévôð™FÝö¢ËŒY+:g¾¢[Ü0BþH ý ?~ rg_ϙ͋imÂE©Î¹Ð‹ ÁĽ<9úÑYðIì9´)n+;âÎÉ\¸Þ–T’S0̸E -~‘7Ò÷¶éé¹HÒyV0 ª÷õsŒs•qá 1LÝ®)—&@e ¨ËÏbcñgZ e ] »<ê½f pŒ2ê×(eP ¨ÜÎKÊú¾ gÀøç64Š8÷‚TUw™Y£¢îèVî áŽëh¨0I£[§¨ù®+ÝnIuÀø…±“úËò N?2¿Ö‰FÔŽãhfõqß ~ú”0ÛüGô“³@à*Ó=¦Â¦UÕöKxĨb”˜ü¤ °§)æ~úöØ”#áå@‘¨øûP·õÑ ñÆmžÛTl’y~]çøëïubN€8:§CHwu}Õ€0Ey"¤꥞(Ò§Ó íÈßyO²aOUE^‰dr¸-v&ÑuSˆ^P*d3ƒªfÂñ¿ªzpÍ®§[ÀÌÄüv©NˆIŒBŒ'§Þg0œÿ¹>njê”Âbß<´èe\¥#¿œê~èiÆÃa$ÛÔ4±wU\yx瀹ûŸßýòúÃÝMÏ[2\ß<Ñ/ÜÍté)ŽêP"©‚Ô8^Î\`¶š˜µàê¤P=M ÃRúu$ز3;{/Á7CUW¨Ò7”ÐÖ Í×1¿ ¿ ôY¾ @þIÇ-ô˜¹]®<ÖdÈf1á  #7s»¸ˆ/ÎÈ×Ó#ªnïšv)Eö×|¦¸¯ØªH>µ¥G/ÚB¨‚¯ÌC%×j ¤‡ ΄£Màõ¿|ŒÜHÖôA-08×I@t jæ`Äçü&‚ñvÌ^!ÃÛaˆÇÙò…0s8BYoظ˷K¯ãñ¹ã&Z/ ¾*à|,OãmFlq¹I~cŠ}?Ãô¨ƒñï’wïÞÀ:§¥mÍñƒ€P ÆÌ?×ø¢‘|þ|÷ñÃ+Z¿…­D@Ð+L ^bÉ…‹è¶¸¶…¤èýg5¡"kΙ'ݨ¬¸ÓÐá#+T'ßîØ%ÓZ2áDVµúŒUa-€üZš‚î©iÃáaf±Trh!Š¥œ p/Hºl‹›ïîœæ#¾Ü¸>Ö¹¸ä_šÝ¤$`\àŸSè°Ö¢úφk¬pQ- ;Â.$ð3OJBeò™7Ðs³3Ò,6 @*J B¹xöÑõú¸ÿª_µFendstream endobj 1357 0 obj << /Type /Page /Contents 1358 0 R /Resources 1356 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R /Annots [ 1362 0 R 1363 0 R 1371 0 R ] >> endobj 1355 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1372 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 27.00000000 27.00000000] /Resources << /ProcSet [ /PDF ] /ExtGState << /R4 1373 0 R >>>> /Length 1374 0 R /Filter /FlateDecode >> stream xœeU9²,GôûeË@@Q ‡!é¡%bd(dèúʤ—÷ÿ(žÑ¯ ’$¡T¬)ÿ®ïë¯ãïãÇ_¢ýþÏaíÏc‹®½Ú¿G—=ûÌöÓ1ÄF¬lÖ]töö×ãqu‰Ý¦‹÷5š”<8Ç—ý:\;âúãñ‰üéÆ&ÞЇ h—õ:ÀÀX=&02²oÒCó eD3PMtð1CrZûbœ7³}t€mA£d«·íä'ÐWŠ!è®»½KO(°ƒÔ¤‡tÙKb•^¦Ìì »å*’ÎÕBêFåmY¸™`Uõ´™Õ -¿nÜž í½³`*TûÞ£jg“¾=Ås–A½R?Ô =}³Ú§l ¤Ï’ÃigÙ¥—ÇáC6uéíÛ&”\Ê GTœ„Méêö–KòlÜ’Fyu|?é%åiÈ¥K”êNÊq{vˆ*êèJE¢]8hÍò¤p0R±ˆ$Á(+Á nÖN¬ qª„Ñ«ò^ÿï>‹«>÷— .13×…Óƒ!¶3¢SËAÕ”ih¥Å¨Š^…(€<Îm䦽ªšÛÆlLÊâ³ò7ÙaÆ´Ëdô 6(WðÚºK г2"ïE9~  n*Œ1½÷¨¾x¥Æˆpîâ‹&Xîܧ³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãêʱ„£~Ï“a³tŒºìZDß!#Z¶ÚÂk! e'jÝ=§ _tsÙ¬ûÍ&­Nå@‚i¬ˆ3t%kÐE„\H–YZxÿ/U¥Ç™åë—Φ@±¯iW H þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ&F°ÑTÆG%V½ Î'ÌØR5¬BÔ‹`qUžv-UÍ=ëÆåQv2ë_ ”¿­qq‚~èr¯Ú5ÌJ¼ð˜°h»P¡õ‹kÜàéÚýªå>Ò¸D °o»Îi¸CrT]¿MJ¥ ÆÖ¹’°;¿ö‹ûóZ¼¬ å[Ç-œÁ¤ŸBx¿ýpü|üÈÂendstream endobj 1372 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj 1373 0 obj << /Type /ExtGState /Name /R4 /TR /Identity /OPM 1 /SM 0.02 /SA true >> endobj 1374 0 obj 1049 endobj 1362 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [470.3398 467.2776 539.579 479.3373] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1363 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.7164 455.3224 385.3363 467.3821] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1371 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [304.6433 163.6578 373.3153 175.7175] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1359 0 obj << /D [1357 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << /D [1357 0 R /XYZ 85.0394 769.5949 null] >> endobj 1360 0 obj << /D [1357 0 R /XYZ 85.0394 576.3463 null] >> endobj 134 0 obj << /D [1357 0 R /XYZ 85.0394 576.3463 null] >> endobj 1361 0 obj << /D [1357 0 R /XYZ 85.0394 533.5444 null] >> endobj 138 0 obj << /D [1357 0 R /XYZ 85.0394 299.6823 null] >> endobj 1370 0 obj << /D [1357 0 R /XYZ 85.0394 263.0631 null] >> endobj 1356 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F60 1366 0 R /F61 1369 0 R /F48 1258 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1380 0 obj << /Length 3579 /Filter /FlateDecode >> stream xÚ¥ZIw㸾ûWèú½‡H‚LNžn;Óy‰gb;˛呔ÅiŠÔp±ÚóëS…* Ìž>äé@¬ –¯ …›~á&Nü$ÙFe‘a¼ÉWÁæúþzò˜­´uG}ûtõÍT›ÌÏ‘lžö­ÔÒ4Ü<?y‘/ýk xïß?ÜþãöþéZEÞÍ߯·"¼¿¿¿¥ÒÓÃÍýãÝíÃ#Uâàãïà^o¥Š„÷þ»›žn¨?bª7þ}†¡wsÿþöu}¸gw·7¸ÖÓ¿n¯yúÛÕíÓt(÷àa ñD¿]ýôK°)àü» |™¥ñæ •À³LlŽWQ,ý8’Ò¶ÔWWÿœ:½fê*#ÃÀ2+œá& ý,ŽÅ‚•qæ'RHf¥ða·%ñ×vì][¦¢.ñ¨@P8¢ 6[ùYF†ÒMm&$^~ÐÍsÙc%öŽº(©yhé«éó{Û”4dì«æ™‹×F«œ*ã©ÐOÖÝu˜z<¡ZªÔY5¼Â¡œiÿ‰7àœ%á³€”¥Ppܪw›™·éqh·xj<çÄE8çQU®ëúÆ…ÒËi+°Ó‚vÜA»B_v/eGåó¡l.ºqñ®¨B ¸½œêp†þd¸ ÅS­s<†ÈR–4ÂL.µû‹5f&ð‚5wÀiG$ûÚ·ÝÑ'Êè8 út*›‚$ÍD åç¡lúªmHC¢ÐÑ4-V ª*’õmê= (w$yQ“iX˜MæXnWÞvÄýþÔ:{cÕ‚Ò,ØÀ«M]ö=UûS™WØO²D.lÃ4ö3DK· ½®*вAÅ ¿b'¦\ñ"¤™é|àíªFwÌO䱸»)xS‡v¬¹Ü´Ü»c¢eQ‘’Aù¨›ÑìaÊŸd¨üLŠÔìš6™¨Yý |®Œ‘BI×}K¥6Ï5ÊUGuÕÀ“1"*Æã ¿„œØ3Xúy{<Õå0ÕЇ¡gÚû‹Á¤ÏUXNIJB‡–ÊN4]+š9p$ckÀ™ðì—x…‚Hc×T¹‚EÍé²ÐÓûÁ°úJxüœºccIŒ•ƒÈ;®Ñ¸þ0E{f‚-wæîF»`;õYMJ˜6¨ì+õ°Î¸T&ðèàîðO§¶#n¨‹"•»±1zæÏlJPaøÁRÛ~¢’1&žÄÈfFr[­{ž2Gy®úŒ÷säæ.Æìk®µGëã@8‚35V)0Qëç¥õîËŽ×pºÀº¤Ù¯ÖÖÛ]¸Ñ¾:V¦rÖ«NP9N0–Ó„1J± ÿ<¶§vÐgvÃ^¡Ã&³ý@ë씇JÒ;°?wGl¢1žì[Z?/¼çQw†’ÈIÔ£A« C2ñfÊ;¶FÌ™Õל2sCj6‡æÐþ\Qóph !Ü@*mCNSyoœµ?sÂêb.âùböÙOƦ ¶#/´âä5·jý°?½U¯wõ*œM;Ì@†4nͰ@ûÄ.º ¾e}˜À57MÕ‚õ8uß•åï|?M¤›:ˆ|ð™‚'؈òÝ,ªpšr`‰Äéȸ/B'l›]¦{ˆ0°×ε{l% “¯Þƒ²LD<Èê9®Àa¸UÒ ïú®½L—D!¬{ ïž¼εnù·99g¬ <#CïaÝD¦’¥ rú¼"†Hùq¨¯ˆ!ñC1Ù¹IœÔ­..6Lú_\îžpwš¸-›I5·BE~áTÔñµþtèÄ%‚“Qä”â¤ÉGpx g÷ãb±v)—˜Ö²6Œ‰µžÛècÄ Ì“Ù|¡5£±Wáèa(§*&.Ä œ±džMœ»År5PoÅõòó©®ò ³b¦^PLZ€Æ*“ÑXl?¶k—Ž[€z׎‰ç—IUÞQO_–Tà|8Œ-û¼«N3ÊZÇöÎMÐif%Óaz¯¶FSÞŠ(Žý8άˆòš/—_]%V>„m6´äÊ[ò2ðÃ0¶ÚÚ€/o¬Dày@#’(» Œ"ŒA&ÃüxöÕXç±X—DbîjømÄ/µØüR•g“ÞŠ(Cm}µ«`ÍéŠ#™/’3.¦`ò°ÐŸLâDrÆ¿€`%Ýj¥E*Œ(ÊÏÃuèM=Ê&DÚšÂ"3•¿c?Nï F³à(ó㕈8Ö•áoD‰âoîdæp*›A,ìMÆ2¯36ŠüT‰t’ö0ž8¢šÝŸYk®à3œ†òYïU÷˜¥í5ÔAô¬›êwk+Ðj³á0ð¬›ay2B&h DsÄY~èáí#›B?xZðk8Ø{ùæx¾7¯$&%fCÊÝ?õ‘³ŽÞj¶š )u`•ÞxqÐ+ø®#5ò.”äY±ƒP’¨0B(x øDb•ËÔÏtåÆ@Ï”I[Qœyé™–Tpó©+z^ÁJ‹OZT$ýVø€SJ0Úm¢bWâØ[ñ̾=rKQî(ŒPŒàŠaX™\ðp0ñ .Æ_“¯ÂÑÄ—*xŽ°ØžØ_;ÛÇÙÐ’˜M2‰/â)h¨Ký©§¢cDߣɑb ÃЯ¿Tš*%„$¼Âî`ªˆ ™qÄgylþ;4É#q“OÃR¯_^^WŸ¢@&à¼tþ (³€â̤Àa"%ª ¹Ø¦ °•r©p ¹†©¯TÈ-…ÅŠï¸ðmƒ¦E^(²MÏcO|J¼Ú9øTÒô |Œ a¼ïiO_@IJÞ/ ¾y# µ;è oÛ®.VSù7 «ª2Êd‰ŒÐGÈ(eLÈh#êd:¸dc5ã$Ñ-©j£f³}¨›÷BjrT j€M˜>ìië.59#hÞ•‡ª)¾ø<ßuP©b4÷vD§0 SÆ:vôJ|°rêÌ“—Ìœ±â“Ó/Ú|ÄÈŽ]]ÇþŸhFN'B Â8ܰØ_DFߘR¼¢è_º¹|0±/kcoŸLl*ÛŠÁüg ª×pµ<[>ºXJS.Þ'þMÄéé¿P2öñL+)†`úsÒÿý?©ùßd‘òeš~!Y!TêG)áM!ÃÃèÍÎíªÞný¨#H.endstream endobj 1379 0 obj << /Type /Page /Contents 1380 0 R /Resources 1378 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R /Annots [ 1387 0 R 1388 0 R ] >> endobj 1387 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.1993 393.2115 511.2325 405.2711] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj 1388 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 382.2725 105.4 393.3159] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj 1381 0 obj << /D [1379 0 R /XYZ 56.6929 794.5015 null] >> endobj 142 0 obj << /D [1379 0 R /XYZ 56.6929 769.5949 null] >> endobj 1382 0 obj << /D [1379 0 R /XYZ 56.6929 749.4437 null] >> endobj 146 0 obj << /D [1379 0 R /XYZ 56.6929 458.7525 null] >> endobj 1386 0 obj << /D [1379 0 R /XYZ 56.6929 425.4132 null] >> endobj 150 0 obj << /D [1379 0 R /XYZ 56.6929 270.5184 null] >> endobj 1389 0 obj << /D [1379 0 R /XYZ 56.6929 234.9696 null] >> endobj 1378 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F63 1385 0 R /F48 1258 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1393 0 obj << /Length 3173 /Filter /FlateDecode >> stream xÚå]sãÆíÝ¿Bo¡3'v¿¹LŸ®9§¹Lr¹äÜ6Ó$3¥%Þ™=™TDÚ:ç×Xì’KŠ’ìfúÔуö°_$_0øñ…Õ)“¹Zd¹J5ãz±º»`‹°÷× îa–hCýåúâO_Él‘§¹fqý>ÂeSf-_\¯N¾üúåÛë«/—B³D¥—KmXòòÕß/9çÉË7_^½¢­WoÞÑà««——™J®ÿöã¬p«´…ç“ïÞ~ûúzxâ×ëo.®®{NãÓp&‘Íß.~þ•-Öp¨o.X*s«{˜°”ç¹XÜ](-S­¤ +›‹w?ô£]÷èœt´´©¶"›à ÎÓ\k1’ÎS#…tòÁ£q8'c,¹úTÜm7%¯Ýnªn"›¶ìî·xh@-"ɳl§ÆÂ"âü¶ì>k/—27I[<â K ú[5w—<Ùµ_®‹»rMeaäøÎr ¨£çìÅå„‘¼®Wé N¯÷üÂ4# X€d*yЖ„6E®fðé4ÓR ø8ñ|[„Õ宨ÐdÕì¶Í®èJj«®ô`ÝmÑ…'JZ+j$b":Wz±ì´ªº+w5b™Nê²Û7»4ÙWÝ-v—Ü&e[î@‚nåµ{¬D­e&yëš®Y5Šäõ[:ÎÛm±*iXÔë0 ÿòS̺¼«ÀŠ]õ{ ö{S—DѾú÷…;Ÿ¦Ù‘õü"„jî»¶Z—8 &µêª¦¦Ióžþ úóA3#ŽªÖƒ=Õ¦¸ Û5Ð/lïo6U0•‘y!‡6Uà>ÆÖ%•=j]<5™ –³/êÕ+ò¤¢´†Ë«MUö0Èþß”JLÇ;^›ÍæÁƒ ÀíÛ¦íð®x|N]Ã㽺-êéÈ…ì+p=RÙ4Y²-wáqŒJÀ'>·@ºÏgŒH®Ã2\aRlÚ†FA"0¬úÁ ˜EGÜy€Î?ì/"\­ÊÖíÚ~wUªçl+PX6õæ‘´Ž†ÙNM¦ âÞ®šnÖ€zàÍÆÛ#I`lœ½yE·t0Ö´çr°¯×(YÎð"ëîƒd^w° G‘nªöÖ¯ßV-Ú¢Ð^°6ØWÈ .·xÙq Ü2=»÷Ha§¥%äWÐ|ÂS;T(VÙ<ù¾.'È<~Ýø­ÆŸù™Õ‚“e±·Êk¨jÚ ¹Á`ê¸òäõ[ÚqÉû'˜z§”60ÚyXòs¹ç—nTM;7Eë} ,â B± ¶z[­n=Þ0,y¨-¹ÍOÎGÍÖ!šÚתð.¬+6Çîè¦q}©SP}]UOl üëœeÑ¥Ô£›3¯`œØ MX¾ñÀ«¦þ…1ñážÎ¾¦UgŽðÿ¾ÙíI*kBP„ç»/wUélÓ*t9å¶íôæ¯ÉRiLp yÚ³}èo­„„ÂþbãRiž2™O¬Ä,þæ,å—#NO§ œŸå6ïq.UFö{ˆ\Øl-–ƒxö rT—†LD¯è•Ž«h@Ñ® üŠH%ä€AjÀ ÷Š=¬tüáEsã4yO²¿ó80Öã ÊÃ}è‚TAU½Úܯ«úƒÇïB¢^xàxä˜ä™6Ç¥Â}œtkˆ“8qéüwIO'I‡‚‚xЙà#lŸÇ:úä.*»TžÊ\C&‘à\¹¡Õò#¶ Þ—ÛÞ—:Û10)R“suÎdMÆø³ü8\8‚Ä%ª˜„1êpE ŸûÍšN@.Ãq@Õ¦½§ô…'E;Öm¡ði‰ä»òI§Òû^4ðUFÛq 1“õ÷'Gªiˆé\°p÷ûý äHËäçäÊu¼ìûn{§=i£2Ý]åÓG`Þ•Cn4”IBrw¨ï~òù¦d3;~r®±; ‚¯/Ò»OÞÍ*ÎWk5¶Ê3­È †ÖÅQ¹@vÞ Á3ÂÖ©Q<î_¤A÷È ;®J`Rëu…—o°ì¯a¨¦çc2ÕO¸S2eØ!:uFÁRfž{¥ âŠøJÑ1Ú[ºHȺ//qu[®*rv,ùî'Z<Ð;.ºÜÞ÷hxª¥•Á¥ÎÔÀÍ­W}ÒŒÞÍæ_ŸŒKÍ—J¶ D)ráð …\¹Š\9ìzWÁJwQÀcªËríÂ>V®Š{d °®‚ê¯÷ȃrP1¡N^~8¢¸ƒP‰Áp_„5WÔÈdÓ4éP°ˆ•©ÃáÂ# :}]nª‡€Ãómwp^O4.´Å n’\jPG èújIŒÕ1"&ºx1)¶3!ßuUœß \‡,`®ï4¨MSÝé „²sT/Þ–~4ª»¨6ôµb=¦3î;ð_{.? Ý2¦Œ»¼“ŽÛÄŽ5Ýü‹ì‹™»‹M`ÁÂ’ÿܱ¾0ÇN8O3%5ù™7—KÃ3þsFÿÁPGYÿ\'nŽÜ×´/)uh·ºQùH#ì*mý*iG.aq÷å¶Ø¼÷kþ ÝE\šUu1,ôY“ÔQñ.µ€†¬&¾m€CŸ¹ËõÜ téË“µ;Ëéúô]#f‡ëƒ‹þLýv>Ê~û4p©¬!?=q7 3ƒ¾ý4ÆEýùa[î6—:¸/íôö99»*Þ€góÊù×#·tÒ¾sõu¤CÞC—rò¤?Þ=ò<¹x¤½ú¼ßJÁ޼˜•qC7CKú&zÚvùÜy¤ÿ>×cRw‘‡Þ,EˆOÿÜj<3Ë9Íg]aä°‚ÜoŠÕǾuzDîÑÛ¤HÐM}Ή¶ÇZ«AdÌ8¥srík1n¼U»QCÿ¾K £í¥Ë2(ƒy‚¶Ý¶2–2Àöm}‡‚dÂu0н“>ph =”vÚyœyAéF*m_»îöLö“§ÖÈ’èxTùR>Ê0ÛSöP³O²wo?)5€}âá.Õ)®_ÞNne‰=<ï*XÆCUr|åóà!Q6`×ç 3†pª±î£¾‡ îÚ™KÑ~Bt¥v1º„Á…5ϼ~ÔY åk~ðú1yAä! Qwìeë»7ÊùÅ/µ¾8ö–YEnT~úy å^ CEÕ0´2ÂE¥ϦD1ÑÎÊNSí¡ÉNÒv+3&û-¤thÊYÈ6ÙÈ[NÚã3õˆÔ©6Lž¯ñefõj.õÌ‚NgÆ5þ1 J“f"³g4AÐ`€:¯ÁST# NÉÎk0&û¿Ôà™~ ÏŒ}Fùü”# ÌÇ-ÆãЧQ÷œ"#¨Š PçyŠj¤È)ÙyEÆdŸ®Èw>B8*+µ<øIYÅPÇeÕC•ÕIªƒ¬ÈÎÊjDöjè)MjÇðÞox8Ž”£igc¡ÜKùдΘ1ãóë!G>*ÿcYÛ“B 7?¿1gtAÐQ€:¯£ST#MÉÎë(&ûÿZ¸Â¯¡Ä™êb¨ Pç5xŠj¤Á)Ùy ÆdÏß2Ð(}’t^‹Z¤áeOÒ¢yvTù/µ¸XJ ˜³<Ÿ\ö²ÿD!SÔïË”ÿNKEݘôµ4þ+®SVŸ…Îb¦ü—|n¸÷Kÿv¯Âp´.ÛÕ®º¡¯3€ÔMó€_A=’¼iº2 *º0 L…ÿ1NÌÑlyÙó¨G¯‰ÿ<©EFoc§wòæPdNŠ-Z|lîwçAQÙQ†Î_[–S“V «¤]púÒô1'mî>,hðcdÜ=ü2~àиñ¢ ÞÅ_ÁÉ”pã>3sp¿Ð9¦¸¢WÄÒ²Tkk¦oâð4©ßÇ‚?QÀqâw¬3|³þÕ?ü¹ìàØÔoÖŠy HfR+ò,0…gäzÊyÿ]í!ëÿ•p|endstream endobj 1392 0 obj << /Type /Page /Contents 1393 0 R /Resources 1391 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R /Annots [ 1396 0 R ] >> endobj 1396 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [417.8476 110.3446 466.5943 122.4042] /Subtype /Link /A << /S /GoTo /D (sample_configuration) >> >> endobj 1394 0 obj << /D [1392 0 R /XYZ 85.0394 794.5015 null] >> endobj 154 0 obj << /D [1392 0 R /XYZ 85.0394 769.5949 null] >> endobj 1395 0 obj << /D [1392 0 R /XYZ 85.0394 749.3028 null] >> endobj 1391 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1399 0 obj << /Length 735 /Filter /FlateDecode >> stream xÚÅWMs›0½ó+˜œà Y€a|r§m¦“IcÚKšÅrÊ Gïɯ@ ܤNÓÉL‚–§ÝÕ{om›Hü`Óõ ÀtvÍ83y!Þ}4ð´QBctHÇfxf¸låò!ò}l†‹3Ë´EdÍO¾|m@\dÏm€}Çõ­ýOÓ“pv*ã :=øncŒ­éñþì µ¥z8œMí±c…ßNgsû<<2faÓiû4ѪÍKãì™ q¨#Aø®y#â ff8.…®C©Š¤ÆÜøÚ$l½­·jÙÁê =ÖÑãУ„ÖôDqj!+Y•Œ¯¢´Ëù Ŀш8“M0¨‚>Äíàã¤"Ct…FN7=»Õ¥ÿe’¯@².ÀE~1ÎÒÉnóuorTU ` ×%5B¨¶Ë0Ö‡%z™ó›ˆ/dÖ|•ÞMt¨ÑH:è2ïO® Ư/t-lvWo{‡ Ý‚Zr*4ÐÂ'ºzªë"ÊÖ)“ÏQšæ7 äѪX2.c?‹V¹¢€‰%Ö‘ ÛºÑr%¶õÄÓÈYQò$.åêòŠñ»M_qÌ -k²l úðÌ´“g.û‹F8‹¯x!>÷d[z!¼§Â@ëcýè4Í„Y” ÷B ]­:^#öФd²Û:Œól¯mGµ©s€ònÝ©¥¥v™¨†ö²Q¿ÈV9¹2ÏÔ$‰ <*“kÖ(–§We£@åÚ§meg@ûšÀ-Vy[ãm™ž­úÏZ-Š4RÜõ]u® /uy抺ԟLQŒú5´ã"=6ôeD·Òü_Æo¤ð¶Áï °Êù^7½M…É»ÍÒî³óêÑéÍÀKˆÅ» À¯d÷ÿ MÞMÝ5šº°ºûj.½¨cç+öÓÎRß'Íí™Ö홌}èø"ɦ©ªsìõ:Wwñ~ë¿ǸUendstream endobj 1398 0 obj << /Type /Page /Contents 1399 0 R /Resources 1397 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R >> endobj 1400 0 obj << /D [1398 0 R /XYZ 56.6929 794.5015 null] >> endobj 1397 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1403 0 obj << /Length 1364 /Filter /FlateDecode >> stream xÚ¥WÝÓ8ï_ñÔJ$µóÛ§…]¸åqл@È›8mtiRâd—ºÿýf~3öØÜaðãNy,ÈB'ÉB/b¿ÒÀßã±ÿl釆™!3õø”ùïCõ~àeˆô‘zùŦÞæV;å®[w#;yF]¨Õµ;?è@ ν,Š|Ç%‚êÊó¼qù8ÿ{¹$…Jlwµ$ZÔu{ïöhT‰°"SÑ´D·ÔI8RGÆmKM¼ ,û&@›+…,ÅP÷ôñyÝÞ¸•çR)ÛJ²:5&E³?c‘Yì¤ê»*7&s‘oäO˜t' ¾žÔÅIüÇît2:…[à,Þ"¿îÄwÊǵ֜½bmµ¥jqgÈ  l1i¾–x¢ª^rO~Ñ ¼¼Ý>y¤üÉÑ~¿3«·°Ádg ²¬Fžl—d¤l[màâ'ËúQv­ÎÚŽüÿ €Æú{ñ«%Ùx4~‚Rl®¶‡Cë“9Ç>áÙüi+ö·ïò_ò»Hž´˜ÃyOQܘ.n[šƒŸ€¶0ƒE( {°­ï‘¦´(†à‡!7²x6¶¦ýÈÏCu'jÙLúT;±« [Oc غ–›ÅØ‹cQRtù†p9³e±•cg<îgþω¶’8/À¸ÃC/cߤú|4ºƒ…Ë{¸·XRÖxB[bµ© úü8ž£ AmÚ®G2š¯‡ªÄí[3+û¾jÖô1ìh\-àâ„õ'r“`‚è‡nÁÓ¹4&0+èžÉ$˜€Äɘ8Õ ð®ú½qÓpŸÝ¼¾òˆ¼ém°Rå]u‹6ÍóhÖㆡG,=k.7C'È02‘SaVÞ˺>álDo1!(bú *˜ˆ‚¸%Ö6EU"·-N7F_)€{j+•ªÉë¡ H$¸ZmEWÕ{úTÃnu‡Š’˜JXó5TZ`¼‘&”ECނωC.·Û¡©rI(‘ Æ2Obƒ™vTPGÐÊÆƒ^O•úp±ê«r¯Ÿ O­'®(e&½úª€=YæÎ„$lg% .À•ñù[}êCgÇÊOÍqc#ïu,@¢]Nµ@I£¨”†íÖÕºŽVÈ M@FodøF-e„0Û²dà÷S¸¹¡k~MFµÄº•4J–CM³”%`{8ŪÜHì ÑKL æ—Ä£´ïéãÓ© ñ¦lÌ.Ù´C]çÚ¦§‚7nœ¿\ê}Ÿ¤fß'Ùƒzä’£4>U¹„J9$iè‰}óÆ5 ÃÆž9ò'+eÆF z{ãq’W°»Š8ƒê&' €n¿ëÛu'vre‚íÙD¾-Dv¸ºüò“ôá &^¦¾ýµ°ØKý,B˜yrêùáíú­ëÿP6Cendstream endobj 1402 0 obj << /Type /Page /Contents 1403 0 R /Resources 1401 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1354 0 R >> endobj 1404 0 obj << /D [1402 0 R /XYZ 85.0394 794.5015 null] >> endobj 158 0 obj << /D [1402 0 R /XYZ 85.0394 223.4026 null] >> endobj 1405 0 obj << /D [1402 0 R /XYZ 85.0394 185.2496 null] >> endobj 1401 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1408 0 obj << /Length 2265 /Filter /FlateDecode >> stream xÚ¥Y[wÛ6~÷¯ÐéK©“%‚—ôôAuœØm“fkí¾4}€$Jb‹CRv¼{ö¿ï  H‰N²»ö˜Ì|s£ø,€>S‹R‘Îâ4d*àj¶./‚ÙÞ½¾àvï6ùÃ]?//~x%ãYÊÒHD³åv@+aA’ðÙró§Ø(ÞòöæõÜ\¤wy½x·¼ú¦*€-´añòsι·x{yõ’^½|{KƒWW‹yzË¿ÿqu;ÿkùËÅÕ²—oxHîÓÅŸ³ \å—‹€É4Q³˜Œ§©˜•¡’L…Rº•ââöâo=ÁÁ[stR'<`BFbB)BL)E¥,’B¥¬ëªkæ<ñêbîË8õîhvŸo² ­¬éIZÃQÞÂ3 ¼­nh¡=ÜeM^7¨Pa”ÆÞrŸ¡v@>ApÉd‚÷1Ü+8¸ÑÛ9”6T,il7Z©v.{ŽwuÓµ§¢Ýçšãùs ›¦‰°dýœ¹b±޳®6tDÀ¢0ìÉhœ&W]sN³ë7‹Kÿöz!”}mԆݽMÖ®çÜkòU¶±Võ}fô‚íò[]í2 ±D¨¥‘Å+M®]fâîsXPÒ[:zÓî!>~åt¦ÛÜm!Ç½×œŠ¼·ug7w{ݹ‘]*õç¼<”=YµCc#µîÚÒЪÓKnò]æpD'Ÿ[œdNTœ å=zÂdltž2ÈV-D„{BJùšžûR¯}ð{CÒ¼XÑŒlì‰ëßo—öÌÀ=¦7dN^“:¯z£H9„tšwnÇû ÅTªJ%„Û[÷ÿu(À3Égþ±»&¿ŸN ½˜¸Ïã˜ñD¦cÔ˜‹´ý¦¸R—^§¿?«[þáS Å‡Íâ§Ÿ¾„¼d€¼5?¡W%˜8ÖbÿOJFâëª>××1C<©±©ÔwTTL¤aSÄ]tñ?æ!ã±L2•øÞx®çåñXÓôh#CæØ§@Þ5Õ ¬bÜÂÈýÖMD€}Öc0ïÊ{S·–éâöòæÆ66m-ã>:Âä^ùf*ºýP&ãó˜ÄtÛJ‚ ¼îœ\ÇżÜ3œ_tù]1º[âYúä'¸^‘z+˜Y\ƒvÑïšÖî^‘‚iÔj¨­G"%CÓLÜrd¨) –…-aú’ð˜un¸(Úň¹¹t{«ú¡¢aïV0&.00\àÙÌï`׺=Å•Ãn?Už'‚É(u%`Y$&° Nƽ“š2:Š`ļÐvmÔ#jz #l˜8$R$—!K IœägÝéÉÖ 8o œ'^Öw}ôé]~Ø܂ŜµŒœðü¹/ß@—Ï74KJSID@Mã±68„5b ‹íº¾ËhÍ`žÐÐ3z¹ Ñ¡‡$Æ2MW-ö™´Rf€á*oK{`_ŠãJkˆcLµ<îESPhÚ}Q¿oÀlϯ–ïæ\¤ž­„ÚÖÕD]VdwûºÊì<ëÖßjimsSA3VNX'kîÉ7OšK×Ê}?Wʳï¯>çmgbÜW£ëM©wØÅž·A2a‘ “¯÷SA”ª/6Tà¾RÅr@ÉSô"¦¢¾‹ÓÃóØ£´¤ŒÓ&è¤^É]°é«‡å¬ïs‰Ô܇ýûvêS‚â,”S¶W¶®«í„ìdì(rº e²À¡yLÒ»vh¡¸Jû¯çÕ¬Yù—¡CÐŒºØÕMÞí˳êùǧb1z6îýî©¢â;:êŸ0¤uÿþqUëX“„'¡?´6‘¹!ä";|À©m»|)¸w›Sº†e[÷z†Tâ ߃û„£­¥k æÇ…š&e BÀÁ¹±$Túq«o€ßogyìǸòªºòêƒäQßÊéÕïЛaÁÔÂÁêÚ`åØ ä÷ö#kñK¦KÄ%šŽªCÚàÊhâiHN±W@íÅ¡§½zœÐÎ º¾¨•²8î=‰’»ïÇ9Þ%ê­ Ù³Î+²¬«:Tä>zØä¢âÞÆ»*ÿ§ ô¢´ ô „®ìNgx8»u+–ª‹8¶3й=¨©¶Õ;w"ßU„¨Ø~ŠŽRâ×êçSîˆ(•AHÅ €u¾}¤1¡È@w6#aþ‚âçfû¥M´d ‰¯ë5¼=˜˱AãgDdè<¤Õª=¥b¯‰ãÕ™ˆøIitAÞ5¼={êc¼T ¿ O|:ú€÷¨?þ2ÆL&‰˜þÍrˆ=— /À“3ÉÝýsÑÿeKiàendstream endobj 1407 0 obj << /Type /Page /Contents 1408 0 R /Resources 1406 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1415 0 R >> endobj 1409 0 obj << /D [1407 0 R /XYZ 56.6929 794.5015 null] >> endobj 162 0 obj << /D [1407 0 R /XYZ 56.6929 726.8027 null] >> endobj 1410 0 obj << /D [1407 0 R /XYZ 56.6929 697.6944 null] >> endobj 166 0 obj << /D [1407 0 R /XYZ 56.6929 648.8841 null] >> endobj 1411 0 obj << /D [1407 0 R /XYZ 56.6929 624.769 null] >> endobj 170 0 obj << /D [1407 0 R /XYZ 56.6929 472.4047 null] >> endobj 1412 0 obj << /D [1407 0 R /XYZ 56.6929 448.2896 null] >> endobj 174 0 obj << /D [1407 0 R /XYZ 56.6929 356.0575 null] >> endobj 1413 0 obj << /D [1407 0 R /XYZ 56.6929 324.2991 null] >> endobj 178 0 obj << /D [1407 0 R /XYZ 56.6929 275.4888 null] >> endobj 1414 0 obj << /D [1407 0 R /XYZ 56.6929 246.3805 null] >> endobj 1406 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F39 1178 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1418 0 obj << /Length 2935 /Filter /FlateDecode >> stream xÚ¥Z[sÛÆ~ׯà[©ÙnÍ“l˱’ÚI%º34‰ˆI@!@Ëj§ÿ½ç¶à‚„¬Étø°÷³g¿sö\Ô3?=ËâHÙÜÍÒÜE±Òñlµ=S³{ûáLËœ…Ÿ´g½^ž}÷Φ³<ʓ̖w­,RY¦gËò×ù›÷¿,/¯Ï&Vs/âDÍ/Þþã\k=¿øøæò-½ýxÕw—ç©›/?]_bÊaž‹Y¹üéòŸç¿-<»\ü…gÐÊ"sœýú›š•p”ÏTdó,ž=BCE:ÏÍl{æbÅÎZß³9»9ûû@0¥¥S˜Ä6‹â̤ =Ó:ÊãØŒP‰ó(±Æ*°"rç ­”š_5]¿Û¯úº¹gúuÅ•›j÷¥ÚIgËå§®:šõSõ„ˆÀ¾&†šÁ`ät–Ò†7u³‚ùVeóÏÕSǵbw®³9uçón-Í’o«þ±ªnô-WÖm×Ëê¶Ù<‘_AÛXf:aëÛ}×3ý[íÛìð¸öäŸa©o=+\=pY<_Âfph<æ€5ó®ÝlÚÇɺã²(K蔀†»–ˆ;Š5¹ï¶%¯ K>“–Bßc»ß”~G++ðäU9‰ŒŽÒ\§§>ƒT{òLêwèŒ/ïŠíƒwÞí÷Ûg˜Ï¤éHßB©‡·™rz u?ðÉÉ“L†‡ÚÙÈ(ÃÃѾaÄG8|3ô{.ºc¢xzá¡^>A_¯¸Á»{Ê=˜oj$¼› ºOlècÑzÐÛ§Q”5—r ‰°ŒqSö G{0\­´!Ƭ3ö’Ü2\äÄ%cm¹©ªã¼Y+Ì•‹áJÛH¥Î`˃»ûW®ƒ”w˜¿pÊrvJ—X‰ãÈ À¬¹–’,Ê3ðBá'¹÷0ë%FR¹1‚Î7”PYw«}× ¼µÇrß¶>)•ðØV_k —OE¨c°ÕÆx[Íê¶xh7õj*IOÐäZ!‡0iÚ‰ZÈ¥RK·éȉ&âD/w»v×½ìÙ éTâ®+çÌÐGÇ׉7ŠÐ3h7Ôƒ°Z«¢áÉâJ!½ârЏ´‚L°Øp£Úñv;´Ú&Ï0 âÙ}„ZÇ»H|=tu+›¶YL¥Br¦ûqxYÀ¦¤¨©£ ÛäDúßý|ýáòúš‚²l)µ€öÀ¿rÐ%á¹ã¥¤hûEhwüö‚£¬SŽˆp•=ø+È(9"‘uÏb“Y?)ÛTÆ›AÏ}Y„¬‰ ›$ å.À8:FÆ­:0{Æã€ñ!7ÈC I ¨zÝ“ 5aÔퟖˆXëi5eÀ¡8â‰sNä2c.WyÎÄÜÄ|”Î&>]XCÙ%¬-Ö¤¡¶àÀð u¼Âà#Xh,­†±Žæ5\î›ÏMûØð*ŸRáš“lûÃÄŽ—±–ÁÊ’m&ã<ÎZ-$¡"dz*ˆ°Pkn®Ú²âi]Õ ‰–Ë×oñù•S@ê!¡,x…ßB„æ€ Ô´ŠWëAhP<§E¿?¼&ò`U*O*ØG »¾›m1½U*ÿVy‚3,œU*ÏŽÉgêÆhC!"dž®Y•Ž…AAV¥„섹"œ]Œ8ň±K$çcU¬…»ÃÅÄúćÕˆ¡!'q1Âê­ µû¾«K߸ã’Ï‹Ó1¼¢CÂ"J–Ö$ÿ¶™@Öʃ¬ùËbí!°Æ[êA³TB ý!ÄЈµW^Í&Kuyõáò·È²ŽvÃC teO¸yF'ŽÄ±>àZþFs zミ£Ñ¬Œ1ÀvžPñ´(íº»ý†Ì'ÐJ®I©xLYÂ@P!N;VºÑ¢OÕa{<½Jxn¬ 5D¿wÄnÌЊã ^Ö æÐüy‰ööâÓò½—bÅ~ íô8júzW±DjA¨ƒ/„‰‘p%«DBàø¯?GQ†7y¤ã„ç³ÌQ»<|߯À ø¬ÖESw[îåúá`˜…c÷US¡›¤€ §ˆG¾Ÿ`÷á¹Öò=é{ öÒ÷rÜò0F ;Ráû“Œ43€-Ȩ£ìæäÃÇ€q–ï"¥´O2žÁ Ò*­†'Qg Höî‰kÌŸ­òZ–ç’ìäò¥`E˜ C;^PttÝÏ5-[k`N.0§Å`¸ã%’—!‘¦ 7[døÙ/ÏŽl©\˜G¨Ð½7Þf«ù[Hï4?ÝW‹÷Õf³¥ëèSª¯¨÷•g±¥§Q:xçÙ: ú}‚XÒäfàªâ‹ì]pÇ4 8A„òípc´Œ®W±é×íþ¹³h„k¶ãÆÔ”|+íß8L|[7°?ÒÂ2 ò-?ÎCño _iòvËõT‚du¹|Hyž¿ª1¾ð¤ Ká$î´ô‘…»‚H½R”hcð|æB±­=„” Wào8¦Í9}‚Aìie:l5œÑJ"eò£Ðú™›g 1O•Ñ/žÝ©tôÎç'ù‘‘ÉŽŒLîo*ÔØ»ù¤eø{”Ljeñðflðe]åÉø Ÿˆ_–œœž/Ëâ÷âñÌCysI/6ÝÑW‰}wüɶ¬6Uï?J„@>Žù콟㿇­ ™+Šü¥n÷ì UôÜ¿ ,$ÐÖN½G¨!Mÿ¿ÿypø«…K#›eÏ> endobj 1422 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [101.3082 379.428 169.9802 391.3282] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1419 0 obj << /D [1417 0 R /XYZ 85.0394 794.5015 null] >> endobj 182 0 obj << /D [1417 0 R /XYZ 85.0394 769.5949 null] >> endobj 1420 0 obj << /D [1417 0 R /XYZ 85.0394 749.2913 null] >> endobj 186 0 obj << /D [1417 0 R /XYZ 85.0394 546.785 null] >> endobj 1421 0 obj << /D [1417 0 R /XYZ 85.0394 519.0032 null] >> endobj 190 0 obj << /D [1417 0 R /XYZ 85.0394 364.477 null] >> endobj 1423 0 obj << /D [1417 0 R /XYZ 85.0394 339.5007 null] >> endobj 194 0 obj << /D [1417 0 R /XYZ 85.0394 175.6792 null] >> endobj 1424 0 obj << /D [1417 0 R /XYZ 85.0394 143.0963 null] >> endobj 1416 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F39 1178 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1427 0 obj << /Length 3227 /Filter /FlateDecode >> stream xÚ¥]sܶñ]¿Bo¡&>ŒŸ[NœLÝÔRÛi>x$¤ã„GÒGžeå×w»À‘'ÚéLG3°Xû…ý/¹ð—\ê,Î Y\æEk‘èËj!.`îû‹„q6i3Çúîîâ›7*¿,â"“ÙåÝýl/ c’Ë»ú×(óø vÑíÛïZø—\m¤ÈU½úáúç»›÷0ÔP ñúõ¿®’$‰®ß½ºyMS¯ßÝRçÍÍõUžFwÿ|s{õûÝ7wÎ9/‰PH䇋_—5°ôã…ˆUaôå# Dœ…¼Ü_¤ZÅ:UÊCÚ‹Û‹„ g³néªlK•ÉáH¹&]Ä™’Ê çng‘ @Mf¨vÔ:‡ýÎO7ÿa¤ù~JĹЊ‘†ÃUb¢¾²ãxµQºˆßvÍÔ”“­i¸}‚D\Ò°jÛMÔïÔŽöðÑ–製J¢®nº‡Åò±yè`çò,.„ÈþRFúp´‡'ÚͤéªöÈ'¨ìžp‡K˜Xgùå&IâBkéÖ– `8 ³°$É#8t$[ÃÑÔS[RãH*d´)K·”1÷`bhŒ`„¨¢ùŒëÓŠqè;Ëh_T¥QsO³ÍÄ-H¬rFÞàX¡~ù±i[‚W}7•MçÉ{.M±dö3Ò”˜0Ø!I“(¬z×ÖxÝ ÈÐur'L‚œË gÿ°O#0/‹,º¾ŸeDvhRسŸª]Ù= ×2É¢m?íháP¦¦j†²›uW~äMm×vmºûþ°/§ÄçtêIg6Éq ÂdQDµöMgi8í¸3îXq5mEãé%ˆRª¦ýTVu÷„vlWóèÖ¸•+FmŠØ€ø+›N„öHû¾¶ ÊTçÑ¿w¶£SŽ£³ê3&z ¶„ý&„´6ôv-„^*ÿÛ¶û²[!/•q’eÅ_’g´Q3ò@‹©È–øC6 îšöttº(öVPóθpÂñ„ès¹qP!6¼mmÍG˫Ǡ³*'‡\ÅBj¹ÃÜÔâ Œ$U vDw’§Eá£ÐÕ&â, =pÖ˜ç áwoß½F‚²¨ Æ\¶­#ïô`èÓHT·7¯wð2ÊncDËwô åtdB°’·[5N!5M4¼èý>@j¥y I?ws(¶3Ÿ! •€!fyñŒ*IG«h8nÛ¦ú¼ÁGr£óúWäB¡- ãnr¾ {¸OåƒùˆëŠL¡w£KײÚÑeRw°ôÄŸbþ”¿~ç<ŒåÞR¶Ù9¿}”¶wÀõà—ÔEFšÖ>XFªÐ¨±³å@!.8â ç-kÛ5¶-Ç0ÍkéÒÒAÔ進8lâ,ÏÅ|ç•Æ¨#Á韥@0Á!ÔͲiÂy[²#·xEÐã*ãâ ¢PA¤¾CƒD˜c ª‚í¸íî©%âUÊÄÏú£ë=µSš3`“ßeûtÚe¡!º-"_ž‰ÉNì3É(³~bN“Ýëòp¡)"xt9 ;@IÃNu ÌáY˜‹KçGæ3§<ç´8±ÆEIAç`“ôº#èü%·¼ß}ß¶ý#:†M !šs 9ÅZ˜oàwu¾€ˆZb¹óŒA.ÁÑ9'úè‚â6GlxÉ,föñùrûih¡0¡­²°Õ¾Ÿ#Az^6LØÖŸXU9N k v§¿bÄVgÖYqJ¹ÓEN›Æ2-|M³Ù­\'p<ºH}FÛlŒ™ÆàO…HFñšû£ ?ÐkÔ’ÌRrˆ^ ŒC­YŒÒ:z×»8“iïx3>³“e9 é»$™ÇÆ‹O‹03±¼ÞâÖŽt÷¡¦5©:KõqKCf$Y•Òp‚ €ÇþðÈ­ùÈjê] 󮢟/x†cÎ’LÀÙ>=Wˆ4:Öiáë›M½¦ËÄÈ…FÐÒÒœÓT8…ívNœ·j$Š"ÕABÄy–ŸUü«a2–ñ§3PÇ–‡¶ ¹bÐʇfî*in€ªr(9–+ÿ Ó·”iÂ4°¸â\}B˹ÐÄI$;%ÞúDø8ËðjÚÃ<]˜ÈÀØ®²Ëb¢ÜΜl–kW ²¦43Æç·ëÎ.MµùÜ˦Ï(«-Ô?ÁÆ€Ò¼bìß]T\$i¶0á7Îm¤2ê]X„nÂ)üHpç—° ²D!ÁŸ‡€øPKô‰¦9N´müI2ÚBRf©‹FvCµ6Œ¡’DGõp<½*À6#‘žÅy_kúÿ3è2o^QAbk8^o e‰WnûÁD¼Ù„Ùæ¼n Ù\SØYíiuÉ0dåºÈrŸ>Ç 'ÐßSúj˜Ÿ°D_O§³òAù…Çæ¤ˆ¨ÙÙ¤ên„›½Æ¡ÄXÙ2M‹dùê ú~yeŽ¡hö¯XN%:Û ËKò…¢»‘b‘°á˜å-…w1RœÞNqæJ¯__Ï® " fÏf©ÇÕª¤$•z¥yK€îò"ºÅI䩚æ'¼X3J÷„‘@ºgÝÞI ´:L]¢=u ‡Dv¯¹É2ÃÅ1_}§ Þƒv‹è—•ýXªÐãgÛ9üø½.ôV©\çæòK¡7= Ü£áÌ(3"”S¿üýÝÍúƒ·’…w†/h; ü&„!èmù¤ãÈñÂøÀbÔYA‰ñN@ÞÊ+9ô»ßÛ®¶|'…ÐcåÿVF‡1¨$3/L,•Ñg ðYk ‚jzˆ«»= ¡ôr/„thB"øoR¦{൤LAî¦AÛì‡Ö¡âhëQ°âµÔ{s÷æ%ugÙMë1=¿W¸Þꫜ¿òïo¯o¸N¾øøA…Pp[(Ш^†–®¢¤&Ï ÔÓÓâ¬3'}?÷äÏã«Ψ|^êò¢Ø~*Q\+ÖeÜA_W Š¿åMÍ k£ øO‘ëÃK/ºÉÀÏlJj鸥˜cc;‹w½™ñº“Ÿ‹úªQb€Vä)Ópt1V„rÃMð·'è¹ÚB…ï"õ±²õ·+ÂK2Pб8~Z’õµúëDªTǨ•¼%Ïâ\ /{TúJ$ ØË>w„ÿú—ƒÏ>œN÷×+ z /\øŽó8«úÁjÜ(,ÿñÃ=½•8 «þXÒЙv¦òsð \}6 óiÁ@È»Ÿ¾û¥ü%Èã;VÅ —A.T¥föµ4ó$N井¯™QqfÂWCdµ|ሰrÃÓLYVêõ ‚$  ƒ6þ·×š÷ÑÏæÐþyÒNUe~æfC‚™Šd¹Õt0øè?ü¶ÏŸ,|(þ̯;”Žñ'+¿Å!}þ¿ùqúÉKšÇʹþ£™›85° å>µ‰g”ûŸˆ<'ý¿w(=endstream endobj 1426 0 obj << /Type /Page /Contents 1427 0 R /Resources 1425 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1415 0 R >> endobj 1428 0 obj << /D [1426 0 R /XYZ 56.6929 794.5015 null] >> endobj 198 0 obj << /D [1426 0 R /XYZ 56.6929 678.9507 null] >> endobj 1429 0 obj << /D [1426 0 R /XYZ 56.6929 644.5195 null] >> endobj 202 0 obj << /D [1426 0 R /XYZ 56.6929 514.5361 null] >> endobj 1430 0 obj << /D [1426 0 R /XYZ 56.6929 481.3387 null] >> endobj 206 0 obj << /D [1426 0 R /XYZ 56.6929 279.5586 null] >> endobj 1431 0 obj << /D [1426 0 R /XYZ 56.6929 251.1623 null] >> endobj 1425 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1434 0 obj << /Length 3255 /Filter /FlateDecode >> stream xÚ¥]sã¶ñݿ“éLèö„¿Ð·;Ÿ“^Ò^[ÛI“&} DJâ„"’²ãôÏw»€H‰ö9ÓÑÁ°Xì÷.¥.%üÔe ©Mt™šHÄRÅ—«Ý…¼ÜÀÜWŠ×,Ü¢ÅxÕ»û‹/¾Ôé¥& “ËûõW&d–©ËûâÇàú/oÿqs{µcDâj'2xûþ»+¥TðöãõÍ{šzÿñŽ_Þ¼½J£àþÛÛ€(Çöe¼–ÝÝ\_ýçþë‹›{OáøJj$ï—‹ÿ#/ ¸Ì×Rh“Å—ð"…2&¼Ü]D±q¤µƒÔwÿôG³vëWb‰8 Ó¶„á[b#jË–û+-Ü8Í‚MÙ”]>”øf‚¼i‡mÙÑÔÏåA«aK ˜$PŸïJí»+•í¾ì†ªìiö'ËåáJÃ)‚œEµÆ]ëÒn.›áäÄ!ßõÞ²8 Eû2gtL`[¶LЪÝ-P2Àž…R$Ú»îò¦~"~KÒ{@`à—ñKé$ƒÅ¸¦hú¾\-€¬u×îê|YÖ¼gÌc“ )·‡ù±éòR–UOÏC_4ZznÊ9=øúi°Ï«ŽFk¶›¬[uO{‡c›ÛÅ#=K^ØðQËCU»S·åñdð):ÍÇ1bÌOR†uÙƒÎk%ƒCO¦qèóMIÊA}µ«ê¼£ h†Àñ4Öá?Aíf8™$@h<­L%èp ¤ž‹o¡3ì˺ZÑ÷8RA¿mxq„.yeÕô ¤eáÞ…¸vp¨~kxû“Û°ªEÕlŽ»ì ¢ñ…ÁÄ„–±vW`^ŸÜ3LEb€ïrÌp:åÐã 県p˜Þò‡¯ÿúíû›Ü‹HJaR™Mí ÀÈw`i½ðØýüCǰM‘‡@Ÿ‚”RwÕ¦±·¶RÞ²üyu~:à c¡•Ñ/™JR3UŠŽùmiš‚ÜgÍk¤Œl^¤‰¬ž›†F9==+•I„Ž„‰N½mžfD†PB§”¨b`¶çD‚CÎbcÎd*ø¦ŽŒ³ß·MQ_´J3Vá 88ûÕÀóþ°Dby¿WfÉÊ °=c‰‚¥F‰b‹€)VcI@oŽÐǪ®iÄ.ȘÓàEê…ÑÔ)|äÀwªÈZŒyté73è@2í|#bÑs¼ Eš)^„¾ëè Ä0‡èööîÃWÏ!’ΰˆEÀ}ë!QOŒ Ö-:,Ãfä×bM΋KdŽ2CL$…4¡skïïfHQ`CQêæSÁñ«-yf& '(ÄÅóã0«ÈqùóÅæó9Q$"“:âE_¤ß—« •±,PMt|˜;a¡Y Žzâ4ž?*’j|dlvÇ#ßx§Á†øžó¬Û[0"ÞH¬û–±5à»cU|dXžü’×çEᦠüòº~²Û>“?NLÔÔuûH^^!­ØÙ`Š/hN= )f˜Ô)r6ïûÃÎï¬~ö´°jè=§‡0xPX³Ñ$‚­>[ÿe™!Ê_óݾžs–J¦"6É1ˆ.Ò( ÞqÈ´Âà ¦Ö]”ëüP,®Üê~ìâ!Ž(°âèq[­¶4ÜæŽáÎÏ>ä,kï»êRKBÁ‹Æ¢=÷Ú£„”}x>°6¸ÐeÓˆ3äi4w&ƒEKÏ)ï,èU-H¡Rª¶±>iŒ¬¨N6¢¿mXïݹÞrà k9Vî“¶™…ŠñUÎFEì¹p&?_8ÁiÌ丱ªÀ Û®§Y*ápv>ñ µQ”9%Rù››ú~G8 Ô§I±D3Þª£ÃN&—OµRBÀ‹âCpŒ­€x>ÀúÒœÄIðÓffªÎ‡õl>vìáömÕ S¯öŒö¾œkÎÀ¯ÛUbsè|~Wve׿”GÓZ?Ô@¢õÍ3Å…©ñ ˜5ð¹äJ‹Pù:w`¤#A!ÂàÞµº ü¸ÕsXGëCîµø¿ÊÞf»´“N;“Ê[x]ÕV2of®¢U"Œ¢iq1¹ù¤ZÒ™:‰ôÔzv‡~˜ædœ#‰>ù•˜\ï¸ñçàêÑ Daµo®+á[3/‰+q™Wˆ+U¡‹ >äuUp¿øÚô¨FöeÜk"\#HÑVÙÞ»/s5™J“Wò*ýÌøÕäé0f=Œ–¥;~ ’\‹aÿM ˜´»&HeΤÂè0—)»b%d&'ÆÞGùͨW,’$>)]™§x…ó³3(I” '7eyYËf®š¡ëŒ_¼jn8ôe8»s4pÝ,ñá:oV[£°çEaÖº3„ñ´¼‰ƒ)À¹îØ’!¹]o+NÐMuXºÐ‘¦"Šˆf¹¨L'¯0„ìÈ ¤Á¶},Á¾±ñm!‰cœ”3 u™÷|8Ý ©8² W:6Áê‡.yíʇ0ëÆ ‚rR;ò9[“$t¡SÔ¡¬e±°µÈùÕb#²Ø×ÛNñ§bžS%§ O(ðòÍóˆ“L$‘Ï"| ³0ÌZçz˜Eø&2åËÏäÄ@5XôH 6Eì¹€àuGÆcç8Q…*¼Ô®0#)b\2†jZœ8F ìÜSbòûE¢Žk¦ÔT+_£Q³y¹[2 tŸ’&ŠÞ{uüÒ«vo?4(ö¶&¥›4¾½íi`WqÓa6׳£ N*Cq-ÆIÞ¼s[x*p×´®®šŸ Œ…ýdµç7]¾‡Z™ìÜ]g¢w«mŽ{±íƒ÷°=)6)Û«ÑÁ[êB)Wè®zÛ¶͢fÎõB2—eÙ«FëÄŒ²qŠFÍäàlyI¹3¾Ó2x)Êrçh³ù<Ë_+äp­CÝ65·#B 9e$Ü>uò—¶ *× X>ÛEpiNq’Œ9EñM(7ŸûÑlŸÂåFs >é|Ê™ ½Ÿjµ†œÏIÞºFxçOF»Ž ';0ÞíÀ#¬¨–¤MûF‡=£m ¥|y¨rÜ~yMƒX*5%‚ nEtŸ|Yƒ*¼fU¾Ä•WÛ» ýß>ýl ãÔù„O{mŸ;JÈûUW-nTܼڵÓEC^±šÕÀ¼nºxðù~Ñ®;Û…§ˆ%"îuâÛ¦®~ædö݇øÑ¼tÆù´ƒèÀÐDÑ–œ‘“k„çjýÄéð¤%F0Jž!L·yÁh{Nø¹‰“lA˜é·œÙƒˆ+ˆiÕ¯rV˜-Z!3ŸVŸoÀŽZÀ§ls-]Ÿ¸˜æû>Ó¯µôafM“QU˜à÷ÓžFPCB¡Qõ[ê9keÛ*!8å+<íÑFè}¼ýœ²sQݶ?Ó¨ow%ܺ@œ a†ÜF´¾k,æõ J'Á›^8  =º§u|ü¤ 3ìt¹§v½g¸”Óþ=!ãö"È‘ÞæK<‹Ã—xöôÃÐS_hŒ•HÙäMõóÅN·ô\–s7ôîSmìÃÄ»êDºvZl\Û8Ájô:笉oùìP ³2ñ dlVÕïóU9†ãÂ3ê ¢èêuÏ$º¾Zrôô“‹‘ÛÚ–GÁbB„½žþ0séÄaeø¨(üTŽ=þ(W>€²Úí”hKæ½ý·VvU_º… /Ú21NÅÝP¶fèi²‘æÅ¶‹U O~šœXŠ0;탆þ[Œ˜É±•%…ŠŽÁ8zjÛtÿ¯=&JEÊ“¨ò…ÂFXŠiºH#M¬?Ú '›ÑÄ­-ºí7üdžض³ôÌvÆ;‚á{¨©<- >Ÿ⪩†*¯öÂ8¥ž<>{÷ñ‡è±û×ßTs½þúO×ß²ûîû§vírHû››õ7zUß.¿Êïïžû‘Žþ÷gæO?Ò· ÿï¿ÿUBÐYÎÿ{Hc54©# ™ªSÊý‘ÎIÿÝ[ÊXendstream endobj 1433 0 obj << /Type /Page /Contents 1434 0 R /Resources 1432 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1415 0 R >> endobj 1435 0 obj << /D [1433 0 R /XYZ 85.0394 794.5015 null] >> endobj 210 0 obj << /D [1433 0 R /XYZ 85.0394 671.4386 null] >> endobj 1436 0 obj << /D [1433 0 R /XYZ 85.0394 641.1061 null] >> endobj 214 0 obj << /D [1433 0 R /XYZ 85.0394 444.8166 null] >> endobj 1437 0 obj << /D [1433 0 R /XYZ 85.0394 417.1342 null] >> endobj 1432 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1440 0 obj << /Length 1913 /Filter /FlateDecode >> stream xÚ­W[“ªH~ï_aÌËê:B](.qbPlñ. ^˜AQQؘÿ>¥h»³—8Ñ•·/³2³²` Ð?X"<ÃKH* ÇIiµ{%—ÒZoðÁS{2Õ^¹êúûŽ…’ÄH<âKúúE—ÈQ„%Ýþ­Ì1"S¡@YL&ÍF¥%Bp¹¡Ê#½9®Ô”)g‘•iBX–¦’“¨T¾xoÊ+ëÆ¸9©ü®wÞšúÂW/ À7x‡·ß~%›:Óy –DRºÐÀ@IB¥ÝG0C8ŒŸ;ÁÛäMûPøB½‹Fa„…ƒ/aAT—D0* DbxŒð=.kÜÚ^;³È<óma”uÎlSr¯œÑ€YKVƒy×nrÙ¢½{7o©É„TAwq«Þ “UÒÎô¶¶±·áô±ªloŽØÛõƒ0[à,Eó´HœÛ³¡¬è£l’HŽµÛˆS(ŽÔÖ¦Þ³¦§E²eƒ˜ò~³p?‹ç‡ê­«üºÄ»ÞÖ¶²J Ü×аʱå«×-Á³KGQÓ}âÏôùlâóó]Ôé-[ÒduX ºÊ!HæcÜgÃ˜Ž—[§HÜ…íQgâÛ».6ÓFxÜ|Ò]n–#“îy¥ºáÅ gÝ?Š<ày·ÙÚ¦Ú÷eåµ1u„³$Í2½Gãv®Šw]hïZ‘uI˜T{]Cßk«Æ‚¬cvJ¼±v¬ÚƒÃe•q›ÅÁTкPÜv¯Ë•¢74ÆuÛ÷´×dóþåÛŸ‰À ž¦ò'Ô|{jC4§ àî»§ø|<9vmë¤Çü,þugãFD@ø¬‚½“# O)ŒÀar'üýNx¢|!t4׺Žâ|Ÿ‹ØµB?³N~þíøÁu±b;ÿÈ¢0?=„¥[eâ“,/û9Æâ1 >ÇιZ»}à0«hÇäFòÎHþó‹|iʲuõWctêR›r3ǬóQS™Wc õùÜe iõòâ—ôì.=}Ï iÉãÝÈkš¦ƒ’¿v›çƒ˜lV”V-Ó°›­Á,­vÌì|±?]ÜMëâHˆ¨. «±Ó5–Ë¡¾ê‹ûË<Ø€¦?Ç‘ò>ÝmÔ!Çqn¯Hj[]cÍ¬/ •­;µÂFûa·³‡Ã"„.—^²¡4sƒþVØ,×3Œ]£›ø±®Æˆ´z¤Ȗ®Y}IŒãõ$n˜ê†z„'ܹ4Äëš|ãP$õ~ÝÉSs„€ïêþÕYØ[Åîœíö›-›]úç¤á;wè4Rûì;êy{^`•›÷åÕ¸zõ-¶Q²+²ÅFél,Ög¬7³³aNº¨k|õ£,OlT$‡º$üã£î>’!¯0üÿ/šØIœøè|/&WBÃAþ/‰ÁH ŸBÌíNCL{P“e<’™ASÿOµ¢ à w Ù¶;4öõQ/#7»¬rh"a0 ðó9]‡öÀºö ¨ÌPÓ4y:«~Q {^K­=V£™Ö3ÚY7îLMœ¹…½=ųË@ç·fįÀé˜-ËS²òv… ­5ÄFÖ6}vyŸï·XÇZ· \¤ùè[C{Òa›¯»£ã¥º0í,Xô­"æv§µæúœFݶ—Ùfª¡åB‹7i ëÕAЬaxì§‹®ª.œq2ºn 5kó}p‡Ö¡š¤ølV…×Âh,:ž7Úëp[·Úq¯½Q %s½†ÂŽÃÞ¼ª`=Aí,ÔŽ'› )ì Dš&›ÉèhvTGiél'#Ó9šEÌJ{œxŠBФ›,=ÇÑ;ÆŽozÛÂ>˜ž4H¼6ÞŠÖo‹þòYbc"ò¥ß~½Úò‹ö·«åßÝj¹4Ã0…÷lx<:«šZËàQp©süV„øÁšXoßï³/ìµB»9ê¢Qò½¼8þ¿šE!b$‰pų(*P¥@­+—T×cù”ø¬êû$/ 8îcbE裋ё•G” iÇ!€D.÷upsõÎ)1„§#.e¤#0l)ð;ÇÆ –uú•›_Cu T„b ¹3¥mj€“$œ3½¬ï®~Á}ƒmïPI‰¨C¥ŸžŠk¯šïNñàe §ÊEíC‘†FÌG§Ám>©!A*GëÛ¯X>ym²sûw›ªn¤À¿Y9ÕŸìþ1ßq*”óÙ$'YñCSRA¤|Ë+Úƒ1GÊí0ßß[ôFà@ùä¯Î]ÓGί_@ÄQtÊ·^à<NTà=àts…ÿ¹ç;ѱog…Ñ㬨t¾}Œz½ç;?^iguzZJŸ‹ã…N¹…unv÷W=Ó ã¢Ç(ø¨ÞŸ~ú~=íxXQqèiê1œH•<@ÝôòçùGè/`endstream endobj 1439 0 obj << /Type /Page /Contents 1440 0 R /Resources 1438 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1415 0 R >> endobj 1441 0 obj << /D [1439 0 R /XYZ 56.6929 794.5015 null] >> endobj 1438 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F60 1366 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1444 0 obj << /Length 2466 /Filter /FlateDecode >> stream xÚ¥kÛ6òûþ ¡Àò¡VDQÔ£p7›t›ë¦Íº=¤M?heÚÖU–\KÞ­s¸ÿÞÎP¢¥w@°Àj8g†ó"-¼þ„—© ”yì¥y¨P(¯Ü]…Þæ^] ¦™[¢¹KõõòêÙK™zy'Qâ-ׯ,³LxËÕ/þõ7‹ï—7ogóH…~Ìæ* ýÅ‹ŸfBqw}ó‚¦^ÜÝðòf1KcùãÛ›û™LR«r^D÷7×_òŠww‹ïn¯iðó›»›{žXÜ1ÏÅË™Èü7ßGK{ûêîöîÕì×å·W7ËAM×"”¨ãïW¿üz+°È·Wa óLyO0‘ç‘·»Š• T,¥ÅÔW÷W? Y³tÊ´JfÊ¢t¶Q4e[•‰Œ¤±mWm½b­;]¨®¦ñ‡¶ÑO۪ܸ.ªš ¾¥ïcQW«¢×̦hV¼¨ª™’¸öÇCÃöƒãTÊÿé%ZuqûÏs~ý–(ëJ7}€f]ç" D–§Fð·ºÛ·MgäËbWœ`é2EÜc¥ãùö@@ÑðŠvMô~Ô‡¢&$ \t°j•K¿jÊú¸ªš oXu Ìdäë?ö-Y1¹Ý¦jÌþ¼X»˜êˆ W*2êôlx³[œø~”ÿ›>`íàª5JDZߴ=¡vEogÉv¼¸§ïÛ·f²ª¹ Ù´kÓC§ téÿ¨"ZO**—¦A˜¦ñ§™Ñ˜18,9g6fKfA.”t#zp›µ—‡A* K&i¤IÃÞ¡¶û*‰Š0PæCCñf6O„¿„ÿ‘sià RJÇ*í½ß=„qžK"r`£ìhƒxv»‹¼-hä9JYÆs—³Q* 4%"´IyI y*Ï(Üÿµ5Ç*­óJˆëYNfbÛ8+Ìt©+ƒ7!"É ÍÄà§°r}0>*Ù»á{l(Òü‡™P>º-oXôm —kÌÉs*œÁYÉQc¥‚å2‡(‰Ð?vf”øeÛ¼Ã%Ç)CñTõ[š5Z"Š8YdÁ¬†éQT$x ‰SUÓÃʪmŠº>Ñ|­×ÌàØÌ§‚’4‚R)eâߢÚjH8 ¨:Â=Ì¢Ð?LE`ój}⬵ö±*ˆb0®R¶:(÷üìÜ”ægøOÒγ=¬:ÔêËɬIG“fìX{!ìœ#ŒÀà}iŒFMK_“&ák·2ƒõL†”]Ö嶪Wc1Jƒ\F™‘ãKˆ°¾)Ô…ošxL”ãä‰ "‘D%¸!ÑœBD¡d’ý¡Y¾Únf”w·u‰_Í„ß1HÙ[“%çQ”â¢ælyâF eG_HÎzßkÖ|ž c×o¾1Ò=¡ƒk´u Hø]šƒcð·§/è å‹'YgzŒ]wÜi†-¥UɌё_Kß»†>|¬ôU€Nϧ|ªê­Cü[—}wáî>û2u»é,оúphþCéliùÁÂ^¹KXÂúâû(Šmñ5ÖŸØÓ­i]¬¿Bã£WH}&[nlZÖʵڨÍó!v&›J@a «WU áŠ&Ì(±ÚVb„Ñä8GÛàÞMbùïC~*@OÔˆÏ }}‹ý6By‚OH땈²&Âl"D¹¸vCSçÙœ‰"¡ÍYR30¦¶öúöâć˜âÐ1¹£ÿ”[QšŠËªç)4݉ôÜŠþ™]v$*Oro>Þ>¯‹9o<”HÆ OÄŒ“ȽKÄI½€ KÃ% Ž7 //Y§¦ØU%_²ðJqyOXûZXKsÕûÀ±±)Ž6‚ UBQ´è¨PaH9¸`À‚ÆIU1ñ¾…Æý¡Ö4k<°å¶h6Œ+µ²rãàÕX˜›\Ãõ¬-v9Úš‡°Ñ'Šò7Fm á4ý§üvê2Æ·¢‚;ÜcÇ }ƒ>Œå“ ÖÁH^ºÅ °i…ÛKÂöºá$Ïía‚óºmàjÔ½9÷OØéÄéÙ7}~*"£²yF'®RRSY=á\'¤¼¼€Æl+.ñdLú‚ÕÀ²â™þ©%à©8u_a`ÍKQ@½.pÜÛ»®äk2ÜêÁ¨gúºGZ€ŸÏWMOG%P9×ûñ´Û=öp\|™†o‰!}id€V~ð€wºß¶æ.š(ÿÔ~£Mšƒyc;ørº±üX‘ň`/ ,B-ï…ôRIíQuÌž{€*þÒá$xjš„L»Ûæ"PQn;¤×F}pÏ4M@û ¥2ŸŸC C8T¨bmšXØØ^¥I{l ­¬,ÐþøPW%\F2È"cr÷ Mæ‚w¨éiAåX>M¿xS˜Uny†x‘ï,ŠL2<$!9*ÌA@3c ¥ÜdÆl™]Ãtè9¶o0ª$#g{1ÎíÅpÝè7ݸùé¯<—ú;rÚ9h‹'Lž$@ µ†N ¥ƒöíÝ,|ãznÒZ <ßìN|ï‹r¼ÿoõc.^…@ŠùŠŸ[Jè¯Oæ!ÐfÚíuY¡Qôj`ó±—É0â,>sî¼b=ŸPTRe=ü« ns™I¬¹ÐK¨¯qœ9±œ@"Õ»}­ƒ_dñãeq >&w›ÓžW튮ׇÉf•rÑ|߂ÞˆºnË¢~>u¹[W5sü‚3Û3G þbr3¶;Ûü“Œxñ|R«ÿ>Ÿ°,“¦çf»5U]òí®Û¯ï_†Ëil§¤ÿ3MŘ¥_õçæ ÍûP ŠâqC`Ç©böH¤³bÉ—È)¨Ìta*¯ÅâØù«›îDé±9J].(ÜóÀ3Ã…`z0Tv!¨Ë”‰F¦ÂXÕG¤}ûË£‹ÄäŽhÆÖHgâ it]›N>ñÍ”w}‡i2._€8xÝäã„+æN®wë‹p¯šª¯ fÓqoH‹¨A(u÷—-M:44‘íOÝ–tøÙ€‚‰`ªŸÿ»…Yš76CV 7Y±Šü:mŰéT6™ Š¿QÜ5 ;áfÿ ’¾¯ ðïS `üuaâg…p0ägÿˆ1Þ*@%™eÑôï2L@a8- u‰ä¥äï‹þ'µÐº¥endstream endobj 1443 0 obj << /Type /Page /Contents 1444 0 R /Resources 1442 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1415 0 R >> endobj 1445 0 obj << /D [1443 0 R /XYZ 85.0394 794.5015 null] >> endobj 218 0 obj << /D [1443 0 R /XYZ 85.0394 486.5796 null] >> endobj 1449 0 obj << /D [1443 0 R /XYZ 85.0394 454.3582 null] >> endobj 222 0 obj << /D [1443 0 R /XYZ 85.0394 412.0822 null] >> endobj 1450 0 obj << /D [1443 0 R /XYZ 85.0394 381.7503 null] >> endobj 226 0 obj << /D [1443 0 R /XYZ 85.0394 150.1125 null] >> endobj 1451 0 obj << /D [1443 0 R /XYZ 85.0394 122.4306 null] >> endobj 1442 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F60 1366 0 R /F65 1448 0 R /F21 954 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1454 0 obj << /Length 3337 /Filter /FlateDecode >> stream xÚÝksÛ6ò»…¾ÜTžV4ð…ë]gÇqÝ$ÎÃr’¾>P"eñB‘²IÙq~ýíb|‰I;Ó~¸¹É8\.–‹Åû„ÄÄ…bâN ¥ž„Ús|Wø“ÕöÈÜÀØù‘`š™%šu©ž,ŽNž©p¢È`²XwxEŽEb²H~zŽvŽƒ;}zyuuvúÝñLúðòóåüåÅ)½üòêòìŠæ—O¸^‹húêåü8ô¦ K{uq~yqy~¬‚Пžþ8½8{K#Ï3úîXœNϘLMÀ³3âvýöìêø÷ÅOGg‹f™]UWáo~ýÝ$ ‘ŸŽ\GéÈŸ<À‹ë­åd{äùÊñ=¥,&?º:zÓ0쌚OGU+\Gª@ŽèÖÝ F… &¡¯@Ie”ûÃñ,pÝé~—ÄuJpœ$¤Ÿâí.O"­ Jx~ö3ÁÒPôé18›Ï)D¸»~æ>ß-_Ïå*<ÿï–"ºwëôùB=ÎÏ×OÖ/¢ôMçÊÿüY1Ó ±=¹š¿yòéâöåúE}ñpûþurSoª½ âÏço梣Òaå3!íûò¯®"üâ*’“°L®O¯”/Ϋl½|Q¿ÙÖ¯¢äÙÓz1ÿåÃÕù핞\_æ·úâÇ[õ³K_¨OÝ‹}üŸÜ~ŒŸ¿ûô!•yÖß&/ƒëtóxzûñk«¨Ò"Áá“gRvöoæ…N$Ýp2SpÜ€Œãý&ËaÅÒUÓzÀUÂwhéí>­jB–{ˆYm…‚ !̾ʊ‘·¢ñ¬¨ê·ñåš—äë;¬aE›rŸ'4n,‘qÑ~ ^k9¿¿¤±¡Ö»R¡†GÌ0+²:3j tkKÍ[Âm"³t¤2ò!@Ko x™ˆ3:$¬Ù"xnâûtðÁ«×¶ z™÷eVE•š †èS¡/Ã1;Ô°µL~s]ß°eÀ‹Lódl±¨l>íŽw•ˆ¸¾²È^pø&ÃúäΊŠuøeW×9{aøïoöïÿQJüÿE©?· :Mt’ð]ô.Ë"¤òü Œ´ûwÅÅù ˜Z‹‡Fa|œ×±f€û‘ÑÓÖ»zQ×¾‰Œw"ã÷„Ù”é=8T°ÊfºÞ “”Å7Ì |Ùƒ‹Ÿ1,zŽ+EÔ‹Êõ(."Ó¼P±J 6®žË}–''$ð¶¼·£h Oï1Ö Œ ð„ÚÝe÷FÁæëÇ]ïóŽiÛÌÍT+"ƒï“F8ŠŽ¼®Þ¡8䩬¼rZÕ,…¢hÒ+wä³² üo®ïV)/Ó÷ÉÖÀÙà¶¥–ø–¤uœå|%06‰€’ü®HñŠlò…úd’’߈£:⌜|{«ÑÀks?mÝ·v;ÁKSü7á_(y‰( ب¤Û¨¤› È(Çp«è¹‰w»YášÁK“C˜!2)¦‹›Ä^veUeË|ÔñÇœt<¤yî4'¾¡0G^PÍh¯©A\pPís“Sbβ¯Ë-È»¢WÎéüvå‡FŒ¥ïø¾Æ Œt‹#9M‹xi©gb~háš3Ds10WXii6Dd5KŠªJW#ò@ÍèEÒ&³åŽ•ÌK…ö¼<@™ó½MÑq +FB²ð\G‡‘ÇœÓpVe±B;!”…Lꌬ VäéÞŠÈ6=ãtÑûv=ÔW«¤£EàõRwÌ>8cmÎ m¯9N7{\iõϱ5ÊÈ?aåÊÑ|GgUaS0€=pNøV°-XD[µöxÙhÓQž(¿lŸ\šû>$h›mJ,ÅE0r@È¥|a‘t û³s7ÂØw"7ÔÝ-Â-S­Lú ³V)é{…É»ÙEÁÀÇô‘€$c¯[—wDDn’ˆ*BÙ¬6”å¾á‚§݇R˜î§wu3Ë–”(¼À •ŽúG 6ÂÄ(+–“Öù†PW¤ Õ–!þŽ‹!Œ\‘˜^Ô„²Þ;œ&ö;~–ºC³I™SÆ_±>Òì>­#Û¢Bp`ʵsW$«Žl†^ôÒiJ&ÿ×ÇÐ ½Èž\޵G°ˆJ“¾»Å“02 Cí6ÖøÃÈQ1ÓD_ñ ° N€Óô"SÿD‡á× J¸Ò*ðy’¬XåûÄh3´;FÓxIY àÖûb…^2γºéOxŠâ}M¼—øYnvpCMô0ƒÉöU=˜uùMÅ'ÒŠÖS¦ÍÌ=5Lñ*B¢ÇgµÚ¤É™§`¶•%3¶xBÍs“€Fô ã²mC·…¤¢l G6Y1e¹JÓa÷ÑÒñCo9°ã껀4tw3!àm§mh©grÓ4ì{»ÏÖ¹Ï@VHP–³¡i¢ÈÑ:ºâô.¢?B+G:è‰S50Ö•Øõ cüº š¦t—þpö®%@!ŽÝ¦/jA( âJwŠ54T ‰P¾@uÝ“Äx`Œ–m¢jÚ: lM.çXɆ¶‚ö…}ÛýZÓÍ­Ëáb)§¿febíJQ/ 7%" $ˆDÑ2ˆ¨"THz\ØýK(;(§…Ál}8Z’aÃÖÓ¶Úpƒ–.€ÒXðÜ+CQ<€EÓéÔè¦ …xÓˆƒç6NRû1VÎÈŸV{£ dXH!9Ÿ„á¦NhQF@OC÷åGÒr êÒöf#f‹±ž-E ÐÕŠ‹!¬ƒ¬)U๊ïî2S¦Àp¹Ç—§ýé“GNÒu¼Ïku›Ì@ØÌ@fÒÔHNpõ‘8Ûª ç3úd, ù«À¥'8¿=ìÇ÷cÅÕó |*=„CÎcm "Ƚ›™û€™˜š¤Ý&íBjsÙ¾ó2Nð(Í |¥w÷q>À<åxl²2êsîH“„(³køº?eÛý–p¦4…§ôhŽÕWzàµãk!û+_Œ×ÚAØO.LG˜…‘ ÓÆÜ5yŽUZ媑ãI%ÿ(§Džb*Û€6{O`ã¦È øÝÊÝÕàÊÁ±9a|¡29è8K—µ…'¼ì襢úÙ±˜’uÒ· }Q—§wsák…v<²NÁ‚ ÎÓÄt‚D˧¥c¿ Ð’1ͽˆ²í¥ÙhÅÜ»1íªLM«‡Ê~ã!`„TíE㹨¡#uãÈù¸u›‹öƒ¯ç„Z j'9¬|W0üúùS6­\•Û-8rl©»Ú$7‹MYq+nÌ¡›ÞYÝ4ë–L @b«1¨IE¤ûž’÷‘ ¸û²/lÖ– Ž+{,¾bé´ýšðÚôgD{/®™./à{‘ÈEàæé`TIÏ%¿Ûc°½4Ð^šØ^š`¼X·ãß1‡ýrkê”( +ûy÷ŠpƒNÚH¹ÏÐ}ioš<‚ýcO_l3áøaôì2ÌB´mÐQ¨!Ý/s ¶ŒA5¡î;fMÈÑrÂÃÇ$ô$)P¤\íYå2ùˆYÍAQÎ/å³ÚE÷0ÑltïaÔÜÃàÝÃ((Í= ŽÙ!bÛaÒÜà •½‡1#fu-éÈÞøþÁÍË ìÇFÑvon A:¼t´}J¼Ï¤;[Ì£v;ÌÙ lz¡½í ›¶Ü C=bê.3^_;ƒäô²œœ² ä¢ÈÛ]WÖ5Ûf±J±³øžÌØ0X@€¨_éµ>Õ¯}ÓûôÚÞgû­í¹&¦×é>ëêWv¶¥¶m3µU+²/ÆS™´m]Ž6y¯«&óï6z>Vh¾Ù%Ý°ÙØä™·{†œ¥örY¢¤¡%ÄT·We'ûfßÙbKq3Ë6îñþ9ß]>vóâ¶üvE p4¨) hr03嬽vÈUt¯ÆC”½¾°â4Û•à¸Ç£™ôµ¨æ¬Tä›'%Í6P˜p5Š£:íxæ‹\›°×VÑU|` 1ËÔt¢Jl[-hßLø(Pè÷-g0Ûð'ë8£VüXE …'þ i¤xu›®ý_þµS[CÖ§¢HŽWÁpx '&,® Rè¡äögQ‡¢ÿ†Î'endstream endobj 1453 0 obj << /Type /Page /Contents 1454 0 R /Resources 1452 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1462 0 R /Annots [ 1460 0 R 1461 0 R ] >> endobj 1460 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [411.5778 302.2913 489.9929 314.351] /Subtype /Link /A << /S /GoTo /D (man.dnssec-keygen) >> >> endobj 1461 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 291.0037 134.1116 302.3958] /Subtype /Link /A << /S /GoTo /D (man.dnssec-settime) >> >> endobj 1455 0 obj << /D [1453 0 R /XYZ 56.6929 794.5015 null] >> endobj 230 0 obj << /D [1453 0 R /XYZ 56.6929 436.3593 null] >> endobj 1456 0 obj << /D [1453 0 R /XYZ 56.6929 405.7905 null] >> endobj 1452 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1467 0 obj << /Length 2453 /Filter /FlateDecode >> stream xÚ¥ÛvÛ¸ñÝ_¡·R=+$@웚hÓl;µ•íI7û@SÄŠÔŠ”ï×w3àE¦»îéÑ€Á`07Ì… f~ÁLG¾©š%©ò#D³üp%f;Ø{w0ÎÂ!-†X[_ýåG™ÌR?Ãx¶Þhi_hÌÖ›_¼7_~Z¯nç‹0žòç‹(ÞòíÏó ¼åõ›Õ[Úz{}G“WËy¢¼õçÛÕÝ\ÆI§R>Hw«7?ð‰/×ËïßÐâß7׫;ÞX^3Íåçõ<ÐÞÍG¢èpïÞ¿»~ýnþëú§«Õºs¨Š@H”ñ·«_~³ hä§+áËTG³GX?HÓpv¸R‘ô#%¥ƒ”WwWÿìvíÑ)ÕFRû‘“ ݆Á,ü4ŠÂ‘r£Ôe(­rQ3j¾„Þ§SñµfÑ> Éy2y}Ú4('P –3@ðã ‰-™õÞžP^ÓœJ¯Þ¨íöŠ]UT;ZO¨Ø:7MCèEÓce¥ÙÐêþÉ¡y“ž=üá¸áÃ_E$‹vO«Œ†Ùfç²¥cŽ€ò²òÌSÇjERÀG‘QÈN ä¿ö¦<𧦘žÖ–wsׇciZƒž¤¾1´ùœap©Ç¢,i{Ÿ=‚e¨êêwCZ"¸cö¶@ÅÂH¹ù*Dz#h·¦uðH °ë—¸™÷q_ä{rff cæPTE[ØûaaïëQƒË`à,a쌊‹ÈÀcÖ"²ö¯°Hµ÷~K@>$áOMKP'ÁϤJ=´0QA?CÇr×e홎5Ž¡ñ%£R¾|¹W‚›}}.7,CõƒÙø4T0u¡B_ ©ì™¬ÜÕ'ÐÂa¾ˆ!¡¿²q M]eµ„ņNJÆÊ´õé- zÙ§‡4d—/]tByбk[f»Irêùq2~ÎñàÎGîüEœíXYHÈJSÔ¾©Jô%ž©|2Ûí¬NÖÐø5 •c焜gm[÷ìHZ#ÆC‘ÑÎæ©ÊENÐóq>x3«½eۚñ廬ψѩœì4¥æ>@üd çQ^¸ Ï86Eiª¶|âX´«è»a€ìU>@•ìï0é‡T‰ /ûÐAØ‘h÷nÏæWfN¬==ôo\VçÃ=º$1ñMÝÓ•ypÙñh2žÕà"…̇՗—¡S™õ+x²1‡<é‚—œybÜ ä!J¾Ïª[P$¸†bJvˆEÅxG»°ŒaÎø;VQƒ~#5eƒžkŒâÛÿÎë„ày]µÄƒMT–ÅOó<ôvùqÊ«€WÃ~>Ý<4å†ÝÒ”¥sAÊ˜ëŽæ”µEÍ×µœŠ9‹Ý4k Óèð¦n»/ÚæÕS|›Oë(T'T"¾kA8onWËõj*B‰ïŠqnWo~^MÓ çúÊ‘jT_ö¡Ji?Qܘ˜ì³d‚º,!*œ^Q\.Aç¤}Ê•P&ƒK5&猶hëE¿"Lð$ Fi°œÒàJ›N…"¹„¯°ÁA÷LicÓ;ÝIÈ.xÌž,H´òÎMG7£M*'tÙõ)6‚n9l‰Æ~á”;hŒ?U¾¥Ì3ȼ©{B{QìQʨ\žX?E'õ§-§°aä²±G"êL;Ó¹Ð?ê´Hš T—›W´ øk uÝ#ÁÕ=.†vîaAœ‚’a JzÊ$ðžê³‹Ÿ†#iË×dpʽ.)_Ä‘b•}°F‹ü4ŽŸ(Iúøó„pÐ=I¥f,Œ¥a¾måínfî;q©©Ĕ綇èú*IÔØ@fJÝRú:HÆ:t¨%õrW`æAOAÐûb­q&x‡ÌÕ1€¬êD+Bº× óÛÛ†v­¡Òʾk(B8©b_Åfv_'çÇ(š „Q¾H“ð¢úÊζáÑÚ ¸' šÆ{Þq…9¸‹dɵ5ê/”®'ìÑô Í…3¶ÑzPŽHöUB©êÑúUÍÙ³ˆ”Ìi¦©]8qyªK8eÖ´ƒ6K¦¦ëëhâjžÉÎ6`–¦;çÆ­‹cÜ'~¸û@û<í ÆñØv­cŸ);.\CT­Kç7á*¯=Í5DÞn?ß»»éä±nŠJ/ìÕÛ‹+ÈžÄ䤘ýã}‰ÊÔ½€>fEK3’\r…Cö½8œ´X¯ÿAÛŸìÐØ%&míÒîtÅ3¹Sú=b¥«ñ[˜Ok¼ˆ³¦‘63!-2áOì(\ц ¹¡kÄ®õm)mikÝ @lTÅoJ¥N1Ê)F9Å`ízG#D ëеâjrŒìßÑå· û½·##Ö9LÛ„Ô—ÖS5ù~,ˆ>"†âÔ”ÂMß+‡ª{B’[jœäeŒñ~‰’Š‹w_òÌr #d²bûDôµÒÐCDk:õêLž}Íé]¦£¦ª÷8 ^1]qô>òâ±WéxÛ#—b“ѸADýØûüé-}(]ù´c“}öÍÐvÞõ¸GÑ7òš£ÉI9Ú}WÁ[ëGÁ–v°<è$¸Ì"Iì§:L_‘E T¸È"p˜¢K#Â×áX}õ¹½=—ŸT¶36.¸Ý?]D›Úu¶Î±ä¶­9]` +*—3šÉ¢M¸bMuÅZÂÅÚêÃô$ùÅ…ÿCÍMyMÊÈö›0PÝ*Ó¤sƒ,ßÛböñI ECÞbZ³=nH8ÃÞ9ctûöqªznÒJÒ0í ªvpùŽ2þû‰ìÈ™¶>MP B? 5&L´ÅÁLPŒÁ¥¤vèØFc¡A?»%¶§+u°‰ˆÕ°PgÇÂï7B$c×z±ˆ—À¬[Œªø0å*žæôu3%Eâ„bÝEu«S?Œã) AÆ&yâJ•€ç Wcý0!›‚"LÉ?~daEãG†ß#SB}"ăO鹡û †é¨Ààb#¶äÀãj^úKFF>þ2ñŠèÕÿýwMÿ7èRjöÿÄŒ4$bÐtš8¦POatÉy÷¿ÎsÖÿtãùendstream endobj 1466 0 obj << /Type /Page /Contents 1467 0 R /Resources 1465 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1462 0 R >> endobj 1468 0 obj << /D [1466 0 R /XYZ 85.0394 794.5015 null] >> endobj 234 0 obj << /D [1466 0 R /XYZ 85.0394 769.5949 null] >> endobj 1469 0 obj << /D [1466 0 R /XYZ 85.0394 749.2278 null] >> endobj 238 0 obj << /D [1466 0 R /XYZ 85.0394 398.6362 null] >> endobj 1470 0 obj << /D [1466 0 R /XYZ 85.0394 370.8109 null] >> endobj 242 0 obj << /D [1466 0 R /XYZ 85.0394 321.6035 null] >> endobj 1471 0 obj << /D [1466 0 R /XYZ 85.0394 293.6228 null] >> endobj 246 0 obj << /D [1466 0 R /XYZ 85.0394 120.47 null] >> endobj 1472 0 obj << /D [1466 0 R /XYZ 85.0394 92.4893 null] >> endobj 1465 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1475 0 obj << /Length 2247 /Filter /FlateDecode >> stream xÚ­Y[—Û6~÷¯ð£}NÌ%E]݉›¦{2™Î8»§ÛöAcÉcnlÉÉ3qý¨‹¥I¦§{ü Aø^¬¦~j„"L¼d%¾¤ ¦›ÃDN ïÝD±Ì -ºR?¬'ÿøQGÓD$¡N×ÛŽ®XÈ8VÓuöÛ̉˜ƒ9{{}w·ºz3_x4~½^~xEÿ|¼^ÝqÇòú-ŸÖsÏ>~XÎ#¶v²wïß]¿¿~7×aÌ®~ZÞ¬W·Ôãó<Ë·ÿš+¥@ÓÕŠuÁÔDü¸"mŸnWwó?Ö?OVëf™]W(©q_&¿ý!§xäç‰:‰ƒé34¤PIâM?Ð"ðµvœýänòK£°Ók‡ŽºVIáéÐñ­çù6HD¨=m}›îÊGSï°8íÍviEDQÖDÑ…ù“)OÕþŒ<=»Ïó‚zOUžU—ô­Ì÷Õ»œˆ?Ë"ÇÐèyc½¤öÙì÷Ä»ç¾íiOs’^7—3òËÉl>;£€ Ñ—,”Ixv}DzªÌý>‡Àj%g?•ÏùSþˆD‹üdf¶ô%{€(òg ôçüÌ"}ÉÇ}º1ű҂d󯦪n3²¼T^¥‡œF4ŽÓˆÂì¶žYúI{1[¶p>Ò]lˆ{È‹:E7" a2íÇ ¯ÞÑH’Ö'­ˆ·µ­ò@Ь9È.÷vyØuŸÛ%· oœuŽÞò(ñ)qÄCŠ<0`€y$²§XOéÞd¦æ1Çüє̿ ‰"|OÎ~8SG–oÓÓ¾Æh$ˆSÃÈÎý¾DØX}›òpÜçuΦ ¯–¬(=W¬%ÝÖ0h$nÏ;³ÙQhMÝ ±¥î9èUºeÊæ|9 ` ówLØÐ´˜¢õoOªØ?W¿}{[åµ@ó P¨icß­õ}!7õ7ž/””rv õWß`þ,o—Ø,vOEÍ'“ñéæíržx³õŠ'éV#˜Ã‹E‡c™á BŸM >pxJPÄS<±)í—GÒ¼02;éÁlˆ{:fimÓ?гS’µÓønš€¦!Þf—–£‚×<|È‹Üλ -L–a–iÅ™£‚Á ÷»”:}hh/·Ù R÷<üOš®ÄÍI³eMlÂ(RÇÒÌ<—'$¥XšÓ c¢t3^˜7’ˆ}ws-]Ðçü6 çÖ–¦ìèã“¢Õðå”Wœ"Mâ½´ ƒöª,ž\Ÿmr¸ÄÀ¥÷sŒ`ð]¼®Ñ]và¿{ ) ÈûG<Óž*˜¥óÏ»È'ÈºÞ ŽƒÀy.çà+Sr‡­_–ONcÃy»òür µv1Dj—ZôhÉi€èîŻ҂ B˜–CÜk9ÈÜ—&Ji‡}b6IC4& &EÀ`ÄMü.1üMpÚœÆÔuìmÙl(]|¶xé¨3\ø2@*Y{γ×bTÉWTQú@šDÒ$r Õ2ÁÃ[cd«#ŒD%!è²[pÅ)9œÌ„Tž¬Yo‚vj] ÄÜI|†Šéà`ÇҧŶ˜f øÇ‰§"Š¢„h,x"J`ýøoAA¿ˆ…Nv¼ ê»H¨òÍéñâP` æ¾`•‹š)}š#¶jΞÀ­yÄ©hû¡U‘y·f»…0Þ†,DzÃX'£²]ÞÈÑAD¡@uˆql×Hv§Çü+ÖF-â:P€kí¿מ§Xë‹Í–¶Byúâ0kÏÓ®,àì°+Æè@–EI*.’ÞaªrcgÍN9ܯ€DS”pÐÓ@С‡ ({ñn¬½Ùæµ9ä<‡ÚÚÆš2<Ï;£ª’zÇ_ž\E©øͪ©›=Ï!c_:~l@iãŒàL²kk¯{xJSÆgYlòWŸ8t÷VÏz ¶áãÍúã§õHz]Àp2D«ö…ïKw<, ¿@hñ#UJ§äØ 9n E)»…ý¼ËcH,4}¾Ù\Œœ,i¯7Ýœ'@ñõƒ;©Æò2z±åg¼X£—ì3xʶmÑ#^KB‘¨¸[êÇ|uKiç³ÖS¨Ù¾¦àÃóêŽ`ðEóY¦ã+±cÂÅ7Ö#‡-`ÒVg€;Ñi}B'h-E¤UØOåƒùJgÙs†öÔËÎPR‹H*ý=wø°?:od%½J*V?9ˆ¸v_à÷H÷ö2°I’M$ƒUYö¥Ú¦ÈÌ“ÉNéžøíU–â#݇Aß—¸©)~ØÖT°ó™©²½%$‰} ¨ˆ‹QÄï}+EÛÊÙ=[ÊVgn àV]%ËÚÕHÙ[ Šº´€®ñéÇÐñÒÿ:øçÄÈ¿²)=û?ö¿#Ž;qìÿ½áE±ðcPÂF¡ý^8°ÜýY24ý>æÄendstream endobj 1474 0 obj << /Type /Page /Contents 1475 0 R /Resources 1473 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1462 0 R >> endobj 1476 0 obj << /D [1474 0 R /XYZ 56.6929 794.5015 null] >> endobj 250 0 obj << /D [1474 0 R /XYZ 56.6929 687.5192 null] >> endobj 1477 0 obj << /D [1474 0 R /XYZ 56.6929 659.2346 null] >> endobj 254 0 obj << /D [1474 0 R /XYZ 56.6929 590.6286 null] >> endobj 1478 0 obj << /D [1474 0 R /XYZ 56.6929 559.3791 null] >> endobj 258 0 obj << /D [1474 0 R /XYZ 56.6929 493.738 null] >> endobj 1479 0 obj << /D [1474 0 R /XYZ 56.6929 462.4885 null] >> endobj 262 0 obj << /D [1474 0 R /XYZ 56.6929 408.8026 null] >> endobj 1480 0 obj << /D [1474 0 R /XYZ 56.6929 377.553 null] >> endobj 266 0 obj << /D [1474 0 R /XYZ 56.6929 258.7201 null] >> endobj 1481 0 obj << /D [1474 0 R /XYZ 56.6929 227.4706 null] >> endobj 270 0 obj << /D [1474 0 R /XYZ 56.6929 161.8295 null] >> endobj 1482 0 obj << /D [1474 0 R /XYZ 56.6929 133.5449 null] >> endobj 1473 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1485 0 obj << /Length 3154 /Filter /FlateDecode >> stream xÚ¥ZÝsã¶÷_¡‡ÎœÜX,@ühŸœ;_âxr—Zºt2¹<Ð"mqN"U‘:Åýë»_I™ž¦íÜÜ\‹Åb÷·»õLÁ?=Km LÍ’, ¬Òv¶Þ]¨ÙŒ}w¡eÎÂMZ g}»ºøË{“̲ ‹Ãx¶zðJ•¦z¶*~¿ýþú§ÕÍýå"´j— «ùõ»Ÿ/µÖóëooÞñлK¹¾L¢ùêÓý Pt&°L+Yùî—×?޾婫ûOËwÓ÷e—¯?\wóã͇Õåo«.nVþ$ÃÓjeðÿ¼øõ75+àÐ?\¨Àd©àC:ËÂÙî"²&°‘1޲½X^üÝ3ŒÒÒ)íY“6 “ õ…z¦£ÀDq8ÒŸÍ‚0MBÒ jP Îþ\ç»j-g'Žm' ¨×›æ Èëü©Ü•u‡ €mÂÁ-©Ù€´ ñÿööÜ€ÕfAÀVÆfóªî—:7Åq]¶<Ü÷ûæÐñÇ#n…3ïß¿e ðÓWÐM“yáäD:0Jç$%NÏEJÙy)ánc“Í?µUý$«6•lûXæÝ‘„)ñ0(¾ÖAf-«'ßn›S+ÇÔƒc˜ óqTÊ0 ÞXñ¬®=a§/e¹Ç^Òçë/Ll¹]oòú‰”‚ã²b}¨ºjoù lyyó–g|)Ÿ[¦žªnÓ;þÈëg¯KŒH¬Sèt›’Çš}yÈ;OnH‹8FïJÆzØå_J¾|/~ |DlêÏJ…OGàW55‘²-ÛÀkÏ3d+IƒLÛÞ -vȾ›o«˜á!³û²m¶_ËôŅqëy­.³pŽrE½\—zî.™è97_yå}€Ä³d¯Ehøp䨖L ›D Ú$÷h ír0møßï‚ ¼‰‘M è z »€tG¯.ž0ÔcëU•O™kDF9se×(doÃ,ŠIÜ@&‘ýz6Ú³Q>Þ Ç–IÇS*b°õØÜ8ö³‚-Lèöª7è ¦:°q½¢BbµXN¨2…Â7K]è¿Ãc¥ª×Ûc! #÷OÃÊ…ÒòÑ”© ¾Côj@•Þ(U`Í~äìÉPä†ÓF£$… {öFç¦5”  üB¢‡9#PÊa3@m RæÏÝJæIÜ™• åû}™(q¶È(ïFB †O¨´.9·¡Lzâg'ðnºh$õ©P%,£•u™-¡A_6á¸{èENÏL¼8+û’ˆÒÍ¿oN¥PýR_/6"?‡='Šë’å²òp5q¸avèrÃþÁc>V jãM^¸w§²žJ)žÏ*å³:Ébjá–Vb¢§ÜÙœ˜lŸA²,hxÁ”å-KÙ†ëVë_ ­¼rcg× -½(»¼Úʆî™ÊŸ×%Ú·]—uµÚt ÿ>LÈÙ¯qœà›G˜9UuV„Æ€Ú³e·ï¸•‡`šaËsyˆD¾Ï¼T‡©pcà€¡ÓŒž'÷D!„(iÇml­±ôBÍ—ÍÕ”•xJ8¿:»ÝÞN|N7Âÿ, t¹´øÎ%«ƒo”²ßàƒ›š@wm’ J£h”Ô±ÝÁZa¯ljà M}h˜ÚTöÇ6•€A²õdl|”®§š_×ÂÔe?HÚääIл}÷Fh Ǻ£B,¥Kcj¾¤Fµ¦R"‘ãK*¹wªÏ-'M]鞺(> endobj 1489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [408.1244 623.7385 469.3244 635.7981] /Subtype /Link /A << /S /GoTo /D (managed-keys) >> >> endobj 1486 0 obj << /D [1484 0 R /XYZ 85.0394 794.5015 null] >> endobj 274 0 obj << /D [1484 0 R /XYZ 85.0394 769.5949 null] >> endobj 1487 0 obj << /D [1484 0 R /XYZ 85.0394 744.1913 null] >> endobj 278 0 obj << /D [1484 0 R /XYZ 85.0394 684.3648 null] >> endobj 1488 0 obj << /D [1484 0 R /XYZ 85.0394 655.3895 null] >> endobj 282 0 obj << /D [1484 0 R /XYZ 85.0394 606.8822 null] >> endobj 1490 0 obj << /D [1484 0 R /XYZ 85.0394 580.8718 null] >> endobj 1483 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1494 0 obj << /Length 2887 /Filter /FlateDecode >> stream xÚ¥]oÛ8ò=¿ÂÀPˆQßê=¥iö6Û½6W§w8l÷–i[Yr%9®ûëo†3”hWÉ.PˆÈápÈηÅă?1‰b7Îül’d¡y"šäÛ o²†µ\Æ™¤™õæáâêç ™dnûñäaeÑJ]/MÅäaù»ºB¸S á9÷ïnæÓ™yÎOBÐà³y7§Aâü÷þa*Rçû;€ñêüÓýý½ú0…³#ß¹ùåúþáö#-‡L÷úí¿§BçúýÍí[ZzûžOúùözš„Îç·óé¿^Ü>ô|Ù¼ /@¦¾\üþ‡7Y‚~½ðÜ K£É&ž+²ÌŸl/Â(p£0 ¤¼˜_ü«'h­ê­£²žë±?"L_LDè!,ÚÒŒ2×O¿—æt&<ïyi6Ç]W?ƒÛýnW7rgøÖƒy“™³, 5q¦úLHñ~¿(‹œæïÔ‘t̺‘»†μ“ÕR6øˆËž ß&KõÙóüJµ4•ôÙ•²[ÕÍvFÓ¢Zª‚UG€ëû;ÓM…³Q4ÎëªÓÖ%r‡ü€²eQDªW$€ ßê@_ÅbQù¾)º#Ͷõr_ê˱™ÿ³d¬Ñ î6ª¡a>ˆ@‹Çµž,ÕS‘«Öí¯–º©Ÿê›½¹{Š'N†ŸØ)Zš>Võ¡"PWèP79݆`Ý¡&Þòõt„ âZ*›ï+šß\$}!ÐùaQæ¹*U#»¢æ}‹šv óD8j;µ“ðž ¥¤Î¼.e£Ù2çkãÞP°à`½Ó׃µkxÀÛ{ƒ:í JuÈêLvÌ7jIZá`¹íêF®™‰Vá™ëéà¿U‹BVý­¨ö_/Çn ·>{íÿL£•²>0Ê\5Oæý}Ï \¶*°\CU›U‚G‰›u{«mT£¾ì‹¶€k?c’±ëGqD÷SÀq(àÅiðv‚FâKÕù~ FÈË+ZKàúh`ÖŠ\Ôûάµ,Ë¢Zƒ,Ã(@Ѳ,¾ /Ìx/JOd»ÛÏÆ¤ºKÚÔ5mCQÑãÃnÿ‚=BÛ|ö­¶E}0ŸÿFòÁ‰íµïG]"gœ!&¨Kþ8BaYÂUÝ­£â=«}Yy{oÈ0a¿£Ÿt, ¼Ðù¥>Œ²®P= àÀ}ÐBpso|5Ž´gŪÖE¥h¬ÙÂAUœ ZâW>É¢” SF&Éoi¦%Ûo5ÚŒ€áýOåÆI€Üu´²‘E8 ¥*û+Ð?›ù¤ 0¿¡ú¦¤N¾ !dx§#zUÄËP~Dê3è/ùT,aVê@++%»=ùë– í>gÂúþ€|÷ž[YoØê°¡Ì9Ú} *°pÂ%'D¥è[åjL9ɱ¦™³“;&˜ Z•¢?¨ÕÒD»QøbˆË ˜ø~È@ЬHlà¼Ax£Ð‡DgS0ó•ôi9ŠéólY,ÙùÈ>3Ú@”ÁÁöÄÉ_Ž=l Z\‚Ê–¨ÔFÑU§š•ÌÁõ»˜ÔÚ!ä<È"?qH:xZ+my¬ä¶È¥¶4\(k¹DžpqÁ°Á (™B3M!ÞtÅÖz$‹•ãbFò"[Ö»ë­ öƒ={*°Ÿ%›>‰&n´;•këá,@GîQZfe¡Ì5ú¦TËg”¯OZ@œÒžpjƒóùT7-N¬óø²Dâˆ% Á¿ÁÄÏ’ øú„ 5¨>Løy.ù”Jw€ÔbCçm÷-Ÿ&U7/…ÚÐKÿDÝ,¬ÔÍ`ý©º½tè n燎«›}(©[’8¯Úb]Íêª<¢Z%}I“$F­Æj°A‡¼T¸Y‹–ôStµ¯rV!€îšb Îâ`Q« €u©×“J¸¨„¡¨(×k—coEye$œRê´2Ïhº­ÖÚaè°ZuRkP+Ö}m×½$@úÉQ”ÀF˜3ÍÖðhVJ£fÔ‚¸Àο«ãAü­±uùN{2[Z¾¹ÿÄ­ßOhT¯:UébLG ¦3Ü)@¦A‰1[ã]GXEÛŸÅÉX=ì /mù¢j…`e‹¾=@`¹0Æ$Ýò+-›Ð”úĺeïñ-û½^õ×#qf…œÍ¾zÛÚNÄ–^ÿœKÂ-}’¯¢.š8¡$WÓlÇñ…Û0Á¨Jó3Sg§,’”D¢tÔzÅÔ¼" H0 ?h¦Ã‘be»ÛSQ‰ Û “Áª-ž˜ààï0Ùó2šGžáZ—û ±}¹o%O’½¿ú*·»’UÛtnXˆf%J %7óâx$YOR»¢ÑóÁу©çõ’Ñô5ð[åå~iµçNLÓ\ &Ô°=h©d«4¾ßƒe7íÑì$ºÄf}êkG“e¡Û`¬%Ö䥱¤]bINªÕ¦QRAÇ„}ÁëŽD8ÏÍÜ”UM¸žëÙ] L0lPp+øý½7óaùÝ×N6¬ß¢ç¯=1?á(9Ú£–|gCʼnõ©gÊ\¯W“–Á5}W?ׇiæëº|îѵàÀ*)¼^ ðÉ·žÑÊ­¢Ò¾½ë%/\îz}‘k±U#`»fÐ~6ìû±pÓ(ˆþR+Zø.DÚp¼ WI7NâÚÚ´ÏZ<4;NI ù†HRW$ÉI¦iõ½bß Oü0uc? ÷|o5¹¢8ˆ(<7 |¸¹Æø0Å;ü±ïÜžKhz‰ŸL|/tÔ’ÜÉ— ˆ1̲€¬±æu\ÝmýÉÛ8šXLÂ3›²f*ö¬|&K]À‚óýÀ £4œ vŒ)¢"  OS?rH“¹W!­3{±¤!Ú­†˜%Ó8¢—\ “hxƒÖ_ ~Z‹3RµÇÑ@¯5,Ck(t¤CpšP7W…öýY‘©FjÇà’öÎðÝï–’R_ÄÂb×[úBPòÁ*hrÊ<îО)³d¤÷6£i1³¬Óö¾­ ÞТJ€ àì· QÆœöjxXYkžÔ IÐM¸w#v ¨æ;(Í— IÑš…w¦¡aŒ¿ÏdéĶŽ384í(ƒÔ}6üôcîÀ¶áÄMPäÑôÝ ‰(›yÔ„~c'e™.³(McÉ(+Â3pNŸõ­˜Lpã!ëÉ%w—:‚ ÔˆÉi4Õï€Ëx4,]²Ïì¨Ì©éˆ†œrìJiÚCO§â°ãî4éÛ@yó|«gvÞúK)ÓÏÃ\p¬ôaÑIsñõˆƒYûšÜ,ø×“ßÏMRöÄ‹¡kýnmºn÷úêêp8¸ÊUm[ºu³¾jë}“«+͈¾ÛÉÆ]ÿÅÂ>åök×HÓ‘éÅ»B>Û^ "7 1Vyzóv?üû¬U9'n¦Ï´LÀà!"s+äËO¿»»ù%wäòÿëÀú†endstream endobj 1493 0 obj << /Type /Page /Contents 1494 0 R /Resources 1492 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1462 0 R >> endobj 1495 0 obj << /D [1493 0 R /XYZ 56.6929 794.5015 null] >> endobj 286 0 obj << /D [1493 0 R /XYZ 56.6929 769.5949 null] >> endobj 1496 0 obj << /D [1493 0 R /XYZ 56.6929 744.3049 null] >> endobj 290 0 obj << /D [1493 0 R /XYZ 56.6929 657.1551 null] >> endobj 1497 0 obj << /D [1493 0 R /XYZ 56.6929 625.9811 null] >> endobj 1492 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F14 980 0 R /F60 1366 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1500 0 obj << /Length 2097 /Filter /FlateDecode >> stream xÚ¥X[oã¶~ϯЬ D oº´Ù$»M·'›³ñž¢èöA–i[ˆ,y-9‰ûëÏCÊ’£´iF¢g8ä ¿¹PÌ£ðc^*RéÅ©$!e¡—¯O¨·Þûfe'ô¥ÞNOÎÞ‰ØKIñÈ›.zºB“„yÓùoþÅç·Ó«O“€‡Ô—d„õÏ/ÿ7aŒùç7W—Ⱥ¼¹CâÝÕù$–þôó§+‰ÓÃ4ÆìÌÛVî;ÆøBCzñi"bÿ×Ûé„%þÇ×0f¹wŸoo?îtòûô§“«igWßvF…6êëÉo¿So.øé„‘&¡÷/”°4åÞúD†‚„R7RžÜü·SØãš©c¾ EB„Ç#ΔlÌ™2&Q£3ÿ5 "Jý6Û"ñÇÓ‰z£ª¦)JR’4ÈòmïÙ;Î{Z©J8ºóͦܣ›Ú•Bb“µù ÉÅV{³^I¼½¾±g–âÈ©Reú7®9°d¸¦5Á.£É`Ã,13Ǿ0!µn/f$àG@D†ÜèüefE5OÏàÿÙæ>o;* pÍ@ F¢4J_…ÆIš†r`o gE‚(œGA—%ÝŒ¡ªCä…¡ŠFXàX;,¼”’˜AÄE,!·ÜôFp& È( ‡‰à8DÜ¿:ö è” ¶Æ’ÁÍÒÞW*ÓT P6¶|`ή×Ü»¬Á"¯g”Sô5£"Úà ã1¡±„ $1alv¬ƒý¦nŠR ÀdÖjJ":õ–&¿PÊK…üu6Ôß#£ª[$fvR^¯a^1›pê»E»r«X±/œK£_(µk‹²h­ÞºÂgV–«tS€#„ õa¥j ¡'~³oZµn&,ô!Á Pøë„Iò»më—J©9RmÏ¢jZ½˜yyó ³EbRàÑ‘Ê`&f}8}Bu,„:n‚CÒû¶øéƒ^Àv9ëƒþy† Ø’pôñ/+‡ÀÒÐŸíŠ ó˹ñµøÙàîîçS|Û”ÀÍr…oEkŸf²ô3|­ê*WóÌä¸92Ë:‡#¬í:M£ˆÅƒ2éÏkÕ8=v¨¨Zµ](̘ÈCœi¦Ý —E0†¡Ù6Û¨–BÎmÔ㪧ú¸+›­5pqx¹>æ.견­‹@áS¶Þ”ªqÊýG+•¯êº±t[㳃¾¸aw[—‚wÍV‘1[~™¤Ü·Eå±00j×(WpŠ©ƒÃ¨9bCYɼ®t¬/wÎGeŠØDx\•$áÒæÓbÀ¬ PJÞî ‹­ ;SëíQA<¿ºEâƒÚë7´ÛíÏEµ{¯Ä<$RDX§Z™à•æ;ezP;B?3|¬ŠåJn-Ö¨¼3[óîÕ‰¦­·ÙR¡Ô\=¹:Õ)êä®E¨æ€ê¡ Öü‡bnõ­,ô³þ*ùv¿iëå6Û¬Š|ìl³<‡Ž`kŽè*û×z èæò¬ÒdÝl»ÝãX½sÌb#¦Ó&èp­+L)Mfaç…ÝþgÙÌ8$¸ñ#p!F+¤öõnkù&@Þ4cV\Ü~&xŒSfúøõóô‚6DÀxÓË*¨«rÿƵªTd@ ÏÆàvˆ™„ð(M8áÐ[xÀV‚f£òB@®YÂõÈ „=2 õŽu‹¬²Ð©d/&Ð@l®ÊâÁ:G¦'Íl–6tS/Z ]ÁL2šeã(›VNÇ\ì¸)M2Ö¤>Sý<Ê#g°åW÷—ùÆö™f:yqE‚pÒÔˆ™# è?;û_5ÐSk"뻓ùnPŸ^/c¼§'u™^t7] ö 3ÑAq$Š»å¹ ƒÑ#rçáÒq¥rÕ4hmˆÁ%FØ„;Å æ6pfv¶ïbß?X n—«ŽÂÉL·Ùu£K3"ïÀ[e‰î:=RÑÏЇ#ëî0_w›‡¯Ù¼±ššz÷ë]Ó ±VlSÉ«1;~ÿ9;œ]ÔÕ¢€º§p Ôç,U¥¶E®ýh®UëŽÒ»‚½âJ›{ÆðQ•­Õ)CÝvY_Ù¢Ô¹ï‡.)¾4©ÛÁV-ЧãµG‚2pôï¶‹Ö´ {í ìǶ“ÄßUH›nþy‡À¨$IýÞ•ÖÙ½Yz›”BG!¼h¥Ð4jB¾¤®›1•¼¯ÜÌkêù2R‘ˆþ2:Ð3ÁËF€œiøÿÖ2Ñ3k¾´Ç»dçÏ.2%”EÒcpë4‘¯¹ÀÅ I’.Æ ¯òùÍ@†œP 8êÄLKÒB†º×HûuHÚÆ\[µ¨wÕ\„0QêÂdä½¹—rݲn‡90›Ï2N?X™Yý ^ß’òÒ’Þ]œ#F‡ é]]¢ù³–4êµÔ( ¬Ú}£î œ.²Ãî‚ÚRA»[‚i&¨­qkuw¤]6vY›™!›`ôíE˜²¯ÜjiM,+\ûGËw=(¸jæhmÛm†(ík±v5`‘5­êü›Y/f•ÍôÐ"•†î†Ý^³ÊÜgæúCÜmÐßh;}3Z×®«ã{Q×W JRÖ¿ ;Ëc ˜—§$rçÿ¹Œ¬?Ü-ò›+ÙØ§7¡A'ƾ–Òî×7›=|U1丄§A#’ð4v›ÒFñôxçÝGÜç[ÿ?¿,Ó€endstream endobj 1499 0 obj << /Type /Page /Contents 1500 0 R /Resources 1498 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1462 0 R >> endobj 1501 0 obj << /D [1499 0 R /XYZ 85.0394 794.5015 null] >> endobj 294 0 obj << /D [1499 0 R /XYZ 85.0394 491.3865 null] >> endobj 1502 0 obj << /D [1499 0 R /XYZ 85.0394 466.1094 null] >> endobj 298 0 obj << /D [1499 0 R /XYZ 85.0394 166.668 null] >> endobj 1503 0 obj << /D [1499 0 R /XYZ 85.0394 141.3909 null] >> endobj 1498 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F60 1366 0 R /F21 954 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1506 0 obj << /Length 2160 /Filter /FlateDecode >> stream xÚ½X{oÛ8ÿ?ŸÂØ[`e ¢ùõ(ÐÒ4¹íî^“­Ým±m9ÖE–|’'÷éo†CÚ’«¤»·À!LÍÃá<~œ¡qø#²0‘É(J¦¹Ð£ÅæŒî€÷·3açøn’ßõfv6¹VÑ(aI(ÃÑlÕ‘3Çb4[~ò&ƒîÝþ|9ûRsï/BÐà3×üòÃXEÞ?ogc{7?¿šåN?ÞÞÞîl {ké]þxq;»ú@ìÀʽxû±»xyõ–XoßÛ®¯.ÆQàÍ>~¸šŽ¿Ì~:»šÎÕ=»à õï³O_øh &øéŒ3•Äz´‡ÎD’ÈÑæ,Њé@)G)Φg¿v¸fé -gR…rÀ˜2¦NX¨¤2Æü~쇜{lrY•«ünWgDhª"­ó& üÇ8ü ~ b|*Àc"Á"Ûƒ3­¥‘æûÛ{!ü"Ÿ—é&{=Ù5õ>&a€?ÛûE³›êD²*Ò‡ª~½¨Ÿ¶må§‹EVduÚVõs«…[]g«üñõ¤Ú¶ÚõÀ¹“k);ñÝX7¢å>׸º:¥%ýyÞÒx¾Ë‹å9wMfcNÊÀ ͶBŠ•Q.ip0F×Ì„¦;FÌ¡c£ÇŪͬ‹ªü̹ßäåݺÇÞ®´gê:YpθV䡘MzŸ œ\FN‘°“PÅI S: º‚ÌÖmÖ´"ÅÆv:è‹5b0x†ŽÙ,˜û :÷Þ }᜴×Í6+§Ó_ècåÜ2­VíÓ¿(F”š…6Ü<_%—7ø«Ñ§øÓoŸÖM·ÔiýDì­áTù2[{n9í:£ê 0½º¤ vÉ¿²EK0”Öm»}5™ì÷ûq"=VÁšeÙ4Ù‚Ufú]Ïÿ$دóÅäð « žÓ€ègp?òf•.2šÒVD¶SòºÝ¥ñÀ&çvÑf[d› –.»Üœ`ô ‘ªQ²Ò¤¤[±LÛÔN(‡b$ÉXxEµ@d,= ç"kžš6Ûâ æ]K,È©†æ¾©Ú´$îÁGH§xªÕ(¯JbPÊcúë/y›©Þta5F~h’ÞeV…ÙºÚÝ­íFYÓ ¡ xnç‚B”4ªÆÐ2P^k2ÓrÉÐ82ð¿ 7½ãTZ¸©ºrO÷¹Ïž,ƒTîïŽÛ¦Ë-`LÜ]`mmôÐÖ4]EÒ¢¨öCŽ{ªv6á+úÍ·Yc´Ð÷>o×4:¢!¯³ÒAýšÄæ þ–•‘>¤y‘΋Œ aàŒ‚0ê$2=ºîêt )B|4ŠËdøÜìš–FsKÉK <+…mD† Ø--òÿ8Î<[õ¤íG¸unÅÒÉqdêü(ôÙ@ູžYàêV B l9Ò*dW¿«n,‰ãx¸jðý®HSôðRÈJ‡DwF}/oÞ_[——&PË£ßàžCŸÑÛ8³Ø§OÖÃÛ*wÓ]ø­à¼Ù¿ÜR›À¦†Ã˜}Eß«aü0‚zkÎ 5Œpw,–®vYµëfãÃ­ÂøC ú5ÏK¥Ãs"Ü{ =¾‘Ž1ø’0Ȱªniº•ßÐ=…ìé*ÿ¢°ÅÚZßñWC–óïˆÿWúù¾»åKg:1Ïdž—N¨3$f•ßV÷HáŽÑU{BÈŠžç†oöŽÇ€ 5A™Ò¡ðd¯+ø@Sû/€×0…¢¸ŸïZš ¹nnPm“]ãµV<…î&¤6ÖD£KŒ¨—·ω ±~€Õ 9ªÄ+šŒ23Ð#(Ub K$„½»p–OíšðHp«6›ü®*^d‰@ܤÝ¡V2ôö͆À¨ÜtÑñ”áãa $¡Â œØ„ê8š» màHÙ@æ:ò¤Ûw¸”Ũi Ÿ³„ÅÍ3a=بy¹{´MЍm»®³tù?ô+'}Z­³óèô-s~³Ùù3íÊïkMÊ`àWAü†!` ]W1ÐÝ<#]  þ±&"élC…/AK÷]¯@¸¡d• +8X§–„qÚÒ°sK×3Š’ñ³F 5“±Š\ƒ´Ý6¢$#+ïòÒnDN8€6+±èY W˜<‡_ë2YH^§Vaz×@©¾R³ÛšËÌ‘(&¹ˆOz†áIAqWm¶9•:JSMo¨5ÁÁ¢…¨Äç óÚØ: fT»vk V5P K¢›2J!º‰+"´nåªÂ2’€ 蔦äDT\fØôX•ÕÆ.ÕGœÈŽzþ´C¥@±Xòè«îÜAO>˜ydK[âÀyÏ\9Ö®”¥°ׂd¯ëÏNsqh÷›úÿ©'ÝkôÝyù# ¿Ï[DŠ8>"Eül.kèÞeæ.sÚâØæ„ûC™. à„Lï§:´a¢Ñ´ 16…¶pÉn[ú0eÌ;•»¥¯íÀ¾ ÆîUz>Ð êPÏl"¼w++ÃÊ´74 KÈté~«]WÌ.íoã~wà¦Yí ›Z€óC¯dŽb S\iS Dˆ Ð…C OÖÏ®_¢Ï/†…uÃÕ€i W}EC¨Ðe2 Ú7 uãœ; Üç0TIE'H8¿SŸè®#¦@Á\Â÷‚CcG£›•Ò×~S-s„Tƒ}¡>> áG³ËÛŒVƒ¿¶¹TŠéÈ]ræB&ÓR±Pë /^Ö:ÃëÞsØÐC±Ò, æìôYþí^úùøÚ  âX7ƒ2‚¸ˆAˆU Wü+ÍÝkóתÿ ¢*qendstream endobj 1505 0 obj << /Type /Page /Contents 1506 0 R /Resources 1504 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1509 0 R >> endobj 1507 0 obj << /D [1505 0 R /XYZ 56.6929 794.5015 null] >> endobj 302 0 obj << /D [1505 0 R /XYZ 56.6929 655.8524 null] >> endobj 1508 0 obj << /D [1505 0 R /XYZ 56.6929 630.3608 null] >> endobj 1504 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1512 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚÝXÝoã6÷_a´}•LŠúâûõ&mº½$]{{-º}e9Vc‰®%'ëÿþf8¤,+Jo¯=ÐÆH ÉùâÌCò1ƒ'¡Ç„ Ʊ ¼ñpœ•#6¾‡±¯GÜÌqí$·;ëÍb4½ñXz2ò£ñbÝá•x,Iøx±úÙ™}sq·¸|?qý97qÈ9o˜p΋›Ùå[z{3§ÎÕåÅ$œÅ‡÷—@‰eèÃ2ÎÍÊ»w33ïKΩó‘…lö~"b移ń'Îí»k ™Ñù‡»»[=º˜ü²øvt¹híêÚΙ@£~ýü ¯Àߎ˜'dŽŸàƒy\J\Ž‚Pxa „¥lGóÑ÷-ÃΨ^:äËP$^˜øñ€3}>;eúgÞ ¥ _hojOø—3Æœ7‡b»*ª{2ôÍõq¥¤æ©h6ÔC§¡»À~âw¶Œa‚N–šý¿6yÌ¥p–-oü"ÞØ“¯€% f“a«²´)”Y¦ÖÔšáÀÉu£JÙ54t»Ë«ùü;³ºXîÓý‘>J˜k¤æõ.ÏŠŒùùŠEjøª é÷‡=îxîÛø¹m|‰¤ã:çÍZ/{p­öÔù®¨Ÿú^Õ6bçâòŽ:ïòã.ßÿž›I•ÅDúŽ¢5Û¢zx‘ó@´ï´Áê±X$È“Wv 9"]ÕD gboi˜åUºÜ¢#ñ£¨z¢ž¯#@ûÕçµ<I}½†V=.Œz@j7©ä? 6v¹ †Œ«4±¨‰–ödDÕl4¤*ÛKÓb L¸cx¥µiiµðÝeÑiYT¨B à†/çzM³žìb’d¦Û`·Æê,$üÂÈØ³©&aMD«scg!^Æh¶göúÚÞL•eZ­Úà´©ôS‹yA$#½æ«‰AJe+j=o °’CìÍTo ê¬ P&'Âlöú‹û,£4û Óu)l]p n¤~ä‚” «Bœo™ëb*¹ €¦®·¯§à›éî!«9Ÿê}CO?³–¦÷—N!ºñŸ(^­PÇmU bqÙÅÿ`Ï\mÓ}Q¿ˆóÙuÀ,ö·ÃžÿKàµq÷)Ýg›×i¹Š‚Ï‹¿˜{±àƒ!ô_† ?sQ0vÝ]v­&]÷`eteã(¥¦…Iëf³‰ª´TðˆÆ‹Œ>Ñ)ÉŒcpÌÓõÕÙÑh‰f!Àz`c‰ån›ˆR>œåéRikü¨”¡>©ý$B,ÎQˆ\¦Gb°I ç”áO->kªÑ»hò¬éh•FQ—i“m¼¡H¹mc;ŽŒÔØJ¹• ½¢Ê”9±2:±€xV² ¢:»Tç’µ'³An–Ö™lÔakÖ/óŸ:-MOŸ€Ý!Ø›hgðTøDœÉ÷wÈÚN[“Žª—–'õÂ.fö!ÿü¢Kü1à[7ßÌÿù Ä€²ü‰SÆ @²(4“Õ«ßç ó :<)Ðr8&žs„ˆ(ép7f«’¤î%œEÏÄà4év; )Œ<JÞ‘D€€™ïù’'çà†z£šüÀ7aë¸$uH~¡Q¤3~­¡h­©[TfÂ&?­£=>ͯu“—'Nú¶å !M£v…´*4ïUÓäV„2Üò¦'s~{µ09Õ½ ‡Ü÷âˆÃýSßIÿsî¾'“$¾ »-G·Ë’®¹g[À!)O’õ£ÁíÍíDñCTžç^^=T‹T'üz„2 “¸=œú7j‚ FÁ ›,2 T; }P 6ð?VUÅ„Ô(&<¶‡U^1%bYTE™n‰¦7©xgFB£E™®‚;RÚ䆨q¨°¯ˆDRÌÍ¥Ÿ £Ûfšûï!JžÛI/‘ør¡g“|éÀÜV„¬N•?ÑÞÈÄâÛ@ØP-¦‚‘”ººÄðG*YDmÅVðÈ‹áï\ïm1pEïj"ôd-C-…£¹&rÿz ãöR™cÁ} 1*s|1~¦ln³WÇ­ cAô´"Ù¥zÌMd³Ä‹Yõ®›¤ñà½û±;Jœ7×?Ní“|ë2®Ö‹~y©s¢Û€‚îéºkæ7Ô5÷ëBiMÉГÔ†E¯¤[Õ\PšÞXà„Eˆ>ÞàšJ¾":]Q½¡²W#ëíâ‘j/]EBÛrjÙÄæµZÊèP5j<=âó@mO¤„;½}&âÄMZu—Øw èØÚ, lìd€Þ—V…¡{P¢C»"UÚÅ…¡wG(”ð±pà•µ°õ§ß$O·pÉK8Œh‘ø2¶Já®þ윰—ÏUÿ7ÞýšUendstream endobj 1511 0 obj << /Type /Page /Contents 1512 0 R /Resources 1510 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1509 0 R >> endobj 1513 0 obj << /D [1511 0 R /XYZ 85.0394 794.5015 null] >> endobj 306 0 obj << /D [1511 0 R /XYZ 85.0394 769.5949 null] >> endobj 1514 0 obj << /D [1511 0 R /XYZ 85.0394 749.1709 null] >> endobj 310 0 obj << /D [1511 0 R /XYZ 85.0394 714.4776 null] >> endobj 1515 0 obj << /D [1511 0 R /XYZ 85.0394 688.8412 null] >> endobj 314 0 obj << /D [1511 0 R /XYZ 85.0394 535.7123 null] >> endobj 1516 0 obj << /D [1511 0 R /XYZ 85.0394 507.2665 null] >> endobj 318 0 obj << /D [1511 0 R /XYZ 85.0394 332.8138 null] >> endobj 1517 0 obj << /D [1511 0 R /XYZ 85.0394 307.1774 null] >> endobj 322 0 obj << /D [1511 0 R /XYZ 85.0394 163.8619 null] >> endobj 1518 0 obj << /D [1511 0 R /XYZ 85.0394 138.0002 null] >> endobj 1510 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1521 0 obj << /Length 2116 /Filter /FlateDecode >> stream xÚ­XmoÛHþž_aàXùP)šÑ{€ý6î5›^ëMÜ]m±­q¬‹,ù,Ù©{¸ÿ~ä#˶úìÁÄáÌpHùc1pá'A脉LQâ;+‚Ályæîaîg‚רf‘Ý]õ|rvþÒ‹‰“„2LæY±ãƱL²–ïá A„ko^Ü m¸Öß„ ⣸/n‡^d½O†"¶ÞÞ\gïÞÇoõìdgÒzñêr<ÝÒ´Ïr/¯~ !¬Ë7/FW4uõ†Oz9ºF¾5yw;º~šüz6š´vum®‡FýûìÃ'w ~=s/‰ƒÁ# \G$‰,ÏüÀsßó §8»;û­Ø™Õ[{})\Gz¡ìq¦”}Î 'ô¤§ù˜ÅÐöbaM7yÑ’‰fÁ“«5º´Úæ™ZÇ­€BÍyÛ¦ÌÔGו¥ÊÀ±‘ëYïju$Ñ^Ò·Z5yU2½&‰í"¼g¸à#oûAàD¾Û±èü-$Žã~oÛ­D»+òÔ•~;‘L¢C_Žoßþ~}±z‚,W:®ÆÂ5 ©×¨r›“Ë¥* ©mºÎÓi¡hÔTô­Wj–ÏwÌ\ðì*m‡ëöSÝËut܃2 ½´ZÌÁVÛN7³O(h ×uá†òòþHð«»²˜®@ŠŒœ(¾–ò2_×Í3ÚðÈ—›šM¬›Õ‘ðõ0†@iò%{=TÛúv¥Ê»»×4HËŒˆ<(òéÜ«jÎÒ’ˆ) *ª4SÙÙç‹Cû<áÄ2Öæý4´Áa–ú¼ªÖ ѯ¯þ|}ýüöòöýŸãËÉ«_Î!†ÏW³ZˆóM½>‡£/~úÏѪÿö{²sÒ …:†˜j6t0L™}9q£v+ºjô{è[yC9ZJ+-´ã€Sª™ªët½£aÃì}Œ…œ“HÕ,¥lÔZ̦¥õQJ™Îy©¤YÌóB±‹|¶Ðià†ÝTúnñ: é´Ò ãyœýÀc35=¯˜ØÔ<;ÝÑ—î7ê»GÖZ‡¢a§Á±>­ëùÑql È,V¶Uº'Z|?r‚0ˆÀb4ôœAÀpÙ TÁ0NȨsB¶ñš”<7gŸÆˆH"G†PSH>'x¡/tívõwBøfô~<ºí ã^õ¾ºdÙd¡ô½$Éi·HWÓœ˜ò.HæÇNEâ‰Â2U7ëj×§tL¡/¿'Ï,ÈʺV3´u¾®–E:UEÐ$pD,å*ÉBëü¾üRõFuäCO’øOøõ áöbs#Ø î‘rÑsBᇈDý çROÝÓ„F]¬ ÔTK¢ËÍrª˜êh¨®J¬¹ÏöeéÔ j­ÉeºTY%žë$‰ò*‡,à® ŽBÌo'ŽL½&ÒÂ8wMyƒ0/«GæÞ¦ ¯ ZIYBðfMTΛ)m\퇨ëv*¯ÍQ5½'¤.÷Èb_²“Sé#]?¦S,U|ú‘b÷ù–w™5¨OO1¡(¥®êP.W…²êýpE?ÌrͲ§ô%u5§ ïþŒï–ñ ^ ·-3Œ W®—&ÀÒæ(Ô´tûóð¡~ªöTŽ]4* Q\9¾~sÑ·¤šþKÍšî§ Z·€‹ÀЧ üȽ0`7ÌŠ´®‰ôè£ïàCü‰F?ïýó3qò $+ºÇŠo+Ÿxì7¯è¹šs;Ío‚  ’çHé›Ñ¬Š¾gD¥ôAlÔw)E… ©n&tö¬R(ŽšÂö ¿Ï¯ß\•L=Hí`z¸Xb™ QÞ…m]k ºu[Ös×›&/òNúVVé2)=m,vCžÐyŽ“œç0iòÜç<‡I~ó¥Ë6,bÏÑNæiôD¥8§YJ+Óúh+ìÐU£ÚŠÀ ë1 e©ÏZ´SªæIÐWú¾–ôÄŸsótwc:ªöäï¶1 -îƒ75øíÖÍß2¦5"ÌÕ:ß”Â"ŽšÔxá=LOY<À; À¸ÅŠ[Í1:`äÂÅC¢YïÊ"à#JìÉ s<}ùØg}Þ§"kK#Ò5©®#0˜V ³W›i‘ψ& G¦1 €@di“b6yúý_ótk5¸ÎW•Ë X•ÑÁ¹§'xÖªØÔF«>Ë ë…§)N•^šV@è–3`À8.[Ÿ‚oz zÖ4×¾‚2^›Cº•Gb©ö"5é°ˆ °4ÒL¢Q{A=¸ÛÑ– †žBf¥î+½R?ŒÀ3»jCÄc^/J(¤€Ãm¢QJH¦J¯ñ9îÈKbpŠÇb~ÑA ¬%8håavÑ nÕÖ°„ŠB‡W>$-‹ãW Ýç™Ê6¦xزM«­F»(h1- ö>Y>ǵsE[ô£†¼¨QCï ÍâR¨ÐïSÞ57ÿbäS†¯ZæMÓž…Ø…ƒ4 £$6¡Œð8‚×øPXÚV Áúø¸2pgªY÷|˜ÕÿNI¸¨eh~¡NéX­'Bï½OAÚËzŸšò­*ÚxAëu@ë¿§Ò]÷Ÿ357í¼ùkmß’¢€›¹-¢BU¦ìΪ´³UìæTûBoÿO;x½\|í¿c/pðßžzÝö?¼¿ü¿òþx?r¼8–ýÿsÊ(v óŒRèVOžhnþ€>Uýû43cendstream endobj 1520 0 obj << /Type /Page /Contents 1521 0 R /Resources 1519 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1509 0 R >> endobj 1522 0 obj << /D [1520 0 R /XYZ 56.6929 794.5015 null] >> endobj 326 0 obj << /D [1520 0 R /XYZ 56.6929 725.1329 null] >> endobj 1523 0 obj << /D [1520 0 R /XYZ 56.6929 694.9784 null] >> endobj 1519 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1527 0 obj << /Length 2293 /Filter /FlateDecode >> stream xÚ¥YmoãÈ þž_a N>¬F¯Áµ@.ët÷ruÒØw@owqåq,¬,yõâÔýõ%‡”,ÙêÞE>˜âp†Î|8þÄ$ô,[Fî$ˆ\˳…7IvWöäÆþv%XÆl…̾ÔË«ë{L"+ò²ÜôÖ -; Åd¹þ`ܽ»}ZΞ§¦ãÙ†kMMÏ·Û·¿N…Æíünö–†ÞÎDÜÏn§k,yž'ˆ<¦ Á3ŸîXîOBñÑöì»ç© Œ>-§"4ÞG¿<==êÑåôÓò§«Ù²ÛWï–¸©/W>Ù“5¸à§+Û’QèM^áöD9“Ý•ëIËs¥l9ÙÕâêÝ‚½Q=uÌ—ž -/t‚gºbÌ™n`ùA@ÎüóÔômÛXçU¥ó³:¾¨œXê_ñnŸ)+W5nóúÞqz‹ÙSÚ–'<©—YnÓjjJûVÒ©0ÖŠ™™ª˜-M™ÖGü zçħßÐx·ø;1À} oàNiÕÔ¼@š'ª“åU“vúJ±TV¼§(Y¤Ù­TY;–¨ o*fl@ö‰;ƒ»yž£wv2؉|CoNÅU‘Wh˜iM#»˜EÐ'òŒ]AÂÄUüøhÛN’ªœç  §U+Ux®öŽ€*¢Ð7ù ,Qõè `ó›ºØA’œã±Rõ[—¯–? )1TGâ5Îë1σaØ2ÿA1s¬0 û.Ç%×GOJGÈ ïšÔ ˆˆz€ŠÆ¸ú ©›:$°©Ã¸²,×xwqV»~ûÛ®îR¯}M ¡ÐuEóÒ:Çš601C¨_ð‡¹øÆ”ÐóªÙ¯¡‰zÃin«ràr×T5QÛX7¤@ÅIÂUpbo{ ¨[ 5µˆÅ—(ê•€X–BÜ©®U¸:Òï>‹®´úHNm#w‘ ì«ÌJòÍ%xÇf,=ÇWñª8¨A怃¹LÆuà´¨æ"áš"㺩ÊkÐyÝ×}y‘> endobj 1528 0 obj << /D [1526 0 R /XYZ 85.0394 794.5015 null] >> endobj 330 0 obj << /D [1526 0 R /XYZ 85.0394 519.9229 null] >> endobj 1529 0 obj << /D [1526 0 R /XYZ 85.0394 488.8874 null] >> endobj 334 0 obj << /D [1526 0 R /XYZ 85.0394 326.6298 null] >> endobj 1530 0 obj << /D [1526 0 R /XYZ 85.0394 298.4037 null] >> endobj 1525 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1533 0 obj << /Length 2424 /Filter /FlateDecode >> stream xÚ¥Y[Sä¶~çWø!UÇSÅ(ºY¶yc¯!•°`“‡lÌXÎzìٱ̈́üúÓ­–=cÈ©Z¨B-©ÕjõåSˈ€Ã¯"ÃL*Ó N5‹¸ˆ‚Õæ„÷0÷ñDxžeÏ´s½¹=ùñƒŠƒ”¥Fšàv=’•0ž$"¸Íÿ5’-@/®~3‹¥ŒxxóùêêÓõBÅá- \\RûæâòQéb)„à*|ûÓùÕíûkÕ^Ôù»ß0ž_¾}ï¼»¼!âÃûóE¬ÃÛÏ×ïoÞþ|òþv8Êø¸ Ïñíä?yé>áL¥Iì¡Ã™HSlNt¤X¤•êGÊ“›“ÿG³néœùž¥N˜ ãÿÙÌ–¦‘žß–ËD±„ó²,ZÇA–'ûÇ¢Þ5F2Gñà])!XEÝ ³*&ˆ•dIœçÞßÑÂŽ3e‘ÑaMCHpÇq¾X^»¿àe#‹–áÇ©‡`Ë80IÂb°*|+¤Bkå˜Æ´;ýÁ*nàÇ‹ ÞÕpÆ`tÌ^ðr,ÙÓðQCìWÄö€Ûm·õ®¥Ž³ÛlYÜ'X^&©rb=3™±Yweù„¤øpÒšÈÊ’Nˆ›$´UKœà}‹N®lîeÔ»MC2\@Âר*ÛX¢\ì ä<'_”UùìÌaÉAHY×_»mÃæÒãÂ[f_8ÝÊʦ&ªk¬¿£kŽv³ µž{“}õìß:»+úéýƒõFß-’°«*Ê:è×~<«¦»¬²mvWziÍSÓÚÍAù˜¥îNù5¤Œ” ­¹Ïœb9 ø#Ÿb/é=ã)5ÞmÚ Ô•óPçðCtU“\0ßRq^xKÓJETn· ɳg­õ:8°B‚숻¬ýfv‡Ó¹¼'G›4\•„Ó²)rKÍÙÐY;SádC;‘MƒûÌÙªŸw¸£K6õ£õ[®ÝH½Aˆ’ÆS´âe½·ÚPs ¥¡Éºö¡ÞmÖv.ÞzW$䊤S‡é;ÖøNK dYg9Qÿԕ祻Äó€¶Yá údÞd0Aïœ|à÷Ù¹ÂìÄb µW lÝì페A ²îŒèyÏÉ‘ç0ÀW+»õyæ€y³ƒíÖn;èÑÈ<å;:ôÏMŸN“ðšþ®¨²Ýñ•Ù-?œYDÌY'òa¾€¥<è›(üZÕûŠH 㥶M»ƒ ĬÄB>%X¸ëZ!Säë­(ô‰%¤$ªæ7x €ÇZ¿÷ªÞlKÛZ¦hŠMQ¸u&ƒÅÈ3Ù‡ðŒöÕ&ü5«œfÛmY€+½‰a„‚q0±‘}ÜSµ&ên‰è*ðRÓz<îÄá`’ Nä!øaß¾-ýä Ñ†òמz“÷ÒÝ}ØpÉ=n‰Gjq,RVmGv>^ûBtê×Z;­¹UÄ™N ßà ÌŒ†B5K“»{ÿj»=—þåxAÿ #ßT.Zàî³¢/ªÎ™dâÙ^v:ü‹þhï¹þE‹çÒP æ±OŒÐîdqêŽÈ„àæðDøŠýLJ5,hÿ ÝIÔùÜî>*΀ºÆ›.ôùê]³T í6¹¥*,ê½È!UyÑä¥1÷¨Âg#5[,-1w]jÀ+y±ÉÆ+OêpVª+/\˜yª«Êâ«=¢§w ©j^‘×líªÀD²ÍT ¡ec1ŽçÙ8>~ ù*-ß×áÇ* ´ ~È:ûw†€}JÑbâ”%Iœ:µ~øt}ñ?>,c÷³Ï“‡º%°*à‡½4§ofØíãÇ€EœåwÉÙ™x!(F:|ÆâG)íR[)rನ–dœÙÀ]^@zòêÁ!÷ÙÖÁ@ožÍÆÂE‘»¯u*¼X{ ÔÐqp»òÜLE-…NvCpŽ"z@˜!,^¾Æ1~¡ëëàQ´ØiÿäkfÜ%„w»Ô¾R9;[Ãϼ±™0 ÓV&öÅEÜèÄ/Êš ÚŽÎ4RI¦#xï?G9‡ý«ó’ž¯`Æ¥+JýRýßÝ£UqzHÒ÷/èt[j3?y”>8Pø‰Êï‰ôP")ûXsK±àÛ±j}?ë3;MYòDô¨€ÏTþÕ¹°âÚÞ+2÷؇óŠà•÷Ü÷Jj‘ªIíÍf A($¢gìu†”Áà']ÐE8:œÙ¸+[oQíJ H{(A¶JŽ-¶®Ë²Þ¾Ø×]é7"جñeLu.× "FÇ/Ì!vè 4ÿ£œænÎdPŠ»uì­ó:2™ˆÅ‘ê³ÍˆÃwtÀÚ/ã(gÇ¿ »c9´Âõ$;rå4,ã¯ýBú!þ ­€EâØ¡îÕíµ§ðá„Ãkˆa =ÃqvöNm÷xá€øŸƒ™ …ÈñÝÿÄ8|pÔ1SXRÍ–:ðÄRGõJ¹†~¦¹S+#gTÿ´Y'endstream endobj 1532 0 obj << /Type /Page /Contents 1533 0 R /Resources 1531 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1509 0 R /Annots [ 1536 0 R ] >> endobj 1524 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/warning.pdf) /PTEX.PageNumber 1 /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 31.00000000 31.00000000] /Resources << /ProcSet [ /PDF ] >> /Length 557 /Filter [/FlateDecode] >> stream xÚm”In1 EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5 oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ùÆ [ÄIÚL’~”F Ø PÈùYÌÀ¹dˆÐzZ8å±Ýƒ²ÙËò‘–Œ€f¾Å(ÌÀE#@x˜oL Û¹[ƒ±ñðù ä 6\>RgÈbÏWÖ¹j[†› WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åްЭr²ÂÙÄLûˆ T¥Í¡èª‹ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream endobj 1536 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [349.4919 431.1147 408.4801 441.8991] /Subtype /Link /A << /S /GoTo /D (ipv6addresses) >> >> endobj 1534 0 obj << /D [1532 0 R /XYZ 56.6929 794.5015 null] >> endobj 338 0 obj << /D [1532 0 R /XYZ 56.6929 640.7425 null] >> endobj 1535 0 obj << /D [1532 0 R /XYZ 56.6929 609.2714 null] >> endobj 342 0 obj << /D [1532 0 R /XYZ 56.6929 416.9256 null] >> endobj 1537 0 obj << /D [1532 0 R /XYZ 56.6929 388.3459 null] >> endobj 346 0 obj << /D [1532 0 R /XYZ 56.6929 261.2322 null] >> endobj 1538 0 obj << /D [1532 0 R /XYZ 56.6929 232.6525 null] >> endobj 1531 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F60 1366 0 R /F21 954 0 R /F39 1178 0 R /F41 1238 0 R >> /XObject << /Im3 1524 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1542 0 obj << /Length 1913 /Filter /FlateDecode >> stream xÚX_Û8ï§È£h\KòßÇöfoÑÅ]±èÎ>]ïA±•‰P[ÊFöäæÛ)JNœqºE€˜¦(Š"©)³M?¶©‹4M¾©š<-2VlÚá]¶y†±_ß± “"-r!àeet[ˆ:-j^m¶×J>=½ûðOÎ6ýFÓò´ª+†Ó2X¢H«&«ý„§ƒ"áOŸ¿<ÕÐã_úù0žþã«r¶åQ+ËS‘—þûØ/¯£_­v¸Üσá*qz˜úQe'Gzk¿OGµ{âWr¢æ‰ä(Ï꺰C§\ veÒÖNϬ—ê¼g¸rÞÊ.ÎèŒÈ¢h¡Á¾¨îý<æBh%ÒËÞ:z³á˜èáhÓ»>HÅôÑhÇ L8[Ú,²j¼œ—D>Õ/…T¿—T„ ¬ñØ€0š&îm´Ù­4DÈÞY¢Bž¼è.ÈÜ&ò0§5¤RP¦†³à÷öÆ'çSʯ†í°ÓF^b ®Æû+ìY‰Óò¸ó†_Ž;oDHàJz+ÞI©!úê`Dñ:™Œ¡£ Q’â™ÞR-ÅãT!pº Û&ƒè¦H,xÀ·Üór>0“³äÏÇß·;é”ßCÍmk{È@ÁD4¤I¾qž_»ÊÏ_î9×*p M&PÄqíèÙi7jÓŽ4¾§YyŸ"A¦͠ì‚d,"û©ì±‰kkÒ;¥)ÏR^Š:”&JÓ×9*—“²,Jן©IW؃È!6Š‚OÆ¥Ka䯥ÀÐU§½l†¤(.sÝ«Õ@BÃäf˜R‹eÞj1-£O.拪‚#/`h~>)×­lS€³†1Œ•ô ´ÅhmsV݈jµ75‹Êš5ß²Œ?OdoÀ7*ƈ·ö2Q¥ z¦k{WÌåU*ê*¹Ž ""!Ú–•ÐMåLÜ žqQ&ÚK¨#¾ºÔ7ÍŽÇ$%£(–qÅ‘`Wm¾œµO^˜9ÈïŠxp:¯çB£àFGBÚ/땱ˆ¡ZkÛµƒ²“íw„¼æº¨ã[½$x(ƒƒFlBLÀ{‰j8K [|ﶪ,}­UP[>é®S‘ÿº–vY•òZ\Âòâm$s–ò*/£ 6*,¬C:ç ½"åEžéjl?œ|BèE éɸXú q¿–D"mX• ‘¹ÈjmËúÿ@CH®2#¶¦È²&RØš8"u£´÷Dí¦ñŽÌ~§¹G@ 8Ȱ€¿¦¯Ðžt–æøúê¾QCJºoæ°Ù²(î Ç<Ž,üˆ5kõ46i]WMPº/Ÿÿ¨Î ‚oœ»p7ª2ö·¸ÅÓº*#¼Åð`' C½žu¼?\: jº·3äŠÅ.…îÙ|˜ëãц›À¥Yé›Îe<¨õÞd[°4ÏËòÇ-Jµ¨{È‘!ètE1‘RDPż´î¡bnó‚%ŸT+)wð0Ò£Tç‚KÏXx¸¿_OIŸN@a&`ËêY‡ :åô³¡&Ä«»Û†ý5é˜âB€û}Ye¡ødÉ °]B楖x¬†Í@”üizT(þ¶Úxe訳vTn3o-òÁa^¨ª1ü8Háã=ô6³¶µ{Ó‘¡š»hW”P·Šj‰v¢æwЮ„Z[Š´»ƒhM 5ƒ© º¡s?‡+ì ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¢¸]mþpùv¹ÿ`Vjendstream endobj 1541 0 obj << /Type /Page /Contents 1542 0 R /Resources 1540 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1509 0 R >> endobj 1543 0 obj << /D [1541 0 R /XYZ 85.0394 794.5015 null] >> endobj 350 0 obj << /D [1541 0 R /XYZ 85.0394 769.5949 null] >> endobj 1544 0 obj << /D [1541 0 R /XYZ 85.0394 576.7004 null] >> endobj 354 0 obj << /D [1541 0 R /XYZ 85.0394 576.7004 null] >> endobj 1545 0 obj << /D [1541 0 R /XYZ 85.0394 544.8207 null] >> endobj 358 0 obj << /D [1541 0 R /XYZ 85.0394 403.9445 null] >> endobj 1546 0 obj << /D [1541 0 R /XYZ 85.0394 368.2811 null] >> endobj 1540 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1549 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj 1548 0 obj << /Type /Page /Contents 1549 0 R /Resources 1547 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R >> endobj 1550 0 obj << /D [1548 0 R /XYZ 56.6929 794.5015 null] >> endobj 1547 0 obj << /ProcSet [ /PDF ] >> endobj 1554 0 obj << /Length 3198 /Filter /FlateDecode >> stream xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑEI´ÉÈU)‚ÍFw£Ÿ$&~bâ ãÊëIá53\˜É|}Ç'Oðî¯w"Âh£˜ÑJÁCæíÌ(ÇŒ“Åd6FòõÇ»¯ÞK1‘œY+Íäãã0—-óJûÉÇÅÏÓo–妯¶÷3iøÔÞÿúñ{úL³Â?ã0…a…ç.|ðõ‡¾%hOÍ7mó çòi·-ûºmhðÇê±ÚVͼŠåÄ3o¥-PU9F¨l@Íü὘64^wÔ>lï…›¶åbõB]½®Wå–ú[3Bëþ­Óeû\}V =}ƒoÜ´_VWE€åÁ5Õ3ák¨3@•‘šö1GuóGV…`ÞDV»Ý| ÐÎLÃ×Ð~®«çŽÝÏ´°‰buØŒQ‚€1í¡C2†×ønUEDݲݭÔn·Ÿb¯î—L|àÌ+Xî@bü²n¨ÝOïQ<^#(`}ŠÖmO†±y»Þ¬ªßÐòcIà4Vì ˆ‡ŠZBˆ2¨Vq,«ù'êÖñÕ²z‰/ËfŒGìI £Õ#> óºjúUüªF×0æÚuuótÈÜÀL¤Å´æÐy¬Ê~Gstq¤Ý5 êÖQçG–Á´˜š<´9ÕØ¨$(XÓ±ñ¨ÑÂ,1 À,´ h1qÀAb0‰–‰h $n×eOPÄë!`·¬V«ØoëMO¶ªÅÈV•õÌ™ ­sÓo뇯šr]-fÉÙr Ƕíú1‚¦GÖ-3A€ƒÑ¢q6¸!¡™ÒV"ÌlšiΤU$TËçgüÐûz×ò;Zü.龜äU@ù¾]­Úç(/NnÚ’šUÝõÔ –m•0‡§]WE½è—ä¨À‚Ú]ŸÆªce™çè& þ¢ïp‚ðú-Ò÷ÝÇÁÿ{ B/ôD É,÷ÿow?ÿÊ' ˆßßq¦¼3“gxàLxXßiéYÁ •FVw?Ýýóü*ÑBTÌ ®ÎS@ßqÀ»é‹CT³ÄÓL9XïüÑ”¾dJ)3Ñ\3©y–¯œ¯Že$¤`Î*¿ü!IæsyfgÆÙe†D¤Î€8 m"g(° hQW÷z¨rJ€.6[-$sN»øu¹Xl«®;…²š T—[I"!¼"e &ì± À?Í—'$ú‚YínIcÂx…HÍ!/Q áD‹?]- Jê¹Oâîh…šnƒ>^hÁÐî“S­t•Kn/*îÑ4à+„G©¸ƒàvرø &!盌çuöˆ–¯8ˆ÷0q‹©¦³WL\9˜CquI·…†<µÐjüj3Ogc”25¬‘Uâ̬v Xt©aÆÛ™0^#ÒI&Ua‰<£ÝÖ2+ÀH5ßÝC àbìÃ:¢Ð6Uìl©g‰ÇóƒþJÇS.QoN <˜uâ†ë7`¼"Uˆÿ\œªYÎðƒFëÈÆ› §Ž¹}6sʧ†¢ÌnoÇç€ñ ŸiÇð€ÏͶz¬Ïpª ¹!åTE€O ³êÀí(NoÇjÂxUßkqä9êE.îF¿šØœY¨÷Úm†]Ì¥ÑÖô¡3Τâ*ÐÌ­ƒŽ‘¯f|À8£Ë®E¸­çâM7hC-ñõ–ŸË'Hçé”í¥ë«õñ½²tãȧŠî¢¹éßÚçlÕ7º@§P˜5^ñƒÊœïÒácÝQÛ´Ôv}Ù,èêÜ‚FÖ 1$CÎ©Þ pÁ×Q˜¯;,rÄŒH€! ²r:ßm‰¢xÌ{Xuìú Ü>–‰úñdÁ®êæS„…y²K1¬^¼/7ÜBó šÝ7çªRÃÑ£t»5Uê *3ëÛk=_>TýsU5Y–ÙaJ’Lè µañ@yÞ‡Òχ˜Ž—ÞÞDÆö³U;/WÅ(+8õy2xk\òy•ãàï²;­ ò€`T/U2uUØ$V*û¾œ/CŽíà~…2žØZfŒJ[}MÅsÀÓéL¼ºVFJ"þnñ?¬_¤ ëóÉ!ƒI®|”ßò3ÜÌpfïø ø¸Ú>•3Áy«à…hd݆ƒ ¬N‚vô0^*|-UEÅÊ,Mu¸½½z._â}4ŠwÏöB]±ª)ÓuƦ.°µÔ>¤‹hã(p>e¯L\þÈ홢€ B_ÛqŠ%!Μah˜À^%„³Æ yÒX<Ÿ“w6 ‚~1œú¼Ë¥ïÂâÍðb8õЧ©»Âss3F„—…ÀÄ4^9üFv€²‡;‡µp&³UZ1ɵ¼›ÂËl*máó/ã2Ö ×Jô‘z¿rK &¥uhL«ü_fé¿x~UÈŸòsÈÚ%èYBTqÂBú?ÃUšî?P¶O endstream endobj 1553 0 obj << /Type /Page /Contents 1554 0 R /Resources 1552 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R /Annots [ 1560 0 R ] >> endobj 1560 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.2946 363.7923 412.5133 376.6291] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj 1555 0 obj << /D [1553 0 R /XYZ 85.0394 794.5015 null] >> endobj 362 0 obj << /D [1553 0 R /XYZ 85.0394 769.5949 null] >> endobj 1556 0 obj << /D [1553 0 R /XYZ 85.0394 576.7004 null] >> endobj 366 0 obj << /D [1553 0 R /XYZ 85.0394 479.565 null] >> endobj 1557 0 obj << /D [1553 0 R /XYZ 85.0394 441.8891 null] >> endobj 1558 0 obj << /D [1553 0 R /XYZ 85.0394 424.9629 null] >> endobj 1559 0 obj << /D [1553 0 R /XYZ 85.0394 413.0077 null] >> endobj 1552 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1564 0 obj << /Length 4323 /Filter /FlateDecode >> stream xÚÍ;Ùrã8’ïõ~[¹£„Â}ìñÐÓ뚩ٙêÙnoìÃôD,-Ñ6£t¸Eª\ž¯ßL$@‘$¹×šˆ GAJ$y'(®8ü‰+c™ 2\¹ ™áÂ\Í–ïøÕŒýþHs¦yÒt8ëw·ï>|Tî*°`¥½º½ÀòŒ{/®nçX&Ø5@à“~üüñÓïÿë§ï¯žÜ~úñóõT>ùøéO7ÔºùÓÍŸo>ßþ o\…Éøþ/·7?јM@~÷éó¿SO Ç¨?Ý|¼ùéæó7×»ýã»›Û~3à ®p'¿¾ûëßøÕöýÇwœ©àÍÕ3¼p&BWËwÚ(f´R¹gñîçwÿٌƟ–¨µ`Vu5õ–IgÍñei ˦¦ Ì9ã÷VZϬàx&Ü3)wG¢ÅàHœfÁ»+@¬’*žHó´Oï˜Q!즽‚({_&É4œ!b83r½§õ¦C?|”r0WHh;…Kà¬ïWÈ%~òé/øtƒ_VÐŽ9åmúÑj»¼«7àÊ0oIÓ€Õd°“ÛǺQÛx} cA©¦5-!»h–MWÏ ãnM<½>n®…Ÿ¬·Ôø(óa_M…6ÌÁS!X0FF¨ÏM‡S…›|­Ûº¥ö]½X?cÓO—š:»—§fV-/ôWªÛnÓÌ‘Ðîíµ˜´5µïÒü'BmV·-,ƒñ1*›køájÕ¬®§ŠÛIÕâÓÐBëuÕkEÃízYÓ„YßC[òIµÊ?îêMÓ~¡¿pÃÿ绂‡ áÙcµ©ïMz…Ÿ0"µs‡ 7Ù¶¸AlEœ €§×§E5«׋ydˆølëE=ëFs7Õj¾^Rû±yxœ¦sG*ÎKô@ndûR¦0…Àî;‰}›Ð  4íÕ4fµP¿dþÅ1µb…dƃ~?¥WlÌ«Ïè•~ÚÅôÊâq½2BïiSß7ß^§Y”âQ³(&«º{^o¾PgûTÏš_8—‘«`4r•ŠÌ{¨+„òÌkõÊ!”Ìã>/F¡â)8A6zD£j>/i3©€qÁVÒ6P\ÁÂÞ¯‹5(‹çH j‹H ¢L»¨ÚǤ¾0|°v,¢Q²?$ÉÖHË@Ò¡{¬WÔ-j$‰‹Ãë{ê»kº–Zͪÿaš^w˪ýzÇk?¹½„¸Y ‚*ˆëßI–×x–NDhø¬Ê%¨ ž¨ôœ…?±Î° ­xó‰ö§C‡'*=œ’ϦŸvêD³Üæ]V/´ã5Ø'°@6ëÔäãzCÝõ·jù´¨ß'@bOxÀ:ùIH÷Á—Ö³Ì8.öávdaaÚ2Ï՞˒w¸ª5i¿(ãøW2ÄÐT>âd2MÏ ØV‚®ù„¥1§agÐȼòòß#Ê$SŒ%i éF.á9Í4ÒpfÒ…è$ø Béñº¥s ÃE3yøiòà®yúº´‚u0à|ïZ‘Bðè¢Üø¼ÿ;Š=¸É¤fï_¢?ï>dòCjÔ¿ßh Y}]/¾Žç)PÝ_-ý¢­Ÿ¢‡ƒƒ( Ññi©#³ßž6ˆ¿Z’``ã.uìDqòg°·{¬:j¡?“ûRcièyn‹ ¿›=¦iÕìË´äÉÔ]KgrOJjIoÕê…ÝãÎÆÐŽ¿Í5Øydôo™-È1oÃxh9¥N{\3)Y¾Ô/û{ˆ gvóÞªz3ÀébÁÝå†Êt„_3/º@‡Ðß—|δ“Yc€ÛY5«#BÒã.·Óâ™­JèIkÆ{]U˺¬ô!ªËJˆÄ IC[¯:’Z§’¨@#–Ž&{*z´àó'o;¾ãá !Б.PìÝwÉœ88ãÄX¬)ˆ‚„v 8ö-ÄÍz•d©žm7MGÀËÔ[ß&û2¥.)SV3gO‹”çBqíωT?ïb"5„x\¤Fø-š¶{Pªirl!/)e&ëU:6ô\®‰© Rˆ'ÍU¶rÂ(eÁø›p9ÊôÏF¡Û&uL›²ºIìO»ˆq¶1ÀäOAwä¶ëä¶c÷²™­ëUKýÉ¡!R‚)°à#iªWóduùÀm¨²%P'DhÇœ—’ œÄy=Èü‹£$!~ îtnÍ +h}:!„#t0)zwëÕtU?T]óyÓò‰’Skh´YuõCLOÀFK «¢w”™Ø…E8ãÜå=(àÔ—qÏÅ¢é` Ái KÍÛ°Àh S­*L>¡ã¡$¬5›ÕO]u·@¥¥t -›‡ÇŽzï·Päê¿«K®Ì.ÿe(\ŒJ8jhÌÖ°ßo½4I#??6³Ä\MJþ*ô 68»·±Ã?TGóÈDò4‡É˜Ï”ƨºÇ- QF÷߬¥Àéâ!~‚K¦=„@# xBxÆ…€õ“_·kRDÐÆ|dL Z—»É[ÆVÌéÁ3åô ³/ø¤ÒWG¦nÒn3Œª-èøý$؇öÃ2f?,_XW·Ûù_û»±¥Þ ãš2NøRšŽt}ÁlŸæÃøS|*¦{;JÓ—ø°Ÿx1>B<Á‡# ¹ û|Ú)y ÆPr {Š = ~yoP Ù ³±—Û‚wfû2xf4)ÐaÄHäL ºBq·ôˆ¿‰dÏø¢Ê©B‘x?*h”šM›¼î0Õ±JÓ¥škJÔÁ“uÐ_|I- <ÜK2îú­[ÈÄ ÄÈl\cfò9/‰v&.ù¼.œ¨ LzŽž(ÈSÒË+í5³V½=CÛCœAžªF #ÜnáS‡šòÞÑ;Ü(„xàqIc+\ ¾ çÄÉI渗oçã q:YàdL¯FU“§EA^?—ö œ¡û<]Ÿ~Ãã \€œæ,íU 0 Ô½Ø^{ˆgöª@[íËKgì›6*I-äap‰q\YœAžbV , ¹»g}‚©@Hp¤3'‰™¯Òr4¿@N"CœA–r ³r·òI¦Ñ†g>¬¹Rý/ØSÌ Æ"ÊÅöÜC<³geaÏΆñžO2Ï |c¢&N?+lT”“'åF;Á¸äör[ï!žÙºot‰~Íqcš,¶ÛSzË-Z{­A*Ö©¾¥Öj² DS »4¥v‹•=ÊÔyyŠ9°h™C5ƒ{»WÞCœA–˜KÈyÚ«5 Ì ºŒ•Üþ¸ò32ÍÎ0emط̨ìJë1Íé2‚åœ.6”* œi¥ ÑÕ÷&’:5w q|£°5ºJqEØšsöKZÍìåÚ ae9•Bº˜À°wt1!þ`w1_c˜±X“½‚•:é!u3?£¶Oqb‹K8Âéu¾ÆóÄù0²d7t»û—5 È÷Jþ<›"*8½¥ª×/RêíjkÅ PøšÊa›Ý„*M¾kRù,w<µë¶¹[Ô8 cž—?õ‰z³¢çAá›%%`ÑCùsùÒ÷ÛSµ¨VX.ki(ÞÄ'œz×̶è<Å™C. UqïÈç D"è¾lQPœ2&bàGŠƒ‚E“·@ÄédÁꡤàýá~Ú Õ)-H•賩ê8¯A\)‰+ñÒ&¥Ã_r ˜ œúîv¹ï¤šæ!åžjú¼]‚§2ÃÛ›vt;oKÆÎõãîJh¼àý»ÜIì}¡ÞŠ^Û¸)«k1y ÷{pwÖ›.hÝ=Îúq®ÏŸU7Þ\p½CøåŒ¾ð ¬¤˜|ië»—®nKn«U.uÖ·>†˜=bËcˆé}Ä–õC•›*I‹!t˜ä"Sæ÷ÀðáÕ>4ým#¡Ã~>oˆ~ŸPÀ È55c=žèlj26¿ëß]ôËs¾ëÿ+ß,Žþ?ÈÖȃÊü1OYœ÷Ûù¢õ*+oD5ic¥D¯l±;*[lTiðiÝ•­Š×‰RÄ¡âÂHƸ~912>Ù`Ê ²Ò4å’Ê|šÏÓ]Å}Ýž4TqïÛtVÍëiÖ’{[õåx›U)Æ*iXLƒåé†Xô%ˆuîRã…tˆ±ÝÞ}<ªÔI³ ’1ŒôÔ á\ÃÄöÎ9Äy}E‡p«üÛ=B:óâ 6"À!ÆUðóyÓïK-Ï7:¤I w ¹f‰! X1z}¦;g¯®d)±›JÚý&¬Ý¢ìt5ÎÆk'¹Ðb}Ò¯DkoÛmbFA÷#cã.R[ÏU[Ó³­îkš/Ñ“¡ÎŠ_ëMšÝï"±eZ{|Ý’jÉà¼B¾NøÏÓÛY³lÛhztØÕy#Ir_•,Ûs•¦åÂï=y„³šºÓ9õõbèjëÍ×x*8\¥Ìf^}\†èÀ?9U,†so ÿ‘·ä N` ;§¢N¡¡ Џóú^£t¥§Ÿw±+=CˆÇ¯ôŒð#ã5D6 t…U.†_ñ ‚±ÖVt„àj] ‰¹gÚ¨lo(kth…gÚÊliÒYìûˆ‚ApzÚRŒï4E£ÑM¼¿íEü€iª@žOEÛàIÑ¢Ðm¶õ‘ëâJ©ƒZË8lgƇŒå}µhTꀗ3åªõ!–ð ÔiÑ̲@¥ðöó ¤ù}ºr”<âÔèNÉ êqPY Ìóþ&¿(O8½>Å[Þ4QÆe”î?L°Ø³‰¯¡hÿÿ½……f!ôiýQçžÒ󂃤%øpT†éç¾YÆ3ÄédIÆ5Ó*Œ‘¤X¨(ç0ËÊÌ­?âB ž^±Tå"kÂIaøõH¯ž@+ô÷ñ_!ꯀÑ5÷/g¿y|%œéSÕbÑ謫yÞ¦¾ßÔíc±hl¾÷YVš¾Ie˜£Èå^¯~@«Ó•"l5©§¢Þ z_ °<^„V—£ÎT‚˜P{ÐQ:÷ôžBò#ºLtèùî™P¥³¯ñsÔƒoFyè?amÕךºbhûºíµâŪãšo S.uOo÷%öÙO»á7Ž»½O»ÿo¿ê“Sàoxf"jˆ¡E~~ði¸À̽Æoq|éûqÞ ý›¿Vß}˯S~p9aÏà{¬DZ#,då¾¥`ž•íg Pÿ_yâüendstream endobj 1563 0 obj << /Type /Page /Contents 1564 0 R /Resources 1562 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R >> endobj 1565 0 obj << /D [1563 0 R /XYZ 56.6929 794.5015 null] >> endobj 1562 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1568 0 obj << /Length 3057 /Filter /FlateDecode >> stream xÚ¥Z_sÛ6÷§pŸ*_-„ À—¹‡4uZwÒ$—8sM'¥%Øâ˜"’²ã¹»ï~»ØHJ”ÜöF‹]ìb±ø-(yÀOž¦‘T¦O“L‹(Ñéb}œÞBß'’yæŽi>äúþêäÙ+•œf"‹Ãøôêf +AšÊӫ寳—?½xwuñþlFÁ,gó(fß_¾ù(=^¾}óêòÇï_œ%zvuùö ‘ß_¼ºxñæå¼‚h/Y¯.__PëâõÅ/o®>œývõóÉÅ•7fh° Zòåä×ß‚Ó%ØýóI T–F§ð™eáéúDGJDZ)G)O>œüÓ ôÚ¡SŒT*¢4L&<ÊS)EEáÈ…Q&b*ëB´ZžÍe³ËecÚ–lü%ï+j¾.Ú®E[­Ä~M‚Óy‹ I¢¼°U—¥QúȨœ”~^£¾Ï%¨:›Ç0þôØïþlJ³6³=G Þʹ7$ÿú”„çÄ „ ÆoVÖ|G˜<0Íñ>QPl>çν–ñYiªÛnÅ,ÿ!3‘©0›qg‰Ÿ‹¥ã'Ûåç*_›ñ߇ì&úý¤äÄšÎýt"â(KKòÒþ`>AX]QW!yµ¤ÆÇ6¿5,6<¼èig2Q´%j¶æhƒfi£ šá,'&¢ošb7EùH¯ÛÖ,©ÕÕô\šÎ4ë¢2—IœˆºŠ–Z-–a‹®XÐ_³Ø¾zm€ÓÑ`pN¬ë¢­€¡Á"Ø é¬-ª…™ZíÖ,¶MÑ14‡y[à§9¦Žéj×µßçe±Ì Bêhǯ·½ÐŠßRxìˆÈé‘FÜCh=Ôv# h·“˜[›ÊÙˆaðc J'ÃØ¯,–Œp3<‘(žm.h]@%ÇÆÖ'ŠnEEÉö– ÆÒ²^lq­ldO…Ñ¿V½›’àq[€i÷ŽhÑvŽæ ë4Ü…EÐS0Ç¢^ox#.‰b]2ÄŸêR Á€ádǑĢ­y|—ß¹)!K²þj²ÀÚÐLë¯Pv @ÊÙ[ÌlÒ‚5ûÞkƒ8a8û©~0÷>r•Êh+©0L¤¥adÆ—más ÊZåk1‰#¶pŸ ( s¤\»aMjíòâë¶‚E§f>•O¬Ïxû 0˜ ›˜Îw l˜MôÆ'AŠ¿ÇqÙ„{ûÁZaß P"ÌGÊ–©Di82:—T¡Ëµ>¤[n¤,ÍÆTË–èŽýaeìL-±sòÙ‡@*Z¢\k?’h[ ÑçHrÙ‰ƒ’ tLÞM cèhQ0JèÙ@ÁÜž (w çŠ¢T( Ž|ºÜ–"RÒáÞÝuõå€Aº‡É®¨U(’(H§r¤q—m"†ôÃÌA®Úø‚n÷ç÷ó’àárˆÄJ܉÷bµ3/ò2Œ_šª0~ü|*  PLÚŠ<¨tÖïzuû¦ªéÝÊ?§¶ŸÔ€Ï*EL¡‚ÌÉŸµSס–"ˆµÐhòjÆâfªÊ‰b¨„’įö¾8„I¤5xŒ¶Åd”&RÀ?%PO $—ÂFJ¡öÓ;w›“ú€Zúˆ¾·M2Ò÷ekšIoD°IBù”°t_Øô–M¦QúWä-òÅjê†2U"Šâ¿,qzžY* øËþœT8EªöB{_^¬…LÓ?9KZz H’Èh¼«¶‹½¦³•>n‘HÕxõIØÒ÷CÞ,û¼<+¼ÿKú¸‚ã9>p“FhŒóÞ5à„»U]NÍV'"Ë⬟ &ŠlfA³‚ 1‚+ØãÎ/hÚûf2ž}(ÖE™71¤”nrî:ÒX$™ú#·¶s-•¸ÛF¾¯]%õÔ¡Ch-êC“본¿—FbMOFžc‘r(¼8±tyŠ„›‘롇ù– äd¸‹^h.Y'd;jø‚19T+¡?¦°Æ[ð † œ°`£C)à ŽÛªÀS ‰¿Ò¦¼ä!ë¾ „€Ø*YjøÃ“ÐÓq½xùz¬Ê• ¹Øjp '!ؓ¶ðǼžÂª£@RŸ!Ä´Í!ÞÆÐ’Ú‘nøÃêʲR8¨€¡%Pœf Ùé!ê@²Å–bak€UVeÕjÇ>iãTšI°"3¡Pˆ¯pšW¬ˆ¼”åàS¬Ž£Ù÷†CØN톞@‹ ²ÝêÊz_i7“¹s9®Í*¿/jâ¹`W¿²ðÂF+åoÄXfNv{Ýæµá†]ÉOw¥•“j¨Á˜A‘V.© eÄdØ_qyâ®XèºÊ—îûkE|Ñ4.oK_Û}‹µ°‡‡øA¦pm.Ùl©Ë˜Ðç«Ú±~Í×›ÒX-×W;‰L%Jd©G°R„B= õs,É4~ÉD–*¤z>•Þ¼„‰ÒY†~,½õVR€D¬ÊJCµ¾Cü°$Ö.'JÙKÍËÛºG¬é•¨ }nB›þ`TY×wÛ éÓßÞ¼l^•á~> GnA&ŸZV¹Ùìc;]ƒÈ †cÉ_¹~Cܽ+ça˜ö‚'PN"ÒLéÁfýj“³L8èC®¯aFÔe¯èቻÇ֖КšÂIZ/î, °³cŠ$ØÎçîƒišd;qî®+rw«Q÷å iû½à­Œ+h=óàâCxÇ þª`P‰8KBÿùÙ}|~Y¯û’hø'ƒcß›ù[¦v “ñ •/-‰£K%WÒÝ-fîvxÿ¤ñ‚ÂäÌ!÷0(K—Ÿ°'jgÚ ]wØÞ»ôÞˆô7Óq⦭~§ ÂÛmãn}ãÔ†H‰— *–³«³ Ûa”4ÒΞ8·M65-m¾Á%sßPÛŸÓ÷Þne¯( ›îõ Û^7Àó¶bg˜Xðt(¤€ðòœŸß}wNy©n&¯W¦,ŸmLãoQÑœ_T$ð¯1_Kÿ÷?pŸ1(ÀÒpús‚‚­ž†Yâ&…Ö¨lwæþ¯:ûSÿ,byØendstream endobj 1567 0 obj << /Type /Page /Contents 1568 0 R /Resources 1566 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R >> endobj 1569 0 obj << /D [1567 0 R /XYZ 85.0394 794.5015 null] >> endobj 370 0 obj << /D [1567 0 R /XYZ 85.0394 769.5949 null] >> endobj 1561 0 obj << /D [1567 0 R /XYZ 85.0394 752.0459 null] >> endobj 374 0 obj << /D [1567 0 R /XYZ 85.0394 752.0459 null] >> endobj 1570 0 obj << /D [1567 0 R /XYZ 85.0394 723.5337 null] >> endobj 378 0 obj << /D [1567 0 R /XYZ 85.0394 642.6584 null] >> endobj 1571 0 obj << /D [1567 0 R /XYZ 85.0394 613.9312 null] >> endobj 382 0 obj << /D [1567 0 R /XYZ 85.0394 133.1977 null] >> endobj 1572 0 obj << /D [1567 0 R /XYZ 85.0394 104.7573 null] >> endobj 1566 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R /F14 980 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1575 0 obj << /Length 1991 /Filter /FlateDecode >> stream xÚÅXmsã¶þ®_Á™ûPébÁð%ùäóÙŽ3='õé¦í$™)-ã,N)R©ó¹¿>»X€„dêz­3íhF\‹g±‹} "?é„%¹Ì£4WLs¡£åz£»šÇ3÷LóëÍbrz§QÎòD&Ñâc€•1že"ZÜÿÜžÍR5]\ÿx3›Kͧ—×¾ êêöìÝ»³ÛÙ\dZLÏ¿?ûiqqKC‰Ãxs}ó–zrú½½¸¼¸½¸9¿˜ýºøar±èu õo»§ Dűô›Ñb+ž¶]±íhà±ìVÔÙ­o÷ØPÏrUl‹eg¶- œ¾¦þ_¸æmU´«hk‚ƒ>A\Ö¨Èfˆe¼>¥‹³0ûxDLY:›¾1Ëbך1g€•‚ábžN ohl€Ž›Êt¦rƒ÷¦*×`ñ{jºUðç·~N¯".C‚ò31íá—EMÄc‡9´®é…’—c£©½ì‚>›fK{eG?ú±ª²v^Ñ8G@ ø‡q›½ÞU]¹©Îh¿¼óroçe,P£ºéhäÎq ‰áââ饽æsæ<Á–&çÀîMU5eý@ÍÒáö ŸŠª¼÷ø´ƒ–¡€µ”}x ë³ 8 5Ú;Š&3xþ¶u‘õúôÛñÜšåÈíV¼MUBHâ¾Ð)ÄÆ4zØveU¹œö ±—¶‡Ù§û=èíÔ1íÔ±ÊUû,½l¶[³ôÉ»ëÌzÓ7è‹^cÝà˜ê1W,ÓI6²˜°¤…uwCÅÏb¥¼jâÈB놾US?@²Ý+-GV#y g‰4ûú{P æR¦L¨ N#2gYFÕªdl*ƒ ZÎGt 90˜fí¤ Íb+8~Ã4ká|†¤&/+BªÞyØæ@Žñ|èU{#›ÕS;ßwS2x¹,*L‡‰M2˜ã vÁ¦EèôIi›±Ï-âžšÅÒÆxÓ¶ÔR¶Pð¾Œö; EiúVÅ'ÇÛÔŽ¨š‡aÎv¡a3äH´äË¢M±\ ½>»úlBI+L6vK4†hik&KÁ]²D™Ú/ªÙ=¬ÜÜnÃm”¼/üBRÛlͧ²ÙµÏ£uä†!—æú=žèÃ@ñ;CsQS:¯jvŽƒªÏG³béßÅmï a¸Žl6œ ˜J §qwj}®L p‘!\y½[ßa³’ˇڭª?ž†NI2æ,‡îƒCQsà³Ænm܇#CøùpaQ´ûgP¼¸³'Ùç¿÷ûWÿ·õ?öúW/pú±ë¶Ì8KE"¾ê¾-$Ës­ÆïÛ°ÐL²4çê8Íã€åH?cjx×9ì°Ôép-—ýA\ ‘,†ÕG2IY,$Uú¿1¡p`„9:·¡ 8ÛÈé­ý¿1½îi9½:´Há)x™”póKsk«è7°B.”Š-SH[í«ØŽÓëu½m@Ç(PÓÏCd«fÂGÏ3\ _ &´¢õ÷™P°ûr &Ò¶¸(º…Ñšu¹l*¼&`sÂ?¾û¥•r›pfu”thnã¦â ¨©/œ<_-Ïkméû4“vm#üˆ‚š]…e\+›ðrVPó_3¡]A†Ý=± O© ÀÄ‘@#œ]Ö÷2põ¥ÑγÑìÍ:œ˜á¦kÕv7(ºhvf>ZêÇ¢H%9“YžE¡Ÿ¾Ìõ1Ètž€ïïV/ ÌýhÒ2•á#—P,V‰ _¹„ÎÀyîŸ ÝëÆùØóÀeéO?WÛb½.¶GªkÆ’4}ôI3÷îTNŸçÏIŒmÙÚº ,¶ÐÀ×n“¯§‰{ Œ¡Œ¨túþ€Ïx>WuqªCôÎ<ê¶Œk_>õ^u×Û6\U×îꎔ©LÀí^oÅ^ÃÀ¿Ö+mv–ýyY5-ÝaìŽ ÆêÊóé;{-ÁîÀ:#ëÇR_¼ÝUÍòŸûµ¼ÝÝÍ “þ}Ék‹ðª¨Z80ÛuYöMdÿ^íD†yXXøDø  ùþ†Jow|1÷߯g–2ÎÓ(…›™ÔêkB)Î!”˜j<”à` …D Ñ+ÕØ«2ï+Ô‹ß°‡ÐUPà²L†up0™Â™/X3ÄBK*þ¬äûÇnÇ,ýw«Ï%¹endstream endobj 1574 0 obj << /Type /Page /Contents 1575 0 R /Resources 1573 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R >> endobj 1576 0 obj << /D [1574 0 R /XYZ 56.6929 794.5015 null] >> endobj 386 0 obj << /D [1574 0 R /XYZ 56.6929 769.5949 null] >> endobj 1577 0 obj << /D [1574 0 R /XYZ 56.6929 749.9737 null] >> endobj 390 0 obj << /D [1574 0 R /XYZ 56.6929 670.1208 null] >> endobj 1578 0 obj << /D [1574 0 R /XYZ 56.6929 644.0935 null] >> endobj 394 0 obj << /D [1574 0 R /XYZ 56.6929 176.1924 null] >> endobj 1579 0 obj << /D [1574 0 R /XYZ 56.6929 144.3484 null] >> endobj 1580 0 obj << /D [1574 0 R /XYZ 56.6929 85.5791 null] >> endobj 1581 0 obj << /D [1574 0 R /XYZ 56.6929 73.6239 null] >> endobj 1573 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R /F60 1366 0 R >> /XObject << /Im3 1524 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1584 0 obj << /Length 2555 /Filter /FlateDecode >> stream xÚÍZ_sã6ϧð[™šÇÿ"Û§t7»—Înº—¤Om§£ØJ¬[YÊYò¦éÍ}÷J–ÙNwf'¦@¢øŒqø#gW^¯™áÂŒ¦‹#>º…¹÷G"òLZ¦IŸë‡«£¼SÉÈ3o¥]Ýôd9Æ£«Ù/ã7ÿ<ùtuzq<‘†-;žËÇ?œ¿%ЧŸ7?¿;{ÿóÅÉq¢ÇWg?ùâôÝéÅéù›Óã‰pFÀz%lYðîìÃ)Þ_œ|üxrqüÛÕG§WÝ·ô¿Wp…òŸ£_~ã£|öGœ)ïÌè8ÞËÑâHÅŒVª¥G—GÿêöfÃÒ!ýi©˜”^&J3gAÆ3^«¼d^9üZ>š€P/¸Þ.‹Öq‡´B=5Â0eÚW–Há;ûJѳ¯f½%F0iÁöhàtZ ’Wöy¹cB'ødše¿r.ˬ>ž(ëÇ)ü$|\¦‹lF”³ODJg³å±p㬎¬‹´™Îóò–¦‹¼n¾…¡÷ã›j…M§Ä óÓªlÂú*l Õ$óÔöZÎÈ;ªfž-i¸ª³š=vÃæ.F}¼NËhO#lÒîH¼@dû Û /M¬uû 'Z€ÊºªŠú9Ö›i4 )­¯g"ÌӲ̊8ÝTô{u:ŽŠ¿~ˆó,¾wc£ž3m•‰ï]–³éÀî$ ô>bZ5y‘7ÇBˆñ;öô:¥?¶£<¨à a÷ÙxGN—Ób5Ëö›12F¥ôƒç²Èv(®·£C)®=!Œ\Ö%Ìs¡ö)Ž+¦µ êøœ=ì×Y}—MsÔQP$\Šó Mˆ@òª¤™p¼(yœIWàîe“O[n`¢P'«ÉP´Zæv ð …(ˆÃ«Ë³÷Û-ÖWÅ¡BÖßk¬Ï÷å›xf”¤\ST··¨…šM%ãûyÚÐ# ܸΖ_B"®!¯HÍ£aÂ’ŒbÞÆºÀKÙ±×uzK/qã#‡lYƒýw˜¬§‹Ãšì°‡Lsv|_t²Æ0+%²â~™=#Å@BAsÝ®Ú4ó49hϬµ:. ìðT. ,›¨È„y(@„¢®"¾˜6‘´ EŠüvÞLî3ü¡‰¸‘ªN‚”YšÑ98ÍTÄm*Ç—-Ú“ú+7|`ÿÒ0§¥[ züμëR È;ü¦g¯Ùo„e"áû‚³U0t^iÝdËúeÈ21dNÝ!K ´’ÂâGâ ø¤ëf鑿ëfuE–QR]¤_÷Ÿ¼ÿ›“ƒ-ubZ—ÝþM `™ö­ÍagÐÒ°íD¡COʪÉo†r¸L¢;^üæ·oœ¯8]ysoºÀÏâ‚ÒEu‡éóyѧ…³ʽßÕuŠØ*.Q}§ÚÔ í{åù¥©i~–ݤ«¢©‡|'¢†’¤nÒ&[@ÆØa¶¾>[˜Ð«¹Nö˜Í8Åœ*æÊ ïýIžŒÕG¶lÒ¼ìj“G&Bív&‡rßQžŸtvÆ:%­ó]Ú§Ïr‡GŇ=4ÆÂj­÷i?½)‘ 8DŒ|ZOº¢î…¢±¬°X¬ÊòRW#âæfü½Í´u¼± N$P-G\±L:¾MÖ}׳öôõ5*­™VÔFÚeVí@ÆZ® ûÌ&P¿¼,«†j}yìÆa==¿=¿¼<}Cc¸C£½­~Å壑œéöe£,ã Ob:/ú?W£! ƒÆ’žö´GÔÐ3Jè™$¨×»†F«;š!8´ÉˆÒÖ„@¼x÷†† ù£Õ†;aÓy›y:›¬ÒŽ>@_C_óÑ­›DíÍ7B2a9å›/yvÿâ#sGXëåŽÎSG‡í<´ƒ¨½eV¸}µáœIÞýUq¸v»Òú»9”ÒÖ ú¿Öz]Ã^xµ€…¤$ˆ!›7On ·ÌI»ÖÖƒ2ûAùäÊE4vä¹£Pµ¥· ŸtåçÖN Ö"¶«EÍÊR¦«²·Ãl—Œó.¬mãÎC‹ÇŠv4®Z< áhφëvÖE¶tiɬ·àÒÊ0! 8ÆwãÍ„EÁ97AÞe»¡xe´L‹4OÝÿ^¼mÑÌk¡»+‰%I„!ôôßhÛ¨·ng3(÷ëßÃmÆï¡ „GÌÔHøß÷C{Ðà96æsü ¹çƒÞÒÉË×0¸»ùÛV{ô¥Û]I¸Ö•¶\ò­òM=6(©ë:¿ h\‡’ê‡ÅuUäSz"­â(d=d+ãoÿ†HjK7D4‡ŠeP¬s7>‹¯º¥"Fy;X˾¡¢o±±‘»e^ð@ØË –RšI'ݦY«›¨Ö=צ=º²ª¿ƒM >>‰7\y>¾BùBì ¼ùPwÝŸ¾é±z^!P Ô›JÙ  ¤l^¡©NA8‡›ù&’I H]¬ê(ã:RÚ˜=#ò}Þ̇yâ˜ç] ß♬ncÀu†/uUñEy|ñ´Ý=íÀÆ+#¤@Åu½Øï±ãÇeÏgM„{RSßS5½ÖÞDXÚ\Ô5xñ¡(ªûl6¨ï«ydº©«ëÄ£‘D]¯ò¢™äåwœš%IØHb¹«Úë' *L’—¦£¡U½û㢯øQHALi³£0F©‘DAJ¸˜a†ZX^1%L›…>¢wF+â™WÃ-Ç´†øßßÌk1„b¯íÿ 5ç(ðsK¹¬†];TVVÏÒØz+‡Ò×KµN_‰ å“}sXüÆ4VTÓ´ÀÚ¯|9>ûôE‰(‘l$­ãm»0ä`"WB™5÷Õò3=`µµ¼I§áú(.(7‹4Mu꨽; ×ÓÉk‹³Öt6œä/Ù®Øn:€Öìõu«^±¶\™5õó-'¼A*x<‘ÑÍMÃÌ’~ɤ8×™ É7íüý<Ç<Š Á2H#Ë UØs¼a’BprmvFýáË*Àà !5±Í*"–UCƒ;B _À[òY\‘ÒÏ}@Ð0h`2®›eðšE^fÛ=Jê(4dù?ˆRd%¹mæ5=F:Z€†Ñça´áóq‰ñYIsõ*@I»Â4­³oûy yø^SO:ÞMüÕ‹~¸ëÎM»wƽo‚µ,\úíß\û<y%V¦Ò©þ^·Í?Ûí8´ëÓðº¶>³/)q)ÀÜHƒ]Èï~w‰+±¥à±ö‘ž9—ø¡㣽­Žçþ£Þú¿AÊ99\Qw•7T ‹ŽO¬¨3N®Ùz›ÿ?y“¡endstream endobj 1583 0 obj << /Type /Page /Contents 1584 0 R /Resources 1582 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1551 0 R >> endobj 1585 0 obj << /D [1583 0 R /XYZ 85.0394 794.5015 null] >> endobj 398 0 obj << /D [1583 0 R /XYZ 85.0394 433.214 null] >> endobj 1586 0 obj << /D [1583 0 R /XYZ 85.0394 408.8744 null] >> endobj 402 0 obj << /D [1583 0 R /XYZ 85.0394 340.1059 null] >> endobj 1587 0 obj << /D [1583 0 R /XYZ 85.0394 309.992 null] >> endobj 1588 0 obj << /D [1583 0 R /XYZ 85.0394 232.654 null] >> endobj 1589 0 obj << /D [1583 0 R /XYZ 85.0394 220.6988 null] >> endobj 1582 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1592 0 obj << /Length 4374 /Filter /FlateDecode >> stream xÚ­[Ýsã¶÷_¡·ê:C|Àåéz¹Ki/é3ÓN’ÉÐmqN"]‘Šã~üïÝÅ )A–;¾ñƒH\,ûñÛÌf9ü±™*²Âr;ÓVf*gj¶Ü^ä³;èûö‚ù1‹0h1õ§ë‹¯Þ =³™-x1»¾Ñ2Yn ›]¯~šÏ^…|þöûﯾýñã›WZί¯¾ÿðjÁU>õ—wôôíÇ7ý뛯Ì(6ûç7?\¿ûH]…§ñ§«ßP‹¥ŸD?¾{ÿîã»oß½úåú»‹w×q-ãõ²\àBþyñÓ/ùlËþî"Ï„5jö/yƬå³í…T"SRˆÐ²¹øtñ·HpÔë>MÊåO³c™UŠO$¨lV.¢%Ïóù²mú]»éh•Ÿú²¯¶UÓ{ùíÊí¶Üá’¿z/Ùhgò ȤÖÖQ¨@óßøÁŒéÌ nf‹È ü‰FÔMÕÓÓϹÊ}Ûý¯åjµ£—ÿ ¢Ð0ñ‚eZ åHüÑw!QXëФ}íg¹ow}¤=¼üâ,¤Î Ï‹)åfÓ>„U,‡_dªêº_·e¿\ÿº©»Þwü×ÑÉÒÎÏÕc”‚ûÿ¾ý÷ë Zg:7ÅeY6ù,OŽß7õï~Ýe¿öOÕnKOÍ~{Syá¶Mx7ßíÚýý¤y4É*Hœàúp•‹¤i§S5‰H“q£UTpùÿ¦ú9ÏyS÷uÛPKÙ¬èáÇ®¼«ü\ü´æ_¯«ÈÐ0ˆƒí*­aðÄ:Ž©I°cp4®˜…¯ªåŒ™yÜ íׂ 톆,×eÓTßÝ·ÔzSÑᆱVÔsóH-Ýc3P[¹ÚÖ lÙ®ìÛ]GýÂt"$MËœÁþdà6õtSZгÒ˰ÐóöûÈ54å¶¢¦®ÚýŠ®5Ù8ʯó}“Iñ³auØíEA]´4|Â¥…ÉŽ7Bä  ¹d^»fµLìq»ö}½©ûG"!Æ?Ჟج{Á–f£%È\p@ÀÜxǯƒ3-o< GWÛ{÷[wÝÞ÷0Ü9x„Ã4tLr5 WGé›ûo½ 8_Æró8øöDV!%¦" CæöÉ0 ÞC3ÆP¥<𭎹IŒÓ Ézþ¡í½t\ÐtRÚú–ûMÙƒSÞv$2ÄûŸöÍ÷Ÿ¨×s„ÙxT¸‰ô?µ›¬Çã,ì(<¸¸Ýu@ÃHè1¬Nåæÿ‘õ0Ý`Mør¿©Ý3_;2 }4Ö•ß¡cUûœ¡owž@wnN|ãQÛà¹î»jsëÏÀŽ!~‰ƒHö¤ñçÇ`”v~¿«·¥c^Ê}¿nwõ¿bÅÛηÚqÝm©(LðPäsõtVýK4yxqæá‡&€&rn#òKDJÀÏ…À] 0·‰/vÀâbL2ဠ€zž-{62ÁL  :Ucí<œFI?t „O¡X0aø+2UȃjQBH*Œ5b†EzmÕË“¤@p1¦x," a³·8ê$–p¹oðSÎeH3WRÀ=*>c¾eOëo,Vo¾Øz#Å3 F¯móÂ>cÅ 0†’E<ÀúÈ©`ÀM&ÙF,£*Ú/¸à@ñÌ‚9Às£! N|Ê4À>`:Zrp'Îk¢Zú­~¯–{3àetèo”íyÁƒ>øy¯JŸªêÔÅlÐ>\ õíîfôð1uec<žÂW6â(wÖû±ÚRøÓ|þN±´˜SBsC­o'üC§‹$Kçc9J”ÊÀM‰ ïG—$â¨3,Öd sð Ïus4+ÀvÅ8{®ÄâøsóÑuaÒw’ŽÈDxè8E`™òŒâ¨3|SzÒFØšºA°Rì•7í¾§>ÐCyw{ŸBo(jÌÐé|dr‘ëä+|Ù3eÙ<“ZT•æyö¸ŒÈ–Î…ƒˆUš'ÎêÁBÁŽë‘´³føõ"t\¦ëyZe<ÐMùFçÑ1?¦Z6ï*?ÞÓÀß’~VÕm¹ßø¾©'`£º¾Œ3¦<˜RL©¡@M °€VJ\’„‘£â3¼ :õÆöº÷üɈAýØ»s£‹´Øõú5¥›_54¤w ì[–]uIð9Ò,7]KãÖî$ÆÈSàIÙŒÊ<ë†1¯aà"BêcÑLóåí7¦Nr~³÷«¶réªoZ—îôžÊ”Ês,({¦( /ŠPrŒ”¦A¦†Ùg Ò=1U4d¯ Ü{®]@â¨åÊ·¬ý2\‹/C*+]”v_n2p9Ü#áQ€+7ãk™Ç‡ñ'ÇMR¬HžuøUÕ'=K1.ËbÞDÎ/­íø­J¢(T¨oCƒÊÝbŽsL¿à°z4îÁe=:?H’ñ’Nf­zò±-tÞìëM~:£Ë:áÀû–¤Ÿ%Eß<(Þ„o:š.ôAbù´”!5Q<¸k—áÈÌ÷Aìf¬k0‡ˆ(‰/P>w¸0¼õµ(S‡ÒXµzêââê¼8>8Hì5l žj?GoŠ¡V} ÛÇD¯Kê=ÈÓŸxSñÃBSWMξáaW6]¸[f,¥…ÐNÕOpdÐåwžÌ¥?É\ãQ…Ë“`ôªöÓ’OçSè2ažq)íÔ?­ê»º§ÃI˜òݸ0ô±¹ö‡™Æûê\6­Ã™ ¼lÁá—wáÃ8¦_ï}“ã›wø@Ï Ož£è¬òüéGn7î<ÂZW=ß–Ÿ‰-\‡w×B-øì©Nß·]W߸2—ðP[h:|ÇwÃD ö†0IAºý¦@»¡Ÿä$ôP?ƒµ§¾Ôîv14ì”èV ë/ˆALçœ/ ;ztà~‹çò $‚|„Ç«líî³_jp¼X.eÒØzG \‚¾•©Š½Ë´Y؃ôÔ`k¹.ÆS;‘–Ä¿^Òk7ßâ Ä#µ¹‚ Œ¢Ä‡¤/CEE”c×Â!€3ˆàÿŸo±üd<Ï.o{—TØ´°k>ôkH•>À­¾Ö_7€6›t éSÝ,+ª£öI%!U’?ËC™áÆÒÄC!u‡™rï;0wA‡âÝì-ýúÎ!7߃¿®‚ÛÞƒZ;#ÁQ{w–hßÒ/ ¿4ÔÂ^¨¬È4…ŽÂúØX¬7¼ü{ç¶O/4x%‚Ç6 (Au"èY×wk?ºº£+êqWرÁúceºxÌó¸p¹÷#Ã!½@/ßÕN9íîü´Á–òãÂ&ñž¦¢ûi*Àkxè Ï÷]·“.‰w"üe*gXפt©G¬ÛýfEèñè)ÑAwÁùEDë´ "}9Dˆˆ¬jw>@³zæÛ‡†âëÛ gxß©[ñ>l^€7à&¥èÞvñ¬«^ã‰@Îü9èsìr'6Á&^R› Òµ 縒Þ?LËÌ*äZø°wÁW¡-}Ùdgý¥úÄÖª¬qô+ìámxD˜ñhÂÑÎKgLœæ™å1l>î‹@7>ó LQ†“¼àâ6Ò‘÷nc˜¿Œ#® °¶®ªér~±‘?_†u ¥á&Ž©ýç†<bÞÂÚý’qñ>ã²2“ò𨙞7•çLœ¬‘ŸdÖðSOxy õp+j-nüÌÞä-žrP Üý×¾zŽVåMøÖ…ÔÀà|€mqb”c*îȺô—”FEyî°Ñ¥o{Xû‹YƒkʃÆÓ·GÉ“•¢À¨UÝyŽÇ³ ©%¾ ½Œ „Ûô‹¹j µp¬"©â¥€.LðÃÀë”za¨°IšLž¤éïÜ%ó~ضþë”¶fÒæÅ8 JrU†ÿ6–(æñÖä‹ÿ;m¨v‡”œŸ¨ij“@)d\Õ/㿱³þ?â`endstream endobj 1591 0 obj << /Type /Page /Contents 1592 0 R /Resources 1590 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1597 0 R /Annots [ 1595 0 R 1596 0 R ] >> endobj 1595 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 314.0348 256.3816 326.0944] /Subtype /Link /A << /S /GoTo /D (rndc) >> >> endobj 1596 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [268.5158 314.0348 332.4306 326.0944] /Subtype /Link /A << /S /GoTo /D (admin_tools) >> >> endobj 1593 0 obj << /D [1591 0 R /XYZ 56.6929 794.5015 null] >> endobj 406 0 obj << /D [1591 0 R /XYZ 56.6929 769.5949 null] >> endobj 1594 0 obj << /D [1591 0 R /XYZ 56.6929 752.2372 null] >> endobj 410 0 obj << /D [1591 0 R /XYZ 56.6929 610.516 null] >> endobj 1342 0 obj << /D [1591 0 R /XYZ 56.6929 579.8656 null] >> endobj 1590 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R /F48 1258 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1601 0 obj << /Length 2364 /Filter /FlateDecode >> stream xÚµ]sã¶ñÝ¿BòLˆÃAsO—‹}uÚ8©OyºÜÜP$,qÂE¤ìªmþ{Xâ—,·žŽ¸‹ÝÅ~aÅ~lJBEä/TäI™\$Å]l`íÓs8^‹äõ±¾_]½»j‘(àÁbõØ£†l±J¿,?þåÃ/«›‡kKº ȵ'ºüþîþœ‰ðóñçûÛ»O¿>|¸Vþru÷ó=N?ÜÜÞ<Üܼ¹öX(ìçŽÂ™ ·w»AèÓÇŸ~úðpýuõãÕͪ“¥//£ÂòÇÕ—¯t‘‚Ø?^Q"¢P.ža@ ‹"¾(®|)ˆô…hgò«ÏWïöVíÖ9ýIr5£@ÎŒ‘HJ>РŒH ¸°4BKP¥t™•I~H5Šø¹‰]è²qï㢈÷Fâw·>ë] ]áB*K°#ÅÇ,×e\è÷¸oÈl’¨†'Á+8ùAÿF)/³&«Jœ‰Ë_ëx£ÝQü<‹«­îø9!±ˆPN}@î‹1%&ø~‹W÷˜¶ÕzßÔ8h¶z§“Ìp­ £"X8w‹q3ÂÞUYKîy«÷×,\jÜÖÌ2ÎýD à·qî˜ÖeRÊÆ›C.Êg„‡,\xݾ¤H)^ÃŽ"Lj†P-ã$Ë33gø §X‰Ó"+³ºÙÇÎ`±zĵ¤*j7‡þ"*»FŒõ¿;½/²¦ÉÊ͈<ʧÝJµGHÐ^‰¡ž÷Ò¹®»*4Î4[X¬qv}hp²¬œ©àÐ} 1ÇWjy çØYý¸Øåú;qŠ|Y¢'ý"pIyŠ+³˜ùÝ>{Dü®×lY·¼ÄnoìlʈE[y0 ¶ÒÇëÜy_UæG„ÖÀx6B`ôO`1-É+=]9O7,¾)ÞXRú–¥ÿËÊÆ‰LÜXœo*¸´m˜`GpE@ÌZ'{ÝLѼ]ÔÜŸçbœ¯ˆA'xxAðÿWx㜟GÎÛÌéSB€#•˜ |–)2fÉ cüÔ[gM©ƒÒìØí²bàÑÚ7‡Z#ð ·€ÐêóÝ'„~£’ÖZ«O 80é`Gâpq¿Y ðÐˉ¾×߀9±/ð”®ü³NPû†#H©n¤$P0Dn&y¹ÃºÄÄšáÁVo H*ð ° ÌŠ’q94Ýd—¥ÎÑlÎè”AH— â¯a@Q0ž—uÚá{ý Sy¦t:ÅJÂOz `¡}ò­vX—¸˜Pkµê2c”¨@Å…„ Á^Êh!Q .æ%ßœÀgb&›Q™Ä%U’öÆn Ã)Äñ¦ÚáL®ŸìÝüÇ’?“á`²+'ÌG*‘,usñŒL9ˆäªê)ÓÏs YÐÞX*ÈY<’Ë¿êc'¤ÚsöF öæí#‡-~ gøy=uÊRDø\]ÒxäÓ‰Æk¤Ž*`­ñ qgÀT^yŽFx“‡Hâd²h.SÜ$1~9:C9æ´Ë•$‚©6”­5û*¯çª ¼_²‰ÝXmú`¤`Àr¬Íy‡¦> X:˜!8å‚C·ø^ÃŒ+Mè¾Ò¡%ˆæ›ÀÖ#?uèëj§0iX(µË kW”´ Ëeϸ•/èoX#taA 6ÎE)Fö'‚‘ÀámEƒ`!"ãk{̓“( Ãùç ×Qôú$­²†¬A=àGÒ?lKñt΋œa¡ß“fàuWËßËê¹D0®ñ‹ 4k¶„á-íNŽÏƒŒ+iUÄ™ÛïÊE€eöÇAÛºF¦Ê&{> endobj 1607 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [406.6264 463.8552 456.8481 475.9148] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj 1608 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.5805 452.5676 196.7992 463.9596] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj 1609 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.6195 409.8565 159.8382 421.9162] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj 1602 0 obj << /D [1600 0 R /XYZ 85.0394 794.5015 null] >> endobj 414 0 obj << /D [1600 0 R /XYZ 85.0394 769.5949 null] >> endobj 1603 0 obj << /D [1600 0 R /XYZ 85.0394 752.3146 null] >> endobj 418 0 obj << /D [1600 0 R /XYZ 85.0394 717.6455 null] >> endobj 1604 0 obj << /D [1600 0 R /XYZ 85.0394 688.3332 null] >> endobj 422 0 obj << /D [1600 0 R /XYZ 85.0394 619.0499 null] >> endobj 1605 0 obj << /D [1600 0 R /XYZ 85.0394 591.4512 null] >> endobj 426 0 obj << /D [1600 0 R /XYZ 85.0394 513.0222 null] >> endobj 1606 0 obj << /D [1600 0 R /XYZ 85.0394 482.614 null] >> endobj 430 0 obj << /D [1600 0 R /XYZ 85.0394 275.2452 null] >> endobj 1610 0 obj << /D [1600 0 R /XYZ 85.0394 247.6465 null] >> endobj 1599 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1613 0 obj << /Length 3170 /Filter /FlateDecode >> stream xÚ­]sܶñ]¿â&O§‹Á’Õ““È©2:Êt:qÆÃ»ÃéXIõȳ¬vúß»‹]€ä‰g{¦=p±‹ý^œäBÀŸ\›ØB‹¬H#¤Y¬ë ±¸‡¹/$¯¹ ‹®Æ«¾»»øö•ÎERXewÛ­<y.w›ß—6QÉ%PËïß¼~uûãoo_^féòîöÍëË+eÄòÕí_núñíËŸ~ùöòJæF.¿ÿóË_înÞÒ”eßݾþ0}Î}{óêæíÍëïo.ÿ¸ûéâæ.Þe|_)4^䟿ÿ!¸öO"ÑEn0‰, µ¨/R£“j0û‹_/þ ŽfýÖYùI‘(mÕŒS9`n“‹|‘™"±Zi/Àõ®l·ß”µ»¼²B,¯éó;}ÎÎ'IBÀ(„Å•”IaŒ €òÔÿs=^#¦“H¶fI¡U>Ðà­0ùí+%qÓI¤Y’Zk£ú¥• 8dßÞßWÍ=©è×¾ì]íšž†?¸wB¨¦ê«¶!LÙlø­+Fâ‚£”I¤ÌRÔÝÎE††EJ$BgãšÀÁsb:’×usZgËuÛ w÷Çå̗®Cl¾,iò±Ú8‚>–‡ÊõO4h·´*^Ú#ð~ ¶í€~çh-éQ;|t4j´üL-oûnæv,E ™1Ûl 3×»JA‡&ËõTûCÙÁ‘Jƒ¼»®]WpïÇrÙû‡cOsµëwí¦{£¯Kž‰7Â-¤2Àv¸¯P8ÚÃhÏK«K æõ4O×F¨ß]¹\—M@9†VަŽÛLÍ• ò±òtß3'¬"FQÁEïÛÃÓŒ¬R‘Ø<ˆ4JɶôíÜÞ­Ùnwí#¨üöØÑ`½i: %à·vZ2cK²% ‘¸ {[V$`Ò]Enô¦Ù£,ÓtÙ6sWKUR¤‘çÏXy–h™æÏ­IWÈYjH¾ã/ ˜ 9§#lÉëê²a¦ØîOV€h’qåÂDÇâÕùX6=^ýJ‹|y»%$(pXã9ó’É!ŽZm¦6Ü´3‘:ÉTž~•@laNòb°£¨Ÿ¹†hPÑê±Úï Z¹?ÑA“ØI EV½š c>ÿÛ_RIžûu£;Fkõ 7n[÷}Ø5ƽïž: z=EnÜêp¶OCýô€cþ½Þ¡ŒŽhŽûý”ÈÕ ³'‰á$XkÅ"Ëýš[ž:BÈ2(C@ ÏdŽH4Xü¶Þ;r ÁÕ¾ê<ëˆxôÑ¡HÔ[ã:K1{^°+ùœ•b3Â{(7a#2º™4áfÒ.s¼™V˪§™GO&¦Ü‚&̲k=#Ì|DSh¾Xu|EvJÏ$78â1œ1¹ÆßHp0ßCÀö²˜Óé>3Iª¤™*ßërrè9ï¥ËãÊÀ@@/ÑZÓb:ŠŒ8"åÜS”ØÄEÝSÓ—Ÿv?ÙxKÕЗ3©žQ*ÌF¥|ßòŽv²3Î5ç$æ8:`úž¤…"sM˜È& «íIXy§T:+¤UP¥æA_Ws |ÑOˆ˜zŤ’sM÷àÖÞžs̉A}—&Ö``ÕPÍʼÕn‰äêí.pª ?ø…ò㫳—!<‚â™ÓP_|߆´„Ù6n*åºe§õGéb, ƒÅ¼Ó*¨›ó±7¤¿k"üÔù^%Ë­.?ðáA€œêFÉtXO×D:˜ÑBᜉ4¹œFýð!$g³‘,­ i6ÔÀ0]»žæªf½?b¡‰è2¬ïÀÅÊa9”G_¬À$—R€íʧŽp }f%ÚC9‚‹|MãÀ×7„ðÕ)zÎ8¬É÷&üöüEsˇîR¤Ó9múj}Ü—Sâ"x[®«=–RÊåÉvrÜ0u78nìn~YLY3‰01Ô0ØTÝš©øà—B$¼í‰ ZÄÌÕÉÇ ”ùúÔ±ï9,ö«ºê I|ŽåLØqaœSa–S囇Jp+ÞT®×î¡÷E̯žN4Øwˆ8 œ©ºÙÂ1O i v‰ªÙ¶sÁ&OrYÄ`#Œ|AöB¯—é¡©¤à @-³ÁÞpà#-|£%ã œ«Ý¤Iò4$5l6s®,’¢Ð6ÆH×8ˆõŽOO3©}ö‰AC¹ƒ#n»fómËüªÂ« Á bòðÔ&¹ÎíÔBÁcØçÑ´ý4Æ >íÛÝ'l nTþÏ·¶_ DPVg3bR2ÉlÈ$Ó€QØ!`(“#µ,€÷i‘£ Q`ú÷½BAÊD ™Z1dˆm é Æƒ°«•ð)›(”}` ÃX}@ë͆LLB‰£‹9d¹nc"žÍP“F«veÅ®u"ióùG„TÚ<Ú¿/#fÝD*cç„­3…­3”qµî;š$ÓÄUw\æ}&ó1? Ç4A<à„) W~kÙÐìàb€õ1© ï€XµØ'ãºÀ6±^ØP'šT¥SaïI‚>„YÉR ”S{‡/Nûè#®lé»rë¶öiÀ¦Ü–:g8¹×±^aäSí¹9JzêôíÊá`W®w¼×ÇeÕY¶gÚ&›YOÄU§%{ EM‹3ºµI*t°œx¿™G™XkGÊ4×È×±üå7“OU×Ç·ÖøZ0Üg(¨» â>o+àf›3YûlýœÇ$xÞrkN-»úõ.HœuÜÜð—ÞÐq:´=lÄôÙK*êWû¾ºIEå… ¿Eâ„Ä~„¡ 9@hjð C£3Wh UF–Ù/—ÒÄKûò€‚¯¶‰ÑÙIyØõ-ƒ3„v‰4§ù) ô\ˆˆ‚TàSÃlè™YÅ`˜*õ…ø•²§.‹dÇ®ª£«âëaï~01`*Z8À£(¦ÇO0@›~14ãä×B'ÚæjêØ#Q -%9z»ß“¹(~ðUØ=¬Õ*¢WíGÞÁݵòM|÷H\TY.l0†JTÁaÅ'Íþ~¢±—ÉâËòç WU(9ø MK'ÔíøÜMÙ—Üm@”fâ¤&ärTPe_´«ÞWE‚š ÿÝñ,yǦ¯xg×Ö<Ûû«v{µ"©¢vØaU]MCâ¬év¼áÀô—9\Ó¢ó'^ȘiÍü“QlMëòSUëÀ(¸ÊÑëêäé`åvåÇ*¾Ÿ{H rÜû€vúd9Ž¥³ýï ÕÒ´îÈïV'4fº›dÐc}1”Ê" ‹but’µÉôWy9²©Õu³¿»ÉÌ‚Ò|šb—¿f•Í{î!ÞOðüƒœN üW‘‰>·ÕžÿÛâÞŠÕÕ7„BŽ4}H)Q_ϵ‡ªé¯¨cÅuO®»>÷ÿ+ÐMá?Ìü·‰ˆ? üÏÿÛ2üãOš%:ÏUü·•©b³> endobj 1614 0 obj << /D [1612 0 R /XYZ 56.6929 794.5015 null] >> endobj 434 0 obj << /D [1612 0 R /XYZ 56.6929 696.3453 null] >> endobj 1615 0 obj << /D [1612 0 R /XYZ 56.6929 666.0554 null] >> endobj 438 0 obj << /D [1612 0 R /XYZ 56.6929 459.1977 null] >> endobj 1616 0 obj << /D [1612 0 R /XYZ 56.6929 436.7104 null] >> endobj 1611 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1619 0 obj << /Length 3660 /Filter /FlateDecode >> stream xÚ­Z[sã¶~÷¯ðä%òŒ…Å•7OÛ­lÚlÚÛ>$™ -Q'©”·ÓÿÞsp^dÈëmv<‚œ¾sÄ%‡?qi ã*Ó—i¦™áÂ\.vür c__?g&ÍdzþtwñêV¥—Ë™\Þ­FkYÆ­—wËgo¿yó·»›Wsiø,aWs“ðÙŸÞ½ÿ3õdôxûýûÛw_ÿãÛ«TÏîÞ}ÿžº?ÜÜÞ|¸yÿöæj.¬ð½ô+œùàöÝ_o¨õõ‡7ß}÷æÃÕÏwß^ÜÜõ¼Œù\!#¿]üø3¿\Ûß^p¦2k.ð™È2y¹»ÐF1£• =Û‹.þÞ/8uŸÆäg”eÆÊ4"@-FܲLgéej2–(©œ÷MYuóEÞëºy¼š'œÏ‹ö+dír.Ë‘¹,3FºOþë_ÝJ9ZÃd|S™›s·)ü¤ PšX˜ŒsÚÇv[¯#k)Á’L(?mY´]Yå]YW üLÎÛüÐÔ^–Í•°³bѵÔÑmüÈb“WU±õ½õÉ(ìÝ;j w­’Ù»°JîV]vEÕQOFúï‘vh«Ù*_”ÛòJ̺GêÈ[’žL¦`©é;‹¦¼/–Ws¥³YYѳ‹ ,5,Ñ`P˜dÒ$©Ÿ¶Ëýšû|]0Ti2ûKU}/‘Û•EKïÄkT]Ú°L¥A¿MÙ\ 0záç\G–s%D 4×DËPI*_ºÊ./·1R8Ó=¹g ö·Ì‹]ãH%Ì(i_JL~è6g‰y1Kg•+-#J_ºÎv•¯bÏ24×`¬ÜÀ‹7VÂת8¶1’K3þI† ¡ƒÝ‹}lÉ«íÇV1~¢‰* ,'“楤 ®òbZÏœlýÒ•VÝþœœ¹xé"Ûz‘oyL6`‚ —Ÿ´Žøÿ×1ãuäg¢G}¦uôgâË|&z’Ø:&í­¬ZƽŸN”/•¾€¤¹LÔlS‹BN8«ëŽ55ÆaSóCgDœp&Uï÷Áæ* ç'n8üÇðL£¯K‚JV‡jqáu¿GZ¥ß¿¡úÚr >ÊuUÓÁX²õ¦ L“¨ ×à6u›}ï×þו1`9Ëúè—Ûå‹MYaô‘!Ž FÜKÇÓ2®dŒSI¹ÆÍPùO·[q„³¹ȧ„µ¥P[D<MCú ‚ÇÄefǺùÕŸ›mùk4<µâHñiÌ—--ÿ“”\qÝ8„·k(~_ûŽÚÁð4Šå‘út¸àØlÛšºî=É@û’ÆÊõøÓ¦ÇÒÖpÓjMê‰fYjOà´íš¼\opw™‘rà‰'PñÙOœK‡TÐ(¹íд£ Z‡Ö¯ÿ$¦¶LØô£>„®fß ö[ˆÙˆ9 Žöúç¶È[߬W4‡Œ :zÃð3\ÊÍuùPx^B“¨Ò(ÌtÌó€ÅÞ{Ëm‹íȰWusbÙ>7û*vJ…ðÜ€ð‹&¬× oŽH?Û;ÑÞù­'œå“£‚¬EFV^pør€îŒÚÀÒ¸OÕç:–pƒ8‚EØd8©Ï»ÃTÚ»ÎáøÐú$ Ç—;x[]ÑìŸüw °U ¼Àß?Òû>oÑ A½JCø4Ñs·qÒªë ¦•VÌnQµ €©ø=ßí·rÌ ì‰¤rÁäxjpRŸ’ãËà ñ #&7uPµën#òR\0Á­üX§9fÅÏÇd¤™Œ¥†ûÙüÚp“øY÷‡Ž¨#_ˆTƒÆæ>É4DyÜLÝì:nU¥6Ë&Œ°cÞTÃô1’:ûPæQÊŒTúeƤlj#ÂÌ‚|€ârt6qÏ&öžx“)¾ È uX´¬Vu¼f`UoògÃe,óñ1墈©†c,d‚0„Þ{ò—d°û}ïÛ•MY¦¬Zö;ǘ!„ÂF[ÂÑ ’¾¢û%œP<™QC®b ¯àíXö5€ ÚÂF«|W,cLhÆUŸçäv+Àx²¼XĪYjt0Ôó–J’²/¹C «zÈËv\e„\‘z œVÓ2^Œ-Ä–¤úÄ]ëÃÖ»W}ô¸€|êJ?죥¼Rp+¤Û]Ü·|b¤d²žnY4Í™OË4Z•4Ù(rÊNª’IO]6ªJT˜lm‹“¼9hàKÿeÛÁé /µ¤IH2Þøo:Ú+ßa ,0Iqn6ëŸUWTK²

    e¥Ò1§lót°÷zY¸´ZRŠè’ÛâÈ &ü‘ÞÖÛú>Gs²‰÷^ÐLû8zIQÉlíͤ# ¦!V…¡ºÕN&¤Q0e"óÄQJG,w» /.ò‚ár±Ç @ÉF£&…鬌rÖAkQR|­lõH}p*‘ðv.}—[ªäãØ (ݧI$ïÒÝ®ýú“û””ƒ3! ™ÇÖÆ‚äýÁPUîI^ÕÛm}t—#¶rzìkp?Îàð O/H{= ³2Ù0¾ÃHê/!€QzÈpèl4Õrá¨É£ÎUk–€EŒ’•xÍÂW½fñ¼fí5‹h—{p¤àÜ’RÇÐ76=•]ˆÇ–Ó¼åᇇ¦*<‚7DQ^RÞ?Rï³¢ÏÏ´æì•b<åOkjgDÓA³r–fö†ŽD6=8vìÒ¬%°ö­ájŠBÖÂÙáÌøìÌRë%ã}ž™ë7\xY”ãpÙ±çáä~ªËËmp²õ¡Û:Լ೷ä¼Be§¯ µûbQ®|v–úš¾Þ d”Í !f×'9¢Gÿבw‚à½+Å+K"¡\üâöùÅÛ ŽüÇñ½È\•èfpÒ«ºþ⫘òœç¹À¦ú£W¤>Þ6x´;jŒÌFõ§!ùÁÓs†MåGš½#£ž¼z¤FWî ßÚøFp¾†}îòt{áÂM"ÞµC†¨Òx Ý´™U=B(«'‹Ããì*ì G΄ҒsÐ}Àhù€^.b ¥˜è/Gé$,MiÕ…'Ž D« o삇ޮöªÇ­äi®7J¸]…¢?&ÓÀ6”û\|®XñT  TÛJ—÷NË9XfÓ>ܸÀL €bçÝ5 Tcù¢VÁùë³ÂØbjèà˜3,ìò·0=!XûtëT…¸Ó}6ô ÔïòÇñ&#x €¨%šÙÄœä±TÁD˜\V¤ý•†Ç— _ྰœaÑÏ×Sðe_{tTðµ-«E4LIã"}"*¾ô ëÂl¿ƒ3¯0$Œ†c etR&›•P K•ª¦ÿUÈSj’”‰Ô7®b´N˜–üÄ£xüv€ŒÉåË×{3h!ªS,ë†ß à›+¦fö§‡>òV—úÊ/<Éê¨íL=Ŭ}‹£ ܼ…\ 5\f019(-™}=äðLñŒ-c9ñÕuŸ:UáÎ.e+ˆÓôÄácœ‚·€5Ðt¸/Ä0³—¾x­{ßNß\gÉ™|WªŒ)ÙƈÇ3 /z9Në‰È§ÛRá[Ιˆà„¦h»{Ÿ)_{ÜL Sî~e|D­Blë• ¡f¾=æ-õ:ECŸ#·ðS](¥‚•À(ÅÕxQ˜ìJ Íkª á1@Õ@šÜ›[0 e§‘ £bÏ7ÅP[7¤axºÀö’U$|3š›¸ŠFÔ;Ò¤¨j»Tb>ª_&³SÍ<¹dª«X57 ‹Ùzêm¤ß÷sp³œa^só2›(êYUÑä[%x=îkrá­™ÄÜò|Üv7’R¢F'X.84Ô½÷WrTIvú†ÞÅ&2D ÓET¸‚–w OìÃŒgK 9˲>}¤z F«ü°íˆ9å&lò¾î‡œ”¨|K+{ÕÐi¢½ Éý ºV—üõ}ág­Îý°W†¿Æ˜2ü{Âþð~‡_Dë”)keüP€sbVfi ¢Í)åý¯ƒŸ’þ?ïÈendstream endobj 1618 0 obj << /Type /Page /Contents 1619 0 R /Resources 1617 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1597 0 R /Annots [ 1621 0 R ] >> endobj 1621 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [173.6261 177.8154 242.2981 187.225] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj 1620 0 obj << /D [1618 0 R /XYZ 85.0394 794.5015 null] >> endobj 1617 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1625 0 obj << /Length 2078 /Filter /FlateDecode >> stream xڥ˒Û6ò>_¡Êe¤* À¸>MœgR±U[IÊÅ‘ ‰ŠTHÊíVþ=ÝèEJôØIJF¿_€šHø©I‹8Õé$ICIM–»+9ÙÀÞ›+Å8s4ïc}½¸zy$“T¤±Ž'‹u–Ò5Y¬~šÆB‹PÓ×ïßÝÝ¿ùñáf–„ÓÅýûw³¹Žäôîþû[Z½y¸yûöæa6W&RÓ×ßÞü°¸} ­˜i|}ÿô÷ ¢·w··ï^ßÎ~Y|wu»ètéë«d€ŠüvõÓ/r²µ¿»’"HM4y‚)TšêÉî*Œ…Aà!ÅÕ®þÝìíº££öSRè Ö# UÏ€FŠX©$JEèÀðåËÙ<–rÚn--[´5­ó†amV·vEOy»=;s=__ÓªÚ·yU ´ 7WJ¤Q¤§u^0úWe¶³+Qʯ^az™ŠjC‹¬òšÅ[êÚ–Œ³²>Vض2 ¨i`£ÎÛ#Ÿ8‚<ù’D™ë@¤J†C‰þèä¤m²Ýr›•%p`¾ëìP´švek¶ßÿÝ©QŠ^Ç'òmåÍíHŒX†v^éä VeqôF*Ùeû:¯Núæåšea›o¶vœãÀTxôÚ©<Eß:*i Í¸uÚªi¼¨Çv›—›Nµvh3ØôÑÀÜFl„¼YüQ¶$þË;­{iƒÊ¤Â˜$u8 ˆABêç––"„•t( çÅAAžq8‰#ÂXÅ_R´H1ãµaî Îû]ÞdS*Aºvh$$æÉ¥ºQ V¥s]ÄÓmÖà"¡Ìt犂OŠÏà š6m8]×!4¶"ˆZ?€Àr êU† ®ÚжËØO^"—†§XLMÈïñ™×’G .ˆµö’ºP©Êë–`HÏ…dJ•v-9¡ñ˜ä‚-Ä„ó†‰TëA®p@®©Owøw(8!qœJBrW%DÛÙ¦É6–eÎ˱1˜Ç2mz.t &Á‹pÌ>„Мge€´£ã¯ #˜¢àr>ï‘H}Íê37 jÓÚ <‚Gk"”<|Ùš묉ðŒ`]¢!ìÂT¡ñrƒ!Œ‚~ ¢/§UQTO]b9ä.œÊ¬Ÿ'q(ù×H—ÃÂxÒµwWô× áýñØ€3_ ®‡3ìÙK Íx7˜-Š0¦”ާö÷l·/¬3LY¶½nh£ÉŽ„ÉvŽ}^ˆ<Qh9än`D0dWÙ2šÑ'õ ææJæ€EV4Œï™ÅÓ_­Ý3[—ôêÑy+©…2÷[|¢á‘þ¿³TC󾿮vJ¿~mî\þ¬ûÌå vwüàMña°1zÝWçýãù»÷î>ÓaÐÜ÷™§‰ýFE<Ø Îâ÷s \uß çUééf=î”_ôzÓ´L0ç•a4:FFx‰$8]æð ãR\Ú‚áµy,²@ÿDH$öLø}më9v§~… ×‹^ 8wÈLCN­ç(<ÿÔq×+Š2<µvü 4BèÇ,/²Çæ-† †ÄpS(,¶¦åÊ6Ë:w£*cUëaÃ{{¶G]˜p[çI—N™{U¶Y>þù¶êT¶vÙÑWšÕÊ®†q´>ôî QÿŘ \¡m#.ž~d ó—L'‰‰¢wÜÏ=ý@׉L>ñ0<´•É.‚«B4ú2,»KÂ?~‡>=Ò‡‰ŒÑ§§¦A $n‹Æ>´Ðèa|ñJ'úŸ¾WFéendstream endobj 1624 0 obj << /Type /Page /Contents 1625 0 R /Resources 1623 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1597 0 R >> endobj 1626 0 obj << /D [1624 0 R /XYZ 56.6929 794.5015 null] >> endobj 442 0 obj << /D [1624 0 R /XYZ 56.6929 424.8255 null] >> endobj 1622 0 obj << /D [1624 0 R /XYZ 56.6929 400.0436 null] >> endobj 1627 0 obj << /D [1624 0 R /XYZ 56.6929 83.0722 null] >> endobj 1628 0 obj << /D [1624 0 R /XYZ 56.6929 71.117 null] >> endobj 1623 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1631 0 obj << /Length 2918 /Filter /FlateDecode >> stream xÚÍ]sã¶ñÝ¿B3}=|yoŽí»:“ó]mu¦m’Z¢%ÎQ¤"RvÜ_ß],HQ2-úæä™³X`±ß»€qø£H3®âpdãi.ôhº<á£9Œ}8~θ™4îÎúyròÓ{eG1‹4£É}g­ˆñ(£Éì·àügŸ'—7§c©y`ØéXü|u}A=1ýœº~õá_7g§6 &WŸ®©ûæòýåÍåõùåéXDZ¼ô+¼ðþê×Kj}¸9ûøñìæôÉ/'—“ö,Ýó ®ð žüöÍàØ¿œp¦âHáƒ3Çr´< µb:TªéÉOnOþÙ.Øu }ô ¹`Bj5«EÖxŶ*Œ˜åö…m9¬¥a-­_^‹à8¬å› ÄîRc¡, µEþJŬ1QË_):ü¡b‘Rzdµ`Òï‘Á³ô>Ùä5æËÎ| ±Õ¡…MpÞd‘žŽCe[ø0Á4©Óy¹~j†~ç\iEŸ5˜ /çó¬˜So¹ª³²ðSîË5îŒô‚ÅZK·Y½(+„5¢Ù!s‹Â÷ã"]ŸŠ(pÃ<(Jê®Vé4Ãݧ¬,ðk¾Y'¸u.’jw7’ñ»4-HêšÌØ¾à… y@Z9êÒøÛø†¢@ÑFcX2<üŠ% B½, &ŽY¤M8$ Bã&DõyZ¤ë$(ˆ8DÞLã$ÏA«e,‚IñD#õø]Q»ª³<§fB¬+~¨ýyRUŽméŒz²¢.ÛÅÇ}²á¥áGâXR̨Âöä»p7l¤ÍØfE¿è¼ÌÝ.Ù¾ûÜUGå®Õ,‰உ #“¢'ur—€Z ±÷cZUÉõMiÅrТS c'òÈý¢$(¶‹{ M…üÄàgº.€%O4r÷Ô¯ï)q¨H–¾U¥ë`ñ¶ô}uÙè>~þ¯,Ò=)˜&Óf)Dé£;<£›½~ÉâeFØ4æñ£eÚZíˆY¥ÓÍ:«Ÿ}¶Z9r–I¾GÇYZdMgyO¿Dú?7iUWÛÁøÛ¨ð¶„Õ" m‡«53R*G¯Æ§ ö|ßù ù°'÷²¹JÖ•sˆ;D÷ܘ‚þÁàwp?‰ßÂHÉæ!d òK†`VeŽz?Dâ‹ë[ˆ$¹òR P$õ^Ú ÚL8 §¢iÎÂ`Í ©²‡”Æò²ü²YU4¾"Ñëz ZY¦žY [ïÒE’ßïjÊ4ÏÒ¢®ü„Æ-m-TËúgæ¢á|ïô{¶YÂ0a¹⻈¡H!eÿº÷dÏŠAÖÿ·5ûõ:)*€¬Úà¹ïȪ®õš¦ÙÃaÝê \ó%ŽJc2)ô`À-‹¸°»4.7õ¹‚ë0y;xÇÞAÇ’I¹]Cdr»EYg÷O¯ ž‘Vן&Wïÿ³cùërZæ/¯‹Õ÷L¼ y8äZuXx×ê,æ ñ>ïxÈ>£û5¡ŠG4:&=55«¿†E §äLËhP-ঠyªM±ÄÜ œÕë£}-$hwÒp¡»‰‰™Q€  ×ê[XÆãPúY‰_sS$wø¸õKú¥,³¢é^¸´NÍ7J˜]¿ëÒD̈Ûî, cW@p‹ }¾"Õ¤ n$ñ°X+@G”Ÿç•\q¸ñgxÈÒÇžƒJÉ„2±ŸɯáqpF'2dQ¡øÎ ÈšZäYÓª6Ëe‚•üp~“¼*ýÄr>w±†%ª¹ßEÚƒ³°ŠÙ¨¥û‹ª„уnxØn„rê%(’»Õ‘ÉÂ!§t§Ø#• šÞ;P2ê©Hÿ凸›Ð@úBòËM®géÚ<˜É«ˆâ$˜ÐÖ—Ü&u_Öq7õn†ØO!mA|•hÄw“÷Õ8¤`ª!Î")Šô%î¨ä·©ùÛZbAZ¨-±y6œ,q‘ÖåúˠݸöóÈCÔìRCÖ¶ƒÌwY…±aFDfˆfœ3ɽs÷ ¬~²®7+0ùaÄ©hÿä¯Tsa ¶ž¦ÇÛÈ ŒhLõËTãV´Ñˆ«AãÚÎÅz'™RRïú»Ô‡+ÒÆ¸ú©ÈIÇÛk üØ9DN}JËd(£‚OÙƒ!p̆W¢kZï) ÑÍF–³8RÑ.YÛ[c±OvJ6`!‡5×çÙô»Wåºö× E?øî«Ï„`2›ùº‹@ì¹YÁÑ‘KpºË»tëîµ×a%ýVJ´8âlˆ0ý<ûaïäi•BÔ±;¸¡¿úC„c¾½“a·‹݇¯_GÁ U„øy‘VAΨh¬’¹_!ñKUiïÖ¿sÍÿˆdh“ FF5ÇÄÁ˜:h@cÒØÎ8ág5ÃDnh}n{’Í §vЉ{Þ¶ ˜àëc= !`gA¿¼gîpÙ¬À¡ý“óÏÔhA©¸ßÀLZÙÂ\|ÚŽ"·—ç´æ§/8¹fDSˆ¢‘¦ÐˆÖ¯.·~Ü¿Ï/¶óÎéô‹ÓL¹È*Ôà™ÛËÍÙ_=&(œÐo­îkWÙpÒIq®häs—ªÎЦ² #»Ú°i¹iáÉ}M”ìÂúí¬Pr½rÿô>ìÚ¾Ÿ#Qúk8Ðqø3R+ó’>>>²ô¯d¹ÊS6-—HŽw§c!9Ùü§w½´ D^]ÓïüQëï·—}Ûv±|÷Žð³ô¹QAñ®oáºôFcÂhÏïÎI´3 ¡viË“üX%k× ) µ l9“Š%%Ó(²&B_ùHR6We¡îägû§êÈÑOd9•ŠËéÚÎbà –'[ ™€Wt¥VzRp¤„*«Ïöt—¥è™7wFJp’›€e[ Àîö:ÐÙôÙåŽÌÃBTÓ†!éÌFï{ã¯mXó‘Ò›&p"fx8T†‘ b¡·r:†<·\Ç`WÞ/4v¨–Üa¥Ö5·1˜T¤q-/..;v@³ë¬Lé¸=÷I–o†î½»‡;î•ÒQ_5H3‡zˆR3© %´³¬ZaÁg8=ó)Ä‘v…B_ †Î÷ 0Ó/i]µ&|×â·Uqh/ËÙ&O«^·bw/ìt—»vç‚ðЕ.•Ž{OtT…±es 0“ ¦°yYÀɧ¯¹¤˜£›+Nn¯><¯¶ÝÍkåc©É¼F°ð ¬ˆb¦,§L1³=&é6U¿:¯tìå½Â¨²˜oT~ Ù–`ã`™U{²ÐMîÌN ÉË’ª(ûÚâ7Á¬QTèiùnãóX¸â!þÒËDlÅôŠVP ’rÆØ.é—ž]¹‡¦Ö= Ú4·™¶ãI雪I–níͳƒº±æý‘ ö_1’%=Õ ¶mjÃÔ³! CÞÔ:²bç%8*_ý.×Íû¨ÍÝþÓ¨Y 4éÜíðþÛä)äœYi@DcδժïE- º“×¾ßÝ>n-SQÔyu°S â†E2¶ˆvˆWHÏÐîD«ˆéHn§uÿ?qÙÇiendstream endobj 1630 0 obj << /Type /Page /Contents 1631 0 R /Resources 1629 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1597 0 R >> endobj 1632 0 obj << /D [1630 0 R /XYZ 85.0394 794.5015 null] >> endobj 1629 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1635 0 obj << /Length 2915 /Filter /FlateDecode >> stream xÚ­YKsÜ6¾ëWLÕ–ÚÒоtS)«T,ge­›ä@‘ ËṙÆÊ¯ß¯Ñ ‡3¢¬x½RIh4^~7(~Å"Ý0ñ“E”(7ðD°È6'Þâc?;g9LZNgýpwòæJF‹ÄMB?\Ü­&{Å®Çbq—ÿæ„®ïžbÏyûþæêú§ß^œFʹ»~sºôϹºþå’¡Ÿn/Þ½»¸=]Š8ÎÛ^üzwyËC¡Ýã‡ë›“pó¦·—W—·—7o/Oÿ¸ûùäòn¼Ëô¾Â“t‘Ï'¿ýá-r\ûçÏ•I,vèx®H±9Qt%å€)O>œükÜp2j–ÎñOyÂ~ K_ œ®½x.Ÿáá\ ú" Ž] /qþA:ïÆ^BñÅD(ËU-¢ qCéK#Wí2/Úô¾Ô9±‹üÉ"0' T„“hö/õ¸ê…Îç^7…n¹Ó­ÓŽ ÀY§šq÷ZW ­êæTÄN†íyvÍsûÖNÝ–iaçþxó¼×D Ž] á&¸˜9߬ §+6ºî»º eàÜ­‹–¸zÕ™ó¢­ n\¼Ö ºô¦îì„V7º±;Uu7GÁ½.*âA8·Wo€ö(‚B'«7Û²H«Ž~÷ö1´Ü¥O-Ã|r×7•Ý-t®Þß.d«ywyKšïK|D«œ¶ØeÚ0Ò\ ÈKf0{ÑV¹]Œ[Ûõú xÓuÕ¾Äb æfcyÎnM,µcO ¥|Ò̾ÊÁÇ®®sp@@Ha$k»˜)™9yÇŠ’·għi†‘3´÷ ;£LÀÅC»]úô*-J»´æ–ém·µaLh´b†ëÌM¸=7ѱˆ8@P^W·H{mðÜ»ß íüt©âÐ2WÆNIEÀF·mú`±YZ1–mÍн2Ú,%´ø¬dp›fŸt7lض³§ÿ ­!’²'Ò2b[7«`¢&LÄøÊ¨°U]-YÕµªô ê™žãŸåt¡]×}ix˜KŽÏ^vºeAeäƒ6‡l›MQi^Á¶ |•ÂZòѯWvÝzÖQÑ{ ÉM1º ¬ÂÉ|m„—‘B lùŒG]Y™.`ãó>›÷KìR@f¿¹7vXÑ® E½ÜÖmÑvÞžûÇÒS]‰UÄÄôiY>Y÷<õé±re„ Æî¹J7³N\†®xÖ®(a`wˆÄ°Ÿ00Ú-C“˜>…Ká{n ½èðêmŸ­IVá蔹—Ú–Ýohý>ZÖ%V—AZ L”Š7©ò9vÃÆÒ÷Ä;$á0ŒŽA¢&ÙcÀÁV0̶²Œ$R’QùÄø¬LÛ¶X=ÍúcVµ·:‚i'†RÛòµs–Z¾6{mR–¤V ܳŠÍrîæ8Ô08öÃ³Øøç—o÷˜–E^ð˜—]éăî ëy‚ €ÈÞ¿¦Ùã1£öfƒ¿¶6Us{ âã4ûÃiò¥‚ÈU"‰Ó”åûÒ ©bW"Ù¸qß°å°âåÌJ„n¢|ùõÌ*PÊU2aÎÝþúŸWó©ë lß KÏîÉ­÷÷tc˜X³OF4³ÂI39F¶uYdO<úg]Yìïžç—ñtFy]St&S’±:Ø–‚°B×$4H‘Z]ÖÅÃntÆ)‰Øs/üM®ïû‡9¯ä»¡7L*áæJKéÒȤ…ŠUq£Ç0ªÑo¹;½ÙZ:¯m1~ŸjìµM„ù`õ {ŽK^Ô7©7“ä}ób7ˆPC¦^–È »WÕŽòÒ÷UiôÅwÒGdI”ÿSWØ4l‰\Â>ÑfuEªõ`#rnÝšÇmP~sîiðÁJ߃ÕÒÊzÀÈz©+¢hÙ4åÌmÂØõ•v£zkíǨÀÞ¥U L.e¢|â°úÀSÇÊ@•t¶Èýê¼ÈL×·É´Æ®ª´äÈz‹ÌøSec¾²Ù3!H*Œ2¢‚é‘—¥eRH'妢چûÃðÚc޲ɒ†˜µÌÈw•Ÿ "(à~fØëƒ2¨§ÔÂ2aeO¼-\'Ð(Fâ8Z–® ÷~¨›§SÄ‹Jvò/ÝZJmºk&+lš•}®'<€{IÛ5#ÔLÒ $1ŸlÒ0‚n½á@˜r!†˜{É~Ú¡û$ {¹éœýò¢Cf°:››þ’émÇ™ª5ÎY§™*/اjûáI{²‚3Là7¨@›'»´æö0À~=ÓeB#.´Céîõ”:¤§.™»›™Xeæ#J³!ʦŸÇ¬Ïu™>àǨ:SnLï9ˆähY}oŒÁÃQŸ7Œ¶ˆ—)5Õ½'‹¹k—Ⱦ詀M^uÏGàLEÈuß 8ÃÂí­×¬— ÜK8¾zÞ˜6™ÚY¶BiÜ%œ-w­”§§)ÚOŒ%Ïû[K9OÉÃËôvƒ¢Ât¦‹MîoGKŸ‘Â`÷SÈQ×€‚bí¤ÊÎ6A¼¡³Ù¢ñÖÈFM½zÌsÂU^<yOôRH2‘´<³hízK"¯âv >êˆ*ÀŸ–È„( zî«‚=–ÖWy—Ò]£ÿCÀÞgû7¿×iMäEGˆÿÛª&DŸEžë‹èàññÙ#¤ÅH¤Ùì Ô|–1<¢:p¥ Ç7\ú`I¬ãn¨¤Äϱƒ(žË öCWE±CïL¨JÜØ3–×´ A*+®g½Úv«³Â¸^ãËx ÆVå1ÿ)6.(ßö ŠwÝÒÛ ²€;2ÙÚnÃ>Q)ro·¶€ '¡³®w.£„âîqé<’DB0ykRcŽß—ߤÂ〆w¥Bc™M9öAÀjx¨¡”`[‡ž$λ1ÓdN]ÂáÙ ˜=# ?f44ƸɣæÔÕ|˜˜:(ã"ŸË;ò ÿµšA¸~pZ4°çZơŒrèt”ðÁû÷ºgn‘W¾Õˆé«ÏÔ=ž1B§†Ócý1Ö`ÃÅOã—ï:ׇ§|¸¼= çãí|qý c‡Ç©onq«º,ëTÓêcinÌÊ_rfÂ:…¹~ÅßBx>ôWPH3¶Ä3è}”Ž"˜Bûx‚L²Ì3ˆìv;WI7ÛR»È®ß\ß¼¹ÀÏ\ÔHíùæ 7;—qìÍ»©¨øuž‘<­,hB§•0£÷ÆaŸ}b‡xâÞÒú]j7¤÷Å̼:ší;.̓#a ­2i#Ú¶îí ¥gdºØ e|àµÜlæîJ¸±’CCPˆðôuŨ²"÷‹è¸þÍu¢KÝø¨9‰ïüÄg4QÍY_¦Mi¬×ºÜZ…½×Òfißþ%…] f’ÕWß­kÔ éþ¡“ß”Œ½¶ó ¥=;T£y7šg¨˜à|n̹¡:2Ï0"éZ¦i(S;ýÅQ<µLö´¹vß´Lôˆjë²ïÌg3øª 'ÚÇ'©¡*:²ƒ¿bæ&œRóA€€ñƒÀ¡<˺þd¡â“þ'Ì ‘Š)[éŽü©yxä*Ôl·¡ëCr0_Ä-ïg0ëÈ"i2F® byÎ}*Çíi(Þ´}†ò¹eÄo\ÂO6Ÿ½Ò+¸„´<÷Ï@)•ìçÑÙçæ©…FŸÇgö)ú<8+Q{g}Vh¼ôX.}ºùf‹?{©ïþB¼ÿ|®OƱ¿O¼êoÎÏä@]XÅÏ(GæËП!ý¿~-> endobj 1636 0 obj << /D [1634 0 R /XYZ 56.6929 794.5015 null] >> endobj 446 0 obj << /D [1634 0 R /XYZ 56.6929 301.3151 null] >> endobj 1637 0 obj << /D [1634 0 R /XYZ 56.6929 272.1867 null] >> endobj 1633 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1641 0 obj << /Length 2994 /Filter /FlateDecode >> stream xÚÍZ[sÛ6~÷¯ÐÛÒ3Š;Éî““Ø]w§›¸ió@K´Å E:"e×ýõ=àE¢#§qv7žŒ€ààr¾s(fþÄ,1Œ«TÏâT3Ã…™-ÖG|vm? ßg:͇½^^}w¦âYÊR+íìòzÀ+aýöÏ–°í8Sibf÷PáL¤©œ­´QÌh¥¥àN¿;“rÀÏæ2eI’8F—«ކÛèwÎå¦i±G·Ù¦%òU~]oŽEùn-õ£E]ÖÑšU}ß„æÌ³Èˆ@cÛMSÜåCRS—Û¶,p7ìþFÒìKÏ¿¾¦n÷÷÷Ç©ŒXþG¶¾-s¶¨×¸UÜœ,5†pdhmó%@ºþŠHqÆ9‰"r³T8V²jIÜN‘‚'Se%Qýâ·eK´a,•yX‡&Ïà= ݘè×3„åÉùOÔí>ó3.a›uQ…ñC QI¦1oOºí¹ÓX7õÖ­k‘SW\æ$û– @N§1ðÁáÂ]¾a‹ ˜Úb€œïÊÜô0y”4J1K€·ÇR Ų¬ï‹ê«: B H‚VÜö‰ÉÝ!cexÈØÕÉd0XEeÖæo÷Vt*@}ñþýé+¢FË ñ¦BqÖ¬‘ÿÔé°b¥x”•÷Ùƒ+‹¨Ù.yãîWyE¥ª¦æ~?x¯o[ª~ël™£ÁÓu^Ѹv= _@ è"ú´Í7Ô¥ß/žãìÙ !ÎæS[꨸‰n§ú*»*ˆr•/²m“S%+K:«*[{R“o/ov+Ëú¾¢j2þn+jÏ+˜Àíªež-@° jŠãä«Å:¯·-U ÏNñ0µSR6¥æ¤áȆ"ÀºS3,Œw‹”ªn©àÅ”/{îÞC™ èä ä‘è(¯eÝ8¿Í§mw:X¿Úd‹yÛøV¯ 0¼ia©M[,šÀ,á:,`fË &‰òv2Qa-Åb[fbÌë$:›«ã°k§‰Ûå¾ÁHbC«·ËzÁ÷…B³ œ—Kš%lVß´ežß’úõϺòdï<\)§ÆÎW쨩U¾ü'R’¨ðŒÜ ÷œAS½8ÈŒI˸÷ØX9:ÿÇônè¯S’^ï¤b©àú XÒõ½‹ ÓqœÐ; ÆEJÉȧÍÈø‰z'­ê­¼•^ʩȪ´¡çŽ}·˜9V-µemßy_†’¦”Néмë8’ùaNéëN~W˜êY…i36¶‡„icÚO×!#xš0!¡ê„ e ½d`Òµ)ª…ï܆Q;‚í(ã62v×]úœÀð‘9øŒ°§ð\ ©ú3z<*§">$,(Cëü‰ÞNØÞÛ CÞhŽƒ£tÞ Éäãî ©¿CÀZÖNði„Â9y0±;)yõ‚ª ÛW²“ñÄŒ£€sár½Ç5jÕçòeß †„-ƒ“2‡|™JÓRÑ9Tx3¸yšR)-;¥Â²“/ü†d¶Ø©‡‚'PhI%Çj××9FÕd|´¨·UëEìL¥õ« ƒEöáÔ{¯j,9LcSO3«Ÿ Ÿ ÓpÆcýT2ŽÞV!×O1×·éîª×kwI§5Ì¡J¤Á:œ‚ÆÐ®Þ«{è¼wÏE˜Mx b¬vï5zŠó8N³ é;´œ¿zó3•ö§âà¶«ë¼™”S“Ý|Æ- Ñù\Jô Ò~ †‚ÌÏ)¸L«ãÑSÉÓ´¹ƒUЩêp4ÿˆÓ .?ܧar¡=-ào§IX¡ Kè)\7ò˜bÏcÒãBè2¡v‰ë£íÇ©â qêPxÏ•ìë˜%蟟Î2ŒxcÈ\¦‡B‰W£‰ +bz„;±³¬(·^&ô¦tËmRz}ó–ÉC»ƒõ`w°ëÀ.ˆRlúê2IÒd`KéúŸnâ}„pðŒHoCŸÎžÑÛSN—f4ÒK®ÃÓ<̵c²þ # õp±Ž\DbCN¥eZí­²;ߘU¾0çš>šï^?ƒê\¾‚ßÖr É´ÕòªÉ#¼(!®ñ²…é¡ò÷(b$ÒñMˆc›Q$rI–Ð~³I×Z·îùÐØAèŒM]—èî&–.]Mx¡0oÔÀÂ_ºNGAî&öQŒ ÿÿØò «1è2‡0Â5㩱nãþSƒ/…H’d’¸¼Úè™VKýНüÃ=èt½Ç*<îL†§˜ ÆjOä:ÜÞëXí‰÷ìÔ ¼3.ØZëù JþŒàÄßIÃl@0€ç'ä š«t`—Cz•€Ëwï¥Æ}„±-ý´uåt¡´ÊnoÝ#µ1Q1Ì“”õTáA9ø&`ïC =—M쿤ù_¼b ›2K8(3¡c9ü¤gïÓÅ-ì|‚S.žÆI§R£ó Ÿö‘SIè9q7‰ÁY-ó«í ÑÊü.wÏNÖxk#E?îµÈ«âcP€'ÞmǼçÓøËg—#`:ÐP-ó ÛUÝøt›iÂX;\ƒ &·ß»Kב^ßܸDІ¯zpq..žPÏ.yñ9‹š]i÷£FéÍ…Ôµ¥R•߀y¸óôÐIÍïâ]NÕx6ÿyýöÍÉù…§ö7ÆÇ£j\Ò·=‡ÁÊ'L@¸ô}P`Lü·$¬ÿË–ßLº“°ž–0©ða1töÿš‰Å®ÅÑ-‹êyýþÝèN¾º_>^ʹå#q!½!öØ×‚` ñ¿‰oûà¿?¯þ’°ÿÌ,¤J9mI:‹ã…'¯ÓÝ•wŸî/ý/ºb\íendstream endobj 1640 0 obj << /Type /Page /Contents 1641 0 R /Resources 1639 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1638 0 R >> endobj 1642 0 obj << /D [1640 0 R /XYZ 85.0394 794.5015 null] >> endobj 1643 0 obj << /D [1640 0 R /XYZ 85.0394 607.3833 null] >> endobj 1644 0 obj << /D [1640 0 R /XYZ 85.0394 595.4281 null] >> endobj 1639 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1647 0 obj << /Length 2069 /Filter /FlateDecode >> stream xÚÍËrã¸ñî¯Ð‘®Š0ădN³3ž‰·²ÞÄöžœ©)˜„$Öò¡%){dÿ=h4@‘e+»9¤\eFw£ÑOˆ.BóGQLbÉä"‘‚D!Yu.ÖfíËu8K´c}wñî3O’ȘŋûÕˆVJÂ4¥‹ûü!ˆ #—†B|üñæóõ—Ÿn?\&"¸¿þñærÉ¢0ø|ý×+}¹ýðÃn/—4hðñ/þvu‹K±£ñÝõÍ'„Hüœ z{õùêöêæãÕå×ûï/®î‡³ŒÏKCùåâák¸Èͱ¿¿ —i´x6“P)Ù¢º'‘àÜCÊ‹»‹¿G«vë¬þhHÙŒ›S`$IÌ· ¼ßÊu¦vƉª_p°«õ¯[õ:Çy{IÓ@w»²wÛ2UûýøÍ‹àü# YfÐØ7nQ?îÖŽ¯Û×oô˜t¶k»¢©=ñNP¶9]PJd18S¸Xòˆ„4Ns Ô\q†AùÜj'Ü]¯z]éÚIñ¥UU¥ZGp¬#C "'´3H¹v4ì¤YíW½”{¢”¦DD"2Ô(ÊuÌ›%„§‰CꦕdwŠ1ƒ„“0ñäkUéœdM½šá3ÂâØ£ÂÝ”úÏ3—,¥„¦|±¤ ‘œ%#É—±Qî¿`Ó‚q"ÁΗÕ¬Ä(‹®×õ®7ØO±ý¦ò¼ÅÉöiû“¯8{o©'”$œÎ?—ŒýBpàÀ¿½÷Sಜ²¡c6O…~Þ¾j'{ÃYá:­Úl39vÞTª¨-‰h¯/¿.ù<÷:ozwIõ®zÔíô´W†Çýíý ç1‘ Ûû{Ó·>i°ªºèçUµ‹?uj­ÏqºY'’$M}ˇLn0æzìDœÑÀøȶ޹à…PëÑ0@ísØ>éÖ-7øUeçG™£§…Ÿ²Xoúg ÿàØ4¥#66É2ãÆ£ðNëÃ<"$#BòEÄá< Äs\j× ÜŽ€Ç^ŽÐÃÿ!MPÐΖh„Ñ4 ¼ /‘JD„ ™š¨‡é"b1¡‚ÊÙää‘–c¬cáŽhwb´c‚9“lµ‰ÒTêÀƒÊd˜b[ÎN˜’D0ñ–åÄ$e±8´œùìM§¨×ÈrrÝ€3½n€àuwˆÿ\ô»Ì¸rG2æi¯€Æ&ð8™^ÁÖ"5[Ýö…îÈàø6,§¯8 M^”þÔC0>>¹à&þÍx ‚Τün…ÇÖÔ È!2@l4¶çï7²¶m}ð *wxŸ°Öo”#ÐÛ °¢6ÜëLöÇÎeÖ‘›³ÞØAÈiLüŽÒ WºK†q·iveŽc•ez ©/;~Ùé.V›Úx©q™àz…€ºÁ/æu¯¨üOàêñG2Š<²©®òÊN @itÈ`&Ô7UÑ÷–Õ¾`ò’ä¹(Ëi5†'õÕ›ÍÔÔÆLu”Ph[3z`kÉëÁYÈØÙMš3&@þ¹ú&åÁcQçQ0ÚÌle¾ ?eqIƒ‘Mlêño 7˜Û‘çìX}º¹Ã¤„ÎGHaŠ8zè*Ó ;ž˜5h0mf\ãÀɵmj[W$sAFü'Í™®o/Ó`çêl랪Cêl–‚Q¥êÚžü²C˜ÂOÝ´•rÔñ0h ¤}ñ[ûlc#ó.8ceVC’Ù\Rg«b°U1µUxðÞ:9w3,çz¥l#8¨}ù]àÖw$V vm`9„ÿ1#ôGq@Ù(Ö î$P5®èci;0žÃFßëµã–ÿáÖ¸r0o,½€S„3^ Rl2„õåâI•ÜZ®§Ú C3Ž9ýc¬ë™.ÀtŒCfx§ûì]këTs!# ê7«á¡ ®{”Ýå±§"×î” ?˜K`Ô¬ÐÓxl%LN­kdà6TØ6²y˰“íV×¹s¾ÛDŒRõϗŽ=m­À=Ž3ìQQ_kbÙ=ÛÕÉTÒ¹¶N¸®2š^¸£àÑ+.ŸÅ™à|â¾Óh û»nÜÔ´öÆ#]y‘¦;vÎ&øÞ4pQ•Ãc„-Çw]T»Ê±ka`œ`I``Øàî §Ó{FT0\uõ½ð!FC10ìî0˜5¿O9&úW¬ü ÈÆO„–Móón‹àG½jœ5ÎDpLXô†»U½éÒך' úì×î:´J™Š¯=ãýcb@ÑŒcKq b»É¡;=Ùp»n*?9ßÐÉòo«è6â(š*輦þágý‚#3ø:0¤Ó¾ÚtÎûžyFuËA‚ÃWœ¡À3›\zºÉõÔg´qÛHŠQáî*CU–Í3W˜Ã˜5| mµ¯oµ+W[ ½+a5~µêŠòe_—ºÕÄ®vP¥`ge]¿{tÒÔ·+Õ“#öϦÖNXŒ/FÍî4Ó»ÑE;ײp£~“e÷UÄ÷õfÓξ¹Áõz-B󾬛¾X½Ì‹¨é¢‰ÆgÝmI™}Öe3n9«i¶`ÿÏŽ^²uéïyòûô(CÉ$ž¦àA±ç½>ª¾WÙf™™.hÙá¹OxжþéÒM¾™âÜÔÌó»'φ›¦ë÷ÑÒÏföÏýv`L ügSÂÁÿðï û]¼:§lþY†%Æ„RCÄ g4¡ýPrÿıèÿEM«uendstream endobj 1646 0 obj << /Type /Page /Contents 1647 0 R /Resources 1645 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1638 0 R /Annots [ 1651 0 R 1652 0 R ] >> endobj 1651 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [491.4967 534.2914 511.2325 546.351] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj 1652 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 522.3362 89.457 534.3958] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj 1648 0 obj << /D [1646 0 R /XYZ 56.6929 794.5015 null] >> endobj 450 0 obj << /D [1646 0 R /XYZ 56.6929 741.7314 null] >> endobj 1649 0 obj << /D [1646 0 R /XYZ 56.6929 717.3918 null] >> endobj 454 0 obj << /D [1646 0 R /XYZ 56.6929 582.9637 null] >> endobj 1650 0 obj << /D [1646 0 R /XYZ 56.6929 552.8498 null] >> endobj 458 0 obj << /D [1646 0 R /XYZ 56.6929 328.9135 null] >> endobj 1653 0 obj << /D [1646 0 R /XYZ 56.6929 304.5739 null] >> endobj 462 0 obj << /D [1646 0 R /XYZ 56.6929 235.8992 null] >> endobj 1654 0 obj << /D [1646 0 R /XYZ 56.6929 205.7853 null] >> endobj 466 0 obj << /D [1646 0 R /XYZ 56.6929 161.3359 null] >> endobj 1655 0 obj << /D [1646 0 R /XYZ 56.6929 133.9676 null] >> endobj 1645 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1658 0 obj << /Length 1149 /Filter /FlateDecode >> stream xÚµX]s£6}÷¯à1~E`l˜>eS'ÍN7Ûzݧ4ã‘‘0š‰•Dât·ÿ}…1; d:$sϽç~IZŽù@+ðmÇ 'Ö,œØ¾}+JG޵1ÿÝŒàþP=šO}XŽ~¹öfVh‡Swj-ãV`;A­%¾¿¸úýòÏå|1®ï\Lí1ð§ÎŇۻßÊ™°¼\}¾»¾½ù{q9žM.–·ŸïÊéÅüz¾˜ß]ÍÇ>4òîáŒÀõíóòîfqùéÓåbü°ü8š/k.M¾Ðñ "_G÷Ž… í#ÇöÂÀ·žÍÀ±aºV:šøžíO<¯ša£/£¿jÀÆ¿;ÑSþó½ÀöwvÂØp t;œ„3kæ‡öÔs½ïÇ`ê8ŠÈ'"ÅÍáŠâ•Ò’òͯåôCAØhÚ¡ï»ML%‰´/å0C:Yq”’¢äô‡Mñq´!ÞaFñÛ˜Èþ²ºà°Q e´°C£uMŒHL¸¦ˆíqL"š!ÖÕ,RDù>4»û>Lpb~ëàìFm:°‰P”SFú{çi6PtM9Þ%BgqØ®ƒH ¡Õ@íŠ(E/RàÝm§w¶¿–GlSΙ!©NRSÏLHIª4ÒTi©rê…¨•+.úŠŒBFñÀ˜âÏ¥2khßkú¿‚pì¿8gû:þ¾/2"iÍp#×Á>”ëðm³ºûĘˆ&À$ ÙRÝ ¶=byÖ¼_‰L›¤ë ?FЯ9©úsãc¢£lXNú³\% Ž*˜«$×X<ð`‚ à bÔôçõ‘¥Aσo€m÷)”§k"»”(å4E H¢2ÁMËPå9Ó4cDE] `Á…¦ñq´*‚l3F£*C¿Wk½2µcBÈ^ºw1 Î’˜,5ŽæªÚõa'ãÈõœè—ŒÀþÊseªƒL6 4¦3hótK°Fj@¹ìDc)R³ŸŠÍ†ˆð¨ ò?ŽïœX›Ö”bè‰ Ø¥7qeV_@8Z32 µ•âOˆQŒtóóæšV*ΛO`3!‘Ér€>@UØ „¡m fmCyë™#ÍŽ®en2ñ(²¹ƒ«Õ¶mÇêNÙžk³4%A^£p5Š"’i³ŠdfÏôs!Ÿ‘ÄÇÎ,j»¨˜J¥Ïp?ÓíKd³È–ãoå¥Jîl…0Þ{ö>R×óÅà¡íÕØ¶]éÛ]þë´}5ÍÕtèè”/Rê'º¾íÀ\Ï‹·ÆäÁ/e´{ñ³pU–(-uã^¸¹òÂ>ÃZX¥iµkÚ>'yTo 1^i¬~çÚGk¦Z²vžp> endobj 1659 0 obj << /D [1657 0 R /XYZ 85.0394 794.5015 null] >> endobj 1656 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1662 0 obj << /Length 1130 /Filter /FlateDecode >> stream xÚ½X]sâ6}çWø:#U’-Lž²)I³ÓͶ”>Q†ql<øƒµ ,íö¿WFÆØØ“É KÖ¹ç]_] +Hüa…êP·ˆ¥–)ÂTq‚RÞÄØSgï€ÝK øÖ§aççGÕP,héDW†Ó– ‘ibe莺:$°'P÷áëËãóÓ_ƒûž¡u‡Ï__z€PÔ}|þ­/[Oƒû/_î=€MŠ»¿Þÿ>ìäža|z~ùEöXòçè ÿØô_ú½ñðs§?Ì})ú‹‘š:ò­3#Ånî ¨Z&UÖâAlYD :U!ÕTu×ãwþìü‘F·SkõÃU'5j¸  ‰ Ž”A-¨«DÝ 8ê¡®3cÎßÚ“}#ŠdkmÇ¡lý?SÛóKÞ[ÅûyøN6Ç©@‚%ÀZ”’ªI¯noÓ{õ½ðMvmŸDñ$Œê§ãšé‹éMÈÚ¾­AÈÖàŸ(d\vþ{ÀZ>þ×.J¼é¦„e»nÌ8ŸvâÌ&¾Ç““ ¸ úmÉâ‹0ÉL…ëØb)?B‰|}ÚIl‡|Êâ+ÃÆÌYÆÜ»Œ.>{}%– ×N؇€‚i‹/ÙÍsÃôÈeæ˜óy£¤Sb膜3gG1ˆÜJª l/LÄ)á„‘X.ÒN«œ“?s¶IùF¡¿iŸ(3?²]ÃàÇâ•¥Äp¼²¸9žFI$pd»6 Þ‚JÄ·™8 ¡ÉTÈ2kï’ ”•ø&LfBY~µ|õmg>‹üëEõ’3°ÒÀÒ]€E'eªiOÛ¯zyU†úõð2†úõ|Nßfû6Úe;úb²_mér³Â™ÛZ––±SI1û–·Ð&©•]²Iñ°aA•TÀBCSµ-êOr(³SHSÑv `Ý€ªA´Zý÷.<ÏlcQ!¢Ð•¶é1Ûto»¨ÛŒ ¡K­-)j#%Tj¦¦µg#ihÔTK¯¥qž M£(Ⱦãî$5|,tò¸­½ª™e@¢#ÒB3ÉȤPOWë¦Ñ£¿=-–îý%º M£§²l#(%#’wä·¯’Êó‹;À©jŸ€×™•K`Ïkvx»òìˆh™´t©„á¹þ¥4¶h”‹/Qx9¾ÇÂÖk"¾!?sEnqæ¬ÉtRž¾=‡¬Xsó¥ù¸gûÙÑ.ÎÏéæ{ŒŸ¡ZV €%k;}·hâT#ÊÃo? /¬Y\:6v¸Éúù{'\gŽoC “s¨òsb+Ÿ»¾†m,Wé°îiPç“#…–aèõ¹qT)ÝÆµ9òÔ~vÀ³´ÉžØTÕ¡J ‰jXGŽÔ h%kípÛ+rÕÎåjA‚)=rª«p}WZB0ÄÒ›K»åaÐ@æáØÄ‡ºf•ÂôZ¸æ>åõÅ·Ïû«yMê¦Iò‹eB ËÄ0EÙ"@2R©c”T˜ï®©«Ôÿ ×N`endstream endobj 1661 0 obj << /Type /Page /Contents 1662 0 R /Resources 1660 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1638 0 R >> endobj 1663 0 obj << /D [1661 0 R /XYZ 56.6929 794.5015 null] >> endobj 1660 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1666 0 obj << /Length 1138 /Filter /FlateDecode >> stream xÚ­X[s£6~÷¯à1îŒTÄé“7uÒìt­ë>¹²­+ 7n·ÿ½0Ø8 Î:“$Χï\uÑtø#šgcÝô-Íõ-lëÄÖ‚í@×Ö0w? ‡wPõª¿õa6øñÎt5ûŽáh³U ËúçmÎon}ž§CdØúƒ‡Èvô›“ŸË¿¼Ü>Nîîÿ˜Ž†®u3{xœ”ÃÓñÝx:žÜއˆx6yã€pAàîá×qyw?}ú4š³ƒñì¨K]_¢›¹"_ó…®… öÇŽMß³µ¿áAÇÄ÷ m;°lÛ–iV#Ñà÷ÁoGÀÚl!Úf?Ûô°ín‹-R3 Ñ=ì[¾«¹¶Ó0 ·ÈÑõ›L2D#…” ±\1d’‰€•“{&—‰XÆÉOåó"×G„`ß¶:Pœ(¾Ú£Et_ŽH$q(ˇîuê¶ÎSkIÃP”#_ â¸Øt ˆ‚]Ë´ ˜Š)û®kkµq!¥ð¡‘LP‰Tü{dU¨šKú6v,bžXë’ógv€‚›˜nÙQ³Ë,ªÕÞ¶Íeäâ‚1®ô-.ÿ5my¢Ecý-}Aüe%P”¬‘äÿ¢3ζOL´[‘œÊÿÓ¨&žß-eÊ‚~ÁZ$;û1¤Šö”oh°â“×.. žßÃ>ˆy¼FÉŽ‡­VìKƤºRZ‰¼PQ‰dJÏz±ÎJÆc+pà)¾½Òëï)˜(±ïAÎyô…h°8ëºô?!$*Oò{%’-¢™Ú\ëS¬¢„\Û˜A»FÈv¼Š”ªÍ2ï{z9·,dïé Šmiš²¶‘ªhô |è1 " ?”Ähg½¶Ö­VúZ^ž _žQâÁQ‚ô[¯ÛNØÁ@ñª Û9(…Üá/|.g˜ØÏ?ÛûÎâªØ]ÇæÄ¿¹O¾›rì%ˆ²}7z2[óð¬uëTbƒLH¾c)ѾS¬5T9šviÔꮣroµFE( |U£^só›!„àÓºfõ Áf}ƒXcB@®£Œ&Ϩ‘4#ø5&“q¯ìaÀeazí÷PwÑóýHRÄ^Ò$†dy£íˆÆ´q~®Òr ÿ‡õÞ}|óz¶e¹Øô<ãx2cµ“Sw°gønE*×Ó6O™ÏyΩÿ+ø±endstream endobj 1665 0 obj << /Type /Page /Contents 1666 0 R /Resources 1664 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1638 0 R >> endobj 1667 0 obj << /D [1665 0 R /XYZ 85.0394 794.5015 null] >> endobj 1664 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1670 0 obj << /Length 1697 /Filter /FlateDecode >> stream xÚµËrÛ6ð®¯ÐQž)‚oNNN"§Î´Në(§Äã(H„$‚²¬4ù÷î EJ²-Ëíð€År±Ø÷ C>2 B;LÜd%¾8$¦ùÀ.àßû14VCdu©ÞL¯.¼h˜ØIè†ÃɼÃ+¶8&ÃÉìË(´]û 88£·¯..ß¾>?‹üÑäòãÕ™åÎèâò±†Þ_Ÿÿùçùõ™E‌Þþ~þ×d|­…†Ç›Ë«w“èá¦×ã‹ñõøêíøìfòa0ž´ºtõ%އŠ||¹q†3PûÃÀ±½$†k˜86Iw˜üÀ³ßóL6ø4ø»eØù«–´ql× ÝôIÇ€±c‡°Š‚Ä=×Sürf…Ž3ª„¨­ËØ‚Ö\–(²þcØ}š­fLOþÑCAs–qYëÙ/=Üèáu3 ˜!vnwÏï+Vm2±Ð³ “·¢º-ÄÑëg\ÒiÆ,š-DÅëe. ^ä”=I[’׊ #Û‹À†-é²íÐvúÕ“ÈÚeÑ“Œ¦4]2‹(ß©ê&iÆhÁ‹…Å‹šUw43¶_åSVfÓS'§÷–a%ù# B·²déÑÒ¤gE-­’U–r\WŒ£¹ 0'sÚQK‚9æü?UNM~u§f÷õÏŠ®&GKÆò²ÞX,ÜÑýÌå©(jšÖÇ­'û눂ɆM“[ŽÐí³túÁ*aÂ’‚Zu=C òKÅâ©ÚULŠì®‰«æ9«ú¤Xœ±bcÑB®Í€³d²_54ö¢+]ÞîUºmedemÍ+‘Q_?fªžH§»dùŸˆÑ72­™•ñœ× '¤u=;Ážö€[JQ€¸*«%ƒD˜”Ö›³ª¢Ù)ŒzbFkúb.÷º™¼X/PJT/VŠfÙKY¬y1ë“t€VÝ9> endobj 1671 0 obj << /D [1669 0 R /XYZ 56.6929 794.5015 null] >> endobj 470 0 obj << /D [1669 0 R /XYZ 56.6929 237.9969 null] >> endobj 1672 0 obj << /D [1669 0 R /XYZ 56.6929 205.1687 null] >> endobj 1668 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1676 0 obj << /Length 3186 /Filter /FlateDecode >> stream xÚ½]“Û6î}…§/ÑÎÄ ?õÑ>í¦›v;×ä.Ù»{h;s²-ïjbK®%e³½¹ÿ~Ò’-oÒ¹™?ˆA -g~r–ÙXèÜÌÒÜÄVH;[n/ÄìÆ~¸Œ3÷Hó!ÖõÝÅ«7:åqž¨dv·ÐÊb‘erv·ú%zýãÕ_ïnÞ_ΕQ_Îm"¢ëÛ·ß$§ÏëwoßÜþð÷÷W—©‰înß½%ðû›77ïoÞ¾¾¹œËÌJ˜¯˜Â™ onÿrC­Þ_ýüóÕûËßî~º¸¹ ² å•B£ ¿_üò›˜­@ìŸ.D¬óÌΡ#b™çj¶½0VÇÖhí!›‹ £nê”þ¬Îb›©tBJ (´M2Km'Zi§À»‡…xõÆê!j­è#βXÖPT T”JìÜW«â<˲iQçâ|HÒÉ1f.Q±’ÖŒ©‹-K2Z%±P ÒîÊeõ«ªla¥Ž: ŠE$XC ÷Û‡b)³¨\q¨<þùPև鴤)v!ݱÕgZÇRJÕ–ûOåžÈ.›™¼ïiÝ–øùT•ÌöãCµ|@’3`ÈÅ´'ãÜZåˆ1ÃhªÀ¿Û5-°àzN:; »**êÔðÛ&ª:†^Ñ9FŽp©ùXuLÞƒªæ…Ýþ¸ùëf„Œxû–×C9©Õ¬^ë ºɉBTõ=¹¤Ól‘–ÂYµ²;êAáA§Ð|¬6jµÕv·yÎ_»Á‰ÍbÃÚYñ„ƒ¶V @5Å{ˆ]JçŽûw5Ñ÷{»mjßö{_t•â²ølv ü¿ylúÍŠš‹r<·ØlšÇФ‹ÿå%ZÐòæRÔËävDr8©Z/wM«jÕÔÜZ°®œ¬ŸÂžq'kb- ¨’£]«ÏCL:ò*›Æ™T>rÌLAŸûM³(x—›é—öžìRìU·/öÌ)oÌ'U,Ñ^^Õ pV¢U»µÕbƒÊR ,T†½„AÔ‚¡ï÷@AÚ~Ñ–µÑbÝÛ2ø-Pn¤Qopá™é<̱ÛRM8ÑìŠ O-N­öÔlæA§K2½ix¸ü\€a1"‰ªu˜Ø„n1ìtÔ㮚W/é{Íߢ^Qãõ1 ©ÑiÝœ£‘ëéØA¾¢€óa0ÌÜ> 4ÃÜxS¥3vjR8ÝÄ×ÚiËcBÆÔ͸àp˜9±ðó«°ÂEPÀ¹†Ž|ÑÒa†Càâ‰l74‰ÙSI,{0Û±Žûÿ–¤0#™Y¡°dœ§9Q i‰Ñ7WßPãßnA¿Ìh^½"”ÎElæ? ª:n8ËÃFÐëqŠcvÔÉÕþóÝ”- 8¾~ŽcùEŽ÷¨r†¢¾ñ{õ¢=˳:µ¯¹ïþ„'ŠýÿT¼zVñrÀñ‘Ì'íç—ÖFdüµ†º}B Ѷoõ¡øTúéÜh]‚­]³©–OÔva©Î]ŠÜˆWìaNGqrÄɶx¢‹52´.—Ý”J5p?Œ:¡¤DÛ,Zö{’£Fr60á(·Ðõç Æï}’@ÄìCrnÆãdì8Ûâ3†y×Mi :Khó ]ÇR¨3\ý,½ê6‘üzD®­þ˜:èÈ’¬9ðÇiÖj‚°‚DOg~é?Ê}3¯›yÛçX…M°Ê“öùÔÀ¹PãôìmÓ¹ÔÂx>ÎG »4À ð €F`D„gaJÜ·<ükÝ·äÈ€BùN*ŸNR(³ê?ºa¬&sUq¬ÄÈÅCØÂ|}˜ÅÊâ-eñã~nRʼn‰›†ÉŽqG–ÂÀx±U‰§æ3ÌAËè.‘$`̧$|$¦W¤ç\xrIÕ‚8+í÷ÜŸZ8Gk™Œ¤‚“è•Ôà³Z¿÷PRÚîw¨(GèDlJ& )ÿÔ)¼->º<V)ë–›”°Áéé“N•ŸÜ5BÆR†§î~»î7¸+pÐÞvuU&£bµ­j°(&Zª£<Â'ÄíhQm0èwO4D9,V·ý!Å'eæWØÛ²äbªâiBõG5õŠËeÔ…ÎKhv»¿Ì¢~º ã1\½×Ò£K7&“3­à|És=}ÉÈHó!ݑɉKÆ€EšØÃß@1x|¦lœçV?¿tÀšX{t?§$AI2^œ²e¡¶ß$ӄΊÓÈ;à„ß?”ªEë«<ëo• ÌàŦ6P§2jÝÔóbÑ6›¾cÜ]Ñ=ÐÉ ]ãvyDëôfBYws³ñå„݉äȧݵŠ6†âªÑQþQ³Lü’, ë²6€8±¸éòSl„F‰¥”N*ðDÒb”ë¢ßt´Ð¦YzNaˆ‚4¶K wnˆÜôÝ®g8 ÕúŽe|OT?GŽï.úâ}?uú[§yæM¬ÚÀ¢1ú·ô%!±5)¤ÎTt»&„b oDŒÜ-5ÃK¸—ä÷tqCÁš&i•°N™-\$ÜM(B'²@‘Oâc€i§þhñ’,Æ(k´ø‘ÉÅyÌ–6*Z;H³%ºuMž¤› ãd`2j»bß¹ \Hë¼¹L, Ç÷–Žßàà‚ç¹ÃÆ‚M„Ot§³¡ ‚YœALx>T ±Î‡ª€…«~,ŸæçÕ]PÂ<¿|ÀšX®`423@—ãx»+÷às[ Y"VOà Õ’û$Ê%µ)5€­\ö‡úND4uÙ¾¤hÄUœ8Ù2=9‘Pwýbã×ã„LNàecÏÝí«OŽt‘ïß~øpóšÚË'j„àÎõpu$ÃÙ½núšœ,u‰ŽM΋zèx+BÜ3Ó!Áéb“Km'ìÏ«ÖPiÂ5B]‰º¡ÁòPÊ:¸Gd}gÑ<‡‚©´ƒP)]â‹×…´ã’ίMìƒ6³íßJwÛ5Oò,NMæŸmU½âì>ŒŒdu„'Þ~tœKqT™³¥Ì¾^-cÜñ‰èEÖá­†òóÓ«°,±&<ç´Xœ!…KjCÍ»ãàL¤èæö b€t>Nx$ÊQëâ¾\ÍQqÏċܯ2µæY&Ò)£½"–6ÉFl|½ÇéŒB§''Œ¹´¾ôzCØmׄäö@%x- ‘C¸ñ}±üHMVuØV¡åP®K1agüÂtÍ/œq¼ô/þùÃÃKÑÁ£í´GO¼Á‘?qÏÌ»þ…×Eƒ'«?‘)ƒâD\ëüø‰qEÃîEF©”5œËcNJRÓpP¢°S˜3,_7q8‹aÔ'‚Tî Ämƒ'S1í‚ô‰6Gêõk’úÄÓµ—Åfã•0òÉ4Ÿ4*\UŒ>Ƙ2¡6)dœÈp¡„7w‰ŒÞáUÀcÕºÊ8O €ÕYÐb¡µ`Î"Bljß¶ÄûŽÚs™f±ÉôÑå,[®3+Èwèå, Rc{G×ô‰Û¤ï°™Geá\ãÓ?½&á‘3áW¹ÄÛg}øñ >Ô†³ÉЋéÍ¿ Uæ.#©JKøyïðÎp”&—Ÿ;¨FÃ%Ù8ü'ƒß°x{&°k¼}³v˜nNÅÎ,•–_¨Hçc§G 7ÿŒ§úq¼Ôi,ðÝçH'+løš¤baÀ†KÓ몆PNrÍ/ŠÃl´ìÊxúBS¥áfõ¶£”‰Þý?@s”Å/ý‡Ç2PlÈ/aÚGZDòÅãwú¡LA‚©´N†,èóø…‚8¤RGÉ5•÷ûb‹ñ ÛÛšLÑÿ÷'‹r4ÎDºüûC·›xºÓÚʯáÈ‚‰æájxÀ­Bq?‹ê²\•+tKîÅ9J_/qãŠMånh„> endobj 1677 0 obj << /D [1675 0 R /XYZ 85.0394 794.5015 null] >> endobj 1674 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F53 1333 0 R /F21 954 0 R /F41 1238 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1680 0 obj << /Length 3658 /Filter /FlateDecode >> stream xÚ½ZÝsÛ6÷_¡·“ç"Ÿ$ð˜6Nêë5íÙº¹¹iû@‹´Å‰D*"•ÔÿýíbФ(¹½Î4™Dàb,ûñ[€bÆá¯˜™„%NºYê43\˜Ùj{ÅgÏÐ÷áJžEdZô¹¾Y^ݼWéÌ1—Èd¶|êÍe·VÌ–ùÏó„Iv 3ðù·?~|÷áß÷o¯S=_Þýøñz! Ÿ¿¿ûç-µ>Ü¿ýᇷ÷× a˜ûÝÛŸ–·÷Ô•„9¾¹ûøŽ(Ž~ÎLzûþöþö㷷׿.ÿqu»ìÞ¥ÿ¾‚+|‘ÏW?ÿÊg9¼ö?®8SΚÙWxàL8'gÛ+m3Z©HÙ\=\ý«›°×ë‡NéOËŒÔ hR1›j9­eÁR!€)Õœ%2U–¥˜ÒräB-·ŸŠ—ÅsÓd»rÍ6{¿¸ÐŠqa“Yö:® !dO¡SæàÏPŠåº¸^(‘Ì¿¿ÿÆP+ãÛ¿p.7£­é÷ÐxB:ª÷Dùðð°X>Ü}ý»°w6—XÃR“ØË†Ùç:o˜ר0WûNµcã4)x6—åè¸&g"™JJâS8¸:ìËö…žÆ{Ž4ÚßZ—«Ðlã÷_Š}h¯ëÃ&§vv˜eF@x÷†Z´ÈçCÑ´°#Þ-giš¨¡!>¢ G‹Isô$ïü”´4>F`³SOçÙ‚ÅNNC$û߬*XéÌ`§à1’ë'ú%uCâ÷–Æþ"¥Z´=HX"— Jy÷ñáfB×R1‡y™˜ÈX^o3x§zNS–rÈVÄ û·IæËk'ç5IæS 6¢/½ 3õ×u’%ãL½|¡¹Á 3´ï³)ˆPÆÅi¶‡&Ø_¶ijjùl€Y„®òéè+H‘{Õܵ‰¶ÚŽ& éíÿÄÎ}VÁ%%è÷¹ÎýŽ«SßQGƒH/4³\¿²xÇ5±ú Ò ÇRkFË“£·É·³Ý2uQ嘑àþFî*ÛbòÆ&Z·2)¦l"4ë,=z¦ÈŽ­ç¢*öYK)mÄ©y) )ÉñhËïoÿ;a=2eBÚcÔÀùÿ³.âA*‹Fo†®¼Ú”1×$ý\㳡‘#‰RÁ´áîãi’¦â·Õ:«ž}Ää·ÂzÛì…õž–ëÞN±áúé…ºC"M B7e§UÏ;@\à ¡@t$yœluÜnz¬êjQüVBÃDÆæðxœÊÍ7å§"ÔGA¼÷Ä”Þä†D ¹×(yÝüžJZ2g­®£q¾EoÂÓˆï`p’ênÕ¸Ù!6L Ø +£]\ÜɈšàõl$wó—ú€ruApÒÃ÷_²}!5¸€‡-J^`ʯŠGBåz¨6EÆv«Æ(JåƒeV&ÉÐð~†ˆÒþ1¨ )PÅe¨Ðç::®££®qÇH[˜6}eíŽkbñ!RP°º­¾$ôšÎß ƒõóâ»b³ÙzOŠIYFæDz ”6ŽîJG°iµ4±—ðƒtiDnÀCy£‰«Ñ69Û•ø %‡,0Üò3’[,÷î/1†ŸÆ.ÔœI´ýc'&­Á¼Ý{ãjdÓ6œw%Ø;´¼N gSgy Ä)v‡ÇM¹ |¥‰Ä}ù…TÔ *h=Q©· y"Ø“ªƒ*¨€“˪_"L®÷Ÿ:óÏøXµõ¾Ã üì. £L@õ'e‚Ád ¥Iïr1Ž÷ ~Ç9Žã@Zwsãçý mÜ+†}® ~¹¯4€­Ýù“ŒÞμ«G8åyÝñ„iç^QÝ‘é‚æ“Ï ‡íîŒÞÌ}yåŽété¡Þ°Ó ×^F ¶ËÚu„hÉ)DëŽÄ´Põ¬C;Ú!òà{4£qy9 k“/×Q­²jÚýµVTïô˜ò:,M×A È©Ö%£rz_å!S¡Tùã4j’&‘½Úõi\=ÇÞ:8*›)€ŠE¸²Q¿ùx‹G~ ¼ ÑÊýiØÓ͸èOé b 0 BÇ­‘M*L fµÂÎ8‰J3V½’Øû\çݤãògŶi³0g¹jÎ9ŒJ˜B ~QŠŽkBŒá„`Jét(GHV¼ç3øäϯl´Ë;ŸéE/ÁAîØ—t¸mx9̾}h²ç0îøÂaž:,VÑ/@ð¨8Õ¯HBÓõé Á§‚$6ÈfΞ¹_s}sfaW¦J, Éö<ìœÁ N«_1˜×ƒ‰\¸â®ÌϘ‰u üG]^:2M,=¨ þ$..½Œ²WÃ)ŠÐ8ÆU{$ƒjÚÙ2`!K“lYy@„»wÏ^M*éZ :|ósö]%ü¸\·ïø0¹ïšc)ÜGÜ„sL‰…Cƒºäf¨n¼uÐÿ 6bªÇümuÿLŠæp¦íæ?ù—JyïÛÑ…\ÊtÆBgì :yÞgÛÀÓ®³–ú¾fX¤zZM”¦¨Âø¦|®²MÓu$D;=ñ‘ÖÌ}ƪ*VÏc0që–¡W =  Y's¢YŠŠãc{õ“A=YîCºODDÐyÙ ,nhHQ‡#jŽÕ­ñ…нVñù¸ÆÂ4Kžö†{G >†²AJˆŸ"í<šj[ø"Gäí/t¾æO B DUP#Ìîʇ_ÂÐÛú X(QáMBúüžž*RÍtª¢"Ï(NB6æ2Þн݆:W X—öÂeÀGÒI8"A|GÒ‡åŒÃFž}Ñ«<Õ]q?uä^T«MÝÄkÕXaäõªh>ÔþÆúL•˜™-T¬hŸë|í¸<ŠÂ{M,Ïe[‘2Î!Â_” ãšaxf ʳ©Ê@ÙÖ˜~¶5Á¬ <žÁS»3ZÁ˜Þ¥Ÿ‰uÐÿù€÷íû²è:²–ZÇ#xX.E v4D$lÃ%,b„v}ö­ãv¼Y÷®_¦Jl¨žuSðæv[5}8iÒþáä_ƒtÙ%™ ¹&‰²¯aá,s©T—M»ÏuÞ´;.ƒ^E’x¼clzY„ŽkB†áa‘e  ´¡”ë¸î£xò(EB—¹>;”œÙn ­ =ÌèGÔôª.`W]=¦<üúª‹›pj4uN N­Ç—Fdxm|j(5L!Ã=¶G+0ˆÐ Ž¢øÃ}ô­$êŒ-ê„AM<„©çäIÙ¤iLe5¸ýVãs‹~ŒA¢©SŸx=Où!ü FÁ¯·³àSõÓÈ㎡ì˜0ò¢YíËÇ^¢™¬”P¥ÀŸ™H ãàŽh‹Ô¹žQã¾g¼ÿ¢?àÔxOçEùà…éKÿ5fPžHd Ù*HtâD×krœÌv9vhü O¼rÝçº;"—ÿ¤¦¬rÙG‡†²Tªã‰)®G0ûK™Ç¾Ç—©Ûiñ‹ñÉÇøãŽ—I/3AûPô„£cj' ؈ÑÁ, ßÕ¡i‚ Šé3iƒ×œÝ×yÕ4Åj±©ëOYƒJ˜HLx×ËãeZ€xã,ŒAc<é—lSæôÎĬjqÃL8šàÒmVnŸ’uHÉ"¦dy’’ã)7tõR²8”êîòébцß¡U3¿Ñ¯}sÖã ©K%^IÖ=¦óþ™è“Õ¾®ÛóîF$ÜÅÅ#ÏéâÃ$m˜ã°¯ýÕ—ñ믞§iªäék±@è|­OìÀ'~=À§'Çﱃ<ªnC§wTÿ›¯¥´=¸B`ò°gŒƒÎ’*Íçv*[Óu©xú SÛDýåàñ‚H¯+ų Ãð+ê {€A úcíã—ì:ÄoÏ\ZÈÔ‚a’  n’S?â`xðf§¢ÿ¥Ä±Èendstream endobj 1679 0 obj << /Type /Page /Contents 1680 0 R /Resources 1678 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1673 0 R /Annots [ 1682 0 R ] >> endobj 1682 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [222.5592 173.9063 286.2499 183.3159] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj 1681 0 obj << /D [1679 0 R /XYZ 56.6929 794.5015 null] >> endobj 1678 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1686 0 obj << /Length 3358 /Filter /FlateDecode >> stream xÚ¥Z_sÛ6÷§Ðôå䙊‚§On¬äÒ«žít®Óô!‹SŠTEÊŽïæ¾ûíb)ÑÊÃ%“p±XËÅû”œø+'FB¥Ñ$I£@ ©'ËÍ…˜~ Šß˜ðÚD<ÙÊî²ÖæÔ\¼¢Ž ¨4:áQiÔ3g©þ+ÎTšq¤Ð*2HµøªÞÁÔ:œîKÄèQ„±IüÍ~›g-˜•#Ëáeª# e<ýˆ–ÓjZÕ- m¶vY ùlþ=p’„ ]¹]eû²¥Å¥œ6´JÔWKF™ò2WÏÙîj·¯®œ®Ø¤ZóTC©uÉ$ªøEhñ`Oá&` >Q:HBX`D}»§ ÷}ܱø¬/?»ãYQ‘»l !9ˆÐщ>I(•˜B§ð÷RßÒãd6TwD¥Ó¬Bð…mÒi›íÚb¹/³ñiË #/šåÞ£8äƒ|8…”LÒ IBoBÔl[—Årl»b0…‰Y¸iAvc«öo¦=¢‘Ç^Y/³1„*ˆTxèÔ[gtÓ’&ÔÊŸy8)è‰7@H3µÔ**èØd´eÈÈõ¾%²] Q+›µ{Ää‰g_ ¾40"ŽÏ;Ô¾ÔÛµ“:r¨Î“ã)kÄàDÎ*ÐIh0ÀS 3J⡠Ά©"ï†ùÔ0œ‡DŽóBHµh×,B®Y«ô“I)ñüF‘p.ÆM.Æ ]ŒˆüŒêàb°áv –ù†‘ƒÌŒÀ¡N ½fžW oî#8L“Jõ}ìIÙG/u´YùtAÉòÙõ;©†2Ò$•C Ü6FRMaýÚzƒMÚBd»-D†ÛBä´~m!öu[ˆìÞ!¦¿^¦Ë"'Ñç¬ÜÛ†—ô'ëM¶œ5ëL¾FZS›6-JÀtÇ¡DaËœW3ÝàPÇŽ“teŽe´ Ñ‘ ï %õlrÉ[H Ã~ŠkЮœ§c?)z¡ D çÁ`cΦ§Þ›Ó)$æ<ÆúRoc¬“ÂÅ·õ®= €*0ðÙU;©‘e‡ÏÜìp]Ê·„™~¾ùåêñÝ/ÔpÚ•L«ýfawÄm½lcwÏž ÐkH”Ò``–¶x.ª'bÑ.º¡UÞqoîhèÖ ©ÛzY—¼Ö.[!7t‰~ÆDNWÜ7 Þ!>ÚÁ¯è„üŠ6SJHù8($>æ¸nÏÛdEU¾2¯jACÌý°‡ãOÒ½1Š´¶iá~€V,1©<Ø7î ‘Í½dOì«Áˆàͳ†žÿ˜ÿF§ªÉ\’ëb®O1¡+Çä¤XR£«1ÙŸMñTYþw]Ù£NùP9É-OìÄÑφ€¦3êœ3JÉÈrÑ”Á´r…€s"À§Ïåm®½"Sn¨ÕzŠ ½ˆ½N–S«¿‘ç´5Üò+⟙W—uÑCôLÜ_â¯}±#v´ÎÈ+óN`c³‚©—µÅsŸH>™ÀòÕ,ÒkÜ=ì]@³^Ô~]gûŠRôh ½J“kHÄQÎ&ÚÏ.{¾ä\h'²+ïÄñ/!¸¼ƒý¹¢s;V @™ùw+5TY‘BMëƒÍh_Ã(õÖŠ‚€…Ñ~O‡Q$*€QξE;ˆÔÇ„#ï†ëB¯Ù‰ß9zDº«›»«µÙŸX$­ G+(©ï NŒ¬@™ø(s-ª¢-¼ã]ÖîÒÓ~׫_Ê:ËÙ³³§?ĕ׮ÝoÙ›*ã 8§\&q‡Ÿ¾Ù/°=–Ú$„‹6oòOH£óA /õvè¤\¦³³+»ÛÙ|ö„H<‰"H…4ç×ï¤F8¾o0FÉ¡îì˜ã›0õÒ¨iY4îÅÚ×­% ~M.1Ö5üa0—;ð<‘Ým7Ó®u,NÂÉt=Ñ©&–ünY¯K–ç…ϱáTÁé aäÑÕø‹ ·ý+ =»×>š-x6w¤àJQ‹~&u€V—ø|ƒëÊc4«xj¶–ÎZwŸîæhž·a&bp7é7Pv:2r¾®[8î¥}r‡lVc~wrc@EvN…NèT‡ÎŒ’Ê—˜/ìðbÆÐYT9xõŠa°t÷)ÄwÑÖ ù‡Z;fÁ“<þ|Ó8·­·Ä.í³-yxÙlÃqÓøú FP˜ª[BR¢‚Xª5òÏ.º§™GÓ¶4ûuYîsÞi<-AþÒ@íæ»y ê‘WP™êIlدpéªUP9‹Ï÷n²Ü{8k9ˆ@Zób;§çz^éy0$µÙš@uIL¢¦œ4”‰âäi“tpnbu¯ƒ–“:ñØë¥\7h6ëã Ê×ô<ÙtdrQ´Ä²ÝEš$=h2X–“€ƒ Dnu˜~¤®¸û×ͧÛëw§® éŸíú¹È} aòîîúvþ†cÀ‹ÈúÙâOÖU =„÷Pc˜qZì–T±îb,ü.Æ”ŠÕ•£XŽ•MÝã6½É ö®‹2'¹Ãè¢ågC=t¡€ƒÊ—ì•'ØÖ° ®è–C£S®µ»MQÙÑÔomÙ½+Mûïž®Ž†’ÍYÈCr‹-2ý—Ç6c(RßñvGƒø%½”Ë“ôôáÓ5ñ°äUÌHX&Œ…ëxòUyÃã:à)(o·ö+±½jÉ£h5*ˆ¡½ÉZÐÓ¡Z} ’ÔÆ-õ¤[ôhžoI$_‡¬‘8σíÂë̱Î7°%]éÞÛ“C!ï ¤7® §÷÷tOªÇÞ.¯F(Rök†àáùÚÚß$°`±ò÷îîöx_–!½xíiiXË‘÷dÔCÞLe–;¿îvÅø/o€û}»ÆKÆW’ìR lPµ$ü1Îá%ßÖ~OV¬ˆáŽ‚÷û‡y,:™ji½gÍ,`Ü\£×v½Â0Lý…ŸéÎ:ðx§t¤§×nºÆËºå@ø“Âôpªy¸{'ZpAã\ 0»åŒ7r˜§å‹JÓwÒ<ýÈNqÒ\ùÜ@»ð·=™Ë;©i˜·\ÛåŸMÇ|@avÓvwLìâÉÑ%~ýk_‡yä v˰Êù¥ç.[À"nì\yMøÔx¯Ý ËGŽ]v>Œ ¡+6E™íœó"¯ ’ 1¸p9%m³Do‹D¶+¼ToÓ e7[ï?Zä~æTUMôÉ9vóµô$Eô1…S-`Õ {‚Œ‡]æÀ(\ ¿3¹õIø½¾ûï9NCê]í`Ϩ7LQ&F}‡lšˆAè6+ ZÉOŒBü"s3ÿB—ü®ÈŸñk¯Ó8æçüŸ×¤Âž¤o??Ì?ß"E•×õ„ÑÄ%—DyNÅIì‘=ùŠpŒÜk€°‚¢1²WåıÓÿ¸é¢$0¡H†“ŽVnP—Ó îñ]n¿ûÉò¹#÷MGnöÝo|ó¿?tßNúK“ŠÔ9V4™4Õ·>tõ„Þ.š¼»B/¼WžuߘšÓ’IÔ<·¾—9]øõ[ TænH¼W÷_ ãÁÇDêá›Q×ÙÓÕõ¹¬!æ:¶¬_¾5#å¢3¥åôJ__mÇ:0Q¨†€Ø–£Öã@F©ä+¤qK™À˜bµ:þºÎ;ë»kðîõ ]ýAüÔùÎGlêÆßùw[ú:Î;øîÛÁv[ìeÇ~Õ¤t€?EÙ[øÇ†ø¿ñtø9@_ŽÃDA9mÂ4ñJ¡¥tr¬¹VP¤›0Qýª¶Çñendstream endobj 1685 0 obj << /Type /Page /Contents 1686 0 R /Resources 1684 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1673 0 R /Annots [ 1688 0 R ] >> endobj 1688 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [108.9497 731.9163 178.334 743.9759] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1687 0 obj << /D [1685 0 R /XYZ 85.0394 794.5015 null] >> endobj 1684 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1691 0 obj << /Length 4004 /Filter /FlateDecode >> stream xÚ¥ZÝsã¶÷_á·È3  æ:qî|©“œ“úÜv:Ih‰:±¡HE¤¬8þïÝÅ.ø%Êöµöƒ@|.ûñÛä¹€y™À$ar':ˆ„ŒÎ›3qþ Ú¾9“Ügî;Íû½¾¾?»|¯âó$HLhÎïW½¹l ¬•ç÷ËŸf&ƒ ˜AÌÞþpûþ替Ý]]ÄzvóÃíÅ<ŒÄìýÍ÷×TúæîêÇ«»‹¹´‘œ½ýËÕ÷×wÔdxޝonßQMB?'&½»~}w}ûöúâ—ûoÏ®ïÛ½ô÷+…ÂüvöÓ/â| ÛþöL*±Ñù>D “$<ßœéH‘VÊ×gÏþÚNØkuC§ø§#D¡6çs¥ ëOsY±”Ð)Ž’À¨Pµ\å—}/äò²¬ël1/ªê״ΗÙxÛŽEbÏûsQÐöš !ì‘ ´&RiøÇ:+û:œÕYó%R0¢\GA" ³8Iòh+Æ!Øî.¤Uз¦ušuF…Ç´È—iSíèó7k*¥LQZ4Ù®L×_Î6Y³®–p¨6¶Ÿe Œâ@Ãñ¾B”¡cÜšôÊnÖO{u(QOá{EÈvC3ÉþšsP@—‚qÔy'‰e0í-òê#Ùatѧöxël­€]·då­89¤€¨ÅÏgú½NgÚ^=$³Ápø!›Cy¿;N#EIÁ4Ï“Ñöš #ÉEÇÑ(b+”Ã0ž­ól—:Þ- XSåa/ÖTDr©ä¸¿Ž£Ø’òt>½nkþ8B£~*Ý©Á7‰|x»DÕccgà ‰í¤ø bø“@›Ð+ÖS6%ì¨Å*Œ{€ßÆø'Œx²(²¯Pg+åüZáJéb‘míøSÖ‡lWSƒK%Xg‘|×–IqÒcf „˜Þt(˜ÚÏŒrü¦Ý¢mFÈŠ.#d]\w!g>A§„³(áQ†Ž2F€uÓí¶ Ñ¸Ä¢:7Òßbm_°cËm81È.§t¬Ãè Ö·l ~˜fÓ]„Œ, ½iÀ©g»©üE:qìˆ#=¯šKLÌO™N hÂzßLVo¼ÈÀšÈ[×MZ¦ŸNÏ^@’ï 1@“on8.œô>Q:ú_#iæUÏ”¦‹&ÌNCÀ#Úõ‚1ìõzÆú^LºÑGd;Ráó«úN«6Di3\õ~M$ˆ½>ˆ¼ãÕb$æò,‹¦žÌCAø©¥zÉF êtBUÑÜ´^³ß1JÜ`ÒsIm7?>jªM—K†#uƤ6 6¯àj~Ûg»œš5C×=œÛ…{: ŒPfhJ;›c$Úø<5ÖŒ²í¨‰:œÝ4Ôê@%ôÏËÆçk¡¶áYxVvÏØ¿¤–EUþk_.|ºYz`¥”zÜÒõø+Zñ:4¹LŒð%hœ'ŒÚXfh;Jò˜D0È;´ „k§Àœ®È Žþ1ʇ}ÑäÛâù¾YÝb—¡¶yJ¦sŸoû‚}ð³ƒT˜Ó“¯ÓGîWdå§fÍÕtÿ!f*d;¢…/X.D† žvN¦‹YÂë¥<ÙÖC¦»÷oyˆˆÂI⯖ËÏ<Á§(-᣼]Í)›Mpu÷#¢ñ+êB ÛÈ¡bé“$  (yÚåTì€;ÜTÑoïB‹º¦Tº—S’e˜˜Ìxƒ/ 5¨ý5)áu½AX‹·U¹¤•p’ÛùÕ»ww§'Ú×mßú©„éêü·o˜üííÕ‡k‚­#¥Ñì”àåî1ÛMyˆCU=ãÑO:€—ÚD}-›ƒ7à-¦fÔѱìçbBÎÅà¯7 Š„ü¹ ýk&¾Ü¡Üа‰7ãÊ$¬.—D¹‚<†Í^1Æ£ )Æþ>Þ¨½ìGuÖ4i«…i3 $óì@¥KV¹­KËxe|ÌŠhšáJU9HÄoɚχâíÌ xûzR O˜ÍÀмl5­náÈ~»­v §]~Mù­RœÈñ›@Å¡·¹ À†eSO#h Û¯Þ~ïµk,³&Ûmò2ãµ9Á&?+ÑäYŠ-é ?VÙ¢µOÔâR"|é¬=aFn .Œ¹ƒ»Yª5Ül9ó¶Þeøëgî%¤1Àüöö*-ŸÞœL'ëaÞG&€]¬2¯;ch2~ñŒm` h?:d—£wwöÙC£¸Å·ÂLœ1ø_Ý&ÜÓe]Xü"[øu}´ õ„1C „ K¶DpÌ ß-tÐÖ73BV«¯z÷š/ÊÃg‹CEqØä5â FiÕ8 ”u1Y?;å⹂.š¿äô<áÀ¿³CU~ÑP#6T ͘RÓ…p/žÂ*2ÃXb•„öê€æ ëÈScÕŽ*6mâ¿£êh $ßà}€{.PgSŽöè•ZFrë|C´CíC6Ô.b›B#¶=# ,xéU-û}Qì'C'LN¢’é2ôîru»¥WÜ‘~мæl³op°ŽT E¨BI>>KXû/þZW1¦Ô³üSÙ»:Œ?Y §röÄïZ@;R~ÓBŠ ´ù‚å àø ޳‘GªCÁLÞÄñ¶á¦KŒ’w Í›xñÓÓÚŽ\ѾNB_a¼'Ä!ˆBŠø5â tbÛ˜b¤é¼d™±²Ä „#Û}EùÖgăjF­v~|ÿ¤5OÂñ-˜ñ&æû0Ó·WXíÔªéÔø)8 wî«vi^5þ- T·a+”9l5kMM8^FÉìë'Nì‰À˜ñ“…î„LØ:¸"ÓöVÁ29ájÁlF€•}rû«³ch7¤õv£]VbˆÐ,Ö´}ÙÆbkHÆ£4Âô‰ç ’?à vÛ×¼‡‡öé¸;NœÿAð¯ú¬g2"no˜v˜y«ÓÌ]nr2ý‹ö™KŒÐËB,Èé[,eÚãç“®ÅxßEœƒ‰[Ÿ$ÛØ†—d3 ”Eź50¬—KmÀ'}P`Ûàv†íTË > endobj 1693 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [88.352 595.5062 293.5824 605.668] /Subtype/Link/A<> >> endobj 1692 0 obj << /D [1690 0 R /XYZ 56.6929 794.5015 null] >> endobj 1689 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1696 0 obj << /Length 3656 /Filter /FlateDecode >> stream xÚ¥ZÝsÛ¸÷_á>Ðd±¡HHÙQ;ýß»‹ R¢ìdšLBX‹Å~üv!~žÀ_~n4Kd®Î³\1p}>[%ç0öñŒ{ši šö©ÞÝŸýt-³óœå©HÏï½¹ KŒáç÷óß&ïÿ|ù×û«»‹©ÐÉ$eS&“w7·¨'§ÇûO·×7ÿ~wy‘©Éýͧ[ê¾»º¾º»º}u1åFsø^øN|p}ó—+j}¼»üå—Ë»‹Þÿ|vu÷Òß/O$nä³ßþ™œÏaÛ?Ÿ%LæFŸ?ÃKÂxž‹óÕ™Ò’i%eè©Î>Ÿý-NØuŸŽÉOKôÙˆï ëŒeišg:g©ÒIp^·©º˜¦ ÈO½¹¾Îß½yóSžRÏpƒç*cF$0?ç,×Z¸ïfUië® tîQÔ»·Ôúï[÷e2üfU¬×v>øäO›ÅŒçܼ}m:oûuVmçv0EŸmÿñ›7 øó&?î¿ýÈ8cív±(¿†o‰d:ºmú~pæ K4¨c âU)œà¨Ž{¢iŸÊ‘à#:©ü µv6Ý®çEg§«¶ÀÏrP·ô"Õ¢¯'Fe\Ü,.¦RêI·,[j5ë®ljj‡¾Övž¬ñ™ÛE±­üèSQm­Ÿe»9TU²ç<ÆIoʺƒD9`VsƵñt¥ç¦ Ç¿›z¿qµ[Û‘å@0©Î÷«µÝŒ¬5•¹`YÆÅP%ž—ål ó'9‰!1“·Ÿ?_½Ÿ¶åcúŽCE=§±YSÿž$âq»¹àf†¼¬ªšg"œïêbUΨŸNßOÿ{¢“Ö©’)ãhשÒLs…ÇKc›ÇsjÜõô!’O{ôÇêp4+îù³ùÃÞÐo ÃÔ!?:‘àµtÞççØ{¢—¹8š ¹9ð!ƒxá¼> ì NN2¥àˆ'òù´&èòpbO'Ålf[×öú }ÝÒRc½)Ÿà„h¾¬iä‹Ý¹Cn©gÑlü,ákTUÜ Ï±¯Ù‚ЕTx¦¾õ粪<ïÛ®Y]9Ûí™$O'EÊ2™ ]mŸŠ<ŸÔö™È5>gË¢~DÅÅÒâYãžó–:Ýi`#Z®{ËÎ+¾']„Y,°áÍ\ñî¿Æ£­í¶€rÅÞ»»Ï7Ç™qñÏ Vûd7¿a±µ $¹¯šØ•žÌ~]—¸$j:¾£ ²8;¨|–æ{ï¨?PhDçmçàåæ(›1¿'$ËyüYÝL76Ó¡AHH(¨êŽÑ'u'“IøëªØÇ U8u ¸VºœJ¸mnF¶vpž·‡mGÚ&g™Ñ¶ØÎ–v¾­œZ¤âغ¨g–:Ð…ãóH‡ ¯ôÏyÙ0Åèýz¡1Á!ó\M,´P°SóÜI¯µÔq  x?–& (À‹¯‰S°\˜¡8qjâü_à@é=zvÇBC=âv‘u -j4õ9­sl{¿ãäŒxOsy gðF­w™Ä ¾(xô'KCîX¡w[OEY¡Pi híP :e¹‰ñó¤@–çàeˆ ‘¶ä.”]ÒÜ모)\âBË’Ô‡!súqÔd8“@â§µ_!v×E5²~Às{‹Q"¨9¬è•‡ÖCM'×Bä2=ôÁ›‚Þ™ž»Fyß½>”c“ΑÚpÚQâacσõÓlVe×Yÿ=@㧤:zl=•¾+b$#Mz‹¾SNñƒÁVꦣÆÎúF¹ZWv  ÈŪ@WA–¡€³nŸê4ÐTÈîoÚv ×DÛ¡\•3‘€Ë{‘H5ÂÁåjHÑL®‡,Ü4jz¤›Á’½Þ,¶Õ˜r9Ç _T.¡¥iÐhíÆ‡é5[³¦ªœZLâ¾ ?êõZ}„ÈЂj©‰ö³­+‡KÜJk;+/Юác½ãd»©ÉµJtw`X Òï,cR¥éPG\à©ÃÑBOÖÖ™âÔfx(ZÔ°¹#"·ðbç½Ï‘‡àœgÁHÚMvÛÚÉæ2~ÚlF=2KÁ#¾4{¼L¨RKÙϺÑ(š$*ï­2¦Š)ƒ² vêÓɆT*‡ží Ü¡'tï4Ƙ}º„/dɇZ™ëYˆB§¤L›„P-ólâÏS9÷NËLVe]®œæÁK_vøîôÏdQí e e¹xœÝ>µ¼T°ÝPŒ©}èç4…Òü ôÛMIZni»zuËÙPâ`ÃÐaý±µÞ\>çZ³f[£ H–#áÿž‚»ä|°?É` ÌaV•Þ6¼ò‚n"6¦ú—Ê·+ØpÀme½'3TÁLžÉcaùùFp.`‹4fø O ýôKUÛÆ @,W“r¥ä+ip ŸöéãÅѬƒ4˜Ê xv6!Ì1iR>àç(lEª×Ø8šÄBÈÚ`(KøPó¯‚)^{ö幈° zfÍj GðPVe·£®g‘±e‹MUZÿ-„¯vÚÒ›«§À“*­ØÊQÏRsÒu‚ðDvÂAz È5OƒšÄ\ 9.|#œ<ˆ.M˜RumxÝøM€¡¯‚BíìØú"aàcÎ`XˤZÅLmd–ÀN$Á±¹,žìYµäD1õ¤(íñhúX à0mëd§° hfÌþÐ9L”c0‘ßL²|¸!Ÿ‰­­Ëppð,l´Ã1%R)º–KCº‹Õ#ž‚ÝLy9ÿ»¦©láMê“;ùö…sdI–½‚DûT§‘h¤òµæy Yî”bÞ!MÓ‰Q/3©F8¨ h»¯8da‰rÐtáʸîò d+L¿0À©0ÉL‚¸„d˜lIS‚Ïb>§š=7²À®\Yúü Áe1æÚs S‘7¦hÒX)…£Ï•ê‡A…âÊv Œ½Çk¥X‘Ly)±À'¦òÍ„'š(͇±å>Øâ‚Q‰áø8R·œþvÀNi²0à sHN_Ôä>ÕiMŽT>S]Në¯ófåëç=†(K3ýòò‘jdýaF•³LAˆ0p"£Ê¢Ø^Òâ~².¢'§Â €¡"$¾¼›×0ò@òP¢š'™/Üg`øÏÅηé.#!ü‹·ÿøðé—Ë›[z ~ü“m=ƒöÉzÚrAO_á51ô«Vœ‰Ì\1Ð59„°nëS8|ƒ“l6À0ØzZ—1d!cÈ¿!càp.™Ñé·ëëÛ mW50tÁᘡ•ýhÉe+ñw°Ð2ŽÑÔ•Hñ}×lý¡þ„/~ÝDOïI>v20êƒì´òXóÃíg5›EçõQ‰Vq…DŸ+Ô6`ÔfÛXùèâÀXhÄrŸù§{ÚÌ´Ie^¹#ìS½`æŠ|†¬f›M=µ_Ëî8fif„Î_æ!R01ÜoÀ’’÷ËP] Í!žÂub‚s˜%ìoê ‘ v7Ô´5•ã\v·´³/¤ ðFWx¶vÕP*È'¾„ÅëP½/;F™Ž[Èé€E€Ïb˜…ûß ”u3(,G\Öߥ·.ù gíµÝ[«ÃïãíI}àp˜9²Õ¡GtZÕV/UÑ ¡ÊSõâÚ‘èxñ¡ÇfY6XýWLÞÁO¹Û ÌÀ‘úc‚×Am ÞþÀs.€ô>·ÄŠ6–•°ƒî›4Ö›Fò üùMŽp:µw¨sŒ.àŒìTAšq˜Ú»WàjÔ½B&)™âð’qÔÍb¢¦òØð’ÉÓUW‡[”†7C±ôt~¯yÍj5µ*k;´¼^2+Z;ôƒ£Ûƒ@–žˆïÛ§õ^I,7¼wúT/h~ r~°,ªíúHçAÜ9oõ⺑jdáaˆ„4Œ3Xyç–bë»àºà‰:<ÞŠ&IÄ®“tË?n¬ »¥ÿ0stWITXtðöJLpºäÁ§/žc+Z:r÷£®ñ7!3XcãâÁý•Þð»Á•(v´M uÙ´Jÿ¤‹Zh,ñWµŸÓ•·¹¦ôíè'P.ýU.³y*ªéµñw°áífÌý¢å(Í~i‹M÷ê9 39_ÉŒVi¯*á–X6k‹eŒ½Î·öEpmÈoà‡ ð€.»pG¾»müÊÖ_îc57`îÜæÎªEm³:¸gŽŽ Á*T§½‰ŒÝOòûSI‘J–eæuhÎû¾`Z¦!—’ü¨Ø=š¢³TÅ߆ì]åñŵQñ6%"ŸÜx,¡r"†.ww σ8m&á7' Á¸Ý§ÎO¥}«7iÆ£+W‡›22¢óÓ·2:W¿îV/^\ÚÆ“ÈkŠÀ¾Џ‘ŽžÍ“¿ µÖ§†aSΰãcÕ> endobj 1698 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [435.136 641.7083 504.3921 653.768] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1699 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [331.6917 426.9688 395.3824 436.3983] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj 1697 0 obj << /D [1695 0 R /XYZ 85.0394 794.5015 null] >> endobj 474 0 obj << /D [1695 0 R /XYZ 85.0394 378.4414 null] >> endobj 1375 0 obj << /D [1695 0 R /XYZ 85.0394 352.9397 null] >> endobj 1694 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1702 0 obj << /Length 3294 /Filter /FlateDecode >> stream xÚÍ]sã¶ñÝ¿Bo•fŽ >Iàñr±¯ÎôœÄq¦“&y %Êb#‘ŠHÙçþú.° ~H”tIo¦7WàXì÷.À' þøD'qb…¤VÅšq=™o®Øä Þ½¿â„¤¨õõÃÕW72ØØ&"™<,{s™˜Ã'‹_¦I,âÌÀ¦ï¾»»¹}ÿÓýÛYª¦·ßÝÍ"¡Ùôæö×½¿ûáÃÛûYÄæÓwûýÃõ=¾Jhޝoï¾Á‹“Þ_ß\ß_ß½»žýöðíÕõC»—þ~9“n#\ýò›,`Ûß^±XZ£'/ðƒÅÜZ1Ù\)-c­¤ #뫯~h'ì½õŸŽò³XÈDŒ0Pˆ µµz’j'RHÏÀÛå,’FO›UŽÀª’ ¢Æg†MV7ù®Cz3‹·îÃò`Š:ß=Ì—b½£å¡jß f¾ûîáöæg„w3n¦ùû¼&œ¦"Ü0O·Ì:{Îk'àCÄylµ~S¿2Íù2Û¯9H7Qlú°ò;ÒvZ¯ªýÚ2ovÅÓ“§Öýðs@\6Sdk„Ëýæ1 ÎWùüwœ®(¾ö”!èHÙúMUÏÅ¢(Ÿp¸hs¿ÝV»ftÈ·Ô:à@õâgp¿üb ÅüX…Oà~±|XÙ·ä —U±Îf™We™Ï›¢*ñ·c•_Æžsà äŽƒaͼA Z†'òº%c°4UXu¾B„ ðþB 4ç<#;Údáz/èÝ«[4œ÷4œ[ËìŽù˪ql@¼¾%H°µ$Ñ„–^ŽÍK†©²u]E'çS6ZÂýî#aae p!­¦µ7‘b<$€<'à™¹oå #ÕŸu³ì¾zã@M8˜3 ƒÑý„ kh^u}ð?í×}õ«ª£l¿%ü Ÿ‹¬Éႊãј/iÍir’NÁ¼wE^ãÇ~Tåú¡m¾[V» þ" z¡ú±‘ .beNrXåÙ®y̳&*Jð\Ï`ÅÇ¢3*f,hBþq[µ¸NAëe‹EA¶áV¯ðé<š³Gwâ|¯*}_Ó{®­Ž[Nõtã¦(½w¶¯ò4àŒÂÎ(¤t†¹*ògg~ôŸûšúêô±§Íi‹D‰‹–aAg[M&“u£päv]#Ø:n€7 UÙS^¿]—QÉ`uTðäIœZ™ ù¶ÍêüΘ­ivšP¨XK—â]0èÂ7^Ù©UbD Û+|km‚JíàS÷ÙñFŽv.ú;âö˜F7Hsðin‚;ñ±Âù]û‘G'?n Óý@ssи¹Iebm¬þ3æµ 6Ý3¼7w‚S0WëØkiÅ3J¢b)!{d‡‘çßûš¢Ì¢¨³ÇuNÑ'°µ³ÓgÜà­ñaâg!MÓI2IÀŸ”ùÉÔÆ†k;ÌüþÚWŽ^Ì=I~Ç`.ƒ$†SEaOQÂ88ÉTŒ§•Ö:–Nɧ•èÊ3ù¨¬ÛT Ÿ±)}žÍ’q‰Z95:ÅS™auþ¬/•‚0R5éÓÿ¿±Ä1_q˜²ÕÞÏÇe°Š˜é“ù“µ»›„üèˆês¨/«>§1ëDCˆ 9ϪÄÄ©0ò|¶0äÖˆZãVŽ/X± þæ&ѸušJ~!â_T®3VØ£ã æä>Bry[ Oí…~‚[Ÿâ²zd|Á†( jL“K_ŠØ$T Pâü×yvÎ{ä|.¦uM«ÿG.Äm UÐÃÀ-R¯wvÔCsÅ:¤â eÁónÎ÷Д[YIjÔTMÛNé2’.Óé‡éy¿â¥äwé–ù¼9ÛîP A½ÄM9×±V€dMšÚƒ¦%SÎHšMl•=ÕdD¤¨u¬¶¡Úbù@ö{®¶8JÑ8Ú„”ço±FVä>ü¦’áò·®l‡´‡º»FM+2¬qyÖ»–ä–Ê{x›—®0Xà‹ºØì×Yƒ² ÝG‡U=ÖÕ:÷‚‡áoî~Dwé1š×-½½ýá§ëûä­?Ï8ç =zj©–±`•Q™c'ÇU,U¨Vzóa¬ÊÓÂeIÌK.·‡uF¸Ë 7oæ«èi½Ïe ¹ª`òüÚ-ÖÈâÙ²4†D>®Ž=]‘˜N‚®mÆHF®}™HT&ÆdF»Pe*ÓV½ B%ÄN$ŽPËK-C»pžík¯A°5ÙÒ^WÎP ÉL³¦É7Û¦ßW2¸"u•’46ÒuiÖPuTW{Ì£óÊ?]½ï]ÇÙ=Å¢üÁ+ì0D­5€æUY7»™™îç¤õ6ì€Ðó®ÍÍ–5BuÛ=†¾-lí4¹…©óx¬GHbøÂ—¶ù[‹§ o˜‘SÌè7¼Ïº¶ŽŽrF ©hNŒ@Øä‚7ìc6˜ k2&÷õ*ríÕ:ªÊ¨^í›EõRÙDfcuž”k„qÐôQ`@Ì?ñôFJj~IHB³MÞžàÀ‹ü#¨ŸÖøk±Ï %Ë‹g<Ô€/¼}ÿp}ÿá "Ð>ñUE“-*ZÄ…º>–×v›@ bÄP7²ò•B'µ[O3vE“ׇ'Tõ¶J5Òàw-QÞšìY±zn@°½nêXN[¸t%3±Ré¿ÜÇ:£fË·ã2ØÅzÍ×E^6Gi2N$Wç h±F(lVC8¤«èÀ-MZçìà—Œ Ъ¼iRãÌn|³]ç Ú7·Ý}‰6í À£³æ|*«ÖUÈTcc|ð­uÇÆLfôOAåÎ%?P<ì°w-P¸æf¹È©¡š·™þÇ7¢iÂ1¥ÍÓF$s _P|Çuv¦SaN—Ð01­·ùÜŸü Hn^ªÐþÝf»¬¡aʨi(×gåAy³}³ŠÊ‹j“cæÁ•CŠ}pô1N¶`±Rý‰£·Ýr.@­"—Nñ1fÿkyuª%¦”]ãâ[ž-NZ¤€R;Qò‚ãïc¶ÈË˽ª›¨n O«›b~l‘ΩHkÏÐbP0´Hx îmH‚Ï€4ïEGŸ kRa€0ý¥ù{žoÉçr:ì…PÐíÁ#-ýù¤ûô“_Ýf‡5ï›]ˆ¡©BN°?6Èæt)3ÁÓƒÓ‘¢Y‘«¿ ÕÒÀ_øò(8-mÎâÔª þ·uFÚËQêl¥ÿ¨øˆÝëè1«sdÅÀq¦èh±Ž Üph·ÚšJBr¥º`“]3’ÓšX§Ì¶!,’‚OoüÞ»qP¦ë¦¤©ß¡ÐÂ5ð^‚‚  Þ¹•K:A%vø#ÃG³ËÊ”bCK꺢3V®…£Hè„§DqPVŸI„ Àm9ÇpàôÃ'­0ø/ÌÜ•™; ƒ—@Fªü!¬ÐÕâ#“ÊðhEBaÀê—NS¾ ¿¶û`S4ûírìzÄkµ‰jÐãpƒŽªèÆÅ¾yªºÖÁÑþ¹QC{ §jûzôÜ<ò:iO}·;wU%GÅ9ƒƒ´©–û×sWhYË.xÚ>ÖiÛk±¼íe±ÉÖÑŽjŽc_«d¬HšÏ’ÐbÐ0Œ/`(*M‡DÜ.G˜g!å4É'vÓ ì: —<´•@O c»ÐšÐɠʪ…<®îùÙp%Ë}A7.` ê:ŽkGÀCEìM—íéôÞ*üÝi.ªr³ª 'w3C¦™äÃÒQŠP:JJÇÇiƒÒÇ‹0 ’…ÃáEÑÕ„o¡äñ“·1çiÖù“ïˆxÕ—ÌÊýöõ®C^á±³eé&{mƒ Ýæ:¼AE—V²ržïFu7µPäg.V+ņŒiù9ÌŽñö,áŒÙõ°Î˜]Àòf[( Gs_C”±kÎ]? ¬?ت4@Ž8 €äe{ý<€1>Ø$D**è9z€ ¢xM·ïÚˆÊ~=å/V·ø¡“¢[& æ»»·®ÑT€e ªÛ¡†››HÓç¢Â®{}áÖ `ÓQ¸{a`eÍá- Mñà-øš |É eë—ìµsì ¬ÁÜ›¼\VÔSªVí¶Ä÷b¦û6s|¬šÕ0 H Õ¶hQÛ¦Íâ8[Ì)VmÝ5³:>uÇVêØ]ŒQ"6¹x´õ©÷o»ËÉÊ&˜w @®®e(Qþj2;6@º¨{LúÓ‡ü©endstream endobj 1701 0 obj << /Type /Page /Contents 1702 0 R /Resources 1700 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1706 0 R >> endobj 1703 0 obj << /D [1701 0 R /XYZ 56.6929 794.5015 null] >> endobj 1704 0 obj << /D [1701 0 R /XYZ 56.6929 625.316 null] >> endobj 1705 0 obj << /D [1701 0 R /XYZ 56.6929 613.3608 null] >> endobj 1700 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1709 0 obj << /Length 3730 /Filter /FlateDecode >> stream xÚ­ksÛ6ò»…¾Už‰¼ Î}J'§›‹sg»3½iû‘h‹YTI*®ï×ß.€ø’œ\;ž1ñXì»Ø],Äg þøÌê„ÉLÍÒL%šq=[=^°ÙÌ}¸àf€]¨ï.^¿—é,K2#ÌìË&ÌZ>»[ÿ2û÷7ÿº»º¹\Íæ&¹\hÃæ?.¯ßÑHFŸ·Ÿ®ß/?ütóæ2Uó»å§k¾¹zusuýöêrÁ­æ°^x '¼_þóŠZnÞ|üøææò·»\\ÝEYºòr&Qß/~ùÍÖ ö?.X"3«gOÐa Ï21{¼PZ&ZIF¶·ÿŽ;³néÔþ)m-”™-¤J¬“»Ì¦aשÎ#…Œ»,øÔ.(Üå]Õ–÷ÏCa9Iʵœu1ŽèF¨ ¢C˜ó41™1}ÊË{¤úú½²]P–f€Až‹†`zèO4×ÖÃüÊ4k7ÅåB‚r×Å}~ض0Æ_ÁˆMçï®o¡¡³ùõ§»åûÿØcÑ4ù w3y}ÉíÜchŠ]K­§M±ó4ðßjçˆÌ4Eýµ¨i° èí¦ªË6o˯²ÊËP‹w,É´Žñû 29_mò0ƒ s (‹‘6¬L gÙ,U°‘iÊq›i²~˜Q㦫—¿è.˜ÐË/òu[¬Ú²Úo`ëCn„d‰µ™íq3²õclÈœUeìüÎí3°ÑQ…Á”W´ÚЦÛMœBí4ÔÙ–M[¬ ¢ôÒEHTí»3#"«Ê}× i’ –dJÚ¾*Ñ‹?VÅ9‘Êã…ÆcDkjG[v¹®Ë_Ž%Ù –Þ~zC×o>^QÓ-Ø®ƒyk=Ïw~½¾ùî¹K®¡N~@‰W×I° )"ß6Õâè#ÊÓwˆÜ°·£ƒCQ;0ˆÐ`ˆê„gB¿oY ^ü±ß–«²à Ù –~—7ùå¨Pòè4åîaBÏÎ]ªSí¹<¯g•WVA¢;±K Ô!wÕ²`^q{M€ôßã6a?nvp›¼y f ôˆ`^ÕݤAÃ5‚«ÈÑ %0Æ{¦ rf¬ä™¸GÔú\зÙ«ã)Î4-˜˜>[ìW@ÀôD\<™o:ÑRNˆ#Å#¥¤ˆž6åjCÍUÞx~Ê–¾ØF >¦9ÇÍ"R”X‰ŽÛo³ÓÛeRÐóEôÚÂÌ—--~ªÛ55ɬ…µnëæb…>½~¦.º/œnõÎ/¹GÍßûéMé9 šAàÒÏ–žà*?4Îîa®Ùæ_‹&"wFCL÷ü۪ΛM2Êõ|BeàìYpbg“®Ðéœ+mpÑV‹¦ÊG±”Â5³giG 1ñÞIS6áè:ºÔ'­…Éøù¬ äNmêbE¡ÆjS¬¾`3£æ&sÛÑOÁÚ.~#†ZüÞÜ4EK«ó‡¼Ü5íÐCl¸`˜øÕUý˜o)PÀNÌBô27^5ä~Øö©uœUÁ—äˆQBÊ&p„x€ñ ±‰?ŽºY~X^cp¦~î‘—mŸXsØï+2TÄ_½U”ùê<øŸ4¥ô§²-"oiмŽ=W Æžr§Ç4ØPÚÛîÒv*ˆ¦-·[;ð˜¼íL¨â˜”bpj}Ë í/ .¦õÎÁ >;ÁºÐîLà ÏÄIϤ%Y®øy×Ô…:í›" U«CÝ ‹:&y:‰³¤#Ôížk’²6 ~"?Ô–™³¾ Ü[&…íd\xKpÌ„3ëŒÓMû¿ v IÙ 4mCP>ë§=x/;‚'-e"&ó¸ä‰¬)µñ€ÃÎ `pí¿d8ä}§ŽF*ü¡¡5«bþß|"Ö˜Oó ÕaГßOç‰}.M5yñ€äÈŠ°ßíj³xئ®3*ì=ÿ W‰“AHaɆgçcPèt @t@œ?^ìšr=ÎŽE„–gIG 1í~vœBFkLø©¢¤V™ý¾¤„òCÂ$÷_ x„Cs óGF#Î^ß.ßQ '®]ª‡½ÛP:‚öòX:ª+ã…¯C }}Uobe»ñ|€‰Sº¬±øF†f*£t§4e~#±ϵðK>‰õÂÇ«èò†P˜™?Ö­H¤x ÈQ±Oß¶AX`3Þ™kÜ”j¢‘%p/€+ÈX*—¯ ñÖÓϺ ’BˆÕ—rw?Y±‰å™ˆÍ™ÜÛa¥é›Ã]ÈI¡T³éPjdiJ{Ýç¤S‘ÐPRÉó^¥ uÚ­D(·å÷+!™]´Ïû‚‹N¤éyòj‚~OTÈç¤п W²Ô4\«šÚN•¤†é—.ä™Í‚Pò„]$P)(âÅÚ3t_ºâ`‹*Þé¨âí–æÛ*0íÝÈqê«ÔÖ_ŠåhTi6ñîáîEŃ?å.t¹$1D´ï0=®3¸AÄêÅÛ§l3ë—Rþkþ-{àÂñ­ÒN?î_Jyb˜Ñ§qÑ:¸|3¬è£ZîÌ‚kkºFw…Ô‰pü¥€Ó(a“PØëÎvhWˆ§€&£‹ùt¹0|~ÿÅüjü&/´Á]8QŒY$>û}9­Ê2IP¶“ö¸ nàõòQÌÞU Ó¬+VÀ¼è¢vrÖÓ/ˆhaVÀ±VÊ{úëÊßïŸ/›¾S>î·®Y êþÝZÙHû*à »‘³îþþ9•I‹/ž RããîŸ3(ˆ– NÂ9×ÂÍ÷ˆo.‰Óç½c„ÂýŸ±(׋}UmG& !QÒ2›uÑŽ}c€S‡ÁnÚÙ™‹í‘¿£¯îl:ï4ö¢eÑN¥«°iJÛšýJ ß>åÏM,ÐTU}7T ¹|çÇ:\@Üš“QK0ÏÀÙ¨Õ…:£—õòÇ}=>—`Ü*ÏRŽPcÒ}¥•Ø43}Ú¤™vÒËÔ§—8vZ)ëHn:ïE&K]ª‘Êuˆ`W¸g“”ªÿø]—Mþy[Pgùóû›þtNŸ}^·åê°ÍkBÑŽÏC‚ ÆR˜OM1çÜ=«2_W·š& ×Á«<&Mõc~´ÁªS ›¸ÛƒÎÒ,ü^a_W_ËõQaÃk=´Ê Þ˜|pøÊžF¤<ÜN½ôæáÝïí#¼½7ú­H¸2$µJÐGwÑì-½ÀÄWçìŽî²=&2^ÐØoÝ•ÿC#¼£]Q‰%Œ¨g·$½ÀÁ×Ù$™™À}þ…«wê´»‰PSÜàL¤”ç©G¨ òýë7"^9zô£öÛcجê²sVªû‰s!œ eÿŸs8>{`†à¿xÖôœ•øDãýÖ³g wã]]M¾õ#lçmMB6Étú‚­u ÎØZ€êz¦mÍB*é,õ5A¾ok2Á7†ù¿ÆÔ†B MMÓ/¬Nš3«úrž3µÿ‚Äc¼ßljpgKÅ jP/±1ÂvÞÔ–Œ~ÁÔ:PgL-@!Ŷ.òv±riÝ"oÍ>_f~ÁZmγ¡&øèÙœ‰5&ë3âó\ÅáÚO¹ô¿_P¾š#>•…–¥{ÿïcþ¥ð#Î~;>Õà –i©»Ê뺤goÅûï+ÐÇjã¯B(2`®º„ÌP²ø³§ÝÄPp=‹?°™¬hAn©ÃûÒñoäÈ×&¯óÕÂ?bXÙÔଥgÓÔ_rz‡¡'W¼§Wz0¦.é×5]µfÚü³¸p$Ûピõý0wŸ¯Ê-ýâm•¯ý«DJo 0H¿ÅVa·…'MUFXøézù³g÷¹i‹Ç©R¿=R HËŠÐ{(vX=%[Є†sÿ½¾£¯ ¾ï>ÝRãÑ=lÐK˜/=x0!3Ï^Ñ÷s……ly.¡uJÿƒe,~ŸÔ¿ô~,÷ÚTtôÄYy^{ô)6R¸õ¦<ûV.ê)IÐ Õ_+‡¯Bê¦õà—E»âi º˜ú[ï6ºÂŸëW¡ ¶¥©ûpù°«ü£prêwêR'øãò ÆbÑèOÿ†ýø•&ÒZq:Y‘¥)Ü3ªÁâO´éëÿÖm­Íendstream endobj 1708 0 obj << /Type /Page /Contents 1709 0 R /Resources 1707 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1706 0 R /Annots [ 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R ] >> endobj 1711 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [182.6146 743.8714 231.8861 755.9311] /Subtype /Link /A << /S /GoTo /D (notify) >> >> endobj 1712 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [293.8042 191.3384 355.0043 203.3981] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1713 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.8905 191.3384 444.6373 203.3981] /Subtype /Link /A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj 1714 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [309.3157 160.0192 370.5157 172.0789] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1715 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [305.9683 128.7 367.1684 140.7596] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1710 0 obj << /D [1708 0 R /XYZ 85.0394 794.5015 null] >> endobj 1707 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F60 1366 0 R /F39 1178 0 R /F14 980 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1719 0 obj << /Length 3808 /Filter /FlateDecode >> stream xÚ¥ZKsã6¾ûWø(WE ðytf<‰S›IvƩݪ$Z‚,–)R)9Þ_¿ýR´w·Ö>l€@£Ñ¯R×1ü«ë4‹²R—×y™Di¬ÒëÕî*¾~‚¾ï¯”ŒYºAËpÔwWß~2ùu•™Î®6Á\E…º~Xÿ¶È"ÝÀ ñâÃÏŸ?Ýÿë—Û›lmoo–¦LÝ9êùeÕµÃáF‹®A‚Y [öh·Õ©îòцŸU+OØcw¨‡j¨O´¡kPÅišBKEešjZ¸·‡“…I/^¶¶Å–‚iú{¨Û'îøó/¶w£êÕ–›À•¼ ¹g] È8ÉÌ¢›Ì/6]Ót/~öŸoºsë®‰ÙØ1Évò‘Gà‰­¶UÝö‘UDI¦sõZÀ(½xì†-·H.ðD¾JòzEµüÒÛAFw8ÿ·Ÿ’"88•Ç‘U¦µ^A4d|¶*ŠMYʘßã4æã‚)×vS›hJV†­rƒÙB¿2¥æ-ɈGã¯òÙ†Õb'ýÇ¥œr©"ÇèŒCUXꤤÓaq"ÿÕµVdܵ¿Ç±~:ú±¿nA,ÔO›B+îé›IO¨Ø!+Ò7+ì`2ù; ðŠûæ•é/u#<Ú±bhq¬›†8,‘C|‹cOrC’¬ ij¼ ‚ZcS¡^E/½­L~_Ã@&8IÓÅ}Ë´¾ÛIo_ÇJÔ?«{ᵟSôc»¶}}¨ 5±YôG46]ÂÓ—Fì)´V_ìà©5ßÊdLwâ}Ç2öø³ÕÛ”Yé$xN…&:™¢–IùÜÏü3Ô7ä"tvjV,vÕ+Ó¥Ô…1sÚ®[×x¾VÞ_yÀ="òàz@ªÄ̰¯x+8“e‹Û¦ïP;!V§®^³jdî3ÔHö$hxßÀvg¶"gWè±rÊ)ôˆ¾­ß[bˆÇ=?«Åîno^1pÊŸÌ Øw}_ƒ0Ùþµ·m/]tTlhï¥gôÊY.Tß5'±·—-­Œ­îجÅ*Q±^êÞzÓ£çž-àTóY¥nC³ÅS~cŸuןP«4ÀæªÝž^Ç`¤è±SÜ"6«þ¹çÖ†?-(Ü!á§òSôºsê€c6nm×â×CÌ ‰ò¢ÌÅkoº.Ž¢˜û¥—/Ê(Ë Ðóxa›ÔW!Yທ¼ ãG7NÀÒhNJ&ŽMëd†×$* åbn:‹ã…Šù¹«êƳÞÚa†ue`ÔÌñŽ«ÿzÑv‡]Õ4$êØm‚Tt¦gÂxWBÄ(r+ðþâÅ-üq´Ã7±©©è5„TÀuÂÎh"@ty Àr¤Îó›ƒÉâó¹ˆ)ª„õžý ¹Tx¾Ø¦A9AõCÒsÛ½´B³'ò¸@…Hq|B7¡ÈŸ¾Ê4Þ ÃKÛ Ü¨ý7ÒjÐ#F¾Úa@ÏD›v™¸B0:ÓgXÒc•Îud VÚnN’H'­ðuÝcÐéyqu0ûe"]|³“z>µLóî 9l)‚5t®š­;F®:ĉfeH €y=#v-g¸R‹cŒÔó‹ ׳®Ç¡mc4/g4hÁ¶¤*øF|cãØû~|Ž¡ö (Ë’7]'1ЦE‘Êš1ðð_™Å©¶/ ôþvìn?àuÊN]g [‰°µ;ßu©*N¢Ü˜÷µÂDE®oC¨ð2{TÜÛU½y}YšÎìêxèðÁ$³‹Bæ”ÃÁ ¯*6.ÉÇ4¯eê§¶ó&ÈrC*PxùŸÍ'…¦{ŠÄÃêÐ2V€—ø¿êÉÎ*Ó×÷¤‘QIžlm>ݤ«ß8 •CŠèýcµ4Ù06Ö¡É&Î ¡Á"K´`ë g´Ú ƒZ7f"† ŠÌ¶ÉIE–Fe>±D6X“¡èºçãm(˜†ú‚TÖl1bÅNÉ9 !‘s¤Ì0+À+f¦;¥Tºj™ýØ‹è?$Ðì“#dâœg Sxþ9£š3CÆ.¢i“ÎH;Ä;—PÚ%5£Q(øõ(JyK¬î½?Úw[Š4zÚj'1Å3©ÿSj—šÞÉÒŽ`D‰}|Þ@­ä+™[åBX/빘öh!q÷áOxÚÛ¿¸EÇÛ×€»õ˜FïnÑ侎‚oÞ™ã ú!Gæ'"—ãþ¥ò0‰¼é=ª†Py ìemqúN–õ¹ ¾Æ„cǽž‘ò»™MIRi š|àæ^¢J;ð;Íâ'6\æM<Ôý$_|­!‹›Œt&§E¥5Ë#Ã#”BY0`‡•Πvï.'váÀ,’sƒmvÔÆ¹“(‚ZH¨(sÁIžøb˜ãḏÈq\:U£tT”Ð~׫š·¼êÒ?:½-¡Á´€M¹¡@Ç9(f“S|H;«5ÃL ò(|™Â% ý¾ã°RHæUº<(¾˜Æ_[ðåîÓ¯_ï>FLgÏGn]bVˆ¦¥DÆdÓ;'kp;ñ3=+6G²?ç…^öä–B‡' »Ïî–ÀVw˜¸<ŸhÏÅaiŽ2º(=K}×dydò²x¿Žz»ìGqn1¬¶Ë]µßÛõ³à‚så …ÀÙéû|øQ3ŒŒÂw½ Ž9¹ßÌ&¤qúnq°@it¤ u(4p*ŒÏû_N‰ì %2&sHp9RÉâq½2íbx0¨©9—ah )å4oç”üâ|vÛr …’ˆR‰!×ßó`N„(N jn$á(%òQ'_¬VvOU3¤v£bDO°Õw+ØÌ3UÃ3ãÊ©†ò>Ò«9u>$*½%Eêà[\ð¦×Ü©•‰½îaª•|‚˜î©uqú—NH1{Vêªê†û…&~è^ì‰Aå7s¡¤Ì£,ñ)„ßõlÄa£ój ¡gÅzš×u‡ëìªehA¥b\£bÌEÅ)»zÛ?º©Îz}†ÿWÝñYÉúMoªó8Êò"{ß›†£Þö¦~”¯»Œ‰—ün^ž’ wjârý>#~Ô 'ãÜ4b¼F±"ÖoôYJ†¯P´Q.¿Ju=a\‚¯RE‡–\›B«äoÜ|˜ö5_.à©vxiâÁu^FI™¹Ôy¹´-®¶ÜÔ((¹1FGe™N 8WÏʢ”®žåw‡·}ò”b}BpxrkÃXÓân'× XÕœG÷“øÞ 4wÇÏ­mö“ÕÈÏÔgv«‘Ä9îÒU!àXe#So‡a)θ°ç2€ðTŸØ‹BÛ Ëdž;‰Gx~üü•Ǭš"ôÛ†Ct`BËõ:xákKøW'3ò^Gëß“ùÚa¶2#®.•Ë»ÔaâTûŠénçÊI@t¼a»z$œDi}i"Uï&2•±›À^¹Hô‹]j¢QI”$Ù»ea‡K\zH _s~Çð/|fšFZéd®øâЀ€U)-w òöW 3µ&SDy‘;ÁÂÙœaA*wઇDßîDKÐËÊÊxQv ìd„Nžšî‘Ë Óµ“<Šã,ûŸ“§Q©’rdÖ®Ú]d,³rŒofc‰7꿌Á=j gràÅÈf°Á6ÃmR^Ã×QÆ(Æð.Q×èÐ eÆù“$¹Iß’Î » S¢“1»|KŽœmøéù?cÆ^(ëÎ ûl{èÊÛUs\»j`ZF±žú!Ã×»xƒ–/qTƒ8PÜŸ.3±¡»â˽œî6¸uqBã|ê/kÛX¾©„—ÀS›\ö壽 sÖÚ…5èt²c—ˆÓï÷͸ç«Üµy8ó´â铺sÍkz>a¿¡ŸyéëÈ[=/×-xîÕœE1*8x€ñ4ýžÃˆ¼±u!o$?â0gyãÏ"øæÉRƒÄ̵k™c5&ùIY,n…ÚŸž,]3ó}„ŠR=õg|+­Ü5—p¨<øku¾/ñÕDéS:èWToØýËTÖÃõ¼îQàæÐ­ºFª²âIÓ= Hg5Ìå$9 …“Sá¬4[ììj[µuO°«ô-Ó-çqŽtÇž5*ó5|è~s‘fÁR‰âiêô‘â¿å–t^šÿ’L´–™Å›A¢„øZÃaÎm5(’Ué ’ mÁzÐâ_aK€^„it °@RIL@…N\ò­síGóoµh>1:`ÚÙÝù¢c†y÷ó–QŠ0:”Ba5M£G¿¥á¶µ‹¯NÒñœ¤cwŠxãnݤËÅ09 XD¹½“¶c•.à‹ˆŽÌ~nÖÕÔCÑ8W-„D]-š1‹áߨé&ñ”,Þò7>"ÒuŠ»–¸ÚæòñB‹‘´ÓdüþÐu*#gg;и´ Ò9ÁíA ¶S9gô…³·2ux=¸3cßøÕ'dWøSÍ™ -¾vê÷ÿ"ôüsY€O¦(ô?’ÌAQ ˜D˜¢ËêË4‘—éÖÿ p5’gendstream endobj 1718 0 obj << /Type /Page /Contents 1719 0 R /Resources 1717 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1706 0 R >> endobj 1720 0 obj << /D [1718 0 R /XYZ 56.6929 794.5015 null] >> endobj 1717 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1723 0 obj << /Length 3813 /Filter /FlateDecode >> stream xÚ­]sÛ6òÝ¿Âo'ÏD,ñè:NÏ‹“sܻδ} %Êâ…"U‘²ãþúÛÅ.ø%JNÚ&3!°X‹Å~ç!üç‰Be£sc£@‡BŸ/6gáù#Œýp&gî‘æ}¬ïïϾ{§Ì¹ l,ãóûUo®$“Dœß/™]ýóòãýõÝÅ\êps‡³ïonßÄÒçêÃí»›~º»¼0ÑìþæÃ-ï®ß]ß]ß^]_ÌE¢ü^ò G~ðîæ_×ÔúáîòýûË»‹ßî<»¾o÷Ò߯nä÷³_~ Ï—°íÏÂ@ÙDŸ?C' „µò|sièH))Î>ý»°7ê~:Å?­’@'ÒL0PÊEí(>7Ú±’Ê1°¬ÚQZÕs¶¤NSÑw±ÎŸ©¹ªvÔ¸¤ÏîB$³lQ¹ï²@Ï\˜ÀZcÝ䟪MØÂÌ.á¶’ñïh8%(a<æOYIpG€n>>EYyV65sF{,öÙäìpœÒÚc?oÖi3±~íž²S¶HK Dù=ŠÀj-ݳûmUfÕ¾.^˜™eýœíúŒú}ŸÕnÝ+‰+‡Ü3àŸËSžRwH_„#¶602–ÓÚÆHó> ‹˜Ð¶ ÷šY9šæ«]µ™/óvVÙ.+Y=¦FÀJ‘ ÍirZ¬ z E¡Òó_>“ïÞEIWÚ ± ß¡Cz!ÒFóIDVYÆIK`°ÒO^XT) ‚S‚”Ù3õQPòª$hµ mÒºñSüòAƒÄÁjCð¼á‰Š×\È8H" v f¿†¡,pŠPÏP|T÷壦‘”ˆ<èwäÔ‘×!ÕEúÄv“Ç$bd’Ôì@žá˜Ñ¾°@7!=çEAH‹j³mÕ‡ˆ•G©ÕhÙsþ‘˜miª§´Š LŽàà %èf±Øiãáô©³†°¢o'§nJ”U° Q –ݯ6Âsv;d\«¨³%µó²%²qÿ¨§lÅÿªý®LaRÙ–é2 gõ~±¦Û$wó!h±NËG$¡dú1Î&og#"¶Ý0°¬žËº!úÓ ¯ƒgÎ3¥5ÁÜ„ÐÏË!oÀB:"a°ËÑNú"12ý‰Cø-¡ÒäVòò‘z‡k¨˜ ‡ý¬5w+ú>ðð¾v{„ŸÀi9-ÀvY•óåK™nò¡á|õl£ÕÎy²jÛ8ÙÃví¹Ï@šæS;|ΗÍTÍÒ†¾|Âj–}Ùfeí:‹™êö–Ö$jvõñ'ž¡dÈ&ÛT»j/ª²Þo˜¬‰u"oAA`Á‘1&hZ“£ìw: ¶d5yRNŒ´$5ÄF«†ØAêñ›Ò‡ÏZŽoðE½.²&#צ:U#€ýš6ʆ;ã†?m—*³[¶ÌÞŒœÞv$©i¥Dgt&Œ‡“myK{²³:ÿà $l£Ò‡‚)Ìñª @xÈKò¶Ý»¶X0Ž;Yl0{mËBëE‡Ù®æ} ¶÷DÇWf㘬É6Ûj—îò6Ø[8+ˆ=/aýŸ¬™ÜÐë†v|®Ô;ä5ÁáPöžýè`罌œ/Dð*’‘w¾EtZËlÛÔ jh©cþëÅáÄJA˜Ç=¯~8•€è@‚•"ò‚ñ$¡òXÎ&[°ñ”»ã¶ +€ÈÀÔÔ)²§¬àöó:wÖÝb4 6lj`‹T ¡7<ýof¬ #™hú|–Y‰’¿Å )ÉÝ8üƒ(K´'tœß2°ŒZµ›b·’XG¯±[F)²9 Þëm¶h Ì‘B 5T‚`N]¼HWÄÞ5ëÀ2[¥û¢9,k8iBíé`¹uÇ:cš¨¿ræQ)œC*kd$†Z06NH¹Áøz±cÁœ²bv³šH°V ãèd*€–LI¯êo¦¬O Dì…"l9m{Œn³ Œ‘Lʰ ¦Ô`–oOLŒ® Oýö›ÇhWCÄ.©À¶;_œøêÑÒ’³°˜¡37ðÏ]îOF`cóú£$ò\ìwþ8¼#Z§5kæý:h_«§‡'„éN_¼š:!B9ªÊ‘‘pP&>­Ê}¬ãªÜb9,Aps2 ‡ºl)’èôò-ÖÄúƒ­êë@fHÀuÉAK"goo?}º¾¢v½ßB,ÐP'/§Ì/œmZùÚÙ†àÍUÜrxAŠöSÉ’•øè,ñš::Äܳ¶ê¯«™IìëR˜„R3ÖC¶æXHKù›¯øË$/+ºHvFwÕÐÌtÌY%.ÔùqŽ€ßI‚| +ŽË3œ œ]ôŠ<÷°NȳÇêÉóSZäËÔåc™†ƒ`O“ÐbMÐ0ÜnÈÄc@„—i¥L+ÓØîQåúÓb­â VÆ~«Xk#f·U“ML‰˜1ÞU¨ühæØZ1a‘ZŒ×kj6 zàMRa‚D|ri ”GªWÀÐ0îÇy2!×.Ñ«’·tS@ ãÍŠÆH¡1Iƒá|D"¿Þ»4[u6 fîŸö—‚ï2¯]üùm˜Ça›)ì›)’¤ ¬h‘N“DÚ¯LZ•Œ‚m<7k}œ óD*æÔÝRUF[€fw‘Ìöu3OËÅÚ•åqE Nô°´Ð¥Çÿš+lТ¥WáþmDRcí4T ~£åuûbþpÔ%Až¤ EŒ#"¾”U³‡}Cà”>ž% ô|ö¦…:@HZî!ÿx¡Þ¢*±&ö¸§¸bIÐ}íªG´Â„Öj þ²]š,’-石—)NÄ`4c­Nå+óD9NÄ€ÒôñļÐê6}©ÈƱÂõ'¢!XTj¡þ÷¡´©Íi÷ÑÇ:î>Z¬žm¤l}ž}Ùæ;²¾ÃòÄx}’Œk‚Žaùß‚·: äÒQ€FUÌ­à¨pVçeÚ°0Õ„D‘7Ž>AÀ½z!тΉÑÑihÁ¥bíô:“g87@+;*ä|M`ëÄåSÖ4T1lÚ&v&r¼ÞSæôµÞ¶(o*‹ÌO ¤ÿ±±ß”<í‹2k‹k]ñ‰ø¸-R_®jštñ¹>.¶"„ÐèW͇uBl=øû>Û½`6–TÌ@B^¹ÅšXzp¤s$`kÚf 7*ªƒ‚kØQÙÝQEp¼UàR¹í’ö^­ Ë®­ó?·—_£\ I¡xýìTÒúL7±KÞ ì÷‰ôÐÎ&A·•ž>+GÃò £^ s¾d $·Œ˜³×=Ñ*%û9úç]Hü³²mQÃ3L÷Ö«-3H7¾ŠÛ‚Ú ¸]wUÎj5BLŒµÕG¬©Np"àDµú„¤å“zçŠêÕ V‚#I„U§e¿u\ö[,—­ãEþ…¡ž®EÙWo±&VŸ¨E–§Z”ŠlkÅŸÂè^G±Í@ŸP³Ë 8û C‹uºK|±Šê 1c Õ§~)›ô Ýõ þ.Û5iÎ+/« µa€˜B•ý*T4ø:‚'º»«©Ë~WñEz*në–UY{¼áu>BzwÁУ-âVÖ> endobj 1724 0 obj << /D [1722 0 R /XYZ 85.0394 794.5015 null] >> endobj 1721 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1727 0 obj << /Length 3259 /Filter /FlateDecode >> stream xÚÅMwÛ6òî_áÛÊïEX‚ø±ûöà¦vš¶q²¶wÛM·Z¢,¾H¤#RqÜ_¿3˜J”¿Ö>p8ƒùÆPò4‚yj‘äq~šæZ˜HšÓÙú$:½‡±7'’i¦ŽhR}w{ò×K•žæ"Oâäôv¬•‰(Ëäéíü·I"bq+D“×ï¯.ß¾ù×õùYª'·oß_McM.ßþ|AЛëówïίϦ23ròú‡ó·×4”ðß½½úž09=,z}qyq}qõúâì÷ÛO.nýYÂóÊHáA>Ÿüö{t:‡cÿx •gæô^"!ó<>]Ÿh£„ÑJ9ÌêäæäŸ~Á`ÔN“Ÿ6™0±N@’ ¿ô€¥H¥šTHã¤r,Ç„ì¨Pȳe9û4}¬VóY±™ïžYƉБ< ÞÛÞlÛK%…Êb5ÜÿvYµ x¥'ÍCW55Á·mË9BjÒ5„±ü¸h6ÔM=íÊͺª‹aø3fòováL$Y²ãÂä]³Æ;²R’‘ kÅ*¶†„èb>g‡e:4Þs­aÁóþÈqæèê–;ˆq„îWhI8coÑ%ʯUËSɤaæ¼\•÷EWÎǼÙ;"HçÒÌ,!qe)‹ N\»·1R4õꉆ«zÊ:ô4^ë²å}Ì‚1«*¿a%¶pû7ÛnÚ,ü2i°Ìà¤)Œ×ûB¦"’RsÀÉó©ÝÑ®º42X1ŠM4ú¿f©DrruƒÏÝá Ÿ†ÝqyW®šGÂv‰pA>@½P"Fz¡àÄ@(Öl¡Ê¥Ú BnwõñˆŒ¡YS·` e={b„s€É eþœ •Œ8ÎÃF}œ·ÁrdÓT ÉoòÓ‰Ò1l¡+CZŽLj_sœ|H°‹¿{lƒqª •a¢Ä|Jð‡fUÍXÇ—Ãc³áUG-•wûëí ÈÓ›Ž20¼=BöeµCþòöa!3yR-2øá’óDÁV n£É]C«ù`u†œiúñySÿ¥ã”Íþ—³MÓVK£;-×Uב‚{™>Æ/*¯ÀOm·.”í%:žÅHîEªµsiJm ¥ãÐ µ?0ޱ´k xSh«GÓnHu8ízªž·õ×é ýe/ë*H9Ø÷Ñý=Õü› —Ž!o#Ìᮥù Jƒ•Ñ Mê¤Xq¤oKTlfPÛ5¡°}Efƒ•qæÕ}ÝôaßprIÆÓû'©Ö4„~}uþîâ†Ý]ªDd&SCë9gì‰7`/ \=è¤ö û∕ˆuœ>kT‘ÁrB?cTÕ£rTÁo¾µªãû;¢‘ýGlJ 8`SJg/1)Т M*ÉØ¤’Ü™ œI¥Ê™ ­IÁs`R0­/O`pß®Évå‡É®pdžÐ{veäî¥îÿlW:‰E”Rcá°]…T‡íÊSvUÝ­0íZ•Ì„Œ€ß£Û{ª‘ývg2(& üBZ×Éän ”u:¸h®ÛW4V¬Ú† wÓ>~ÒÇ¢¹´Mqtmp7OÀöâÑŠD%PPÈì%ÏÚ„›’Žòg"DHuD“Žj/%´ÙRz|kO5²÷à˜ òlM:TY6Ð!¾:ÄW¯C+§9Äó'Ë©2³(¬ÌàÊ A¬Ìðé*3„]e†“±2³…]ÔÁÿ²H?{³S}µ†/£X­Ù‡=˜R\°ÙÉÂÍâø2§ú _¨ìBÈßÔb¾"†ƒ\> è‚%¹Á`q£õÕm ô¬ŽXë²{yE. ([jù-¡,yÎÜ)2•=Óî©;€§²·ÙrÓLëfÚ6Å´ëVûíŽXmÔq<ÕÃ`–B=•¤C8˜IWów[ÐØU`‹m·ÄN[ÑU_Pú †¯çü榵pU³79@Ù$„7ïÏ ñy[n*8{Jw¥A½ÞþL{H»õ<ŒÈãTó ²†þ¥koÕœñœõ¸#ñ²-gÜ©5Ükƒ'hj^ny1H7öµüŸ ¼JAù›]OtÄê˜hÄ観ÂÚžéÿ¤‚å1<Ñ>ƒÓ!(äC.Èî$”฿õ~™Û†1âz÷ÐĈ Õ„#Ln ñhhO„³f†€Õ;Z3³ž(9Î%)ñNÉÖò@Gä° 5ªù\$ÒßðëfLïR¤žÓ{œ¥"‰’ãzˆëÝÙ¾ÓüèJê…L?µŸö r(¢“üøöžhÿ¡CÝn¢!œsëF)ÃIÖÞ¿pôKÁíDûmÊS‚¼ÎÀþ’g/©È•/W!‘+¨½]"W¦ßú§›Ÿ¸«xÿŠÙ-ÁB ú„ ƒñyIÝwîqÅcuãÔÒvÕÂd×±ÁgÙlW¨îJߨbÌ#g쉕u¹):Ÿ%¯¯oÞ¾áRžZn}÷Zÿ±ÅPËZø¼4šÞSà¬êbS­žÎ$\”OšÛ)PbßSZVF!Ç-AXzpõc0·Û)Y@€…F³åq/$^H¼€p¥/¾[ƒ/$;½aZàegÁ²î*ž4RSà l僫UI 0Ù‹-Ax¬þ»[šË;ì°@À_úv¼p{ V¦Î}j¡£ –þþêæ§‹ÿ|}Þ1ÖD³»:#ÒÒµdU<”_í!üÐ<–_ ®¥zb¯¨ ²óìÝOGý§IXÄá(+ké/†O‹¥èå3ÁÍòê J+wCÖ.ÛÃN,GéäÈwRäÅß“ç'Þ–ÇñÂQèÅ$`¿ËÕ0JÛ”*% ¨ÄõûóXúåÿ‘vQî  úíë>Û¦üÙ6q:DÌ’ ÌÑ×NŒÿ(œò‡`œ¿®VÅf¸h·kh+ Ej&]‘:¯[ðokĬXaúLj>¦~æð[o³^ûVûªª9HM섉,ŒÛư )ÓÝF,á Gu£ÇMHÆ‘0‰I^¬3k9}pГõÖ^0`û’žï»* 7Dw1›Qã.DþØúÊŸ”q„¶|˜ºK†¨ãÂToãU¦)ed.¡à\aëÚ;›—t{ìyЪ •Ð *úè†è6° Æ–Ê»^Ž/µŒ~‚@K>—à{z˜R vbî£äåzG´îç-ÛûÎ?l.…w·W»³}ôÁå«Õj˜ü‚°Ã ÷J0ÏõG>PAaß0Óé3-‹êp å©÷ƒ¦¨¢l¤ß­¤-"•?ƧácàI.¢Xùàk›TLð‹“ÄZÎH… QÒÿa¬Üý6¦„Œ}û³c&Qìö–“1·O”È ü¯Ï‚Ì¡| … ¤͟Ír‘ít;9u§&¨Oà*Fõ DÁ€€s{ʵ”“R®ýÓçv;Ú)ŽóN )U‚v¥„T÷«ú´0¥u;^t;»s ˆùÈw,Î]A†PP¹äAõ…/´EÎÕtÀ<¨¾h’= Žó> ßµì:`¸*ûQñgÇœùÒP!6rî¶ÝN´ð屜­tÛ 䂈{ö‰4¸¼'Ò?±çJL¤0súuÌ À<ÓÜ}!þ†ü‰I_Diœ óè šI,Læ?¹Kj—´ýä!5~‡L^äöq’ªð«‡qbðé`àçÊ`sI½¬@<˜¼šûl ý€vÆ_Ž„ØÈoù§ÜØÿòS§BeÙVGœB™Á"Ì”ýݧÞÏR‘€€°þ?è²endstream endobj 1726 0 obj << /Type /Page /Contents 1727 0 R /Resources 1725 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1706 0 R >> endobj 1728 0 obj << /D [1726 0 R /XYZ 56.6929 794.5015 null] >> endobj 1725 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1731 0 obj << /Length 3449 /Filter /FlateDecode >> stream xÚ¥ZÝoãFÏ_á·:ÀZÕ|é}Jw³{é]Ó½lŠCÑöA‘Ʊ°²äZr²¹¿þÈ!G–d9)p(¶Qœ‡?Ò‹þ‹Ä¡Jõ"Nu`Baùö"\<·O‚yVži5äúñþâû*^¤AÉhq¿¬•a’ˆÅ}ñûòý?®>ß_ß]®¤ —Qp¹2Q¸üñæöQRz¼ÿåöãͧ_ï®.c½¼¿ùå–Èwׯï®oß__®DbÌ—¼Â™ oþuM£OwW?ÿ|uwùçýO×÷ýY†ç¡ÂƒüuñûŸá¢€cÿt*MÌâ^Â@¤©\l/´QÑJyJuñåâßý‚ƒ¯nêœþ´I#u´X)$¬1«å0 hm›4ˆ”T½–¥˜Ó²çB-uÛÚ|U5YñÕ¾´«²îìþ)«¦Çp5:Vb1ÜãD’žkF9E†*ÐF›±,ÿÙØúr¥³Ìèñߦ¶4*[zæMýGÊÇÃþR$K[õ¹ì6(ðäÀ„ a“€l¸|vèš—¦m38-üûç%¡ ´Ncž[v,(‰$À®iˮٿà xI)X9˜»AjŒtS·‡¶ËÒzù`ñ©–ùÆæ_Qv$îì¾lŠ2Ϫê…(]Cl­µD(×ôÌêúRÛg¢à•Ñh“=Y¿‹½Ëš§…ߨÙOV±ßʶ+ëÇãRß±åÉx¤prÛeEÖÁõÈ$=qó$Å-k"vðÙí/„&ÄCLLI-be‚XŠM„¾í4¸Ø”g_ ùgLjºêÀºál¶FqøŸ˜ ¤Q%ñH¢Ûî¹ÞD¡« ¡Ç’duq²­˜hÂøï*¢çK€“uªhm×kÏêB«0Hc%_×EÏõ†(§«¡(¸/Dc-Íò~cgW‚¥0 gCû8wñÆ(%aøšªBi¢/Ú캲Áh^ :iiÔm, ÖäÞl¿©YÓÃÈ6ëJ ""žÆÇâ¼}/ Bï>uèl‹iHhwpG.ì:;T½@˜s‚ë¡6T Y1%K…3‡[iQ vä¯xÍœ1—›æ°GÅ¿Ã׈NŠt«Ü¶ø"æ÷B±Žüuˆ™í“ ‚Ûe†Á¦tæÁ¶èî ï/ óû‡gö׸À€üþZÏi@ÂùCdúxòeøÃ’à[oÊÇÝØÌÁ…€À™ô.Æ*mËÊÖ‹Õ8 r['ˆÓrENCózîrÏÝ=ŠÒí_V]¾[íízoÛÍIÊQ €Ö«ô\3Œ"ÄWö5’àþ2 ÕÆÂ¼¥z°XôÑÙ; 8§ß¡uɉ÷ï?ÓS~ûõÀ÷¥mée•øO$äò#¦3¤"Ä9 òf»÷|(«²{¹B,ÑÙäÝÅ‚=©(_kï†x«Þ GW ²ˆÞ ^l;‡tjåÇy‹"QªÞ°ˆ×+á¹FA>?ìí àNYÓø$‡"RƯ‹ÒsÍÈ2†s€¯Ã‰,WUÕ¡ÿœèûe`#pØÇÚEÜ¢! HA^3I‡š8]Vˆ/ÔÃ]YJH F—Ÿ4€ðáöË?¯£1 ”7îY`ԥ䨟ø¨8­£÷Y‹S þ$I|à«›9‹ŒToqn››5 ‰Elæ :’¢O+Ç ßaÒ–Äqý’÷é=KÅq š%ßòz‘R-ïîœP8ÌÜSr*™„û´³ßh„ÀŸîliD&t´Ü—›O<Ç¥Ü~¹~O+O.>?—~òïFlÛæÉò GËÃ7º fi!\8 Ïg[UgWÐ"Lëð>é€çjAжDC±žO;…ÖD-;~¶ÄŸUmC”Úæ¶m³ý ¯ÍdRÔh?Ck¾Låò ª[úèo†ƒóžH9:9y ÞÎh ˜Æ]eyµâ(ÏàP4$׈*ΘÉ9<³~V³çŒ±kꂼ-¢ËTÃ5†.éÔyûMG$‹†Êf®esW‰ ¡Ûd—ˆÓûä6=Þ+YRÈñ|©d.0zàë¶ÖG\æ`¶¨Ù è±>t}8:B„Êf­ <âžÈmƒW¦Bã% #r®jáЛ \Ù…$*»4SÃ÷3e± %”Å©š-‹ÃcY<[‡A†}Eí“ÚÒ–»}ù”ù³PuŠdV*/ qêÐÍZe9ZtùPá|r6Œ‘@Å7 & »Oòš=g4‹5#¶Q¾K¤ô`žÊo$õù¯ô1sB¹_®¶ß:Þ ©ýN¼rž-æêÀÇz¤äÒvÙ¾c09Ywe’@¥!­ƒØHZ;[€ýåå .'D\ôœí ®ß'[†¨y@aDèÍßÚÚMrnEŽ—·ÎrBPŽ#ÏØÒx ¸¸¿û†YèRøö#²[³¬háG¦ÂÙÕsY°‰äYî…hꑽ¯±Çáf@Ag÷®šép³ †5Ñò9׆¸ŽXQ‡Ëª¬¿¶4tR«BŒµ‹J@Å»¢ïŠÕZœ.]€*©†qôÀ0æ‰e1Xݱ‚áÈâ¤ÚwáIäú0*xzÝ0Áuwf"qÁá*G>³ј`•‡'@¸ÁÚ¸¶j¢ûá#†çÒô~J¼¬šæ+;âqj*æ*ª‰wbê9#D]iÉ80&àjr€h<£©§Á¢M=w]ݦi9tö:sqÕ5°0"oÊ|CCJUÆ_WÞÝÓiÏæ¬¹/;ðó'Ÿ²kÞEc§ìÜJ.Àô¹_žÃ½k âÀÙðY¬ïú2Ö¯cý!×y¬ßs¡žÈiOºJòЉEúúÆ=×ÌΣ€eµ1J·¾§¬p¢o£¤bÙÓ育µY 6°>TôÅ¥´Ôƒ@r U%öK‡ ’Ánw]ok±2Ë+¢sñî6_ÏuP"<­ï ¬Ë=ì0ÓAHm÷\ë ­“ Œµœ8 •Ûf8äƒVñqЛfD%2>Ѱ_&|S] cÚÞµñ*1‘õFT.Ó"3¡=×ßužÍv¸ìÝ⥽›w>äJÌQêD{”KaD!¿’_&æ8·ß¾‚—ØjÝ>¡Ÿ^ŽØìõî¬g¶½ëH³%J¹³y‰J¢Ê Uo€lG ˆ×û—£ìÔôÑ2Ð1¤å‘ZÆwsÖ×e" CG¯»ú€é¼§{¦££QL}[Í âkûzžÓ}G~®Àøøùpã/½vQÝÞo%xÙÍg"dEÁ ½íybqhÞ (àˆ %¸¶¡¸!Š£)8 a Pó¾kªV¾‡‡>=¹ÍÁæÔŠæ›Ò0ŠÆÀ|šÌ¤4pÀµ˜4\IÎáp¤6žŸ;KÄ´@Ö–q¤bÐÐïFZ“Þ½`ðX5YÕ=‘br˳š97wòb.²/‹Ây50'VeôxÊ ý:u÷fMDH÷‹ÿ†es :©©¬Ê l™ºw:pK\ •ÃMôµt0nMÚ¡ú+Ò×s6¢ß²"}q)vºäL$,úÀ⓪›ŽÁâ{‚gšÞ2€Ô÷O,ƒ Šw<?Aƒ³0®ð¥ªÞy sÒ«SQ‚?ƒ›ƒ‰ ‘ÆoýNäùWà 3¿¬ëœÀ¤Kéô³» éL#’NgñH Ó߈<×bœ®Ö÷N§‚à ¡f+ ÅЇCV­ ŒÊ¿Ò¾0Æ~³NtCœˆ9¢¥÷¬o2ª¾þ ’µvâ5ÔÞb•90£üïÅm³ïè  fùÜì¿×o®¨†wìa *â-ïâÊQå+j@žÙƒ/Ó`±âÀâéYU½Vœ7£½v;'ÓbÛ²Ûx¼{óùIí(‘÷ PìÎkmA¶²>‹E¨‚45éëÉrÈu>[ö\’õ׸jW?J›Q 9>5¯ËÐsÍ1J1 †òÅHŠQîTÚ°f°ðòÕ]A…]½qE.gAÚx=ò×ÒqßûROs Ž%]C_ _š[Ú™|t·æ2]$#ô¤Iëºïh ®±–FÔDŽWC Œòsy'ÍŠn€HYxP'=òÂïôÇHuu2P2jïÄ I§½gTOþÆyý~©û­Üá‘޸ˆÓsvÞѤ&*<7N‡1udß{†«™ù[z¢)áH-=1È {,ýþÓK©J|j˜·Èi614·ƒ¸M°ø¡§åT–óYu…÷Oí4"IÍ$ ²…8mF=Ê¡~\ÅÛú§­}êlñ¦Š3~ž7Ûm_CW¥ï„#³Áã\ð–IDqèÿ †ºbnÒJϨC‹ NÔà'eœû‹,eü3ªÞ(þï¿Ö:þ)•$òLN £ ‘ÃX(—ŸÌTrãþAÆ3¢ÿ¿ãðendstream endobj 1730 0 obj << /Type /Page /Contents 1731 0 R /Resources 1729 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1706 0 R /Annots [ 1733 0 R 1734 0 R 1736 0 R ] >> endobj 1733 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [254.5198 731.9163 332.9349 743.9759] /Subtype /Link /A << /S /GoTo /D (man.dnssec-keygen) >> >> endobj 1734 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [353.5545 731.9163 431.9695 743.9759] /Subtype /Link /A << /S /GoTo /D (man.dnssec-settime) >> >> endobj 1736 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.5469 220.4734 428.747 232.3736] /Subtype /Link /A << /S /GoTo /D (zone_statement_grammar) >> >> endobj 1732 0 obj << /D [1730 0 R /XYZ 85.0394 794.5015 null] >> endobj 478 0 obj << /D [1730 0 R /XYZ 85.0394 471.141 null] >> endobj 1735 0 obj << /D [1730 0 R /XYZ 85.0394 438.6197 null] >> endobj 482 0 obj << /D [1730 0 R /XYZ 85.0394 198.1284 null] >> endobj 1737 0 obj << /D [1730 0 R /XYZ 85.0394 170.5486 null] >> endobj 1729 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1741 0 obj << /Length 2746 /Filter /FlateDecode >> stream xÚÍZßsÛ6~÷_¡·£g"¿ALŸÜÄɹÓ:=Ç÷Ôö–h›‰tD:>ß_ ,‘Eû.éÌ53%,‹ÅâÛo!³…l¡4Ñ–Û…±’(ÊÔbµ=¡‹;ûp‚Ì2 -ûR?]Ÿüð^˜…%Vs½¸¾íéÊ Ís¶¸^ÿžiÂÉ)h ÙÛ—ï/>üóêìÔÈìúâãåé’+š½¿øå[®Î~ýõìêtÉrŲ·?ûíúü ‡tÐñÓÅå;ì±ø8¢ôêüýùÕùåÛóÓ?¯>9¿Nk鯗Qáòåä÷?éb Ëþù„asµx‚J˜µ|±=‘J%…ˆ=›“O'ÿH {£þÓIÿ1J¸Ð|œM9PY¢ÉL n¡”fg«UÙ¶añMÝíš[#hâ=Mt$WV{é#ɳ®qO–u÷%v´åîk¹Ãöª¨qô& îNYž•m·«V]¹Æ¾›¢Å&Ëš:(Ê.~Ãb½Ÿ†i›Û$ š¿<‚òª¾ ¦<·]¹…½ÔdŸÊr¼{ôÀI‹¥ÐDq.Ýê‰UŠûÅ8[Džãyr TéZÛNÑ÷w´-€ÌÖXðåÔvŒ|¨јPAx[<£öbÓ†©oÂ|mòë;Ü2¢m‡60Á •2*övÎð%•4A¨í †²îÀg;èš+@¥à/€Kc™‰ÃDTu gˆ`“vÕڹܽv§,›4Ópb´V6n?Â7/8œÌ´>0`M•];ª ¬©7ÏØÚ–E Pxû¸qï ¾Ÿ>°éœõÝb˜ƒËg†ëá¦/½Mz Ã#±G–ÛâqÓáKÕåÁŸ†fŸtRðC{ ½F¯¥Mè¿Å¶~ðálþ[Åugå8 qI,‡eÌ£POj…¢Ô>ì!ñì&@BSH;?y’š˜}B†P¦Åpú! íc˜ç6¡;f … BîT5¡³ýŒ]Wu±{Æ¡w—ŸpÓ+îp«×9ÀAòË89å„3ÍúhÀ#à©Ë[(cðó<¶y€®ÃC<§1"ç KÚ B@åÁsšôGïBÓ#Nî‚݈>·…å”.Å Üó>ÿ2øï‚á*C‡¹ãŽY/£ÿ×›†Mg_Oéèln6‘ILQ‚œe•¶@—Ò¿‚/»@úŸOóe`¦†-õ ÷Æï(è MüBŽT-£uKi ‘b¡w“S!š áâ\)àÄÆäÞÑ—½ SZ2¿Õ”(™7ì#,Ë®áÿ<;($rí2©¸(’ÂO½ø²`Ú¬(Ôkûµî}à;~¸ØòÅ»V´è/*(^ö5ûEéATr5D¥ªcd¾Ç¶S¦2ŒIW2dÏËU±:…F nMûͺê%B€!“Cðy%øòˆlßä1ydÂKk‹žF¨qIyMÐuY"  *_ô÷îÛÂAÀ>k EÝr_‹}[°.¹%y„ Jˆ %ç“‘Π8ˆÏ&£$5Ý%ò½A>â.Àº¾æÃ|¥& ä#GBS6´`˜Ä>AsÓ¬ ‡Âôkˆ(ˆÅ¢Àxè°=JFЃÉTô’x:»Fê,cý•VAÏCÓ.'웦zDgª›#Õ@y’t¼0¶^Å~O‘¥Hèš Ý‹+¢Ü³ª ,wu±YÞ+_†þrQþæ±Ãƺj{:!Ø·C…å¿:Ôæ@‡<4΀Œ©l¨?UÝ}ó°¼.Ý™*vU$TŸëæ)}•ðßX›øQ÷Ôì>GŠ5Ø0’,ɉR›Î×â 4ÝDæ“ÂetsÈB¨ŽâË1fAYK@w`…RC©S®>ãÍ u-4öÉ D¼!¾{Ïàå¡Üm«.\@èìæyŠÍ0E¨aêulF!#êùp̳3Tž>A@¡R2ôö± ÛtSöR­7Îu†-»iº{l½ý%îr,æ«.îzÌ¿Q.ûÖîgK[h^½'2í ²6&C çZ~Z6æg,ð3&Žq" 5Ê Mq¢lŠ¡Åb—íK †Ï>CcGš Y±q­†{h%re†{øªX6Z¡nqtpœþræ/}g;<âSÜMCX(R¾w“ß‘»q •¾±/q7Á”[e¿'wƒ5>³ßŸ»õ5Ïp7@‰ïÉÝþbºÖß®ÿwº&æé—2/]`F¡1j «Æ| „¹Ü4ÉÖ‚Ìáô®&¡6àœþüª&DºÀtÍpuàš)uú—˜›„@„qweFëö©Ü…ïö•¡{ËEhø•ºß_”pw¿Àå ›j9Áâ&3ºHgœH*ó^X …×[¾Ñ–¡ÖÖhã~aÉÆìÊÕã®­¦‘^BÌX;šO‘kU·i^Ï+ÁC0óî©j'SÀPF½öN%WT¼fj×Ùc½q‡÷pZ ”P*G—Äûuƒ€þ8uÏ+áH h›“Å9¡á¯ZÅXƒ®xÕ:¾\¦€ÐAM Œ`j28¡qµ?™[²s®¶=çúŒB˜>eL×ûUtòfÚ¹ˆÚ}õ¬¸ý¾²ßÝ9™2 Œç<]÷ ?ªLr>$ó‰¦MÝ`2-¦šG¡¾ÔqJR“84U:Åe–çóV$© 3p¤p $ÚÃÒ‘šDå ¸‹¥#=,aKG»«Ü•¶ëJPäº{—TT‡üÝЏÕH·`é èÒ4`gFŽ*Çÿšƒ!NÍбúù€Ž½™*P üðÏÇÑ9Œ’“ܤ³TÔë©`·h±îb{J%V¦«Ûãá öik_¸ãèKÍ„k”:‚ÁÃKÈéFªy’Ô„ÃKw«ªF& 3§Þÿp͘9uïÒÝ¿¤Ì©‘*¹§»©ÀŠú5} ]ûÛ÷Å=ÆðãÝ}ì¨ÂÐþ—B÷ŽVÓiÕù\*-¦*—ÍÓ/gH Y8&&$×s,:œc¹üX¾Ë•e£ù" Å,æz0rcæ( &è«”€ú|vêôÛDN)‚w0Èå}Ò9^¦K: ŠOÈIÇÿÔ>—t¼Yš’NfÓ‹q•‘fóǵ'4ó÷&Ah"¾¦2‹„Ær9k@:´`Hs ±Öš ÃÃÊSZ<¥×;J+nÔ§?n$]çø rª#µ’â/¨> endobj 1744 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [455.0966 729.9671 511.2325 742.0267] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj 1742 0 obj << /D [1740 0 R /XYZ 56.6929 794.5015 null] >> endobj 486 0 obj << /D [1740 0 R /XYZ 56.6929 769.5949 null] >> endobj 1743 0 obj << /D [1740 0 R /XYZ 56.6929 752.1513 null] >> endobj 1739 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F61 1369 0 R /F60 1366 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1748 0 obj << /Length 3401 /Filter /FlateDecode >> stream xÚ­Ërã6òî¯ÐžV®2ăP9M&vâ­ÍdâñÖ’(‰±"‘‘²£ÝÚߺ>DÉ“JìƒÀf£Ñhôd³þÙL§q"Œœ)#ã4aél¹»IfŸàÝw7Œp"õ±¾yºùê^¨™‰MƳÙÓºGKljÖlö´úyþîû·žîo#ž&ó,¾Ò,™óðþ[„üy÷ãûû‡ïþõøöVÉùÓÃïüxw÷x÷þÝÝmÄtÊ`>' &Ü?üóGß=¾ýᇷ·¿>ýãæî)쥿_–»‘Ï7?ÿšÌV°íÜ$±0:½ÀC3cølw#S§RÙÞ|¼ù)ì½uS§ä'S§\f³(å±ášOK9‰“¤)ÉâT ¤ÌÙ””=–•r¾ÝÖ/Ñq¿ÊÛb¼e&ÓX¤ÜÌútÏVXËóÞò,… ɇëÜËò—$áEâOôüeS.7v¨æ›ºi šn™žô`y.VˆÔÖlŽ‹]ÙâøÛS•ïÊ%"|ûþ#Bq“ B×õ¡»¼i ÿ§®Šô„›lþ´qò€3¶5H>b,6iÊÛ«b·v¹ÌÌKKS%È <¯Šê„nI¯Ý꾂M Øí0~_·BÛMÞÄú¥¬>!¼£¯yãÄðº"6DöùX4­Ý*(ûßiÖ÷±d¸£|µÂ)MƒvPúߪ)–G|÷5‚šâLW8“q¢d:SLÅYêJ€/Ÿf8xìiMÀúε朮ӚbÙ–nËÀŠÅ7Yk®Õ€›3Í X¯ñ‰X0k9}Pƒ`ýUÑæåŽpì1È,3 ³$,sÕvûX—m7`m7v^òÃÊ*ÊX ø™é댬 NÂHÒ˜ñþ¶ÎÍ8ÁŒaè͆ۇ`Æð€¶#:3†qgÆöÁ™1 z6Õ›¶ÍŸÉ^ ð§9óÚÁÄY¶=.š’òù¢Àgœåkå˜Wˆ"Ș`@NŒÈ*SÎ;¸7#€0`á«{©ûãYœ0 ~ÞqòßÛ(K’y }Ãÿᤔ!6@0ä4ç ’÷2µ yÕ³è)XÛäÍÝ[«¥°µeÕ‰5ãéÐôýöÑÉH5)s’…}qJ»be÷Ÿ˜ùÓ­áóqŠ*_l /,-U_°@ù "7VQÖ§)9³”{9]Qn؇ÇìƒD›W'/Ù¯/ŠÖ/c³È>"[NB$óç|{´ cÇ5¨Á‡ ëj‚u& 8)®þØ+›ëx>à˜&èrp7rD¶·½)ª –d4¥¤-›#Èó„ËúX6ï1­ŽKRÁ@2Â&}ËiËçâ=t0²²ZÚ³5Þ2@(fìëª)å¶lOˆ€Þ‚F0_.1¼Àx î›Í[db‹°fS·+᩼”íf´rÜvbqxFû$V«ºíÐ'¢óè²Ý+È;St남*–ðŽºzí8°`¿5;*;Áм=zg6bÙß ¡ÓrÚ€ïò-ûû¾n ÄÝvÈÍÔ¾pµ-*² N>Hö£8B p¿gßgö?°ÔªMÕ;­”Ò‹Ô¶ùò·ærn Œk…75*Ö)F–+¹AÀúÎCÑ9Ý/É $䫆±ö‰ŸgÞë¤Ô±L ™ðrƒ]Ýùk™Bš x5Sèc]ÎVçLŸ³¨9U ¾ ªA®¯’˜Kó k‚‰A®¯Ò˜‹$rñ´ÁL9×{:"¿ä˜Š¶Á%9„—(H ÙàÙÕµóx€(XzRÙ ÃNçoáðj‚dø›W«Ñç3`ZËQpü…sY• Œp0e›/Šmc¡øŒ´Õ|QVùáÔDZ¡R›ù÷ätΉëÎæ‚ö’o™çmŠ Ž_Š RvùMQ!þª@^,Á)­ÞLy‡vã“úp0ư†¼mj¯¨}Z.ç‡Ñ ƒª~!À§ŠÔœÜykë ê]áW9TÁ+íÀ«äŸŠ+–±È¼Rív8W¬q:p*³.çµ®‰9××ö(g «\óĈþʃäXòÔ'rvHɱäY—[xHŽíƒÕ1ûKgR”Ï„eÓZB¡}­ÎÜË auq2¦Ü¡/4‘¦qf›4ý Œrpµ²ýQnÐæØ7+›e"åBÆ«Œ\f ¿MÎ e…¿¹G<2. L>3v8_ŒbŒš´xWT­ËAYXÁçÓ0\æËZA™[„Ô ¨C¹rUÃen”޹@”Ä9«jüV{⃠’Aõ82Ç«â3PöŽ7à-qí-L²'Ä7œ7!æ„¥3ݺ-êh„jS\°W™ï°±ëÛǺl³Ën}±…ÜbSoÏ›SÜjä++{¤‰•F+$D)>Zz`¶‚s—¶Á϶´Y©ÕkzÑ¥P—’G7*pr<Ω²#w†ŽäZ{>‡Ò“êlÙ­IŽ.3äXÏZqPoŸ Ï.ÖJ°7“É¡åÚN·Œ±9©ÔO~E{Ö½8ŠªÔg¹¢Ç¥Z±¯ Âîjƒ• mMë=]ÒÏó*H€1H•ø2¨ºlò¶/ë˺KŠjS}ž½ZúXWÕc¹<eÛblŽrø›RØL3}…€5ÁÃXe³L°!Ã6Œ=0üA•u}ñ$½É£[œpv‹5gÞ)m8ª«èYN²©´4½šÔq°ßoK×nýƒúÀ§\i¦ªÓÄš ¨ùEu¤Ç^цÒeeðH® C3DÑ8S‹ÚrWÔÇöL)Lb›Cê*#霓Á–畱+N®¶c“ïlÙcç·à×2E#Öó"„«J\¨¶É©£ÖB@‚hçJ];¿Æc:!‹Ø' hSú>\š°aHD¿äØ‹bÝO œ”N°žë”ûœJ†xLža°+«rw¤V{Ð"6hËñ8“ÂkK¦”lL„.\ Þúµwùï´ Þœ¯bÀ+¥Æ{%1¹m?ô£D¦¡ˆmÛÐó/é& ½eózbZJ ¯ëSkhð¡)ä¯6`íL$£¬ŽÎ°3ÂêZJ±(BV!i5•WÚd’,ýµW^ †W{%Dz8½X’@Nc{Rë|Y4üCÃmÛ9ÓRsc3¹0Éõ„ðˆàž>¸ž3 ©?j¸o±‰í˜â—›Ü¼xhÀö¡]ßé„à5¢†,¼86(·øTÚ(¡6`VÜx Ö;¸Ï‰Gw`'˜iN&ñ 2R™~i)b-„Çlóß\Â!m Š¿¸Hn­_¦N¤þý* žk#X&¼¶Ù@c{HãžLc% Îq0©°œzíB•ÇFk=}ŠQŸ¤s“þ„Ô±âN4¬PZ z&T|I&þB&=ÅטÔ`N}À¤ ã—RÙëhröºÖbæ}9ŒP1èœ+<áÜûÁY ö:Ò¹±ùâÁ'v‹ÓÈIœµQÂ!•2”¨ ’ » kœ9ãdÔç Á'Ú¼?€+÷ÛIëLb™/± kŠÜP¥yùô[$,Úõ½ï¿ç;àâÍ„Eœ%$ ¶;nÜ ] @Ù«Xn=ƽŸÑL”AE-ÔþÆÀ3ƒÖ9xúŠe×nT`%á2ÖÅX²»R¾oÀ*ß(¸a€b Oø3ˆ;Såo(¸Î5¼ª˜‚r°ê¡|20I÷la.H^] ‰“奋„]¾Ü”U1Œ”UAz ²óf‘_Òk’ö”’vuþ„šBþ¢üÃZê׿Ò2ç2°(ï1ú· çèß„¾ÁÇgé¥ãýGú­JÙGz[~šî³ðGòl³Ñs6u–Å”Gƒž õv¨5sÄ I5ïB­OÜø^Pßã ¯Q >Ï´séÊ'ÈÓœ«ëÓ B&ܯö„ Ð5ÞÎ"¨—2¥ôØû.ë]Hµ>÷Ëõ¦¨ZïíÈ=›Ò©Û†ñ¹·"}ÑUãpJIÖ ³!ûµ½©Ð`]¥â, µá…dÁ~s@œÕ<: {zQày æãD –½˜'p¡ã45!ƒžà+Ú/©¤/% P„«Ì—;ôù“º ‚;‡Úˆ}±½A¬öf] ËHû­Vxí…XÕþ#,ôZX“©¼Âø)ûü@_¥ÙouL,9]Î4õò7çk…&SÏcSW;ÀQ0d|:yA:*5‹B“ ˜$bkZpCäê}Œ¢åÁcsqíp¼É‰NQÕÇOÄ×Û„yÜ;:ˆ+¬w@Åh:™ÿår°®%Þç[ Ç¢2Q»‹Zû­FƒP'€>ÞƒˆßáXH#ú1Ò½~‡‘J+1›©Øv›É]ˆÐ$@Bhp*FÈP÷YG·ZÒµø¥*EËéO “Pÿé-»/Q¥ÂÏù¦o”“,ÖÜ(Ï”«SÕ˜óÔZ§æj‚õÿÊ<¶0endstream endobj 1747 0 obj << /Type /Page /Contents 1748 0 R /Resources 1746 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1745 0 R /Annots [ 1750 0 R 1751 0 R ] >> endobj 1750 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [213.0783 715.1325 261.825 725.9169] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj 1751 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.1622 594.0531 446.9089 606.1127] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj 1749 0 obj << /D [1747 0 R /XYZ 85.0394 794.5015 null] >> endobj 490 0 obj << /D [1747 0 R /XYZ 85.0394 345.8108 null] >> endobj 1752 0 obj << /D [1747 0 R /XYZ 85.0394 323.3141 null] >> endobj 1746 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1756 0 obj << /Length 3218 /Filter /FlateDecode >> stream xÚµZYsÇ~ç¯@ž ¦„õα—ôDK”B—EË ]•”í‡0 ¶ìÂØ &•ÿžîéž½0¤h§R|ØaÏÕÓÓýõ1“þÄ$Šƒ8“Ù$Ét…"š,¶áäú>\3sƒfýQßÝ_|û^%“,ÈbOîW½µÒ LS1¹_þ2\ áôí·ïo>ü|wu™èéýÍ·—3…Ó÷7?\SëÃÝÕÇWw—3‘FbúöoWŸî¯ï¨+æ5¾»¹}G”Œ>O,zwýþúîúöíõåo÷ß_\ß·géŸW„ òûÅ/¿…“%ûû‹0PYMNðOˆ,““í…ŽTi¥esñ÷‹ŸÚ{½vªW~" ¤Š¥G€RúeA¬¤²Ì—Ëý¥H§¦®A*˦7+8d’M›µFNëǺ1["Våæ‘¨ë¼&RQ.ªínc~õé†:êÃnWí¢®ª=Qo>ãWHK¦ëêdŽf²eJ»çܬó㥘vŠš¾4WÏ·<kYÌ„²(’ö`Í:oè¶hkhÀÖ:hǦA&™{'rº)ê[bZ­ˆ²Ë÷M±8lò=ýÌÓˆžÜLM‹¼¤F¾©+57D©wfQü†Ò,á¤J& 5ê9­‹ÅÚͯ M³‡´óÌÔrgÊšt[¹qÀi7àD]->›±(LŽ»b«Çz'{Eú÷!·ßå:ˆŽRÂïim€c^™.KS4“&ňø.qkR×?­@Š7º±ÔêãaÓ tØj.zj®ÃZÌÀ$µYUÎàæhðÈ&Ñ®vMQ•̽N˳s¨ÍmDª´rü’£î¿¢¥uŸY–J«t¨j~fqNÿMŸ¼||C­ÿ¼ñ]ãùD2.l ©ô`±¿È0¯—óôõëo•|ãßa$ ØOèbÂ…S±ÙÀYÃhjÊ|¾A} 5+&Kk}HjU¨V+Fœ!%RD±Š‡`‚lJÐ76%èü5ŒÂSѬyë¢|pŒ{Ë+$÷Z5‡‰- èy¹l¹òÈ“xYÄÒ™¶ â [#Þp vL)+G(ékÅ„=;šŒæõ…ºC¤î°8¥5eÛG§â}¬‘JÖ‹­mÞ,Ö`@ƒŠ3dG±ø€ïþ2“ÓŠTy›6cä»Å¶=$6Høko•!6~ FÀ~ʪ4/W_ëÄ´€Y„ö‹^ޱ”é!hm c:»Ô’CZB›, '(ÔŠR³(F¢Ô­(õÀ×Pס´ |~2%t† 3;ó‚…8‹4¡3ˆ@=™éVO34@úÒ'Ð$ÈÄ.´&bÃÒ³³ÒŒ¢¤·39ÂcõÙ+Ä9xoçËÇ:PIöì¡Dñ[6ZzàÚ”Lñ^|ì'8$}û1b|„]Ü%âÆ €@q=9MKþY 4f¿Êü ü ½©S"S94ë¥YåàüÏ9Ðð(aÖÆÆ´"«ùé`öl¥W P¬HÆ^·F¤¨( —•©Ëoêø\V§Ñؼ¬O4ˆÍÉéßߦF3B N5y) @VqJE‘RÙç´|Ô>(•lÛ®4««Ã~a<ǵÇ!S«8x%qÌ§Š£¡)byhð•ÃŒˆF^õÁyЉ cí8J(ŽÀLæÑ¦ä¥*7Ð8lVä]ˆS8NÜä.<×þ)û²ñcFœ$Cì è ¼†ª5¨Žâáù“J¦’@§¢Aç+eA¢£ˆGüÕÇZêÈq†4+Üõgëê@‰ÕÔÆhðµƒwßMCMâÂÎa Ãn>QÏu€»øÀ/Œ!skõæöêÝ»»qbç… ¯ÁBÌôKRCdišúÃY»â¬¿$e}ƒ;I·â»mÆsûOPÁ1Æ™Ž;© vd˜2JG΀ÚY„ì ×½ÚY¨N;°æãáH æ¬Ï¨ 8´0kCx¿®¨,N‹Q+²”´ÒÝN+lZG{0ëjKv†R ÿ”‡íÜð +«nÏäˆo¶¨J‡C—Á X÷Á ÷ßá-‰vØñZ%XÄ@š¾Š\-x¡ÁMâXžèx‰Kð€D`*àp`º:RÓû5³ÀÙ9Œ¶|¡~×l>-ƒ‰K¤2LqHé†oT —ÆÎ0€ÉÙQÏËÝ 7öCR¦žU¯ÜuaîîxK¬€¸Ø–¨P'ù ˜c\q–ªðh#pã©ã$?VÅòkrÌ ÆÓ­ý„q– —mÅF•º CgåF&¤&Òƒú»)Žf㔑vâyô¤«!Ø`gToðË p.‰„x™ãWÂôY‰,PQ¢=ë=é,£;•r/浯HȨXFC ¸§ä½ó¦!a+™)˜nRéø&N½{Y'2 Ò4É<³¢ K’¸?‰J3‘¨ ÓØpΞVÆräÿ—»q('2pˆ©LÆy ÏñD"–@G{Ä£,2¢ÍQz^¾&U7!t,ɤââ>¤>™ª(ÈÝâtªàò‹µY|Æf<-VDâŠ+„š;a£E.ìo‹¾ÐE>­blQ:ÖŠc±´ø¦"ˆ*Wû¨öùvK€¨"›ë€?µéQln_²‘f_@·9ºÎ57,;гý†7adเ®8þ# ††Ù­ÍceȺˆboÃû5e7À'ÇæÈxé«£´éÖ5]d-ù1/6Xó]SšÄÑׯ)‘©^l…»»õtQíˆV%¹ìï*óºvXwó†jê6ƒ:µyÅ•tãÙ¯ U…óƒ5ªPÒ¢êTaùõ×ë9gæÕ¯ép8dK˜àm©G‘Šž-…ž™×ŸXóÙêÑmÕZCÐsUL… èI›u…©«„¦g‡öœiõa…CÑŒ$s›G¢oÈ<ðŠ\…ñfqØM¥¥Ú¾I@VÑÑ`\ ÿ2®ogÊ%ïMµ×tzÌ÷Eu`â.Ÿù&i@©­Öb:? J@ôrB=PÈ` `°±O=@¦s/ªíÖØÀF<ÂÜ&·a ücãDèܘ¼æ~«TS“¯ `8%˜g:TߨzyÓp¼]Ó×” ˆbò‡[WßQîæs÷ –•‰üC1D'ñ×CòqþòòEÍó¢ ´cÔ|Ò=j¥#ÂE§$8% à“I2´'žÙ§€Ïè`9xûÑ^WøŽÄ‹’°ËºìÃd—K÷ Ÿ®¸0|(¬ºWG«b‹ÜÝÞ'^†ô6ä˜úSÈŒmˆÐ]|Ne~$žÚr›GÒ8à&¾¦¶CX’‘Õ´º5}lp¸´.æEC’BH'ÄðоuµeŠ h  b"û’¯A"#d8Š×~¾½ùš¸dŒ¬é  E_³7ÕÉò¦pö6Ë|Æde'ƒ³—ÁØýšuup;чá¶ßí‹#àœÕ1@T´Q$SÌ‚ýìV É/Ó6“¶·ÐÂÀzAoBx` ø(Ì4PEb¨ì¼ ’Q§ÇJjü¤ö„çìîE£¬^['G%ŒVH~ÍÒ• 𙯡.ûS ¸š·ä( Zuë{BÀÑ´¼{Ü5Þ_C¸ç\: l}Eõ^ŸÒír!ÿ,£êª627“!±&Š‹_–f“÷‚IH‹ËñÀ¶d³ ¢Š-5/y´Å_øŽñ·p%,9Ü}ÅAŽCǧrö–_ç+ãÀ¨–¢á@ª½7Æ›>^ØîòH?q¨JèMÆ÷s øÏwÂ6'þŸ*ÔýŽ k*i*ý¿’Ièa¦ìKQzƹûMÑ9ëÿ>Þλendstream endobj 1755 0 obj << /Type /Page /Contents 1756 0 R /Resources 1754 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1745 0 R >> endobj 1757 0 obj << /D [1755 0 R /XYZ 56.6929 794.5015 null] >> endobj 494 0 obj << /D [1755 0 R /XYZ 56.6929 503.9183 null] >> endobj 1758 0 obj << /D [1755 0 R /XYZ 56.6929 475.3477 null] >> endobj 1754 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1761 0 obj << /Length 2403 /Filter /FlateDecode >> stream xÚÍ]sã¶ñÝ¿Bo¥gN¾I6O—;ûêLã»ú”‡6Í-Aç(R'’v}þ÷îbAš”)%©ýÐñŒ±‹Åb¿%fþÄ,1Œ«TÏâT3Ã…™-·g|vkÎDÀ™wHó!Ö‹³ï.U8i*gÛ3m3Z©n¦8û|ö·žà`Õo’ŸQ 3‰Œ'(å”Mʬ’Ê p±qt£•[gmÑÔôU­il`î”Ä’f±È’Èî«|5¿×óvµ›ïª=Р-£ÃT²ÛQ®&¨Š”)ë1Uûû©V»&¯Êpl.’Èý™6éá9s™(–ÆÒÌæp¤¶R»ÆÜrýû?ß#8d.K‘Çø¢0 ›•`ZÄ´ùºj€µ¹L{eåi”2x ò²ñüW«véV47ýB+&¬1Amíæ_[·DŽ€­ª˜`&å`@q:[8£"Vêv‡h2£9OÌOx倱n—ZÛËV[šõ²xƒpݶ—Ý\*ŤQz,Ãf“ãsqûÄ7Q7WVañ¶® ×8Z¾uË ®IKôÊm—w4ÑlZmNxópDÀ²Ý¥Úf´VV ÍÜœº]ã)ÿä\.sW6E@¬Ý²¥ó>¥.«ýXSD¸%Ò¢c Ú–ÕU‰‚Ò2ÊZðw‡ñΕnŸþ(ÜÔ¡¼£0×¼^Ví>»óê(þéuç–ù:ìËhØeû&_¶…ßÞVÖÕ>lŸÔ.•H†Ešâk^ñK7¡VV0+¬íÔj?Ao®58F›Ø± ƒIMÐŽ ¸A;6ôïÉÒ½èpÜîŠ|™Óó/¡ì¶põ“#ó©ÎÀÅ‘îæß¼ M/€Êv{ëö5{æåÁ~  +Ád¼òdT Hó!9e1á”{¬ãVÖ„|ÚÝ*kD·¿Ïž)’”˜2ušk‚Ÿ¡ $èNÀŒú_Õ]bG‚>ã÷dSB²45z:›Ç ¡ßj•§Eû8Ð `·cLê)kÕ†3O<”HïÜ|°>·äu%”u]\œ± ’qf”ìÒŸMˆhÿetq( ©°¦c Ï¢}ž9û:Œë´Ù# `×'ø‰ï®¶rö¾‚Í—êχ”ý¥,ÚƒŒ50‚_æV>¥’Zê([­ö®®ñCQ<ÂØ‰þW1ãØG;Êg”†(’¦ƒÙ9(<œKu±gÄ‘™TZ¤4þ¸ÀøÔÀÀú\q Oþã¶j6ýüþa†ì´ž –@ö=V‹w€'Ýñ 0”'6 “-†¤K4yç„8DóÙ‚•M°V•>f!zE3žœ8<2 eÕˆrñ€ˆ^ò1€1o"1Áì N0áQ—ÀÁw[îÍû¼p”`Àtƒg†ªÓTÛªÙÐ^f]hÇ&µélþTø¼Øö¥e *ÉkÐû°±´à¦ÝŽc~DiËßi?¢yÊb+ôkúe ³2Ö¯ïG†”OøÇðÜŠ ìsåUA•€JxºÀhœpÌhO3«Ê|ŸÂ#@uLgx~Æ5/Tœ’uúYÊié„Î{áGï+ð­n¢¬«%šüüçš`¦ÇLdøÊ/SœÿzõÜ4ì8f"àZ¸êô7LDq~Û¾¦…H(nb)Ò×·!å"mZ` Yˆs䓳¢®&‚¨pAÕ•K T8õ¼óôt$…J tÔvjìa§&‰ Ô›¿žAU¸êšÇ­cøÀ/ә׷ޱriõéœ\r¸”m6l- ËbÌe8þQ•¡ ]œ !"ÿBPjNwŽ@ökµ‹”µÑ&« غå&+óz¾1ÁÂqWdÞ§ˆy…²q´Î–ù¹ŸÙd£©ožÔsá?ÉÓ.“€"ßæMX­Â!äB}[µe@ÄÒÚo¨²Òl²fÊwÎôµ7±ìË‚ò p¯ëÆm1MîÛ–ëª(ªjÿôFׄ$+4|bã·^ðýÉG 4¡à™<]Ÿ Ž«B‡ä- LvN6ó¬h…ÜW¦úôÉ=Òó£G%«J™ŒÍøì÷ñÒ‡I™`þ§dÝÕ-†~ªÈë† ÿ†°zõ) CXô]«ºîöw(¥ïkáL 5&) oN{igø@ŸåjW„ë‹«Ë¿¼…²;W‡\Lú†Wº{÷­ïO*ðàëÀÞ†f—Õî‘ ÒFÑ©*ïUžjP\BEu«7æ“`?>È©ŽÀ/2¡•§»ÂÊÍ­£Û?:ïOá¤ëÏSf@¬/+?®@%!™P7+c¢+vô|ÀèʺíÅŠó$m€àæ¾@ØßÝ„:ä%¬=äEAÐ×6_~AS¡í%Š(ß…=^0³Ë%ÿA×gS…ÅGo…¾}‰ÞÍ÷8 5#uß|Ô¡å €ï´Â8ªqâ!ÇãrÙr3ÑP”œ³4Öª Wcã:° ¡"1ý O MGPU£Z†ãCçV‡¸îôs´) êj$³&ÇÏÛµÁd€äž@x°²ƒá7˜€º¦Ñ(ôyJEoz¤K_‹ÏWúâ Xv„ÉÔº 'Œ% AÂ&! Ó¶‘dÁjJi»6¼7õô‚x (D©h¼ ˜u~Wºöp•î~€iâ}€g¬Û‚`´û°Þˆœ~8Ôßéà¨-È2ßÐ}î¦Õõª|}BsØý‹šÊ!  }à›.Nu[ö4n«Î,}|ãÔ]ñ±ÄªNq·×dü÷­tÚ¥NègBt ¯ÌÃÛúÎöêhM†?#NDÞ§Ð/þµrЮ“äHlRª F˜ò RzÈyÿ³æsÖÿ ‰U£endstream endobj 1760 0 obj << /Type /Page /Contents 1761 0 R /Resources 1759 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1745 0 R >> endobj 1762 0 obj << /D [1760 0 R /XYZ 85.0394 794.5015 null] >> endobj 498 0 obj << /D [1760 0 R /XYZ 85.0394 223.2735 null] >> endobj 1376 0 obj << /D [1760 0 R /XYZ 85.0394 199.7072 null] >> endobj 1759 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F60 1366 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1765 0 obj << /Length 3588 /Filter /FlateDecode >> stream xÚÝZÝsã¶÷_¡·Ê3'I<^.¾Ô™æîzçL¦Mò@I´Í‰Dº"eÇý뻋]P Eɾ¶3ítô X‹Åo?A5“ðS3›ŠÔi7Ë\"¬Tv¶Ú^ÈÙŒ}w¡˜fˆ1Õ77|o²™.Õéìæ6š+2ÏÕìfýó<Z\ rþîã‡÷×ßýøùíe–Ìo®?~¸\h+çï¯ÿ|E­ï>¿ýᇷŸ/*·jþîOo?Ý\}¦¡”çøæú÷ÔãèïĤŸ¯Þ_}¾úðîêò×›ï/®nú½ÄûUÒàFþ~ñó¯r¶†m!…q¹=ÁƒÊ9=Û^$Ö›z6_.þÒOúW'姤Ð&ÕÔ:`®„uÎÎ2ëDj´ñ¼¾…-I3/jÜ ¼¡¢7´Âé4,ƒ¤Å¦muÓU·ÏLÏn•ÐYh7UÛÑÄUKÿwÕcYsÿK¦¹ÈµÍxš4u9±–6"U°"j»¢+·eݽi•žW~ådþTm.Õ|CÍc¹ÛUë’Vîîˉµ•Aê<ÌÛ„ ̆1nxË’4º%YAëÃÇ›ë÷¥övPÜù=ÀÓm³£Fw_01 Ø£äüæž§Z—·Å~ÃU^áÑrûÐ=S“Ù…Ö/ÒJ·o³`|÷ý‹”zU o½G¶G‰L©t–I+2›Ÿ0D³ˆˆÈP¨)KËD(¨mñû¢Ûu{[ú³]tÕ¶\Tõ˜ e¥€WÎ1Á$Ç< €¶©2&®ëe³¯× ð ÑqºM¿"íòrÙÿx¶ºìžšÝoô°,êõSµîî)Ó“C¸¹tzŽ¢'¿©¶>/…€‚¾ž h{.0(3-ìbi­V¡84.š²ÍéaE³órO÷èöŠ'D U^2HB&‚ZŸ°BÒ”³¾5©ØÄÖ<»RŸH¤u*¬S!Bý®Y&tjy·OæÕÜ»DX¨ª»=%œPaAñÖ¥ŽŒƒ ¸"ŠÀìaïR…ŒOż®US¯eª7´3ض„ÀÑZ7Då¤YÓò€P;™gn"Ö3Ì‹+Näà‰”&ŸÃšYì͆Bô›‚Ÿ'´¾||Ë]þÐnÙ¼ßSçao0åá\a¤jÛ}¹fº©ÓrVä¹Ê¾î¼R-M”£ÓüÑ^ÚvFFmŸ óî 2j@«‡êÙLü°¿AêN"iØ=,›î>x ¶[øª·Oøk9gñíIw VÉ$çÝALuÚôT#AãÉ} (}au¦™X|à °\–€/¬îA©]0+:Ÿç¨XæTq,µB¢m–'x-š&B'I2PiZŠP°¡zŠ ½½â€W\íUdµßÑ¡ûÃöÓ°¡w82Q@E$y0û½è•Äð›Mó„Š#¨ŒøïãøïÕv€ ®º£Š™ ÁõLä+È™ei⸣¿uCëå¾åÉÙøeïy½°k‡],.œGd¯YGVÝCÓÒ»ºa+qð·ŽÖYóG«d_줣eÇq]ƒ¦䱸;pT¡¼ŒUªïQ'òàÌ0‡íž6EâO•”¬öû–È5¹ id¹° ’¯³†Y’å#œ0'&Åý Ö$":mL‘Mœ·Ü6»mqœµh ïs–ƒžè˜=ª”§Y’xø›ð”³q’‚+tâØXò8¶ø8üKO 5Ö1Â6x7=)íª}3åÁL&r—„ˆøXO0ÁDÉV6¢®Li„È¥ •pÌ“x¾Iuïi{uà’?¨XÅŃӀs`){†NäqJØ4?²®6çP$ó#õ„Öžø ŒŠ¯ç´™/}bˆÌñKMísMhµû‡‡fוkö©Y5òæÏT •6EŽxã ˜œ=Ñ Gw¾I™*^Vé„sEì÷‡ C„=ÎÓôNÆrñ;SµXFc‰pÂRgS?|˜œBb8­êÆ9°I‹˜ÏŸFÜ”RL‰ß8Èê{hõz‰‰RKÿ”KIÕ üðŸaÔ§A?T+ŠŸÛæ–»~º´0´nžø´.@$Ï(Mò´‡„ˆ˜˜Ø=g–ºäåÝë—vŸ ™É,6¹c)læ¾Ú¦&N©ž;¾¥ 7„|¼.ù.ÜÇô÷ÀÓ *¼Z´!3\>¿2üÐ`î~'øƒ®ïˆšÝgøÐÇÓšJ+ø_õ·>º¿õÑÃ[ðå.¶|Ø‚%S.‘`–€ RJÍ10úP>0Z¤&"»×#CÅ7ƒÚ$jˆËÜ$ìJN_Ëû¹ƒ>,’,Xœô¹,<æ&tiÒ‘’„s<þ¾Àº($z&ŽÛ‡Ò§PÐÜ?DŸ`ˆç‘´â®¬WÜé_d MŸ~£éJï¼(øÚ"?¼]´²qó¹=kVuØn9ºsß4Åz¨´ÑÐ*\¶·ÏmO+„-Î$/\;ÄTg(P ?uÕ˜ÏäÑg—ï©&Öâĉ,³Ù¯A‰Šòp|”hé ûšþRŸH…°©’“ á€W!l,™2V!$=¡BüÙŒPY:òþ”dø3 V*I~ HÓÚ® €à/.~_ùKþ·ãóç²,Vž¨™|.´a(}öVcxq¬ÁÆH°ûÈêU*|…*×§ì (Œ©N£°§¢0x²ú¸$¥s‘$F碧š`c˜C‘@æ3äƒKÏñU<ª¹\Rò`Îñ/Ôà‚Ì?Ò·:’±ˆ]K¦<ÂÞàýM/Ö\ƒ“¨Öè(€¿ð› ØÙ6¾ÈÏ9Q‹]:Xh‘áxË.•;€Ê•N@çSÌ·ž²ÙÂeYy#_å@ZîÈ+ a1Žpry>ˆp«Þ;°2ãG?㊎÷ŠkøFé Ÿ¡¨~ƒ}P¯>Cgì3ðF #:òØC~ ¿ x‡hIÅÞ‰šzÄM|ˆ8@‡èY‰ñX†£ÒÝk….ÖFá±ÿ(Ió×Gf€bÃÿ Pÿ* ¾ÉŸ8qŠ]'ÐÒ“š1&N°®ìåÃýŽ„‹¼ÝÒjÓK@¶›‹,±C,üÇBÝÂI¼ú”ÉàݸÒϼAX&Л©ê<_+¥\‹ãësxæ¹³ùß~¢ÌÅß ‹tYø¶´§O'nù 3*|§‡5áåPó­ŸÁVU+ß?¬Ag0c7:§/¾„¿Œú|ÝXßœOÀWöÊ¿ýiûá»ÿ$àÌú?ÓNÀendstream endobj 1764 0 obj << /Type /Page /Contents 1765 0 R /Resources 1763 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1745 0 R >> endobj 1766 0 obj << /D [1764 0 R /XYZ 56.6929 794.5015 null] >> endobj 1763 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1769 0 obj << /Length 2747 /Filter /FlateDecode >> stream xÚÕZKsÛH¾ûWè¶rUÄé÷ãèIœ¬§2NÖQ[“9Ðe³"‰ŠHÙãüúÝ)QŠSÉÔîVªB°D£Ñhà,>`ðœÎ˜ôj`½Ê4ãz0Yœ±Á̽9ã‘g”˜Fm®_Çg¿¼–và3o„Œg-Y.cÎñÁxúÇðå?/Þ/oÎGB³¡ÉÎGÚ°á¯WׯhÄÓãå»ë×Wo>Þ\œ[5_½»¦á›Ë×—7—×//ÏGÜiß‹(áȯ¯Þ^õææâ÷ß/nÎÿÿvv9Þ_Î$näËÙ²Á¶ýÛˤwzð/,ãÞ‹ÁâLi™i%e™Ÿ}8û×V`k6|Úg?-]¦°=¢e@΀Vf`µÏŒ2°.š°%á†eƒO1œ³|3ojzk*zæô¨Ÿê¦X=©–Íúœ»a5ŸS{È盂ÈÇûrrÉr>'jSoòùü‰^n#gs‰|: ‹:®^Íð)‡Í9“–˦XÏòIüæ“j2¯êždÄyæµawE ›’( B>¤ãr8Hk-ª¦ ‰b9Åó[ŒïËšx:*!Ób“dæ«U‘¯i´\Æu®l‰²ÿQ£Šp(¼u(’›LsãAsTŒS=Žšu¾¬gÅ:ò·ÑØL18;b¯VMYÅ¥gUàŒ¤“™çàJS‘¥~­À˜Ëør[”Ë;$Á,qQÒ|Š^!ͰœcE_ÀNk¨WŤüĘ(Ðh’©h´0×äà%Ų¡OÀÇâ*Ñc&2#tÜÓv󠯍®6ëIÑcË2Á¸ˆßàÞÃyp4Xó+(\¿ˆ±"sÂl B¡ãvƒçÈõp’£¹ þˆÕX¡œN‹e|ó9½®¢neñÖÄf¾káÌm^OBò‰˜Êåd¾™³ãpÞëpÅ÷Z„gL¿ÙAô qÄù®O<–Í=z.F´þ£Q6³š%3‡®,ŸMÚVë9°ª3:)ìÓ+‡Yo"Óí¼š|&ÝÚ:BºÞÝfÓÀA™Ù~LNaÏ8F<#(KrŒëÊd¬ÉŒ­Ê¢ïÈŠdú¢+j”´&3§lÇîíY¡5YÙ ¼3ÁF×-+j£8…ùLK‘Lýî|døp ÿ‹áåi@¨Ú Œ7*ìgðež¤¼—ÄÕ¢ÃnwV¿\-ÄàU{´·•$ڢþ kû…†-:HqÉ()}¨æXáv„ËcüPd0Md¾œQDžyY¬idZ‘Y5DÔ›Õ ¯§ï‰#EÓÐ탊×8J׊V€˜Oñ^fç’EŸÞeŠ ã—ïÁó¬ƒ'ç‚ ?ãë@©7TÞBÖ…ómôùŽt ÒƒÍF;tðcž=>ÃI¡BÀâ5–1 8Ü3cÝ÷¦c#Ó'³¼œ×Qi_=yW)hoêb„ÖŽ¹P½óRïá¹çÂ$i·y·Œn!ðhšÔÌd vüSÒ$ Q£¤ÿŽP—¾8–&•™µpßH“ÊCÚñ\ýÔ4©À ™¶êoH“mÑ'Ò¤2`qí)M^¡K36|¼SmèeZá“Ç e}O¹>áâ + ãíÁIð$˜ŸÂ„nHÙ¦Eä¨èyßÁK±JÌt5¨ï«Í|é¢!Û›¶·ïåÑäîäÒ¨,ƒ[#‘\»k.2¡u ³P­«UD °+,2• ûêÈýkŸ M$5‘ÆBbZ¬Šeܬª%ÝÀíRx—€B¬!èY£ýã.ÂØmáAx 5>Cqë‹J|Y3À÷ôòeC瀺ƒ1cŠö­ø±‹ö_Æ à !dºvße‡¾/±ï ‘WÅ/ NòäÀ ˆ£e×_n#k÷}Ã;6Ê#¬£G·ÁxÖÝj (ôbë7À'z¶Z¿$´'­[ˆ‘Z™ç›ƒy¦š¾Aþ¶½ËÞžØ-¥Í„Ò¼kgõgŸÑç}V¿øg÷y…„Ðzõû¼ú'öy9\"ƺв¯€é¡(ä?µ€åÖeŠÉ¿¡€m‹>QÀrÏ2á˜ÿÿèóŠèó¶ú¼Ï«NÖd\Â}õß3‰é hõUb`Á jµ$¢™Ät¸~æˆ—Ž»ŽoËÏEoàŽ{nd« É»MÜQB£vµwÜÔðŒy3Ð [¤ºfÙty±…EíÀB‘ž Í Ï„Æ „˜àu°ñ× Üda9cŒÊ{€‰¨·PCÖÉ¡!èzûaXñ<¨Ñfº!¼êƒà³q~»ýžÊ"½K¸$¨Êé·d‚+Tá™2ƒ–æ»´öG YL^Níé{Zº¸ãYÊw¡J Ç+ß‚ñU:Rš~©#p®*b £3ïÙ~…¼œÒÏ-¢O†H@6÷yCTúí„?—pÞ"Àß*ÐÄ’Éá‡â QœŽ0÷C°§©õ]L7­;¼åíØ¯ð¾ÌŠILø Vôôƒ8²ýáËNúAÙþ€&…¼&¶MÀ?ü{Ý™”Í ‹þ-KWx •†²pË–Ý_äj©þXÄûCendstream endobj 1768 0 obj << /Type /Page /Contents 1769 0 R /Resources 1767 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1745 0 R /Annots [ 1772 0 R ] >> endobj 1772 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [471.1233 61.5153 539.579 73.5749] /Subtype /Link /A << /S /GoTo /D (query_address) >> >> endobj 1770 0 obj << /D [1768 0 R /XYZ 85.0394 794.5015 null] >> endobj 502 0 obj << /D [1768 0 R /XYZ 85.0394 117.3409 null] >> endobj 1771 0 obj << /D [1768 0 R /XYZ 85.0394 95.0296 null] >> endobj 1767 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F60 1366 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1775 0 obj << /Length 3273 /Filter /FlateDecode >> stream xÚ¥ZKsãF¾ûWè¹*bØO6wN“Ä3;©d&k;µ‡l”DÛÜP¤"Rö(©ýï 4ÐIQò&ë©)öl Ñhà(1‹áŸ˜ÙT¦³$Õ‘‰…™­6WñìæÞ_ ¦Y¢EŸêëû«¯Þ©d–F©•vvÿÐ[ËE±sbv¿þyn#]à ñü›Oß}xÿÓíÛëDÏï?|úx½&ž¿ûðý µÞß¾ýᇷ·× ጘó÷·?ÞßÜÒ”å5¾þðñ[IéqfÑÛ›w7·7¿¹¹þåþ»«›ûn/ýýŠXáF~»úù—x¶†mwG*ufö8i*g›+mTd´Ra¤¼º»úG·`oÖ¿:©?GRY9¡@)§hÒÈ*©¼³e½oiWOõ 5Ú§œÙsV”Ù²äî¶Þµ Ïì®…›óø:oóݦ¨ò5èQ Pz½£™üs¶Ù–ù—Ô{)Ú§‡‡º,ë—¢z¤îª®þÇòq¿ËÚ¢®P½_½Ó¢·‰x"%ãÅß7ùâÙ.öëí‚¥³q<ÿƒ»¬zÌ© /XGMkŒ2o¨ýŸ7È"J!£Êžëb}~YÃß›‡™E‚XŒŽb´‹Ÿ¾ý'; +)æõ }øñÙÒÈ&ošì1oh¼É«–ÆüYÔæÓ×–Hà‚¸TCäSe›|=!ŽkuV1ÕKQ–Äc™‡¢¢~]åCáü9zŽçˆã^-Íß®®ëÉÚšæU _zÝ/$˜¯NL2<T²`c©é©é%²¿jÍW÷”Îp4¡ <æ4RI0}:fÝ;æSÕ¸4ÒÚÕ Û -»È%à«âsÖóÚ²« ,cá.c‰f½¦¿)ÙÒ…{ÆS?• M#i\úÚ1«´e˜ª3ÏgõT× ÝCà–54Zøûp k²0°\G±L»“~¹¦ÞûW¸zS¦V†×hŸ2n =—e½úÕo—<àŠ¾…>öÿ’¡mâ˜w1@Ù®ÎÚì-]ƒáòÚÙv[+ïnš7üÞCOðtþÛ>ߦüÄ ]AmæÞ‡*mÙÅáPF¾Z€äÄ™nϾsè½eG›W6åˆDUó‚âcû¥Þ—kz©ªyåǼí¯joŽI«­Tƒ]ÊΚ€.r“ïž=_#;¾0ü”=3¿Þð$yºì1+* VèùǺÍÁ'!Y"˜_çMAñjìQ±é¯6²²©‰|ÉSô _ t…áõº*™³?Ši'ÐÛ ¯¸€8²²»\Ó.@â•°ÁœD¥ÓE“$Ò¶[OXi> ‘„£1Ñ2rš}?3uÍa{Z„¥ë­7mZ· ÛØaµï«uæí†¼£‡QºC8ºmò7|¼Oùa¸9prÁVwƒŽ¦~.Öù:„zËlõë ­°a³…¸,Ê¢=Œ|ðêÛºiŠeÉÓM¸¢x8Œà{$Øæ«Í®ö™p ’(UJuPRØŸ/9ÿ´Í„drwhÚ|Ãð/Ç[½bžß›bòˆa}™D±±~ù{/£tÝ-DùECC{ŒëÔÄÈ*e:ßdÕégh³½w>…ß§ø%¯R¢LÇb5¿[e¥?˜yÎÊ}xíâ°ƒœ¨ÒùËSÎ+z=>Pp,ò“ĽæÚZ‚ bI‡'(D&ad€)âý„6"™d1‘×’y’ÇVQ¾2î€:'ØÅP@.’ˆ!xkᤞ`‹¶-ãp™¼ƒƒeY+ÔÉz»¦­zx„Ü+–î±xÌ–‡6Ÿ2C Бձ9¦ŠqB(D HÍBÑ!€Ïm|´V¦÷.uÀ•£  #ta ±É>›ý†:}¸ÝM½¯Ú)‘¥‘³: ‰uþíËvX¦Î™£[lFüYi4–që%c²¢bÄ¡!¯±j„8СÀÙÙlß„«æ§3N]š6Ûµ]ªr—磗 "­v…÷š40iC0•„­5Åïù8TÒ‰Hf:àeµü_ÒA‰ sÓÉà¢[qÑ_’2½¾pJºÈH@z™—Œv⌤Œtl‚…“ÊÛ°à…VƒmÐäîqFÛ^:ÚÑO9°“u‘ÿ]¾:jÞFb,Žl[§Òœ¤ÄÕ+2œ®†2Dlup÷EbLÈdÏ+5H]¡ÛÅY ¼ÉÛ0zŒ"Ðí|9´O}'¾I¾3pØQ£ < ‹6måX á ñ_Ïïê@w`Ú‘8ˆ  ±ºúý— ·ß2N…ñƯ…-ïÉáéCÒy?çšs=ÏŸÄfþ©âö«'n?pFà`Fƒ*J±C¹§£TGЦÙ{׎í¿‰íì+<@Žà] YðíÇ8”møSag"mÎØT Zô©Nï^¨²tT>\Õ»|ÊE€ÕIa^aˆ&÷m9uà3ìˆñ}ðjGGïÑÓïyçÛn 6¨ëì7[v“÷GïH¾>(õ´B#¥Àúœ}58h"Z ¦;{(Ê%‘Ö]>”>ÕùC騼dY›9”ƒÍEÆh‚ñèP `iÀ˜”™ŠÞ¡@‡Â-µý±¤±‘IóM9¶Ûð~çüZ< ŽÐKÉ#Ÿã¡AgòÐGIš˜?}hÀH#½ºÅA+©ŒgG˜ÆïÅ@ÂØÿô éý><ûÒ½ÂÉÈÒÖ4ÆÊè¿Ð¥?³½U5LUóølÈø•þÚóÎ?£ey:¼¯‘Ãñ¢cî'AXPK-»4l=¼òÔÀJNGùà,Kyø~Ç­2÷©µ Ë·iÁá1ZC‚šžàï!nl¨óíÇ»ã[ÅŠðçÄßc-o=*‹*i×Î9¶Q;Œí8{ðé¶õüa¾Û*_>±Œ/Óøxa9LÏ·!z 9߀>i8"f±&K8Ú5ÏÄV$Yú¦óåžÑ%áMËI4p±œš\)R¬N ÞeEÓ~ÓM/¦Ûp_¡Å.¶qmq-…#½uÍôªl¡<šãKèCºE{ŸØæ¡Þc2¶¢A{Ó¢ŠaÚñÅ!o<0Öù˜˜3Më.A캺cJBô_*T$H{$™È©Ž•O®n±ÊVOù"¸ÜqA ¯ék…ÖTëîòÕ~×Ïù‚}ŽS‘F ­{Uy5™Ÿ+ÈÓã:‰l”CžIÒi€‹N]ŽI}ªó1©£B)°bQæÍ˜o¸?–ê2ß@4ÁwTÎÒNÙ!_FµI?!LæÕ~³$™¹À3Hè;mxíGvhmRaп¼õ¹´Vu§F®£jÁy!æÞÄÍQˆc¼‚Ît¼JT¤mWs¿”,Œl]©ýü‘ÚO4dú—´GuáH•÷Dm¶úug$‘…˜y™s šà,G% + ã°žFèá?/$Óp.“¦ó%,ýçá!~=p±qŽ+'uµ&òd¿'b®äÝõdÿë¥;%ÓáW.×+­Ê”R>l„ ÎST4Ö†FÅ?êòÀk.k¯˜®JœC¯ _6°u¬ãJ¼G]%dMÓEÕæ» ÊúËÃTì˜<\ˆlO¡ üÆ•zX¥ØwöN ­á–‚õ^¼S}ªówª£ ѤøL_°eý¸˜º_XUÔJëËbtTr n˜‚´J€Ý!ä«RuÄH)c$[6u™·X?×V{äÑŸÎV«|K_.°ç‹ÿ8ýXÕÇO")×°A¿O@GÃÂ9»Ò\ï=£"üq…cβžÞ(ü(Ë~Ìþ7\°¤³QÛEÎtn˜±g3È)¸eÆ&õ°¯zõ‚Ÿ½ß]œ·¥XàGjóŠ-õ¨.ØR :·Ë±¡'¸(@ š`lD1Ä®¡w¹÷:¦Ï=wB’Ø";€FžùŠ ´XpêPhm7ùiMR;ÈCA)}9/óý+;]wPÌC‰4ºåÓržŠ¤6æ²v;ªW¤8]0˜Çõ¸xþO_#Fiø“è´ NJYmÒQ »åjbY4ô$  ht<ŠÆ8;„ËNq }Ìí¿V—ë¼iyp—UM¶ X4¡oròNbìpv ­%Ogû¶Þ€SXyÿ?á÷É·lêg_—iÂáâxIå‘Äw²Åö´TPƒ®ÿzD¤>ƒ!IÝð…£.Ù¯=ˆs£°‹ê~—ð:–“ǯ¦Rsi>ck“ƒÃ×iéF?0‘äpúr’ •Âæð¢†~C3À§jàê¶”H/~÷~è[gS4ѹŸ‰)áo»&Lþó‰ýß?!;þ¾N'‘rîLùP‚+‡¼@¡PG‰<õÆü[³SÑÿ Ú¾4endstream endobj 1774 0 obj << /Type /Page /Contents 1775 0 R /Resources 1773 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1781 0 R /Annots [ 1778 0 R 1780 0 R ] >> endobj 1778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [361.118 489.2586 409.8647 501.3182] /Subtype /Link /A << /S /GoTo /D (configuration_file_elements) >> >> endobj 1780 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [347.1258 97.3808 404.2417 109.4404] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj 1776 0 obj << /D [1774 0 R /XYZ 56.6929 794.5015 null] >> endobj 506 0 obj << /D [1774 0 R /XYZ 56.6929 572.5486 null] >> endobj 1777 0 obj << /D [1774 0 R /XYZ 56.6929 545.652 null] >> endobj 510 0 obj << /D [1774 0 R /XYZ 56.6929 231.3705 null] >> endobj 1779 0 obj << /D [1774 0 R /XYZ 56.6929 206.9447 null] >> endobj 1773 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1784 0 obj << /Length 3512 /Filter /FlateDecode >> stream xÚ¥]sÛ6òÝ¿Âo'ÏT,>œ{JrIÏ&͹îô¡í$B2Ç©ŠTõ×ß.I™Rnæ&s±X.‹ýÅoüã·Z%Lém^¤‰b\Ý®w7ìv s?ÜpO³ DË1ÕÛÇ›ï?Èü¶HŠLd·›/0­ùícùûâÝ¿ß|~|ÿp·Š-²än©2¶x{ÿé_„)èñîçOîøõáÍ]ž.ïþDè‡÷Þ?¼ÿôîýÝ’kÅá}á9\xáÃýOï úááÍÇoîþ|üñæýcÜËx¿œIÜÈ_7¿ÿÉnKØö7,‘…V·/0` / q»»I•LT*eÀÔ7¿Üü'2ͺWçô—*(‘f·K•&¢`é¼–YÂhm™§,œó¨eÁç´¨PËOm×/»ÞôU×Wën¹3_Ïwγ"áBŠÛ1ûWBDª)ÄH ž£þ`K1îP~¦ÃùfùBÏ\,º½]W0&lG$ý“%D­vÇ‘7ÇÝÊh¢ÝÐ÷F³ÃiÆ6ý¡"†ù¢o ¹ò|Ÿí¾c‘™\|j{ÔÆí2¡•†sà<)”Nèj·¯íxÙ’L§jè9²Òä•ùÃÊŠ,Ñy‘]?Ñ1ÕåT(ÕÁ®‡®úb—ëºáºW穊$`qWEˆT32LÎT“³¢˜ ñè 0xa<$˜p‡Ï¦ëÞ4¶=vDu¸ãpB~DT·íóqßÑ€ ;{øؽTuMÐÞ6íÁ¯Ø6t~à>y&‹éù­ì“©Q ÍIÍ^gpþ)“~€.íÆ€˜D[9•~ÿ!Ÿ—E¢ ˆpÌñæŒ1¢šhKȤÀèADn±xk׿ØYbnÍú‰ ‘šíX:š†7:‚ MnLu ĪêÇ»â‹Ýµ‡ÓxÛÝJ먞ÉD3®ƒfÈŠ%,ß:!JÔ²ä¹ã‡hÁhü\ÕíêÔÛ¸J©Â{ù⋩ņP8G ™¨Më$å,ó™5Þ3æy¢•(üí¾¯`3n©9ÑZOæ‹_1+?.íšôj:ôZ·)¯ ‘A–Ȥš ‘.ØXÿäí±ÚUÑëGʽìí¢H2™ëoxûˆêŠ·*wRëýE?—øŠüúâ‘jfõ‰ŸË–?[ü£ÈFnƒèæ; „ç™›&Ú2Àï>{dÛ4v'ê©ú'ÓÈ­•nHïö™õÚÅm:ÊëˆéAÆ4ø2†ì9_ÎD¢t:rå+äyRHP[ðä I#‘,“×~Luùà#yŠÓC¹ìÚõ³9ý Òk‘©ëDª¦Q^%"‡SŸÈàTšrO<åtâˆÃœ]ûùÒvëCµïÛCGòAÚ½1›¦Ð¸(0Pá°ë˪EXå Û¯!djóTyNµ¥Ñ×ñ¹²ÄrUm}ôW‰”üÌlÓ·èÏiJ%@*ÁüȲåÌ€hÍ0ï¬päüÃÆ¬m7ÒDR +2Æì`¯ HÊ$\xªÊëŒØ·Íw3|Ó,ɲ˜;ÎÿŒyZ$iÊ‚Æó}±Î[`#CO{w í—ª´D@ãvG ”ÍîÈ„„#?öÛ–’” Î À_Gë«,˜¦$ jÖí.ÿÝ6– þ`šnc˜{¥;b?1ø+¾=ç¯@ÂS¿]ÅÅE‡ÕCê•L ‹€D>€ÁÀg/!óùõ–óx–Š©Eq¡çR>Ô÷Z„c#5¤!œ¥ãЙ+§êB•Á ,d·ÿeÅÚv]XÒ4qÍ6Üø¦ØòøËZœü §B~¥×N¬¼ì䯻Öy1"ªfد/XN~VymŽý‘Þ¥€Í`º@wà>®T>åÆÕ~2]Ⱦ}_û`n7Èf9ÿà‰»S Â¦l_º‹±9Õy’i-®Çæ1Õ娩P~Pïr uœ]vÕßöuý-V@|uýH5#ÀĬ¡Ed¹âS œ]ËtÔ$É´X˜]{Ä”‹®,Cª^ܼ+–çŠQœ‡»™À/$_hžÿÑÊí À\ºóGœ+ Á–2ð±ßžl3pqV‘jè >5Š È„oáÄ¢4½!ÈY<}û'hY}Ec×Òq rS®RÚ7S뱂ØWŽ!á‘áÚW¿žõ‰ba¿î+" ñÞ{ 6]Ÿ¢Q¢åŠ*NvIFš.œ;Âø§‡_ ˆ4)佃éíöD]KX_©°Üi–¼rbë‰ì×5¤G[b´éâ ‘… ƒ’lèɦ \ÓmjÔ›··¦Á€=Ù”ð‚qöÄ_« ‘&èI¦ §;hZbëJo@m(ÍìˆÚG‹`ÛÔ'‚^¼9ºê@ òK §‚=Z.Þ€ž\ã³~CôÒ³=½x9}ˆÕ#‡:Ûá± Åþë@«ÀãŠ"¤T Sx#•¹`CSTPc†()–®YCøØtÕ¶qª ,1¶öàb€f_)Ö]ÿƒAË%‘ƒÆ*ì%IŽ1jÂF}b£¾oÒ¾ÉF ƒò… q¨Å1†c|2z¸&LcÇ¿~ªà¨ÛVÆ¿Ñ÷ûöà»6ù÷¥ 'èÅ3pÊÒlUÈjÕœtΜôiÎ6÷mWõ5‚’” yêS"BÐÐqç†8ßð‚òcXÀuŽàÛÆK\ÇPÃöžUKhà’æ¾!Œ¡aˆ:ˆ¢V±ØUû:HYÙj¦YŒ–gÛŠþ'°ß×T`áEŠÝ õÉ_“´“ëæèòÅ_6„ ß}8ÑÙåfÉ=ÙÅ”*s‘dBå×Sê˜êrJT¡Ü¥y eåÑÎ]jñœ×%ˆT3"œ_jq%ÔDJª‚ûba± iº„ô £PmT »ê±±ÜD,ª‘œù—ï7„ '±­ 騣™˜Rñ‚û²iJuM1zLNýXï GB¤˜\}ê,Oˆ )Jž™óBЗ÷«k?÷Ô¾°3͉ Wø{ê¡‹'–ÆKAé!çWZ“KÂUÍ\挻wüÞ'î}|¥íÎÏSí€ÐÊn†`ãÆñ½½éè"óJë³–¿JpiäSÛümië4 À>¤"įOqÎkC™Á¨vVÅ¢«jhÞœ·ö`ªŽò´Ô.O.æéÂ×C.Ö⃠qÀÓ ÙB Sþ“ê*3 ˆ´tÎûÚôx9ÚÑD(“0xôê!ôQÄ¢#½îU<²Í6Ü‹…˜c|H:Áû»eiÑöšp_6 )nÉL· mDR°,W…·ÈÈñ;ÏÎï–xúø f[Vkböè.áL÷LÃ{ìÒaîR´iŽÞýË™1Õåh©PÌuM%Ó²ò"¼¾†šiy]„H5#Ã4\åIª‹l*Ä£÷c±ˆRÐÈc‡|IÒUY€lW][[4Ê®Ùâ3yΗª=vu¼Cv÷-T# õ4Â/í±. ºC¿`,ÑÊXƒ¨Tž}Uñiµ¥RÑ9;˜êëò£òQ…€P>hA®ÓÜM®‘¦áyö¼Î”¬yÂÒŒ‡b¯j޾ő¹ÿàƒ ôh\tDß3ÙÚn,ÝP*0åó(8@ëJ(g5Ä0X»rŸ´Œ»ˆök5î`š2 Ë–V×Ô ºt'®4Õmƒú4~@ñ>ådöª lOSa’¹€ý VÛ›]ò¸d®ŸwÕ9ò‚ó¤ÍoÚë-~,lÎzRDá§°Ø~ä½X¬p%R]wÿ1Õe÷T®Œ¶æÐ¯¬é¯ø†äúº ‘jFˆéÕOd¦øT ºeCÏž²¿“!š®á½3(sc𵥩âiGstG˰0ðLð½Žp;sxv—¹€6s÷¢R扔±]*¡;îg úäJŸÝaÿg)Ìä:)y1n€bŒóÍ"Tb¹Ub0ogŒÆ#†w¬éÚÆ¬jÿjÌù=-¼ qZzrB—f¶#Á.ާ)&ñ\…%ý­›+ œEãT¼̇;Á\Q(¡i ëx ²N™xg®¦DBׯ ‰ËÕ€`î‹  w¼¿‘ͳ‰)Ìx9]ÿ’#vÞ½=L¿È¶ëõñžÈeÂSþácª+ž¨Ü'úpQÅe’ñôºhF„iÖ‰* ýNdð½T1ºv´صiB9æ Û¿´‡g¢Œ[ 9¬Éº”Û„dV‹ðIu^¯“WúUnÃbô1¤,™CpQY1µ‚èU¼p·óî‰^…Ï“€ÞÒ)‚¿ò"~*¿ŽæO2o„Fæ=â.¬7š7Î8óFÍÙ;ó†ðäòiÔ$Πâ/ÝkùãÑ…¿€E0c‡¤»(„èÌ€ž«ÜízpJqðJø†ÎwáY·†näR•þÆudN(^06ÂÓÁÅ£l+»­üJ¾7žÛ %o©|@ü0#eJù”Ú%~Q{©=XV} ×R¿}¹1ÍèóQI\ArÏcˆ—8¨ëö%pZ†_ ̤ ­¡DÓjòlIë_eŒ@;1ͳ#ñ7c®?iÊó Õõí>|^À•bñÊñ¾)ê™>T,áw*[Š¸Â‹¹ô“€p½¡üõ×L¸ÿþøþï™ ¿ÀƒÎ@^üˆ€д(ò j/—ç’+èÄ”ùŒèÿÌ2Lendstream endobj 1783 0 obj << /Type /Page /Contents 1784 0 R /Resources 1782 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1781 0 R >> endobj 1785 0 obj << /D [1783 0 R /XYZ 85.0394 794.5015 null] >> endobj 514 0 obj << /D [1783 0 R /XYZ 85.0394 303.32 null] >> endobj 1786 0 obj << /D [1783 0 R /XYZ 85.0394 278.8224 null] >> endobj 1782 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1789 0 obj << /Length 2713 /Filter /FlateDecode >> stream xÚ­]oÛ8ò=¿B÷t P«üE¢OÙ6ífq›î¦9ÜÃî>(¶’•¥Ô’/ ÷ßo†CÊ´¥¸-ZˆÈáÌp8ΗyÂà'¹Î´6)¬ÊrÆód¹>aɬ½;ág1ÖO×'/ßÊ"±™ÕB'×·/“1cxr½ú#Õ™ÈNK_¿¿|{ñîßWg§…J¯/Þ_ž.DÎÒ·ÿ:§Ñ»«³_=»:]p“óôõÏg¿]Ÿ_Ñ’ö<~º¸|CKŸg˜^¿=¿:¿|}~ú×õ/'ç×ãYâór&ñ ŸNþø‹%+8ö/',“ÖäÉ#LXÆ­ÉúDå2Ë•”Òœ|8ù}d­:Ò9ý©Üd¹P4)3ÅÄ3ZæYÁ9 ŠgÌÚQÉ‚Ï)Ù#¡Žû¡ê~¨—ý¢n‡jóß²9<7—*ÓÆê$b>‘`DšŠ "¸´™.ؾ —åº:]HfÒ¨6~Ã7¤b¸G¦¸H‡ûº½ë |SÁ˜ÀÕ§mÙÀ›T©ï«6 W„| —÷]×WžEIŸÖyK\Ýar÷Øöi‹~Ðn7§Ü¤Ý:¢i/ß zKÇ ΋¢/qïAPiyZ•ÓpL«[XA€$¹q¥k«)=rpHõ²lš'ZZ6x°!¬{ü¡¯š[ðgZç+§þ"A¦µ“Ãó×£àq ˆ/;·ïlÞïw úøXyéÊvf0N¥‹ÊÕ‚ü¼‚gÈóBíûùÕ¦êûoÉ I$‚+õ5ö-2{ÔºÃEÌqjÝèÖŠÝ®.‚•Ãò~ֹȤ”æÇ 8rü‚„œCL0ÞÒYæô"y‘Rðp-Æ{Y¤.z{czÂ~5šå">#7< ·4÷A'Âù¶ð&ºÍGšpF_g$ˆµîÜ‹ƒì-½íš¦{tZŒ›'úÞÂQŽ  –y¶X†Àêºì? ¤Y˜j!#sÚ"P*b«d*Q(•Ãa‡{Z&‘aP}^VäÊ‚ƒ 0 KGå•4܃˜NT4ìîmhjÏ{§s¬æì£©Ê`ð/¼ ¹ÉFÔè6Ç¢/TŒ¾: &êßÝÔ¨wösÄ´Ý§é µBõ¼Šæpþ~Ï"çš’Avnù×u3 ¾Cz­ŽÖr‚k-‡™ÄØ5ìJCÝ1_Ëi¸ð‚ëD@&¯4³?¢–ž¬E¦Yж?¬– Œ1çi-gMV`'A@e/æ£ ¹SéýæFfÇ6Å~2¼Çö3’Ä.<­‚Â*~Ûî‡T‡ñu}Ÿ ­åtô ÕáqûŒŒJ`ŠËãÕ!·ò7µWÊP†'ÝCæ² }Æ2ã‹õ"q*õü¡k{¡jWJš¾¹ü@s_Úáp]>ÑâÈh{€:GÀ58™®qoƒnëË=è²sßUO„è5¯®\S‰°n»ÍÚÕ­¸Z~ ¿—I)«Â6Õà»WJù¶.Ry‹£PÞâØGD\‘¨ŒÄ™/¶›–æBlžÿ@‰eøÞªJÝî4 k.#ÂjÃvUA> '‡ë$¨?ˆ3ßð<7[äÇ Ú¨* ³õ+ØäypD› ȱè6žñÉä ª#.¦5,²¯ÛÃW•”Æ6O¸Âns=ZÜÜyçtµlGüEL0íÙNù¢8ª¥w# Lxj"“É3Ë@ñ“æñˆõ%I&ܼúÑŠ„ÕÞŠ@ eSš Û5áj·òxPzl›UŒWn6e{Ý¡ 9QN¾C0p.åºF¨Ú(yè65Üæ…ö \¯{*ÒmOÏ i\ Œƒ]6_y~ä¦C2ØiØV©GŠrEüºJÄwž™Ïè·Â4ꑟ!3ô¥É‹¹çK!*–Ò=EÄŠí ´tÏ+ÜÔÕ*µ_rY<’‡2Çáw>ÉZîI;Pû'cânë³/Ùô?®SæçñŠ•cð j XfT˜ŠkÂA6/zq$œyÛt SPo¾Õ½"%ÑÔkF‡t»8ØlÒí¸Öy^#2áŸ=Í¢[A¯(0ÎÔ} uú1ÁL?mkë9Z# Ä»L;|â ÃG%Ý0污L«Bí†böÏf·s?»€ËPÁÍQrêãðwnôLŸŽÑoΟâ䦂ÚŇ& —çxŒÍ7ð¸4™ÁfpèàÍ6éУ ø«€æßÝ."ŽÓ$V€ôl—N‚[UF™&àÈð¸€nP¬Ä>ߢ“Zî·è›¶è6Ðí§i ²îƶÌ\¯ ™ZÅär œDIsÐu¢‚æÏZ¼~e‹¯èË BÊ\”Þ«Î=0¨Ð§—A®ˆ¿%aCóËñÖc/vèsÑvŸç~¬‘v?TLlYÀ•A*½c?i=Îq8EQVBLMS§úî¾sŠŠ:Ð`}ô–¸Û±cirÜQp©Æßd·}àï~3x¶¼Í3ü}Fl¬#¿ûwü]e§1F<£ÕŠTL¼PxŽb’1åpÿP$ˆÑÿ-w¥dstream endobj 1788 0 obj << /Type /Page /Contents 1789 0 R /Resources 1787 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1781 0 R /Annots [ 1793 0 R 1794 0 R ] >> endobj 1793 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [213.6732 139.8244 286.8984 151.884] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj 1794 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [209.702 61.5153 283.4678 73.5749] /Subtype /Link /A << /S /GoTo /D (topology) >> >> endobj 1790 0 obj << /D [1788 0 R /XYZ 56.6929 794.5015 null] >> endobj 518 0 obj << /D [1788 0 R /XYZ 56.6929 603.6807 null] >> endobj 1791 0 obj << /D [1788 0 R /XYZ 56.6929 579.008 null] >> endobj 522 0 obj << /D [1788 0 R /XYZ 56.6929 208.0964 null] >> endobj 1792 0 obj << /D [1788 0 R /XYZ 56.6929 185.8944 null] >> endobj 1787 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F60 1366 0 R /F41 1238 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1797 0 obj << /Length 2468 /Filter /FlateDecode >> stream xÚÅZ_oä6ϧ˜GØQ¬¶Œ}J÷’mŠ6Ûfs¸‡^œ'1ê±SÛ“ìbÑï~¤(yd' ºA Š¢(ê'Š¢äá‹þøÂhËL-ÒL1s½XmŽâÅ´}<âNfé…–¡Ô×G'ç2]d,KD²¸¾ tÃ×ëߣ?žþz}vu¼:Žv¼ÔIýpqù/âdT|øty~ññßW§Ç©Š®/>]ûêìüìêìòÃÙñ’Í¡¿pt8¿øùŒ¨W§¿ürzuüÇõOGg×Ã\ÂùòXâDþ:úýx±†iÿt3™½x‚JÌx–‰ÅæHiÉ´’Òsª£ÏG¿ ƒVÛu?- ÓF¤3 1 ÎX"…´ÞÇK™Š(¯±äQñå¡*We3ƒþ<èŸ(¦@ÅŽùzÝ]7E€Å2 £¼Á2cÌ<ËAã2TIÓ Íã&e™€æ·ÉûÕýÔHÁ+ž½‘ƒÆŒs€ƒóp·b·T¹õ$ ú截x,*G–Ç<²n•²£ru_¬þ¤å£cÅ’8K&þu——5öÃÐÛ£S#Ñ5[ëU+W¼hÔ¨Ç_Û¢ýJä¶îËÊõ£‚–Å’¥SpÛlë5³–ň˜AÓТO5Ž ~@ʑ͑JŒÍA‹QØÃ™ƒÂ÷¹º)Šš(kO±ÆÝ’¨¨w_àx|Ñ„>ïýކꪩ{Î _Wn0Œ~NÊ..à€"qq€gÕos€sØÆå¦ìËÇ‚ª»HÂå¼'¶³œ*ƒž>Ð0ÆÖ!@pÛ }*;h5 s°=ž92-¾È"'üÐÔã z,7Íã„3tº)îʺ.ë;ªZ ÛC¥te,£‹©L°*XµÎ%lpÃÂn´±ò'g…æ°"B*TXïTÏ,`WÀŠ[èL¸4Æ!k¢žÌÍ{8õ`š¨£Ø TîeiŒ½CÖ°TAfó|Ä3&Àk‰@©óýÁÌk\†*g‚‡ 'AìpÄU1S&{C—LT’©45cÅÛÒ?aÜeíÖhî,ŒYÌ…_ˆMÕÜ}Q Ãk£|œ3_®¢3 àè6ÀÀh`(<ËŒéÔ¨ÙÀ¾™¸Ø™Àöìºò®FGCnNÅf™ÛÐi™õšdi«$ÓŽÚj*Ÿîbh¢¼h$´)ër³ÝÌY:ŸçýèÍḇ@æ•q˜9+.pÕŒq› ˆÛ¦ªš'«QšRî|óP°Ë•ÊW’ÂÓ¡,:’¡AVEi­¶J,«ÙPmèe™p°R¯lOæ¾±‡2Pe±Ö5?•UEÔ]ÑÏÅ›pæk¦}žw[´-!–©©(ÖÔ® ͶŒ[* Uh©šU^U®ÂZ €]0h« ‘ퟘå*¥¢ËâKOr; ì°Äšrª¹Êz97«±±±!cc,‘Á3Áxb?ŠšœE¨yâüóÛ¾h‰¤Óe ð×· ¦W)œJcsà°E-n0ªXïŸqßNÉ lIi ð»ûæ©&òôQÖ!ZÔ9ºUà­µŒ~ä'Ž ÒcB-§Ây˜äM«Ý:h¡9³Ãt¥N½OLÌÖBÉ©ËkZClrIŠNÇjm¢¡ýy¨§ëa•Ú“UO„î'ŸówhélŠ–mãÝ…Ç¡…yuMgX6Œ®Üèþ²4#¢§R³‡ÐøŒpw=s`fÌ·šîe ˆõË–Èué&ÚW.Ýw0TGˆœ«ð ¢gJTÓö”#%q}³F É2|^™vrB"çTZ<°¡„H ìÌ"ù¾×?ž]u[¶~ÌÛÒ8Ó‘æ cfÕÍiÿؼ?<‰PÕ…¢“S7Ü7ïŸ6tå÷c–ܱþÞ/í‰wBaèy¨=0«*ǃÉã‘øßmç0düSÒ:†˜Ôå+&·a뫤Õì"¼)pâ''¦Àñœ8´zÌÿ'àäaàäKÀ‰¹Ð÷mn&¯õ8ù½À‰7ÚªLM檧8=´tP¤Ëû!¶=ãMûÕ¾ýzdÿŒ&?‹Y7¤ÆÉEf’f_SöŸ„Q«.½¦ ~HÝÙW ¤Ü¥¸kêüÆËÝ÷ùcis0«Ñ½Ã)HÒa”»Ï«#ÒžŽPNŽDàìŽÄÃI¦\R˜è¾}%îa*ºrSVyKLûh¡½qzd<ÔèÂ4OÞÉ{Ä’^{ÝŽÿ‚’DŠe싳â*Èõ±Ýù †+ ê2›™é¹ä/ó8"éSÄ!C‘å6½&Ýp¤{j”ÙNÇZäÙVÃü5MÂi`+MÃjl¨Üݼ ¦³dÅLlpɧ0rX{#hí•S1q³"Ø%öPqž RarfÕMr0`ÑHÂß2€C:V¼,Åã5„ÆéÝWŒ¦ãžLKŸê9›0kz;ö±-ÌãÙ|.9˜Ï%š¥Zª—²¦ij4MåQ£P9;àd&Ö+Ãâ8QV?⧈¢<…WW]áøÔ® {éTzÂÅÔ*ù=ä%paÝV}9'ç-׉쮬ƒD¿mÝÊv$ô5ÅŠ×Ý“];lsqÉ~ÔAÆSGáí¶"žÝ»‰½cã×™»m8ž‹w:r6.Ú˜’è]<œš>ãTU¾²V+ VÛa•r€µ÷’jlDŸy‚”œA°ñobm +°lüäuÌt*ö»hȇ¢Ý”v³‚!»ùç}i÷HØyB9X9à@Ç ôÛ™ƒv‡Ã9›d5e=þ±ó†á]Éë™{k²ï០ÿù£êšÝÓÔÜÓ-¾%*ÿ±l؇û Iüj%¦˜½Û{@ÕŠ%©ÆÝ+…ý¸D-íÝ‚ˆ«à#µ^î¤÷¿PO4âðŸ!>–þŠéwŸœš¢`{I¸Ò¶ì}&dž5aª m`‡>óKÍðÛüÌhðïÖù»°û}$xÒq»8!sF¡á©žZ>üV`ßôÿf\endstream endobj 1796 0 obj << /Type /Page /Contents 1797 0 R /Resources 1795 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1781 0 R /Annots [ 1799 0 R ] >> endobj 1799 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [353.6787 61.5153 427.332 73.5749] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj 1798 0 obj << /D [1796 0 R /XYZ 85.0394 794.5015 null] >> endobj 526 0 obj << /D [1796 0 R /XYZ 85.0394 134.2704 null] >> endobj 1324 0 obj << /D [1796 0 R /XYZ 85.0394 105.3909 null] >> endobj 1795 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1802 0 obj << /Length 2962 /Filter /FlateDecode >> stream xÚÅZÝsÛ6÷_¡ÉuS¡øÑ<¹©Ýs'uîÝÍܤ}`$:æ”"U‘ŠãÞÜÿ~ ,À‰²“¸77† ¸Xì.v» ™Í(üÇfJm¹+‰¢LÍV›3:ûß~N0½¹¸¼¸¹¸~u1ÿuùÓÙŲÓe¨/£Â)òûÙ»_él jÿtF‰°©šÝà %ÌZ>ÛœI%ˆ’BÄ™òìíÙß;†ƒ¯~é¤ý%\h>a@Χ ¨,Ñ‚ oÀóÊé”l@É4¡Â`ïHêÝ:ßjj ÑijzfŸ¡*'6MÓiE‘ábÈ•‰F)ÑÆ¨±Í6_=†sN$U6èQ4xzëüJy•¯ñ5 Ó·uYÖ÷ÍwŽÏl¡5(@ÕlÁ ±‚§žÃ»U™5 n¤Äp#MÀXب£Œ1AŒp“ ÎÁªg[¬ã¸²ô& Çà8 w&‹dNÈ*ÛäS&Ä2*ƒ&¿¢iÞµÛ|BmÁÓ<úI$imÁŽ4Õ¢Ö‘ãSZ[K¸5òZ÷Äc­ eˆ_¬ëMVT‡Š »2¡þ<Å;ŽO(.¨$šB`)þbJsK êìXóz7gi¢þ='ÜÅéŠêÃç…\ò…!dü‚«ÛùB(›Tµ{¦!VüT1gIºx.\”æëo`&ÕI{—ã‚u~›íË6,i&Ñ+…h4ñ€Î¯ÿ5 ÚʨAv(\„³àÑ Ò6ïöòOÊf‡²¥'d3‚H.ÕgȦ—Í;ç`#°wjˆH™38#V)ÞAc/®;]/.a×½Dtü…s9%8MÁQ ¥¡P™[‚f"Ægƒ ©¢YÓ‚›4¿Á˜”Ö¡— áG»Œ²•ù‡¬ÄáǬÜçHï&„KSà ÄÓ> a\ DÂÌ»yþÝhQKü3'"†©ôsbWH ¥æ ݪ(-"2”×Qà†¸BáfTj¡•$)UòD‚eŠHˆom`iЉœÿ|‚„ylQ­ÐÕТ7ù*`‡;/I£‰Ý KpÜîw˜{á3ঢKI‹Ãàp †K› ù” y²ª+9ö(Ê¿ÞíŽBÜ úð¿Î«ì}™/j,v»&oCBªzÛu…¬³v, vu«z³-JÇT@T»º`“»ä%¤Û« ó~W‰¹*ÚÂ' 1ÐÓ%ÿ¹¾= ¿¹qpî¾(KœÜdíênÊ,]¶t˜‚ÎÞgÔñyt¤t´O!ÎЩžç¨½ï÷­âÿ#g1m‰0P~BÁ ‘#̰g=ê]9dX™ în weF>Þ»*©ˆ2Aí²Þ¡•óOÙf[b"ÿöRãÒ&TRbì]qíBSšüÛŸy,AF'JSGuuOßâøÑ9>° s£wuÓ’ ~óƒ½_NyÙ€ Ãùe¨’Æ‚axüçå¤PoðÔZ„žàÙZ'«lßä8̪` 7Ûºj|e¥¯¬ü7ÔÑ·ÄCˆ‚IïóŽ;É ‘§ö.kqæ.ûXõUåèt¸åà,,Vn‡&œPâEKvPe:Õ‚>šý­“Ö#CÃ’¶ŽerJ(ãf|YyŸ=ø}ÿ$ò>’å\Û“œ—¡v­vCn_‡ôCˆ?ä'÷H”(î 0åDÅ,!«õ=ì0*ŽM®(ÑÂÆ–¥i³6ßäU5ØnóÌËÒ·ÊUuh4à\!+E áÍz‚Gµ ›”EÞ„Ö:û”J1Vúû‡QS„ÉâA<ÇúŸ_ÓD˜ÆÃ¥þ¬ @m¿…¢óT pya¿ EÄ)¢»håVBgŽåQÄÚ. :ñA©g YZ‰Wl×ϬfØ%x Æ7€_,Y¿<9ºžÔ@Ð rkÊÝÖ³ßgŒPi­@¢ÁØëÚÛÀO|{µá³jÐh6P*2^ 9{¥4âFêîÀ`éIóPòÀK¦Àõ\©ãF»¼Ì3—îÅUYp+)­÷Uo=ª%…d®mUsX‚‘5ç´¿O -‡a]³ßEî·®ó ˜7höÛ­ƒj×ïàŒ¯ºÐÍ¡¢É×jÝUðŠÉT ±DÒ6yïÄ{À1ÄããbÈ´W—EàŒëWYåøt ãYÆE˜ì ²ƒ—¶ØäÇøòêö!4ð‡¥á°ÄÄÝG¥¦ú·Â'b ܧ¾œÍ{JlaŽ/%à“;»ãº ŠžÚt6Œ ç¥ eÁi¾ n{2†q{¦œO·,‘ŒÃ€™Tw?¨0xWpª‘åœAu¼¯ÂqŒÀŽçLp(RŒÅ[’‰'h1¤zD–Håd)¡¸Z´myôÛ„¼u‡ðØÆ‘hbãQ=aàoü6oCëÓµ6Õ~óo%8vðl ŸTxÓ!\yÍR¶Â5Ü×"ð¥ô5".Ø}ŒLŠj]¬2× ¹0£iBq~]4®y \7gz–*w›¶¼‹Ùä£HaÌxLØ×o–S·³’*ð,9Ɔ˜%7Aë|MÜ}V4ËS—†ÇEƒئ<uPÓNÝqÒÑm!hÅh¨ZŠjßæ ní³tµ>¨6Ù§b³ß ®r1B‡¥Óòh"»pœ8âXœP~Å¥l\¼ŽÎ #¡îhj‹´Ø‹—þÐTô) Ú@§Þâ}JFL„Ñ×oß^¼Â1èX¬³Ø6«ä6+ÊÐ7W?&Ñ×Ác–®í¿qrõŠÅÐvö­C5 Ò{}W˜Åó©Cýœ…‰ ®E+ñ·¸=*ù:ã ®¢±M0†°hâʬš‹œB)&±%£Ôê4JuTÞPÙ§Eå5Â*ÆŒPïßQM0ôRÆ¡wquûH‚åÜ(¹{ "x½_ùË™Ty{_ï~Ãí.ëÚ¢~Çàâ.™¯p­/ÜÌ6ßASYqå/_¸W(ª2àдuï‰ð­Ê?€§~ ”YÕÜç;<–k.Ü¥Vb AÇæ<¼;KÝÏ`rø£. ô¸kyg'z 2”³ ˜ Å>x%Æ”[‡‘#l…¹¿ØjÂ\Ð_Šªû÷ŠöˆåÈ!¡L Rb,€ªé@õØHJÖcùçÇ*Îzãã¡…’ ûá‹Ñi8œ@Ûõ|}ÈGÞÕû]Œ‡?Ê@B%ÿ:É¡¢ £IòO«!Æ$&Ø+ôêÆû/¢²û£gØ‘7…kASß@ùYµeèšS¨n ‚XèJ×Ý­@­#T ×°Bø´±á÷‰é$¹¬d4{ŽD§Ñ(E3ŸÆ"0‘µZ<ºwGt¼ù‰ÀÊÆèÑî¡nR:"»¦jC ¦1Ä`pW¬îFkè⾇Ô}2ѱ /ªl÷€3Î)·uSøËây,t?Ðú\ˆÞš0)‡c_Ú¤!OÂï R•Üçùo8å638tî…¼ð7f©ìJ’4äuXý&ág7Ùâå\*ÃUþ¾ÏCª„Ù6¬èo'ðýíÅÍLõÏKwq~õú\û>Gާî%qL4qî´»xöß,õý‡t?H§|ÚƒÂÕ¯ˆB¹0ú8\Â7‹þ_Ñå,Ñendstream endobj 1801 0 obj << /Type /Page /Contents 1802 0 R /Resources 1800 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1781 0 R >> endobj 1803 0 obj << /D [1801 0 R /XYZ 56.6929 794.5015 null] >> endobj 1804 0 obj << /D [1801 0 R /XYZ 56.6929 691.0694 null] >> endobj 1805 0 obj << /D [1801 0 R /XYZ 56.6929 679.1143 null] >> endobj 530 0 obj << /D [1801 0 R /XYZ 56.6929 271.143 null] >> endobj 1806 0 obj << /D [1801 0 R /XYZ 56.6929 246.0455 null] >> endobj 1800 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F53 1333 0 R /F41 1238 0 R /F60 1366 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1809 0 obj << /Length 3361 /Filter /FlateDecode >> stream xÚ½]sã¶ñÝ¿Bo•gB>Iâѹó¥N_j;é$y %ÈbO"u"iŸó뻋(~É×ifz7c‹v±»ØP|Áà?_d:fÒ¨EjT¬׋Õþ‚-ž`î‡ îq¢€õ±¾¸x÷Q¦ ›D$‹‡Mo¯,fYÆë_—ïÿzõóÃõÝe$4[&ñe¤¶üþæöA 5ï?Ý~¼ùá—»«ËT-n>ÝøîúãõÝõíûëˈgšÃzáw8³àãÍ߯©÷ÃÝÕO?]Ý]þþðãÅõCw–þy9“x/¿þÎk8ö,–&Ó‹°˜#û ¥e¬•”²»¸¿øG·aoÖ-“Ÿ–Y¬3‘ÎPˆž9ƒ¾J©6q"…t¬6—‘”ÙrWÕ öÌr•¯¶¶&(ÍšeQ6ö¸·ë"o,ÍÜÝÕ¶ñX¿1Íêvµ%ÜÜCoï©ÍË5M<íZ¿ø þ½»¢þñ’gK»ª\»®a/hB³µ ̺ڵMQ•(z8Äyl´î0‡R­l]ÇÕ°˜i°š”§±âJΛ¢GŠúX$I>gŠ ‰ï‹2:VeD™ K.²·IwX3´Z”*Fñ!ñ’ÐrQìÛ=̲l÷öH¨JlIDUCµ=>ÛcMSÍ6o¨WÔ4M"ÿÒÔYÓì¦ò{æC,[7#„†Ø2ªÙˆjE(Ö©4*– uÐ×l¾ZÙCc×p?%gá¸l¹¶›¼Ý54(œèß}TÙÀê“8Ó©)ãF‚P"Õ±IÓÄ#L '\›$•qÆxòß\j™9•Í_j†:Ž'~~/ZÇ`/ߥã­¢À]”0 !w¿“ ˆë8*]$ ƒ8™ÍmO:£r‹µÊ‹ãÓe”ðåüËë‰h`S :\$<‰•LÉ.¾,xÌ”1’°z}wÚ“àÝÍ^,>Tp¦EÿXa稿µ;WÂúÚÕpÄŒBÆJ+²–[gh)Øñþ°³{ Þkí%µ>D@ÏL®L þ1‘‹¾Hÿœ–d[ÑÉÿ9ŠÀ]à$^‘ŽÏ»3ˆi :ì7½Y‡…"¬‹§è9ßë¢yœû‡ÑDÿ©ŽÓ,‹>©g X3| <°›&F¹?ØUñcc’HïSÒôäÝè¼ÀÖù«Gž+‚ùÉrÓ6-ù*¿lmI(nïï¯ßN^汦ù¼mª}Þ¹¨”Å™zè¢Vùn÷ è,[>ÙÒs2:bDt-5~gr[Ì{fhׯe¾/V4hkØÀ/Ä;–½„{’å hÿ*Piòøä¯×]O ~Ô_0ÕÂt_§»rA×±7á&±†K;àfb Ö·x˜ì†¡è=ëÕ‘ûÕ5äPØÑ@3Ñ#¥:ÃÛaÃ8ØKá’èÖ}«DÀ¶z¡Î®*Ÿ¨÷h7UàÇŽ×WêS¨¥žŸÛ£èJ›QKÓÁ©U"—7š-«æÄ_4—"ÓëïM§!·š½”:‡ÙG5"Nhî 0Éß)êPÒ«òÚJð.»N)z;ª$×?IÔ¡³Ç*FyUáÖàµþÎkÏ„› NŒF~Á Žs îÅÙ L¥Ôœ6¯`×ãKÑmØ ·0K©ÝVí±ÆÌ%Ó>s:§Ì%p9§­Ï&;å7}ï­ÒXð4óáZ²™ü†«Ø2 Øï©x.ÐX±¾É¤^ÚC75dÂy+hSZÀß ã¶hZú3lŸõÉ( `‡ÖzÊywGaÀmõjócM—î?—&ßEÍ$¤/>ózèâNnY,¤q§tXˆ¡]¨(1•$gæ؇‰šÚ¶D«,ÈQ8—.$˜jãñ+j«Ò/CíR¯ájàbÕ ^6c¢a; „Iá&3FžÓ¹wž Èƒ|_µ¥Ï~)ÁgËÕ®Z}¦nýÙ¾\±<+#²•¾9q -¹·•³YÀÈÂŒ„lM…º‘ìÖ!«W# ¤Î}ű³yÝxXm¡ p†{¸ ¤ku¿^1¡„È–÷Ÿ®ròù4&¾.ù2ì* ’©3(ÎÁ»§éÈ¢|¼Ùç5hüqçK ·mÂmób­4¡yÎEÕÖ zõ[º²;Áí“ÑBL?[š*Hz7úíÒ´u>™ë°‚ý•ŽÊjm§%j’Ä2“ÉÛ,tX3< ü dÁ2QfÈ„Kä6(r2Þw¼—ÑAßéˆ_ZTètí—Û¯2•î:‚s¸N“§ò¥ÍË&lïó=@@aø\.áPEgfx×È÷¡©ùƒn;ô^Šf;˜*í u ‡üÛõ¿.9ç˘ ߨRûjP¥.½ãlÖ§±‘"=W¨ ‘©è ÕófÔÇ:oFÖØŒ‚c±¥,‰Á­§oóÑaÍ028³áPß ù8Y’ÐN ¾Ï]¶•s=ê¬ úΚ„š&÷n©óM"d<f`Wîµ ‡½‡%2a´0oJ˜½TCCƇ†³ ®ã\ÿŸ–J¨&¥è lξ<ßß²/ÉΧø'ûêa½a_kl_ÍëÁN,K(…Yò6Ö ƒÓ& 1dádZFQN¤@ùÅ3Y î>Л0þ¹"c•zè Œvù2ŽÛÚy&èyíCÏgÏ>»RËÏÖSëå\jü*Љ•’!dCù%œb`iß¶%ÁÕ%!JC­#ÕŒ¸‡…î½,ö/x¦ô0ƒ¸Ab\QâÄ5F:(É«p­\/`òc¾·”kÃÄ>¥ŽÇÞWÏ´‰O¡9©šAÓøŠHñ&+HìAÛÇ"êÝ&u±™2PO5x.GrÙ¾˜h„.ÿÊÕ ÂÃÀĆ<ÇžF>#ÔᾋŽkôW ¿j›¾`5~²‘ùͼóTÍ$‘û¼Ymݯ‘ía§unmš ‚óUx5ÈÊš^%fŒFéX¤î•Ï}T8Îe–"NXW…ËõŠhwgÂA´‚üð8C—*ë[åhÿ™ôÿº½Œ%x>W}K§£HàPQîZH ‡ÒL oâKîÓ=JDYÏ*ºä±¶ý©¾Y°3š)j Ö]Ï¢ÜAúÓÕkÓƒ%PŠ4¼æ¢¥œÏ?1Îo;ö>ÖyÇÞauŸFì’…m„)òwtLÈýfÁ»9¾Nqpòüú3ò„7ÐaÍœaðüd `–J á}„ÿŠTӊņôµ#€3ìÐgŽËBÅ_|a+2ØÚ½…öoå£ÝæÏ…+F¤\:-™Æ&ä5tïžSão½T®0þÒbR||õXÊ×6€GutVÛ¼|²þ ›#tìjºÅP‚æÅÎùè7Ǽ¬7–^0˜^þR#)`‚/wÐq²TS‡CR#êÆôÊãy3áû@üa ×{0.€âS¤A' ¿ïéÄ,ë]þìñ‚îÜÖëÙ§4üÔVƒtšêX‡Ú¼iBù80 WŸ?‡Ò˜)Ž',[6õ[ÑG&òdqPW…·„“‹BغǎŸ«¨uÂp84î>:˜{Ch(Äp02½jg/rkláâp$ s9P@ŽPÏx£•ê@Ï=R8°&£Tbù´«Ýó‹Ïw%˺p¬zÁÁI÷0pïÔ%;ƒNP,⺺ÔMûH ç=y? ·e—ïsjï*ÿ Á¦ÒÔÿ=i…'‚zº‡/ˆîq üüŒàhâX÷®XÓd~8t"œ &RC|ç!ªŽÝô\œ„\„×½62"C¹ Ã) Ři#—?G‚C¡ÒUÂBq#Fd|ìÕ:NÕ¸ÞB_¨|%eígçíæØRIœbBÛ?y?ºŒÃ¨‰•Ê‚ 4óݹ;•Ïä%@Id<‰c#J)ÄY–t.˜IFÔh€£ƒžìø„äßøÍCé|\HË:j×H?þ˜k 0y¦Þ¤Ý!M‰J5¨w¸1é€ú½ûý‰`á:ù|lSPÕãëø#ìýòágê<¶¼ç˜xdÝ͸R1^ýw7ÿ8 íЗ÷)ž–ÓW<ðtùê38\¾¬iì<[<ã×g¹Jáëè-òŸè½ë’½Ð¦XϽÁ„æ‚:Ž9˜U`!A“èÖÁ¸j›ºX[BóEþŽÓ¾Áw4xôjˆýeãâ:_ÿ»­ñ> endobj 1811 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [315.1789 561.778 363.5077 573.8376] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj 1810 0 obj << /D [1808 0 R /XYZ 85.0394 794.5015 null] >> endobj 1807 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F60 1366 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1814 0 obj << /Length 3690 /Filter /FlateDecode >> stream xÚ¥]oã6ò=¿Â°Vù!‰p8`»Í¶{¸îö’ô€CÛÅbbÝÊ’×’’MýÍp†´dËɇ VäpL‡óMÊ…€r‘¤Qš«|aò8J„Lëí…X<ÀØ’qVi5Æúþöâ»÷Ú,ò(OUº¸½Í•E"Ëäâ¶üm™F*º„Äòݧï?üøëõÛK/o?|úx¹R‰X¾ÿðÏ+jýxýöçŸß^_®d–È廟Þþr{uMC)Ïñý‡?$§Ï™I¯¯Þ_]_}|wuùÇí?.®nÃ^Æû•BãF¾\üö‡X”°í\ˆHçY²x‚Žˆdž«Åö"Nt”ÄZ{H}qsñ¯0áhÔýt–RDJ§j†J˜É(Éóda’ÞPˉMþ§ŸœOZ4I7ÔLxÕ„µ¦ÒC‡l¿®m×U,?CÇ ÇkøÞ¾ûåRª|蹌Œ”é"5*2YŸÑKBZ±H-åŒ] XHÙ¶øºÊÝ wy¼¸”Y$%èï‹«¬™åÇ (‘Èu:]ÿ†4/$Z:“HR¢µ¶Ô§3ARYhl›îô±ãI?Ú®`³…Ô¬Agõ,b2Ö37«mJZ‰i¨ÉJ½2B.ÿ}™«eQW%á;`!W™Šbc’3&D§1éˆN²‹ˆEžRëw‘žÍõA »ª´Œ¾©¼/šžŒ©†Ö£uU æ°~&hQþwèÀ8Ą̂O½¼ÝðoK{_81ÆŽ[–š´LâèŠædšfh{´Ød»Øµ õïÝ•h`úUûô˜¤2Qf2Ãp,G§•‚ßI€±âàS`ö‚>M۬ۀߎLh;2 ?q$S8IÓ=ÙýšóVîLegêœßøL'>L =ñaJħ> ‘ȇ9tòGØû0üepK8è}Øä71)€MÓ¼ ½ÖŒ‡;ïÀ`¢œà!4|›Òî@K€æ©5#'¢|´û¾êÈ| µ †ðnVÞõQôgdD å P|ì¶lºW„DÏI2O¾'M"©R3uÀ7,šLºß9á<$|êö‰,SØôî@LýúªmŠú`ÞiÒ}á6ŒR±ž®˜†† ü1pcÁ³!1:ÊsùŠGc÷‹4LÅ)¬í xKÑÄ1è$RÆÄ/°f¨˜8†ÂÊ,À„Œ›]WH…3ƒÀ3ò̼šÛLŸk£øá÷϶™`v¾“ˆÎž89­’x`&{¡ÁýÂ×£]üWvu:/ Ûƒ(J#†NèÉD”iÄ_ämÀzŠ“Ù:R{+žüt‚áÌ8pûî}<1Ú|¹ðN³·_û5ŸcnBHoHc•F2N§¦çiS­1ˆÙíÀ—N;Ïуí#;Vò,G:dRv)*¿oÐwe.ìÚõ„H®]]¶=Ús­¼7†ÖÓÆEÐ*èC–JilB«)RYM2¡†'ó–—˜¥ò(!´:'&« }ÎýÁ”u[”¶|3êB°X˜×X¥#-R¢ºgš¶ÝVLs×ny¿.lp»°>GÔê©z­7vý©SÚ+)н|j‡º$(Š"~wvܱ vš¨õ¯¡íx­ôAL§ „Ô–Ï^e än^Åé\0h‚áO¿+ Zuá|úWs0–"ñ"ìöºr‘À¼¸gi–q}vçQœ¤G‰G‰ªšJ³uÙünç”`ds†y¥‡ìhÞ|)ÅY’ï?Õ>hÄé·âk^ ì¦:@­;KŽ/&cý×éa" ¢%ïx¹ƒÕ"þÛ úö±íyªz”5Í!ˆÒfÙ$¼qŸ€µ}´5A‹Îÿ€T~™’†HËÍ9)c,åß e©ð[]· ®ð‘(¸1×Écâƒxƒ[íí–­I†ùY÷=+´}f*YgbÅãz óæp ˜È%]„ nXIȰ]Å F×.†Ójø¶﫲¤Ì ÌôÙ‘}\±MÅì ÑÓ·jÖõPrŠºXy’§ ü c $ú*X¹o↌„I¼eŸƒK) iÁ¬¡€XÁ3óŒCT1¬‘{GÕîçònÒÄ{<Ç›ÙyRÒmŸxºÜï(k9•½DÙ;“ÂÄ.öPæåfŒu>… XNê 8Ú­üÉìþ™C,0ÌŽS©4ØÒ \Ø‹d¬:§œŒ£8…ˆgB(Dß®(RÔ@lø« +ÕWE(e ™- n‡-ò4^4%bõÌ•Î°Ó Û;ÎöW2UpâÇ¥Wr¾¾ ¹ö\¥ÔXøÜBÐ[4¶:‚¬/å’XG}RehÍ35à× 5‰©®yHëåÄÈip¯FzñúÛŒšÈÄAØ¿ |óÂRø]siæhÒ ²ª48Ò¿¿6'sPçÁVçÞÌçKNÃ…tÉ>9 ÈWcU‚Š5åÉ‚ÉBÎøû‚|YRQh·ã:CvT!ȼÄÎÝHØQ*ô7¸‚$ %_š€•z°/»~\Gs_ßS«ëK×TúÈ%ŽŒÅ F×,7úú¦‘ă;ò“¾rg}ÑäáÁ–¡€ÄÐM…r —\&w,R0°)=@ê£H›}šLÝÐì6B›f[¤!}!ÐÆUs$j‹“\h¡¸ÒˆL0Ýà‰œ¡ƒ/‰º¤øxA‡fS#“a£ C¼r_|¶L®;Œ@_×ÖöL]ÎñJº…3ÕòÃ=ØþJ¯é£:œm :˜ S $GU.Dz¹xu3Ë‚éAêâ\É#©§ÜuÃÖúÕ >ìŠ7R1M¥-jV éÃ,Wr#)3 ,ežß5+æØ®m¼µJC.eXbÄäÈ+ Á'ʧÃÑ»)%Öj>1!"™;:zÎ W÷+ÞÓM ©: òìoæjè¸ÄìLi,„´Ί@w¶³È„ xñ:y{ ÏÁ?lãŽÇêöép‘†.̆%¨þdpwhÄÛB‡ÄÔm0œuĹ)¶EÕpÀ|$ªCCf¢œUT`ìL8AˆØs~ù4 Ùx’¦˜=h¢ÙÊÅË?išÖyþ„Ù‚®ŽâM4ü»º¢,†ÚÃ/'èYÌz¦=ÙÜùQïÿím˜[ÂK`KšÉ)÷Fê*fŒi¬¿Â^)¢X5º\ùVKcYcÄãXeÄca0â1Â^ôT6æ1výMK¿vŽQºkä6¹ÂE¿/B­¶»Ö]!8ä¹ê °1‡¤ŽÒÞÇ3~ÓsÁD¸Y¨‘ U±”bLš¾ªŽ±Î‡ª‹¯¾«ûçUiëâùôþUEIÚñâêkfùÉJѤӓõÉ+0‘ަ%ªKÆ¥ƒ)Äö¥ËÏ2¼`쟬 CMÉïŒO!¡E/RÞÁøÆ–ß7pA4Þîñ@>&ȇ Ð Ï’(7ÇåcL3ü†š u‰ðÄŸ ü-<y…W·½3¨ü¨ƒýÖÇO·Þÿ‡ó‡ÃFŽC–.¤q÷¾ð¦u9îôþ (ëIyêúÅâ¤_lLâc;|¬QÔ¤¸+GîŒX'‘‚Ðú5±–ie1ÈÄ‹b=Æ:/ÖË[š}W¬ìWp“À–ù÷ Äÿ`g^&#`ÍÐ1‘ïc™M ¡CÎÇyt®oÞbÃ,=}F"ñ:@py@wUß1ˆå!ENu$üRôïNÇÉÓÀüø@ è¹¶ ©–«£Ä«e2Ÿ¼(¯Þ$£‹\ìè¿1•à¡ÏO …Ôòdt±°Ãåt¼¹¦*‹ eÑìÝbuLJmiïÆˆñÒ~* ÒñO“㉠ ‚ÓšR” ¼ŽùÖ¹IÃC;™Âßå "~±ü~¨ê~åë !#s5ª±„r騩2Œ%#52xôÀƒ¦ÂwtÔ>V¥å×(TžÆÖÆÖ»û¡&IJ*šâ®5 Nh W,ãGm™+O!ÜÇ r•Þ~û­a-"€?<¾£—œ Xz²´ëìP¶«¾Ý­\ÙqU¶–ÍÞ©(MŒ±îª¦œ¿R&¼•q$¯Mâ}‡7Fï~zûéffBÈ‘ó,dÙ.YÇG¸æóû-cÅ48î®Ø÷Ôr¬ÂaêŽ8=*èi}ön×›&ðø´qƺˆ…—Ôÿûåáyil"eêL!ÈdQœÁ$L²Çd§šŸZž’þ?ªòíendstream endobj 1813 0 obj << /Type /Page /Contents 1814 0 R /Resources 1812 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R /Annots [ 1816 0 R ] >> endobj 1816 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [324.9335 570.1857 381.8296 582.2453] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj 1815 0 obj << /D [1813 0 R /XYZ 56.6929 794.5015 null] >> endobj 534 0 obj << /D [1813 0 R /XYZ 56.6929 123.8878 null] >> endobj 1817 0 obj << /D [1813 0 R /XYZ 56.6929 96.608 null] >> endobj 1812 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1822 0 obj << /Length 3028 /Filter /FlateDecode >> stream xÚ­Zßsã¶~÷_¡·Ê3'?LŸœ³/U¦çKmµ“išZ¢mNdR©sÜ¿¾»X€iˆÓ*b2‹giGŠq5[¿\°Ù¼ûá‚[™…ZøR߯.þüI¦³,Ê‘ÌVž.1­ùlµùeþñ¯W?­nî.B±y].TÂæß/o¯i$£ÇÇ/·Ÿ–?üãîê2ç«å—[¾»ùtswsûñærÁµâð½°N|ðiù·jýpwõùóÕÝ寫/nV/gü~ñ˯l¶Ø?^°HfZÍ^¡Ã"žebör+©XJ7²½¸¿ø{§Ð{k> ­_'³q¤ÐRôvÿ4£Æ]p½U%RÈn½…­·“Âõ¾/ÖmYW— )h½„®ã(S\Ì|õï&ÝIMÌâ½6œÆ¿™â4‡úŸl¾ÞæMƒSï¹÷},¢˜óŒZwùro¥|+1‹4¨&¡×çrýLÚˆ´7Å.ßçmA£ûK®çõ õÚç‚„6Åc~ض4úµ,^¿m†‚§‘JâÌZ_ÞæÇEÄÓXX‘ˆ®›–T?më‡|K£ëºZ ð†TDZ«›Ã*a—މ§€±Û(çõÛ©À•eIê$JTâ–1ßnë×Åï‡bÿ˜¬R‘ìæúÔÆ|^´k·gbþZn·d:ßí¶oÔlkzÙ>Ó¢KZÂL8‡–$šú¥°Ÿ›°m½†y½‘LýµØïËͦ¨¾ -¹æ‘L5·s¬ê¶| !i”€ßuPÞk‚àãS"í/ò¾Xö ®pÀ×P‹ÝRV›€ZžER¥²·ÜUñºøO]M@g M•uÛã–™*ß¾æo µ›¢¥,¶Qk_ ì›Lt·(!?´?’G)CBáÀÌR'äÇhŠÏßê5ª¢ØtÖÍȦlò‡mA£Æ6 ÊÔ>4Ç÷ôuç®8úPÀÒX'Á~½§çs¹é¢— ­Ü¶‹² ¬¸”:Òq·-#DÁEê¤(Èò7 ©ÀøªÊêÉÅ †oSÝw¼"(Å»m¹.í¦8mÌP>OQgŽ\«qž9/jŸskè%o×°ÚÎ?¶ÎXYTm½Ëi b"!Je¦s'´ð¥ˆÍy §tRf‹.Tzy¼I3û *£TCAÑ3½2Αên¦ÓºÑ¦ØÃ Û~®Û µ)¾võ¾µ_—95샘Ñ4ÍVú:«Ø‹‚¯GI@ÖJJ·¥v>ÑCÙñC/Þ±PbÊ%¬²}¶VÞvE( bdgŽîV?¯B¡ M©|ªrIÄãA9™ÇbH©˜ðI ”*:ÏÅLÁk¶Ç “2a,4hÙM¢ƒ^·eØ©/¸SØ6 7ë2 ´ì>B-S™ÌïwÅ(ß†é ˜Š2¶ÂÚj  ZoF4»¥¢êÔœ´• ë¢iÐp/Ò;vC×)‹‘(<Ò’ñ‰(ô¤F¢ÐIá\Ÿ¡šp¾Ù C¹ˆËqÃN(`¸çcP Š,X¦ L’ãL¯uÃ]bÛEa’ö£ÞQBÃ>\BÓ,³¯óTBa§‰ËønB§ÂÖ¶¼„h$„ ÈŒœ3d?œ¾)á[u2ð$‹2ÁäÙ*W":q‘×и)ÆðiBOû[ƒÃ&ÂŽ¯d”õsYy²ÆÁ{"îëã~âhÞÓhÅ:îGÏc}¨p«ã”ÒkìXžŠÖM +Vª-QâñP™ d™õ-ø`·/_rãØ9ìwµ),bËÐ0ذêǃ4\Ú§)Zà%•)ͨ=+X=… R=¼„y3\”›÷”§à\«Å¸ùN*`¿Oz,2Sý cêt¾¼¦gë:ºÃ¶£;= ;®WTþ›uQ~¥•†¡œ·´±Ðº÷´. c¡êF0†nï—×6Ž`„È“sn*ë,¥ÊÚh¦¢@!Cõ"Ö2.ÏèÔË3»Õ8p‚q‘Bwθ¼Žîoîþys>V&YÒ¯yPñ©šGFp"JÏ©yŒº“åMŠNþm,›YU®h Ø‘„p´#!|CËÅ- áˆ#!Zígœ BÌp7ÄÖðlssðýЀLÝ›3wsª’îXä¡Z! /ÁF¾ÙØY7ôNx×â(p÷é# CZÓÖº“ó˜g²?&æ*•©Õm¼ÃêìP¢2m0÷Ð\´@0l›šZeµÞÌõ_»{—x-UGhôžAcùÓׄZÆeI؃Kï0.ö!×AÜ’%pHËR7)„“fÙ+©#¥E˜úªTŒendstream endobj 1821 0 obj << /Type /Page /Contents 1822 0 R /Resources 1820 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R /Annots [ 1824 0 R ] >> endobj 1824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 755.8266 145.9475 767.8862] /Subtype /Link /A << /S /GoTo /D (view_statement_grammar) >> >> endobj 1823 0 obj << /D [1821 0 R /XYZ 85.0394 794.5015 null] >> endobj 538 0 obj << /D [1821 0 R /XYZ 85.0394 468.6268 null] >> endobj 1825 0 obj << /D [1821 0 R /XYZ 85.0394 441.0592 null] >> endobj 1820 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F41 1238 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1829 0 obj << /Length 1328 /Filter /FlateDecode >> stream xÚ¥šMs9@ïþs´îÕ·ÔG“8YS‹cNÀi©å‡=íß_G£¶¬éFEQ)’øežß”<î™±žTþ§'  Á)¢¯´Ÿþþ±RÓ·üØóJ¿0Ûm)õê¼úãÉÆ ƒ Óù²­*%=¿~Z0°É[P뇷ǧÃóÇÓnÝú|x{ÜlWë§Ã_ûëwϧݛ7»Óf«“×ë‡?wïÎûÓõ¡ð²W‡ããõ7xýoa£§ýÓþ´?>ì7_ίWûóÜB{µ²—WŸ¾¨ékÎ~½R`1ùé¿üƒh¦+ç-xgmùÍ÷Õ‡ÕûyƒäÑŸÚÛ3³µRö {Ù#kì¼—µ#{9êü`È…ºìåÏJÇ65æíéd&º¹;iî¥ÆiÒàý­Ô èhàpÜîO°;½Û Yïw¹Ó`ƒB!žPL|¡ÄxNZã[i?žJ­‹76¿&0ñ„bâ %ÆsÒßJûñTjõX¼ÊËþââã ÅÄJŒç¤5¾•öã©T‡”¿^Rȯþ ¬{J-×Ï”TÏJçú;i·þF.ÇMõëñyg™è…÷J1ñ…ã9io¥ýx* ~,Þ+PÊ ëžRL|¡ÄxNZã[i?žJC‹Ï‰hMâ ÅÄJŒç¤5¾•öã©4ıxmÁiœ¢_(1ž“ÖøVÚ§ÒËo Þc~™ Ò|<¥–ãgJŠg¥sü´# 8Ÿ]¨“°ì)ÅÄJŒç¤5¾•öã©4ª±xŸ ¸è„xB1ñ…ã9io¥ýx*ÍÏd(ÞåS€¤eO(&¾Pb<'­ñ­´O¥y¼Š7ÞE!žPL|¡ÄxNZã[i?žJ£‹W’µÒ²'_(1ž“ÖøVÚ§Ò86á¹äÁaÆ!Ðrz¤rÎ8‡·Æn75ƱÙÎå‰À <¥˜ðB‰åœ´¦·Ò~;•ƱÙÎ9¥Ñ ñ„bâ %ÆsÒßJûñTÇf;—Oý£Þà Ĥ¿@b9c¬á±ßMŒqlªsÚ€‹A¸‚A)&¼Pb9'­é­´ßN¥qlª³èÀ(/,xJ-ÇÏ”ÏJçø;i7þFšÆ¦:›h­pƒRL|¡ÄxNZã[i?žJÓØTg}„pÙO(&¾Pb<'­ñ­´O¥ilªËû ,jáÍRL|¡ÄxNZã[i?žJÓØTgM^)¥eO(&¾Pb<'­ñ­´O¥ilª³Ê@rI¸€A)&¾Pb<'­ñ­´O¥il¶3ygù…eO©åø™’âYé'íÆßHÓØlgB«¼0ßPЉ/”ÏIk|+íÇSi›íŒK ¬–=¥˜øB‰ñœ´Æ·Ò~<•¦± Ï„¬pƒRL|¡ÄxNZã[i?žJÓØ„g´‡ZZö„bâ %ÆsÒßJûñTŠc^>c”pƒRËñ3%ųÒ9þNÚ¿‘âØ„§£Ì{Nˆ'_(1ž“ÖøVÚ§R›ðôå›…Ë”bâ %ÆsÒßJûñTŠcž¶ œ Ò²'_(1ž“ÖøVÚ§R›ð´ÉÇ+¼ÓˆIÄrÆXÃc¿›ql¶ÓJC VZð„b %–sÒšÞJûíTŠc³]>òh„«ZN/TÎçðÖØí¦F¼ë!Ÿ Iwá Ã݃ÿÉÈwàuäþûnáîû¬Ã4xÑ.7ë<ƒü¥½7¿ÿÉ7rÑ/‚MKŸ¡11£’5åI]/@Ý=s­ÀØ`:OýÓUdendstream endobj 1828 0 obj << /Type /Page /Contents 1829 0 R /Resources 1827 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R >> endobj 1830 0 obj << /D [1828 0 R /XYZ 56.6929 794.5015 null] >> endobj 1827 0 obj << /Font << /F37 1042 0 R /F14 980 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1833 0 obj << /Length 1373 /Filter /FlateDecode >> stream xÚ½šMsÛ6†ïú{\Ñ{fSCLÝV?=Ø8e•ƒ ÓáO8VR:%šß¾ÜÜý¼}9ìöëñú&¨õÆ}sûô|ÿöN~ûu÷éùáéñ·ývÝÍáéÓóÛÛûÝÃn¿{¾Û­7”<•ýÍûvxxúe÷¶õ¸ß~ü¸Ý¯¿>¬v‡£ ú’¶³È?«/_õô­hXiesòÓ¿å­(g3}_9o•wÖÖwþ^ýºú|< |úºk¯~ÇÌÆ:•B9_eŸU°Æ«LªœËf²Å ¦æ*ÿ®)¶ª¤]ÙÉÅ wA=¦.±Æ–tÙvá[Î…´VOÏ›íýý^m÷/ëln¶‹Ew¤lÐYЇ£_S²>GýÛ×Gìì>äolùbä øCŠñ¯)ÙŸ£‚‹íû#–4ùX¢$ H1þ5%ûsTðo±}Ä’6Cþ!…rÂøÇÔ²ÿ1%ú³Ô“ÿ¶ë†-Ð1ÿ”‰^¸É`Šñ¯)ÙŸ£‚‹íû#vÞyÈßk¥µÆ?¦ÿš’ý9*ø·Ø¾?bIû1K*Z“H1þ5%ûsTðo±}Ä’cþd• R“…)Æ¿¦dŽ þ-¶ïXÒqÈßç2^²&ÞSËþÇ”èÏROþØ®ÿ–tóAeJÂøÇã_S²?GÿÛ÷Gìüæ¿Oª°œà)Æ¿¦dŽ þ-¶ïX¢±þÏ»òƒ4þ!Åø×”ìÏQÁ¿ÅöýK4Öÿy3÷KÆûCŠñ¯)ÙŸ£‚‹íû#–h¬ÿó¥_JÖJãRŒMÉþü[lß±DcýŸ+>í„–íkH”ç'÷–ÙUG&ÑXççBT&kaäcŠq¯)Yž£‚}‹íë#–h¬ós.+MÙ þbükJöç¨àßbûþˆ%ëüœÕ*:áÆ!Æþ=$Ë3Hpo˜}u`õ|®\#] œ¦÷š’å9*طؾ>b‰Æz¾òRF{aäcjÙÿ˜ýYêÉÿÛõ?Ãõ|6z•­æ<0Åø×”ìÏQÁ¿ÅöýKf¬ç³>ª0÷‡ã_S²?GÿÛ÷G,™±ž¯ÔMÙLÂMSŒMÉþü[lß±dÆz>;׋²4þ!Åø×”ìÏQÁ¿ÅöýKf¬ç³Ú¨ä’0ç)Æ¿¦dŽ þ-¶ïX2cŸINù…ñ©eÿcJôg©'ÿ l×ÿ Kf¬ó3!(«½Ðú`Šñ¯)ÙŸ£‚‹íû#–ÌXçg\*Nÿ˜bükJöç¨àßbûþˆ%3Öÿ“U V˜óÀã_S²?GÿÛ÷Gì€9‘r™¤‘)Ƽ¦dsŽ æ-¶oŽØù?­{yNRÆha¦SËîÇ”èÎROîØ®ûÖørÕùzÿX`¥r‚?¤ÿš’ý9*ø·Ø¾?bš?˜ëý}P!Fa¾SŒMÉþü[lß±óÏ—.(§ëK`“r:H_H1%¨)¹JÐbû%@ì<Ù§Ës ½¾ó£’î|büßC²>ƒû†Ù—¦ñ^áëê hR)Xék)¦5%£BZl¿ ˆÕêÇ~ž^‚X³d•ÏF˜/ÐrÅjH,‡<Õ«evË…Lúª¼*gÒ‚‚šá–¼f®XL°ÈÃ¥gÀ……G`R·ê~¾Á¼Z›«¼­Wó‚ºÎy”©ì½ùñµ}0?•MKkƒ¬*™ëI½:Q{æ¾\L}2±sêÿq{Øendstream endobj 1832 0 obj << /Type /Page /Contents 1833 0 R /Resources 1831 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R >> endobj 1834 0 obj << /D [1832 0 R /XYZ 85.0394 794.5015 null] >> endobj 1831 0 obj << /Font << /F37 1042 0 R /F14 980 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1837 0 obj << /Length 2962 /Filter /FlateDecode >> stream xÚ¥]sÛ6òÝ¿BÓ—£f"„ øÞ=9ÝsçêôßÜCÓš‚lÎH¤"RvÝ_»Ø J”Ü\&3°X»‹ý¦å,„r–¤"Í£|–å±HB™ÌÊÍE8{„µŸ.$ã,ÒÂÇúpñþZe³\äi”ÎîWÞYZ„ZËÙýò· ‘˜Ã aðã§Û뛟þsw9ÏâàþæÓí|%ap}ó¯+ýtwùË/—wó…Ô‰ ~üçå¯÷Ww´”ònn?$§Ÿ‡Þ]]_Ý]Ýþx5ÿýþç‹«ûžŸ_*däëÅo¿‡³%°ýóE(T®“Ù LB!ó<šm.âD‰$VÊAÖŸ/þÝè­Ú­Sòëq*îCÊI.R©^Ê2ö¤œIXL‡…RþÊìÕ Î“:šùÇ]êŽ/"ïR-E’çÉøÒâzžG¸ù5—w¿âøò¤¼c ;‘Ùœ{Xg8wXor~îÒóÃK§9÷/Õâê[x”H3ùÖ«{XgxwXoò~îÒ÷ÃK§y÷/Í¿÷0AøÖ»{XgxwXoò~îÒ÷ÃK§y÷/½ü&ÞS‰L†o¼»uš÷ë-ÞÏ^Úó~té$ï£K?œä}¶ˆb‘‡i:[ÈLä:L톫Ͷ{w,“àϦ6-ã ØÍ¥ Á[ÓuÅÚgEG(Ýž+óB£µy6k> ^¬©×||±ÝÒö6ÃÖ–ñV´T®‹–A7·‚«ï_†™ 8é)FNC`QŠºÿ3æˆ+Œš*^lÄÁdÇÙxÝ*Ž(XÓŸ)4À¼<èP¡!Ÿ?]úKecyцP°jãЦ ØÙ ‚ Ê–*œÛØ‚ë>¬8ÿô²Þw}4ªâžÿ7Þ@üáˆF.BBú²<ŽPüÞ*Õç…ê¼RøX§•¢Ç”¢lê“C­ˆàù´ÌÎ_ßcMÜ?ÖŠDèTïï•])úG³ÔÌRÓq¯8vþŠb| ¸dµbX´W dL»Ÿ÷ŠCQæ#ŽE”ªø{ãK…*þ÷ÿ)B”‰PåñŠàaQ‡5(‚åy~{mŽ´!Ö"I²ü< =Ö#mÀv¤/8¢âªJ2WIê´ÂIË=”+ó0JBÄøðêòÍU±_wƒô^øy!ñyZØQža6;/lë´°{¬ÕÞ‘°S¡sÈÛÎÒÐcM1¶:ƒÈ3¢âc/X…EÁ²z®–{›NÀ¼¯óå ß0&ùÌ“¯mÔ|Œ×A}5n÷*—"¨«x09(äiJ%9lx Ôi‘…"Ê’ÿ;î1Àóm€€jÛWðÕÆPŠðCcH)8TÓ}€p&õ|!C(´/—Ë [ ë×gSvD 6ø‹ò »ãB² pk¡ä´Û¦¨*N°PíSq QŽÃÅ޳%tйeÛJ º ¬3 u,$x$NÜ »}‚–¢&7„ÆçÛš ªé–ªîÌŽÉbJhÁV©ª6[*°ž™•Îapå½mê–— [‘+]pNÆ" ÓhœBéYJ›m£F÷ßP’£vä:ø/yHXCÙzô¯¡ÃA|¸£ä×°+ˆÙÒÍ™S]ïúqÁ#t\#°à3±Øëžš]·(÷Ýd/ sÑ(ãpÿ­£H{ÄÂ"F2JüaB%< P@ÈEݾ†ÞÝ Ü6q—Ý„J€u@Å Ö*¡@ÉcéTšÌ´yL%ƒXaic°6¯Ú 'Da6„Ù©/ ×uó>ˆ±Ã¥þ¨k×Q#%ZÝa/ O˜>Þ~v:GP_Ãs`_[ …ˆíø&Ô÷-/Ë=ËóUGÁ+/Û¶0õ~pý »_4&½ÏòC½G‚ó@Aí»âüK˜„æÒl»ƒ­ww­éøÎ9¸É¥Øpûéf× Wª÷!Ö碖?˜uóH»ûŽØ­˜4®pWöФB&í,[»ha55…Šº[¿Î¥”7poø®ŠÁPævU¹_;À›(¡¼ƒWÈɳqYŸáŽõ`9§e×r¾çÊÕšçûl´ê wN2h,“¡!ׯ\mǮե±-Égsg @K³6…ë0k×ðÃ%‹4ñHë=ë-¼õ¤BÚndïOSëoüУ°Þ IT›ý†&£'A€÷žÒAm1œâO–îÀC’!$Î@eâ> ñMŽãÛ´J.V»f³8åwd‹4V9;ê †µH¤ØÚ 9‰ž:&\RûîKåIŸÃo€ù¥õ÷±²½m+ŸÜ‰0ËýŽ­rk k+³‚}`7«)à ¦yö¦ƒUBã'|Bc’'Ö£PÅ1 £ä —éÌèóEq„´~RÕV À‰FèȺökÑ“Êù©æï3ÍÃsÕìÛá“ÏòŒ½xtËSB’*y©¿…"F~R©³DüÅ¿ôV_÷»%‚nö6V⨲K Q0çOQdï*¾7y± f–2þ45Èb!S%dvø8÷O{üj¤ ‰Àïd* Ý·€£XKcëLû°’¸° xµÎÚ}Ê¡Wý„€Òî7[VÊ”â¦E²ÌÛ3zæíð}dŒïNõ´U"ð=&ª†°o÷ßx=êL(­Oôƒ¢L‹XÃ!L”ýë…è¸ê‚¬_AîxLúÿ$ùíendstream endobj 1836 0 obj << /Type /Page /Contents 1837 0 R /Resources 1835 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R >> endobj 1838 0 obj << /D [1836 0 R /XYZ 56.6929 794.5015 null] >> endobj 542 0 obj << /D [1836 0 R /XYZ 56.6929 267.0417 null] >> endobj 1301 0 obj << /D [1836 0 R /XYZ 56.6929 242.1896 null] >> endobj 1835 0 obj << /Font << /F37 1042 0 R /F14 980 0 R /F22 977 0 R /F41 1238 0 R /F60 1366 0 R /F21 954 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1841 0 obj << /Length 3901 /Filter /FlateDecode >> stream xÚ­Z[wÛ6~÷¯ÐéKås, ^š½7uZwÛ´ë¸Û‡¶IYÜ𢊔ewÏþ÷`)ÑNºI|r‚À`0˜Ë7Ї?1‹5ã2Q³(QLs¡gY}Ægwðîë3AcnÐb8êËÛ³¯e4KXáìv5 3Çbv›ÿ2õÍå·W7ç‹@óyÈÎ:äó/¯ß|…= þ¼úáÍë믺¹<Ôüöú‡7Ø}sõúêæêÍ««ó…ˆµ€ùQxbÂëëï®°õõÍå÷ß_ÞœÿvûíÙÕ­ßËp¿‚K³‘ßÏ~ùÏrØö·gœÉ$Ö³=õ-íiSdåê‘:Qt³…ä‰9'=[À"‰Ö]b·Ù[Tªª¬Ë›í ë¢n·ØÎÚ¦ÛÕ›¾lìXµ4‘ȶ—4z×MK5Ђi)CwhéÂ$Û•LÉ5’ 6:òÁ½ ia"a/Æûî2ÏKÃ]Z RÁÑfĬÔs³†áȾ!B÷:í¨ Ÿë²±»‚žbu.âù ˆà+¤¤¬@mÇÍ (öÁ›[¿DIëÒhX`ÄvÜ™#æzþó¹Öó²_/ìþøøŒÚ]?©Ÿ,Šdü># G‘v1AH³H„ ȳªÌ¦è€•Ã>h˜ß°a?±ši~2+ï ì²ZbV¦1”„yöçd_¥}QUãœ/@ÝšnïN›œ»~ÝnËþÑÓDQ.bÁâD$c‰šõ:#ú@οi÷Å=ÐW{at7•*’*¼ù•óà¡èð†i¼Ú¯ šŽ†3·] Yœ‹y‡ÖsÁ§`ÐE¶6XÄ0y¤-ÂïÍržxÎ/Pɬ°L7Iä¼K뻎x†ž}Y•%yWlzlYí6ôwYVy ¼»i–NÑm@ÀEG cß]ŠkTE×Ñ¢«?Ê{c÷öTYLc»…)‹vk4ñTgUÌ„Šãƒ7Õ ·¨GáÈÀ¥ˆ,7¦¿_[u†žnÝîª{—4 =*‹”r¾©éÏ—HÀœ¤™D'išeƒ¯zÇÆÈàù`fÔã†ôØíe´ý2K«Êª<°ß¸xê>-›ŸRüéê-*š7»z‰D›†_à¿rÍɪ"d~ë´q´Ó® ‘F•?da8Ъp«yq1&¾_—ÙzJ“ÍZMz^ŽM‹ÏóíC@¥èU§}ï‚Z½ËÖÌ·Á‰ß:’«¶ªÚ½§Wµ äÕ© .,¶6 Ò@Tî*í-´0ÌNÅþÜ52úsîš <θðB0ðþ“ˆ–-†£‰ @æGMœáê €,ŒÁ<»¼5±þë¸ü¸ž²ú„‰P;Ìð>œK”<Ä9<Ä‘'çCO·žüpì¸ñœa¨ñJ’«tW‘~ݧծðÓ&Î:„˜#Tò~ §ÞwÎ:°%áóç<õô9ûQƒsΪ0ss·(0ØØÉ‘'8àµg9ñ£&Xi7ç,P=楘¨½½·† m ?ÐB«Û{7ªO-â•|î€'ôM¿-mÄ À/ÁuäøÂw`T…ßïn~ÂɃ1iugÀú¾@g›pÐê47ÿ8yÜ,æJó„IÁžè@Àâ@¸™Yv}a`IP˜ TâUSè 9>ç\¯ð-Â>ZìàF,2ªhŸó—m8ÏŽr¼âÞ…LŒjŽ÷N§a|_–íl´{ZgP†@¿GeƒžÑXôD¦0ÒS ¾=Òϯî.?:—rŽ×GØÀ¥a¤¬w5>¤u»kzlc(•>i2mŒq =†MiÏÄüî:"HY:„,½€”?§Y¸u8g&óŸ-œtSì©/‚«quÜàˆ±KÍó´O±U6#H©yœƒqæÙ£Û’Z6O¼@êçzÓÕ9BËj6k Ýn©»;Šd Õ#iÝZiàm"#ò©ª Ǹè/æÅƒ¤äÂÕüºÁî|Àg¿ÆÞ ¬ÜX¯O÷e±·ŽÆÐÅpÉt³©J”‹!¸I·üqšôû‰©iwcÄL‘V>O‚ù³áÇÅ5®-&/á÷S'b‰ FàâÈòÀDÄZæ/!:+Ž©µ)M‰‰ä|!8çóWôІøy]V=²Óa§`C"B}ÄʘÁµ þl¬´÷en­CÄz\–¦säÇ̯ɚ*‹íÌX“Ûî¯Þ¼ÅÆ(ùÀ®.Qã”âfÔÌC­ „b-40s²bkž's­ÇÕƒ(DûŠ"g_"}ó‹šE>q5ƒô?NæoMÅÆlñ<¦E0±Ä|ÆS9+¤-þˆhž;KÂÀ_O´Ø%ü3ÀgàðŒ 4Í*WGÌÂ{8Y’0"Î<ñ`~ýã½Â–]{Bl ø³¢‚.ÀçVá¹3/hÜh&ô¢øâÀa)CÍìôÈûK%MUIÌ ì*},‰Mr8Uø\xŠ‹!I+FüI2ˆä°2«Sš“¤< ?!“Žâû˜´•$ÐFLVe×Oe š%t Äª5Ô$ô ¹w:yÑ<.HÉáÄtX“p1‹è¨Ôµ!«PàelÝ3æ¤û±pu»˜­ž_½¹üþ ›Vá÷«CשÆC§ÕøØå–ÐøRZ•igØÕ`}–6VU²‚Y³Œ“ Û¹CÄiøB·Ñí–]_ö;LC>ÿ}WØ3ôK†bžÛ$#äRBÚÙqÈQɬM…n0ëIC 5ÀÔÄ% f™'@s¦„C & b‘N’§ÀHdòøRè×ðE³(9®r¸–ŽM!ÍÁ)C{dV xd¦«ÄÑac 4èdLÅ+%BiûàLò¶N-`“èÎíoS ;¢ƒÆ‚Ð<–雿’`¬ZG`‚‘ˆ?Úü=ÅÅä©ù+¨[©ð°òsæ±@'Îü‹ª¨!Ðwöb*¶ Æ@°p0Hc'­Øå<<ŒL¢úa)½ßmWu·€)•Ú¼ÜFB³9—ŽñAaY¸‹E´ƒ£.Ö ­ê'ü1x±8<\ŽM£F¡5“JAhL˜ˆÕGûcGo1 xêMBš,Ìz0Š86ÎR:Á÷p˜€ €‡>.B&µVC°0<”c° B-ÿ´(x á5Œ<^ H¨¯N5Î"Ž"ÇX¹9 Çø™ðÓÉÖÑ{^´ еÖr|ø6EzJ´¾®ØäSi¤ñÓ»Œ%3Rød»$zïÙe²(ÍÞu” ™üÅV;/m†ƒ÷ÖqâG©ƒg &OIÜ!a™þ[Ÿ}B]„’y<ø¤ElØSyó¨ì§ȾÃÙ)Ñ»þ‘ž‡õ/ûåè .ÏÛÝ[íÞñQôûvûŽzýg$S;s˜X;Œo*ÞŽ¼éEòö“=uá–í§% bn²ýÆÎ.–Ø·Ä}î;W4o‰R—mË U¿3üü€ íÍ ÒN߀w)}\²k¼*MT¨Øúp¨/ ó)”¿üæî*À|*âÔÃ>Yu‡ß;{¯Ä•f6 ¼´LpeµK¬¦·is"‰•$/4è©ÚÌs§b)bùŸ“šÏ{ì_%[ĵ˜aêÔü$B$œØ4†ežZØÝÖä@ö¶ ¼AQà »kÓØ¤öc8;õ>-+{Ž=þ®û~óÅ‹›vÛ§K³š¡¿½{‘•}jkWÙªþ{™ÿUH¡ 1û›ÄèÚÅ3Ÿ²üå8>ż¦B™ ɬ½Ò·ïf®õCøqçÑç„®Y}jc´©Úà ƒâ˜å£[8?ê”Ï‘|N©Fÿ6}™Äþ½˜ÃáÊIË,z8Ò_¥K %ƒ+&Hû2Œ;rèU§\ûküT0¦&k^a/(:6Ð9( Cðì“h‰n1Çæ0I{ $I¹0†iÅ‘ÉO3£wXg—tã-Wž‡wSìgkS¶#@78ƒÿ/E1wa¾¤)ïÖtãsøÀt>¤ÙžÇó]Ut_L`³±™À °ÉèðgÈ×Kìú/þ K;ß $ù™›òrjÏ£Õ)Ûþ0JSŸ^ƒ™ï¥'ôžÏܪýYöá›u1ÇÁô=¶ä!‹°bÊì6–Çœûï·OYÿ±#÷yendstream endobj 1840 0 obj << /Type /Page /Contents 1841 0 R /Resources 1839 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1818 0 R /Annots [ 1844 0 R ] >> endobj 1844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [91.7919 146.7594 410.5963 157.5737] /Subtype/Link/A<> >> endobj 1842 0 obj << /D [1840 0 R /XYZ 85.0394 794.5015 null] >> endobj 546 0 obj << /D [1840 0 R /XYZ 85.0394 474.1483 null] >> endobj 1843 0 obj << /D [1840 0 R /XYZ 85.0394 446.4867 null] >> endobj 1839 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1847 0 obj << /Length 3701 /Filter /FlateDecode >> stream xÚ¥]sÛ8î=¿"o§ÌĪ(R_»ON“ìeg›fÓÜäf?d›¶5‘%¯%ÇIý(Q¶r{3×N+$Aß ,Îø+Σس0;O2åGˆÎ盳à|c? ž3±“&§³O·29Ïü,ãó§¥C+õƒ4çO‹ß½Øý  xŸ¿ÞßÞýô¯ÇéE¢¼§»¯÷“0 ¼Û»_núéqúåËôñb"ÒHxŸÿ9}xºy¤¡˜i\ÝÝ_&£ÇDonooî?ß\üùôóÙÍSw÷¼"x¿Î~ÿ38_À±> |™¥Ñù^_dYx¾9S‘ô#%¥Å”gßÎ~í:£fé¨üDà‡2G†cŒ2?–¡4¼[‚@²ÀË+zê·V謁dlÛæó½£·R· ãéqÐ3f» ‘zõ¡±S &÷^ïíâzn©Vº=Ô»‹¯Úo‡¬Ü=¼*Æ,fÝðþ5sýGªŽGP‘¯ßòͶÔþ¼ÞàØ%*¤4ÂÏ¢(4Gn×šÔØŸ–þ£!äõý7à,¯8†ð¡Þ— ‰‘v¿«˜ˆ‹n¶uÕ0õ²xa¨]ÍÈɧ[%… _¨t‚|YvÜC€aÆAàMé!²Ð]û‚ˆ ´{D  “˜‹@^5<ž·E]!ñ4õ¾Õ\Í6ÇYämN¯(o/g‚ž×4‘pQÐQ í™öO_¯i`’@|âmòv¾ÖÍÑÎÍVÏ‹?‚ ÔLuK[!êmLV(Á'Ôw'ðÔr(Ê’ cŠUEÇÐ ¿ÛÀåWÔt˜°ÝP„†ÆÞ:¯¸© ½by4mà8M½¡1´u|æô(õªh /-*노θ¢;“Íûp8\daoõàXˆfÒÕ¢ghDn˺,ëCQ­>’ÔP†hñš} ­­œyêIàdNÿÖæá.÷ãæþæÞâY¥Õ.@F»ðÌçs½m çaè5dë8Àz’ ¡Š„*½*ß0òoÄ+{ëµ´ˆG÷¬2Œü0‘)0‹<ê7äd²ÜÕ›‘AtVQÛ¹¥ÞèªEÓ Sà 211zœÈTø‰ ÔPŸ‡£f|_·]<ÊQ\*sÅ<SÕ­«õ¼,ßi ¯Ü Ip]Y2Ú ž€ÙÚÈÙhЩÍyî2Ÿ·›jÚå„…ug–r"óŠ«k¦kÙ!Ñ·å ,ŠÒª„ †+“Ⱦoòí–âLÄcŠSBHÏz")çÝ=Ðè )!¢ÞÑ„E½É)üªnëÈ[ÒA6ÌÈš90Ãñm [1¡%=_ MˆqZywí˜oŠÕU§`êížg䀥øY¿ ã€!!”œÞÑWìwۺѨ¥DzÍ~¾fú -ãõ÷õl¿Z®PÇqäM&HúÂCJ¼°£ ñ‘1 ‚˜Aæx'©‡sPK|’Èá;£¯Æ¬`œ,p¶¦˜•š—í»¨3£Îj¦¸É_x³FST¤‰}8_·ÝÖ‡µæ”Ðs(M¯xOPéˆa’I/¤†aDºjÁwc_0nøCÄ¡@G!dG Ê'è‰P>HV³¢ZÀ>lÌ0Çz3NÛì&¼ÝÁ¶»- _gL‡ƒçÍŒh΄•Äæ…Dxp¬²˜çXlØ;gß¼ÙÄ:¢nI+T]ÁH™›­Wš°MÑ’uFÞº>èWGï1ë=™¾0cò ÈÐ@ ‰ù,ªl O Üãñæ&—ÀŒÎbÆÎÜ‘m=gw¬!ÕÇ Š‚q÷B û8£Î!µÚ0'žyê·uE¾Ëð\ërKõÒ„"#ΆlØ2e tõZp4ÅÜò#ž-AqX&9‰ƒSqL1"læóy¦•<©¨`©’ÆCo_•&B"B+ÛEw`xõ1ùfïâ»Ùëü•Qog+0ç뺘[s3%lÚ Ù÷ˆÞlâˇéÎf&~çdØ¥Jf£÷Ñ|û¹?$ô›ÍÚ¶‚ O0«|×ó=·‘/`Zˆ8¦œŒ¬8ä&˜D,txî&dÓ8f˾03-ÜL¥yž ‹02 þ~JM®V9šqc?¢¤”£Jx©g¯E½o¨f8M è¡ ²ï¾¥ñM^ñÌ#/Rß«W°Rc¿–meߨúPFƒ@•kå¤xéÒ7µ©ö¢ÌÖ}‘l3ëO‘-|2÷ì(&{·EïÉ0¡6Ç€[Èì¨Ij k¡>è–YåeÊÂ0™¸“'.µ¼ÌØb£G*,”‰¯â¤¿Lð_Íuõ÷ã x¨Ö;Á¿Õc±ç{|øº:s7¢;H[pºÑ¢=Œý4t÷@]f˜ŒPœ—û…æü—s,6…©ßMŽÒsh¹ŠfCc¦fÃüYCpï nGÃ$—”CíØ_{Ý´v7°³zÂv)èå0Wи`1•ù6ßàù­FP´”yÊ6@s £Nœ ³2#‘‡'£À)¶C(&µq€¸ÈŽ ¢À“¦V0õ’'›Ê[ìàþß×_¿LïîQ1—©ªT!l©L50¯±¦ã0âÄEÞ¹·‰û¯×ti†ÿM;.Ï®`7`$Çóÿ¾[·YÞæ£!·7X„µÉ`þk4+û€…xtüTI…ôrz®THÅýÙŽwšð&§¶ž(pð|—q6ÂÐÖl’ }ƒ²Cù¦¦rЙµ*ëY^ò¼-÷‚!ôI -öðŠ‹ã¨L(ÈtÐlI®2ài2ª:‹=”Y×eÉ N‹"ƒØƒHÀtû´€4(Un2½d'E€ƒà 0ªÇÇ/GoðLbÎv¢Œs* À¥w…q"¼h¬wÎx'¹¤©9Þ{à]ÏDI]6ôÜ7¶‡2T6þ˜u×$í®˜Û‘umB$L§Í™¦X‚0ÏØ–f™‹ÁÑ`ìz¥ár‚Ùº„ro ?•¡µ®å9ˆëIÈãæîØ„šï””Šü Zžº!– ¦Ï~±õÐWYgêä™p–ÔOc˜Ž‡ÞRs¥½wF`N»bµÒ»†Fz…!Gµ)€qĸ(<ÁÌhô(ÁBˆ‘iäýz?ýrsI3 œˆ0ó.iáý·á»)qÚý·k\äÚè·±À“Ì.eAW‰ä³³w"=C/0>Ì:ÎFŠCš¶ói9|Ñå}f5Î j]¾â½«¥VÓ“Êzj,ÕG„nHàKœ'›*쀶vê—Ô,ES Âú2»¿6vï»<ÄÂçÚŠ™×âû‡‘°Ñhf ^X¥xõ]ÙüR”P•5,¬*Í‹iÈuVønn€à9¼RlŸ8PÑ‚©}å §ð‡ “ës•t«[ËëôþÛ3~¢b¾MÉßFìYlÄžÅÇjS*¡œšÅG& zÇ ³È‰Ù0Ô9¾˜<Å#-áhÛF HYû$Ûûpæ`«f?³õÈÖÝTê¦ãÐT’Ùl¼ý>)¶#If¾ˆbºNLHJ2!)K]²­"PƒpŒN¤µCœGÊ ˆ`£pL&ü>° I¥ËÈdˆÍ/øù1ö“ 2[s‚ä*ÊdEÂU'URæ6d™,ü ¥~Š4ªðbnDª*öã8³ic»ÓËâ­ÔÕª]ûWÊ¿’þUè_ ÿCy‹4ò%Ôz]*ó5`ÓÁ§ƒ!âÓýB3ÍÝΜ(9´÷™nÛd)2OЃ´€4߃a—)^Þ fI) Ù{«MŽ€bãJ]Rw%-&dLGëJðߌ ºTŧ#QÞïJш ‚ïÄXèy±É™™×¼Ü3ÞÄœ0ø(ú–:7›ÊÈkŠUe>‰ÍÍ¢ð(22²öuVt|C C9?ɪaêýdz}ýèO°ˆ›ú…˜ ÍË ºì /}vv¨æôXR”m—6tG†7y›/÷úÞ;î¢9ô¿-è"ïrE0kf²~c'6nÞËû†tàˤ+›öýœúωÿûÏ‘ÿ¬ügé?‡þ³àj¦[9°ÄãNä§q9n‡ÞMŽ}¹ çðÀ{N/}ß¿|„¦‹_A/~]ÑôNY[XK†¡D¦–ký–÷&ˆj¿™ižw"¾džˆé9+¨°˜)A²&?äã|t„ —l]’í@Z‹TGj4CFy+ÆÈ´egrh¦†St›Ô“z…t¦c©{±Í)}޼”÷ú¦‹RNßî0otüÐÇ«×t¡g.´ ‰ï!ùðºïT*Ö#Û¸¹^XHe>§Â'¢æâÔÀeœ¦TWŠÿî•ë‰/”MŠÎ½‡¹e¨YåYâArdð‹zONL_ÖnÇÿÃüi_ÐÏ?Ì׿¡G½Ö#Τ`™Íq•y”/ðG6_l5ÑÉï2¾û¡wa:þ]”J,³2·7ó—@[µ+ÜHy­ß®@‹½À[lÂÒ—ožJ­¾ýBŠ€m˜ä%K$Ì–µn¢¼Ý©[ÝUÆ#FË´B°j,Ó®?@Úö´ëBtØQ^è2寮ì‡.œÖ´Jø ºbнÅÂK_=¦Š>ÂÓ©ó,åSV!þ:I:•¤ÅÝðÇÖS#WÞ׈J¿0àî!°ù&°mJЗ~£¤|ª¦LûHKúÂ9¬ h'f;ýºĄ́˜ ê ÌþýÇÄò?ð?ÖdìÜ·¥‰-«M×!)}²3ˆµž¿ YážÚ™=Žt>éIÉ ª>zê6ë8ÛÑzâj=¶¿JMûñÁïä ±àÛF~ÕÿXÏÿ÷oèúªÄ—iŽÿ<.LR_¥@„™By§ê„sûc»SÖÿBÈÊÒendstream endobj 1846 0 obj << /Type /Page /Contents 1847 0 R /Resources 1845 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R >> endobj 1848 0 obj << /D [1846 0 R /XYZ 56.6929 794.5015 null] >> endobj 550 0 obj << /D [1846 0 R /XYZ 56.6929 424.6308 null] >> endobj 1849 0 obj << /D [1846 0 R /XYZ 56.6929 397.9389 null] >> endobj 1845 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R /F14 980 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1853 0 obj << /Length 3719 /Filter /FlateDecode >> stream xÚ¥[_sÛ8ϧÈÛ9;–Ô?J7³n’ö²³M»iöîæ¶û Èr¬©-y-9iöÓ@€eSron:­)"H~Uy.àÌï/þxøùìæ¡[‹½^)\ÈŸg¿ÿ!ΰìŸÏ„¤Itþ“iêŸoÎÂ(ð¢0 e}öùì×n@«W¿êÒ_$^”øÊ¡@ßw)0J½8ð­ÀvW>=»–凳â[^l[jgLkö‹z“••~fõWýã»0±Æ–aäERÁ„pÐÝö¯Ëª)·Ä8˜D¨¼Ä†Ô9»û|}7ÿpÃr«5î>ß~¢Öp’ÙîB&³‚òU‘-<µjýJäe½£F•mŠçq~)ÓÀ z’ÒK£È×Sx)ÛÙ4kéw]dMËS—ÖÔ£Ø*å™oÊ –x¹¨ÛƱÊHy~šU"®TŠÙê !‹b™í×,ñ9[ï™n´;,%hWÁ„ÿwÙeCãJúikúC¯÷‹Â·fåÏÅšçG&÷Hu~{2 bPøšŠióéÅA8ûs_ì^©I¶i¶uÕp'Î ¢ÞRHÌžpô–ÖkjÜúOóšQ4kj"µ/Ü@ƒâ0›Ú˜©Ûz]æÑ9õ/"æYEG~ƒ}Ióòd_ièL/V ýÃ^1N ¾y¶×˃èp}÷Á€±! W,¼ãyÙ•m[pW–›—Õq¡‘ðY6µÖ”Bg©Ýº»AÍ( ¿PÀ°Ä×À ëb¸.i­Ë¼…F‡í_å5MÃà䑚åmYWDû""Q·«bG]í ˜þ'þ|ã¯×·Ÿço¹¹v9käÅqh6Ij@ˆ¤ñ7û¦%ÁQòUÝî&Øï©˜õ±ØênbŽœ‚§Ý²cû§b%‡6×z0›cUl8>tqhÔ.«Ž•Ëz½®_X‘bÆÂ‹ÝßÇòE¬B/Ž 1™m.Þeh©2…fXcáJ¾©…JÂK!&¥v\Çb”Úa<{µªë¦8ÐÊÁÎCÒ±:´ù—öz"™m·E¶ãØöE×´#¯ÛûòÒìm–-z›7jŒ÷Iœ°‰Å5aÃuÚ&SR-›ŠuÛÄû‰±¤½+f¿rʵ²‚ηÖsŸ—ÄŽÍÚz½â3úáÈÓYp\ÏТüz¶¸&ôl¸NëyJª¥çC±n=Ûbç›Zo|[ú“Q§­7„U¶¶9°[û+¼d¶ SµÇy“µAæ!fH“HžEÃ<vˆ¾¯4DÜ ™êóÍ•+t l6n'{©ŠO˜©gš°36Ò„HËF2Ý&²d Y_ïÆœû =nvÏQTÓ=˜ìú× «0Á‰GÁ€õmTÑQ’ØOÓiMÛ\ãªî¸NêzRj¯ì#±NmIJº~[Ÿ@[r¶â.T6íÄØêtþž×EõԮРplƒXïûÚ¤H¨¹ƒLjI'6ÚYHîvÖpfg90¡ñ‘l±àìÒeГˆpò¿VìÅŠFâ„g_çð&Á>èè¯û2z<@ÒС‘tßÓf»VCX¸&îª×ÏupÂ> teHÊ™Q~Ńf`iëí¥)—K·Ð…ºýÁãC,f’m‘—˜ò kØc‡ |ßK|%G}¼ž_@žzÀæîJš©Æ>:c(•è#e¾¢„(¶ ”k_c¢h&ŽKÀg„õPüg>ÄMó»«¿Ý=ü$ÇãAy* NàG›k¡ ×i‡š’j9Ô¡X·CÙbG¢ä‡TDl”_ê<[ܸÎÚÌeÄÔSQèŒH/” ý’=í4E¥³v`ˆÀߌ~tÞÅFWMÊvÌ¡ÓH?–•îm de*|Ø7FÚ_wWÍ‹AOvôh/ |ìWbÁ ¯ ÃL†4Î|ØÔX!0[„'R •çbŠxÂ@ol ýÔ#âœGýˆ6áIm¨¥¡—@°ž›ÎL·ÊÆ…}°3ìÁ49 `Ó(AÈÈ-Tæ¥a8AJ³ÏWÌÒÐ+?xÅ·l³]^^o°ð‘å¶%ž’yÈFý[гd E§-ì­ˆàŽto¢£/[}¨Q&4 ­ÜÖ|¥å8ÈÁ#¡=h0ÈSÆÔÛu–묦ºã‘=&—ޱ‰˜ ­¥L™\ÉÙv¿Û¦£H Ïõô% 4&u¬‡ l§F#NÌžžºÝQÕèÑ?'ã'6UQý‡Éöíª†èÉCNâG±{µßÆÁ Na³Ä'«Í5;®“qpRjÄ:ãà@¬;úâ`b@Ï'½?~øÇýo®"pê‰Ä7Pª+m§|w0H¡ êÐ%{èÈèÑìBhš]ˆg9{ÒhŽ™Â‘-…}uµÍš¦]íöž Í)/”‘ɺ·<²¾à¹rvÇÔ+=$ãˆÃKJG7øåЗÒeü^ˆ”fÐЊ_¾€V½ì¸8,XcUnë¯<𪆃-’èNªä×´â9b§&bééöúž'áñ«u²–…Ñ!Šú u ¬?€XÐE»×”½ ñœíÊìqÍO[8ÛÒ‹ú,„/´üFýRQdŠL½«.¤; dz„3pÑroç>yÆWȲìgàˆïŸ4îbŸ¥â 9¦”rÖAgsâWŽ›1?µÏX©z1öꨣ3+ýÒ‰8sCyäqj+»r±(˜Î‘X3—OGÊS¾ wÔ±3Ò“A‡Vò5Ýjõ3“#P5‚¥†¾Aª»ƒâú±‡©06üVÝ ^?”þÐæÚFˈ7zJ ×gý$aD¨}MD•á·ËÍØ}p‘¯‡«¹K×øppšPunÎBŽ5¦§¥U€#uÅD “Ï'(±ÁÔ¹p¦ækïþ4ÔþÌ7âͪޯ™…îV©ÍW«oèéÑ|øÀWì<+& Á&oȰ»¹G¼mfÇ-Š~V`NóIŸtóâÒH‹*w]¼|¿¬÷Õbp+<=%ì´PÈ÷Ž6×øfí¸NnÖI©ýf=ëܬ±§@6B‚ã ).¼G‰åÊõÝûs„®Þò«ÜAöL:Ÿ° Hïê—#›{³Ä‰F&E_¥â%ïa^˰`ÿh®›<Ò×T&„—».Ù§1Nú.ëÕ¾¢«Û"oOVÆ–ÄËYå±èŽ“žx?:}/N¼$>uÅgsMøžá:í{SR-ß;ëö=[ìw—¿{¿Æïƒ·£ÏAà’ÎÏK¶R'°GæS—2žŸ'³Í5¡oÃuZßSR-}ŠuëÛû=Åa%„ѺÁDÍè-µ«¶ÛÃy§Jáð ¤R'TjqM¨ÔpVé”TK¥‡bÝ*µÅZW,\ÌwœcRO"6ú_¶¿4šôëÌšÌ|HÓ-~ߦ{s>úv³¥ã¼CŸ³P7"Ô&±Î©o_©@È_£â·—Jrí5ŒûÓ+òt÷SºÎX1GEÏzÙºÔØ×cDëÒ¼BçêêhMÝvâÐ`ªe~¥~*A„]ÎØïÖ‘„‡ûëŸ$İçacb}jë+>YUÃøåPM½üÙ°¾ƒÇŸî#&hßJÓÆõé*]³i³ûݵOš±Fx.‹êà]§»\·?°½ƒîKÈ­ö¹¸4ß4ã=ºÃ%é…±JGx ‚ÐW®/#@8ðÕK-‹¬Ý÷Eu.+‹ϾËýšh\Šui“>Uæ;¤j7D}¥‡4^k*#T®©,ƒb},C*×±âY½om*ïß]A¦2¡V¾®÷ü ¿«¸ à0=;£`Gí©„mº9h˜NÎ^ÿ"Q— ^ʆ_ÈëªÍÈßO <µ?ÞæñêÊŒË/ßÚbW›¼’˜gÄúM©¡ >ëmìX’wlÚ• Þ—–#/t9yðÿû$XwuÊ ’däÓ8°”—ø©2“ÂE%ÑáÌ»ÿºp<õÿîàaYendstream endobj 1852 0 obj << /Type /Page /Contents 1853 0 R /Resources 1851 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R >> endobj 1854 0 obj << /D [1852 0 R /XYZ 85.0394 794.5015 null] >> endobj 1851 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F48 1258 0 R /F21 954 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1857 0 obj << /Length 2379 /Filter /FlateDecode >> stream xÚ¥YmoÛ8þž_a,îgQ±"©ªÅçMÒ6{mÒu¼Àáv÷cɱP½¸–œ4=ì¿ÎH–¥·{×¢9çårHˉå$ŒD”¨d'}N–å‰?¹ƒ±·'’y¼ŽÉrý°8yùFÇ“D$‘Š&‹Õ@–¾1r²H™FB‰SàOÏ®¯Þ\¾ýy>;ƒéâòúêÔS¡?}sùþ‚Zoç³fóSOšPNÏÞÍ>..æ4±Œ.¯Î‰’Ðç¡ó‹7ó‹«³‹Óß?ž\,z[†öJ_£!ŸO~ùÍŸ¤`ö'¾Ð‰ 'Ðñ…L5)O‚P‹0к£'7'?õ£nê¨ÿ¤/”ŽÔˆ•s`˜ˆH+í8+šúÔ |zûxêé$™¦ÙÊîŠöPµ™Î?þ‹ÈvÙæuկݞJ3͸³Ùy–[]DnYîùÕ ÑœÏ»¬iYL»¶-µ²¼]g[V€'V5&ö"o.ÎÐùàOJ‘„¡ræ”YkSÛZˆDìW?ôϯÿæÃW"%œÖ[yXgQªš(,ÓµiÁeí¾iCŒ½ÍÈaïm^ØÛ"£±U'÷@U'Þ–<%¯è †vºäwye "­+¦£Öhûˆyn®Ž5¯Ól "LÙÔE¾|¤6ÊB›Ö‘ñ§‹uÞÐÇ–:K[Qã–E,×¶ºs„Ž3I£©EA€‹Éy¢¥Ï}ž=PëÂØ ú@9 N´ˆMlÀ*4æv›ÙO^Z5M¶tÆz=M9þ˜5,lˆf‹XùËZv×dM/§†¶–¶ÉÐÊ„h¤õ€v}p“= UlØÓwÄYÃ3ê} 7‚˜kÑ…}ÏÇa7¬*nP2¾3è à´ú¯¾¯³%f î>$ +0¡#Yn10 ÈÍð°ÍÛÖA>¤LwÛ˜s4ö®€ÀÂe¶ï³m¾z<•RNEG#Â0Œzd¯RÓÅâ=6$™ KÝÃL¢¡²Ns°H9S褔ó¬!rÎß&kixå„Õ%‘É@f« »ÅJÙ½­ÚçÕrù ß.‘ AåËéåhB:å¢ת¨UäeÞ:Ó\Ó×Ò§´_òrWRçÞ;'< Ÿæ‹4J$¾ ã0Û#å¼¶-FR"‚Ó0öÍAJÐZ”Ù½®,Çú Ü ½¼eînËpUA"d ‹$¨s8 %ÅÈ·7ÂpöÅ–›Âå!ôë5ÊünÍp#}žsF#gˆk7­m³2«Z²=úJi‘à‰{°ô–wH¯‹i‡Ç¿éCû-¶¾»µi‘7íw¯©ÿûëßzG ·€­Òc…yÿ_ÔQ‰Un7›½w}³ÔÇ5õÊ»­`8‰%B‡ðÜ”,}ÍßÇ´ŸRC­]1€kË@‹ :Â2+R.LÛsÇMî 7ûñ§«Ù‡ j‘¶Å&mK„$ßr¸l×ÀêÃMƒ¶ÆJ£3DPÍâ˜W-–F‘Ï[?6ꇪ£¡GqèM²¥ú’Ö¥Í+Áç)íÜ3RX¢«A½ilËÕ?ϯ?Ì.¯Ì UUcu :P½hçßD eT óDèÐMûÞ …"‰ãh2 ƒ&hq}>[ÌžèàÉ$*ràè¨?P$B{f¬TÇøœ˜ýÛ,Í!>-û•Ã`éóy“1`àäO³êyÀÌà$ê«ÉWêÕ+ùß“Ö]üÛN<¢³=>Înnïæ?ïqpýA¡gׯâ]:ôBtéíæ«·±MÓ®·»0CånÝywRs$ƒÜ1L¾#Izhæ¡—¿ˆ§ ½ÿt\<]®7\ÃmÆDÏ€ŠìYOG‡5¡ÐàaÆhðmqÏ?€¥…‰Âpè„ËÏn ]VÛ1¸ÂÛ5ªæ!Û2³«ËÝަ◆šÙ—e¶i{2ã}!Fp2¢!ßx¤ÛFÒ]+!ŸNõÿ8Âpqus¾ß2Ý!JÔo¹jlj†XÁÅ«&¥Ò[š?bU`ÄׯB Ì\žv 6²Áä£sDi_Àå›Jª^¡‚r×*lØT+ì7Ùö7mlÃ~,mµÄPÁ­÷Â.×, ®ð<½ÛQ•šõðÆçdt…*´ù(îù>ïrž@Tª…”pÕé^™19±ZQŽj,¾ëÝ–(6Ms¬Íð‹}<nmÃüE]Úmšt›­êî‚å¦Ò‡ëä »(Ðn;‡yr¾Î+$ql_Hjm:aôÌlláˆ1\Ãøš­Pþ Ú÷éÚÜ`y*Õ4£pÇ~–KH$uÓõôS^¹÷Ÿ¯þñÕGZ¸èßA³hW-¼ f¼TÉô1ºèûšËKhp¾¼Ëé‘€w5ÇO[·îÁ°~@’1åeÏÌ_Àã#µöÁÄ©}0‡Ì¼B÷Ân©ã‚€3z˜™îQ[î­Åq€…Uà‡ÎuFâÒÛôx6êÐ#`ë}Ãå?ßö·ƒÎ9¡¿¿9çàÍóàɽomïù"ay¬wŠüxÃOd1²±Åxét‡þÐâ‘[èœú3¯"ý›¾ŠÔ»Š®õÐÉ«ýKÌÓk»òHTwkqs:ÕÇ^±"%Œß±â….où²#b=C-¢Œ«1”/“þ\ÂP#J<ç{(£-½ÇÞã³D^Ýd ª–0 ùMÇÝï€EfÛ]ï„€ŸbżØ¾ƒB—ŸUÝ=¥-9œ 'õ&wÕµ›@À ÔÞ—úÒ(Ǿby^VájÞv;öŠî޹:pïWq_• ºƒÖã×Ç0‚Bj½ƒÄe ‡„²ì¡]äø@ô̯'|ºy³‡¼Äÿý Áþç“ Ú5þø¯b#BX)W FO4ï~Jxªú?γendstream endobj 1856 0 obj << /Type /Page /Contents 1857 0 R /Resources 1855 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R >> endobj 1858 0 obj << /D [1856 0 R /XYZ 56.6929 794.5015 null] >> endobj 554 0 obj << /D [1856 0 R /XYZ 56.6929 118.8789 null] >> endobj 1859 0 obj << /D [1856 0 R /XYZ 56.6929 93.1819 null] >> endobj 1855 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1862 0 obj << /Length 4313 /Filter /FlateDecode >> stream xÚµksÛ6ò»…¿<ñð øèÍ}H§u§yœíÞÝLÛ”ÛS¤*RvÜ_»Ø JT“Nç&ãX `±/ìBò\À?yž™Hè<>Oó82BšóõæLœßCÛwg’û,}§eØëÛÛ³¿¿Óéyå‰JÎoï\Y$²Lžß–?/Þ|ÿúÓíåõÅR±H¢‹¥IÄâÛ«o ’ÓçÍÇ﮾ûéúõE/n¯>~ ðõå»ËëËo./–23Æ+ÆpbÀ»«/©ôÝõë÷ï___üzûÃÙåí°—p¿RhÜÈog?ÿ*ÎKØög"ÒyfΟ¡""™çê|s™Xk©ÏnÎþ5 ZÝÐ9úE&Sé •š# É£D+íxùym»®z²°¯L/ŠzÓv=•«Ò6}µ.j¬ªÅOo?áváTò©ŒUdd†‹At» ™-l·m›ÎvÔ}²†XD™Ž3î½.šjÅÓ¯Û¦w(Úº¶%·½ÐüÐö‹ê~¿«š{^-Ï Ã A.Œ_PÑÛe]mª~n5&Še:¬¦.ö/¤â…Á§0&R:Ó<¬Ý.±Ïù2ÆsÈss¾”2ÊQ®¹¯€3s+å"M<’ÝÜV€´ùÐ婲Ïóx´Éýºö»sCFÖbqûPuK­âÅÆ®Цê6XÕ‹Gk·ÜRìû‡vWÁHÇØJ„9îèT6\YwØ+ ˆ$CH±ÙÖÕÝ öpdIt”%D!6ãÔvb'züV9nKâE{GßÎB_ØûÚRýaÄÛö>’Eí}±~ì`ˤø6ÓSðR¶Ø7k IISàðÛ7ÿ”ãø)ǺNÄ–ILl €Ê[‚l‰O #ŒùÌmXø­’†r¼ç¦—æh2É¡©¶÷U_m Õ×u³r§çªp, vEsÏ]­à{×:ü÷¶|¥€6Hš<^\}beÉë€EÑTž-~<1ûdCáÙëž4¡[?| g»Ýºé‹¡ÓCHH‚8ZúÝ ‰8@pçTBý3A<6ݾù4ÅŒ\õdë— )å"v‘EIžÑ.H0P¯‚U®šÞ6%)!éHëÀ‚ ·n¨¼údwHÒX$‹«žõ)9ÉJN±È`É1>|iÙëý®2.ª¬ö®™#éêöÏQ,Š-Ú)éök¤R–/ †Ü¼¿ýÄmÃ$PAÑØUM5^’­°K âoJ*| bçñŒ¼ÊxžíŠ*+âŠçn‚¥(úpš­-úYá±e=áŒßö¶ó|÷À¼Ó.•-¬¿qz@ŠÅlCðm nUÛWT]×m7ð×/JÅíÖ6ø gÄt‚JÅß•í{PNà 0Öë‘Á…vêJNÐô©ώJ}pkZBYõ¼*€;þãö¾}t[ƒêjòtëÖ þP›ÅeáŽ^ ]ݬª¦`U‹èîèÚx\f(™3çAÇ/S>q*?8Æ‚·µÍÚnû½C õb½n÷¾3=”l±s<Š=h<Êm…6Þò,Í~³²;*“’ìqx°…£y¡bgaîÏ_ˆÅk‚±¦ö:á´FŽ+KÀ­f\H‚}@…¼н R¼ˆáÀ}oÂÊø&ʤNÌ¡r„–燪æQÄâÐk2sÅ4öÞ)¡hnKÁb´ãb°ÒïØ(`Å[׋>Þc}š –ñ’jÃè`ÁÈfX,í]±¯{ž-~¥¡/NR¨uF: ÁN?baš׬2`¦Þ` iuìA¥i¤Uâ#ÞÇŒ(#-ÓxpèHNÚ–¾Eó‚ðDŠzo øDP“á¹Ð‰ámS•#÷|h÷;T‰À> ¸}`´Ãa# NÓöäHIT/q¬¦'½ôtÉbӎ眠ÚMƒÞ@ö_ò}¬±¤EŒ¼e(ǦLj=çXI¯ee±J¾H{¸¤±w¦‘­º?X#ì–éÈŽR™äSr¸Å£DƱ·  I’ 0U1TLÎ>'À¦*&7lýsò½°C]tÝtÌ¡g Š¿íy°ú–Š¥@à&ÛΞÄ0ê\)óÁT°eƒÄžæ w‡Í`aß@¨Á  ý˜X5YÍh^HÿC3‚ÈïAëâŒÁØëi÷G†O[£E´«ðòÐÁ:""ïëzÆ2±ÅQ›Ñ|ÎÛ2/ ±ëvýÈmÃäwÒF®©! €ÕÕÉ»MÜÁCý†Ús»ŽˆG‰¾ÝWõ™ÆÔ¶¹ïo{w´:®¯›Y`ȳ3v:ðXþ”ŠR–«jû/·;Z×’–4#ŒYéÜË"ê*ÖèÄ`*fÎ#8£oU¤â,˜4ùË“š„”¤“y¸zEišeSævL‚WÏ,‡Ýl{ÔÕJòŒ»Ç’FÓdë4ªsÔ%ÕÈd\ņ/ø¤ß°J»GÌEÃ#ØY$õȰþek©›‰U?R‡–xâ}¹¶¦œ“ð‡Â©Úœ Bá4@&ú ÛNpƒÄpC<†i÷à·4TdÁ¢|,³Ö ¤ÍÂÃ?ü÷íÇ÷¯¯>PÍîÈûÛ¡?«tÎ Ö¡ã•Ъ¸§Ü.’¸o†'P‰8^ËÐÔ8Í–ŒÅg–Y.‘à‘%ùpŠÍgÚõרPëfVEϰJ 9†_ÿ,«$SV¡ »&l+w´ë}_r Œûp K.æ:§pÙ¦+Mœaô¬tž;€Qµ»[Iʑҭzº[ ˆÖuñÙÑ8ÎHãAC¿ß5s—TèuGNÎ÷s½Z Vqع¡ï]Àvº#Ø~Æ++A7(sÁÅ l§cð(Ö&öÏ©±ŒÃAØZtô ®1v]vÛ‚««ȇFULŽr{¬_Ô<˜ˆ`àæW»Ks-@û5þ^v±r{¦¸”cþŒÂPõše£XfyxŸÎ§©‰ŒeoÚ) "¯Ù ‰W+Êdœ ÌÊ{û f#PEéW+OŸVžÌ¿ÞU•:¤Ó‰h™Xš‰´n˜xHalÂEˆ»ãòëÀX7ÔGnž«º\³²ò1žÂð]géA†tG(GiœC-‘¿í •žmˆŠ,u Â–§¢ÈÑÀ 3Ì„ÌA?ëq +\¨OݶåúÛQ@Rî7²Ÿ1ƒa#¸VÏ^¥èJ’ÅaH²#·235"YÌù¤ØÇŠãÀ~p ö½°po/ί¨êC¹|MÈÍåõ\þýÎùW?”Å!^¼ûxýþòúúbzÏP0tDÅ 'I¤ŽínçNó‰Ì»ËÐxè.ã¸]8.ð–ÆÞ²è½et²Äë~q¤û2êv¨xÝÅj>|äÍ}&ŽNŽs ð-AÕ |E„£×Ãħø?Ôƒ€˜DþåâÛF6Üc2¯Î„÷Þݬ }§ÌÀ!æp Ǹ¡TMǪæ0°ùgÜ|6^{ïÂ\/§ìF¾ùK C;Š÷¾R ŠÅGíOÝFRå:ñz¶[ÿòÓ<2Ò_a¼º3"J…ȧ2úžâuÊL¢âIî‘Ò–OmM±,C9&„N9!jTašê]KAɵå|êA~Íh0›d¢U„Ap,‡ žN%Ûˆ(ÏJg-‡-–ð‘ƒâD¢»®:5G•‚>íŸÛÝ#U8o¦Žƒ*J3– €Ù;Ž#C`=¤›7¤ËFæÌG ³ûºœwgØ÷)Øiz¨U'hÜÕZ8˜3:fãýkp¶Ò÷(™œ*†]… »Ž^tê$oX@2IšÇiàœ±{› 9rÞ=8ÄIj7=2ièƒa{AŸ!Çž9N˜Æ­”ãŒé•ÇâäxR¾ÃxÌÆ³ÚÌL/nlßs¶þÐsIt§‰W ]]mçTGeép;p S)?•G+DgØéÑ‘6&™Òk]pZ 4ˆÏî`Þ—Md˜ >N º€TŸç ¦iゕֆ¹êƒÙëÁë°4k€ª«~?BƒË ã)÷kË€»a3Íš2×è³{{Ž=º–¾è”SÉYdøºGx;¦Ü/ô­šÅÃÛÚ’¢´ãü£ÜhSrøèà>¿£nÝIçNæ:"ý²Õ:KCçæ¯F;A'ŽoÃ(R/ƒ7·¶ Ÿy¹mvÔrvÔr1cI•„ÆÉQº{ð9P2}|xõEwðrÌR´–5œ(œ£Á6†8Ñ x#âÉ#VìÂ~Îà䄈cÓ:°Plù‘Òg¾$ QXÄ‹±+øWXÞ =íçµµŸóHg‰{"îÃ…¿m»e·.j;÷#‰D’ªƒ8@k—ãÅŸ20©GN™ÿg¨óÕ܃ìȨ$ý+Ñ„/bõÙ’¯ ¥$‘R™u4Ÿ)[ w&Ñù2Þ$âlÈè{ÇÊ%ËÆŒa<½W¨œÐç±ãX§jOýtA›o0óCøããúË?kó+d™šÿÅ‚Jf |~^î;KW>üþáxéÿÊÉ€¯endstream endobj 1861 0 obj << /Type /Page /Contents 1862 0 R /Resources 1860 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R >> endobj 1863 0 obj << /D [1861 0 R /XYZ 85.0394 794.5015 null] >> endobj 1860 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1866 0 obj << /Length 3536 /Filter /FlateDecode >> stream xÚµkoÛFò»…¿]XÌ>¸| ‡ÜÄÉ¥¨ÓÔQpR£ ¥•Ì Eª$eÇ÷øï7³3K‘2ÝØÎþÀåîììÌì¼Ey,à_›8Œ3•'Y!Íñbs$Ž×°öæH2ÌÌ͆P?Ì^¼ÖÉqf±Šç«®4i*çËOAªð0ˆàåÏï^¿}óñòì$‰‚ùÛŸßÌ”Áë·?ÓèÍåÙÅÅÙåÉL¦F/ÿ~ö~~~IK1ãøáí»W4“Ñ㤗ç¯Ï/Ïß½ïyò+…FFþ8út%Ž—ÀöG"ÔYjŽïàE„2ËÔñæ(2:4‘Ö~¦<úpôKp°ê¶NÊOŠPéXMP©)š,ŒµÒN€õêd¦…º‹,vMs"ÓÀV­4yÇK]½‡Æ½ —R†™T …ˆÿض³v‘—tHIdB¡£”!oórgá¢X󛢥ÃV6ïvD ºÈ+>¾Xßt¶"°¥]Ùªµ---wMQ­iœw]¾øÜ:Ä*x]74m¿ä›Òt<“ ‘,J Œ€tc”#g[ÚS¸æÔwEw3Áh¤B!eü€Ï™JÒÔã{e*hl»­‘´ÙÖ:>f­]ÔÕ’áì¡`d*Ce†qç:§GWwyIÃ?v¶¹§!]Žð2ñ)…{°Â¶/†G¯PkY’ ”Ò¡ˆ¥ ‚÷‚Ø"¬ õßb·ÓM¿z÷feÃÀEµ(wKº x½-rš¿|"UœÒ<èQE ¤}0eWxÌÊ.ºâ–§HX–=#¸«,6EG@‹›¼Z­1ê)²%<;ä*~FÀí¼@áÀX~§jDfDAUIdpé£é–-!b>`€|À@ù^A£ ªÎÑe—ôr½ãÙì¢ÞU ¢Ù®pr³Ýu Áù›Æ!*Òˆ3º¨þr YkØ¥a,âØ½¬7›]UtîF\‚Sxº+ÄA…î­ ×–žk¸žÒІ‘ÜñÜ6oòílã±3@UÓ“•FN:N7ú{Þ¿ëÜ䄹{Ë"íí ÍèæÚϬ ¨ƒMfàä|S;½_ Ìmò‚©!ÁcÀPYÌf!†fÐH{ÀkÊâ®Tc]ËɌ܈, Î’ F »Ù:ãÇ·½cõæK#Ç`KcˆÜh:ô‚ÜÂ4^@tÀÌþPHqB¥|Qæ»–Ľ8Lߨy||õo';cšrŠOp𹨖¼F¼ÃÀñ.®_˜-=Æ–’ àij†Ò Ö ÉIûº½ird n4åÜÂqARöô3‚7¿¾«Êⳑ†’IÂLÅÙøº9;І¨t¤ƒ-]ëm±t^ÖÁÓM%MI¨¥éMô±œá!£Y&8¤§S-”Qï«lÓÔÍÐ&`iRöXÁ—†LÜNFàx´ú²¬Ñ”žp„¨bÆSVW$ŸœÄ Én˜ aÆ.…¬QKˆuÍ­s$Ìâ¦XÜÐt\ñ¥^¹ôAŠê¶h‹ë’W0Òºç OÜiœÈ`ãw2:zð©‚Õþ7!4f&uÅP.à )6¬JÛ¶Þ£ÇT v®ÆÃ;áˆÞ’]Frw~ìƒF¬ùšÜó8„h!ìòzK3¼i× ‘Rö8Ÿî@ÎC×¾iÀ&ôÆqº?Æ jó—ö1L#â\&äHêÓ9» §äZ R¯!<Î(Êp¥š´ 1;SÏrI¨âÞ÷q éNè9€cóò.¿g¢–dÊÛ­]bj±ö‘4Wi“ùØSÛ)퇘ezXûÐ17îþàl—2ÁÄ>Fƒ¸{6)…IªÓ ¼!¡Ï é«ò1*ÛŒäwÙÞÔ»o%6äÎñ~;z/mÞ2XD3 ,¶ê%ål ã鎴Ì5g 1»Ó–ÕðÚ.0FP N¶d$d¡0¹ÒqÄÀIÁ³s0»tÙeç ©°`cfóCew¡ÄP5‰kXMrÁ(½åõ[¶Øv„“pkçX°¦ð,À¼fI‹ ±6_ó4…NÑG’Gõ52¨Ô€$W4ÃóÃÅkõg])ˆƒwNið~~É£³SaIÏঘ=rnë?©pTõ†"ìF^@áô®û-“*X±C(Ø\'À8¨Â( nd+ÁÜÒ*3fŒ–*ëâ/Œòå²À£°‚Æwbgþ <¼ø•ó_çØúá7úþ5 JÂfã“ÔÃûñì¸Üλ^Ä9¿x?aß) û|æ‚t _7pÃÖ+ÂÈô=ÿhF÷"ûÇI¦{Mû¯IKîZ&ÄôQ³çjkÁ–åýp®­Ë[{@8G vNFïVóŽ»,Ð%ÉAšÜ{Û4‡31U°ò÷ùÅOĦ;=ì5ŞϿN%2a¥Þ+¾½x3E‰P§Ú»º¿M¦*àBO²º|ÝYD^ìÌ^·`µáT–†2K}@8{JxJD(÷Þ¼àóZp†è>Ý¡.‰Iº€4ñé,Œé,Ö@Ør„ÒPHg!Ó:Q‡M¡ü" êq,¹…÷‰•ŽHð ÷`h’òžQÃÖÝý»Mÿܵ]±º§—b]ÕÜ¢‹9 ããöìu=ɘÓ/T8µï¦À fëå=\O,­#ßÄM™§ö­˜ õÀ•À$D![®\‡û“öž¦wí$tÏðqÁµ,ÚQI%€Æ*ˆB>ŽüÁzp0 ÝZ,¤&¸ñ¶HýÑ…·¹Mþ™îÞp‹J™¡e(ºà¹Í›–Á™ó½™St9%Çி·i‚â2uT@!»–!®y}YWÖÏôÌO8{ö&ÂS"ö™¾Ûv_S¥<ŠÊ /!”4 –/Åf·¡—¶øOSÝj#rª`¹×¨ÎØp±¡<\šÃäf¨O‹K\Xš>q’æaÍl¸Ðj,Ã<ÒjÖ© •¯Æ€™£q昘Hm ¤–½óç‚>22Ftž»ÊIiìó»F²ÒäÕ”OcpÀÁµ–ž×¶»³–#AOâ)O\ßw¶ ©C?ŸÀ†Q™æ[Np¾¸”«dZ\v¨P§«û=¡Ü¼ô˺¯Î ¤Úm®î¤œz¥®-öYÚ-9Gã²c·DþÂȰ¼´«|WvR0%N…Ìcl=D¿Ü-x7ûk4I—Gã1]Þt´JdFÁš3{qóE6”æét]Šëu¦¨¾¢3 vÖ|„ÃùžI•†zåôÂ=á„ÕVùòpÛÎú‹N¹9=PÁyå¦'Ö;Omï¥qæÉ]èº&õMƒ²^¯¹¯œú0!!…òÈ4„7uUtuãûqÛR2v‚nbèj-0PhmßA5˜ŸH 환lg Ð0î9¤½Å¯@h‰ëûÄ8 uÅýç29™áo‚£„ãÃà‡üvT“7„9’ FªL˜áÏÔY 1à+¶¿CÍÙ|z±mìªøRÚêŠþíîQiœÐcÇô‰ ®ëõ®¥!ñïuó;6…ðõ{z\ME=Þ¼m\ÛyV|Y5ÏÀ!‡82ÑçâÑa—Uû-{g»å––›ò1ý‰`¶ô\# ã«Ú•swß°{†a'1¼Ò²âÜyŒÿñDW÷<ßö[äøÐ?cú³½o½Ž¹GÛQµ5@ðéñ•0 ¯XGÿû|N±YØ=§Å6rà9DªN­ ÇPŸkã}ç–ÀŠ’Äæ÷¼ÚÖM×[¾\MЇ_ö„6=…ÎÙm<$5~Hj†Ã(’’æŸMªØ,N²Ék¬j¬˜Ÿ&PHà ŠhümM4xãIqŽhüº0÷7óÿ 3“k&Ô}?1’%/ î'›±i²ÛR?DÊDĪàœÔO^”…‘ÎâÉ»Þs8"a?Í”:4I4%@tR‚W‡jù¢4ÑW%Õßèó…¥3üö-z6¥ÓÂRß.¬§ß×°T…Iª&ïm×Ú™>ÛÖuyëžà:Çûg8E›!Š©Ï µ ñÛÀ‰EÏè7‚¸ÿ>3W“¦júëB•¤a”& ÙLÓ”ûo’þ?þ§endstream endobj 1865 0 obj << /Type /Page /Contents 1866 0 R /Resources 1864 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R >> endobj 1867 0 obj << /D [1865 0 R /XYZ 56.6929 794.5015 null] >> endobj 558 0 obj << /D [1865 0 R /XYZ 56.6929 336.1901 null] >> endobj 1868 0 obj << /D [1865 0 R /XYZ 56.6929 310.8606 null] >> endobj 1864 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F11 1459 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1871 0 obj << /Length 4025 /Filter /FlateDecode >> stream xÚ¥:Ms㸱wÿ åªCÔž&»3ûœJf“ïK^mö@K”ÌŒD*"iR•ÿþºÑ ðÃôx6)4€F£Ñß ¸Ná'®­NRå²kã²D§B_oŽWéõÆ~¼øã»÷ï>¾ûðý»›µ°ZÀzÉ^Xðþöï¨õãÇ·úÓÛ7¿ÞýáêÝ]<Ëø¼"Ux^ýòkz½…cÿá*M”³úú :i"œ“×Ç«L«DgJÈáêÓÕ_"ÂѨ_ºÄ?­l¢­4 ÌĈ"µ‰Ëœ¹6Ú%¹’Êsð—›už¦«öåùrjÎÝúÔ4‡uÚ]YÕ]y~,4¥î÷åù;êüŠG¿^K•8<èZˆÄi-=ʇƒ¿{/Åuï€ÖufàŒ’&!³…Χ€­…mÊ3±öS;˺£îåßÓTÖUW55AŠzKŸÛb_òVrtPØIf‰s¹ó;Ý=”‘ž7l’ÛTÃdœÃ<Ç%U®…§hKÅjK´•-u7ŹØËª¶«6 ìú¿/é¿hÛfSš-õŸªîGèï|#ìª<6_ Wuqä¥L$ˆ$ˆ©tju»›¬<ÑR¤é ­=”7bUïa[™M”˜ÜV…„*À~*7®-·o¢WÝC‰,WÒoSÎE½/©Ùìx•§©¥iÕ¦A:‘–-PªÒlõS}¸Ð ¥Æ±i»ÙÎB¥QоåÅét¨JÞƒðï ÿ¿=”-Ó„áYÓpH²´+ÈLCóƒ°U5ÝùDQ@çœá¡;Gþo“MSïÄ4É€:ñÔ„Ø,„JŒ–Z0¥ù×ÄСbg¯‰¡Bý7bA ZmŠšÍfÓŸ©YðD¦kN9”åçï&“SSã=ìûsÁú@„xBÃ諺­¶Œ¹X8–:`˜˜àǪ|ZR®,±Ú>;ÊŒq$Ý/à_+뛚l*Ë/ïcR°wϹ§ ž¹+à<س«¦. ìO €#IÌâÝeibþ–Ë“™x¶}‹j¦léuöêš–·GYІ@,ÖNI³ÈZh\xRsZÓ “(:Xá¦ÊÐx‹¥R>›×Ñj_7ƒÖf&õ7à§Ñ„Ç ¬ nm8£n–øc O«¿?¹³r‰?J:n29Û|/‘%Òfò?Ýk`w¶ n‰› ,P1ºm¹+úC×&Ñðx­×~г0Ó«KÓSc[µd}¯{@EUYîy €±õÇ~°…ØFóŠÿû걪÷Ônz^_lyƒ¢+s¹[‹óç8³êè¿`,÷;çæSu8P‹]È£×D»ëÏ wç©M¥scÈ@æ ) )T¯½"õæÎC˜=Ô`¢–x·¨Rˤ†ï‡h\¼E‘çaVÕ.`¿-¢ý‰â)'"“@KÍl·ƒ  ÔÓ[\¶Ý2M²,Š÷éÜ<‚M\W_vK‚§á`¹»·†vn[vè-WÇŠô@O¥çºïx½WÆ®Íc1„ ¡\u솸ƒný ÃücÑv£I"Ü3L¡knO°mƒ6Äoê# &f—¤ÈÄi¼PoXHAH<=i¾ú—·›Øê HhwžöTãAj†?ðÞ›;ô'§R‘áø¡x,$S^²×’Òæ$r™1l®MÇ{.Y%eSðÙÁe_Ê%ùcâ2æðÎóƒ“Ik¤tS L@gIl—FRR3//[žŒ*ÊSÓ¶Õý¡Lè"oÙOûƒ!žÅƒIe úO³o—yt@€¾8p<Èn¹ÛLÂ9 M==çÇù!צ^s–¹DÈÜLÝÐŒŸx‰RÐY­Õ5àÐH§cBP°"Ðlxz·]hã³×TÜ•VAŸ›‡@€½ª‡]ˆrÁ–ãøßš{ÔóK[ê܃Ú~f4 òž…ó'–Ì͘‚j1± ‹þåŨ2³*x¹3©Ë‹ÇÖ‰d"ÜV’eb³$­Ì2/D0K›(°tƒYÂyþT–’ œËJ-­ ÂcåX½iÕ¢ÖÁµf©ÓS®‘ ’&ŸÊ±^íHÛŽDk)Íj@0 …$(‰Ÿ[AØ™äþÒ‘|»ÕßSŽQ4}GåQì*sù,äˆ&X ÀEÿè‰Øþ£õÌ"Y²"w„5K‡«Tn` $»þ@0f!@¹…Pû@ƒþXY:Ü`Kð‚À[0nÀŒ{~* A0æ‚Zì|ÐèÈ´`âHº²X $-„j‘œq@¼Bøˆ|yy{|(ßÌà¯L,!K,jÓðSÂÁÁ½lª®œ‡{Ñ‚c„ãÂIÑ~‚È¿^̬ð+oF»`EŽÅ—¯ê7?ýÍô;uA¿Ej0袿TÇþH`HSVv/[ÿ¶Fë‡ §å™ˆL›×õ95QëYî=Uµ/3[;UÆ4(#W\ÁÈY9ÏãÅJI**%¿´€T!¬¢«(EÅA’\‡.r,-ùé ƒŠ"tª¢p&ÁJéчtLò«ü¥ÄqS€¾ Ÿëæi.j¿]¢ÿs1e% ™óÂõC®t,¸¿xýiâœÊ§^N¥y¢2³ð@IõPVRC0†l!#zjÌõF«ÆõF ÷ Ðh¶ dk\6‚=oÚîÍâ9Rˆácð®áÓâã–‰6RÕ³LøbNK»DšH¡<9A sâ2:x•#¦ÎÙ¦÷•Ã+ç†_-–ÆÇ·šË!árâã6¤^>ÔR ’Û$‹Yd†-míÓzØîHoK‘˜¯“8[<Žü±–C9½X#nâÏÒÖÂá+ê,·zý(2>Üz‘‡0¾àAOBZ‹ÿÚ\6£ÛÈ #ÆgœL‹dx”jbM@O}ÆNè÷õèèšfËð Áù€8Æ?@lò…aèÃôSÑmBE0}Ö„]¨ƒÕ`Ì/ðŸpb "ÉDƒÌç.[ýSïèaÀ¿ cÃ?±ï.ÔáÔÙ?x}¡¶÷ã&DØÐð.# z‰8ø±À¾T˲à <廈Z ¼_Þ#Ø¥…„:®š¾WzcÊÎâv1]ÇfúÛ632Im|ö¡Kê¨Â‚^hú9„’Ù µó‹ÿbçÑFDJQðÖÏ÷3 4;Ë&~~ñ‰Ì$ÊEþÞ¼q ïÛøý"…¨ÜÌÞxîËYÚ8#b–DõÖçtd`3•´c4i¨öÚ9TG_.0!þ2á‹#šG¥SL€ëMâQ„Uõ}Ó{m2i,‹i8”G›LøË¦™=ƒS*ÉG™°jùåL—Œ_u¼Â¥R;/¾<ö컜q|x6ž]2 Ø“½}x£], ùäPá‰4¯O,΋Rf²DfQñ‚¢rè&’ÔùÇòoIe…–_ŸËË õær^oÈ íÙ‚(Z‚,}3bU’ ´Â&ó¯÷$~e“AH#”H„€Í¿áû=™8kíò×{ëˆq=Fé?Í›ÅÒ ÕJ‰ag¯,K•‰®)|¶¥c{Ó‘½TA×b•ž1`Îäm“› 4ü"è÷aÆó'Ð"_[£àà³O?2 ôA_ALÅêÂo^Ó§NÎJ2 ß}ºýñÍüV„Èñ[¾¤Ä i켿¦ÆÇÑ×qúz4Ÿ8>}aE>•nkÀ©êg¤änG)yö5f˜óÊö3LÌA[sÊnóUWø |}løŸÂZ3-sØ|j¹ŒLWeDƻ𸂟×?IÒÒºûê.øod&ïcþN-\©Qù,MƒÉÚÍöÔ˜Pîë¢ëcEÇ¢ŸfÑ‚ÿ}Y—gúL»}KlÐ¡Ž‹P‚ áÄ…`H”°ç-ß8 ë “P$› J7¤ë\™ÕÛ¥ÌlúBéK³Õ¾ª‹Ñ£Ðàh¾¡Â81ßôÀ£‡Ï*Žò§ü>$öu»¿„ý2äVLKoùõ{â²”‰ÄÆþ\úúÜ0ºää\br¿bµu’Šg¯Ëˆ²Ôæ©¥¶7Ø8ö‡®:x âÄ4Ká‡yXs¿ ܧ8Œ21šJ ôW4ÊüÅvÅõ‘g‰}G‚: (ÌEÎ;9üYúÆ[i|ŽY²iüìù¿þþ{ø8>ƒxÎZ¹lN0¡¶Ò™@ʺ9åñCñç¤ÿ?ÿ4mPendstream endobj 1870 0 obj << /Type /Page /Contents 1871 0 R /Resources 1869 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1850 0 R /Annots [ 1873 0 R ] >> endobj 1873 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [116.0003 115.3513 166.1092 127.411] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj 1872 0 obj << /D [1870 0 R /XYZ 85.0394 794.5015 null] >> endobj 562 0 obj << /D [1870 0 R /XYZ 85.0394 720.448 null] >> endobj 1716 0 obj << /D [1870 0 R /XYZ 85.0394 690.2786 null] >> endobj 1869 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1876 0 obj << /Length 3738 /Filter /FlateDecode >> stream xÚÅksÛÆñ»~¿•ê˜ð½v§3Žc;Nǵ•ig’L"! Ò(Gmóß»{{(Éqf:úÀ{îíîíû >aðÇ'ÚdÆ ?±^ešq=™¯ÏØäæ^ñ¸f–ͺ«¾¸8{üRډϼfrqÕå2æŸ\,~˜šLdçMŸ÷æåëWß¿{vnÕôâõwoÎgB³éË×ß¼ Ö«wϾýöÙ»ówšOŸõìíÅ‹w4e"Œ/^¿ù’F<ýœúîÅËï^¼yþâü§‹¯Ï^\´´téåL"!Î~ø‰M@ö×g,“ÞéÉGè°Œ{/&ë3¥e¦•”iduöþìï-ÀÎlØ:Ê?Î2!a c Ô>3RÈÀÀ‹eDÀRÞYÊ}ÆlfaM³Ë«úªØs7Õ›ýnžötÁ[@Qx÷äÕb®äÜž†;»1# pÓØ´m¾Ê÷uQÃU(=­·Å¼¼ºÅŽ™6@L}ýöFÑ⑆LÜ'á‘ó".Y,B¿¨#ÌfC—œˆ™Ì¸™—\A‹g^kºÚìÎg’©é¿7U-} -Œ,›e_4D'®7MÜP»Xbö`.¢ä5åM±º=çœOAN••Ó—t êÑ‹#}¸jwS¬áÍH§3£ù¤+Ÿµ»zü˜#ZBDÂo¸¤Å"C´Äô}¹.Wù.’¨ ɉ¸žöÛtg0Ò%+@ì’…{O%´¼„þd‰“™·‰ ç%¡n§ë ¡Jò"¥Ë¼½ü!£µ(š¼\ÕȘÔEA ’^h,Šz¾+·M¹©h`s5¦K,™OUR«Õ½Jª­üJ*¸L ËêØ6J ,VL¬™5Æ¡•¢ÉÝõ„ï:f­]?ënšµ!\<ÿ=êMâz n2{Œ’‚ë1`Yz( ìk»êD†Ð‘,J‚,…t“™@Cïîµ¾<]@µiÀÀ¾R#à0+î·»ÌA¿L ¾‚iñéW'‹kNZ\ý@‹ZhÈôZ›9¦tßÔ)°¬âÀå×MèÕEÕ`KpéÙ°mHPCëOÚ[ s¤Ý*Ø©= 4&Ø{ÊÞZ ã¡—,3¤ý`OPâ¤bGæå2š‘#+ÅÙˆÕ…edu¡‘Gm‰÷­qÁTu‰CÃtÂêJ7ëõ§É›æ®gpþ()¤O ÏL‚’<@Ÿ`…iŽÀ?ì‹ÝÝêä3wªÔÊû€'©³²õ­­6IËÚ$ÑeÉŸ[FÚ„st+aKG›Â’®60š¸Œ :ñ‹ ˜ë±øEš@I0“6*x²ï„±P ©O,ÚDÂ-!`‘&ÇŒM‹>°ÀEqÕZÉûoU›¾CÇÃ.£ŸVBe–9ßçËÿQÚ_«.aîÕÖÉ”éa3x‚'°­ð×D%Kƒ¹¦‰Fæ›õz_•óœp‡|tz s¿Á|Â/#¸îò–FêÛΠv¾X— ¹Ëgñ&˜Îœv²Íf9Âø½."/óùœ¡Îärê—X™uÞK úIC•¯F&K²D>RDÆ—”›.«°[VMQ-â\@„[2!Їë–ůååªèÎŒý–T;ëýª)·iÉ£qhnbÓlæ›UN!pâÕ¾!ÿV pû†fæ4>ÓÚQ5« j2¬¡õÕÅÅ[jµŒ†v#þdáı!hL¾îþleW7˼¡V,AËÓO`üÕÛrÂWèQæ­Uyùëz%@k…sÚ¡ô+Π-õPü£›Jóýtû´j(™ %øP5„3Ä޾)W+Bm›€¯ˆVØ_\@X•îÊ¡É[Ì)ZYÄû<ÜÕSp„ ò¸äº«*^!¯ÔÑzJ°”êŽm—Á?Òl0ÂaàŠ~cªcó§šÖ¥Œ´W¼)P€€ÿÓ‹s/¦š'ƒF»è”ДÅê>­#½sLÌ• kÍüP\ ˆ„µ§-!—`)­ðÉ Æ´J}¶´¶g]CiåÒCòÉíá以UC8t´ e“›zòdÌIEÁº%HZ£½<*™¼Žd#ÏÍaÌY²ÇGÇk믅»nV½;´R “鋺&¢ÞB¨ª%$sÊ0?L掟¹2o!Óïfv‘06M?9î£<,Ï3î,?í_¬Í$ìuq0âóÝK8ëBñ. 3ïßá`9˜.îE_ $ûJ>¬¡ï“7 ÿÛ†:!ß äÛ¬à úé%+Ð?Ä@°¡ŒƒQ™›]9'Sc˜Oá/™ÂMX¾«÷@ìë¼LE7ʰGôÇ‚Šµ4•Ú2z {Þµ‘áØÍáøö¹üõQêÖ#Ï»HÞ9Ÿ®¨ÓKêl‹ÝºlˆBéSNÒå…50Ôœ¨Q²ÌŠÖMÅjÁÀåzVNÂCh¡ÐS~¶ËMg]#.×CpŒív¢Šƒ˜S@x$Œúãl!Þƒ¤„Û‡°@ô‘ µ–•Pøæ[•€°N’5„Kk8"‚ ª}?).SÜùž’Uà1"À룱€@Ä’Šç×/ÆÞ^¬åUÈÈˇƒx'* ~Ôè8{E‰Ë:Î…l ݃Êe^n`’4}¥à ·í™M^ÆĺÄr0vÅC¨Þa2Ô4FzžD ðާìJ<=߯:ÆvWBFÝ–ºGòÌŽw«ò‚ESŸVëÒ™ÒÎ$ôîÜ#_ ñVr~|Ad­œJiULÆ%ñ4ô)»M¬ëW|z>Ÿ¢W© rb„K.Ýõ}ér¬ãQ\$Ó…‹Â¨ä:V‹´5Ü<̦0Û˜ƒt&cðÇi8†1ÐÓãQÙp¨ºØ8,Æ£ît:Ø|— x±6†Vcí?¿ý4Ä”*yØF¨ÄzÎûôá™Xÿ—a$«3¦§¡‰a†^­iú—Ijý­©Æ³î–`?û‘å2"°lší“Ç[æ=An=¸&ѰÁ’z«£·ôvÕ“ †Ð“¿Ž‡ºBË$§)‚ëãèâ¼<ÅO0Í™RÆ<œŸíŽ{ø9„|šŸ¿®WƒÈRÙÌÓ½›¥íª{X:„vŠ¥B)gŽÑp=}F²ûüý{j æ­RØdz%úâŽZªZùùjì2ö¨¢š¡v¤Ø:‡ -Øèš‚‡Öæ qu‚[Dh7eñ‘N±2ˆ£yv [–EÑÌæù÷¹žK²îëTEŸiϦÿGH¥bíW*‰µ_üAZqbh‘p6~ý-HDLQá±³ªøˆ”…ÇSc?\£‰ŒŒÔóe±ÎûÇÄ È4Ã'XzÉ€)Š#Ö'2^ŠÀ# ¡°UÆ€;ÌÄï×`¦Ëõ°'\ÙYé—‚ø‘ŠHq ½Úl®W±ý|™ï‚‡ö³·¯ãÊ Ä„E±£þ"orj‘ÄáÚÔèZPôòë]¾]FH ©XÜÓð_ùMN_xF>I2)K=–űböv»ŠNOg>½S@kQ€›^P;¸AFåhø†Ãïñy,ôƒÌa#Éœà,V™ï†A#&Vxü°¬-l¬Ô Pp^ Ói£ïµ±íŽYwËÐÆ!ßicÇ8LdG6ëFãm !TŽO ÅøµÉ˜NkfECó{ é¤?c$ô)U=mµ;‚~(bÕ)¤ÕG¯†:Þ(N¤Å]£.Ò[`ƒã'}¤Ãc¥ûŒ¸ËE¦ ®ô=ä1Ü»/ïF«û"cܸ;o¨]t÷ `ýÎ;¢â ÓÅÉ£O…exf4ñÚôPfuW½(’5‡K{®¤%—·é]²ˆ{z˜8žÂYßîÚÊðá³ÞnªE|– ï|°‚ü°_œÜÕìwU|U¥a,²mãËÿ±Eks†«Í¾ZÊqÃwº±é!(Å/àG.–µŸ5|ö‡ö‡ÿB€0I:'Æ¿ñ˜œ;‘Bê<`ž¾È¢þ?*BCÝendstream endobj 1875 0 obj << /Type /Page /Contents 1876 0 R /Resources 1874 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1886 0 R /Annots [ 1878 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R ] >> endobj 1878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [370.941 719.9611 439.613 732.0207] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1881 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [134.0621 178.6003 267.5615 189.4146] /Subtype/Link/A<> >> endobj 1882 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [297.4503 178.6003 448.8825 189.4146] /Subtype/Link/A<> >> endobj 1883 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [353.8228 97.3808 511.2325 109.4404] /Subtype/Link/A<> >> endobj 1884 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [55.6967 86.671 69.6444 97.4853] /Subtype/Link/A<> >> endobj 1885 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [283.6482 86.671 453.0131 97.4853] /Subtype/Link/A<> >> endobj 1877 0 obj << /D [1875 0 R /XYZ 56.6929 794.5015 null] >> endobj 566 0 obj << /D [1875 0 R /XYZ 56.6929 612.2421 null] >> endobj 1879 0 obj << /D [1875 0 R /XYZ 56.6929 584.5745 null] >> endobj 570 0 obj << /D [1875 0 R /XYZ 56.6929 484.3174 null] >> endobj 1880 0 obj << /D [1875 0 R /XYZ 56.6929 450.8755 null] >> endobj 1874 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1889 0 obj << /Length 2896 /Filter /FlateDecode >> stream xÚ½ZÝsÜ6÷_±o'ÏdU‰%ñòä$vϽ6¹³Ý›¹IòÀ]Ñ»šèc»ÒÚunú¿@€úØUjw:wã‚‚ øÀu¸à/\dÒ"/Rû2åb]‹ |ûþ,dž¥cZ޹ÞÜ}w¥ å«D$‹»û‘¬Ì²,\Üå½·»øÇÝåÍùRÈÀKüó¥LïÍõûw4¢¨yûáýÕõ÷?ß\œ§±wwýá= ß\^]Þ\¾{y¾ 3Â|Á¾1áêúÇK¢¾¿¹øé§‹›óÏw?œ]Þõ{ï7 "ÜÈ/g?‹¶ýÃYàG*“‹Gè~¨”XTg±Œ|G‘)ÏnÏþÙ }µSçì'£Ì—™Hg (ÂEúJJ1± T~‰ÈZ7-B°@^·?´É—_ÌSK½ítg*Sw¼ï½®*½Ç}w‡£ã K‘øq(+v*)ÙÿÁI ù -³ìõæ¶Ûõ†ØêCµ2ûß§Çü¯­ØÀ $·øxÊ÷ÇåÚæ£ïûŸ?Û5–³ºÿöšŒ155è#_¦áÈÈâ¥F~g>¨‹®hjÑuNÄÏ­Þ^P|Ûúw[Ók50…Ê“4æ“:•>"x\À'4h˜^Nš–ºïÞßÞ^¾%º5ëþ螨·?3¯iº.V„΢uÂÚõ¾X™œ‡ëã['îFœ-ø"Tÿ¦ûÍ‚ˆ›Ñ…èù—ã t!Æ[<•‹[½5k6<(ûÙ±62ËÄj¢Ìéd¦g48‘… XSÞ…³ç’¼/±/•L=½7vöƦž5/´î¬Ð¼Qà=nMM:pK쫲X Þ@Ä}³'BSS7õRºmëé®xà¹_›Ú`·Þ—ºy¬_!-½Õ•YëºvŠ­xªõTÙ”OÓKL7«Yuº°zGaÚÒö›- €+½"ʰ•=Ñ+³Ö‡ÖP§è°•V5’aú¹D &Ãm©f^ËÙiÒ»>™çV:Ôm±Ýý¹}¨×ÈŽ÷6:ö·º¥‘•ÁS¡uSãùmØT9Od>MÝnžyö:S†aè¡R¶ƒ¤#ÂYÉÒÝT0܃›°Õ¹Óç<ôH¥Ð{Ðe‘&×Ì´#k>˜z“‡ãöÑF) j4Ú6垢ŻÐf×1<ö 4¯Ý#ceÙ3\š¨‚yÚÃ*o*ð)–ÛÜó\þ< —k8ÁÌWYÙ½\ØÕ¢Ôc êS ‚i講=oj×Ô¹)8Œ~ÒcHݲ CšPï°¥Ÿª4y!bgÀ¬Rff%é¹ð敺†Zó+,O$±nhJ^š–÷d íãV3çÈó)$JÈ8Tzí>aBœx­&OÄ3”w[TE©÷å}%‚Ž6(P½u€ž·N ‰ È^lœ,Ë37µÓ ¯÷téÁvÐëÏZXËAëüßI`<ïï—ÿv©B¹B¢¦Wàæ¦5ݱ÷&ý‹ówö`ËNäcáü›`ˆÏGýŽœ4ýý$ R½Üja’Ì$‘BLG"CˆB¤¦ÑêPvÅ®4Ôãp¢p{û´b@½Þös[8h¾"Š]N¹àd%X»/]^®ue^‘­ÓÔÏR!§.˜é ®ÅÒ!S׬›’‡t¹ÁP¶­l?f.HñFCìMbêÐíøVÃnƒðê<™Ix.¤Å ,)@ùÛ^§O§WެÍcYØë‚3Q‹™ˆ±Öû}™ß/»ÃÞÙைv›ºécÅþ:çqt( ‘¯üš#¦!îŒÐ¶ÒOSçkweÁþxعå:–5rèÙ]ú3yä¶Ï»$$á‚]’Š3RZº1@XÄŠ#Á@×ìˆ(̓)‰„“;­dB¸’ÎëÑÓrÌq?£ d 't°²'±àWÖê¨5…y~q¬§Áç‹ÙÅy8;ã=t5tÅ0©¯‰H4‡®YfuËà÷dê(*ž–*ÍÎ@„äOc‚¨ùYíIX»=ìvj¾Ââ^RâÁó«® Dò0¡Žkjlez˜aï–6]â"5³¬›Š³ªDdÁ”ÝÀgÊQœdKA¹nXª÷­™ÚýCóg"Î[©@pv„Šh{—ÿËLá£F€>5#ò=n L ‘$%ÆBš2¤YáÝj0ãkQûiË¿se2žIq­VÍÁ-½2t¸Q‚ ‚O­W˜èDø®ÒP;” vtk«ïþÉ)]?Q6õÆì_£íß0èw/;`_fGße ÔÜ^ÞœKéýë ½ðâúÇñ,,A[^pÝäX}KÃvúÐ:sY'äõE}putÊ—_Û³GI” ÜôÓcà¿RÑ‹+ˆ6S™ðÝ>Ò´¶¹Äèi„ïªP¥jzY¯ï%„ð¶Í£Á½Yy„$†Ò½|õhúüz}ÝŠO5µsn&!¤™Qòâ€ñÜs¬]–Ôù !/;£+_v$×ä_V¿<) VP%¦YxTS ÃÊu¾\=!}TâÑÃB6”nîmPy®jÓùƒ†áÏVó‘ª4gÝ3v'‰°Ø#.¾"(ºíšáÅ£¯3Ï)<(ë‚@rà‡q÷*:š¹Ë¦¨u9L$Ó $P€LLcáW$ñ"óWs!<ô…Ê’ç7™™m¤ÛÈ- RÖè õ^C!Íñ ÆÛ ¢÷Ö¾rô\ŒþHÐuHâ1>CÌò®;­©Ë¶ïmÝ@üùjxY÷‹¥ŠáÅb ‹}EL.RW'Œò0ÂO}ͶÐM†¢|mtË¢-E?˜Êár¨¸éu FàkËê.iËR+Hb«â+‹éëöÒ†Šó¿c(ʈQ< ´G¥µ»\˜Œ4³Ï3s— ô£¨œy ߌû'­qäJ÷&ÓROSSÚ?¤ì“E»A‚²e;ÔP»â/¬Ú.KÁk¶Ä¡,RE ùLå^Dp½¦VÖ/²ÀO3ü-flN€ULC¦}Qˆ™OaØ:nÊŽ-—à91Ð âXf¸{û²‰£EeŸ›³Ð¥°‘{üKsOðµ2æô2b÷6禴˜Æí;30í0š1ÈÈÂâ£qDù©Ðë/~(Ú™‚¢d..ŽŠ­¹ó—~*#WCà¯F™taäWF׬Ë|ÀMS ãøÅñGE2q6_¬_Á¢ýS k7¶{êmB9T ý@eÙ X9:z”S”‚‡v¾:t‡áÙËS‰8ÑÒ?V!‚•ÖßH¥R=K{~°³!bÒKV¢õ û L (Rë®×Ò¦xßL›9D Ý|ëßøïHúø“ÿÌïŠA_ÿéÿ,þí"†²2ËÄü/”„»L¨Ô)…ûQ'š÷ÿ‚pªúìñî‹endstream endobj 1888 0 obj << /Type /Page /Contents 1889 0 R /Resources 1887 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1886 0 R /Annots [ 1893 0 R ] >> endobj 1893 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [461.1985 616.4281 510.2452 628.4877] /Subtype /Link /A << /S /GoTo /D (DNSSEC) >> >> endobj 1890 0 obj << /D [1888 0 R /XYZ 85.0394 794.5015 null] >> endobj 574 0 obj << /D [1888 0 R /XYZ 85.0394 769.5949 null] >> endobj 1891 0 obj << /D [1888 0 R /XYZ 85.0394 748.9522 null] >> endobj 578 0 obj << /D [1888 0 R /XYZ 85.0394 667.6879 null] >> endobj 1892 0 obj << /D [1888 0 R /XYZ 85.0394 636.0345 null] >> endobj 582 0 obj << /D [1888 0 R /XYZ 85.0394 425.9376 null] >> endobj 1894 0 obj << /D [1888 0 R /XYZ 85.0394 394.4436 null] >> endobj 586 0 obj << /D [1888 0 R /XYZ 85.0394 313.1793 null] >> endobj 1491 0 obj << /D [1888 0 R /XYZ 85.0394 281.526 null] >> endobj 1887 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1897 0 obj << /Length 3792 /Filter /FlateDecode >> stream xÚ­Zmsܶþ®_¡o=ÍäX ¢þäØrª¶qRY™NÇõx¨;žÅ˜G^Ž<)J§ÿ½»Ø¤ Kyæ@ûúìâ4…?qªMbœt§Öe‰N…>]mOÒÓOðî›Ác–aÐr<êë«“?¿QöÔ%ÎHszµÍ•'iž‹Ó«õû…Idr3¤‹Wß½}sñÍ—/Ïl¶¸ºøîíÙRêtñæâçÔúæòå·ß¾¼<[Š\‹Å«¿¾üþêü’^žãë‹·¯©ÇÑÏ#“^ž¿9¿<ûêüìÃÕßNί†½Œ÷+R…ùéäý‡ôt ÛþÛIš(—ëÓ;xHáœ<ÝždZ%:S*ôÔ'ïNþ9L8zë?òO¤‰TFF(eŒÚ%FIåøªmºò§CÙôõý™bñÕÙRevQàÖ`1šÀf°Ž„EñÃmÑŸÊõòsyßñØñbÆ%Bæ–w}Ñ—[X&—ù¢ØíÊbßÑCWm«ºØãƒ]ô-ˆ,/Tžh—úý¡ë'v›)ëx0ïj]mÎD¾Ø”ûªùD+U ýö7%5v{Rve³*qÞÓ¥‚…Užç§K!§µôS¶Ÿ†S»èÊUÛ¬©ó?i*ËzËJ¹€þ¾¨ZóøI¾ÚïZ¿Þš¶M6ìl"ó,ç=À}UÔ¸áÃubµÊx,(t–«ÅUXè¸q¿9Üšï¯:&ñî†_Ýl[ž¿¾«®áÄiT’ª\Ny‚Ì”NÆÅç’Ì¡&?Kz.Q û<ùW5‡’&GÁßkÿ,`ª³|ág£þ ®yè ðŠ(¢Ýѵ·í-}"ßÓn#BÒ%2 J×Ûr=›8ÑÖê|¤r),Ì,aéU¿x-À–#è—±I®MxI®¹ Ç_á7Æ×L'ZgÙ3Í2O²,sÍÒ¯ÒÑoÛÔÈ5pˆÄÚ3±‚ŸìÆ2‚¶†çkÙdf‹ Øž“aÐ_ÈÌ6 ÷~‚W­[ÏÜ%÷TLW_|.¹ËË>ªÛ‚Yãõ¼szx+3t NOõt]ôÅuÑ•ä΋fM àǾ§&O ¾þÍ+j€cÔúì• [0ê¾l oNØA¾£]•]—øõSXœ¸.¿®·G²Gÿ°ïzzè«m,¨“6F5/Â\%—šÀ\/¯¦£yïªþ†Zý ,¬~¾ÚŒä|:YðkP¹ˆG²"ÉþmÖ ÓÌ‹gß”ýê¦d:ûÀ•×oßýýüßÔ¾¼ìÊžíCB4 xSVDïª'mÍVìŸH‚Ðø¥m¸UìÊŸ‘«XæÐw 6 êà ½Îô'd§ã‰HîÐèvåªò.ž'ñöÉC RI †6¶‰j58òÁDÁ£+“-.6̈ ƈ™ÿ´6pÒk°ç¤o’…§´é𵏫>5%†*Öû†Çξ9t%›IÑÍlL)Œ"³ÆAôÓ”wÁVóL9¦`+XbÔ\Þ U—+zjíÚªáfÛ ŸU9°¦¼… à€D¦Ÿ²$в|À7lI<{ÅËueÙjb¢¶*‘àŸ‘R-å\Ò¼$ØÇêsX¬¥ß-xB&„­•µAdÀ5m¦Úà]—Ê».•±Ñc×ÄuaÇü0¤¨¬yèu‰*¯††rÄW^ÚØ ´C&¦oÖ-.…{2†¬ÎÏ´¡·]Ëo<ƒ±£ÚîêûAF»Áp$ BG|ããè¡}Acº>tx|'Ô#ò&Ĭž=]ž_[15MÛSƒ,Ä/ÖÒop.ôT4Ý]¹ï^àNÉb/1^ |ÆMv„Æ–ÄÀdù ÀbÁœ®ïg9D¨`GƒëúvðóÞ¼›Ù·¿ÎPÝ1®âƒ¹ÿÜSë‘ fÐ@ò'ƒšÂ åAPÃy‹M_î¹ÉkÂ$Ôò¬”à%=+#pEŠDáÊFh€ÜR4Œc‹~D™²4ÉÒgŽ©š‰¿4ÕÀNVížÈ\¬¨ÀK=Ð…d°ìð uWÕ5µ®¹g }­ŏX£Ø‚óÐŦÖõmRu«¤ÝzÎA‡±Ú5\éºõ–°ƒ.'KeXD×’ Ë#èáäÝÒù‚3RUúf4 !< ¶ÏÕãUáiIíúPÕ¡ÊÖ rŸp&3ˆiä³\•™¢ß¡¬M‘aä#!ûÛï«õ:”ú¦Ç³Ú$µ™ 怨áË’áBD<)ºD=ˆ'L9phƒI,øM«±>NgÃQ®ÔgãRFçž¶wã3Štñ;Øn‹}Ö"nJIf0<×G_$@¡)ì™ÈÞ¯ê¢ë>ÐøÿÆ"XÇêf¹ª+ ¤ ãüO±^ïA²ýˆµ®Øÿ¿Ñ*–Ÿg]v}ÕxÏÿû'Û—€xºê¶\R†ãïËîc»ÿˆé4>¾ˆméýˆ=äµ^PO’$bËñhć‚Åü›e”ÁDÿ\`þ 4!KõQÌSðºDÝCÛl›™¢ÿЊèäL5®âŽß%Rºàƒüò?œA–˜ç±ó3Îâ4ekð³kïÊýæà\ˆe%xHl†sHèC@Œ#ýC÷ÌP×0"÷ÓY¹Ú¥1üïo©Fb¸´8øúí;jüt( D™Ù1pHÿ1¶ØYÚD… ‚å®U—¾»»aZqm¨èÎy¨ýô宨Cx9P0ö=àp‰96âpŸN—xÜËËu»ºâ¹hGØWö‡]J\€—}LÁoŠ[šFS©–È•ÎCÝW»z¨W ;»h}ó¼XÝÄArú щÌDäÄU ¬õºLumÊ.¡—T[>c!€ I,ÀTƒnW¬¸Ÿã™!•œÊBOÇueéëÄ£uºÃµG&ã•ØÃùúº^¼d Á #f¦!41½%G䑜 $6· ídÃðà1¼«zÔµd >FÂóÅ÷ü18@ºÑ…üh4õÙ¤ÙB€}èünŽÒà_´>½NÉŸs;G&Λ{ìnÎr˜q9žÒ_¼™Ð§4^!0Ç…ßý€ÆÜ%V óÒf|ŠF'+!˜éPD§Mb­ŠßnŽÂñ Ôß?uñmkÒc9£k˜”‰Ö.©X²©2ˆÞ_dÅ¡#&‘“ªacl©uÍëv º†èšëaåGu ˜ˆI„eÀþ߯k<ãrÖþHHÕ·eáŽ}Âcj;œUAWi‰q`æ®çÇ'¤âh ~ª!!ÄWá´•–}äš0¤Jx·7r©7Ò¤ß}…øx¿:³xUÆo–N²&a¢ŸN> <Ü5~Húÿiqâ»endstream endobj 1896 0 obj << /Type /Page /Contents 1897 0 R /Resources 1895 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1886 0 R >> endobj 1898 0 obj << /D [1896 0 R /XYZ 56.6929 794.5015 null] >> endobj 590 0 obj << /D [1896 0 R /XYZ 56.6929 379.8023 null] >> endobj 1826 0 obj << /D [1896 0 R /XYZ 56.6929 354.9028 null] >> endobj 594 0 obj << /D [1896 0 R /XYZ 56.6929 225.0837 null] >> endobj 1899 0 obj << /D [1896 0 R /XYZ 56.6929 194.41 null] >> endobj 1895 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F39 1178 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1902 0 obj << /Length 2085 /Filter /FlateDecode >> stream xÚ­ksÛ¸ñ»~…&Ÿä™ÀwýÉÉ99ß4º«ã¶3Íe24Ùœ£HHÉQ;÷ß»‹]ð!ѱ}íè pß/Pj*᧦q ¤—øÓ(ñE U0ÍÖ9½ƒ½ÅgæîмêíÍäÍ{/š&" u8½YõhÅBƱšÞ,?ÏÞýxñËÍåõÙ\rгyÊÙÛ«Å„IèñîçÅû«¿¾8‹üÙÍÕÏ B__¾¿¼¾\¼»<›«8Pð¾f ¼ðþꯗ}¸¾øøñâúìËÍO“Ë›V—¾¾Jz¨Èï“Ï_ät jÿ4‘ÂKâ`ú )T’èézâž|Ïs˜bòiò·–`o×¾:f¿À‹EëhÄ€Z0HDèiÏpŸ›‡³DÏ@qO³›{ zÁ¬Úž©x¶4[^®èÙÀ>è ”U2x$†]§%I‡úìµ/ü(â3u“6fmʦ&º9?ëü®Ì•RgiÙêW­#„üYJˆ¬ÈÛ´Ršßw¦fÄC^Ýšþ‘º*öfÉÌÊNK8«ÊÆ|kZUAøé\iOxR)‘¶‚Ó;(丞ZÃ8ò¼ðIk„:r&kîÓ†Èæü\§MvojA²„RÄ¡_«H$ 8_úWU4›ôÁO(Ni”¡¹·JJ4Ú©„Jjð…§žQ…¡ì1"ËvfUYg-Ž,³ÌÔu~[:ÑT„'DZȬ2l[Ur,¼´‹(ô£'ÄÕBya‡ žuÌÞˆ(/ïÈ ^A^Y‹öœ æ…jöo0,BÒ†=b¬×¨Ó5o• )NˆYïŠ&ߌE)ë×ÇFù ƒpe(ц}>j¶L›”ˆ@Üê–ùÜå{Ã(´£==FN:óZžÉlŒªJ§"Ló-]ƒŒ¯9ˆµösˆým™6-—Ý6äÅÑvçFŒ×’ß¡G½)\ÿ°øÄ8Óì6¢¦ÁÓýxT_àÉéˆM“WeM ¶‚yÙ l?*ð]î9"§Á9{€9m m}€@ZÔA·,Ö®¶9ôr ω@ÐÆ‘~º ±:–úÇwŽ°Ú–¸a(|Oîfc“0I\:ôpoPW1, Jæ6·åO‚.Å.+×k ~ÍþÙ+«îÀ¼Þ˜Œê5#ÓbgÌ™¸u¥â<:>Wã´«³#F Eä·9þ÷FB®Äg±|çI€RƤôXšU ™Œzûzv!ðšz#¥+é‚-ܧ{3 A «*ŸmÍåxçüÐÚEƒ¾ƒ~VGiµ>§$5w®SÇ’Eæ¬nÒßøð†b'3KSfŒ«öv,°T+GÕ‚qM<Œ¯Ÿ•˜RŒ ܽXá¤áËÈ?ÎhêPn±Ö³”D¦EV¤5ã;•¹9\­hÃFôðlÎO¼Zùýí«ÅðlìÖfÉtUÃÜ]“ ¡”ŽY9w¯ï;¡×;;Á 0Œ¤ãIÁEê×X I.åuÞù‡J;ÃW W»I¤’2UëM^˜åܹ° _fVVok¾@#“Öâ0Ewæ‡=0íi0„øX>£2ú~26/]Õ@€Õеw´B›œ&«é¾Vš˜2…”qîGfÔu(t3 YÔ,ãÇ*Š4T äY½C&I<Ò=€6½¹–‹ «ŽqOÌ3.Z÷{©””8H¢dæŒMY>v™€’€o“hY/ëœè½Ìl {í¦ iKԈݠçÂÕÃ{"}!£$|„17,MY¶Ûº†ñ1ÆÑ“Âõ’ TÇÑu h8¾½¼õ*Ö¦oÜ™…ËÆ,èj0×6‡ fûC.ÓE*(‹á1zWó½ãø^÷f˜­þœž¡³þ XàV/dì©MÅ.„È{å†ýW´þ5–Àí28ºè¾yCGnlò!TßW»bI0ß٬С8Ú´*MóPm뵎^ÎÛ×çíE‚D±%…ý½‰Ï ñǹ#º%PÒý²­öEv±5\u¾çem¶û<ãæè@È©Ñ\ØLÅX3fnXñÜÁÔG’zKš2£ C¥adç& >+ô=oqh xaLǃ&TR3+vK;í[~Ëå®ä¦Òz f¹¦Uµ£ûª'É÷bˆKûac\¼ÔÀê|Œø*/ŽˆÏ\byûêœóy,FÿßTýÍ£Àéå‚»Ù>­‡³ïÇ.êíõ¿”ÈÙ‡mº^§Û‘V„.„ÔQtd(„¾ÒÇ3\~¶£ð—Å8T^n±ÏmnVsüÂqæUÁ¯6ƒ¾yÝ´ÙbŸ_Æ\|JsîÂû%dÇþ%ïà§ý‘oú²õÌÿüB÷÷ ¸×‹c=þç€'áâ­aÌd¡PõÄ;–¼ý«áTôÿ,ßÈ¥endstream endobj 1901 0 obj << /Type /Page /Contents 1902 0 R /Resources 1900 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1886 0 R >> endobj 1903 0 obj << /D [1901 0 R /XYZ 85.0394 794.5015 null] >> endobj 598 0 obj << /D [1901 0 R /XYZ 85.0394 146.1982 null] >> endobj 1738 0 obj << /D [1901 0 R /XYZ 85.0394 118.9629 null] >> endobj 1900 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1906 0 obj << /Length 1241 /Filter /FlateDecode >> stream xÚ­X[s£6~÷¯ðcÜ©ˆ›aò”MmvºÙ­ë>¥á¨Áˆ•äØN½ÿ½l’€ãñx }úÎá\…ú†ü¡¾ãB×7ýþз¡c §.zF.ç>÷Pñ(_Õ·>Mz¿ÞXþ}×tû“¸‚åAÃóPÝ_¸Ð„‰`\\»»¹ýü÷øj0´/&·ßîÀtŒ‹›Û?Fúîóøêë׫ñ ÏA׿_}ŸŒÆzÊ-0>ÝÞý¦G|}yt<ºGw×£Átò¥7šìd©Ê‹ K ò£w?5ú‘ûKÏ€–ï9ý•|0 ò}³¿èÙŽ۲ʑ¤÷WïÏ`e6_Ú¨?d@ÓrÍÚ¨¢@Ï€®!¡†Ž]Ë´rÞ€kA’Ð,HyŒ™û¯˜Š"†9Ÿ->ÎÂ…ÿy©¯S¥É }Ç1a—Y|6P ÂG>'þ¤G7˜Ï(›¥´U¢”syyÂAÓdÓ Æl€IhIH*0{=›.˜µ—'£  K˜mMoúÝ™~wÆ–I¡Ö{áôM¢úwá¤TxSƒ'ÙL}™3£LìÆÕC±ÃeŽìYÐõ\Ô(R[œü"©—Œoí£m ˜ë ÇX,ÝÆI¶džR†åªmø–f4âb}:\ÁI¢0`QwÓëyïùè;Ūf Šam@³Ý­C­…Wf ‘tºm‘ЫH‚,:!Õ8UóÒ^ŠÐ†×™ÌDÔµëƒ}*o½ˆp‹dB§iÄ[‹]  8 º[e¶|¥Ã±š^»ïh²;.£P¸OÉìŠËosä¡5”U!@ph[vóK>å@8tû•ñ}ôy/^I -hÙ¾ÿ–5KðìV‰ºÇD=Zrÿ‚¨ó QçD¢>‚¦gÕùBS ¸„¬WIXI¼Lê‰WZaéÖÛRÀ·øZœÌ,I$soc1YH¢¦­mTáÊ*-G}Q=;ºeE]±dg€› Ÿpd!tI*õ¸'C0ñà1V'ÏS@Ð1Á6åñ!ÕE„áPPV„£,3UZ·é'–2êv¨ÒømËl·¥qÜ&E§ Q¦-£{0}ÁLu5*!’Ss4ÇL­E× X<Ò¨$2¼À©Ø.S²Vʮӂ>2ì:¹Ÿ—å^zZ÷Ý*”ìƒJ®ç»Ã$à|Zjji#ìÞox<ãËw»ð†v¯cŽŽAeEÄ6g>.È1AÙ-œ ö‡èµÃ P”Ø;»=íâx¡´C¸›ÀÒ¿’ ʇš[¿¦ã*ËꌩápIþ b>ÊÚŸóÙ²Òðb^žySÿáôi©endstream endobj 1905 0 obj << /Type /Page /Contents 1906 0 R /Resources 1904 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1886 0 R >> endobj 1907 0 obj << /D [1905 0 R /XYZ 56.6929 794.5015 null] >> endobj 1904 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1910 0 obj << /Length 1212 /Filter /FlateDecode >> stream xÚåX[s£6~÷¯à1îŒT„¸iö)›:Ûìt³­ë>¹‘¨Á@%±‰S÷¿W °±ƒ°gŸ: ƒ.œO盄 S=Èðhbb±¡c"ÇW#Ó¸WsŸF¨þ4?ö_g£¯±gH\Ë5fq ˇ¦ï#cÍ/®~¾üu6™Žå˜.Ç5/>ÞÜþ¤Gˆþ\}½½¾ùôÇôrìÙ³›¯·zx:¹žL'·W“1@¾ƒ½U#!¸¾ùe¢[Ÿ¦—_¾\NÇ‹ÙçÑd¶•¥-/2q)ÈߣùÂ4"%öç‘ 1ñãIuLˆ±ŒÕÈv0tlŒ›‘dôûè·-`k¶"íÒŸƒ}èø–×¡@µˆL›x†çèb WœkšE’‚ð†àQ<êÑ5ËŒ/Óìƒî/JÕª!HÇj#D©4êóH×%D–&ë“a’,ˆŽ,•” =›«;Ê»aPŒz NÌŽnp¤»=ø’| d˜NcNÅÃpÁ‚Dd Í$‹k­ÌóŒKÝdù²ì,tïýùÓtLÝZB)A,&j‚Í–.ˆ"^­ŠÚȳÔѱHJ×ú/ÕXl×G{ê™Cë¹÷‡kï ®m* VTì{ xº‰–lØ}šqúj±77—I‘·ÛË,—,K{ïfÌ’Ú„ä,½ïM¨·¢$qÆW܉$é³Üðài(eOëÌË3¨é`/@ªµ9 û¨!ãj#¢ ¥ÏnbÆ…$E£ltÏ‚çûVú¶Õ×Ë(kÖë°´n1ØsÌÁ] NÛÒŠ:æÙ D,Ž)§iØXê;þ^ÁÈUΰ-ìÔ ä¬ê€ñÿŠ3¥;TšK²û–?è”ÑÛ”KɃT(K,R~ÎÒ¾@ÖÛ@Y!ÏG’l5„%ô6Щ,µóØyÖ&CŸó„…lߎ´]eÐ{)Ñ$¨‰T"ÏÒHô»FPE€È‚á‰;/î¶VÛVÓ±ö@¯ßnˆP¡<¤;Ÿd¹ÝŠ›í|Øò…=ÛÐÕ”‰ç¹Fk|çXïÝÆ½TýŠQ§øßÜ6«îkV‰-WÁšUç«Îi¬Z&†öÈ‘RK‚Ajm¡}^ ´TèêË뻪µ,‘gºý­ âÃó gúîû»Ë4lmLÜN AÁQqµÚS{y‚ëAìYö18çy‚‡!¶ y+žôõƒS}ÛBA«:üu¨ó%K)2*Ÿ³°˜q‘${A¹Lùto$Ut=vK°{ Nf,brÝyN«%ÑEïx]âª7UQT˜¢¦˜¢Ú(å7êôw>”\ç§ê|œ\£®TUXŸ<«Ä}rq zÍIu>³ Ê+†ˆqʌש9äò> endobj 1911 0 obj << /D [1909 0 R /XYZ 85.0394 794.5015 null] >> endobj 1908 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1914 0 obj << /Length 1007 /Filter /FlateDecode >> stream xÚÍX]sÚ8}çWxú;#E–lOŸÒ,ÉÒÙÒ-eŸX†q°H<56•DӴ俯ü1Ä ÙéÃX–¬sÏ=÷ʺ¶ùa‹qÈ=âYŽgC†0³¦ó²îÌØM Ï€õC úÔ»aëâš:–=N¸5œU°\ˆ\[Ã`ÔæÀŽA@í«ýëÞÍ߃ˎc·‡½ý µ¯{vóÖÍàòÇËA`—áöÕ— »ƒ|ˆïzýßó/¿ìt¯»ƒnÿªÛß·ºÃÒ—ª¿ÑÔ‘¯­ÑYqû} Aê¹Ìz07bÏ#Ö¼e3 ™Méº'j}n}*+£ÙÔZý0‚„rR# +ºrd æAN Íœ…‘èŽP[iÆwyûmê˜AC1’=:Êlj;_‡I ’8zÌ;…š$r'ëùÙeüÌô^L¿€ØŸ •wüƒzðe¼šùa´ ïâD Ó‡w³ËÅE~í':oôæ‹HÌE¬E3£€Pèad¯mçéòT:¶N{$q¡AÚš¤œòÛÑ4ò•*lþ̦ÖÂêÇE)âòö%ñü(JÀ×¥kÔ¼?¤Pj2÷õô~…ªðëé%+˜&"çÀâ×Ð ™úÑrQmO’EšHÇ#œœ{[®íKúƒöç¾ÒB¦ÓÁ,‘FÕ2Z|×+é?4RÄ€Eƒ JêÕjJ¥áà!ÕVø‹Ñp1I¡è[$R—ýéÍxË „pk©=-‹:`àçÆÍ­i•¼\mN-bÆ ²c¸ÆH<_D‘$¦1.ío ;2.×: öØ^³ÿ´ôc5„I‰°Häx9¿²ARU€t8o´•‹åméouê¾vÃä/9ªd)§bÍpaWl•‡Íñ %3Hб)Ë€~ˆô‡[•þMHeç:0.ƒÔL:†'øÆ«Tùsªž‰Ù ªöªö†jÆÁq ƒ\¾‰#ùñèž÷¹´&ˆšÀñþ­ ò 1+áX®õ&Cì ÞPo—BîrršÞ6…6¯_ÇK%À^É˽åˆõ‘@i³=)NÕ©›SàkÿÖW'nPa ¤˜™Mÿ>{•œüB:?g¢MMr&ó –‘A¾ÑÈ/+MÎLÁ¯¨•ßLÊâpùЬJÀ5¶*å¶t`þAùÑxáíÆ™ÔÆ™žg²ç¢J{{¸;¥ $ÿ£‚°q~ÚÊ{ßœºæ¤B)¦ºvÁ5ÿ(~…üzký¥ü®;® ¦Ì¥´îpÁü „³26ç<¶©ë’ò”‚Ê)q\h»¤ •2÷ø3æë3çÔÿˆÔ¿kendstream endobj 1913 0 obj << /Type /Page /Contents 1914 0 R /Resources 1912 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1916 0 R >> endobj 1915 0 obj << /D [1913 0 R /XYZ 56.6929 794.5015 null] >> endobj 1912 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1919 0 obj << /Length 2891 /Filter /FlateDecode >> stream xÚ¥]sÛ¸ñÝ¿BôLÄ ’“§$g§¾i|WÇ÷Ò4Ó%Êb"U‘Š¢»éï~¢lú¦×ŒÇÃÅb±ö{!=Sð§gE+S¦³¼LãLél¶Ø\¨Ù#Ì}¸ÐB3÷Dó1Õ»û‹××&Ÿ•qi;»_x±* =»_~ŽÞÿåíÏ÷Ww—ó$S‘/ç™UÑ»›ÛSòçýO·×7~¹{{™§ÑýÍO·Œ¾»º¾º»º}u9×E¦a}"^Xp}ó×+†>ܽýøñíÝå—û/®îÃ]Æ÷ÕÊàEþ}ñù‹š-áÚ?^¨Ø”E6;À@ź,“Ùæ"ÍLœ¥ÆxLsñéâoáh––NÉ/3EœI>!ÀTO 0Íc›ç,Àߺ¶ºœ[¥úgë62ü¼h\ßáÁïxÑYbâo5×:.³,!Ãq++–US=º¡îÚy×6Ç7´fþdïúš|}èYൂÛ̳2V Ó 6’T£äp,ùOƒªMÕ<ü¡ú‡RI[ã¶Œqí’_z÷X…}Nr€m’4.SŽö‰µìô÷°Óýe©"¸]ÿTËZ«XicgVçq^óÿEÏ 4Yfçjþ¿ùc¨“p_ÜŸ×)`% _qÎj®01xW1mC:5 ¬¢˜YUÆi P„×ÕNDŒÈó4ÎuYÀHv¿FÉ‚Pûj÷è ^»€¢Œ…Á‹n{d¨[1ÑàY,Ý VP‡91äI¶¨CÝ4 =I ðÆVìÑúÐñw»»ÔEÔ}­—2áöúÛÕ`~õWjûCµëyÀç â§“i|F²ý>}¡aèÒBÐLtП2Yñ¢ ˜¼ˆ-*ùÉs;Ë  ÀÅX€}ã¾VS ãÜh1€·¨•\h ôª*¢ºgŒãI¿Ú6õÂñ<[@˜f"L p§IB&öÜã0Vˆz©ƒ×ö§5àω?mS÷ƒx[-ê¹Ä3ˆž©-ÒsûÁ T‘!ä‘8òŽ›Žo㛟yÖ-—Œîû°r% ü倌}E†µ<$›xan‘÷ܸ9’n1xdÝ6ÚoÁdYֻ͓[8ˆõ»£¢"="ŒÊž•kíš¾›r8pùÑbÂéÄMé »î,‚¦{õpÐPôîȸeµrûfxÅÚvà‘«°Ày±2˜å¤ç¯ØÏ7pÜ\GÛn‡÷É“(3Œ¡´_¢7h°åš ð|eXù „‹µk«%8:à(ÙI±€}8N)Žìnu¬ÛG¸Cš¢í›4“C"¢ÝoHV€}¨VÁÎpŽŒ¬#D‘„ƒ&HüÆ&24––h[¦uSBÛV´ny–F®'QèVƒÇŠ¥bög{¢A.ßB`ËO÷I<;-?¥˜§g!¹mÙÔ"ãÒ`䊈9ÔÚ¡§GGÜý§› ýZñX™*£›•°e^èápÃ{â—ôC®¿|5éxp/ ô÷@à,®™ÌHf©!9@’ÂÂÎ3 M ÁŰAÅ×oÂQ¡ºŸ[&j\gœ$JälMž"˜“sàHÎP8Àd(ðuü r ûÁíŒÏÖBMæW­üª‰óyö‰Òœ¯E·(³¤³'œ±nžpào·"ááÐOµìLa<Ñ~ËD\#¶jêM=@[ˆ•’å1ý¤eÔãL˜‘4N)rÁ°=ÔËaF®UtÛy Ã}ÅÄ GªG¡`¯î§%“©î#’ÉcÕöŒ"çÌzߊ—-ýÌJh×ݾ‡³õÀI§4YMÏT[Ò`vØaˆUФŒÓ†õPq:0âÀI´ï+F8‡nÞ€É6Œ…ðOÑ §úźÚµSI(ü勘]òš‰LT}›T›Ûl›êÕ©º„pJ‘Aš·+|”/d_*΋ŸLÇ´R"TßhÌr¢š°Ð—Ac櫎úq=ð.ÛÆ-*Ÿ?*©+§Yò¤»O†¸ É}àüŠ£º¥ÀãOðH$…TMœõé¦rä9—ÓT›j# ún#•ñÂqc‹•+¸óN–/º}³dð±’‚Ö¡  %½"ÑM?¨ˆ-pÅ[¾‚]µg,롺åIyC°§\á}ðòJà^`vpâEá°A@ú¥=0lscˆ˜Mý ]Á¡ƒ¯¹ò/¥ˆ—÷TŒÄAu„‡‚†«êt D‡\¡èrÄy=ÝŒ Ø(ôVaå_+(Ç&\8qÎÃÄs€Jþ‘%fXø§g‚ ‰!~aNÄø&ßYØ>UzºW6òyn¤¨ã4ò~£¼2a¯T6zÓ<+sLyvFjS˜y陌3Ëø]úT€†Ü×KüUÁÉwÊT¸S¦žÝé²£*BvT…dGä• Ê“ªðyç„Øñ‡=JÒ쑨|ÁéHùrEù2¨ïš=¿ɪ©¦c]=Ö_1‚¤ôʃiႤ„8j;SÎ¥øÁ ¥^ì©ìÃ1å0\€G#ºó×}¦!eNÊèšó¼õà+~,“ІUÐ-†ó#BÁ>p@÷L8*Ã’í®þ*¥,© ÃÙýʃ}?ª™¿µÑÝõ{]ê‚£´+Xy’Tfí3;`¬>êkƒ XNÏÓ÷õ@…_·s> endobj 1920 0 obj << /D [1918 0 R /XYZ 85.0394 794.5015 null] >> endobj 602 0 obj << /D [1918 0 R /XYZ 85.0394 684.6711 null] >> endobj 1921 0 obj << /D [1918 0 R /XYZ 85.0394 654.5572 null] >> endobj 606 0 obj << /D [1918 0 R /XYZ 85.0394 654.5572 null] >> endobj 1922 0 obj << /D [1918 0 R /XYZ 85.0394 630.1458 null] >> endobj 1923 0 obj << /D [1918 0 R /XYZ 85.0394 630.1458 null] >> endobj 1924 0 obj << /D [1918 0 R /XYZ 85.0394 618.1906 null] >> endobj 1917 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1927 0 obj << /Length 2502 /Filter /FlateDecode >> stream xÚ¥]sÛÆñ]¿‚ÐŒ ã>pÚ'Å–e¹¥åéLã< PD  JQ~}÷ HBflæööv÷îv÷öT³þ«YìB—él–d6Œ#ÏVÛ«hökŸ®”ÐÌ{¢ù˜ê‡Ç«÷w&™eaæ´›=®G²Ò0JS5{Ì \¨Ãk>?ÜÝúº¸¹Nlðxÿùáz®ã(¸»ÿÛ-CŸ7?ÿ|³¸ž«4VÁ‡oþþx»à%'2~¸øÈ˜Œ‡7„.nïn·n¯}üéêöq¸Ëø¾*2x‘ß®~ù5šåpퟮ¢Ðdi<{Iª,Ó³í•M[czLuõåêƒÀÑ*±NéÏê4Œ]N’0ŽAÈ›ûòì+ ŽUŰxºï—ž—QÓüÇoVÅq˜)­äŠþ€Ž "åL=["±µÂ„Ú½”¬u¨(X ¦{ÁEÓÐFYzª6¶Ùå†F…©Žb&TÕðëd]Í{ª‘èa&ê£B¬;„Pw8n}Ywð‡Z#|ÍcÙó£µjÖ<>|á‘Ü tÃR‡·DÎ5aKöEïì‡8À×FSøÇ˜Å¢eœ®Ø×R”R<c!ªmÊÕ†)W?rY0¢-Šóʘü°Ýa¸›ðVVë j–­NSུl ‰Å¤½1öu¾^Ø _2<‡³N9Ž #ízVÈ´)¼5²2]z0bI V%g4ÛZ%$º3[ƒ€¶Ì‹cÈ.,å÷¯;¿§õÒkOaÖ$,#ÕaY•+†QG“¯óe£Ç!_»1Š¢e‰jÅuò“°Ñޱ†mšVÈ8Q! EFD->2bYvŒ÷ñkZDÚð‚ç©ÄÛ)CK ÖCnÄÌ!j¥ ݧûèçšM ‡ Å"_-ÀKYU -…\"뮩ób ¢ Ðâvòhw_¿Ü~œTë—²^¡`c$]À%ë‰ØÃ­%ë~*ëÔ /Ëý‘Þ~Qûa¿"ï˜8cçÿC)EGÁ®òD¯§IÄyžŸæ;Àã^!F(A™VbUð»ßî*Ê„:9jžyèZ@GçÅýÀ}š\pâXb1Ñ:úO”¾ëŠí®CÓCˆJа :m¶Týà¬nºrýÊ[ [O/°m½ ïòïb…Ž0a-14æ<Ékıjò>f¯y|øüˆ•ôÍ×Çé[Ýzng„ÑiÊ%ùáx:+¯ éj å} %ÔSQðØ{Zæ‡`'‡Óö¡áÓÐN(),º‘[îeJÁœ…E{Þ"ØÔ†©3n6.¬¿³X·‘ŠŒãÈ¥BèÀòVq?´&ާ;Eª3ñ,Ž  I °§Z¨Ù¿ø}>‘ EI¢ÔËk³à fASæŒD‹ãϨ^…‹^›Pªñ!ŽgÞÀÈ‘Lò{ÄQÜ Êð‘K”3OÈ ˜â2d EU°721¡±n\­\Þ]›09¡‹[.az#ÊÝënªj½¥ÐÃïÛú5iè’T ÝÊËñA=ÜÅqm&8}´‹¤‚¾pKt˜dqröê§ ¡NÓôX(¾Y—û™8L´MOïƒùR"ôÀP:^¨ Ã\ ‘u}äÈïvôæmÌ™P}6æRBÅ &ØåÄÞ;HGQ"i‚àà€|*¹K,\º¤Ï.aEKžâ‚ûµ š©rYAs{ÿ?:€:7ÌO:èãðyš³²ˆýÊH{ƒãNr…,h®=©SâSÇ+ƒUÙ ÑzÒxÊApÊÁÿ}pfÐÆ iRä;Žìµ©ˆe-Ͱ 2Ù©¿?fc“‘Å)W&ç<ÊшⲊÖÀ”hçDáëXÕ LèäUª¶ ßµ¼os2Q ¸t|2®)]Fí®M÷`YêÔõÝ”´4S¯rÄ çÁó±°p1ч~³5oöÚxñVÇGÄ@G+®/O'Êž•9›¾¥ø3×)%÷{/†í*ÉO=n#äËbãŸË> ö̼Lé4ß,}5õàL6>w¨)}dÐLDÙ ·!@ÙÐ&™=u)ø-ßòÁÂ*pB¬¿¬½L;¸ŠYdßvœy¹kˆÜˆ£’¼)Ʀ®^qA„“"ý\RÑ\Ð ·þÝ”'-ôÜœØ ! [0¨M@ÄF€‹@Ôa·<ñm Oj»’Š1äÔ•@£m88L7»bE•â™9É–ŸúøfÉ3®$¾³:9–<‰‚¤ªþ„Hax³Ü¨œDö­rGGabfrä\F*Ú`­yé­. «ûøN=¯†V¾¬Ë®äU±¹àü/dÓ¶&c3¡›DÈH¶AåÖW»ðçMäƒ.Iç£Y_TM–ßÿdWý7:Ž_ר&ßw-Çõ0qPv‚h‹öŒw|“ŒtÔS4<âÁù3]Ƨ=ç¡ÛO4霓r€'Ò$ÄE>`¶MÛ1$Ý9[0燩˜FVÔî†7†!7N8Ÿ;i)aì ?ýuEkéUa<µ”Ö} ]kå[!ºxÇ_Ùú›jÓ«X³i‘³ÙîʪÈç”l‘k¨&OÄaÁ±Ÿáx¼0ÎŽ¡ÄEl*¸±ƒ ÷OG1—¿“ ÈßIº.O>7°8.eÕáá&L(G•¤#;¾8Foò»^9þV¢’(Á”‘bœüIþDsßýÎñ×-›„&MõVN‹f8MAˆ¡bŽ4”¥?/©(ÔÆéžjtôÿŸlendstream endobj 1926 0 obj << /Type /Page /Contents 1927 0 R /Resources 1925 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1916 0 R >> endobj 1928 0 obj << /D [1926 0 R /XYZ 56.6929 794.5015 null] >> endobj 1925 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1931 0 obj << /Length 3024 /Filter /FlateDecode >> stream xÚ­]sÛ6òÝ¿Bӗ҈ſrsªã$î4vÏöÍtÚô&)‹-Eª$eW÷ëo P˽K‰¹\,€Å~/h>cðÏâÀg2Q³(Q~Àx0ËÖglöcθ¡™[¢ù˜ê»û³oßËh–øI(ÂÙýr´Vì³8æ³ûüïâãâÇûËÛó¹˜úçó dÞwW×ï“ÐãâæúýÕ‡ß.Î#åÝ_Ý\úöòýåíåõÅåùœÇ‡ù¬ð„÷W?\ôávñéÓâöü×ûïÏ.ŒÏ˙ăüqö˯l–ñ¿?c¾Lâ`ö /ÌçI"fë3H?PRZLuvwö¯aÁѨžê’Ÿ±„ @’K_ ½¼/íÁ`_Š8ô¡&ÛÎ9g>ã2„Õcî³(Œ¥(>R —‘/9³(HüP ©µÒyÙYâùö½c-2?L"» á-žóØCâ¹Hï?M]t†^J#„ßvENè¾!ÌF7OenHÒº{.ÚîêmÑ–vÅçUQºnôì9r¼Àyý$„fjV@$öïšjÛ—MM¸çf[åÃÛª§÷Ò\ÿôîæÓâêšÞв~Oè·m]ä`h’I瑩v.@ hhÒÌ9R ´”h¼ìèÙm7›¦íµ€`S´„*‹çóDx¾ÑÅò¢Äd`t‘VUóIú,‰ù_9ˆ!`fO„A:QJW8G¬vDî6i]v+zAóìÄ ´­s êøê_Þ™p/d–oApÛ\W®Ë ÌÑá)3J!¼‡mO€1|!lt¢‡|»kW!TYC0Mszi–c:íTàÒàOƒ `Ð!À¢ \fÍz]hʬLMܤ¤%q‡àHJB%PÄ}¥Ãem"¯Íánm4F¿»|sïÌH6Mg,àÙFn:1miî8ÍuÓ£P£Ð¸¼Œ"#g@9äÃ&ìÀ¸IñáÉf½iº®|¨ìº »@SaÌeGcuã ˆØH?d “w6ç<9Ñ>“ ñÌ™{¾+²ÔØ Sß’ÛB †BñÈähÚ’”_Ô™Õ€ß/¥“žò°£4ˆß2ÐÆë¬«†­”h+¨—½ß‹MO(¬á”Míˆ ñ#ªjšß·Âö©8¢Éah¹V—Žˆ]§à-á_È]•>¡ñE‚da{ºBàX¸ÖxBι÷Éb­O™š¦iþe€‘’– Ží­ß´V#Š Çu c? XlbY[ç™)æìÀrÛ¢jR·C9ZGr¯íx(Ôˆ«˜„$¶ðÔÌI[~éµõ{Š媀%éE×Ð÷±y.ž ]¡ dlë|‰…)fæã#Ï¡«1›d,}ò¹TâàŒ‡¬C‚iXGå7:tœnSdårG¥€ÒÕ‰TCÝ öö.ŸPb𠘥«¼!%᎜>cgD^­§U£û Óz$°ç–@ck“Æ5€Î4nö¾¬TLÂx]}ø¡âòXÒÎx±'•ÐgC¶^èIyèË8 g*~Äb’X^TÅcŠeô¼1M×4£3µIbT{¿¢]xöiZÐÀ¸<‹zIa03ÝÕj02ÝM#»>í·f1Ì”zñzÙB¬hÏco›õ¶ºu„TÛ3®ó†ÿÑÇnVa¦{CC×—÷Ö Þ¹¹ý€éϧ±E½#45R„4¥'3ýêÕ¢|‚-ô‰ ÝRk´ØÈ+þÜTe¦sŽ‚¾¼%l¹c÷b1£æI9Ò-ìÓ–ýŽð¸†!ŽMãƒè‡ÂÅHOœ§:—q¨7°íã‰ÚŸÐ¤Y„ò¦0$:”ê9› ª AÔ2ŽiæAžLTÅŸZöœVsè«[í« ÔX·Å]ÊiÊ­Št9õщiONüºM'à…´U*5¦»ÄgAm €{ZÔûV›^ö¡S0`–tõ²¦IËñ]ÊÜîxÀè³)¢ŽÛwÖm÷3ȉ©½똄)a›CBÿö™€ˆ€ÛÇ·£«±~>ž CÆaz¥šHɱ.sà(baWÞÏt#¨""¦álÃÞó;²µ­bF¡gÚpôN‚Ú`ßf^|\ܸ …}p8v ×Ç‹9ã7‰9~ƒ’,viûÏåώÉÝÑ;è)@[\Dt/éü@I4ó1ÑËyf ÚTíCc8Ýš+ˆ€qÄOo>P9¶?´ÛÐWa<Ùÿnô…€¼è²¶Üì¿'@<<–nAFUÉÁ§¡ý)¦=1Ä ÛozÇU~–„Æ*<8艪m åÈÇëÒ‘³ýáÐ ï«#–@§"I^‘ý@õ#G«9Ë6²#³Ö”> endobj 1933 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [280.2146 384.4392 375.7455 397.1764] /Subtype /Link /A << /S /GoTo /D (root_delegation_only) >> >> endobj 1936 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [312.6233 123.81 381.2953 135.8697] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1937 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [310.4119 92.6626 379.0839 104.7223] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1938 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [340.2996 61.5153 408.9716 73.5749] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1932 0 obj << /D [1930 0 R /XYZ 85.0394 794.5015 null] >> endobj 610 0 obj << /D [1930 0 R /XYZ 85.0394 335.882 null] >> endobj 1934 0 obj << /D [1930 0 R /XYZ 85.0394 308.9113 null] >> endobj 614 0 obj << /D [1930 0 R /XYZ 85.0394 182.7451 null] >> endobj 1935 0 obj << /D [1930 0 R /XYZ 85.0394 156.1927 null] >> endobj 1929 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1942 0 obj << /Length 3198 /Filter /FlateDecode >> stream xÚµ[[sÛ6~÷¯ðôeå™ Å•ÓÔɺ³Mº¶û°Óô–(›c‰TI*®ö×ïB$AÎÔ;T ðñ\€L.1üG.E‚Mõ¥Ô LÄåjw/¡íãq˜eZöQ?Þ_üðÉKtB“ËûMO–BX)ry¿þ}‘ Š®@^¼ÿüéÃÍÇßnß]I¾¸¿ùüéjI^|¸ù×µ-}¼}÷Ë/ïn¯–D ²xÿÏw¿Þ_ßÚ¦ÄÉøñæÓO¶FÛŸ3Bo¯?\ß^z}õÇýÏ×÷Þ—¾¿3ãÈŸ¿ÿ/×àöÏ1­Äå <`D´¦—» .œ±®f{qwño/°×Ú¾:Õ\($(O '" &{™ I€$'ˆ±Dû^¦dª—;”éåt»-_–M•õ&«ÆNŠŒ‡¸ìKô{Ô„´g¡©dlÁ]–Ù®ož\aÕ«*ß7yYØŠrc ¹£%”+0aÚ‘ò¼—š9x^Œ]e#)¸¸j«ÇK[¸í9íñ3N‡r­Ó«“{†é$A<0)‘ˆ3Îâ½ïQs†ÒŒ!(à¹#üæbÂg×CEסN#uدÓ& øF`P1£Ú=jBýoi%åPÿßã›ðíäŘm)ÌÉY¶QÍÀ>ìæÛ<~ÆåPîëÙ&4JØí{š1$”e[¢ „À;q¶õQçÙæQF£¡å¾Üæ«cH7¤:®Þ£&ôéÆa¦K64ànŸ­ò/Ó¬¶ýŸÚŸ/”ò»|·ß:ª+¢îù·Öpƒ²ÏÎBôâ’Üy<† ºJ)>p(Ä:üŒk¡ÜIZQ5A+XÓ9DÞx{Ôœ!´8­FB‰™ ÖGEhÕ¡ÆÓ¹)«—´ZçÅc@0I Àn!jˆGMX2 ˜L`únýâÙÈ¡±}…VçcÇT œŽÐãgÜå¾:¶ñD#*‰ŽƒGÍH‹“¶GŒñ¹ØÖCEHØ¡ì˜Õå²(›|F6,æ°ôE•{Ô„öáchÿ\lÐëT/vYZW6‡­}Χè¦@ƒbYs²:XÀ²ce^[‰)Œñ×Ì–œ¶Ð²šÒü ÔbíjÚyUNd[éxVÛûo7$ðh6Ž VŒaB‹¶9¬.›ô°mlm;¹ ާ–Iïl—h³RédØ#÷w7.Ùâ9;ÚBÛ¿TÒÖ}[ezÚüFÝT´öt•j‡1F…S”h8g 4ŒMB¡ºa3VŸ?V3 þñ¤®-¾²õQçW62þ­ž²ÕóÒ«:ܳ rF¹GMhîÙ¡•²‘ú{y9DU·‹b®›L°omk gL›ŒM•¯×bcžOÒ V¯6²šaÉ[Ÿk[¨E“þe[Ûn^ʪ&ÍÚu¹³enÃwí¬)|,–0‡3ÍÆb²da¦Ð¶} @í¥k0KW[pæïË¢îp½¥pmk6mU¹³OÖ?(YóRVÏíW6eùeª=¿ÌÃ״ʽ«UÙJjw—VVÙz‚‡.¸ÅBB_÷fuO½øPVÓL¶3§ÛZ8ß'¦;G„øùÞN § µÄŸ¬–ØÍÀñ¦™šOyݪ±IóíÔvšô––ó¦S GFÚÅõz›~úš@Ø~ ñ–wá¶÷Å”"†(§#ËoNb[]&ø8ê1‹’ƦöL»ËŠvÏÑŤ‰AKÀÞsØ™5Sö4¯³‘ˆ'0¸šÎD¢>ê|$ò¨S$Úý5V¬5,1XÅw  ž`gYJ†šßæ»hßþñH „«äü7*¡ CøûFÕágÜ åž;Ç‘àc…°.éL·{ÔŒ!¡´è9Ž3 ;§3;" s ÓÕûMx„k2ª×ƒBÅC†§j ÷-é嬎ÉЩ ðK›M"é;¥—ƒÇ] ¤~¹ÄhŠ[ÈŠ3 3 ƹš§VáV‡: œp׫´Z‡Ù0“¸ú4¡~À0¡ZQ6Ôÿ6ߦB/FÊ¥YÛ”<ŸÛõIj3z>Ä>‹vø§C¹¯'›TˆKÆâïQs†Ò¢|c’!G¦(Ýz ólë@§a‚…<{¬ò&ü$e¢-Qå&T>äFT%l ý-©6ðaÌ5G:áÖ(ÁDõýŒ¦<îr õˆ-аh¿{ÐŒcYq–qÓÏDµ>*³Õ[tò‡íÔ'w¢ÌѸzšÐ?<2„CÞtí<¹1Î!2¤´Ö‘¢0 ,xÍ!:üŒÏ¡Üד-!HI13ö5cH(-Î7Ba©a›ÇD¸f1í¡#«Ì›e]¦Ë¦Ù†!"Á‹©ö˜@÷g šÈ¾ò·aÙ„ cž)L"à¢çe4 9tÔß±ÌogÉ„èX—{LÜ„‘¤(·¨¢(Qz&–õQçùåQ½ü´Ïõs@1&a#©g,ð¨ 4ãqG6¼ÍÒ9åÉH½b8¹ƒc6ËÀľÑìµ…Ï8H}5Ù8œ®8;Å;ߣfì¥Å)'`¬ØLÖ°ŠÎŒºuQ×ÙªKôîÊuxG˜ K:n€… ¿„ $9šð6t›vd¤_'Hˆál27}Wc|sè¸Ïc™gØpÍÜ2!JD»Ýƒâ&²âDƒŠ(5Ûz¨Õ:Toˆàç9;šPš”ñ˜n ¬LϘáQv —hd¾*ìx›…ô¬7Á·“ç¿{0r%!c´ëð3¾‡r_èƒélBSl“»ì±ÔMYÙüœÌq—’ƒv#°½2»”Ÿyçôʦ4×ÉB¦Ãà"Mæýú½9Ž+p ĸ›…_\*´PióSæ·h²jo3˜öâ U‹Ô5¦öǤµm©í#¼<åMVïÓU¶\gÛ|—»Wå¢Ób’è‚Sç14˜ÌjÕÉٲΊ&_º¾³{à§¿ª¥ P8 T[ ù½½~Ó¦‹M]{_ÆêÃCýy5öÙ[épþ.)<ìÓºã¶ax<˜L]gF7Ç5?dÃ|­Kû{Ú$uÿÎëKênø»+#Ëq¬ÿ Qtp#›Ü}·û®zh¾›¾~¦”¿~ö½‘Ǻ¿ÉúWdQÛr‘º;iFc±Üe»²:ÚGÛ ëåÃ6…³Pc;Kgí}é®ÐÁ$maeÖééÒ­mWîÔ4é³ë¤Á€NöÖgwËñÅ×t{°)yv¢ŠiØ—µù"•Ù¦|ckÓõ:7±=ÝÚú~@á‹u•»«dÐôdRØmõCfîȘºm^<Û{Ü𤴵.`qwÍüN{€,îÊ]6u' NO÷¥½Ò“ïYGºÕö°î(è®a È•›Xõp8­VP¶…¢ qÈÎ>§Žƒ«4èÜ 1Ì_ùLøçœûÛLtúK+.Sê\rL ¤M¢Óe:BS¸dbDYB'lÿ ŽÜendstream endobj 1941 0 obj << /Type /Page /Contents 1942 0 R /Resources 1940 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1916 0 R /Annots [ 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R 1956 0 R 1957 0 R ] >> endobj 1944 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [299.7586 737.5313 368.4306 749.5909] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1945 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [292.0084 707.2808 360.6804 719.3404] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1946 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [330.7921 677.0302 399.4641 689.0899] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1947 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [401.5962 646.7797 470.2682 658.8394] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1948 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [257.6971 460.3869 326.3691 472.4465] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1949 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [258.7928 430.1364 327.4648 442.196] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1950 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [310.7975 399.8859 379.4695 411.9455] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1951 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [308.6055 369.6354 377.2775 381.695] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1952 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [294.1999 339.3849 362.8719 351.4445] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1953 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [303.0862 309.1343 371.7582 321.194] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1954 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [332.9347 278.8838 401.6067 290.9435] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1955 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.5147 248.6333 420.7148 260.693] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj 1956 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [386.0748 218.3828 454.7468 230.4425] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1957 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [301.97 188.1323 370.642 200.192] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1943 0 obj << /D [1941 0 R /XYZ 56.6929 794.5015 null] >> endobj 1940 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1960 0 obj << /Length 3103 /Filter /FlateDecode >> stream xÚµ[[sÛ6~÷¯ÐÛÊ3–¸nêtÝÙM»Ž;»3m‰²ÙФ*JqÝ_¿Wñ ¶Û4™ !ð#Îß9¸¯2ø‹WŠ£Œj¶’š!ža¾Ú>_e«Gx÷õö˜Mmº¨/®þþ–Ê•FZ±zØwÚR(S ¯v?¬ßüãæ»‡Ûûë áÙZ ë ÙúË»w_¹ío¾}÷öîëïïo®%[?Ü}ûÎUßß¾½½¿}÷æözƒÇð=ñ-Ì|ðö®ôõýÍ¿þusýÓÃ7W·Ñ–®½8£Æ_®~ø)[íÀìo®2Dµâ«ø‘!¬5Y=_1Ng”†šêêýÕ¿cƒ·öÓ)ÿ1®'L¬6Æ “^ÎPÆÁkÉ0¢Tèèe‚§¼PÆË»2¯Î‡¡±3¤±$«n‹#¹5!˜tc¬‘2&ö$¿/ çðÓ“/ìŠv{,§²©]E³7Š ÌÐe„iP¡¯ÿ@(%ˆ é`e=4‘ˆ 1©eÏD÷òø¸r…ûޱ¿`ì¸]gìöb–!#U¢D"Ìõ‚×#jA‘qkF4âµ'ÄbO°†uP †”í¡¢*scý¦©«×Õ¸@Zé´üšß#šÀHËl Àƒå—볌æ¦Ì×V[›UY´îÇ©qϧ²>9`^ï\U{:p¥ßšºh!0&×w{ÿ¶ðxhÁ’‘©.)¨F˜aáÙø âÆŒÅiJ”Ç|q½¡™4ÁQ{Õ‚F¼“õRV•7¢j½æ Ó4Ð$Ó(ÓJ™0Ešsb[=¯±Zù©Ø9.æ­{–{ÿ<ù§¯÷ ›RÒ~wº~=ø6ÊYŽz¨Iûá¾Í?ü v—XB¦cŠ®NQ¾—¿é~0ææ¸]£Õ±iN›†!PBö4Q4¢&ôèç‡akɰÇc¹+|í“/F»R³wÀǪù`} u}š 3h7"ÁËÒh39@êÆW´‡b[š~:”µCäî§_¢LéÒû˜J¼$‚xŠt2Êp*Y€G6K¹31ˆŒÚ6Ó×;cÒÎ)èPƒ9äoñ‹—î»è:3µ´ÓÌ0ȹQÑýp~‚Äz‚–œ!ð™^ e• e@Ù™ê¯{«ÍæCÞãìÌ Áê#)>¢&ä÷³³†T€e_ÿ\kb§fgKT¬™%‰©q+0SRî…a°ùiiµu?¬ÏÍÛ:.\•!S玴r?/6تyto~Ìxöss>ÖyE*3RùVm¿›ÊÝ+(·^ÙÃ&6Ž]°ä”ËAÚµ”x}÷ß·÷ÈÁžk¼þÊýÐîQ>BF³”h]…£´q•±µ- &Vj}Þž†8ûM• ¦Ë+¼ö:\°Î¼øðêEíé?$„ù¹e—EŒ$¸‰…èòµ½Tûs]-N<­8Í €¼1ne6wÎ’ùÀÉ|!8T"pª8§çÃÆ»s>̬ÄÉ‚5¡EÏmŒ#˜UÔˆáãrO%õ®ÙžŸ‹:λ›Î2·ôÏËæ†rRœ­ï"wsP=ëi&`èÉ$O{º‹š÷tDYyâŽ6 `ºÏ`„K ލ ÉýäD!0=ñsâHûöù¹:¹Z¯ÛßZ÷ÓñÀó°–ÒÊÎHìÓ»»¢6빌ûÅ"¼éµjGóyxkè>'ã¥<=ù$&H­û18ưÀÅaV†¦\¢1,o‡ê…­,kžÂHWqf»Í?TEŒìñpŽ™DB°ÐüsÞšIêäΊ¾Œú& N´¥dß`N[ÁšoÊIš”_Vϱ™€v^p»¨›ÊÙùëÆ³fÓ–¿“†Àˆe„¥5ˆ¨ ú[QEU_‡?·¦b-ˆ— &­TÎîŠQNãé›X}Gü‚ÙãvgwŲ¡N h‚ñhAQ[ÉÅ7ÿRŽß]Ô<ç"*ô”þì ?f•ÏÅfj3D™XciM"jB•÷äLª¾.Ÿ{s Ô€…•2ÁA¥ÓŠôŒNq0àÌ·;ÇA9¢ 7C=èœì‡ˆZPdÜZš…BBTd ™¯‹J°0 &û¬ÜUÓ,„°äB§5‰¨ Uú,4;"¦ºº|žÓ€”ECRHŠ$XÜÙ>ïZ“d¡Ç/˜?n÷÷³Áz*‘ZPdÜZš…°ˆW<[Ê…T‚…5Ÿ9šóiDCÅ\¤U‰¨ ]ú4Ô¦¡º¯Ì_DîIC=2˜b¡ç‰¨5âRðžÙ)"ü‚Æíþ~"Â$†,uD-¨1j+ÍÂL ®µZ`a•`a@ÍgŽIb$´XP%¢&té³P !å@™¿hHîš4̆æ|J² 8 a]s’$ôøûÇíþfHb™î‡ZPcÔV’„F:Ê4M“°‹š'aD¹ÍÏ“ÙA­« (ÇiZnDMîÆKÃLÑ—üywÑØÍt¡ó‡ñ\ X⫞‰©Ãø€_0vÜî8Œò%¯GÔ‚"ãÖÒ cÂÞ¦ÖA%P—2'žùëÔ ZRzDMˆîŽi’‰¾üÏɳ‹Ñ\!ª³ù«B…Xƒw-H%³€_0yÜî,ÛøxºÉL]DÚùµ¤É¨µ4Ý0GÊœ§éÖA%èPŽ:5›¶ÉÇ|£àˆL¥ÅGÔ„ü>ß,+î+ðyæs#3²aôÁ  ¤Í\³kB’p¿`ó¸Ýߟެ̞AÒùµ¤È¨µ$ß0…k¹Þº¨y¾E”‘x8øXL  ðY¦xZnDMîoL3¤Ìz’% óPR_„}j» 5qÏÊ/¹¯,ë“Ý»5¿¸?ЄjšæÏù™;igÆÀÊw™²?r¯ŒÍ¶*~þ©8Ú#Þm~iÏlÝ–u¾ñ;Ô D‡—„ΗÃ/âNþÌó«wïßß¾qeÓ†Õ™8=<ôÅÝV"özÄ«+]W‰9âËwá;w\Ó<»_»²ýhö¯3|•Ú¿k‚w8Kœû׋2ùEépù¨³ç¢Áˆœ÷Ïúº™Âu×<‰)FŒÊ_@ {PØß´'è¶öTnÇW`ÑN̶EJzÅ÷ˆÌÍ ¡yOþÝ~âúš†à¦êÿº¼nÇ?Ù /P¾\ZûX‡p·ÎœûWe½7wJwççC±st—©,\9èsNÜ—‘ˆ)&—žé1§1¿ØXð"Ë¢k.—f)§ _)^¦; yʵÉi`Vˆùnw,Ú¶ó†8l®ú¦Tˆ ±ý#næ$¼§„»FTÿNQ¡çá…õývãïaªÎ=L,™ÀÜSØŒ ?ý ¨°ùjî¾sOc¬ |{©Ë@Üñ |‚ª_Îi|VÙ˜[NxŸ?í“¿Ť#<ÛÂÞeÂu8Ô8QÛó±-?ݪ¶©ÎžçLzkYˆ&üJsŸs}ã^Õ\<N¯®èÍd¢Û‚u”âÀe~LÚ‘Çœ¹;pÔ¹mjCÜÇs÷nLdm~(~u¥wïý{Sßž~ú«¥m³-/WMí=:Sºñt÷´¿?¡‘ ò‡íŽÌmù âÁ?ßúRþå,0‰¨Rdf¾“1D©ÆA)ã0œ&Yœ*Ä‘ºÿŒ7t’endstream endobj 1959 0 obj << /Type /Page /Contents 1960 0 R /Resources 1958 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1916 0 R /Annots [ 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R ] >> endobj 1962 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [259.4835 737.5313 328.1555 749.5909] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1963 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [172.152 677.1897 267.6829 688.9903] /Subtype /Link /A << /S /GoTo /D (root_delegation_only) >> >> endobj 1964 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [352.4539 423.7962 426.1073 435.8558] /Subtype /Link /A << /S /GoTo /D (server_resource_limits) >> >> endobj 1965 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [387.5019 393.5457 456.1739 405.6053] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1966 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.9629 363.2952 450.6349 375.3548] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1967 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.5803 333.0447 467.2523 345.1043] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1968 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [393.0412 302.7942 461.7132 314.8538] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1969 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [255.0796 272.5437 323.7516 284.6033] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1970 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [311.5276 242.2932 385.1809 254.3528] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1971 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [315.9507 212.0427 384.6227 224.1023] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1961 0 obj << /D [1959 0 R /XYZ 85.0394 794.5015 null] >> endobj 1958 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1974 0 obj << /Length 2798 /Filter /FlateDecode >> stream xÚÅ[[sÛ6~÷¯Ð£<¡¸“È[š:Ýt¶I×ñ>5} %*æ®.®HÙqýžƒ EèLÙv:ß>Ð*›Qø—Í”&Úp3ËŒ$Š25[n/èì ôý|ÁSÊ¿—,Ÿ—+×ZøÞÂuS4Õ%›/us¼umíw¥«=VÍ«1à øB˜{çÍqJÙëÕmþú5ãBâ¤ƒç ÆˆQŠ[7ª[™;ÁoÖñ›åDƒãð "ëòðPZ²‹bµ:”u]Öþ¥îdeQ&ܽ´¿oªýî•£¹+]e½ßlöÕî‹WÅuí*Õfãj·Yíšò°+6›'÷<œ5âÈ.í…qó\‚£1¹–Ig1@´šÒù‡O®ìõŒLQüæWœf½÷;÷üãjñ² &‘ö¹ßÜ•5LˆÈÄÜù½ÜÛrU»ÆÂµº‡î”áó±Fqa­ÙwmÔû̓eWlKoê¸[Á";øí–V… Â*¨ÛP…èWfÜNp#r·Ä­ ©Ä­02›ÎªdAO¶î½*«ËZ Wüy,O®ºÞ{0î¥ÇÇÇKÃç$ÚbpûBHzìú'WÞV«XQ -Çù8!b­ÚUMU4å˜+žõñPW^¯íÔQ÷~kánÄJ]†ºU•^õ¸,Xv6±ítë}Á(z2’1¦gZ`ÇØ™hç@‹.Ê;6rZ´¨ÁÞwZ»$Ú¤´¨ ]õ3ÎHÎrÞçðqg §Í¶,v<ÖG\#”6\¶*…Ti2…•¼¹ÃЋ­®¤VcPlªºqûµkYí·Fl {š]·o²3b'bj'œåÙPè…ÕZ>/–¡bÅÍ‹cs·?TÈÖnAè öìƒJ¯Ílàô„íGE 5p…jPpnC)Úèìú•7¿wåûß<½ÕbLæ+ÿfmËõüñ®ÜšÁiš ù‘Ëj$´Á’r)[TY®¼U»  ô»j§]Òénœ»œ«0g0‚òù Úÿ-¼òêã=DŠm¹kŠklV»”Șöby}\.Á J[††9ÇêöˆB²{_¹õ¨Âõñ6h q±t#6ª/¡ ÷a=`ƒWTPø!«úÕØ*ÚEòýÔdW6>nbÀFíPåe Ž­¯]Y¸¢¯HêÓ6Ç ‚YE£»:„çÓ6"›¶E GfˆQq`YàÄhãæTÖ¹/—f¨gì°3§Ý¶Éf(%*ã"NgÚ6ªæ$ç”E© u·ÇÆÙwô4ŸÈƒìÞslõINǧÃÿ”Ë&xrûäÔÈ´€ô•˾Û<ê” §ãæ¾8Ô~VÛiìä‚pf@¡çýlï›'Wu{mDÅ&¿} É¹ïZ½ Ìôó3ågäøBoq_~uM˜{aËõµ{vG¶Ñ¿Õ_^îwÚh†æ3¼“‹KFm..²l<G¸<”q.Ž­…ï-œ•¾â³Ü'âXó GtÏb=XC»ÕX¦èÞá#² p"?§œp­Ô7)Z ©ÿŸÉ9Ó’Hgž›fó™úém½çÚžD®»¹6ÏXœkcc›kãCoàÙåÚX³ÇUkÃçÚØÎ D»\ÛÂï|w?Æg,Äx̯­Ìݰm¢ÍA™¨ó`dD_!±å&$ÚÜäîdÊB¢U·ùM–N´ñ]¿kêO°Ì&ÚXÚD1.ѦæéòiÓk‹í'Ôg3îpbÛ ^®3R$6!t†´ZH~~ç!ÐeGÂgGð⪓ù¡Ýq&í]içj6}¡>šò¦ŠÚ(‚!Ùßî[‰aë@¬Ý£µoî±9{!Îh ’‚.êü… EYMU_ŦZUÍÓÂîxŠn2#R²,M£EðèÝ 'ŽïOe9_«²^ªûÓy¸_„N“Êeûiãœ7 rWÞ¿Uí† %Hžµ®'®óðeæ*××[ü„ë±]çûòä%~σëSCN’+¢Ä„h‚Gd iœDúŒj=!¾*!¾€ Ëÿáp±Û¯F®£"'Tdçp©èqxyÕO†>€,ì8%:‡ëC׋”â~ÂíØîó57t"$5éhQSL"kIÙq»Wž”]u^v-Ê~e8»zí/”õþxXÆÊã’¨,› Ñ¢FXô?ûØn/#¼3¾ µG‰ÈT"½£9l•õÜMi/à'ížÓ^6¹VéhQSD"kiéI‰Ç˜˜^•^@Y®ÅƒËò$SÇvŸ Q†@ é¹oQDbkIµE¸šúîÒ×ZE«4zû $‡Ëbjô€‰G¾¸%z韲øÁE±,ýÁŘ¼ëèÔ÷„§}ެ>_jy‡¢ɉoA,†¶’:ƒ´@ð©ßÖµ˜Ä/ëÇÚV»Å¡\ÊúnÑTÛÒÿ-~[|m¶èæðcCcœ#1¢©–)ò-&bßÏŠ4Qy–ué[‘²ð&¬ôDŠ ± $ Ç4Ë;”zjÑIrC›=5!³ßîäX³‚ÔêL’ÃÐÒ¸–Â^EðÇé#£Áþ¯Æû7ð§ÿA@‚ÎóüLšÉ!Å€—u …Äåñ6ð¿–¹ÿ²Ï˜rendstream endobj 1973 0 obj << /Type /Page /Contents 1974 0 R /Resources 1972 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1988 0 R /Annots [ 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R ] >> endobj 1976 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [352.879 390.8395 426.5323 402.8991] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1977 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [334.0699 360.9009 407.7232 372.9605] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1978 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [373.9 330.9624 447.5533 343.022] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1979 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.6839 301.0238 393.3372 313.0834] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1980 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [307.1508 271.0852 375.8228 283.1449] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1981 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [334.8268 241.1467 403.4988 253.2063] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1982 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [337.0185 211.2081 405.6905 223.2677] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1983 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [364.6945 181.2695 433.3665 193.3292] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1984 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [374.6372 151.331 443.3092 163.3906] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1985 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [292.0276 121.3924 360.6996 133.4521] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1986 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.7036 91.4538 388.3756 103.5135] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1987 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [460.1655 61.5153 533.2211 73.5749] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1975 0 obj << /D [1973 0 R /XYZ 56.6929 794.5015 null] >> endobj 1972 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1991 0 obj << /Length 3618 /Filter /FlateDecode >> stream xÚ­Ûrã¶õÝ_¡·È3+w‚éÓfãÝ:Ó8©×™všä–h‹]‰tDÊŽóõ=€x“ä™d<À!pî7Ïüñ™Õ “™š¥™J4ãz¶Ü^°Ù#¬}ºàf€]¨oî.þöQ¦³,ÉŒ0³»‡Î^6aÖòÙÝêçù‡¼ÿñîêör!4››är¡ ›s}ó-Ídôóᇛן~º}™ªùÝõ74}{õñêöêæÃÕå‚[Íá}áw8òÂÇë^ÑèÓíûï¿{ùëÝwWw‘–.½œI$ä·‹Ÿe³ýÝKdfõìX³L̶JËD+)ÃÌæâóÅ¿â†U÷êÿ”¶‰ÊÌZ$™°bšË,a¸¶HOt*eä²àS\PÈåò÷‡Ý%·óÅîÞ.Vå><»¢ZÍNR‚¥³îA#t"Ô>¢ƒ&QLôñù\— iô¼]»š¯Šf¹+ŸÚ²®h¥~@¼Äq›d ‘xY\²,a\Éðv5¤$”HÅtrZÜ=ÎhpÛáA„?Ãñ¾Ä„å\T]n>DI˜4BžF„:ƒÈx7DlÆh5ÿ…ivS·Q2yK¢AE±pæÎä<É´o‰²]‘¤‰M…—È6oÚb7!8 üÓ&€åÕjb'žL„Ûlòçbj'‘ÈÔµ\×%âå\Bî/衪[?ûœ—›ü~ãçs?íÔ•mŠçb“GB ¦k@ XçiûîB·ï…t|)^×;P¨z÷:²g¥Á«0uúø5q~Ïž5K2ÆmgÐ=¾ô '& Äψ‘M“18ÛHOÛ¯‰² ']NÙo€?CóxßžýRèBû!dyb2ˆ‚'Y¡Î¡1Ú¬÷˜¶™,Ñ6KÏh[ê„¶(gû¶^¬ª¦)–#]KMYjO¡&Nïéš’‰±ïÿ_°80Y .kYW¿0&÷dº+š}¨w4X½Vù¶\Ò÷7Ÿq Á˼ÒL¾ij훂íºô[×!ál^ØÔ/4|Îw¯eõH;n.ù¿¡GÒt«LR%yp<2o›·ˆê `õùêAýi°Í«ü±ØU ®Yr6¿[]çÔóTíšžüãSÝ4etWMѶ€fóõ„í1 â ÙH¨€¹$bÿ>a…Ö& í­ð©Øm˶¡w€7ò,ƒ™û‚~÷O«¼u­«•‡Zûeò¢8zØo6¯´Jt-šò± o¾¬‹ 8½£§ø:ÈoG<ÈõƒRÓ샗jYo·1’ô¼jbš°«V^VˆCÔëU•XÁ?к©Ø£ ÖaÆÄv; ªÜ*°l£‹FúQV-üOIS$Ãø!ÉYnö+G<¼HÄ Ð ûú¹x‡ãt~¿oi•ìÁ‚’æNîÕÿöMÛ߇;j¿ò“Q•#Ep‰øô$âܦóf¹.VûM@%_.k'õ•³-„hëÞ‘Âmý•Ÿ+·n[´9¨XNO˜Ë4E1òÇiŽ\Cà>‹s"À/º/LxæÑ¾H$‰l?bd§’%ÁÇk{83¼u%ÓD¤)ïcâõ¼w,¤oR þVVDøsŒöí°Â¹£mq”Ò³4Uú4/"ÔTÆ»!*xnBº© ®[aÞâÎiZ*NxH£·ißCÀÇ<„N„¶ò¼‡€ÜJ‹,ì»ÌÁ¯5ÇKåD4qÜk5•êBøa"læìPÜÔùŠFä¬qD){½¥§6ÐOñ(åÞCd)]bæïÒ”¢ŸörÂÁPN8G±V\íàK€z¨ÏhÂkåâ¹>ñóz¹ÜïhXV~)œþ°o}úNj+Š'Ôÿ®êÂï‡URÄú”8êFtáÒ€~jûm­%¤“8çX·jmçX³~}¹P)d^D…1‘ó5‚>)*ZE–‡”‚²E˜Ì‡çÅôsÌ]ÓúYp`ïB¶XôÉ!™ ä/¥ÓtÝÇÔŒôÅB3—š¬óê1$,`•õʇb$ûÍÓ)´ÉjS4M¬³èÄuÑ®c5ÝSV‘AÕ•ñQ‚Ó7˜~é…‡B­ôg5¬¼/•™N”bÙ”/Ø­Ë/4Z·{Î=S†«y]ŽÜ¿NÙ;Zƒ6éCKÀ}7žÈ¸L””ŠX«ƒë2 èÓi/ïº;Ô²ù~ÓöRêˆ÷Dþ !“½ýì„=‘)&g‰0™í&ˆS…J!‘dgº„ ãe]rFz–o”¨/ Z׫qkP ëÕI"Ї~c0ÅqÚCÂ×vléráÛI„Œ}ñ®o}/ë2¨Ê2o‚^´}ýhÊíÓæ5¼èµóˆõéÒÈĪìŒSïB÷ꊛ²¢& Úû¨7œA‰dΜ¡&è÷†U’êt€Áµ÷.ª““H½2¿N^×pRt|‡´:vèÒ9$­÷Ê,íü!Ôý~ûDK”¤Ú¤ZP~ ‚H`ˆ[Æœ 'szDà{9tÞ:û*6¥`ÒgŒ0_ú¦GŠP bÅ.¯š‡bwhUR4 fìôÕ°Cb s‡ª WVeó…æ)£‡©œž#*0õ\ì§Ä‰*ÃÂ%ˆÒ]÷.¤JÅÊÑj}Y†Ë¾‰óMi38mÂh<Žªª=ÕR5ÍÌ`9÷$çe½ß ’À²AɬLJ¯ãÄ@s„:ÓîîB° åb œZ.wS}ûÁµµ§OPÇ‚eÊxÿü?w·Òä!ÃÔ“'\1~üj£ž=:O5Î<ø‚G»¹Wß‹J«°»¡O3>BÃc´ÛÉ\¤Å™>­j]¨ãª¡ ˜önФ[ U=×jÔ0'‘ˆPXˆAïÄ00æÍmÞb†· ¡xªƒLöÈ=Ù±%ð3tv=ªxzÔ8…êYësˆPgïvZó ÛÌÈ3š×:¡yª× ]îwÅ*Ö²¢ñÁx" ?J„šÀ¥K¾`Àg6Àå¯qx')5Ðñª£J¨¤LXÆlèSÍò†üñ¾ov€*Ü Êæ“rˆPçívôŠJqð•i“øiAMaH®8cP‡êIøÉ—Ô8þ±Þ”Ër2݃ÔBè„ Cµ•ÿL÷ü4û§§zç® ä/5Mçð2UŽÝaš ‚ª¡× ƒßGȾÚò’Ï]Í ËMI}N| EƒÁ®|\·~®¦ƒžŠ:/šŒ]| ®é‚›é4É'”tí8lkt“œéom8ÃÏvXp¬îfÖ—S¡\$–ź}ú£ÿ±Œ¯DŸP6“ß]hüX(Ü$P¥×…lž מY*͵D]õÔ&ÑIe çès_Ü—›œnïY:©w_RÎ ƒûú´êîýa{—|33""0õ+>öO.†_ÔÈ„†×-ý:µò`À€Š†A¹èJZ& @5Ѽ÷íÝmÙ4ÑÞ©?ô¡Ü}õ:Õûé÷{#»É˜n"ýJÐAãˆTð.]˜·+ 3v(že$O4p Û:”S¸BÍÞp±¬¨Ã—¡´Tùlh¢v÷ýøò‹k·á\4=·wKwvk"“ó÷ô¢oó¹f†ûÝ]B·)"Öÿh·Ðóæ ¿îX–ˆ+•J 2²a|G)Sac?]º¼[š‚óµŸ[UYø¹ƒ4´H]C„v )˜ â,ŠÛïát¦îýùᣋ‰; çpÒÔoŽÜ<µÝÍa¶Û²,Qñ3ż[ð·ziÇ#ÂCTZ؈¶ùm_4--šMþ6nè7¯ø^ ‡Û?„@cõ[Ò´û)÷îóõ'o!¾¾„ <‚¹¶ÿ„=áü»Åx¼öm-.;ôíM^õ;À«¢E¡VÓ½Ã[§ aÒÎE'< /õʆ†¬Ø¤Çb‡¨ôíVš*Î;Ÿ´ùÁ©§¾Ã0@ Biåº\%™cïäa¿¡gRU\ òÒãÞNk §>)uS ÑIÛ±7œºØÅjX½²Lêà­š€·Ô°†ÔͦÁÕ7°ðŽl¤@äôxÓ¹ÏÅ`Ò7oµðHdÛc’ òq–eoŽjÜÁÞÙ5œs_û^]j¼ØšJáß3úOË~øÐ_¥‰´öØÇ0L%Rf< …q&ÇßzØD[(Ƹÿš$‡endstream endobj 1990 0 obj << /Type /Page /Contents 1991 0 R /Resources 1989 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1988 0 R /Annots [ 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R ] >> endobj 1993 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.3443 737.7676 467.1586 749.8272] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1994 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [321.49 695.7982 382.69 707.8579] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj 1995 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [357.6499 593.8005 436.0651 605.8602] /Subtype /Link /A << /S /GoTo /D (man.dnssec-keygen) >> >> endobj 1996 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [455.3558 593.8005 533.7708 605.8602] /Subtype /Link /A << /S /GoTo /D (man.dnssec-settime) >> >> endobj 1997 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [317.0267 306.119 385.6987 318.1786] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1998 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.8967 276.1048 430.5501 288.1644] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1999 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [432.0945 246.0906 500.7665 258.1503] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1992 0 obj << /D [1990 0 R /XYZ 85.0394 794.5015 null] >> endobj 618 0 obj << /D [1990 0 R /XYZ 85.0394 231.6054 null] >> endobj 1377 0 obj << /D [1990 0 R /XYZ 85.0394 206.638 null] >> endobj 1989 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F63 1385 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2002 0 obj << /Length 3395 /Filter /FlateDecode >> stream xÚµZÝsÛ6÷_á¹—“g,†ø$x}97uÒ´×ä.ñMç¦í-Ñ6/©ˆTœÜÇÿ~»ØJ”í6½É8ÁÅb±Xüö§)ü§Æ&6—ùi–ëĤœ.V'éé-|{y"˜fˆæ1Õ×W'Ï^¨ì4Or+íéÕMÄË%©sâôjùÓÌ&29éìù›×/^½üûÛ‹³LÏ®^½y}6—&½xõ—Kj½|{ñÃoÏæÂ1{þíÅ_¯.ßÒ'Ë<¾~õúêÉéq„éÛË—o/_?¿<ûå껓˫a-ñzEªp!N~ú%=]²¿;I•;sz/i"ò\ž®N´Q‰ÑJ…žúäÝÉ߆ÑW?tR"M¤²rBRN)Ðä‰URy®7gÂÍÊ®lzP‚ʲÙÕ]‰Ë‚Á"ì™ ÃÚ®—E_Î×m]->3u<•5I–g9Sw=¯`Ð^&gmSÆ–š•ŸŠUÕ”õ÷0±ïîªÛ¦Ü0ñ õôº*»®¸-¿‚7§£íÖ¯cQY±\òº:"¨xަíQÜÓ¹*ÉQßs!’Üé%¥Auù±@u a Y’+é<(‡hP€”ØÂ³ +s¾,NSÙ”Ë Eæyâ´OW¤Ë¤fêÍ™›mkžûþ®ZÜQsQ4Ô¸æoÝ}Õ/î`~ÿÖòWèä¤8Ù®VE3%§”:É´rÇ=«ä j’1OvG°]÷@Ü“¥×墯>–5¬Óˆ„H⬶c¾@7³E]±?1MC ïþH“½ƒ!H¢f÷¹W„“;Á‡ zyW U¬ ÃÛõ¦¢ër³ªü½ØÜPñ9ÌòË0cÁ2 §y†i¶]¹“lÂ8èkCÇžè©5hmyÎ31ûVØwx¤ÓÜ»mOŠÇüÝþ0XA·oßWuM­kfÚ•ýxî4zX´$\ÜÍ-OP4Ÿc­.Ç+•Ã1ð`h‚/‚Æ€Oéì¢ë¶+ÚИ‚q.`¶¼Ÿ0Sp’AѰòö‚ãL¶„ÔíŸ& n/û¹MÓÙ¿éq»)6wÂÐ;®®Û^Ó ¨ê+jýwÊUÂ|Â$Ýqo qBîœ6ÝÿÓÙ¼ž˜ÂJkNp³d…Ä#iÉÊ‚zèéw×v=+™ÝTê-¶vmÅ<»Ã­Ü9OÞWøÉ'_¾X“š õÌ ù¦¿óA¡,ðÂÁVåa%ˆ×¾çVõ¾ÜÙÁ‘½õº¦­EÇx°•ÿ¡Ç²lx·¥¨UAg_õÜfÙ^—ôöÓ®“Z¿Œú‘° µËÂ{ÖF‹‡/eGíµc3”³*¹`ìcU—·¥‡ ãfoš-èÁ5 ½+x\·],àÃͶö±:Ò!¢ÜeQв°·(ÈÃ&Ú]`JÑÃ>T+cý.§¥PÈêh-Ðéײ¤64š–ž7Û Û„ÅŽiwQzÒŒ%¨@ƒK¿ Þ(˜Î9wÑ*¡óþ®l¨ÅñrR“ ð¦‘w3¦×.²ìFC-ëå9}ˆÍ€ b2|φï.0 n ÐY,Ô´¹ð=Ú>2Έ‹Â ²¿GÃiåqÐÚIŸf¶e°Á—Wž;CÂÎ{™÷×-¬’AÁ©Ó /SE%}½i7tŽ €Šb)” H×/Öó®¬o¦ Q$JŠLó’™@bûVe–%³K¢¼kïË´ŽÇQ^H‹›eÁN2ZPvL²‚xÄc'~}FN2QwŸBê%J ;Þ<F‘Ó²«m×G{¸·)‘¡Ýy£=ÛÎcÓt‘°-D´³dÀ¡§ WH–‹AáPp4ðºÝ¬ "ôç4ŽÝ:Š1>.£Inö>qò͈ù©‡ôc1ÆW¼-©…NÅ¢èÌ÷ø-E"öžØŽ¼'€ËOð[Á1Û÷—ÿ Vù)DRøæa§¸Æ0Ïé¾ð\pø¦d¶Ý]±;(hÉ„ýùÑS®tlø†ÊÃçðyÄVÇlyxÇ@æa %kÐ*º=vÌFŠ×ò5EžÕ¨`ì‚òXcЯ·(ËŠ— )Ò(w»v”ËYSÞ¶}žÆ²¿k—Ô&©°u͹÷Ëwïæh_œH‡ò 4Á ¬:ÆM9+˜a|èéRzuà4Ån«Dnfß—›kªDµõ€§oÕ|E}âsA —z÷~GÝEHí]Œs.Klž†Ôþ°ØÍŸ1ÜK–íª¨š?L¥ô)d¢¹Õw$›|äQ5¤†*$§ƒ:¹]fu °ÇXÃu)h§³½J :p»4Žü"ªXù: Q4€jºþ'd¦Dçc_èüæõ»iV¬l]4ˆ¸žŒç!>ı›ËBÝ€òÙa–Õ¶î«u eÍTÆMX÷Õ¤n!Šv(Â> \“&Jˆåޏ“¾¾¼ ‡ç¶E=òød$»LÃz,d¾â¹ùÄ ‚ÆžL•š2På¹÷›ksÔïª$Û%Bç¼l1 e‚UwŒ‘‰ÓJ<•É´½æ¥O”U ár6*x©Üìª+ãšMrŠHÄøf&QÙ°ÉÓ‡ ô­­vO0„™Ý3.ÉfMæÆ†7öóq<ñã™óÔ,Û{þÒrî6F®]šYÔœ-z§³ZX!æ—ë²n›Û! —˜lPë OcPökRrÌØŠžT œÊ+N¤âÎ#Å6¼„À{¢ãV†:ƒ>ddùOfÅà5U ×Yâdš=Y¨éDKÓ¿† –G~ËI<`„‹ûò…=Ž3i{®3 ‘íEå_‚8£Jî¯FœGø=†3"Éž.ÜiÖS6!âô`’õ“X… ÜãªjZà¬!ÕrAüòS_nš¢>ºN;„C{7Å"ï ÿJg­Só”»b¥]’¥ÙÞ]ñoÁ:£ÐQ h\ ¼¸FŒY͇EÍ¥‰Q©n¢GJÄœ\ƒe–%i&BHpý¹TÁŠ/?‹~Îù«Â‹ßrU`&€å-ë þ÷i!~B-|ªøBe•ñý1v…É÷«ër¨\Rj·—É—ÒíBTíwÛ¦/›P==Û¡’0±Ü¹écÂŽÁ‰Åizl\Ú€Ç9(8Ú†/ÛZ4"•:÷ÿ±ù>b-oi…}ÔŽmæŠ/D\6q!K„J_|[®ÄÎDlbØôðͧKƒ!noÎÇÑÐ ç’TKó»ZP´5¿—Ïôt–aÄQ `¹RÙ#$ó¶J=â¦ìGÛèÚ_BgW­ª²@x¡[z߬¶Ó‰å‡rÝÓ7ºMCêŠ{‚)N]”V…²6øþÛ(4Ì30Ô[zlsW)•¾"„¥Æá´øW_lÁŠCàéI1a¹~€S¡˜¡œˆèg$ØÅªÅ÷Õ«Jñ½v– ^ëw4êà—„ ;^m¸öh¨ÀiÆÅÞCý#´ÙprŸð« #õÔÏ«´ákWøV˜ë#BŽæ™>üeB» âvéÓº…¯~MÖ~dÈŒoXG÷r¡+eç–È!ìNl'jWUß—`Y _<;,S&qÖ˜_Á2Œ8Že©¦Ö=; F`‡Í;šÍíƒÙdèâjñXä‘Aþ<ݰÊR ŸC½LYª—a§¯—ac\/Þ¸^¦òl¸†‚Ü \ˆÍöëÔTa–Ql§ãØNË€—:à¥ðR«àȱs–æÆ_N€!äú›Ü ø‘’E¼Ôì1Úè/3¦I&-úV™X@ô©ŠÂkó‹–ºûÍ.ì”r‘­î™ŒI`°E±‘jQ¤úàW³á¬LÉþ?RFpendstream endobj 2001 0 obj << /Type /Page /Contents 2002 0 R /Resources 2000 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1988 0 R >> endobj 2003 0 obj << /D [2001 0 R /XYZ 56.6929 794.5015 null] >> endobj 2004 0 obj << /D [2001 0 R /XYZ 56.6929 297.7942 null] >> endobj 2005 0 obj << /D [2001 0 R /XYZ 56.6929 285.8391 null] >> endobj 2000 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F53 1333 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2008 0 obj << /Length 2363 /Filter /FlateDecode >> stream xÚÕZMsã6½ûWè°i+Âààm{ÖIÆãU¼µ‡l”DX#‘ŠHã¿Ýh¢dʲ˚ªl¹ÊßÀ{¯ Ä€ÃŸxøJôÀ%š.Ì`¶:ãƒ/÷ñLÄ2ã¦Ð¸[êÇÛ³w—Ê –Xi·w¶<ãÞ‹Áíü·áûžßÜ^LFciøÐ²ÑØX>üñêúYz¼ÿ|}yõñß“ó‘ÓÃÛ«Ï×dž\\^L.®ß_ŒÆÂõelá@…Ë«_.(õqrþéÓùdôûíOg·í\ºó\áDþ8ûíw>˜Ã´:ãL%Þ à…3‘$r°:ÓF1£•j,˳_ÏþÕ6ØÉ UûÖOsÁ„4j0ñÖî—úàÐoLzŬ·ûÝŽ…rL›b½fJh×nŠMZ1¯”8“0«¤ »ReË;\šw—Rv ;Ω°{,t»È+XøÄ 7#?¼_føb‡«´ž-²˜ó°È JÕ‹˜_¤«ŒLÓ,/¾ñ~=OëlNö°Œú„Õa‰12t>+‹:+j(¤¤–wôŒ…ß]Âbn‡m&…pqØùêåõcÏüŒ`\'*ü/ç2[ÎQJÂlûšÖ°Ê^75ÂÔž6+*Ùm•Æ›Çñç_Šr3~˜Í³…©kæ±åYOïk¨`ͰZ”÷¡HO3|Òä)3¬0¦ÒŠžýë"4gÆ®^²0ǰ¿0ÖèíÂìàJ'À×LúžÆR#ò…mf)Úe¬×8-h´®Êª&Ë}•ÝÝ/ÉJCkº\–PT&&å°,bK_³G²¬³M¦™ÊÃR–øT–?ŒÆZ,ÓÅ2‹˜ f¡ô",w7+îämÛî:8©ì°‰aIÉi4ݯÁ˜‹¯¸=€J!$(,÷/ØXPÛ0ã0:„~bŸÕ:›åaËC^ÕÓýN,óÜâF2§•íý½wËAg¸Ñ L u–)ÃÓ‚¤9­êl“W_Á&È’Çœ:(¦fi•±}ñÖ Þ΂v%ïm2ª´g œŒ[±DpýŠ&©†zF™-gškuD™­3,ÑV´Lªî§/g ®°gXùac¬òU¾L7d´÷l(tª¼|žÀÒ2ØF@²?gÙº¦êEZSë0Úy¹Jó"v]Þõô&„Çõ­^D_Ð"gY•” „gô+Ï@¥³oÛ×}¨¨“BEáJëcH1À{e|»†9úePQ\n¡‚/±… ¾ôCâ9côQ¨$0×=¨„6T0UËÇØi4!§4c!5KœÙs’Ï`•‹Ø ™—e»§Â (¡sæ5Á^Sã NŒ³Ì  í H'Éôª¿"ÞóNmqâl_ú5‹ö”ÿš=/**²Jg‹¼È(w½É‹Y¾N—ôŠÊ¿Jǽ1VúÛ?&ç¿|"g` w)ABm[E+º4†ÂdJ‹9ÙÚ{‘¨~Ë6!’‰!EÛ8#Ÿ.W”Ý 2 ùy0·CÁ—è·1I¨jÊžä¶Œ6~}¬”o棔£ D9Š÷T&Ïé%°ž;ÞÀ… µ{#…½Á<)(!žÄƇèÒâÛÀ½Ï—ä¤| KZsÁÆÂÀÓµ|iäéÿ4J "’¼ƒT°lÀ³$W° p¥¡–¬éIú¿ÏŸ²H›tÈ‚o,˜h‡¬%=¦`º#þ=ijž4þi§ǃZ(g…ÉЋqQíý–:h¤˜Òïº&P§§ÿg)‹ µ/Џ_Å£@OË£“úø kŽñˆ{fœ¢˜ÿëfj^ãyà¸Ú QÂ[¤QH§ñùs¶™ÒA­l²ZÄ…·-—z ŒÌZÀIó]¬Ó%’—Šˆ„‰-=ñü’_P2¢‹ —zDƒñu(oäyžâš^QN×ùøÆùø®ó!¤ãó~Ý« É\?}lô¶ãyð…Ž»ž§ga·g¸>úH×=HœŽ>]\þ…飵ù±;: cp‰K:ôy¥#úÎ’ߟC¢¹þ‹Ô‘P©#¥$œÊÞà ³;þHÆàMvGÑm"ú£žÙíM¤‹w¶—PFóÊAÖËÆPNÒ½¾7„ê鮹ñØóNü¡"E铪‹ÔSJ¨„Inì+ÚŒUÌaJgøQ॔O—’PUÏÖ/sHçˆ$¼Ÿn—pYíãQÍ‹ô[F©iFWà`À&í[žRâöý %‚SÀBhyXä³%\V5ÔJÞÂÕBy½&€ÃËxEow…'¥¼ÎÓº-vuCÏt>'èVò"a[Ê^÷z•ó&ì|r3Jäð<^ŦW7¶›¥“pÃY­ÓY‘À¿ÅrHÄ[P4õFœÇŽíRh挵@ “/ø’#¥ÆÛ|Ñÿ%Fg‹w/Ç)Õxr­Ø<§Ú œuíÒ‚_”œi̵€ÈÉÒç™ë@…#¢93J6„ÿ ^ðåð_/ž,4*ô)½d:—ƒ?áëGøüÁwÒaºÛe†wW+9øP¤Ýy5-»M‡yYÞu÷N‡‰Ð™À’kn ¯jüx§‚äú Qn²:Ÿp?RÖº¬ª|:‚ó ú/´ FñY­Kº$ê‰×+D‹óÄ6LTò¼føTë”g^Ãâv÷æû Èân¼ý ø64J;ÄáD:ÖÌx™œ@;Ÿ²9© ã/Ä.öˆ ƒB0/,!ÂÖ¥~•"+#b`ŒŸ“¡6™Ö¤lèÝþŒ…J*<0¼·75ž>R^Z<’!àvÙ¬èô‰ÒVpa)ã0@ïâ0ÀTdõC¹ùJæp"ãZ³råx]óø1˃œ~ÓT ÷Gøˆ³8öø!@Ç@=èzVÌ)|×1¶7[TàúW2áñùáúüÓeM&UVW»5§½Î ÜI©Ô垺Ó!€«‘'KvXÇ%çÌr!N¨ãò”:.ð¶×ò䘎 ñ“ãþ¤:Žä‘ʺï ãݦŸÑqa ÓÉwÑqñFïîÍ_\Çý $WUœ´ ã{B±ÏþNx‹Î7ÿÄeûû Øö;z­¸f‰2 ÛÂ=Üìïš]ƒ…pM±ÎØÿX7³¶endstream endobj 2007 0 obj << /Type /Page /Contents 2008 0 R /Resources 2006 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1988 0 R >> endobj 2009 0 obj << /D [2007 0 R /XYZ 85.0394 794.5015 null] >> endobj 2006 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F53 1333 0 R /F60 1366 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2012 0 obj << /Length 2887 /Filter /FlateDecode >> stream xÚÅZKsä6¾ûWôQ®šføÒ+{š8vâlÊ“mwj7¯ƒ,ÑnUôèHj{¼¿~‚TK¶lÏd[S5AüÀ¶Xqø'VaÄ¢T¦«8Õ,ä"\åõ _ÝAßw'Âɬ½Ðz*õÍöä« ¯R–F2Zmo's%Œ'‰Xm‹ß‚ˆ)v 3ðà×Wç§kòàâòG „Ò¡ ξÿÓö|C‘ýæòê[â¤ô9ûpuqùÝÏ›÷§±¶—®ˆ½9¿8ßœ_Ÿþ±ýáä|;ª<Ý–à õýëä·?øª€Ýýp™J“põ ÎDšÊU}¢CÅB­”çT'×'ÿ'œôÚ¡KfÒ\0!CµZË$e¡Ðúåui ë:RFŠqöœ¯»wå½iˆ<ì‹l0D£VÊõ²­"3uÛ0»Ÿ¯°E]u˜5(Õ@Cœ¢¦ÈËÛº>4ež esG¬‡rØ‘ÐàGÒìD£¹±³ß›|=_ÎMù;çÌºŽ¥ ʆ¾8•µ3ÙÑÎ9)×Þeaš¡†ŒK)œ ] *Þ®-HK\ã¶íêl ÷‡ß‡]™ï”¨8ùA$@ñÜH¿K©iÝYlbÜ å–­Ú<«¾^؆ Y…¡Ûg`¿ç[°WÁµß¬ú‡©À`éNE,H‡,¹|cfôΫ6¤ngXö2Íãú¯CVƒ ¯Åɵ‰+n]§!`9f)@gÚœrÉ1é‹©#‹ËãŽ|óp^Ú{ Û“Çý ~ØÐ7– Ø€û6ß×C†›/c>æf?{³¹¾üîÑW׎¸þð~dŸ¹‰š‚F#K-óÓ”n™ày†šëÆc~F±ã‘:Ðd° âxÖòêPP€Ä[ï¯~!Øe6Aã;MR·SàGÆÛm%›âÈRï–N¾ƒÙÛqèXZ ¤gw,J2¦j†úGÁU;¸>—&@±›‚¦J‚ rOmST€ ³Î ?´%Na*ã§£í©Ä%÷Ü¥ÛÞõö€ÖJºüì’̰gÉSÎà3àæbÈ%¹c(â¡Û¸‘Šѹ‚-Ëw¾t+ûa„|sÝ*à6V¯B3¥#‰‘c±YA%þâ K„_ÛÆ­~QVæ8ÔïÂUœE±‡2áO#1¤‹Õ>Rp\ t,ü~§é¿w¾XõêϽwm½K@ 9põ´€‡ÊƉ ÇRƒ;‰‚ЬzgðL£ÄMKGû€ÖUaÜR»¦þÍűWÚMR˜>ïÊÓSUî¶òm(Ø‘k ÷½o›´qœ9wÒ›‰ƒPÏÕfCÆ|z#J÷Œ±¯ ÓáÚBºÀVB¹X@^éú½)UO×p¨ qI[°?ÜT¥¯ã°Çj _Ú2~Ë *“u7N˜ÌIôîìJŸaЉ]OèkcžÀX"À°°sEöÕœ:»»› Äå×ÓÏ!öóy훃ÉÁ컿d"bB=Ó) ø™Jϰ¾zKðpEs=Ü•3«¢x †þT;xñ7–6ë‹VÐÏ‚!i%Ì«f¥ÞRäÙl¨‰+´”L¦"W[+ÙäÔ@‚‚q²)Ôñr¼S&ÌÝ`_?Ýâø3‡Ð!‹c®ÿ_eæäX~zíìSÒ‹¿ÝeÏÀ ñ¿Ý@õbJ)ü¡ñ§™R&ñÑO‹?÷4:¾‚ÏÑÄfãß <œ>4ÅËÏSu¿ÌÇ×ÿrÿ/v„zŪ@Ù_>^·ª„¯Žâé ŽÂà=Z/ÓäBlq"Zߨèð¯P@ºD Çr²÷]^ÆN2öTL»È'ôö(2Ôì{zlæÕÌ+ŽšXàˬzt”ŽY"yôSÒˆW~ºŒ$ã‰~+ú¹`¡Š\=³ýŸSî">k–µYÃ5)‚uUÞ;¦5uìM‡éŒ8T!ëøÒlĮ̈©¤ó7°J€ãwöÌ¡\ó²·Mi "pŠßœÕöÆ×¾®véÄö]Yg]i_U yè¸qœú!–­s0lEPåŒ6D"TZ:{Ëš‰Ií†Íý¥4âAÕZYpJ“øy"nÌT±Ëhܶӌã'û]{¨Š9)Ê>Ï0}%¦'Áòeñ§9g±Œ0÷D, …\º6ùêÍtÿ©#pü; PH%‰\Žw5ƒ#üÁç²o¾> endobj 2016 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [312.8189 175.0606 386.4723 187.1202] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj 2017 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [406.3277 175.0606 479.981 187.1202] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj 2013 0 obj << /D [2011 0 R /XYZ 56.6929 794.5015 null] >> endobj 622 0 obj << /D [2011 0 R /XYZ 56.6929 385.3709 null] >> endobj 2014 0 obj << /D [2011 0 R /XYZ 56.6929 353.2653 null] >> endobj 626 0 obj << /D [2011 0 R /XYZ 56.6929 353.2653 null] >> endobj 1270 0 obj << /D [2011 0 R /XYZ 56.6929 323.4096 null] >> endobj 630 0 obj << /D [2011 0 R /XYZ 56.6929 266.7517 null] >> endobj 2015 0 obj << /D [2011 0 R /XYZ 56.6929 244.4404 null] >> endobj 2018 0 obj << /D [2011 0 R /XYZ 56.6929 158.1241 null] >> endobj 2019 0 obj << /D [2011 0 R /XYZ 56.6929 146.1689 null] >> endobj 2010 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2022 0 obj << /Length 2923 /Filter /FlateDecode >> stream xÚÍZÝsÛ¸÷_¡Gz&Âá`ûäØrâkNv%g¦íÝ=Ðms"‹®HÛqÿúîbA‰R,1©•©ã™` øÛïDßèyøJuÏ¥š.LorwÀ{7ðîÈcúÍ ~{Ôû˃_N•ë¥,µÒö.¯[kyƽ½ËéïÉñÇ£‹ËÁè°/ O,;ìË“÷gÃêI©9>žž}ø<::t:¹<;R÷hp: †ÇƒÃ¾PÚHX@Å%þu>РӳOƒÃ?/=\.·Üþ,Áî÷ß¿ÿÉ{Søº_8S©7½'xàL¤©ìÝh£˜ÑJ5=³ƒñÁß— ¶Þ†©/Á¤¹`BÕëδÛ•~ïFR*–â>×>Ú1m"¯5ã)_!/e y¡óJ™ž3)³Jªýd–UÕaß*­“£9€•¦I>Ÿ”Ó|Š>¶UÔôâ1›=äÔ]ßf±³˜æóºøƒs™Wô.£÷‹Cᓲ.'åŒz®³»böŒ|èyøcpû 6S.ˆ[żª³ù$§§òšÚŒšö²l“§˜ê¬•½6¯ÃWiψj¯ß Ø'Ë$Œô\v±LÁgI‘”F'¤øßÑa_§n,åeÀÉ«ò!“Ø;Íê tÂq³y].î‡H#ÄÊ àjkQEEmý|ßýÁ ÏæÓ—ØHê\•wy]Üq†ƒI‚«û|Äe²ƒ{-XöŽ•Rvi9ÎqÜmhùÿ6«Ùˆ°)S”®/ãnÝ:|c%·ÌËÔõú6•°ªÚ" ³N3ç¸ð#Ò×ålV>ó›¨?$:å´½ nÙÃÎÃ|ätE£Ö~ 6ì:j´lB1–xTýe“¥KQ·hu8ÿ'ðFõ>õׂbZàÓnõµF0©@8PY`—ÅŒpr[V5QÙtµ·Bÿ%ÓälNoH-8RTêÐu6¨(ôR«ÑP⣒d¹ÃÄ‹~ç[;|’W“Eq•Osù{zL@b¶+o “}én³¹ï_²™±sð£N ßÅ:PW%=iÖüƒ«…@mT«5¶)Á»áóÞµ±×}ì ?àˆ·æGœa3c+~Æ;æU]ø vO‘\dV‚ìoGO€ù*Ç‘E䮂AË [ÔE6ûfÜSt5×ø ÍוBßEËÍ_RòaÅ|Zк“º(Q!²¬ËØ}bžÝEêé6æÅjDÜ[MOÁ϶XÛ=vàîñ-nŒ¯k%>yûkJ ˆ´×åÃ|ŠXò4|½Ïà‰çu6‹]má„ÑEœM „ô€ÇVálsýu’ôSÃ*ca„µ²i\ ™Š‹fùt|ò”[zž|*'q"õèé4Ž  Ž®²*§î*_<æ‹ ½R|ƒ8t­ßjp¿5"«í\X}Þ¶°ð’qÁ»,¬1†™ÔE {ñ \ŸQ"9Z×k¾&þÔ3+ª:šÜMØWVøP$[ ±rÊ­ýïË7&fŸ0kθ1]1$¦ÌjIòv ɶrB`öÀ“ålZ­%YÓ⦨;É”àVä>ànÐUñ;Ðmm{_èþ„ÏË$ö]è*Á¬w±œ1<úm0Y !Üzv )[°ýÒ´Ü弘”¡Ÿ| ¾z‚e‡gˆ°³`_¼^ÆqŠôVë²;\káΔ5$BRuÕ6ÀœC"d…±ÏN@Äyê“3@~(y¨:Èv0ÿ¥.*`\?‡D ;žn‹É-‘°ÄQ“YÃ⌸á夥˜Æ‰E}»=¤¨— ²ú;cEí¸ØÎ»(ûb/ù¨e3c;ë´fXÔÁ; .Ï[KŽà$ê™å÷³lBÕ%—Ô`b‚ =-ï²ÐQ€ZV¨†åˆ/•«1RÛ˜ÝVíÁ¸J¥2™•å\P¥*y¸B…$æ5‰ùì™F} Òžæ4…l"BõpUÓsNBp˜Rp¸þ‘ø,¿•«fç¢û,ÔÉ s‘ÅOãhd²84‹ã`?³f ŵeh§ô>«èýBc¥ c‚Î Ñh“ÿ×Mµ!Z=*0"º¤[Z'wHwKn^'‹?×2Ia¤î’ne‡ QºÇüØ­RžŒë2F:§cÐÜ?\ÍŠ Ñ_òçèž[_DÉ^ÍªŠ›y7ü uþ§œ¯ìM»…ê0E\íÈ Z(ì׋ìÕ«ÔB°©º2Èð™P&š¢1f­Ò¬1J¤QGDj’Û¬º% µÛŒF4<Ä®ÀÃðnÍkèÈÃå,³ä!ÒÈí¦i¯¯a^–ýf{ u!bVù® @yÏ€_$Ó.ÎÚCj;^ú…jÃvÝÌÊ«&Ú½/«“¿ìøáSˆÄ ¸WQ?µ×7ß*Ë™“^tAê,“6¥ˆgÃÓsÀTx¹ß Aâøâ3TpÅAN`aH(Á#CµÞ†¯tÛŸú†]ŽÂ ו6+ÈN•Imøð³‹ñà8xé”N.èˆì"ÛjÍÝåõm-KŒÁÜ€Y‹±¯•ª|e°–Ýw`®¡æ†OÈŒhœ^QEÖ\îâV †·Ì-ð)w&Iz¦!Z'nO†‡}ÃÃÐ6º,]PÍÉH*¬ÛÓP¹V)Ì1ÂϲGèÛâáåwxøÝU§ö§î‹#?¡0-ƒ@«ëDUqÍŒòdЂæDë± G)Ð4~éàÇû–Çgòã­Y!þB"æ{ÆšäsÕ /æÛÙ yS̃G¢u@½ÿJ´½M©'ØPF&€oM½*ð°H*Ÿ\=Ô/åU]Ì¢û‹¶¨[5>û€uiŽUçÎx£ZVÌZ½ºRµ#—mñm¿•å½úKø,ˆ EW)­gL1‰×? €„I›Îô?”Û|ßc¿N s» iœ‰5 $šÚA½qË"‚Z/ Á]’µJ½¤â;˜ÑúÌ7\b–Z0álWî%!‘ÄC ‚6ÐDˆ]’Ó.XÌ¥”2…xqL½Åüº g&j _„]úˆ%tïlºn‘·ÂKû6oüŒOrÃ”èŠ ¥’ÌsG¦ô7u“Šod=6 B‰bFT#ìôD²Þœvã„eÅ:£1’ªYfy/ èèC¯w8¾x:G—мX^eòt`8+Ÿ‚ÎyŠ{Ø}•×óă6x¦ÛAðí3µ´Y˜FçøØ‹3@¡r²Ì:"@5H|g2—:ýä[ŒÜ—mý Ú,R!­éŠ|$«©–d[‡G—#¬ñ*ž xt9ç.Šú¹IéŠ9ð/LýÀñE*v ÚÞë~‡ö ©LsÞå®$«©w$ŸÃñÑ ê|¸£êÕyýT.¾ÄCõ|ñX4wó²Édu@‡(oà xn 6ßq ¢½ñý¦Ï{ ÿ…*å]¥má㪣ëã=-å–Òša™º¢ ŠŽ—‰&©|4!ª)€ßcÖ„Zm Äz°Ûn´?ï 0ž2kÓN)×)R¸È†Áq¨ ù&&ײÐ.Ãfz ÷> …Ô˜îUR©?L˜x*Ç…K±HFqjL €ÊvÅûOsä±–÷Ðàþp3Ø“Qƒ§°õÉå(‘Ëöˆ©‚.3®RÖDä_‹ªÞ\ï… K‰xÜb)\G¢õmðôDßÔhD-ÝÒ-¯†þVFKAliijæú/ùÆåeÅ9"ÛYÚlËÆëä ÌsØãEk&ݿؼºÉ{Vü{¯“¯®ÔÆ”÷[RZÌd•Jºl\‹ an<Œ7^ºfXkïÿdûá endstream endobj 2021 0 obj << /Type /Page /Contents 2022 0 R /Resources 2020 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1988 0 R >> endobj 2023 0 obj << /D [2021 0 R /XYZ 85.0394 794.5015 null] >> endobj 2024 0 obj << /D [2021 0 R /XYZ 85.0394 671.961 null] >> endobj 2025 0 obj << /D [2021 0 R /XYZ 85.0394 660.0058 null] >> endobj 2020 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2028 0 obj << /Length 2982 /Filter /FlateDecode >> stream xÚíZKs㸾ûWè¶TÕ‹ 09y=öŽ÷áqdm2•Ý=Ðl1+‘ŠHÙãüút£A‰ÒH”gÇSñ!å*³ÑxèFèn@ô8ü‰^œ°$•iϤšÅ\Ľñü„÷î¡îûÚ šFƒv«ïF'ß^(ÓKYšÈ¤7ºke·VôF“_£„)Ö‡xôÏ÷WçýŒytqùPBéXFgïN¯GçCªHBÓï.¯Þ'¥ÏÙû«‹ËïžöŽF—﯈=<¿8ž_÷ýpr>ZO¹½,ÁÎ÷ß'¿þÎ{XÝ'œ©ÔƽG(p&ÒTöæ':V,ÖJ5œÙÉÍÉßÖ¶j}×}bÒ\0!cÕƒØÄþ]ú ¿H«Xb“ÝŸž2 dŸXÍ”Ðf-{)[²"fÚšž‰S–(©¼ì¯nÎÏT •¶Ñ/•›ôHå}ß^Ý@ým^Q±.é[¹ñjÙ6r³§¦Ã$gµ í¦YMÔpº>æõ”¨¬@MôŒfiK8›ò±pK˜Q‘ÍRÒO9}ÆnYgÄ“ëVZÕnù͈?)Ã(eM„û˜Wõîx8¾=ƒÿ”."N`ž"ZkƒÒ#­ ¨á¾õÓÂá*ce$â/¨P¹"t¸+—ÍÐôõ“lOƒL"/îq’Ü/v¼²Q“üǾsËŠwþ·Ê9”Dê[ŸÖʃF<'|Ãì`vU‡ À–\±šƒV@`u^Ä»]ÕDø­aT4/×K/VµoŸÍü&îãÂUþàöýœ”r[ú}â§ìˆU^qW MJ"Ôòh<ËIÀž™…aPŒ¼uÕx™ßºÐ1/öÉ{xqFp‹8f»P¡cÃ@®¦×6°/3Z°¦{©X*¸þŒ!©‡êÀ„3͵êÆÄÄ,Õ‰ØàÀu?•Ñéðôç> ‘4xÆ&aFXÙm4q*™ŒÓÔËéz4D¿S¥Ñ)º1:Z”~R# ª†ã«a.²eMTyšytbRÎ3ò±tØÔHU к· ì·npØpºUKïPQ{í/…k_ქ2Ë=¢¢¦ Ó„TôŽ-ØŸÑ59Cù-UZͳÅŒ,”n]ýè\AVJ"< ñx“I°ïÊUì°fŽšHT‡nZ‹~Yݼ¬ùHËljŽœ9±ÖL«”ä2¼öº‘Ñe¸8ž¤42j¾ ðeKÐC!ÈzŒœNx`z@•àHz3B™"—1Ñ9¸—¾ß^à @;xÎfÏÄ:!l—²ZRxÍÊâ kŽaä DX7Þ\~§À]tV59`ÚŠ¶ÿ§­Œªü¾ÈêUs "k’ÕˆWp·å‹UäcH/߃¤¹Ò2o-æ¥d`i“øsÔØô8(s%Å‘8p‹%Âx ûÊD#4 ;°\ÕnPO ÇV÷àKIG·è›xWA÷‰iYÕ‘ä‰!…~½Gä[eè†S#—‡®à€ÖÄ$'½ŽÑ‘RèÓMQÁïAMC„ hZ.ÿUÛ89°an,Ï»>Ývü /1Ƕ̿L_wk(NErÄ5&V$oŒ±MÓ–1 lƒ¯ŽôŽ%"«±D¤É™4!!`À^;“‡²ÆÁT"Þq0!ö&Ö°@–÷h€µF‰7PV"$  AUç>P„6+œÑž-@Û´ £þÆcÎáŸ8Š×ÕÆ9 Áaã,:6MK/µi¾‚3¤R:>â i©™µ†ðäæý)y€—°¼ü7Î¥÷†ŒØœŸUí]T ßÑ7£&mU„€þ©/„ˆü™»…ðØ&gy'Âw»§í¥¾âSUY¹Š¸@à>²ÔZ÷Íõš±j›±æ6ªû"B… }㊉‰¾.gùø‰è‹% e9¦cZN2¼Õ ‘ö}îó,ÆÛ4#rãB=Ã!¸·‡U×–É+Ž,T"ÀÕ¡tªgŒí Ö,V·³¼šRuF¼M«Ðkê•U¸§o*â"бû½[.–yQ?×ädW’²-¡—Rd3ÙçÙô8¬H³$†0½[‘2eR'$¦‘OR&à=Œ0)í>Ö$à“ÒmÃä¹Y«î3§=½/[ò×5.˜Ñ鑬¾†ÉTˆ4@Š3oØ~ZHR2È$à2~!¹Æ/lÑà×›ŽôÔ ‡ónXpÌn~]÷…L£7!YO ¶hCDW«Å¢\ÖnßåU ŽÇƒ‡ƒl‰æš„C€n‚ÇÊ”åÆ‹òƒŒÑiˆM4t­ ssøXE¹Eø~`Ø©Íq…Ý€Ìðt' ûÓ¹¬îx¬µÖ—ÒÈæ^ýØE=ö1Üì\Ôÿ¹^ÍD˜ÊH…jdÜl_ðrÑ0hSHATL øšGRI¦eH–¦áN뮜ÍÊG ùAÊß^€47= “´~ »Œg*˜Úmý‚ª}P;ïͯa´*é@»½àºçÒ N@*µ?*õÍò-R7 €Hð/»;dm‘*IÄÿJ¡­ÈóÏ:Éc¦ÄïRò;D\^õ ^­õ~‰7 `ÆÖµù•—:±¾B²MFëcQ’H–Bðê…qöï?¸Î¦YY ÞlâRpµ:Åg=à8–u9.gć¬Tí Ýòš*~¾ÃoÏæ’‰y>€4yWF˜µ!ÃM:Ù\;¡ Ý«pÎ:vÏÞ(hѽµœ(ÀXtg˜_܃ ÎV%BÛÃ[²­ìWœ€J±c™ñ7!ø{.T"`û¼s ¥ JÖj© ¿#~³Žï¨0qnV.(?béRÖøéà Cò/L³܃§°c LæÅÒF—þ±‹¤—7²ÙÈñ·À©¦››iÞŽW¡¾‰W¡î![æå*ŒT=U{Ó²µ›‡³sŠ·YµÞ_Ÿzz0›eS{ò׋†áÿfi+GW…§°﮵Ú^jo½o"a\ýLoBpÃD¢E·;añÐjãMàC¨ðÜB…WeDÑ.‚Ê»Ú5_Ìòq^ûì­–Y¸Ò¦gd¡n)…†‰Ú½_"úa)ÜûÁ·žt9 ³.Ê0²û˜ÁϺð›ó¬xÚ·iÞh!®÷»*¼4ÃJœQ5‚£vg;Í(´‡˜Øh5nRçÕz€Ðº¶~oéßГŒpU¬é•µô`WÒ=*åÄûßZh¯‘=O1hÑ%þщÔÒ‹²"ÖÆÓM&`Ö¡/¢i > endobj 2029 0 obj << /D [2027 0 R /XYZ 56.6929 794.5015 null] >> endobj 2030 0 obj << /D [2027 0 R /XYZ 56.6929 229.6198 null] >> endobj 2031 0 obj << /D [2027 0 R /XYZ 56.6929 217.6646 null] >> endobj 2026 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2035 0 obj << /Length 3019 /Filter /FlateDecode >> stream xÚÍ]sÛ6òÝ¿BôŒÍ#~áî)qìž;­ÓS̵ܻ} HZÂ…"U‘´âüúÛÅ.(J¦œ\›™ËxÆZ,€Åb¿PÌø³4ò¥ÃY¢C? D4Ë×gÁl }ß sé]ŽG½¾?ûËJfÚ×±Œg÷#Z©¤©˜Ý¿xWõÓýõüüRFûç—Qx¯oïÞFÓÏÕÛ»›Ûï~ž¿:OBïþöí¡ç×7×ó뻫ëóK¡ÂHÅ$þýöîšÝÜþp}þÛý÷g×÷Ëãm‰@!¿¿Ÿýò[0+`wߟ¾Òi4ÛA#ð…Ör¶> #åG¡RS½;ûÇ@pÔk§N‰)R©¥2™“”SrŠ´+©¬œ6Ù¶£ýüDÁü Iÿ½„ ®n• ƒÙµ[P—eÁ¸æá¨o{.R¯l›Þ9c¥©—e›oÍ¢,|&ìèR$¾V2µìÝ#ܬˬ¶sTÙUÙQoäÝßÿ@䯬 j˜–z3mÖ<¼2kÓ²©éwÕ츯¡UB/« 3ŸS;Ïxì‚É|(7LÅÔ+åY¾*Á`âTÁ´ªÛ¤ðuI»É¢)íáÕ%xÙfS=®kÕw«fkº¬3%uY—D Þ§¦.Û¿_† p÷1ñ¬j™J¢ dÓw0<Þ¢çµna’®Óá«rÅjÞ¦©LnïÍöpsäˆDE‡–5I Ö*àHošU¥•—µ­YÖ–9ÀZNt¸§‘kS›¶Ûf¬fQ¨Ã…Ú­Jbú€Œrrtiê¬+[Ëšôþµ2U9¥¤„N äº%ÈšhøÛ·È;B¨6üE†×æSé&ä(¿ li°0œÑÏ'b·–!`CØ•Y˜®¢CÞhÚmV™ÎªQÖ#á÷¶îÊm]Nà¦Ü‚×Yþ©¤ôÚ~¹,ÛŽäý•-@jyðªé­Ë¼ànëV4ƒ–µ¢Üró~‹ì‰©ÇSº§É³Š«¦í0ËØ»å¹ý䫬^–S¦G+5s…òîÀ`7 î$§ÂÔ-¦Ùx6‰dZô¹µJ@l¶†xÕä›rD†™uê‘`ËÔyS·`Ãe?ªè·äS’T9¡!¢{A!“̆¢lMPeÝ“bŒÍò<¬áA.r£²Q?fU_:tU5»!21œ?ŠÏÉ>>KÈ‹äRa(’1‡D$BµeÞ™¦¦†µP7oi¦i ‘gÛ­±ÛFÆH^%oÖ t\¦"*ˆÝ>ñ2 ÖM¬™RѬ3Çd­Ñõ'$~ïv? ÇL—Y«·Jp‘ÅJŽ¿÷eÝaÜF\?h"ã)¿JnƒŽØ"|¨¦[9°0#æXoîÞYv!·‹Qnæ•ò…àêëáK(_‚ É !¼òc×£7!•òãf[B¨mêô* âò¸ }ŠÐ'=i94Þp’9ØÝkJM8`PŒ¶Î¾&ˆzµbf[v¼‚åKË}/lŸÆsLìš¼©Ð—Å †¾¾úv]=½È¤ecÂVf¹²Scí»6£vüCnÜ‘ ®íÔ6ŒÏèM‡¦´åöÑj° ÿº2©Âðu*N hÓö%àâc¶ÞTÖcí„ðhŠãEç7W4ªÐðb*8bô xwOUÉ D©*ÛRï`þKmˆ³Åü®3ˆb< /Ë6v%0Û<Ïç‚a)ydçe– TBœì˜šMð ò ãØÊ‡&˜vJ6«a#eä­Ìh–& zd)ðƒë×Z¿¤;ì(R•„ªLmã°„j¤‚Ь_®¨y5uïBLá-£…@m ¸Þ¢âeû–".vð°Ú&ÚötE,cš£Ò@Š}Ê™‰²+#$½%‹íQ/l“ìobæ|îpË=ÑqäE¨˜˜äÎt«Ñ0謲úŠ”ÃÙéÄʆI@Å×c5:U:6î´p[ò¥QhÝŸPž@ØÛMÓ·.Êù¼Fn tº:ŽìÍC7ʱU_¸ në•ý '+²…ºëÉÆÚIÍÝìÓ+ú69$pzŒc:övŒ¯Œ­ÀÆC¡J¹`ÔÓ¦äñ6î!.¯@˜Lóáh¦Ý3WûAÃD$FPß–G×u¹nj“·S*JôûzÈÑ‹æÑ:Gì¢qìÊX, †DÌi|{Iæ€:~h¹«â !>Ûá>BA¡óþ>˜Øá ¡³ÇÆ8® RXö¨šƒúœ­åM—™ˆ ´ :á"¸‰mîí…iÿƒ)ɪÔŽGñÖ[;*Ù/B»F€v=Z [É©U;[9# Œai¬‚ƒŒ»½s}r_`¾¤W~Æ8ÁvƒPöY»’bÈLSu‹­z(ÉuGwÀãö„ã™áÔe`]ér6 ŸWœá¸â 9ê9qã„9ýî÷ <ÁÅh?ÔÍ®*‹ey‚ÔpjÙ3<ª7(;Lgª#‰á¶&ÅqㆲÈùT°ãyk(Z8RF= J©/×#uqÕ En›-‡û×ãk.¡„&:)­ý0â/¹èRqàDZŒ/ºþØ,ÇÈ(䀿@‹A'öCR—æ.Ušø‘ ö×há¸Ô*ñÓ(Ò°ywB‘ðöÝ­ýæg¼ôQiàýøþü2Q‰„ú 0PƒÿóúîzþʆI4ZI¨@¢£µÿÜ~Pr`ƒ{3ûšJ"?J"5-!j_†õT¢} m%ô\$¯Þ9-ÑJß°ý•¯0úKë@Žàû÷þWïüo﹤G¦#–Màeq$l"À¿0|cˆGKÿÙ¨¿vä#tä‡Qp"=ÊH¢Æô ˆA¤JB~Ü‹Bx{I!òFpR&ãå¾’Pþ—¼ðõ­V@º¼ 0ôeyA@-š0½ó‚€<CÊåHdÚ—ãÏbFA­ÜGJz[8ô€DúB‚ƒ ÓŸx‹H¡èMcÁÃ/NÅ/Žº…y@.Jw¯:Ü8p°µÏ(C¶x!B%šÂ‰ WT…žSÜcÊÓæýÄÓ æJ\˼Ù§žQ@¬qBqý•½…“û °©†;4¥÷añôjÀs†·ê35¥!ʺПñ¸l˜KÏô1_¢îù] ö6çKµÖò!X¾ãÙ”Ö§*)÷Ù«)z×Vöª­3yolÛ”öòFñ³~¬0Þ‚ºhðƒ©GÅÝÇ8ä#%Üà @ø ×–$3á^€ð~é‚®ÇDš?¸°ËÙ µ“/%BÙhü$ŸtÂEà[cï½°vøôñDhûª!ìÓÞ1#Ê OHGÐ~WMûíƒP¤4AŰÏßÖ&³ÉÌ–D‚¾`¸ ·g>Ø ô’H‰‚8„ç(Q5@«œøv ?8šøÒ(˜}6þéwMûo»BˆZi*§Ã BˆiZ8¦P"ÐǬ_@=çý¿ Pfúendstream endobj 2034 0 obj << /Type /Page /Contents 2035 0 R /Resources 2033 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2032 0 R >> endobj 2036 0 obj << /D [2034 0 R /XYZ 85.0394 794.5015 null] >> endobj 634 0 obj << /D [2034 0 R /XYZ 85.0394 622.0858 null] >> endobj 2037 0 obj << /D [2034 0 R /XYZ 85.0394 597.3835 null] >> endobj 2038 0 obj << /D [2034 0 R /XYZ 85.0394 411.8393 null] >> endobj 2039 0 obj << /D [2034 0 R /XYZ 85.0394 399.8842 null] >> endobj 2040 0 obj << /D [2034 0 R /XYZ 85.0394 231.7148 null] >> endobj 2041 0 obj << /D [2034 0 R /XYZ 85.0394 219.7596 null] >> endobj 638 0 obj << /D [2034 0 R /XYZ 85.0394 131.5008 null] >> endobj 2042 0 obj << /D [2034 0 R /XYZ 85.0394 107.0349 null] >> endobj 2033 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2045 0 obj << /Length 3197 /Filter /FlateDecode >> stream xÚÍ]sÛ6òÝ¿B} g*¾H‚}s[§çNãä\ÝLç’>ÐdqŽ"u"Ç÷ëo» H™v’‹;­ýX,€Å~¯äLÀ¿œ%iœæ*Ÿe¹‰!“Ùr{&fw0÷Ó™d˜yš¡¾_œýí•Îfyœ§*-Ö\6ÖÊÙbõ.JcŸýëÍõåù\%"zuõ ô¤6‰Š~øûÅÛÅå M¤ úýÕõ4’SóÛëWW?ýóæâ<3ÑâêÍ5 ß\¾º¼¹¼þáòü÷ÅÏg—‹þÈÃkI¡ñ¼ÿ9{÷»˜­àv?Ÿ‰Xç6™ÝLjež«ÙöÌ$:NŒÖa¤:ûõì=ÂÁ¬_:I&)b¥S5A'¥¦è”äqª•ötÚŸK¹Ê}(ê.gL´*ºÃö[ì'QQ¯h°í‚äïû²ÛðL³uÔ+V«²+›º¨ð[GÝÃŽgÊzÝì·NÒ@×P»qÕŽÑ<´Û¶|×¹ý¶¬yùýÆ…u‡$‡{Ï¥Œó$Qþ7üŽeKíðRq¿ ‹s­¬_ðú·ó¹Ö’—t·UKƒÒÇ¡Å+cϬµˆ–MÝyˆ¦¢‰•«Ênÿ@_ÍšZ·-Ê ù*ÑÑbÃØ€¶õÚÝ9À,Ë÷B¨°CYóN||< §¤f·/›}Ùñæþ½hvD&’‰UgÂ=LÕÅÖÁéR!øt06ÀeÒá=[šï Èíé“p¦ðNårCCþöÔa[‚-:xî]çVÀi:“ÌP£]ªæÞµÝÔ{ׇí-n®´€ûžy®E]­q4ºû†¦ùN¥ké»\üð[!x Ô€÷ð\ïI‹³­Û ]râ,[nšÖ3#ô÷@íf[=œK)£Ñþ6ªFìq„½;n©¹²ÔÖS~â²Ç[ÍÑîšzUÖwxÞ\ñ5¬‰ˆè×ÁájßÑgqç¼x[”ÜŠaÖõLt[,ÿÍënÊÚ}däßÄOõ‡æû)¢·= áz§–ÀWÍOÖ bS6ÚpK•?ÐPqÛ6Õ¡sôµuE w&˜÷Je4 ' à=¡àD¯ÁtSW ˆè–]6õG(À·§.*‰#ª’ÀIPhaÿ¬Çâ5ů,lJ±°%æ(ŒÐÇyê1O`×KJbX|ÝåÆëD?ÚPdn èe/ ½Û°-I#ér>Ó•2°ªùÀZh°%Âd î‚WØZ†Ù@"OˆÞ·)ˆÀ`““Ôž°tÛ6˲è¼5} –ƒßd¤ÀŠÇÞ‹D\P×ÓÚ øƒaÉÄh¶¯/^_ŽMñtÚÑ¢ÚX–î‘}Èü_ùRÕô(ªÐ¥wCÉËTT®iÐ3 3|úM¡½m¼•L³€',µ¯ˆ»Õ}‡ZÏ‚€ys’Ñ'¡†G!ßnO:}G¤ý¶\Ëš"žy°-ïêæÈ:xþª³]x%–„µF,yŒdÄ4DZ'çõ0Ы^ìïfÒŸ¢æUa7ÿ|‚k`l×”u7ØgBÝ>g¾À>1ûŒ×ÜÇb»«Üw§._jã4³Ù,Däås|>•ÇI&³±Ï÷ÿ­ ç<Þ“' upq7¬£š‡;Í›ƒøªÞŸ4r ûYsÆÎ’\?iSOL&S¼l¶¨]48mWà5k%è c#)Îç™`M–œP×äYl™Ï'ùº»!e¦ÕB®,‹AÚiz bÀlà."N­6ž`§ÔÉu´§ŽúLò v~YúÈ—¤OšÄÒ‚>° ÿá ú¨!}bô]»¸Ùß=CÁ¾aîXOÚ4ù„´A—ešT×cùïÿ(r6ƒ©­ç©ÿåÓ$lþ&‘‘êJý [™å=‰N„ŒÞ34ROÓh°ûKÑè×ÿFEÎ “Ì€$±ÈÆ †G‰•ÙØX4¤O2Ú'O-K‘šàžÈÁ„§êQO•]žS¬`c²t€S}©nhƒ“Œ.ª÷Nð5_°–ÑSý–Cö¸0ôm*ÕØóòn%:­®äpÞupS  ¾ìré|_º&â ²¥À Xy@¶£¢šŠeü!†aÂÎzîá­b^,{–‡ÕàqJ°tðLĬÏÍéó¹à2þ꺎¢:À¶XüÒN\ˆ3r#Éb.ÈOK£®Üºy×Ì+Šâ`„h”W.åÌPêÝ}W­èƒbrÊáS«ùmÙñ8‹wDñ”ýɇ&ŽýHEuÙµÃSð\—›·þI‚Cßo™b̼-ö¥Df—&\oï’¦}¸ßTœD€!N†¥:D¾Ð[Bdè¨{sÓ¢0–ÉC@Uê¬\»Ü—·Ž1mš{êTèIÀË[ݺÁF«0¶nŽAŽ< ¡m7Í¡êa&óPe»,X*0ÐR„GXWUsß³D·¡=xsŠíXèzÈ‹ýiàcy @^­b‰ Tž k^A͛څS(öS `A¡I‘Ï´5qfäçhkƒ†™þ2m=½jàâÐbJ|‰#VœX p%ðÒ8Wâ UòŸƒáÕÈl¦Hþ~}Ó€ f¢ªðI!ðÉ‚¦™Î&ˆ£¦¥Š“8Ð µ»+8“Ÿ1 xþ h± ëÆÉIœCnF^WÏ‹ÑHž˜Ã“¤Ïï@÷˜›Á ª-é… ºu3»™‡\ Ž¡Ž¿þíÇ7¯/®®Cî!äåZ×NñüšN»%>{hñ”Ü÷R°->–ÛC£ž ±–áH.1$×1ã¡©iÜ·Ç ŠÞࡻʼ¹Ìá¥ìðu†¼¬…µ ¼5àþ"”aÅ“L þ‡Ï³¬²1Ÿò9ßx%a0'I 8°Á4¦Uúˆ3DQœÄœžVœ!F˜®ÙшÏ﫦†ÒØ#íAÓH롆!1 ÖÁQÌ-µ¼ëÓ¼rëâPu'*¯çw4ü¡‚õæÐ4]ŸKYž j]÷ OôÔþºç;åó‚¡0?çéó¼¹ñþ`_9Á±à'£BÓ“|AF®Tœ8ª81Tq‚ïÂêÂä¼ÊgÞHÛ—â€Ï{þK*sp»3¥¿4îñþ,<Øóq2¼ÞœâÏ ŸÏ¹0HÕôßqˆXWX~b ÷@ A°‡‰C´^'ûìÁÁfÃÑV4Š?Žb•‹—Óƒ‹Pô>©Ïœ½5„‰m±rcL•7ºmÃußy8óÈ—jË»š¬÷¬T¤¹¬‘‡êy±"ˆÊ­»aSEûònƒuc#²àYÂ(µ}PïvM[v\€”¾q2àbhÏŠA®ÀvÀŽQ*º ¢’CQU\0½ß—Ý|Ê1ì\í+.ÖZ.·¡ØÂuAª·ø’ò—Iè '쩘¿pB‚ŠŒFäGo0Á6/ïw~ CAæôás}¿ÑÄ•4ì‰Iœøt¹ObªÞÙ·ÄË}l™ôãÇ[b^ü¢}ð¥£éÇ5Å ì.çR,ÿ4!Œísl(‡‡¡Ô>þQJÈÍöÏ¢Žõ6-£èg2üÓ?ª£-(ÿrWñº tWŸs®;ö•èøÍÀ„„ý6Cn1º‡'®€3H®Mr­khüÁ¦kÚ½çðn"û3Q^æ¿{*ŒÆ(ÚÚôO £_,3ÝûŸ™Š­Öf:1Íî'цˆ÷Í››«Ÿ0H-¢±ôê{Òìóu'?ºb/OŒT€weÕ³ÄHMlRC?ÇÕc3 R‘ä™;ë¦y¾þÈ2Øñ¥Èòçz¨èåC¥$&ͦ~ù'fŸ|ºÏýáñ·–Ík;x»±c—A ’Cœ6Äå@)ý 2ü"‘Ágÿo$ÿendstream endobj 2044 0 obj << /Type /Page /Contents 2045 0 R /Resources 2043 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2032 0 R >> endobj 2046 0 obj << /D [2044 0 R /XYZ 56.6929 794.5015 null] >> endobj 2047 0 obj << /D [2044 0 R /XYZ 56.6929 613.3608 null] >> endobj 2048 0 obj << /D [2044 0 R /XYZ 56.6929 601.4057 null] >> endobj 642 0 obj << /D [2044 0 R /XYZ 56.6929 465.8716 null] >> endobj 2049 0 obj << /D [2044 0 R /XYZ 56.6929 438.5672 null] >> endobj 2050 0 obj << /D [2044 0 R /XYZ 56.6929 397.0946 null] >> endobj 2051 0 obj << /D [2044 0 R /XYZ 56.6929 385.1395 null] >> endobj 646 0 obj << /D [2044 0 R /XYZ 56.6929 216.4249 null] >> endobj 2052 0 obj << /D [2044 0 R /XYZ 56.6929 186.4354 null] >> endobj 2053 0 obj << /D [2044 0 R /XYZ 56.6929 97.1422 null] >> endobj 2054 0 obj << /D [2044 0 R /XYZ 56.6929 85.1871 null] >> endobj 2043 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2057 0 obj << /Length 2118 /Filter /FlateDecode >> stream xÚµXÝoÛ8Ï_¡‡{—Ÿy86›:=/šd/õ^ÛöA±•D€,¹–Ü4û×ßCÊ’£4ÝëD49Îço†d…?iE¨02ÊŒ$Š2­6'4ºƒµ×'ÌÓ$(Rý¼<ùñ\d‘!&åi´¼ðÒ„jÍ¢åú}|öÓ_—óëYÂS2KTJ㟗¯pÆàçìêò|ñú·ëÓY&ãåâꧯççóëùåÙ|–0!³øýêrŽDç‹7óÙÇå/'óe/òP-F…•÷ÓÉû4Zƒv¿œP"ŒVÑü „ã͉T‚()D˜©NÞžü³g8Xu[§ÌÄ#™Q"$Ñ)°=%æ@l¨¥„“~“ŒŒc”œ–‘‚§œ ––î£ÀËÃŽ1«ƒËSɉLeÚ»œóˆ1b”âÖ熒ŒÁöŒ 04—Îç—ÖŽÒ•Jf %JÀ:uW³$eñþóø‰ó€§d Zšjˆ--íÑѧˆ*H4;]6p?.6PÊkç'·Š[¯ÏÏp „ÂQ^{š{deâvÓŸöEÝn7EQã¨øÒõºXÛ˜…ywo¥šˆIŒлWad^—][T·~ÜâwUå­B,[{fíéAIìf Z5î»îÉ=Õ׎ßì[ÏìÆÏ4^€^î6ßYH¯$xMz÷O3O£`èm/ÕªÚ¯=˜ò!˜2(…:KÙšŽbÄ¢)‡6é~˜`%‰ÑLF‹Ë³7¿½šOpRD?pB{Õë –\!tx.—oÐ O¡¶ $ ¤ª”‡| ÌgÄ2Øò'ü| Šæ]Ò–w5 ÙËyðîÞ…à}0è_˜AGÁ ÊoŠ ×ì‘ìt þs§øÊ‹jmu*ìqÞn‹&lÁ­0ÛÍXìÄ<°ý)ðâqû¸¹iü‰èé-~ZÑöHºÕ~‡‹.zaG³ëÁò8gN»ãìò]÷L|þÑcŒÕ­*~É4N¤.Tp6 :•Nyº¿!‰’Ø. w¼;ìÞy&ˆ4ZDBªì[°Xký ÷ “G‡Ä#Áx–ŒõçZ­·'ôä‚Û £Ÿˆ8hѸ…u¤°ž¾mªªypáfñáÑÛq——•k:ì¯uÓÙx M®‚ÌÈdÈ 5È ~œ!ÝÇ%âåÌxûXwù—¿Nœ/àt–N6gЦÀ"#‚qîéÖÍ&/ëä`ÆÑáÐ9r)C´¼Ÿà&€YeÕl66Þ'0Œ-E`ôqÊ|Ì@h ¸tŒö+°zpµ-\*…yÕìA!,cùañC‰õ„ùZÀ]gkœ§lð›×8Ø×Ÿ ‡+¤¬qÇQ%"¶_¾,GÜr–ùôd.wwm‡˜T²ÎÝAÊW7‡`¸à§[üæn9KhìÊUÙMÕ–¤˜ QîXiRÁ¿ "4T ÷e©*´ø`Dà˜ YN€´kÒ@ëÉ^D y„ÏjJ¦J*ÉÏ ˆò(¢F(¢(’žLP£’1ῌB¿ñû…DRM2ÎŽâ)†aSäƒòrÈ(CÛb5÷CÕ—±„Ú€5Ò—%CPÛoúF¯¼®iîæt¸i›jßd"8¡ØÂVj‹Ã̧I“¤ÃÞ€ÖdA~÷îøÆöÙåé…}Ñ0¾8]\&oç×ÿš_O5ž—Ì ýtù9¯zÝÀàOe¦cYáx2ÿ÷éůoæäìê‚ Ð^”t,ɘð©S€5DšfË OÊQhÿoõhÔ•ŽJˆ‚ Öon¡~¦)ÈhÖ÷¹/V#l¸&ø€d:Uª/FNç)v†0®²ÿ¦¸áû•<—³ktn_"‹±‡lì‹®øRûþn"\Ī’,ßb2¦{Ëý .¿àh—_ðûáPSì*^Y¼xeí bB.·œwa±ôÌ· l±ÐFÓxq;uµ`‚P݃æón‚.O ãÉû!&añ¤öµÉdÏ\C{a820y@¶‡²»Ÿ,šàEÁÿ,¤A7r ¯áÒ X°={c«ùCÙGüR!ïÛ»?'SPÞÞ¨ü]Nd´\TcAAêà7Æp•! ¤9ºàÀJ_9`ìû-!Íçb穜E|4¤Ež0ùˆ³÷¹?o»+ÝõìhëÞ¤Œd}òí x#eˆ«¦^#¶ö±)µ€iÆ5 $|1q¯E=|“È×ä¹×y@û¤>ñ–Nûç¦ï~¹?¼jYçk͇/ÙÃÔ²×{ÂPV?õcÑ•ÐDiÀ°§²ÿöÕ†endstream endobj 2056 0 obj << /Type /Page /Contents 2057 0 R /Resources 2055 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2032 0 R >> endobj 2058 0 obj << /D [2056 0 R /XYZ 85.0394 794.5015 null] >> endobj 650 0 obj << /D [2056 0 R /XYZ 85.0394 617.17 null] >> endobj 2059 0 obj << /D [2056 0 R /XYZ 85.0394 591.42 null] >> endobj 654 0 obj << /D [2056 0 R /XYZ 85.0394 518.3317 null] >> endobj 2060 0 obj << /D [2056 0 R /XYZ 85.0394 489.3118 null] >> endobj 658 0 obj << /D [2056 0 R /XYZ 85.0394 437.3327 null] >> endobj 2061 0 obj << /D [2056 0 R /XYZ 85.0394 411.1024 null] >> endobj 662 0 obj << /D [2056 0 R /XYZ 85.0394 208.889 null] >> endobj 2062 0 obj << /D [2056 0 R /XYZ 85.0394 179.8493 null] >> endobj 2055 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F60 1366 0 R /F61 1369 0 R /F21 954 0 R /F11 1459 0 R /F41 1238 0 R /F53 1333 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2065 0 obj << /Length 1844 /Filter /FlateDecode >> stream xÚµXmoã6þî_!N*._$Rì§s'M‘uö·(n»›ŽØr"É»ÝCiËÅç»E ‘ÃgÞ‡¤YDáE™$Rs)’Œ²,šo4z‚µ›ó šÝcc^v®˜íw=dylæ[7.œüRÚR³Ô®ZÛ+[7NÞ쮚K!÷¢‹uÙY±‹ Åi[¬Á˜£Òò= ¨ž|.Є³T¥¹©Â™« é‰4=öÙ!ÔG^?µm¶k|Ú^æî®¢àŽ–½ÌÎA™¼1*÷©-}bî1ï‹Æµ}wýF‹Ôø¯ÖT ´“Ÿ ï°b[7ãÉn;àÒÙøï«ˆ#)¯“Y B©|'6ëUÓ£EÆINù¹ÅÑ_a!Š¡0œ¸>,MÏT(´uÑôiÄ5És¥»eö L*çAçöë³7°î50…xCýÿ-åÿM A5\ÃtÈkõVÀŽû'*“¢›àN¹Æå6P­m \Æs,É¢58_àИº4~“+T‘³Ùî17ðºOXtwYr›«õW¤åÒ²,]îÃ÷Òíp§&À˜b¾ò;ðšaÉG¿µ¨p,¡p 8ùíÕ¿¯ö“`õÑ!ý_]ÉBæV˜/ RyŸÙë3;š.H_‘~2•ÕÉ󺪵Ói¤Ü–^ùÉ.âäË®DâHŽ‚–üü¼­[¸{DâO»›?›ºñw©`È‘õ ³6O…½¨ì›\3¯ËÇMŽ)ß„.m1­MãwÂýstu5%£éëÌQÀ |HÒÞvìÓö~z{s o6 =‘{›à¤ƒ;"}×,AÛÿì>–p$þ‰ÃäLJñô÷ñô‚Œÿ½ÿp7>Šq…ä—“Ñ{¿xAh‡íZÎÅÏÞ›í7ñ„7ðp²èsAUì «Øÿ ÄOº‡ê¸ùÎ ?”ŸŠ&ÒoWçšà9ß×s®ú#ÄŠ¹Ù—=Ç·‚w?SXóvbä—«ïÿÀñ›^º‰\Æ“mÀÃÃßmøGƒÀ oË•°ÚC6åÂóºD<(󲸲Ã#§¬žœ˜Ì_±‡‡ÿR®×}î|ô§ Ex~=Þ‚¾kì¯)µWH¯œÝ…ÊÙ.ã«ä›þzŠ}ÞõVH×ÏGýâÿ«ë_îf‰/îQÈ^W³‹¾´:ÇÒŽ?PɧEþ›Œ“Ýi ËÑÆ÷æ°>·ôo êíßÜÉO‹ä}ìßx¶HqZ¤8ãi‘'»º ÄR¾v8dÆù{û´é>ôsx3ª#¥ˆT"?çQ.௨zãwJ[GšåðÞçðT¥yß•tÿˆùîŸE¿¤Šˆ<çÝß;÷pû3†ÞËõlÆ_ýjË(áBòÀÖÑý?…CWÅendstream endobj 2064 0 obj << /Type /Page /Contents 2065 0 R /Resources 2063 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2032 0 R >> endobj 2066 0 obj << /D [2064 0 R /XYZ 56.6929 794.5015 null] >> endobj 666 0 obj << /D [2064 0 R /XYZ 56.6929 655.4043 null] >> endobj 2067 0 obj << /D [2064 0 R /XYZ 56.6929 633.1281 null] >> endobj 670 0 obj << /D [2064 0 R /XYZ 56.6929 552.1893 null] >> endobj 2068 0 obj << /D [2064 0 R /XYZ 56.6929 525.0283 null] >> endobj 2069 0 obj << /D [2064 0 R /XYZ 56.6929 90.0274 null] >> endobj 2070 0 obj << /D [2064 0 R /XYZ 56.6929 78.0723 null] >> endobj 2063 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F60 1366 0 R /F61 1369 0 R /F21 954 0 R /F53 1333 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2073 0 obj << /Length 3608 /Filter /FlateDecode >> stream xÚÝËrÛÈñ®¯àÁUªDì¼ðÊMëÈŽ¶våÄVªRñú …2p P2ýõéžîÁƒ%9ö^R<Ì3==ýîÊ™€ŸœÅ/tbfQbü@È`¶Üœ‰Ù¾½=“¼fî͇«~¾=ûéŽf‰Ÿ„*œÝ®°b_ıœÝf½×¿üÇíÕûó¹ „úçó ÞÏ×7£™„š×ïnÞ\¿ý×ûËóÈx·×ïnhúýÕ›«÷W7¯¯ÎçR›@Í þóîæŠ½¹þõêüÓí/gW·ÊÃkI¡ß?Î>~³ n÷Ë™ðu³_&‰šmÎL ýÀhífʳgÿì¾Ú­Sd2Jû¡ ôl®‡ãÇêDû‘ˆN+V°‚à4,Ú'wÝŽ1¨¹”ÆO‚ÙˆFawlTrÀF©¤¯µfQ }‹‘»´ZçHfX­«#à!¸êö®h€+aì-ÓŠ:‹œÚº²È«W4Ñ>ÔÔYÕ»Mó×s Zè5mºkçM[oy׎Ú~þ§¦Í· :ÔÞµuLJü.„Ú5-≴“‘S5<%‰gQ„vßäÙ’ º ”oÇËš¼¥N[S+át„ÞeYÒ„½®D$"_ ¦Uæ>;Л}Ã0ùWRšmÝmqŸûÇrˆXªÙ…ß'(€Ôu6WBûJGÉ7Àì¶œ”µ@ ?Pqòœ¬ÉO!V•wÍ %MKáey³Ü‹¼éXIóõC•ïh®J7nru´jw.c/oê½í,súL³ËÚ¶„üÇvÁ‹–´*móÌŸ’¸Ëê€ ×ÕºtÊ3¼>(˜‰LÄWz5qéÌð†ü.‘Õe™îÜus’G‡Í¢.<í]QQïúøliÀ˜FbØÓ4—!^'à5M»ƒ›Д.OêoËt™g–s¥”ŸH£Ær½‚¨ÈékyE›ïÒÖ*9Lß§å>GÕN´w{ž(¯¦ùµÕ@褴ëð~#hõ¾ÝîQUx‡zOŸ«<Ïè{Ëð@`ÒmÞo~Lœ#NNsF…Â0eö F%ˆ#6‹tù¹)ӿ޶J3Ü*ACGùj8ˆz,5/@‹b/÷×þ0ú‘Tñ0y ÌXC Š‹–Æô!²Úw± íŒÑˆÌ§²Ÿe±é°K„ÍMh6OmscSŸ²bmq€o)gv)ƒÊ·)lœ¿ ÏKLÈÁ¤sÌzì+œ†Eµ,÷YÞÑßB¤.E±ádŽg­oYo¶i[,вhmkÜ=ácžîÊÂ&£0ă`¸™ŠdùqÒóWSñ”Ôà&†BŽ'4-ñX™.w]WÅWЬ"!´E•.àƒÈG$¡ßg w°Ê)ÓÃÈL‘WŽtGD#ÿyº^1,|gm¡/Xü ¥1ð¦ÚPNl4ï·sV҇߆bób.#Wd†å\G…•›´]ÞÑ$SÞW,9OØìaÝm[ny~ 8OÊ­ü¿“Û@ü(¹u´9H·ã´ÜêÐ „zÏÈ­¾øšh{Ø>ÿ€ak¶H/Ÿ ¡ÁÆ'(6@åû®wL1ùC)ÂÇQøÅTŒ%iR”DÙóPÄÂö&²>]#û*¥•³¾Ò'!XãÙ?öuçJ(|‚ LAûW»ÿí=îû^ñ0Ô‚”_£ÜB"Ëáóá£gD-@ DxsCÐDb@,S¯­`=&Ûæéª-ØF]ºòöêæê½­Ü^MÕ'4äáÚ… YÁF¸¥ød`$9>ìsó/m^alËß«Ì l^!šæ^½: &2*·ð®¯ôbÈQ{É},Τ-çG1Daä‘s¥°BAÖ¸Ç'¦&«]Œß!Ò@z];\ú –e÷(¤éîñú×ËF‰Ä ªé<Œu˜ F\#BøhÏ¥»̲bxÈ›Â]ì½Ø”šá#0’zÿZ ŠFöqJ —ÿÔ~þì©Ôãèh AŽ…8ðf¢Os3íÒ›Á‰œJò!T¶¢ï7Ûñ:â'öˆŸ“¨-úA¢R“çÂ.aŠÎ?ÐA/áf$áBøÂtO*»ôaÊK”–¾üP9+âìhóÓC$N}™p˜G¥Œf:`g+£z}>¥fQTéî0\Ï à§dt”íóÓN³.ü‰â/.œÁH “­,mÓÎäb¾l÷]=¿wª=6Ö–ôøaqp!<Ž6éî3P‚çŠ áTß?N Ê:ÍúÙ•3ÄXO©†V(¥f»ƒì £Lòw÷y÷$#ºEl ×èÛ€'Ó`qhyºÏß퟿ s_àhoyW´yçêçYn_*>‘‚»º,ÖƒcãK¥jÁ» _¹›Úý å™Âµ¶œ©m`„ãÍÞ ô0~ä÷U¹ïÛºiŠ ™1G`\ PØ ÃËekØßö·Ðî÷¥€¬#Ëû¿)X”û§/‹~÷ÿ«ãRPsÛ¾Í ÃkúÏaGêþö‡Ó€ŒMp.¥)iaÂ4œµ1l˜œ°-~ å³ óHb¨¯áMú9áÒÓ'ñïGû-ßgÕãc':=‡D–^z„Ÿ Q"_â?:F–ÍUâ6›‰§+Öõ# fmÔÿqº×Ú.âD½Ö¨ù§þæ«ÿ›;ñ§\1{¶úôÒ¿÷ƒ6öj:/×ÂøZ'Ò!…Ô“R?*wèØð±ò1îÿ®tW'endstream endobj 2072 0 obj << /Type /Page /Contents 2073 0 R /Resources 2071 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2032 0 R >> endobj 2074 0 obj << /D [2072 0 R /XYZ 85.0394 794.5015 null] >> endobj 674 0 obj << /D [2072 0 R /XYZ 85.0394 306.3415 null] >> endobj 1819 0 obj << /D [2072 0 R /XYZ 85.0394 275.1221 null] >> endobj 2071 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F14 980 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2077 0 obj << /Length 2797 /Filter /FlateDecode >> stream xÚÝZÝoÛ8Ï_á{sÐZå‡DJwOmšì¥À&»I8Üî>È6 •¥Ô’“¦ýÍpH™²§»5pEQ¤¦†Ãápø›áðƒüã£DE*ÙHgq”0žŒfË#6ºƒºŸŽ¸ã™x¦IÈõîæè͙ԣ,Ê”P£›Û@V±4壛ùïcÅÑ1H`ãwçï³ã‰HØøúæXÇã·øßÍùõÍùÉõñ$ËR1>ù÷Û_nN¯ˆK ‰âšŸ\^œÿôÛ•pyAä«Ó³Ó«Ó‹“Óã?o>ÞtÉ™Dí?ýþ'Ía¬ŽX$³4=‹x–‰Ñò(Nd”ÄRzJyt}ôk'0¨µMÆY$¤V|ÄãHÆPš-É@h’x³O8c}³µy[4m1kp„ GÖg£‰H#¥3i8£)n¦Äx™U  Q˺m¨¢¾%J³‘néEu[¯–@«+bÈ«9ÕܯŽy:®йqÒó`Vyé¶fu›Ï|%ˆ¡ŠucVŽÖÖDº3­>~×3TÂøpDœGY’;¢va Zf¢ÉÔø†jÒqþe>-w黨fåzîyËr˜kV¯«ö˜IW ´‹¼¥Ò£±#î­¨è×YR"ݰàZ niòª¨în×%Mµ–ô°ÿš~Ij0ÈÊs‡S§2V5ô;««æ‹4p`> Ã¨ÓGG™ÚêC&žžu†ºê:È[sW¯Š/^:À öÚ8a·uYÖ0N'ÛÌPNí8¬Žçj¤´ŒRõuþÊ#ÍTß]ÿV#¯ú“Œ²½ñ‚Ú1劾E_ÔÄg¢bpØ8Ó›Pº°‚Ö©†a«$Š3Û™8¯fõ²3Ù•ù´6MÛl[L2%*‰Gaߦt'ò­%‡ö1„·žÚ «õrjqªS 5Ú:¢|½¿¸¦j§ ­ÂÐ1à-&Ÿ-È—¿œ\¾?ÝKaL? 9,`’d4Ùýÿ#*ãC¢R$‘ŠYú*cñi;¨üumV…ÙÊ ƒƒr¯ÒP†Z[PJ-;PbA‰¿Pâ×'7$ûaW0,Xà òÊ¥,íÓ½Ùƃ™á»£L @'É_‘oñ“4‹¤V/‘«(Õ2µÖ¿\·wõWƒ1ìàÛtÞ€q¿Ò0†Z[0ÆŒw`Ä2‚ÑþvCŠ™Ø€«,±°Œ‰PŒTj d4PÒã[JÝ–ŽcaˆlS¶ 8$Snê’:L±£¡^~vù¤_îï}2òP˜ÇãLŒŸ÷ƒÃÍÀw”™*°"ö’$)‹Ë(g»È—.Ϻ6«?ýMðGlº:TtÞ«}ç=õE'R*ÊÃmŽ_ù\‚ŠA –*Lú0¥ý§Û«àæšìÁä¡lð#C2fìRÅ ˜„ ­d,³æÿo]9LÚxaª¼š™¯fÐáÁ¹wh†£èASõ ©<ïhw7'`*=þb‡Ž vëm&CQ4°G Ôî«Ü†ªYû$7w”/1ÛU^5· Á@Ìv?r²Ábز$/!ZÂŒe‚Ê•_¿ÄAË7öê½q¨xâXňc•øøŠ•]GØ%k»ßÀ/`Ï0 šÛc ©%Dð‰~í&?&CÁûïæ³øwýTF*UeD¾ÅsЋbÎ’ýÐ3FZ¸³ÜH8]zÿÎG\5fÏiDØÉ·é½Áþ~Å;ì÷4§\;K6¹v¦(ךƒ¥ÝSeb“h$àI Í£ñÏÞ†‚8ÄåÏàZ6ËÖŒY*ÃÓź;sÃ*ô¤[AÂÌuüó¼Í§yûÉI –>Gm¥;LÂù<+s‡„e¾úH¥?XÂþÿqjZ4ƒ®»BçDïJý-rú±ZøÅ=<¦é¸h‰„G•«¥cF(Ýç+ˆ,ƒKܺÌíîY» ‰tAH±¦§bÑPÕǪ~¬M¤©¡okçÁ@á/ ¾]Xq‚Ž'ñ7/”&x× …Õ6"¾øÏÕÕõé Ñr‡ÞóÎ~àSf*⌿p<Ô¨XÒ9ãu=ûhÜY÷ù›Ë¯^•î•ZîW™zú‡«r¦–q¦»U**Ó>ÖÖÁN!¥ÌчÎGÀö䆇ü÷FΕjÏDèˆ#”‚¹›9¡Ó(N¥„ Si”dľ;aþbN&°K5Ú¼„1ÉùÔF.,ÛSmÆýþ(ÝþËá |îwV—¥™Qfþr %/lxÂâ½—á(Qœ†Â㢰ÛÆÝõ 6 º]䮟®6_·‹zU´OCôqa*w©È 9uœ72¡“fß%¤“)åØéf/Ò½Þ›³8 Ý"‰’Ø7y2CRéb*u»NèÒq(ÖÍ×Ë{k)•º[e—\!áÆDéÊͽ™H îl<}r­(ÿÚ‚>÷×\yìo2qBwqšd‘’™o1«+ä¼[¯º;tH|†íÝ‘&þ*¬Ó(¶¬[S>Ù¹˜R×ƸŠd¢ú~üPäA'ú®äÙ"¯*SR¥uz—È š N¢ Ï@vLàÄ 9k i·*hc–67Ã~ìèP­Þ\¤„¬ ™CEw¬µÝt¦y1ϽõZD´ÁÐNu«»®†ž¶„üÏ/—]ºéúÚ?V°2mkùµ`ÜSggAê¸^ÐbWš‡6Ñß½ ÀQØ¥YʈoÞ•D°„º·%Ý-ÿõV=+ŽI_ `ÓIÿ‘ù©‹UKÿô`;,£§Rijî ÌåÃ0³…Ÿòë×¾øÑüs`h[AîÕ«WÃÃxßõر l2-u–fqXNäåÚñÑ kcà²+ P ß;:òھ゚ûá“9¿Š¡Yì*Ò ˆÆ¢öO¾TïTppîšžy¶)aý³SÈßÇ8pÍÃDNiR`_ä†h9ü•3 ˜cèÒ* UuKTŸ*E+Ò~ Üvší FKÐs¹zoÚk#…vk ¹.СH£ÄGhç{Hz ²¶£ @"u0wsˆ=Å̱ JÜzezmÀ?«žÌ”ÜÆ"j`ô¨Ò¿¶²PóâTI.4´òBBO#:øs²¿ùæfáÆ<<}nÅ:Áp啲aÇ;ªû·š»ºÿ‡Û_þendstream endobj 2076 0 obj << /Type /Page /Contents 2077 0 R /Resources 2075 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R /Annots [ 2082 0 R ] >> endobj 2082 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 269.7901 116.8967 281.1822] /Subtype /Link /A << /S /GoTo /D (statschannels) >> >> endobj 2078 0 obj << /D [2076 0 R /XYZ 56.6929 794.5015 null] >> endobj 678 0 obj << /D [2076 0 R /XYZ 56.6929 769.5949 null] >> endobj 2079 0 obj << /D [2076 0 R /XYZ 56.6929 748.5408 null] >> endobj 2080 0 obj << /D [2076 0 R /XYZ 56.6929 686.2137 null] >> endobj 2081 0 obj << /D [2076 0 R /XYZ 56.6929 674.2585 null] >> endobj 682 0 obj << /D [2076 0 R /XYZ 56.6929 255.5751 null] >> endobj 1683 0 obj << /D [2076 0 R /XYZ 56.6929 232.5802 null] >> endobj 2075 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2086 0 obj << /Length 2914 /Filter /FlateDecode >> stream xÚÍ[Ksã6¾ûWèHU°xÄÞœ±=q*ñÌÈšlj39Ð"=fJ"‘²ãýõÛ@ƒ%S¦e+S*5€FãC£ÌþØ R„ #ÚH¢(Sƒéü„¾A݇æÛŒêF£v«&'ÿºz`ˆ y8˜Ü¶xE„FL’߃÷?ž~šœ‡#®h’áH…4øáòê )?ï?^]\~ø2>jL.?^!y|~q>>¿z>qè/[|ßë‰íä{^O.ß_ÿ˜ütr>i&О$£ÂJÿ×ÉïÐAsýé„a"5x€”0cø`~"• J QSf'×'Ÿ†­Z×µ 4%"¢"®;P㬠5eH(¸p¨}å\ûÙUq••U6-ñ÷Ùj¾ÀÒºÍWª¨Ñp7ÒÀfpÃ0FŒRÜŽC#¡cT»,”l8b”>ã}±Ê«tYz6¼%-pá’ɤã2¹K‡#!xp[̆,˜Yþ )U|3KK[fA¹šÏãeö?߸lg«§õxØñ.®Žjbi ‹åEAqŸ%iiA©à¢Xb“4žÞa+lô€äâ‰U-)ÊõÎÎÍÎB]Å6Œ³ô¶š¥ƒYñf«yŽ5Y‰_ß”ñÍ/½Ïâ* ¤—óÀÄ5Îã¹gì¤a¬ž#PüÜ­öÂŒ¤aÓÒ7G&¥ Çñ5wÅC-R^óL7'ÅݤÊÅ5Ðü¶XÎV@?[)žNÓ²L¬†i`!öÕ?N&Ÿ²Á j¦wqž§3bqPl³eöíΣçZ9ÍpÚŸß²ûÔKâ0´4XÍé2[ŒºÄ÷rjæ°ãšûnšµ¡{g):x¸Ë¬ØJ»P¶u<+ ¤xÈ\e¾Åjcjðû+¥|–b#»»nV•"luÍ|Û¤˜®æi^yEYf7³G¬|Ȫ;ìPÎ,.]j7/’Ì8õ‹"”€ý´ÄÂMZÙ9º2*@œÄ7Ù,«íNðCf‚Ó$Élçx†-ó¢r{Šóø ˆòÄok;%HÉüð8;[Bå·Ãpüç.õ ⮵šgIâPãºÙ4¶œþ Ø–X†ù<¤©«-þ¥o_=펥EvkV!µVìT·\""å¢ÈgxŒjá~àÖ³%§>v º»³.³ˆÐ®Uâ²[üÆ‹Å,›Z+B;»a …3ëÝŸ3³¡½Bi¬YO—÷NFõ¼ùm»1CÁ­”+™ðE^L "C¾éÄ^Õ©–¡…ÕÎñ±V¾X÷Ød5Âù€;„ )×A…iáiA² CqõÚÛÖPî–Ñ/YM\òà ŠÛR[@*»BR„ƒöÐo›‹†À´–˜gƒŒ',ë;à†À„XwôÐÀ£$‰B9|Æé_«´¬î%8-d0þÜáÉA‡ *Àƒº>—Ÿ°¹ôVÆq(O™¦°°&bÁ˜GZEÞVØvha,·K,ç¸ÛVX>⺵G$»«ÄÛÝ^,y¸ÅbŠHQñó‹%¨ÅAm,V¸ßb…ßi±ø+«Ä¡«Öžƒ †NEaÏbQM¨ô8Àb'yIû—hÜ,Š͇P:?»º¶uqz ÑzÅv"Ú’öP¶êЦÂWÀ@Èç•RS£ôCœXL~2ˆaÁ%¾ÙU^®‹bYa(‹Pc \m‰qä‹ánOåháÖŒŒxÜLIÈÆ5L®/?¼e×{[2ÇÃj¢Œèq±RC §®á Þ` ÷«Ì@[Ö£ÕK¥H(´éÁS¹T-Cð&ÍÌòûx–%ë#‘µª˧ ¯/³oy\­ÿgoÍêh‘Ρ=tzy© h,ÂûOöTMGÁx¨T`ö®‚ë³ì¥È-QÖ0F4dý=p E“!œ®ª»ÏËÇqú'ä!‘TÁøË :Û«Xf6¼Oלoù¬¸±ût­¹6,ËÒ ØÿL§Õ³°·¦t´ZÌ Ñš÷…0 UÇÓt©Ð_FkD_fKÒ£E؈é¾(˜H*0Jøívé° Ädã/¿]ŒûÁüo‘{«eœ—·õéÆ.ûÐ mKìc…V@$…=È cˆ”¸[”¾,’¸JQQC.\ ôƒ{ö˜Çólê]ÇãmèzÉ:Œ¸ö„"ÒDQ‡ö,О)‚Áõi^¾Ä `'`™æÕ3Àµ„:Zà´­f=Q€ÐŠ(˜NƒÁÄ¥`ËU>mÕ U·(¨{´ôoD[Ò-¢«ªDCAT$Xƒ¨Í@éÞ øìaA–(çQ{wHE µˆÏc© y´VÎæ;\ç=¶„;ZEß^·# u Á—æ«;|š°ö Ù’òPHBÞqº¥¨{t#É£!Õ·­¹&šitàf^¯Üi?–Ÿë€B€Ú.®fÎRJê/n¡&ÆO‰loW3OΡæbØžÝNðìzÎÓÛ“ÛR¼„ë[Ñ\Š*îe€T7/±.ÆÏÕÇóñøã´ ¸çà•Úw^`ÎÒØÝ•+¸ мôPƒñ˜ q⯷ïî<±*üo²·–ƒSØšLqn¹sFMË lÖ÷‚ /âíwQ_Þ«r㬰Ül×z±²[åÛêô6ýüçRZHý Y¥=Ö—kC"ÔoÓÓ…RŸŸ¦PµÆã¿B}šî¶µ}'¾-ÙÕ8óPBVªzŒ3µ}DÕ_±‡xÄ¡Ap}ïæáµÀ·&u¬÷¤\RH³dO¶À•"& [>N!Q]Ƴ}Œ¹”[P[Š3æMgê(v\Q[A)ŸXÁ.‹^ø¤ºÛ&BîAXŠ".wOœ1ØïÐ7ü¦°µ‡ºÿ6eÝ˺Ö=vh •DiÓg 'T‡¢Ùª/—eZí³7¹ÞÞ›@Éü㘵ï]7k"0 yçkß²ø2ýǤKWP±˜yªXŽhUÉ};U  Ç=ŽÒç;§ K,µbÛªd9[±ßMU²ûØHøÄkÄ@#k½F¼Z×Zëø6ÅøçÜ3ÒÙã8£[¸>[»ñë…=–?½ü ˆ(x‡‹8›Ì9ØA€= bŸÑ^þ¼èö$ŽÕÿ²ˆ’°ï̈EÌ¡j¼ÀÅÇñ/° -¡xϗ˃Áëy?ƒêZâcõ­L…2ž%¦9”ªÆRþvöñ—ÓË«¡í°Âï}Ü,Ûn–y7 55o‚?½Ke¢#±`ÎòíH–:ì Ę·6f0)æq–w.#"yÄ¿›Km/±ºTÆ)ä ¢ÏÌtÂP¶ÂÜ=Œ{ûjmÇÉç=UÅg¹NâU‰ú"êwÚ"(ýƒKG,ð»H—ö-t[×jA:ÔÅ©ž0ö2Z&Ž™¤È Èöožx>6÷D éV ¨ë„Þ¶{ªµÈyÇ#õ>­]¶ç±­¶Š0Jå÷SÛ–JÊ;+{릢=XÖ=ºÕ6d„1Ý2Ɖâ²qg+÷ØÞÄ.T0Â>ZËCӜ̈́ÍkxÓhª-ÇU•ÎèSl›¿k]õ}nV’¬ì|F?-|†‡O¡{Þo¿îm¶{;mÙc£! ñ†ž¶ä„³…Ò½`¶¥ËOžQ’xÕíþ§ û"Ë=æ–Í¡7Á噣áÿFøêêq‘bml7’­Îâ²ô´YýüýënR|ò-j…-ºgîþ¹Á>`7Í”îÚqñußî=f+ Cí2iÖ¿c“ÁvÔMËf“YÞ°y0¶¯à¤›ÒtëµÔúmÛDÂÌ…ÀF$a$E×<ÑAïYÕKÿ¿jýgRµ_¸md"øƒõ´—x¡¾1¦žâÿ«n×’þÿ›ãvendstream endobj 2085 0 obj << /Type /Page /Contents 2086 0 R /Resources 2084 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R >> endobj 2087 0 obj << /D [2085 0 R /XYZ 85.0394 794.5015 null] >> endobj 686 0 obj << /D [2085 0 R /XYZ 85.0394 741.8766 null] >> endobj 2088 0 obj << /D [2085 0 R /XYZ 85.0394 717.2979 null] >> endobj 690 0 obj << /D [2085 0 R /XYZ 85.0394 609.8545 null] >> endobj 2089 0 obj << /D [2085 0 R /XYZ 85.0394 587.5432 null] >> endobj 2090 0 obj << /D [2085 0 R /XYZ 85.0394 587.5432 null] >> endobj 2091 0 obj << /D [2085 0 R /XYZ 85.0394 575.5881 null] >> endobj 2084 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2094 0 obj << /Length 2508 /Filter /FlateDecode >> stream xÚÍ›Ysã6€ßý+ôHW…XÜǾy|dªµgd¥*5Ih‰3‘H™¤ìñþúm$”lO…5Uâh|ht `øGB"i¨(ÑÀD Ƴ<øï~>!u™°)ú¥>NþuÅÔÀ #©Œ¼¶4ÂZ“Áhò{ G§Ð>]ß\˜Ó ÜNÎìŸÑõÝèúüî44FÓàü?gŸG—CWJz]N]ýüöæêúç_‡u·7.{xyu9¼¼9¿<ýsôËÉ娀?H‚™•þéä÷?ñ`cýå#f´¼ÀFÄ:˜pÁàŒ59Ó“»“/mƒÞÛªê6hœk`dBB)"œîîÖu¡Û:i’œ°µ^CIb Z”Š"&Ìr(ñæAj¥Q% ’Œ²j¾ä¯y6ŸÇKjP¯Ñd5º±e‡ñx‘És|2…ƒ§Eœ'qá²Ü&Hðò˜Œ]^ùX—,âü9Î]z’ãÌ>@§U(µC/!!ÈA«îâï㸨»c4H³ûªF‚ìÁåÅß“¢LÒoîɵ¹” .e„÷NFHXÁ¶tXD3¨&¨ RHýI#‚òu^gFéÄ%ÆÓ¨(Öò^ê¹§bq_ÄÐwZN_W{rÚ?© WØA™ £ÇĶ „šß ŸM4#·i;rûëµ`3–#Ý2®É"¶+efÝø« 'sTd©{ŸO£$µmÚ×/Iù¸¬áôÃ×("bVÓñ4áܱ­H¯[Ô*lë­ˆiYnöA ҔȺ‹Yô=<´‚9‚åMëªÙ¼L²Ør£‚?°ÀEÛípØÜI\ŒódVaZ$RëÕ©³¨Ýg‹rݦ0,¡ÂÀjSÈ`RY÷2ÿ6p‰¡gÚò¡_asñn¶»—øŠHšA3Œ¯ˆ´a—ÚR[ñ©n¶fA”DÁkE¶€ÆYgé¤Î¬t°†¾9ÛtÆ9[Óà&ŠD™ f‹´´KÅÚ}»TìïÜ ñœd‹Âå€ù)œ.øå<‚6\è’2Š |û>« ƒDX21›ç„Õ%šîw–¡1Ø4Žà*J¦‹<îv·0yÖ”J8ƒ¤ ªênÂÁªI!k]°å6tÁÖ°º`_n×J0R’7Öåa§ta[rEiZe\M2Ó¿ª öÍRì{WŽÕÊ`s@B-tp“•ñ¿aXÊÊ›ÛÌzÛ£ujÕÈUÓcöœLw7;}uo[¿yÿ~‰ª²÷jœÍæQ™Ü'Óp›UOJÛᵕ¶)çp!±:JF–£´{'La0ù,šNë"÷3ËfŸþÀ˜¦ñÖ®¿å“Pªtដ…õþ6Û<¡HHÒ(ÒÙ¢|ÅÆm™VئP¬U]t»w °•¡J,7(;[ ‰!° ”\3çQi½^²Å´ò{ÀcZd.ó ¹¼$-ë¼Ò8!|s•xö?é?Ù,Ù `cÓa×nZµ©¥áV*›L³Ò%îc÷[í‚àwV1$§$¨êV+­¬3SWlžGã­ÓY&ãx·ÅómÉGY¼¦÷Ûljì´xÄ•l¿Á`ÜÈjÔ¿=äÃøé"KãCv¾`çŠÒí‹pð?[©J•y”NûáÑ.Ùi\Ú]ÝNœKAß7ôJSP¤±Ò8áÅ ç¢_瓨ŒÔÕËG WÚAsÚZ®1‚QlLá^”ž”=fÉ1Òp(è`É9âÌЖÅü0­“-â#izr~,Mò‘4©FÚ¨Ž#®`q͉‡HÚýM7Í‹W8ý%cÇná¡õ8ÖÐÞ^¢ž¬=ÖO"‘á´ËtRŒ`<Æ#z˜éÜ‚ócéÉÖc‚ö ©é ˆ5Š)_'ߪŠè£ýÆÇ ´Í:Î*൑$Zzô>E“ÏyœÇOïAèìå_ñ¸uîu´×Ñ’öüظ©¤HZ‹°<ñìžox=žMV²ÃáƒIEÒžý«=Ñç¯Ãø%Oʸ8då\RM4›&ã×õ½”éZ܃ӓ´Ç<¥AĆ­öóT)¬ÓZ“zx(vÅůDmÆ}M7o½×4™%å>®NbÕs®B!"e‡ûç#%i¹ÞM“7q-óS,ÒqT¾¬'òG]Þ/t^X@.éê}Å›*5b€V#ÅrHÕ^å‡7ŠTi؉1ÒS…°0;öÍ] ki8¡í%Aô4$ãàkk)þÁi¹-!†µþ1(†ÁîÒ¶…ààL„ÛÕÞdeòðz»(ŸùCa`9 ÞD£®?C¡JÕR¨eCeÉ(â´D»éybõ™ƒ½*㤃§à2°Z£'¡'ßDÏëcé‘¥G%ìôM<ÍI!=x×é»4¯¾þŒ“ç-g‚%Ã¥p}V@;MÊtC¢%˜¯2|þÈГ®Ï1…íº–±D´ ;ˆÛ#èk S8¿WWï»9ºcÕŽž€=^ÏÔÀv’0±Ÿ#> ãÚ­ÞžëH ŠK´ß,tD_²+¢Ý*¡;œ1ÕÔ^ýà1kùM=Éú ¶lölô¡óÇg¿] ‡ñÓQ*hëlÄä÷-`_®>/`ØæiÞáL¨€“ ãr…Þ1úw<½¥X}Ö=ØåiC»èq8¬)ã\ñõtïúhzž\}Æû<ÃT‡¦Œ##ZÁwŒòÏ“«ÏK¶xFÓ.ßKíg†4»w‹±ýv°“ß׋Ü]W’…m1žì%ê‰Úg…Ä aªºœ1ÁHf¢;®*ÞŠsÇÍÅ’¥'äG±<DÄeG…Í(Lœ’ÈPLö‡Ígàˆý¨«£føȦÏÍL(k®„rD%þ‡BøG„í'H ¶=HÖ„í:І˜Í ™ý2L×4ë|–{_ð¬û}÷7Èzƒ˜À÷™3p Òí6¿ØÏ­+BÊàîêeò¥;ؾtþÝ;ö%BO¸þ"ÔÚ~cö4Ј&Â((X‰ÖóoÀæq¨¼ŸÆà"$_¹·± űTÁpxŒþmùjfo$¨…é Ú_š’Ûa:î"á«úÞ¥¥)£)ßIÓô½4í¨`;m-îvÝÉâA'êCÿãÏò¿BqGpÿÃkŸUAe9`°ÉbîËyBäØ{QN±.æÉþ®¿òendstream endobj 2093 0 obj << /Type /Page /Contents 2094 0 R /Resources 2092 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R /Annots [ 2096 0 R ] >> endobj 2096 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [305.1296 684.0956 384.9596 696.1552] /Subtype /Link /A << /S /GoTo /D (clients-per-query) >> >> endobj 2095 0 obj << /D [2093 0 R /XYZ 56.6929 794.5015 null] >> endobj 694 0 obj << /D [2093 0 R /XYZ 56.6929 411.8739 null] >> endobj 2097 0 obj << /D [2093 0 R /XYZ 56.6929 386.7533 null] >> endobj 2098 0 obj << /D [2093 0 R /XYZ 56.6929 386.7533 null] >> endobj 2099 0 obj << /D [2093 0 R /XYZ 56.6929 374.7982 null] >> endobj 698 0 obj << /D [2093 0 R /XYZ 56.6929 161.7348 null] >> endobj 2100 0 obj << /D [2093 0 R /XYZ 56.6929 136.6141 null] >> endobj 2101 0 obj << /D [2093 0 R /XYZ 56.6929 136.6141 null] >> endobj 2102 0 obj << /D [2093 0 R /XYZ 56.6929 124.659 null] >> endobj 2092 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2106 0 obj << /Length 3540 /Filter /FlateDecode >> stream xÚÍ\ëoã6ÿž¿ÂßNÁ¹|?p‡¶yôR´I7q‹;´ý ØJ#¬-y-{ÓýïoF¤,Ú‘-§qAZ¢ÈáÌo†ó ™e ÿ±U„ 'ÆI¢(Sƒñì„~‡oßž°ÐgØtƽ¾¼»fàˆÓ\F-K¨µl0šü’œýçý£‹ÛÓ!W4Ñät¨4M¾¹º>÷-ÎÿœÝ\_^}ûÓíûS#“ÑÕ͵o¾½¸¼¸½¸>»8:g9Œ—…0ön„ƒÂÈ»ÑÕÙÝéo£ïN.Fkb!Èý§“_~£ƒ ÈúÝ %ÂY5x‚J˜s|0;‘J%…hZ¦'w'Ö£¯õÐ.Ф´€7ƒ¡°D*ewOë§ 0mxdŒ8¥¶g: ¸‚”&T*³Ög‘€¤4åˆ\ÔZ¸þïùÍï¯V!¤JnáA‚¡<ʬ–(º5a^œ2›dã,ÿœMÈ6ÂJ¤Pƒ˜·× +¥ TÉaÓáhøII¨£ª?iˆ6Æ[ñX0Ø×Ï—§J%ﯾ?Jeer{™æÓ~ q4ŒƒÑh¨8ú€F̾Y@'L(ѨPÄpæjH.on¸¸· k{¼¼X,úq\z|ž5ù¦áãÐÍRÞÄhmk$n–Ù0+h‰Œ§<Àz˜‡/[Ô–‹êEpF¬¾Y8©%œ÷­n aÓ5,ç×wô°¥Œ]¥ŠRøóÈ}Ze‹/þñh¬<’Õ[…!øzc^bšÝj^Rº“ÔΫ´¬‘ù!¯férüé”InÏWóÛ~<ÛQܰ`„Õ¼,ª íÒlÛåPžŒ3ÿ táÇ]ÿã9¿U8=Ì,Ì{òªô # Á’t2 ƒ*¤!T’“w§,Á¥…–¡çíºm›Ú¼\,ýӤ̶æçõüE‰´N±áñé1 Oiå²?æÙxéEV6A“ób÷0 ÒXUáé¾þf%ü{¹èš¼¦îh2É~¥”Ù_YrÿÅ7£¨^c±¶ƒ%oYPX=ùsµrF ƒdÃw*ç˼,ˆ_#Ð=敟k–†ÉjŽá7-ü‡¼˜äãtX³=d”G©ÜÔõ ­|ð¿©ÿ§ãxœ—yUyñ{è°\f³ùr÷bŒ-ýuKç¯óhZÀ‚s²g1JìL½G2 ‹U1NÁˆú—áèÔáR³I3"Š ír<8LD ¿Õ(¡9”2ÂÚP¹%Œ+ïá¾Og`d†b¸­Ÿ{aõ#·I6Í~OÑ€_dÄåq‘dÇC’q¢¬è)G4Ó„êË‘Ûl‰!³†òŇ~(?´QÖC·\äQγÅC¹˜í2bòÍš$8=0¸žÌESI8 ±Fåý}·Oî@p YŠcšu>Y+]–MJS.×ZKŸ)N÷ q~,t¡Z°Z½„d3¢]ÈS î©Q”ã„+çZpïÊñÇÃRÃË(ùì(†4ÿ[γ‘h›.RÌÆ³%dŠerSd¾y\Îfeêé¥Òºâù&)̉¤Za.ÁßHAý·¼ò_RÿuðíKñÚ˨s‘=ùwϪoDséȬã †3Ígù2BvøÅÌcºöŠÕx‘Ï—P…ì6®Hq¯3„¿nåÂb©é &Ji˜@ÊÖ¸F¸-ϲrµ|‘\ú1û@‹8z«þNAÆbȺ5)‰Îü·ÓUv™AâüYb- drw÷¥: |\ýˆ#»ºf@3mÿP¼!ÝÆ?æÅçòã¾€3ÿV#³‚ìÅ:ÓP”àDZɶÖ/Xàˆù7kÁÔ8Éû‚ §¤qÛ|XX9ÔrÛˆ½¨F¿YT!ÃqÖ°T©%Ê@F·e¶£ªˆªçøMo‹I”EÏŽŽ„ͬ/"®‹ÈtúÞ×Ðý ž_ßÝ]œyÈ>§Ó|…ÿPˆïC1âðÍ‚h¡F÷zð¦Dk!7P¼ùø:!ÅgÙd/€wÇB âöž™=#ٌؠ2„iÝ“¤áÄPË7¼Î~ ˆFº MHB±½¨‹ñÏ™oÍ ,£n€õ°+ÅíU@$ÜëÐú MX*¨YOÌÂÓKãŒÛPÀa®uŸ÷9Ò˜¹£ùjˆr/RÊzH7„Bð’²Ï M¬ä>@}X|©ÏG£¢8 ”ô‘JÅb\o—Šd™Þ×Uj…/}Y¾*&¡TRá ʃÊ?âÆñí©001nñUáØ©æU6†ˆ…›·‚ÊäÒÓ609G4•f+0¥ÑÔ´?ÁÄ_ ò9+ò­ á)ü6g´]®N‚BµÑ»}žR˜SYv¯÷u ÅaL²Ã×I ã$kgFi§¯S­¸wŒBßá)À ¦äú±ašVËp4¬æflج¨O”„IõX®¦|–ž´ùE>©tÎB‡´êÄ–^wºð…är¶f ;1GÀ7PÆ$»ð…¼œa;sKþÞµ%±ëŒ‚‰d\aŽ{É,K‹à`™8+t—ƒ…ø¶v°\™pðn[‹ÁÁbû¦ƒÅk‹Ÿ!/K§¾ÝXÏ?g‹]le¤ÏuÁÅ„I® Ê^ÖÖ‡1ɧB1\Ëvæ]q$˜x]lºîRÄ‰ŠŒW–-¡Úûª½`a $ù›ý©AkE1 °A€±¸7ñµÙg×g…ê‰coRQ³ã˜ ¹ÛËÁ†Á¹«a¼'̈<Å{$4¹ gWX€^½» ·†ñlªZæã°Ûw…Ô2[TÚ„ŠœšWðÝú(,Ç*"‡ïã†\ý–¶çm—oðuž-‰ˆîòË<«ï#QÞ¬Ù˜NG~6 î´‰½?ÿ(»né8,zXÝ ã;ÜaÆàÖ•U+ +œjÉê—ջȂ3‚Q»érFgÝl×%‘‰èCÇýlCN¤š(õK¨êƒ¨þTätQKÑ6†û 9Äšór–æ…'^—àÝY”¯b›ÀxyþTßë(äÊkŸ‚3…ãd?žæÖçûø¼ZVù$ó/må, ÓcÔnßk‹Jfåd5­óÌr¸®«o®tTòPN§åS¸m¥Ã&EÍ+Û¨¼…Zg†ÿêºe¾Á6¸þ÷ãE¨£¤–MXþwwò À6ó<‹ú•ç:õÜÆ¢â‚ B^×7ôà{:úíb®G· ú|Nói#5ø ¨t „Çôõ&¸§H£©ÃZÿg¸•ûÇ8›G·„¢¹(^lnläa?mù¸u’žÇÇìÙôùVƒ°"Ø !™;(Ü ¤F¼,tj¡G<ï\ 5dV£´[¸”Ô#„á! ÷ev_N1ßt<9pÜNú Ô Ñ-žãu|#B‚‚Ù‡mvùúã ͉R-›+r„±„:e÷/LógæÎå}3Ϻö x4Ç]óG­7c‘7 !Uõ°šN×[ƒ’пީ]_?4$üÅ[xHçói>ìºN3{¬ÑM¨î+± Õœâ£!•k$ò>f§Uµêzl•8ªQ HdtÙo‡U)HÀ¬R_ÛªvœPlZÖæE-A]Ø6¢í(llogÁÁº°ÓÚº°S(ÔÖ…_ߪuEz;–yíd*2/®‰¶ÑÈæ© 7Á%ó:›b‘{¸×»“8d²G)‘´Ç $ELe2eÑIðÀ¿¦J¾É‹ÉŸXññÜçáÔ©Íʪ= ‹8®ÂŽ»Š(‡ÚÀò>…A‰-´üª¡ÿ¬,ŠWªl $²ñòZ‹àxÃZƒ”ÔFWɺuæ$‘Ô鯭²^u¥¬+—¬Âb0¯›’¥#mÛ¥°‰c©ëh—É[uA†ã”é‹T–CwùUó ÷c¬!ÿÄ"SBÖ‹L ‘¤5‘zas^ŒËÙúm¼V¶_ÖWËí{a_ǧæLÖÉÓ)K|vïM»ÏΙðùS“*Á‡:U‚öîT‰)MœÓ²ÝŸêÞ’áZ4ðtoº@ìª-úr.¼ÂO¸’[~]Ãï6èÈV^y…f7\£rDqÙùOÐA¯w:ô:hÿéiˆ°QHÙ@EPI„Àã50UáÿƇ1ó|oÛe¹iºE¼ÿºl"Iendstream endobj 2105 0 obj << /Type /Page /Contents 2106 0 R /Resources 2104 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R >> endobj 2107 0 obj << /D [2105 0 R /XYZ 85.0394 794.5015 null] >> endobj 702 0 obj << /D [2105 0 R /XYZ 85.0394 292.3223 null] >> endobj 2108 0 obj << /D [2105 0 R /XYZ 85.0394 267.2016 null] >> endobj 2109 0 obj << /D [2105 0 R /XYZ 85.0394 210.7732 null] >> endobj 2110 0 obj << /D [2105 0 R /XYZ 85.0394 198.818 null] >> endobj 2104 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F11 1459 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2113 0 obj << /Length 1514 /Filter /FlateDecode >> stream xÚ½XmoÛ6þî_¡20³|†iê´.Ð4M\`C׊Ì4Âɵäý÷;Š”,Ù²½¬E "©‡wÇ»çŽ'“É„DÒP)ÑÀDDéÓG_àÝë ˜IštQ/ç£WLEIe4èÈÒkM¢ùâS,Gc€ã—³ëWf<¡Çwó±âñ…û7ŸÝÍg—wã‰1šÆ—o.næÓ[’~%l¿|}5{ýñ6xí—o§WÓÛéõåtüyþv4·è’`æ¬ÿ:úôG 8ëÛFÌhma‚1†FO#.œ±fe9º}hvÞÖ[‡œÆ1A„ M$ELJz\­WAm2´bOë„`ƒüƒ@0Ь !@"×*R É(«ñ»óÊ‹+Ú*¤×€ù_7Sé £ Kr@œ“r‘¦vUí²ƒ!å‚àa³<-ž²üËx"™ŠÓ"ÏmZeE^º—S–co–Ëï~1©EÛЂpEãùcV:E rB2BÐZvZlòʮǮL ú™•$«Õ2K“û¥õóªÏG;p6"RX7f|u3p4*‘ÁRL’/Q¡Ð:`®^m“*}5¡# ä꟩ú¾²%Ú'6 qb Ò>üÇ׈Aö‚! ™“Ùr ²Ùqœ¶X#JÅÖ‚%¥þ•¬½³ùbº^Ÿ¥­Ãk`S,Îr÷äqY¤ÿØÊ¯• ËŠ•]'5«²RcÏØúUËQ·;-¼X;¢s¹*òEéKõð$ÎJëHÔG>¥ÀÑœ·Uï„CB-Òðµ.ÁB¡¾àÖ‰ú?wÿ1.íèÙð÷'VU© R s†ŸÒ¤…ä¿’Ÿ·6ýö\~RìùI1mùéÖ<ÕR›}³þe¦Ôð@S¿?]n6ÌìNz§þ¦Tà?²#Ø¿)rÿLü#T}Ю¶z±0†²ý1µ‹¡Ô¸ÿîœäþ9»|wãG­©~ú—IòÅ'h7ô?«€îšƒs݆ۣ°Úë6þß®Æ" bPK¡+„U¿K9èV¨Ò@nF! 8GZwŠt•M+%! ʸéñp-c ÝYñ´‚¨ßgˬ ñÙfU¸ëd·a$`™cÏAéeŠF€M  ¯_åÐJÀF ]Š#É·ñ]QºúL!*°®¬²Ô•bJšZXú·Õcp[ë3Å£’oI¶ô]ƒ{ ‰5`*vE³mŽM±¤tw'.é©Z–E0u³Zë:CŽ*%ÜÏ}†R””Å6o5/ÔÍPä®'Ý®îç]r_ÔÅÃÝHÎ'®p0‚ã7­Ëê¬ìN ‘m¸Ä`÷¦ W( )º C-¶ƒ-ŠV@ؾZÙ$lÊònË=ƒö¿€¯„ÈH½2føC'€&]Ôñ$hQu‰¾Ú.n»sÿ÷uhÕiÍ2 ·D ‰Ô@èžâ¹?;ã²Ke˜íHÅ…wŸ[ír ¦÷6M6å`ëk(n|ŽXê d. LZEœ,ŠU0Àq«y™¹+Á›„™®œ ̹Òеo&ÔÐ#»+»ËÊm²^¸OŠ#%ÀYSC’rè´àZ#ɳú@Ðlqœm˜A_½ìi¶uP'ØÖ j¶]üyuÀ3î"ÌœÖÚ€´vj2ÛÓƒ]¶†,l»þhËê"¹—á~n¿úÜìÃÆ®³¦(”þûï¨'¹bˆr}&o»¨ãžlQµ'göu*w`rZgÐÙõ£v†”íéü¹~¼µ_7¶¬þ«#9sý?î@'Ü@µ߯ªr_¥ªOªl0‡*{lÄÀFNz*Ï8±½/:ÏMO<蘄&ê95À4—”ÝW›ö®¿Î7 -*Ħ5±kz×eزZ&éaóÚÄQ÷[Ô€wqÔÔÇþÉk÷# û2„q8PT¹ºã`”ó!úŒQ&é€íÿVоendstream endobj 2112 0 obj << /Type /Page /Contents 2113 0 R /Resources 2111 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R >> endobj 2114 0 obj << /D [2112 0 R /XYZ 56.6929 794.5015 null] >> endobj 706 0 obj << /D [2112 0 R /XYZ 56.6929 629.6971 null] >> endobj 2118 0 obj << /D [2112 0 R /XYZ 56.6929 602.1058 null] >> endobj 2111 0 obj << /Font << /F37 1042 0 R /F11 1459 0 R /F21 954 0 R /F22 977 0 R /F67 2117 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2121 0 obj << /Length 1242 /Filter /FlateDecode >> stream xÚ•WÝoÛ6Ï_aäÉ*Z¤¨¯å©M×-C1 kö´î‘iKˆ,j•Ôú¿Ç#e)V³†ÁÓéø»ï#EW¡ùÑU“0Êù*Í9‰C¯ŠÃE¸Ú›w?]P'ÃãˆÄ<ŠÌÃÂÛ Ž2g,]Sww›Œ®XH’„Å«»Ý¨+IÂ(g«»íŸë›R´ZvW‹Ãuzõ×Ý/¸“4K)l £\Øðîö×÷(ãòICWé#>ݨ¦¯¶²º2ÔˆG9‰xÂ^’žÑÄ⥄^4 ÃõÛ¢}?ÂèNÕøð±êµ‡b«œä KRĈqÇùíQ”àö+š­aÈxý9ŒÃ·7{³R|)¬¨tÛ->z¬ƒÐE‰d}BÑ¥ÐÈ<ª‰B4HôÒ½ZÍMU<4âàTíTçˆAS†^‚»à ¥$cÌUÕŒñ<Á„eFDD]«§ QºÚ"›Àó4uÂoà8Éâdö÷ »E¬Ø¤”½*PÍZ–ÅùÀˆ×AéõÕ2 %ÔØkìñ–m̱˜ÿOÈûZ¥ªå7‚Œ¾.¶"™š^œU†îDÓïLŸ«ŠbÂirRe;Jê‚ žÀ ˆ#n¥þè«fo$Ó”¦S²V8ÚÖ<ZáZŠG‰Ôç0d( ]&Žt}jEà©G|®ŸJ·ÛvŽÕáGêprØ1@õ²ƒÝ)·Ž$Ñú©Ò¥´ƒ©mfؾÐ=ÐŒà»Ã5”±¬Ýãµtóp‘*‡½DÊu?j‡ëío¸N††ì‰×Ž!űy #!ŽÖU«ÀTEù$U,'lÌÔ^©­Û²•b©†(Éò”:qHÃè°$Î)Js7~b> ³ñÖøÙihâ.NÀ9E\ ÍÍ4=TÚ–žoŽÎ7[úþˆEgz“&œúüPëI#œÐVtºòÉÀò€\ÈÚ%±Åp?ÊF#£o•²¥ç²i}b+›JÔó´MU!}Þãð½ú„Çݪµé\§[ìEÕôúyéLC²íŸ¥ç \y,ç†ü"m-ç6•ê ÛR£‹ª•]íÎVѶž„ìþ€EÁéù‘fx&n6&a!œÑ hXÁX Ðc[$/ïÕ~è©ûKdàYÔSU×HÝתxXj3¯ò÷74§>ô­€p£f§¦WÇê¤ çv"ûÆé++8{¬ú—´êpP DÇzÙ{°ªñ JílÅZ0ÃdŽˆe( ï¡>þc…yjw˜Î‰ým²ks“aF–æÌ0ÌÃø5ngfn£Tt½ä‚Àš2Ó$–E™çåÀË™\»anzñmTÂ"’Ó¿² 3í} MÑâ+Ûz̦.«Þ—†.=O.Ö+ï¤p†éiko8ÜËîy:Ø<Þ Ÿ »|!öw óÈ Žñm1ÚªÅëé$³þõÌfBú{z_šZéMÿŽItñFó €:]C¦ˆcq¿h“‡ ž‡-ÖXd¹_UãT]º9GLs^¾jw…9¶nßAôæ_ôqWy?.›)ü !=χhŽs·_òïâÇ»ñ[ËAÁ¥É|-}y‘à$ƒŸb³;Yh>‡¢œz ;hþ\Ýøew®ï_Ñ]ŸCendstream endobj 2120 0 obj << /Type /Page /Contents 2121 0 R /Resources 2119 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2083 0 R >> endobj 2122 0 obj << /D [2120 0 R /XYZ 85.0394 794.5015 null] >> endobj 710 0 obj << /D [2120 0 R /XYZ 85.0394 769.5949 null] >> endobj 2123 0 obj << /D [2120 0 R /XYZ 85.0394 571.259 null] >> endobj 714 0 obj << /D [2120 0 R /XYZ 85.0394 571.259 null] >> endobj 2124 0 obj << /D [2120 0 R /XYZ 85.0394 538.9404 null] >> endobj 2119 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2127 0 obj << /Length 3285 /Filter /FlateDecode >> stream xÚ¥ZKsÛF¾ëWð¶`•axíM‰åD9Ø^›ªÝT’@$Ö @ æ×o÷tÏ •«R)‡ƒF£g¦§_÷H,øO,ÂÈR™.âTûa ÂE¾¿ [x÷Ó•`ž•eZ¹~X_ݼWñ"õÓHF‹õãHVâI"ëâ7/ö¥¿ücýËÍû(ñÊÀ¥ñÈóãÏŸ?~\×D¢N|-Él·ÞÍIŠ|©„fž/wë‡ûw3¢„€Ei¹)o?­ï>/W2 `KØcàýp3JJ?_î~|ø|¿þ•ž~üøáËý»»Ï·ËX{ë{xÂy®îÖNScmŠ@¡š¾]ýöG°(@©¿\¾J“pq‚‡Ài*û+*?ÔJYJ}õåê_Nàè­ùtötDˆäÌñH9wÛÚqÛð¨zdç¡Ì«ž~óÖîs_õì Æu!ЊÖvÛ´0~¨ïØ—G\‰Þc™ G ôÒ8¼ u½H83„ sšøŒ 9Ø«€b–¤í¦€mªÚ(ÙP[úu9ž¦Èʽœ±˜ŒŸÍ¡«žªºÜ’e<L°!Ö :ÌŒùJˆH*­ù‰%TcóÕ¾Ö¡õ'#ñ¥ B^ÔÎ Ð×|Œ˜÷ïe*=>±þ¸Ý–=Ÿ.mµ!ßÇcìm,¤ßÉΈâörÚ•–«w惇ŒC?MD2 s>$|K›×Ggïs°9J%ÑÔx~.­(‘z”ÛR³ü-ÿÌö‡š_‚-îMœÇ‡ºj˜Œ'o(mÆïØ·@lÅr²¹})H«©Vß±¯4Líù²^ÏÔÊd`åÝ[Ùïø$i¿Ç¾»©Û<«oúMÕðÖ!èæÄ1a ß:.ÒSƆ%ÚáRÁ™mãZ>‚w˜95Χÿð£îÁ0´„b¬¯À k™bèsÅ~"…xÓ^À ”˵/’6JGMãt§¶ûJ²‡²C „ïªÆ®„²n¨òcñJ‹ŠaØÐvgbÁøä6Àžs=°Iâ ˆ9k=ÊÂPOSÏk6 h*Iât°ÐŽcéñ™ŒF9 GM‰¶€#cÛ˜.ËGN¨§Á 3_í2UM^‹’s iã<ì8«&£¬Š3öÓ)ÉLr×Þ{ zÍÎí^&nƒÂþ15MþUf-`|&3é©*OšçT ¸(NRñ=¡ ’~Æ6lV<a¦ ð,>$²›2 ~ ÈÜ`Ø™ïW\¾ç#Atæã–~³â¿Ç~x6ßSVËÞÍF$¨…Sõöê-èøZŽF/'†mÊÈj¬—-÷¥B ŒjœŒ81(ÎZ@ò¥ªbEŠ˜sGðú$zâ²uUÛÝHNá6W/]* |È„Ñ÷¸TjÊ!¢/šo^~ ¥„”—xv„p&7ÃAE¡ÇÁJ »¥|—5ÛÒÒM5t¦Ûcê%ÓYâ¾-*dʳÁUixš½m"€A…±ÒÏE÷Ë‹U;PÕžæNGI?•‘z±®ÊlXw>éNÿ‚e­ À~n슶T¬W·8`Ü6V¼I°,¶}QwSà@ZfóÉ¥+éø»j 2h®ù¨ òKåwvh"ˆ6Û}#†¦Qôº,ú.Y<´_LE]zÈRC²… wܤ¹%`ƒÁ+.L.ùat‚aaÁ´ üP¹êð#€0á­áÿÒ»{®Ä2†‚>ÍVßÂtš*âÍF/ 0„›û½\¼ka;‹ÑެÜÕH°ÙPŒ8 Ãì $GD´£v0øH[$ #ìž…Í:š iõE˜LàD`¯gXzO¿`©"tq)¦Õ(ÌðŒe¾aºÔú†Œ–¶wM]„ŠWm¡6` 6%cž²ŽRêycv)!¡¡?Å„¥ñ*¼bJrøNôЕýÀ‹Ê‡’9¦6¯èéÙ´ŸPÂŽ…_U€A—2ô $„ˆH,ð¹56 §)¦cCý{¶^t0þKÿïyæØðvP®s§I·ÛòÉìP…ç8ÅîÝL©Ê)¬<Šl(mß›[Žov¾o9¸›f;iúK¯°òMÓŸå›K‚,ç k®ví±.lËŸ>…‡Ã®™Ãt!ñ´V੦ÜFªËøÁ,_®(”ËÓ«ˆ¦>Ïa°“k©â’F{EËÏ;*¤ÀÞMW H›¬§HQlOµ­¢”wÿ‰YQ>íù#ª·”åÔÞ®¥ŠÉÞ‚|ƒb‰!å˜4wÍþÅ‹¬+Ǫ©I÷ÊÔ“ŠQE/¨i C(J——Åþ’ò÷ŸD7mÖ0yõ2 öuœZ¬e®‘V|Ô³åi’¸8ö÷Ž®þŒ«;åHޗî-xLƒÂÓö0-//k4Ü}K,öÅô,pÆÇKƒ\EPµLLå$Îhqüðµb÷$ÿJØ qË*³¾2ELHw0×Ö,„@ï¶î[Öx;¸¥fVÄãdñ1âtÑ%OcôK Ø„LáÕ“Q©ò¥t°ð“Y9ö™²¦1=$Ó,¡Z, ¦š‚±r|A?}=1«»ÀfƒlF½•(m߆'*í¸Iu!h7æ’M‰Ë’öÔbÝœáçÔͦ0#CpZìisù älðl z¹ajï*Áкy¨F¦¡šY—‚Ùõ5¾Sî^E÷H¯è–eF7‚oû¹†€—ÀëĶ©à¹#@=ŸgêœË¤Ü™F—Táö¶ÜôÈÃЙg.wÞ·&'óé Š9ôe=Än q˜öKb¬oZw[“/¶îKÓÞ6’B9k ‡ KÏ»óah·]vØÙ>¾Îް‚[CÉ‚6<Ǿ̚yÝ¢ Ä 6#Â{¦mãî'zbÂBbýåþ'¾zA¶5y<¼¬ŒÉFúµ˜šF¾Ö®,{;¦¦Â¹¹sX˜ÆæUœÓQMú£Áúˆöµ<Ó _ÇÞ’–ÚNµú#ù¬§;c[¶Æ±µÑ(Óö2ß䘲狩Û ÔX=•°>!„í8›ÄæÍLÅ8-ˆ”í’šV‡¶®òó|û"ŒÝݬӖql.Õ^ñz™úø‡3‘¸zæoÿýÇçimI"çÿ´ÃÜ©AEk…;2x±tû—"/×þ?çÓ2Pendstream endobj 2126 0 obj << /Type /Page /Contents 2127 0 R /Resources 2125 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R >> endobj 2128 0 obj << /D [2126 0 R /XYZ 56.6929 794.5015 null] >> endobj 718 0 obj << /D [2126 0 R /XYZ 56.6929 730.0613 null] >> endobj 2132 0 obj << /D [2126 0 R /XYZ 56.6929 694.6148 null] >> endobj 722 0 obj << /D [2126 0 R /XYZ 56.6929 556.3845 null] >> endobj 2133 0 obj << /D [2126 0 R /XYZ 56.6929 529.3116 null] >> endobj 726 0 obj << /D [2126 0 R /XYZ 56.6929 413.847 null] >> endobj 2134 0 obj << /D [2126 0 R /XYZ 56.6929 385.8516 null] >> endobj 730 0 obj << /D [2126 0 R /XYZ 56.6929 226.4875 null] >> endobj 1753 0 obj << /D [2126 0 R /XYZ 56.6929 193.9525 null] >> endobj 2125 0 obj << /Font << /F37 1042 0 R /F69 2131 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R /F41 1238 0 R /F53 1333 0 R /F48 1258 0 R /F60 1366 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2138 0 obj << /Length 534 /Filter /FlateDecode >> stream xÚ¥TM›0½ó+|©¸6ÆÄ>fmY©iš°‡Õj¼ *Ái e}MÆùЖ=­¢ˆyã7o><@1?ŠÇ„Édˆ9¡‡ •9ûîPËñÏ$ÿ–u—9_¿±’XFA„²—-‰eå“;ù1žeÉÜóNÜö|÷.Æà‘ðX$“‡yš=šüš.Ò8™½Qèf©Až "L<³ ñãtü3ÿa5y§öœÝ;Iviä¶YJXßÅ_çé™ Òô|ï̤àè`ÁTÊmœ3ÌCÆÎžÚY8¿/‚7§§Ð¡áq&0Áh`zA04=.qÄvšÞBoTßSä¶U§Z0‹µÖ­uwºr÷R[ðäu FylòMU|ô÷Û2ïT q?Ï#ïr°ªd,l÷ËRorðÉÆF–ªV+#ds¯óî†ï÷ã6=û”bÉypjÀŠ0•2yJa`«¶ù¤ zÓ27ËHäfëªæ!?z”R÷‹!1éø;½õkõªêk,X…n:“¯jV类„ÙnûÜûb VnSYmá¦3{P–; Wµ­²ý2Ôàv¿¬«öî –`Ø‘¾ý¬Ví^Õ®Ð(e îlH]ë˜öâÀÍYΕ‹?ÚmÆq¿›hþ¶îOïýõ‹šWRˆ`x¥ 1c’ž‹êçEú¾ôËòíÿ寿endstream endobj 2137 0 obj << /Type /Page /Contents 2138 0 R /Resources 2136 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R >> endobj 2139 0 obj << /D [2137 0 R /XYZ 85.0394 794.5015 null] >> endobj 2136 0 obj << /Font << /F37 1042 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2142 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj 2141 0 obj << /Type /Page /Contents 2142 0 R /Resources 2140 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R >> endobj 2143 0 obj << /D [2141 0 R /XYZ 56.6929 794.5015 null] >> endobj 2140 0 obj << /ProcSet [ /PDF ] >> endobj 2146 0 obj << /Length 1965 /Filter /FlateDecode >> stream xÚ¥X[ë¶~?¿ÂoѱV”D]Ò¢i³§I¶EÒ g¢íé-imõH¢#Rv7¿¾3œ¡,ÛJS »&çÎá7äˆbÁ¿Ø2Œ’2ÝäeÊHÈMÕ¿‹6{à}óN°L*“P¦I“îV&E(‹8ßl—F¾zy÷øu,6qfY,7/¯³¯,/Â2IËÍKýàé Ž¶¶±Œ‚âáŸ/"µ4Ì‹\ Z.d˜—Qá^„Á¨§]טƒÖ¶ö³šHÃ$ÍbVË’0Ï"òS„âa+¢( žtßëþ0j0Ó›‹–Rz Ÿ‹Â˜M<ÛϤ ´¥ÁYŸ šßÐì Ï4¨{{¦ŸQï§±¡™ž¼öA]™=zØɑś2,³8ãÀ =e*RJÈ,%©v±42º›l‹‹Ä™Õ3õ„Ér“va¨®SI5Ô4¨ôÀQ.¸­1ScüøÚ¶UŸ8Šãø Š 95ƒÝSûF™‰8¬¹{Ã¥ábæœÃbLc݆nã<¦#þfA§÷û™ˆquh9»æU“ÕÄ‚å2¢„°ÞNÎêS[³˜"ºÑ`ÅdýJôC;Xvçòƒ´v¿=ç96X´Û0Ø5× n“ijÚ_LÝn+à¤ÓÃÂ…ïÒS i ·¥Ý3éÀ–yíˆùðŠ&Â8K<æcø¡›‚hïCû™<»úÐŒ­êhüýÔï Æ×¡\@•‰ó÷w= vVXÆƒÓÆ-ÈÊ@͉ο&DüL|Œãœ¤!š7¢±Þð+Ôʲb@4@™ þ@ŒN³¬CX;6úØÍ2\ô<Ò스‡yÑ· g°È”}sɘ†€G€"6ù93À͵úFtür²e€h$Òßàï»ïÞ¿ÿñÇ©*e§^[ú¤ïÜvzW¿ ×}kì…{½^¬0‘p‘ÒyE?°)e™í0‹Óàu² |d ‡Æ‹o<ÐĪôHÒÕßO'2ŸëaÍžÑ_5±¹Á’FŠ ÈœŒðiÍZ W ŠØmT¹,(¾ÊÞñ‰}q´€¨\Â&|&d¾vKÈTÝVŒÐhÆKI›S?s@Õ+6¸k0mHšŽµÇrRϯÄ'¨›CZÙN,HÉÀk™ôjY`:ujˆN^®5ôÛé³'A´é°²\¤A®xYöÊ`3§Áçs³‰uÿŒ`°¡¬mú£]­7>)34n-_³•>¾ñ±ûzs„ašÃÙ`M t9hðÃ|K>xÌ«,«DM¿Š~|ª`x‘â\,Íq.¼éÓlŽò{½$çF.ÝÁÌJö¢´VËlo>ͱýãÓh®o›ÿ+Ÿtc‹lѸÄ"'ÛCv0 ýf3GÕ51b‘æi‘diNŒ‘Œâ±ˆ±0·"ð0àâÄßZÕ7’\sÂw"ó‡&0ÍåþF—?$cRÍZº”í(õåŠ:éH^04g¢°û(½À ÙWáÓ7˜¿S,[>°úŒ¹…;î3`ô¦'bÕÀ¤Ö^ ïöEy˜]¹œ­Þv‹íçÞa¯Úák@n@þzh|ÇütÓOÓ0J¿mºã—¿ÞeÚâš(°ÁiÇEðá êÍâÀz҃ѣm§žæˆ§çOŒ$ ¸aѯt ÇtéùL]%ŒFèŠâ¹Bˆ%Ç#¥ e/v­Î©­XKí)™®×âX°Åu’_=ÿ~-ÃÔ¶GYðþÛ§päÏH—@ ­èרÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨WKÐÆ 5m"û¿À¥–€ã6WUŸÔž9ZØ×•å,¶VHbžþ‹'¯´=Í\¦pÀŸ'8TÃ[WyÌ#‰6Éyè5µÒÇî:4 ßál 3,•ßbÏ[œ+ªë/WF".ƒ›ËÊ?@”€/jŒu“1Ô¢+l',{_¼2ãâ•sä®ÏñÛªÊ ¿&–Bú–åç !G˜ ¥Ìrcø-мûãËü “¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒH"h<H# a("NnÝÍœ÷þþùåendstream endobj 2145 0 obj << /Type /Page /Contents 2146 0 R /Resources 2144 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R /Annots [ 2153 0 R 2154 0 R ] >> endobj 2153 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [348.3486 128.9523 463.9152 141.0119] /Subtype/Link/A<> >> endobj 2154 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [147.3629 116.9971 364.5484 129.0567] /Subtype/Link/A<> >> endobj 2147 0 obj << /D [2145 0 R /XYZ 85.0394 794.5015 null] >> endobj 734 0 obj << /D [2145 0 R /XYZ 85.0394 769.5949 null] >> endobj 2148 0 obj << /D [2145 0 R /XYZ 85.0394 576.7004 null] >> endobj 738 0 obj << /D [2145 0 R /XYZ 85.0394 576.7004 null] >> endobj 2149 0 obj << /D [2145 0 R /XYZ 85.0394 548.3785 null] >> endobj 742 0 obj << /D [2145 0 R /XYZ 85.0394 548.3785 null] >> endobj 2150 0 obj << /D [2145 0 R /XYZ 85.0394 518.5228 null] >> endobj 746 0 obj << /D [2145 0 R /XYZ 85.0394 460.6968 null] >> endobj 2151 0 obj << /D [2145 0 R /XYZ 85.0394 425.0333 null] >> endobj 750 0 obj << /D [2145 0 R /XYZ 85.0394 260.2468 null] >> endobj 2152 0 obj << /D [2145 0 R /XYZ 85.0394 224.698 null] >> endobj 2144 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F11 1459 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2157 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj 2156 0 obj << /Type /Page /Contents 2157 0 R /Resources 2155 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R >> endobj 2158 0 obj << /D [2156 0 R /XYZ 56.6929 794.5015 null] >> endobj 2155 0 obj << /ProcSet [ /PDF ] >> endobj 2161 0 obj << /Length 2544 /Filter /FlateDecode >> stream xÚuY[sÛ¸~ï¯È[•™µ««e·Äé%í&“‰Ó³3çô<ÐmóDUQŠëýõ  ¤dµÓé˜Äå¨>ü .ÖÉÒ²ø"ÍâeâÉE^½ó/°öù]À4¼È–Ù*\ñ™!\ÎYß²;êþp™(ãí`ð# c8#X{?|?Ì•(‘Bk»ËÀ“Uת>Åj3¿Ñ•P5ïEÅÔíÙt²b‘<ïÛ¨o´ö­ù “êÞêÕô»Rå¢Sºކ;â­È®dÉÇO4Bìe¡ÿØR±—k:grX޼Zžˆbœ¶@< CÄBš¼U;«3ЭÎ@#%B Xd½‰ÄžAJ´¼\D¡ï}²ªèjØ%fm4‰%µú'VÁW7 É—Yè]Õ²ƒÈÉbðWâÛËड«‚© ÜÚ’pkú-Äù½ÁIâÝÖla hy'së7 –¦³7Ç Ú å¯F¶ #œ‚Ľ;¬/²Ô »)–X+Ïܦð~EAŠC1øžÉÒŒ­‘áWÐO+U”gš€B`hC»  ŸUM”Ä×<éö™¹ëE>¨ñà–0[y÷6`™½ÞIrÔÌDÛ©U]'­N+örR¨š£  “Ωu)Qº£èˆVéBaž9^ FXЭ‚dƒ\#åS¯ÐyOpBŒšÈª†¨n4\Tòi¹^¿È=õvÂÀ3v·Ù”¹<ƒZˆLPO–`š8I9³€øQ &ŽÀ6 CÆg”ñf±Ñu.{4ÐÈ,0ø$rUªNIƒb¼Ã°:Ý>±‹átûÕé°Ûª)å$ £ÄÁ¶‘¹µ/!. N…Ùzê°Wâ.pl „ÓÁº°â…!R߸“OG•y—²œ ™®Õ+Å cøˆP¾·ëU é6É–+?£ÂôD˜•ZŒnMG“Ñu Æ »Æ51ŒŒl_àêiìYpɼÔ$LK­¹¿JH\ç d`L'±ž¤žÛáoAØAv¦ßÑcÐ&kïNçÏ¢‘ fC4„ˆ¹@tÙJ\ô õäã†Ovº1‹Ð'B%ò£ª¥!¾Rƒ‹é"kÏfWâ‚ßk×6ª;óî{bØêxZ>s#JÚÕJ¼g]ok˜WƒZ «Åœö²Î­&q2¦S]ß±•¿o7‹Ûí-a,òPÔÃ`ûxKl„àxàYÄzÏq?`–Ýzª6ÅÆƒ`»ÅýíZÇý QÇ0˜º£À뜉1£„Sèײ}–¥<ÓÌ•šQÑÇ‘†Èö‰m ™)€Ð8HÞÚF’‡(ÉњGboï¬ïøX1ç‡a_ßÀmý€ü ¿‡V=A¤B÷C#¬Ù`_ ¼ –a“p¯Gkଯ ëÃá5³îǪÿêÄ- ÜȽ¬Í|µ/^ÄwxÒH‚ D¤<ÐÎÿ—yÇ‘sU@E…ÎqÌ*Š‘×8P”Ì Ë¿/@f4áRÊ}^º¦ÖÒRº#›Úv°/×ˈÖFtÅŒ‚þ[åSr Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ñpJµÙ>~æÜpËLtGY­Fgá±[A —(-̃ÅÙ¶Ä ˜Þ°)Ëx™AaíF¼¨‚ÕáPâ¥V)§8·º>@ÌÔ4ûôÜÄP‰BÍÞ(dv P&máªëæßFD3zœ`·“¢ÂEàÛ=ÃBj{ †rh®ÔÐq½ ‘®³«zß&Å(uùJ¸8…B×ò5ø?в9Òp#ªf'Ë’•ú&_æ ùM_—¢±J6iðU£ª#E}ïãÏ^5X*‰eÃÏÖJ©>KF\¢P¯SSŒo&Œ>Ï! ·LÝ–è@±¸ˆ¤ægH@Ä9³ZI( Ž:ž()6Sq UŸiQc¢õFêÆ†EiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡šMÔºõÁùˆ4òs®øbðج–×y­P°M”`à· FAˆ½Ž¼m¥uGKÑ–‹;ÕAŸ^–,y§ž%­Þõ½1,ôUUD¼.µæ!u[È8ˆló#_÷'k®ÿ1,°Èq‘<Äa U®ßù³{”ül>Â1¥ƒÏéD}ãX/Í›·ô(òÄ-O¿õÄ7‹›.f2ïeO˜ÅËŒ¶±|ïÛþjÄJ˜±Ò¶ë–BºfÓ„È^'Dö6!2‹Šµ>¹Õª?DZ…Ú™ðì DðFÍ\¥Pà1ª~)‰ÅïšVýØ^ .-㤎Ͱ·ÁqÏGß5p’³:ñLðÊçaAêð0xšnþ5cµN¼‡£*itUV`+c!ž¡z'[´Úzå},ÿdêUi‘دšèœ7³v«êœÈu{d¤ÌcIÀýj~ÅžXfQ‹gR`sdß׳=¥±iˆ%†zߊêÁïªÂ÷UY*»bI뎺,hùAØ7{pä‘Å?õ°–ˆV¸M¯jjK€ü­? % ÊGË _¾(XàëÿšV@%Ÿ£J4ËÝh^ý]žÔ‹f6×níƒ+LÍìS2vDN?š`®…8ä9H3ð`3zø…$ÛVÂïå4ýˆÕÕHƒ®\Büu|-Fc˜¤ë\5¢œs²knTuü×tè«ÊeÁ?Mä' ÁÙX€p†h¨k.æÍâõñkMb q‘ÌB° ƒiû†sk(ß½üdÚÿÃlhßp²ÑoC;àÐn;Õ£ž»¿¨Î…?^Uè&ŠÌ(\¹'HðêÑáC5mWp}cŒ‡XÉ„?)â’éÀ9–ÜI[(‘î¾›¨Â^5ðù©‡m7ïÍlŠR͇蕽M|1x: t´yãizaÁSBïHæ >Ëíé±³Oâ"HÓȃ…×UØNÉø©|hÑçò Å™X]ÖÌ=Î÷¯»"L1œ¬ù‹Oï×WHÎÔšæÝǧá#¾û4á·óhö3¿cYŒ<ôú9¢wEYà6B=ƒ0y{Üð'ƒ¿Ÿ÷ð¡¢rendstream endobj 2160 0 obj << /Type /Page /Contents 2161 0 R /Resources 2159 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2135 0 R >> endobj 2162 0 obj << /D [2160 0 R /XYZ 85.0394 794.5015 null] >> endobj 754 0 obj << /D [2160 0 R /XYZ 85.0394 769.5949 null] >> endobj 2163 0 obj << /D [2160 0 R /XYZ 85.0394 573.5449 null] >> endobj 758 0 obj << /D [2160 0 R /XYZ 85.0394 573.5449 null] >> endobj 2164 0 obj << /D [2160 0 R /XYZ 85.0394 539.0037 null] >> endobj 762 0 obj << /D [2160 0 R /XYZ 85.0394 539.0037 null] >> endobj 2165 0 obj << /D [2160 0 R /XYZ 85.0394 510.2426 null] >> endobj 2159 0 obj << /Font << /F21 954 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2168 0 obj << /Length 2811 /Filter /FlateDecode >> stream xÚ­koã¸ñ{~…¿ÕbEõ̲»É6w½\š¸hÛ*K´­®,ùD9Ùܯï g¨‡­ì-Ð&L‡Ãyq”˜¹ð/fA脉—Ì¢ÄwW³lwæÎ6°öéL0ÎÂ"-†Xï—g—·2š%Nzál¹Њ7ŽÅl™ÿ2¿v<ç(¸óO7÷7×;_x;ÿxÿDƒÇ›Û›Ç›û74½»¿ýùñ§ëóÈŸ/ï~¾?_ÄQ̯nî?Þý‹p®‘ ëZ臛§ó_—?œÝ,;އR W"»¿ýò«;ËA¸Î\G&q0{‰ëˆ$ñf»3?NàKi!åÙÓÙß;‚ƒU³uRKÂu<zjò¼)5‰JO5½¿»ÿÒyñüY5º¨+œ$ó„`/©¦As.â¹*UªUNEE+OjߪÝJ54õ\×%„´Ê T0”à»ô?u3¤úÒ­¢µzM •J›ò•·•%Ô{•µLÌb¶[Þz¨reè-Ð( ™…Nž³|-ª Y‘%†Qjð³-ŸµbƱ»=×q£h¨#ØÁ:Ò4óáÇ·‚Â<’U4>aòÙu½¬I^iK®ö„”¥­ÊÁ­¤pç÷5ïÏó¢…SÒ’æ¹zVe½ß©ª%€Q(R©+{Ju,[oMÃè„JŒÞÞCR1%ýùKÝ|¡%ÃüîÒ\ÑÚ¾ÖºX•Šàm§¯4\½YzÚ­½-ö´bìŒ p^c4“¬nöu“¢’ô‚"6ÂÉ ©Ûº²f+2ã0RÆVëºiug<ó[vä[õWŠ*/ž‹ü–Úè ®š˜ ß‘>ÜC¸kpª9>ÞJFç WcþIU,Ç(©µjT•±9ï*`bgäë‰[! q)Øqé“¿{x;/j@FÅ v÷þàW0Íal@3CðLE&G†ŒQ“ŠãúðâŪhi¥ÈÁŠsaüœ‰ kãi€[T­jÖiÖ26ƒ­ŒÆad4Ž”F¨Ñüe[d[ªþ|ƒH–É™Êí9´vâ”HëQŽH¿pNQmj¢Ìu––)¹+Ìî•Jµ4c7h!œàµM¢ùrÛ3épÒnif§¯{#PÄ‘чú½"ËÈd` ~– @ dþU‘¥º0¡N$;<¼q*¦cÈ2d¬‚ÊYÈ(†b|M VK_Ì5ˆ‰z¾Û›äÝ—±çÈXz|øuõú“ðü“2”†IãÖð h»zxXÑGWø ŸøxûpdGS—é³çùŸ˜Œ3;¦`²ƒ€[sƒ›&²K¼C*Ç!@þ®Û(Nê'¨u|6çfÀéà&€S2Z÷ë„c€‹»ÞÐ1Þ<Ós l³ˆú°¢àYcè>§'„)ŽN°ÕEZME‡È ¡äå-W}×q‘t¼@Ú½”î¾ç;~ 7eh˜%¥ç¤×ŸŒô‹#ýU1¯Ô0Mˆ†ÊÒ‰Müñü°×ÈUº’3›‚˜<¸wOçJ¾ sêOLŽc®6ÛòÕ¤:³êö (/rÍG×= …8£?¡prmRXÖ”aÄwâ ´QCɵµÇ¥«°¥«7¾µhÒjƒ—VBF_Z¬Î‘`|΢‰(%[”uf,ÕíDC¡Æ¼h¾;˜d KÌÄ­tg¹Ñä äh&ÆZéI¥”»£-¹! ¬nÌ<³&ÌK‰”v(À°˜ñȇq㑤KYÖãcõq1`®/Ö¦"ØÑ¥±õoJ?›âY1„zg+@®Õ h]¼¨VP$ÛøÒÖvç ¶Á@”¶[ÅÅx»M«1ö.…¥Rzª'¥ÑØ,0ÏÒ}ºÂš¯YrˆŒºËZ :WÀQÝ÷-!VpR}å¢=ˆ:ÆÌ¨¥Ñ€ªfôä#¼k¥, i À¡ìLLÑâÏ©®ÄA Ý] ûLµ³òa¹lIëÈz1] L ¿ÊTk.üaj »õ.µÔ»h &î>>b¹`:&Ðô‡ù¶”ôçËÇ)IH£5xrÚv €‰°*V e“ œ’1/ã_¬§è^µ#÷ƒ<†Ý‘fþÚBÞýz® ¾é>2 ItdöW9€°;˜ #";"2ôoÆG‰Fõ 8ö ¬,ª/ >ßår—Ñ÷ } –Óµ*§µôÐÖX“d=䌩†ÎØ"I¬oèØíKµ³Ú65 ”Fe»Å¼À(-ÿjúíXÁÉ ]M8OÀo *nŠÜBí±¹Z§PNÒ¤7Ò^Óo¥àªë´y=ÀÖbA<¿ž EЙ­OƭܨŒÚ›-—e]s÷Z_ÔU×.Ê‘zE)míë¹®¸ÊWñ•¿ÉUêº0¢Æ÷j­bqå­¤7‘Љ’-9ŽÂÐákq¢ŒuB«×­‰§ fe°¹{ º ©-žC*d"&Äðwî¿õ½•èšÖÙ ñø-‡ÏڦϊЊ*+T|$ô…m¡ÓŸ|-Úvi×»iÖüŠ›ƒwhJH…–×ògui.: ñ¢ÿûêêOt¥¡ý1 _~tG‹¨eÊZ˜ ¼Ï7Z7ÉR,™”·fT+‹…ÆhËÊÌ&œ‡=ñ™Thn„u5eÕU£Ç¾ù}!’_*ÞƒlE½iÒýöµˆ[O‡ ªÂ²ò¨Òä¼^|ûEDv/" â”mÖöÑëC½Ã1xVGßãÈÓØ±tˆy,Ehµè €“mCøŒ`.nÛü„ ú®‹Æ ­»’½C›nÒÍúWX߃Ûzkt…kÌÃ>mø4ã0¡ÿÖƒH§"éÜРWÎF*2­0!ÓØ´ãð —o[QÃiU·¦Á dÀÉ÷µ)&sä?çíx™´*Ÿ-¹N:œä¦£¨Lb€)v¼g²lïÕ Wü¦Ú@í¤š.&/Ϭp¿Ðì–JžŒcÊxw³¼åÜ›ØÖ"‰YæÛôŸÚ~Ï?q7²§E¢ÿô é;„*¥Å7•õ cåàföí÷¹àRõvùÀw²½šÈöëvuyùòò‚*p ]8*?\ÕÂXé[}ãú&?kÚþù+üM\O:‰p-’Ó~å‡1ÎCN("ÛÿùøÓ‰øN”±iÙE˜øô­ƒ–¿ÌìèÇþ»G·c1Üb¾{øÃƒO)Ô1T~ß!¯½<æÏGþã8:âïè[L‡uÊÓH§Ô§¿Lå]ÀĈ90&ºÒK÷ðxj7ˆ†žÄ˜-t|×âÚv ª{ô^Ù¶Ä>±t‹à-Ö‹i¦'¾}¤¥¶Ÿ4žÓÂ>©]¶£÷OtJµùï‘ÊøÙJ„b¤‡7 }Ç÷èUHÇÁ{‘ݰî8u¢º¦Nh{'RíÚ©›Íe³ÎN|Çs#'qå1WG¾Óa²2RÄ)µ·|'r"?ކ<ÇéÜ4†`“6MKÎü=B¿õ…S~–œÃíóÿüõ³ÿ ÌÉ8ö¦?lzQ7ÆÌJ ¼ð„uûô”÷ÿ”ð:endstream endobj 2167 0 obj << /Type /Page /Contents 2168 0 R /Resources 2166 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R /Annots [ 2172 0 R 2173 0 R ] >> endobj 2172 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [253.7995 149.3637 417.685 161.4234] /Subtype/Link/A<> >> endobj 2173 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 110.455 208.8999 120.6168] /Subtype/Link/A<> >> endobj 2169 0 obj << /D [2167 0 R /XYZ 56.6929 794.5015 null] >> endobj 766 0 obj << /D [2167 0 R /XYZ 56.6929 662.0717 null] >> endobj 2170 0 obj << /D [2167 0 R /XYZ 56.6929 624.1661 null] >> endobj 770 0 obj << /D [2167 0 R /XYZ 56.6929 624.1661 null] >> endobj 1539 0 obj << /D [2167 0 R /XYZ 56.6929 593.0972 null] >> endobj 774 0 obj << /D [2167 0 R /XYZ 56.6929 294.2701 null] >> endobj 2171 0 obj << /D [2167 0 R /XYZ 56.6929 255.4568 null] >> endobj 778 0 obj << /D [2167 0 R /XYZ 56.6929 255.4568 null] >> endobj 1271 0 obj << /D [2167 0 R /XYZ 56.6929 226.1045 null] >> endobj 2174 0 obj << /D [2167 0 R /XYZ 56.6929 53.5688 null] >> endobj 2175 0 obj << /D [2167 0 R /XYZ 56.6929 53.5688 null] >> endobj 2166 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R /F53 1333 0 R /F11 1459 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2179 0 obj << /Length 2825 /Filter /FlateDecode >> stream xÚµZ]{£6¾Ï¯È¥ý<-’ KÇö¤É4™4v·Ûα›glH ÎLúë÷} 0’;Ûî“‹€tЋÏ{>%ðeø2a( <¼ŒyˆX€Ùåj\n`îæ+™+-teK]//þùŽÆ—ñˆD—ËÏÖZ ’_.×G“ÇÇùÃìößã+‚ѯXèÑé|1¾Š#.&¨˜Š‚Ñõíõ·nž&?ü*ú-`Áäa&o?ßÜÌ˹º}šOf·7 ‚ÇŸ–wó¥ymû§á€Šwþýâã§àr ¿ðî"@”'ìò+ÜsN.÷!£ˆ…”ê‘ÝÅââ'³ 5Û<:¤*FÄèŠàKŒgŒt”Å8Š(¡²uZ¬Óúrþ"ÊØ9š,) M†hÒRùãÓ»)()üÔGÆ,@ ‡w÷B©SlÊ-lÌJbʺà³rŸæ…$ô!Ýg•âX^MËb•½Ôjt$/Þ¥«|—×yÖè«÷3q Å ¼ Àø‡|äqŒ ¡Érì¾\}I_²úWJê¡|ÍöÏÙAÞažÄÈÉŽÀVÂsŒXRF´”Åó0⃶éc;±ÁÏ2r»Ùeû¬¨Ó:/‹/‹—l•ÿd%gOÉ!˜ýAmV[£÷Ä­wh0Õ3z·¤¶Cï6øü[•I0&9U½ìd”/úá9ܺë=é|0ŠÌÿœw<¦ààsXR ´”EñPàƒ¶(èc;(°ÁÊâJ]ÙaŸº"3— ¦‰Ù:—¼r††HÌè°LéWÁ(¬°Ö=wê>^ˆ|~ÝÛRnÝ)£û$ôÔÂ^èV÷'ØÃºï€/2U P6zŸ½É‹¶ NWªþ¢h rBQç¦&Ié"p! ƒ á"ËÅíÃC¡(H¶8‚‡Zðp”ñH9 å£jêæ¸ÞCú®dQ@h2š©™yZÕW2ïˆNÞߥ_´ËÑŽ˜¾íZÊ/cNFÙn1¸–8M°Té‰P69í$ŠQ”€êývbIyìDK;á4ð؉Ú²“>¶ÃNlðŽ€ ¤ˆô]Õéó.¯¶¢™òÅÌåû¹ÚQ|zr…΄£G½M£™âDÐëdp‘½ÔÖŽ„Ÿ¡#FÈ9†,)CZÊbȓȼÐC}lC6¸QöSöû1Ó!ÍXö€? µå›"­’Úª%K:oÐä¸ÊåÆÔ”ðÿ7[#áslYR¶´”f‹AìaËm±ÕÇv°eƒƒ?)­ŸîµùN5T†à¸!C>¢Û5q#ÛµÁ`‹ãQ—$o˜ëîíù¹Á@r†KÊÖ2ÜDޜ胶¸éc;¸±Áo²êk¡Ø8–D嵈vqw‡×|•É©ÉnSÂÔv/çdØ“´±îe¬‰Ëôsª½–ôj¸ôß,2¿:¯ÉS_®e(da¯Z(úßM‹¡úôFvÝ—éá|'·hÞšß¡fÔ_åÏå«=s×±² ~ez’pu?øCºÛ©¹«º´Íïoòš§þþfÛ¨¶´5[KßµíIÃ<ŒýfmK¹ÍÚH³&ÄcÖ^èÖ¬O°‡Íº~[¬ÓmåSV•»W­èÅñå¥<Ô'çb>Êԃ؟°áØ?-‹ƒ¡z–­ºá;à …XÅ)=§wKÊ£w-eôžPêÑ»ÚÒ{Û¡w|¹•Ñ åÂK@žîÞª¼’wBÕâ¿ÜZƒ ³µ×jk ®t&×v&øT8I»×&VE ¼þ’ Zî–ÁÅ“ž„N(ËEHq¤;#UO«E;õ4:É$£ÇgöHm)7™FJ“>2½Ð-™'ØÃdvÀ›ƒ¹0OÀ·j ™ÊõQEv1Ú(X‹’,oÏwn’:»˜ ’†ñüD> ]OÂ0&FïÕèéAuGìŽÄËܧU•éÈ-7Gd‡Óöé®*Þ-ú™›þ£8ÀgöKm)ýZÊ¢ßsîç…¶èïc;è·ÁEÌ”u›(ÀÃadUŠTÒÜ4i›BK*½™ªü-.Z{wf×iðà‹OB«?¦ŒK'¥=[h'ËÄè½7¶ gj[Ü t¨ïXHïLù/”¾L´ã~c°¤<Æ ¥,cð$T/´e }l‡1ØàêÀª.W¥Ø²‚z_®{»é QµœñbDV)"ª·U ÜI£ã‘Ë.HŒ’ÛÅDz‚‚E»1ÂLØQ]ŒÞ+qm*¼«•;ö Óùßc'\ º§Âíî(é`>r€‚$Õ» À´jP'Ïå±îí0ô¾ˆpØ!f ã3­¤%ä¶B-dU™Ï}¸­ ö‡MÐFžŒ¯ -3wÊ,Ÿw¢^ [ÖŒ*…ÅÈ´<Øû©ÍØ/cŒ ­±ïÖÙN­>Ë^vå›~¾Ñó åçú«d>C¶K¡`Œidå7ÆÁâU<2³û»I_å Cæœ:& ôÚäLcjKy¨ÖRמZ/´EvÛÁ¶ >-÷{¹ëŠõfëÀ·@09—¬–‡JÊH…‰Åq³N¬é„`ü]þmøèœÆ(æØ>F¢aóù XäýqŸêSW±ïÚôy°Úc +ïÔàT >d mâŒ^·Ãs§÷œ¥ÅùÆgîóÝΜø~ŸIð‘0Šüa ¹ B µT$žƒnk}àak°‘Ù!×G%ǶÚ4[Y¯†ªLÆ,<=5G±Žö\×~ïGI ¶àÏÔÿ–[áZ¨Íø¾Ï¾|¸­ÂûÀà ·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Ó(4Ÿ”r¬_Jü Lâþ«›o‚Oßý¿$÷b–endstream endobj 2178 0 obj << /Type /Page /Contents 2179 0 R /Resources 2177 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R >> endobj 2180 0 obj << /D [2178 0 R /XYZ 85.0394 794.5015 null] >> endobj 2181 0 obj << /D [2178 0 R /XYZ 85.0394 752.3015 null] >> endobj 2182 0 obj << /D [2178 0 R /XYZ 85.0394 752.3015 null] >> endobj 2183 0 obj << /D [2178 0 R /XYZ 85.0394 752.3015 null] >> endobj 2184 0 obj << /D [2178 0 R /XYZ 85.0394 746.3107 null] >> endobj 2185 0 obj << /D [2178 0 R /XYZ 85.0394 731.5461 null] >> endobj 2186 0 obj << /D [2178 0 R /XYZ 85.0394 728.1497 null] >> endobj 2187 0 obj << /D [2178 0 R /XYZ 85.0394 713.3851 null] >> endobj 2188 0 obj << /D [2178 0 R /XYZ 85.0394 709.9887 null] >> endobj 2189 0 obj << /D [2178 0 R /XYZ 85.0394 651.9592 null] >> endobj 1390 0 obj << /D [2178 0 R /XYZ 85.0394 651.9592 null] >> endobj 2190 0 obj << /D [2178 0 R /XYZ 85.0394 651.9592 null] >> endobj 2191 0 obj << /D [2178 0 R /XYZ 85.0394 648.8377 null] >> endobj 2192 0 obj << /D [2178 0 R /XYZ 85.0394 634.0731 null] >> endobj 2193 0 obj << /D [2178 0 R /XYZ 85.0394 630.6767 null] >> endobj 2194 0 obj << /D [2178 0 R /XYZ 85.0394 615.9121 null] >> endobj 2195 0 obj << /D [2178 0 R /XYZ 85.0394 612.5156 null] >> endobj 2196 0 obj << /D [2178 0 R /XYZ 85.0394 585.7959 null] >> endobj 2197 0 obj << /D [2178 0 R /XYZ 85.0394 582.3994 null] >> endobj 2198 0 obj << /D [2178 0 R /XYZ 85.0394 567.6349 null] >> endobj 2199 0 obj << /D [2178 0 R /XYZ 85.0394 564.2384 null] >> endobj 2200 0 obj << /D [2178 0 R /XYZ 85.0394 549.5337 null] >> endobj 2201 0 obj << /D [2178 0 R /XYZ 85.0394 546.0774 null] >> endobj 2202 0 obj << /D [2178 0 R /XYZ 85.0394 531.3128 null] >> endobj 2203 0 obj << /D [2178 0 R /XYZ 85.0394 527.9163 null] >> endobj 2204 0 obj << /D [2178 0 R /XYZ 85.0394 513.1518 null] >> endobj 2205 0 obj << /D [2178 0 R /XYZ 85.0394 509.7553 null] >> endobj 2206 0 obj << /D [2178 0 R /XYZ 85.0394 483.0356 null] >> endobj 2207 0 obj << /D [2178 0 R /XYZ 85.0394 479.6391 null] >> endobj 2208 0 obj << /D [2178 0 R /XYZ 85.0394 464.8745 null] >> endobj 2209 0 obj << /D [2178 0 R /XYZ 85.0394 461.4781 null] >> endobj 2210 0 obj << /D [2178 0 R /XYZ 85.0394 446.7135 null] >> endobj 2211 0 obj << /D [2178 0 R /XYZ 85.0394 443.3171 null] >> endobj 2212 0 obj << /D [2178 0 R /XYZ 85.0394 428.5525 null] >> endobj 2213 0 obj << /D [2178 0 R /XYZ 85.0394 425.156 null] >> endobj 2214 0 obj << /D [2178 0 R /XYZ 85.0394 355.0758 null] >> endobj 2215 0 obj << /D [2178 0 R /XYZ 85.0394 355.0758 null] >> endobj 2216 0 obj << /D [2178 0 R /XYZ 85.0394 355.0758 null] >> endobj 2217 0 obj << /D [2178 0 R /XYZ 85.0394 352.0499 null] >> endobj 2218 0 obj << /D [2178 0 R /XYZ 85.0394 337.3452 null] >> endobj 2219 0 obj << /D [2178 0 R /XYZ 85.0394 333.8889 null] >> endobj 2220 0 obj << /D [2178 0 R /XYZ 85.0394 309.8192 null] >> endobj 2221 0 obj << /D [2178 0 R /XYZ 85.0394 303.7727 null] >> endobj 2222 0 obj << /D [2178 0 R /XYZ 85.0394 278.3282 null] >> endobj 2223 0 obj << /D [2178 0 R /XYZ 85.0394 273.6565 null] >> endobj 2224 0 obj << /D [2178 0 R /XYZ 85.0394 246.9367 null] >> endobj 2225 0 obj << /D [2178 0 R /XYZ 85.0394 243.5403 null] >> endobj 2226 0 obj << /D [2178 0 R /XYZ 85.0394 173.5556 null] >> endobj 2227 0 obj << /D [2178 0 R /XYZ 85.0394 173.5556 null] >> endobj 2228 0 obj << /D [2178 0 R /XYZ 85.0394 173.5556 null] >> endobj 2229 0 obj << /D [2178 0 R /XYZ 85.0394 170.4341 null] >> endobj 2230 0 obj << /D [2178 0 R /XYZ 85.0394 144.9896 null] >> endobj 2231 0 obj << /D [2178 0 R /XYZ 85.0394 140.3179 null] >> endobj 2232 0 obj << /D [2178 0 R /XYZ 85.0394 113.5982 null] >> endobj 2233 0 obj << /D [2178 0 R /XYZ 85.0394 110.2017 null] >> endobj 2234 0 obj << /D [2178 0 R /XYZ 85.0394 95.4372 null] >> endobj 2235 0 obj << /D [2178 0 R /XYZ 85.0394 92.0407 null] >> endobj 2177 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2238 0 obj << /Length 2889 /Filter /FlateDecode >> stream xÚµšMsÛ8†ïþ:JU1†øy¤-ÅVb+^ÉÎÎT&Z‚c–)Ò©$þ÷Û >R$˜Ù­-LM¼tÝ$ž8ð‡'žüˆD“ r‘ç`o²ÝŸ9“oÐwu†¥Í¹2:7­.îÏþxOƒI„"Ÿø“û'c¬9aˆ'÷»/ÓQ4ƒœéÅòâfùéjß]ÿ5;'ž3ýÛñœx56WW‹ÍýB~\/âùru&xvø‘3ïî«ùòOÑóQÝz¹ØÌ¾Þ8[Üë¯mþ4ìPþ¿Ÿ}ùêLvð ?œ9ˆF¡7ù „£ˆLög®G‘çRªZ²³ÍÙ¿ô€Fo}kïTaꓞ¹"x‚1Š<´&Ë‹O ­'kÍÊâxØ29l[vâú~3ðöÊÊÁ_I1 <ahX‰/Eú*+þ¾¬ß_bÒ¯]eLL‡Ø¥µÕ©6 mLä‘ ­½b?áçc:¯6âb½– ìoÇ!yZ¥E^ÏIç§`Ç…i¥>| >Ð;¸‹8ÓKô~‘)c,~°Ã ‡ÓçäPÕxz#»âú?™Þ&ûä¥(eïZö>dÙ>És9h’ïDóÝ “H ~[l_’WVR¸¾Ì„úJçbÿø´­ŠGø5eXt"ìG }w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀ öHü¿HiþM|˜øh²÷²ÈX–%òž.w˜Cú# + e¥9„ƒMÚàÐÕîç`jÇ|-Ó[–€;Á¥?}*¢mñ뵦ÁÊRL&tÞÛ„»ž°Xæ`¼× þ4•Õ3óbŸ¤²s•ìeëæ­¬Ø¾+u0òxm°R Þ+K~¤¥lk|:>ÏX’§,CˆX ·HÅoyk 5ìQY_K±>æLƒ†A{Ñ ¢#  + he¥AêX@Û¤ Ð]í~ЦöG&×øâ×ö9ɿɉ˜³Œ}SÛq'‘Û:\žÜzµé;Y…$2´}°RG§¸jí‘ݳ“…%Èuý1 †•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý ?â7?Òù1Щsàží’º( ü6¡¹$´HÊ*K^˜l¦µ£ïÞ©s±ðûgM,&†af0 †•…˜²2ˆb6iƒXW»Ÿ˜©½ÞÄÜÎ=ØYEXž(E_q@ü¿Ø&ÁFQã‚Z}ƒ¤Æ¯G¨ù \'4v¹@`ã£Ø\ÇÄÆ?5ØÄaFÔÊ'­0ÝÐA>Lº¦i5 S[0-»Uºy¢Ý ³¥½©ŠC½KáˆN/ÙAlapød%osk†¼¯fÈCÞ(ò+Å[Œ0$aH;†ü~Îßkºžã)†Â¦^aüâ“4¾:îöG8ÔÊùŴ‰´ÿÄs]8Ç4 #° + leeÀŽ,°mÒì®v?lS›ÃNÄ>ŠsÁÙô©>µœ_³º2#zas,E*[dè ÐéС7[‹8K¡7”¡7jñ÷[¡×Ç'>,ú. çøÐƨVªÊª¡êZÎ1ViƒjW»Ÿª©=gU²}f»ÿfcÙ»QèÁ³K©ëýŸ·J id„ý4¦Õ0m¥Ñ¡¥`•nМh÷¢ii×G›@ÕéBQ€…yŽ §¥QàÒÉž’é3¨òÕ`ZÊ€h• E×fÍ+3Ÿ‡|Î ¼ 1…ZȨ4%!Ï( ÝHÃE™ªX«leÅÆX-’÷ìñ0 §M6Ig¸DK}9$Ä#+À°²¬e¥W@„=Ë °I+ «Ý¿Lí{Ôu]î‹5e×¥ÓøX=ö[½‰®»"ååÑÇ¡®â»ûµðOÞ_3æ}í¬“wÉä¤?ÈúžÛð†hÁSÃú.•®‘Wä‘ÊïlEÕ {…ø¡Ó;G ÛðÈ‘·±±06Š ÅØ^-¢¿¶j?½F•t7×ñ90d6BäQ—Â-D‹L^àJj±ªÞ£z‹uõ7®G¶Ëx8›c°ˆ¿¤uæåE\#þò‚tò&™ª1ZP"¦}Ä Ç‘…£4j@KÝΦkì÷£4„ã&]ÉøZ?$üÑ`'¿¿IËJ¦ž"ö:íbo¸ùáé+‡²w7Jcðì··T#ôB^UlŸOj4V`qÅ‘˜a4 Li`^d) Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc ¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿa:L˜o©3†Ø°²0VVdK5Á*mPîj÷c6µ¯aÒ2ýœQ9ÛCþ’?ó®Ó<Ül|Oº\˵ËÞòFnu<0–Îwu,«ä©l2ÇÓíªg0­÷ .XÁ”ðƒ< ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹ …º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> .Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñ$<ùêêßÓïþrO2endstream endobj 2237 0 obj << /Type /Page /Contents 2238 0 R /Resources 2236 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R >> endobj 2239 0 obj << /D [2237 0 R /XYZ 56.6929 794.5015 null] >> endobj 2240 0 obj << /D [2237 0 R /XYZ 56.6929 748.5056 null] >> endobj 2241 0 obj << /D [2237 0 R /XYZ 56.6929 748.5056 null] >> endobj 2242 0 obj << /D [2237 0 R /XYZ 56.6929 748.5056 null] >> endobj 2243 0 obj << /D [2237 0 R /XYZ 56.6929 743.7078 null] >> endobj 2244 0 obj << /D [2237 0 R /XYZ 56.6929 719.6381 null] >> endobj 2245 0 obj << /D [2237 0 R /XYZ 56.6929 711.8197 null] >> endobj 2246 0 obj << /D [2237 0 R /XYZ 56.6929 697.0552 null] >> endobj 2247 0 obj << /D [2237 0 R /XYZ 56.6929 691.8868 null] >> endobj 2248 0 obj << /D [2237 0 R /XYZ 56.6929 665.1671 null] >> endobj 2249 0 obj << /D [2237 0 R /XYZ 56.6929 659.9987 null] >> endobj 2250 0 obj << /D [2237 0 R /XYZ 56.6929 635.929 null] >> endobj 2251 0 obj << /D [2237 0 R /XYZ 56.6929 628.1106 null] >> endobj 2252 0 obj << /D [2237 0 R /XYZ 56.6929 601.3909 null] >> endobj 2253 0 obj << /D [2237 0 R /XYZ 56.6929 596.2225 null] >> endobj 2254 0 obj << /D [2237 0 R /XYZ 56.6929 569.5028 null] >> endobj 2255 0 obj << /D [2237 0 R /XYZ 56.6929 564.3344 null] >> endobj 2256 0 obj << /D [2237 0 R /XYZ 56.6929 549.6297 null] >> endobj 2257 0 obj << /D [2237 0 R /XYZ 56.6929 544.4015 null] >> endobj 2258 0 obj << /D [2237 0 R /XYZ 56.6929 529.6968 null] >> endobj 2259 0 obj << /D [2237 0 R /XYZ 56.6929 524.4686 null] >> endobj 2260 0 obj << /D [2237 0 R /XYZ 56.6929 500.3989 null] >> endobj 2261 0 obj << /D [2237 0 R /XYZ 56.6929 492.5805 null] >> endobj 2262 0 obj << /D [2237 0 R /XYZ 56.6929 467.136 null] >> endobj 2263 0 obj << /D [2237 0 R /XYZ 56.6929 460.6924 null] >> endobj 2264 0 obj << /D [2237 0 R /XYZ 56.6929 436.6227 null] >> endobj 2265 0 obj << /D [2237 0 R /XYZ 56.6929 428.8043 null] >> endobj 2266 0 obj << /D [2237 0 R /XYZ 56.6929 414.0996 null] >> endobj 2267 0 obj << /D [2237 0 R /XYZ 56.6929 408.8714 null] >> endobj 2268 0 obj << /D [2237 0 R /XYZ 56.6929 382.1516 null] >> endobj 2269 0 obj << /D [2237 0 R /XYZ 56.6929 376.9833 null] >> endobj 2270 0 obj << /D [2237 0 R /XYZ 56.6929 350.2636 null] >> endobj 2271 0 obj << /D [2237 0 R /XYZ 56.6929 345.0952 null] >> endobj 2272 0 obj << /D [2237 0 R /XYZ 56.6929 321.0255 null] >> endobj 2273 0 obj << /D [2237 0 R /XYZ 56.6929 313.2071 null] >> endobj 2274 0 obj << /D [2237 0 R /XYZ 56.6929 298.5024 null] >> endobj 2275 0 obj << /D [2237 0 R /XYZ 56.6929 293.2742 null] >> endobj 2276 0 obj << /D [2237 0 R /XYZ 56.6929 267.8297 null] >> endobj 2277 0 obj << /D [2237 0 R /XYZ 56.6929 261.3861 null] >> endobj 2278 0 obj << /D [2237 0 R /XYZ 56.6929 199.468 null] >> endobj 2279 0 obj << /D [2237 0 R /XYZ 56.6929 199.468 null] >> endobj 2280 0 obj << /D [2237 0 R /XYZ 56.6929 199.468 null] >> endobj 2281 0 obj << /D [2237 0 R /XYZ 56.6929 191.7053 null] >> endobj 2282 0 obj << /D [2237 0 R /XYZ 56.6929 176.9408 null] >> endobj 2283 0 obj << /D [2237 0 R /XYZ 56.6929 171.7724 null] >> endobj 2284 0 obj << /D [2237 0 R /XYZ 56.6929 157.0677 null] >> endobj 2285 0 obj << /D [2237 0 R /XYZ 56.6929 151.8395 null] >> endobj 2286 0 obj << /D [2237 0 R /XYZ 56.6929 137.1348 null] >> endobj 2287 0 obj << /D [2237 0 R /XYZ 56.6929 131.9066 null] >> endobj 2288 0 obj << /D [2237 0 R /XYZ 56.6929 117.2018 null] >> endobj 2289 0 obj << /D [2237 0 R /XYZ 56.6929 111.9736 null] >> endobj 2290 0 obj << /D [2237 0 R /XYZ 56.6929 97.2091 null] >> endobj 2291 0 obj << /D [2237 0 R /XYZ 56.6929 92.0407 null] >> endobj 2236 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2294 0 obj << /Length 2542 /Filter /FlateDecode >> stream xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾cEÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#À#KÈpôoë»Pùmˆ‰)òâžßªe†¨pØ¡bJ½8"Ô„]–‡4+Ä{§»CVdu/_VµX+;]´çûS¶cÆÁ+ázAÆð@ü¾„øOüÿ\6pÏY¨‡ò^X%ÎpGžUÙ@œ/mÈ¡nCÊ¡p%¥UNIäP¹ ÚPúÛ¢vü¦<J©xmyË´IÅÑ]–3qtS¿"äïO‚±x[U3O9M#T€2ƒ0 }*žfØO¦’kƪ†R¹÷¸mJƒŒ„XÉ èB¨2¥ìdh)MF‚};N莌3ìq2zà£dè0æÒ?ŠÝŸ¥ÄÇÔ ãØïS²Tl¤•éw쥚ÅÓSZýÐŒ„vF"xsŠâ ŒRF””bÄG9qAŒ ±-Œ˜àgÊ¿©²†U™t×Rëº,QÒƒô˜ «ÞYUF©(ŒÃ>×’‡/iQdÅ~ÀvÏqþ1£tšýž1‹ç8x}„¾@S'ä`I i’|œ8Hrà €-È_k©îòuà8‹¦‡,o”Ói’ÖrûîGU¶k,E ²WÌ}’x”B]1|DX᪛+¤f0 f&MnvÖ:F‰#|¡R0¥ì¬k)M{ìS;íNèŽ÷3ìqâ{à xó0œ>Ï0ÆÀÀ>oõF |MÙË_gsøÓU]ŸZ+€ÖFàšŽ>ˆC­DØn•È×#E)4oLì>ÂQ%¯o a8;ŠˆÛ”Û2‹ºÄO<„3Àjq-î«‘Ö­MLæZ~.LCú2Íà•¦2&û!«¯Ó òÂ0º@{'ä`] )ÒI8² ×à|l¡Ü@øˆ‘„v’@:B»,–ètq<æÙV—°Â»‰Õòa¡Z†aš$€™PluNîÒ¼µ%þÐ D}`k°ùzH‹v;–<óç‘Ķn‚sF…‹±#ø4¥ w}vÓT`j¯K‚^ñÒ•‹µ±ŸïÄQ¾¯Ì‡‹è8:4‰8Œmúp€ÂŽq~ƒqq¯–p¾óE®nÒ#ü:O‹íkþáAL ƒº”ÍM);áZÊ ÜQ;¡;Â졂 ï?ŠÛrÇx§Qç#2½†«n ççÁ” #ψˆì°úµÈø¥bQ$}XK °¯ãFÔÅ XVK2nÌ[òP?½è…`¯ˆB?ê— O•ð?åìguöAq ”²NQe(QÍ+–§*€Pk}@¡‘¡>0¥f¤¤t7= ÃŒ\І ±-fd‚­[ë (9º¬ÎÕQ +u¾ºù,Ī('J¹Á§<¸ˆ½Eõ’5UÛ‰ÝJ#,8y95–àyÈìºÜ“—Šü.ë²fÅKz:ÈužÚe´Wõ‚…³+&P²äB fÙYTBšÄ;FB.ÜŽÃ!ð8…&²ä‚WUý"¾›T°—Ó~ÏY)à¼L<,à•ç­ÁJË( ì* s£ÀŠ[dž”CÉJªÓrâp'´¡æ!¶EÏ&¸Öçæt<–U3P÷ç2Ý©OV}“À c2˜÷<óNH ª¬Þ*¥/ŽU–kS»ÆýØCQ|aÔcJ94®¤ºž5pÔ±NhCãCl‹ÆMð…Ô,Û«ÉÂuZggv>èðTc›—¢œ-8¦}õØ ñ§éiÿ&ŠÒ1Ó·@ Šà…ã í„)å BIi"Hàè"ÐCl &¸Î¡®ø¡¨Ýàà¦<ÓâG' ŽÖ â={òF(H|/ˆÍéIÈô“'®ü[Î ÈLíª¯ÝƒïüÂÙ)óWy~„{¹ÿý_ýò£ Šòr,4æ0[ÄV>ýˆzQx)]˜Rv>µTÇ'uNèŽÏ3ìq>{à =}gE7½S.%«‚ó©êÏrjÇtå¬Q„Gõ1þYoÓm»›x1xé„´H!]Ò£ÈÑùp RÀN ä5ƒnŒ°­Q3+ZÄpEdôºP•:¢ þ0yCA»/ÁóêÁЯ%k”"J¼8 õ÷'IQ猣o(À±&B½JSÊA”’ÒLAnv0å‚6¨b[¸2Á—ü˯d[7 H8]œš7Pyç‰%ù‘ró“húÎçâíê›hdxóÁÏyW–Ö¼ßn'6ëzÔ©è3Rt‡:Pò;|wßµão¾)j 1ÈJGá÷æ1ÿC ‡/¡ÜÝ”rP¬¤tÝFŽFÙ mP<ĶPl‚_g…N[ŸÓ¦zæì,ÓŽörbé'’ ÿ vS¥ß_ÅŒd§‚ÁiªÍCbåB "Ý4Bv”P÷I*rôÑ.ÜŽƒ!ð8&²p²CÀixU!Š8oJþßl®aQFe82ò¡\ØïÅÂ^}וWÀ]Ö¬8qKo ØŠ"sè'‚®¸OWw[™7å…=·ºQŸ;O™ñ;O§üg>?ñ²‚ŒÚ:ÒþÿþA–1ŸŒ<Ûf.² ! VÕvG~2|týÓ­ógÿ/b¬÷Ïendstream endobj 2293 0 obj << /Type /Page /Contents 2294 0 R /Resources 2292 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R >> endobj 2295 0 obj << /D [2293 0 R /XYZ 85.0394 794.5015 null] >> endobj 2296 0 obj << /D [2293 0 R /XYZ 85.0394 748.4854 null] >> endobj 2297 0 obj << /D [2293 0 R /XYZ 85.0394 748.4854 null] >> endobj 2298 0 obj << /D [2293 0 R /XYZ 85.0394 748.4854 null] >> endobj 2299 0 obj << /D [2293 0 R /XYZ 85.0394 743.3452 null] >> endobj 2300 0 obj << /D [2293 0 R /XYZ 85.0394 728.6405 null] >> endobj 2301 0 obj << /D [2293 0 R /XYZ 85.0394 723.1655 null] >> endobj 2302 0 obj << /D [2293 0 R /XYZ 85.0394 708.4607 null] >> endobj 2303 0 obj << /D [2293 0 R /XYZ 85.0394 702.9857 null] >> endobj 2304 0 obj << /D [2293 0 R /XYZ 85.0394 688.2211 null] >> endobj 2305 0 obj << /D [2293 0 R /XYZ 85.0394 682.8059 null] >> endobj 2306 0 obj << /D [2293 0 R /XYZ 85.0394 668.0414 null] >> endobj 2307 0 obj << /D [2293 0 R /XYZ 85.0394 662.6262 null] >> endobj 2308 0 obj << /D [2293 0 R /XYZ 85.0394 599.7666 null] >> endobj 2309 0 obj << /D [2293 0 R /XYZ 85.0394 599.7666 null] >> endobj 2310 0 obj << /D [2293 0 R /XYZ 85.0394 599.7666 null] >> endobj 2311 0 obj << /D [2293 0 R /XYZ 85.0394 591.7571 null] >> endobj 2312 0 obj << /D [2293 0 R /XYZ 85.0394 565.0374 null] >> endobj 2313 0 obj << /D [2293 0 R /XYZ 85.0394 559.6222 null] >> endobj 2314 0 obj << /D [2293 0 R /XYZ 85.0394 534.1777 null] >> endobj 2315 0 obj << /D [2293 0 R /XYZ 85.0394 527.4872 null] >> endobj 2316 0 obj << /D [2293 0 R /XYZ 85.0394 502.0427 null] >> endobj 2317 0 obj << /D [2293 0 R /XYZ 85.0394 495.3523 null] >> endobj 2318 0 obj << /D [2293 0 R /XYZ 85.0394 420.5376 null] >> endobj 2319 0 obj << /D [2293 0 R /XYZ 85.0394 420.5376 null] >> endobj 2320 0 obj << /D [2293 0 R /XYZ 85.0394 420.5376 null] >> endobj 2321 0 obj << /D [2293 0 R /XYZ 85.0394 412.5281 null] >> endobj 2322 0 obj << /D [2293 0 R /XYZ 85.0394 388.4584 null] >> endobj 2323 0 obj << /D [2293 0 R /XYZ 85.0394 380.3932 null] >> endobj 2324 0 obj << /D [2293 0 R /XYZ 85.0394 365.6884 null] >> endobj 2325 0 obj << /D [2293 0 R /XYZ 85.0394 360.2134 null] >> endobj 2326 0 obj << /D [2293 0 R /XYZ 85.0394 345.4488 null] >> endobj 2327 0 obj << /D [2293 0 R /XYZ 85.0394 340.0336 null] >> endobj 2328 0 obj << /D [2293 0 R /XYZ 85.0394 325.269 null] >> endobj 2329 0 obj << /D [2293 0 R /XYZ 85.0394 319.8539 null] >> endobj 2330 0 obj << /D [2293 0 R /XYZ 85.0394 295.7842 null] >> endobj 2331 0 obj << /D [2293 0 R /XYZ 85.0394 287.7189 null] >> endobj 2332 0 obj << /D [2293 0 R /XYZ 85.0394 272.9543 null] >> endobj 2333 0 obj << /D [2293 0 R /XYZ 85.0394 267.5392 null] >> endobj 2334 0 obj << /D [2293 0 R /XYZ 85.0394 252.7746 null] >> endobj 2335 0 obj << /D [2293 0 R /XYZ 85.0394 247.3594 null] >> endobj 2336 0 obj << /D [2293 0 R /XYZ 85.0394 223.2897 null] >> endobj 2337 0 obj << /D [2293 0 R /XYZ 85.0394 215.2245 null] >> endobj 2338 0 obj << /D [2293 0 R /XYZ 85.0394 149.4956 null] >> endobj 2339 0 obj << /D [2293 0 R /XYZ 85.0394 149.4956 null] >> endobj 2340 0 obj << /D [2293 0 R /XYZ 85.0394 149.4956 null] >> endobj 2341 0 obj << /D [2293 0 R /XYZ 85.0394 144.3554 null] >> endobj 2342 0 obj << /D [2293 0 R /XYZ 85.0394 120.2857 null] >> endobj 2343 0 obj << /D [2293 0 R /XYZ 85.0394 112.2205 null] >> endobj 2344 0 obj << /D [2293 0 R /XYZ 85.0394 97.4559 null] >> endobj 2345 0 obj << /D [2293 0 R /XYZ 85.0394 92.0407 null] >> endobj 2292 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2348 0 obj << /Length 2928 /Filter /FlateDecode >> stream xÚ¥ZKs㸾ûWèºjÅŸ{ÓØž-ÏÌÚŽå­d33˜¢%Æ©%){´¿>Ýh€%ŠÚJÊF7€¯_€Ì' þø$Ý0ñ’I”ønÀx0I×l²„±_.¸æ™¦©ÍõáéâïE4IÜ$ôÂÉÓ‹%+vYóÉÓâ«3s}÷$0çÃíÝõåÔ ˜“ÐçúnN/·g—"r~'Âü·‡‡{Exºœr?J¸4ñŸ—^³¢Im¥b™'œ»ê-[?g533¿Ë<ÆØiÌ ‚'PœÁÌâÁÌpí1KØfcª-Ìucfë>‘‘;¡îU!ëüc^*ÛŽh¾ÿ®Jãr­l·CNåñÈe‘÷½êF{Õ—ì=o†á§áË=v¦4°¹F1\ ¾?ÌÆT[€êÄÖý%_ç-yäêv…^‰xžV›ŒhÕ ‘ô˜ï|¾ù(YSQfJõÐc–Võ‚ÚènÊÕòÀ "ÏŠ{8ã þU6M¶#šªÔ’\­£j0 p¹ë,µ]ÌÈœve"ù˜wÒ ö]Á‚3õ‚ÍuÒŽ«ƒ4 F U½‡ôH÷ ¤=ÝÙ"Cç)srq¾ÊÿDÄT¬ËÊ6ÃjYÉVR ¡›]ë( ýç¼ÂÅnÁ"÷1‘qЉ0§‰FXBã^3ý²]¬·å¢i0jˆFhÄ.–/§!…K†ŸÐueR‹kRÃeA:’êFU[ê†ÔÖ}ÙÒŠ…˜¶Ìi¨´6'°Ôí¦ç•D!¯4Ü'½’Ç¡ëû1ïÇÍ{7{`Qbüï/À"|¸¦±3• Í5‹áê`‰F=mLµË¡îaXlÝ_”t·?öâÍœÅUµÞ^ÏyÑ帗ª6§ö—Àp8̤~ÒGg®Ñ!Ë ùN—Þv6þil !D;SiØ\#Ø. ›‘[Ó¨j ›CÝÃØØº»*Ý7Õ!¶º*Ú*aC†Ð×^´/RíEz†ö"k_Ñ S¶õŽšU^¶ûYó›‡ý´…\à,àâë/v@«ÈØQ{‘Ñ8ççªx¥{4ö>iê<]»¶g*Ÿ*‡¬{Ý¨Åøo` g,Ææ:m1Wg1ñX)4ªzo1Gº-¦§ûDmzxmP×¾ìG „Þµùîz\×³Ë pžÐ3gDúXÕk9˜LCXyìù}çÁq¶]n›ö«ÃG²©€áó0@óëá¾~Q®w9åpýpnK[fZÒu-_Ú¡’šáj Ae£5+Ì,hSÙw{ÝèS€AÙtT»Ú.WÓÎ!â{U¿ªç/ªt»†Ê¤¡1,\ð«ªOïk¾)—y™eµž®[6¯Ä ÇM.Œ¯MFW=.±¾é5ª&vÔ¥2Šœ ªÐ2%jB¯†@»qªˆ¡±¡éÔÒ%>_)bÓÊeÖP›Ê¯ÐYdoYQmp°¢0áÎízSdدj-½;/œ˜Ê-& *Ñ"§¬Z­ºêoƒP¡™Ki^Ü<0À‚R}…cn<ù›,Жb"UÿYUÛBS•Vl­r°xžjzz™Â:8~I¶ú`¬È~ ì†ÂóVËÈUÒˆ½B­(Ïô`SÑ—âµ0 `+•Z1†^ž@¼lÐÛeg˜sŠ÷Ó¬[M”›M‘ÓëY3gÖU^§L6y'Ä(¿kz*‹‚¨°¢5ÑöÕáhEFÙí )*¦2LÛyCLÜÇ«š$€T®{±ÐOJU¥©F÷ZþG% ¨SkuØâìá¶ʆG&‘ëÕ )ÛBÛŶ â§.|Rƒ¶Im 3ìê\ñ–/²ƒI/UQTïT`7“­.›ŸO@6á™Ë±Í¥"QÏ‘#÷ÒÐ’¥=9:T<{ãJ Ó±ÒžÓÄÜ ð׋žÒ'uIâ”Ù»:_h¦t4  ñ‹âh‘£e=A]-¶…ªÙ‚H{"’ÍWÒgÁNe)hXXQ̺€–…–Qj‘è˜/2Õ+.«Jº> ® ,¸è«ª íEšN¡hKÂsÚZ–LµYÃÈ{Þ®¨%éƒÞš§ÛBÖÔo²úm_á óAÖ¢û9Ø(ããûÃ÷VSì¡Á ø9-]@ v´tŸa€¢Á†ÂbC=¹x“¯Á§D°ØLÀ'sŬ(žCW$¢Ae™/¤y}æÝσ€ug¹ÄÚ7JÙÁà„ð“ÿìW¦*œªÕ/õÍ®LWkYm›ƒ»­¹ÙÉ+mœ¸p¼gž -¦Óh˜Î9à˜ÆÎÿ5ºŸ­QyŸz5Яnçä^Š€W´Rå# >f-„·7ÌQØ¥‡ý ýBgQιƒÿ9ÁÕ¥¥¡¾w!Ej™–wa#»š ëÆÌjÁ_+Ê jUq²7â7ZHZ•/4‚Þh3"Ñf€Ä}–Þ6ë…ú}ÎW¹¤Ùd)ýÐD, {ËmmNæ@´zÄC"-|¿¤–zꢗ0Ê{¡d#ÓW¸î_ šì0À)¦u¾Ù¿v‡{–²Ñ['1´>å p½|§{ÂÎEàâ¿à ë.ÿ÷úXo@‘+âøÄO'^¸094‹Ru¥`GK7ÿt¼öÿÓž Gendstream endobj 2347 0 obj << /Type /Page /Contents 2348 0 R /Resources 2346 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R >> endobj 2349 0 obj << /D [2347 0 R /XYZ 56.6929 794.5015 null] >> endobj 2350 0 obj << /D [2347 0 R /XYZ 56.6929 749.0089 null] >> endobj 2351 0 obj << /D [2347 0 R /XYZ 56.6929 749.0089 null] >> endobj 2352 0 obj << /D [2347 0 R /XYZ 56.6929 749.0089 null] >> endobj 2353 0 obj << /D [2347 0 R /XYZ 56.6929 745.2843 null] >> endobj 2354 0 obj << /D [2347 0 R /XYZ 56.6929 721.2146 null] >> endobj 2355 0 obj << /D [2347 0 R /XYZ 56.6929 714.4694 null] >> endobj 2356 0 obj << /D [2347 0 R /XYZ 56.6929 699.7048 null] >> endobj 2357 0 obj << /D [2347 0 R /XYZ 56.6929 695.6096 null] >> endobj 2358 0 obj << /D [2347 0 R /XYZ 56.6929 680.9049 null] >> endobj 2359 0 obj << /D [2347 0 R /XYZ 56.6929 676.7499 null] >> endobj 2360 0 obj << /D [2347 0 R /XYZ 56.6929 652.6802 null] >> endobj 2361 0 obj << /D [2347 0 R /XYZ 56.6929 645.935 null] >> endobj 2362 0 obj << /D [2347 0 R /XYZ 56.6929 631.2303 null] >> endobj 2363 0 obj << /D [2347 0 R /XYZ 56.6929 627.0752 null] >> endobj 2364 0 obj << /D [2347 0 R /XYZ 56.6929 603.0055 null] >> endobj 2365 0 obj << /D [2347 0 R /XYZ 56.6929 596.2603 null] >> endobj 2366 0 obj << /D [2347 0 R /XYZ 56.6929 572.1906 null] >> endobj 2367 0 obj << /D [2347 0 R /XYZ 56.6929 565.4454 null] >> endobj 2368 0 obj << /D [2347 0 R /XYZ 56.6929 550.7407 null] >> endobj 2369 0 obj << /D [2347 0 R /XYZ 56.6929 546.5857 null] >> endobj 2370 0 obj << /D [2347 0 R /XYZ 56.6929 531.8211 null] >> endobj 2371 0 obj << /D [2347 0 R /XYZ 56.6929 527.7259 null] >> endobj 2372 0 obj << /D [2347 0 R /XYZ 56.6929 501.0062 null] >> endobj 2373 0 obj << /D [2347 0 R /XYZ 56.6929 496.911 null] >> endobj 782 0 obj << /D [2347 0 R /XYZ 56.6929 464.7873 null] >> endobj 2374 0 obj << /D [2347 0 R /XYZ 56.6929 439.0859 null] >> endobj 786 0 obj << /D [2347 0 R /XYZ 56.6929 352.4521 null] >> endobj 2375 0 obj << /D [2347 0 R /XYZ 56.6929 326.7507 null] >> endobj 2376 0 obj << /D [2347 0 R /XYZ 56.6929 290.6891 null] >> endobj 2377 0 obj << /D [2347 0 R /XYZ 56.6929 290.6891 null] >> endobj 2378 0 obj << /D [2347 0 R /XYZ 56.6929 290.6891 null] >> endobj 2379 0 obj << /D [2347 0 R /XYZ 56.6929 290.6891 null] >> endobj 790 0 obj << /D [2347 0 R /XYZ 56.6929 241.4457 null] >> endobj 2380 0 obj << /D [2347 0 R /XYZ 56.6929 201.7704 null] >> endobj 2346 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F14 980 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2383 0 obj << /Length 2293 /Filter /FlateDecode >> stream xÚ¥]sã6î=¿Â9yf­"õÕ·ìn¶“¶—Ë9éLov÷A–¨˜]Yrõa×ÿþ‚’e[Iö®Éd @€øTøŒÁ/ŸE¾ËD,ga,]Ÿq–n®ØìÖ~ºâ–fÑ-ÆT®?‰p»qà³§|Ä+rYñÙSöÙ¹yx¸½ÿx÷û|áù̹qç Ÿ±ûáöq¾à2Œ=X‘¸0çýÝýG¢Žéññþ‘€_ïÞ/o–s:ÿ!Äãoÿ2ˆ§ù×§Ÿ¯nŸ†CãLà‰ÿ¼úü•Í2Ðïç+æŠ8òg{xa.co¶¹’¾p})D)®¯þ=0­š­S†hBºQ<^7§»ðÄ`N.G挌hÐS¡9¿0ž«Ê™„M2œù]H¨.ÅzÞH,gËàTìMƒœmR·ÅN•¦]+î–zU'õaÎ9wÞ*àN©öÅVõf[¨*[•¢i“2Kê9œŒX'Yf^UÓ,Êdcùo’íV—Ïô’weÚêªl¬€gÕ&Ù Ê.8wcß÷ÌɳZ—yõ…ù þ8P‡¡ˆp S ÃH:t Eô[óRít¦2pRîú´VZìKE–®à¯·Éþ„É.)t–´¤¼[«b§jÚ·JÒo“:¨2ƒc Áèä‚K'­ºÂ€‚€¸ NP˜d»¤L•%ÎUÒvVž%Íi¯93"(èŠéA·¨û M—®iKb1i’®AÐÆ„žº >y¨OøÆ&™sgg$rjñÍØ°r?„Z.ÒªL»šø”-úbQæ~­Jz#aÿÈÏìi’î÷h+¾+'¯¤ÙªTaÌSjã¾”~‚X¸’ þz"S½œª7Á«R‰àBìd"8{ƒF |GýµUµÆ8N Âä5DÒ¾ª¿ákà´¡›n»­0iàKï¡È`{ »î\'VˆuJ€â4hHuÙ˘À®¤ù6åuÍ¡iÕÆÜè6ê/1Ÿ-<0 ÈÖÓ†PˆÀ;9ƒ2õP«ZýÙéF·Êr[Dy¾x>íüéþ78‹' U}Có<ò"ÀŸ'2ÂÁsÕḭœp``2Àc ºsoIX¥œŒ‰jxZ»iLˆÔX€¦ÕEAK+un÷ïµ 5ädØOø}{Øâ1¼(  OÔ–b`!yèÜ•„¦t©¼ÑefÝhg»Ö†—ïdUÚ¡3aö}ç‹çIÞVˆJJ+ט¹l…ÞW­êy&-AÚ¤©6vm[$ídjÊ«zƒÜc檉cà~ L©L©ï —t¹«ð†—Ð#Ó9ª™+›{ ƒµ´’V› äEå x—#îLÙ˜ò•r1µJ/6ëÏ=-bÈ "b°«N“ÖG·)÷FFƒ–‰Œ6 ¬9„gÃàCµÙj°&j³SòÓ(¡ëG,4˜/Øã^C.ÎõsW+B,ªLV…ZgƒOþ³ue„ó"yn¾Nßr5‘5ˆÚ2_†øÉøsì»#”ÒÅCqkcô„¡hªBÜÞ2>»¦Kìf („bzØŽàr^CWbøà5sr |4 bsب–t|ŽÂÚÈ£1GX«äÚf‚©ÞƦ“´­l¿…Õ:‰OæCI°ßz7qmœEPVxL‘×QÒuV6×ð 7™06— z[_ÚT(c›¹$³­4;E+X& ›%‡"óÀÐ 5Ô H²RÏu‡l»‘ ù© èj$5.’û4-È¡ƒì1á<k´“Žˆôã;%Lטn ©Íyåi_„xr0\HЦ"he%ØÌj8ÑÝöœ&RÐÈþ9eCñzzÇ…®Û(E/+UTû¡ùŽ 6¨ïJ輋ÿ1ªÓŒž¯ûå8X ¤IÖ÷F®çÖ°õ›ÍK©æ¥Zýv!˜œÌlö{s#žÊç†Ô¨‰#Äêp¶ Rn€UÑ&­†…¶œ!¿áÞçnèòñHÛÉv‘¼ Û~¼¼LåIW´?Rsû°¼ýt÷;†Üõ ²y<ChR µJH%âWÇ«jØb€;WP§ªbu8›ZÎURC—iÑÁ„&L^š‘ÕÖÆóÏ´ €È*k9† Cá,«ª%6ÛZït¡ž-Wô |–PªÁÄÿ¼¯r§BËÖ>8Ž®'1ý ›ÅÈW1 ^öU?p¹Û ¶ZÃÓoø¬Ÿ„±€l_Œ]ëÖ¸Xmƒ°§Ê 9w!Ë P#¢ &6æ0wV}-±b]íO«–í%9µ2¶žTû¾Ò“žAäíEÑѣ̀~ãÊ»Ì^¹¾'åe ±)ìúŸ`ÖnqaSx¿áÄ«¶´¥$ÓÕå„á#áQàY1Ó½|Os‘ï¤Íw¿”Æ æƒ’ÊáNšë¥jÚZÓ‡„—8@Ääܘêån zs€{Uêq€»;9Àˆýp2ßh0á–ÂCP˜XÃg‰±ˆ€âLî€×Û Èwƒã´‚ðYÝ26iàÞ.‘ØO|)Úˆ8ñKD˜‰••@Åt"'%M_ñX¨Ù«9÷}WúL¾qŸ#ªWî³§zû>_“:ºÏs±Ó÷9K^"áÐtÀ¼¿TF¹ ‘Ë¥é:$ã˜b¯¦m‹ì›ýpG'ßNìWšèäúÍÖ’žm/zèᢋÛYìÜå´dF+ö‰™Ú¡¾™ 8¢oX/dîpг:áØ8Ò WÐBi:–Ž™ .Ó>÷7ŠCßfœÈ²‰œ#„‰¸§Ú¯ua‡H;B£x“kéƒÞqàõÁûxÁÏD‚…¶êÚ³IÙªJ¹’Ì Exêìc…±dÐż³@©ß•%±3Hqøñ….oÔ~½9»åη¨ks“ÓÛ;‚W%0þ5=ÿ}Ï ÷Âòÿ?]¾}¾‘Ž_§œòÕVx*åW1ùQž %ìoÿ{☻dèŠ(ò¦sˆ€\Sï… qÁÏî (Ô‘Nœý¿Ii»áendstream endobj 2382 0 obj << /Type /Page /Contents 2383 0 R /Resources 2381 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2176 0 R >> endobj 2384 0 obj << /D [2382 0 R /XYZ 85.0394 794.5015 null] >> endobj 794 0 obj << /D [2382 0 R /XYZ 85.0394 662.3711 null] >> endobj 2385 0 obj << /D [2382 0 R /XYZ 85.0394 634.4781 null] >> endobj 798 0 obj << /D [2382 0 R /XYZ 85.0394 566.8617 null] >> endobj 2386 0 obj << /D [2382 0 R /XYZ 85.0394 536.3186 null] >> endobj 802 0 obj << /D [2382 0 R /XYZ 85.0394 411.7882 null] >> endobj 2387 0 obj << /D [2382 0 R /XYZ 85.0394 386.7645 null] >> endobj 806 0 obj << /D [2382 0 R /XYZ 85.0394 230.2565 null] >> endobj 2388 0 obj << /D [2382 0 R /XYZ 85.0394 203.9874 null] >> endobj 2381 0 obj << /Font << /F37 1042 0 R /F14 980 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2391 0 obj << /Length 2527 /Filter /FlateDecode >> stream xÚ¥koÛ8ò{~…±8àd bùгßÒ6=d»Èöììí.Ú~-Ù*K^INâýõ7Ã!eÉ–®*r8œçI‹ ‡?1ñÄ2ž„±Ç|.üÉr{Ã'kXû×08®ErûXïoÞ~Rá$fq ƒÉãªG+b<ŠÄä1ýêÜ2MwÞß?|œºÒçNLŸsürÿ~v;›ªÐù“óß¾|ùU§®ðÂX:·_¾Ü=|¼ÿƒn‘&çúán>ýþøóÍÝc'tÿ`‚+”ø¯›¯ßù$…óý|ÙŠ#ò ÎDËÉöÆóó=¥,¤¸™ßü»#Ø[Õ[G%8“*#šòDOS‘`~û“ÐY ¤ÒšúÇÔ àHÛäGvñ02b^½rIG$ÍYx=Ρ†Á‘2þÆExÊ1j"’W9Zœ3ŽR޵Çñq“M]åùβȳ²Å±çl«t_xR¦4h Ósîgs‚ù¢NêA—ûºžŠÈ"ÅÖÓŠ¾eeè6ûÝ®ª[‚‚ÍÍï>ÐÂSRäiÒæUIkû&/×í—)ØÜP+pVWû¾4Úò¹– íp_¦Y]ô>œÓš,“’8Naväí,ö- €Á ˜Ýee–÷e²èv—mV¯’¥™¶'ë¡t²­²¤ÝeY°KFÄ!SxòU«êc]6«ë5»ºÊ´3¬3¦£–5`:û·+Eà€÷ ù¤Q€h‹@€±ˆ,%x^˜4kúVaÞ´û¡:›ªx‚;ÓkÕêdsöBÖ†@k«B"–ŒcçÞ0ƒKÔ– ˜Ä¨œxG–ÔC¤ ú¼É´Õ¸RIÚ®”Ólª}‘¾æÂiëim–’r¹©ê†ðŸ†‹Ì¬Ó´94m¶uŸóÔÀ—Uùs¹ÞׯMôþM¾ÜÐú©mR&kÐìˆç,xÞØÑn!#'I·y™7-¯êiè9o ÕM®PI«00W£î ¦Â¡[às^4Z˜ ûF_/°±l+½3ÍK=´ »]‘/õÑÂÕZ+ %‹EŸ²ª·I1v.`¥Å¿ìažd2‚ŒrÝÃzXW<Ìb½êaט=ì”鸇õ™>hó”ÒIHçh&Û-Xr’çB…€ïOÜø6k—okí= ,kE Á“#?°ª]w5À­ ’À±ïÁ°¦=¾Æ\e „œx ºÆ#!I§*‹ƒ¡ý”ä…¡x½®9‹= ¯ù(Ä6ÚÚx ¶ØÀ$éGôoRzi¶Ø¯q`Ö1¿Ùµ2­ÚÌhDL:¾«‰ ð˜ÁÄU1SBuU•¥‡‚áÑü´lH¯zö)§ãœhlW,ŒÀ”ºL,£Ðh, Žù¡FÏ -iÇ(Êš¤OU²Ôœ Vσ¢D;3 NŠ„® uú‚…Ö A! zBΪª zÊaÄwIl3H’ ²R7IK#«pˆ1‚¾‡JʤM.“]²È‹¼=Ð ýèh\JpÝ̳³ž Ú«`âsy~¤3,­Õë f½ŒlÑÝ>þyF>£Š‚̳eÛ¥ž€A®§ÒxÜgÂSþ@œ³² ÃzE ‡P€bPœÆD”µO†mÇhJS¾N°ò,§&§Í“íÎ64·ý*íÕ„6¯Ð ×–¡ià¸WéÀDÆ5·† ¶ûã]ÈÒï ÷†€u½Þf «)AôÑq@h+ÓÑA‚Ę$M˜EQ=w¬ˆ‘À"§‹:ÏVcy-ÍšeïŽ×lm¡±¾ÑSñt © S’Ü?ê› £qÒÖ;2éÄøO~¼S€Ã¨>ö?Ø·”+_½˜{ôBJ7È^ ‘ ôáí)DŸÊ®(g?e%!ï úÛ%‚C ´¿®'…€vu T§!’hl+(ú­“-fû/pݾ[Ë]Ô6ÖP@=w]Û=¬+Ú¶XxÖ¯®‰ÅI±®ê¼ÝlÕu33rÐ*¶c ä~î€M[c,8‘\‚T^Ìãë¢wX#²÷/ H¨ã4¾»(%(à nÀKtÓ‡•Ô¾pÉ õH©lž{/.د{, e0ì>Ùr${ÑÁãÍðÍtÜŠzéÙüDñùîÏ¡9rP#nßÔ“±ÏOè(µ”GµMo£g~ÿÑèþ¾–Ž¥4úøôyyyI´î KyÅK¶˜¦C7c§±¯ë)ÆãØ£‘8hyøíÎ,|¦ïO ðOcŸõ;²2ˆm–h CnÚwš‡i3ÁE HèówUfÿ4ûðU‚ð`¡É×%Ý(í6O!•î‰%[VÏ¥!Ø£Ò``Û.X»+ÛÚÐÝUù‡ž×]DÎïa38îÈË­-Õ6oé+ª&i6‰ ‰yÊÄ_ì E\áê⃣òþR5âѼ«ÃÿïÄŽ/—T•Ñ¥^A†Ð±Ä06B¡„’ç‘Ôütv.û<-endstream endobj 2390 0 obj << /Type /Page /Contents 2391 0 R /Resources 2389 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2397 0 R /Annots [ 2394 0 R ] >> endobj 2394 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [344.9397 501.3201 406.1397 512.7122] /Subtype /Link /A << /S /GoTo /D (trusted-keys) >> >> endobj 2392 0 obj << /D [2390 0 R /XYZ 56.6929 794.5015 null] >> endobj 810 0 obj << /D [2390 0 R /XYZ 56.6929 609.3932 null] >> endobj 2393 0 obj << /D [2390 0 R /XYZ 56.6929 583.208 null] >> endobj 814 0 obj << /D [2390 0 R /XYZ 56.6929 484.1849 null] >> endobj 2395 0 obj << /D [2390 0 R /XYZ 56.6929 454.463 null] >> endobj 818 0 obj << /D [2390 0 R /XYZ 56.6929 405.4622 null] >> endobj 2396 0 obj << /D [2390 0 R /XYZ 56.6929 378.8348 null] >> endobj 2389 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F14 980 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2400 0 obj << /Length 2458 /Filter /FlateDecode >> stream xÚÍZ[oÛ:~ϯðÛq€c–w‰yKÛì"»9Ù&vÑöA±åD¨,¹’œË¿ß!‡TD[¶Hv±(ZÓähøif8ó k6¡ð‡MRE¨0r’Iej2_ÐÉ=¬ýõ„y™Yš ¥>Þž|ø‹H&†Íõäv9Еš¦lr»ø6=¿¾¾¸ú|ùÏÓWtzNNgŠÒ0ûéâætÆdb8¬H»¦éôãåÕg”6øñùê»üøåüË©H¦ÿ‰›¯×׺‰ÛÓ·œ\Üö ‡/ƨ°ˆ|ûA' x¿?N(&U“'øB 3†OV'R ¢¤a¦<¹9ùG¯p°ê3”T)Q\êÉ „ÁNlÜœ”Pæ™%’™jÙ›“³1s)kÎY‹o¾¨WYQee·ýâLJ’JÀ0Ô~ìÕ91išŽ¿ø¬×x08’¤B¨q›7y³ƒ2Ñà–„½#Ê ñÊÄj”‰Qf‹E“·í6LÎ1JšæŽC{©‘­ù`kÎRb„[Zçóbù~fšÁ‡¤`´uÖd]Ž“Í)K§ù|Ó´Å£ŸòVu»“h[\\Ö º‡Üë³{|§”Ïqá;çCÈŽàà šL/žgöýÁ”p843ÆàÅG­Öe~¢Œöa˜?»Y2¯WgœRv¶¸KÏÎrç<ú ×Æ)ð@î?C©ý'£—:gàÁD´íÛÂÌ+<‘1MeiŒqO”A¢ LÓô°qz©‘­‡QÆ SñÖzìòú;UôQ~xÔ0`8GLÔKüÄ‚Áv*ú‚V®ÆÏ§‡bþ€Ã_›¼)r¯/ÃçÃUGöƇ6Dp°ûáøHˆ e ðP·]•­òãsƒrhã 4²qdz! 7rkçÞˆxâpì ¸žÖ¡±­é^,έ÷šIC¸R“™h!\…© ‡:J¡°¶î<βö¥šû³šy«vÅ»Í÷kÞÖ¥u£RÓß½ëægQÝ{ÇYEM]Õ›¶ ˜†¯L!ý)@%1™Ý«¢Ìì q…QÁµË6ÌŽì6‚Nï6Jeóy¾îZÍp®,Z¿ê"ÑꀨuvñQ K½9aÙš³õúÂ'® R)LÚXúqV-PÄǾ5„]ÑëµY‘neC4Œ}2‡16%½l ‡P¡‹¾¶Ù}ÈœC¡‰¿…d:žÁ8gD =QüL¾=}³Â‘RU˜Œé· é˧‰{‡ƒ/_vpJ©Ìû 7‚$B¦òîe{ÈEµÞì&!ç“wÛ+< VHM4$ì¬QWйo%š‡€2NâÏuWÔUÈ­.Œ-¹vι߬ ¿¶gû¬Œ¤F¡¦C©ý ¶—RÓ=…˜[ú,U´ÿÛ*qÐx,ãˆ{„v_){ Ãåa3õR#[Gõ@ H IŠ·¶9Kj(ÅGqý• f=XðNïÔ_©0ÁL s¡þÂðµþÚ úúë´õ(ŸqY`è¹tÁÄBò$‰aUûÐnÖëºéòE8g¡ª>0\²Á™Ùèuy|OŒÊÔ@3æpŒ¥öÇh/åbtoºbÔÀù‚`j}[|G€2Æ ‰Ž‘ÚŒµƒQpB5OÛ§—Ù7&+ ¡R²xß×ndÈHÀ^8aQ3DoËÜmÏyòe¶)½ÙC$ôõ{ù ¤]7E…þcá\³àý5x7G±§¢{ÀµUQ«¬Ä/kdÐs(9àlçTÕ#^Ôy[ýæ¿À«{ˆã|ÜòuŽ­v7ðm„]3s£§E‡ËmW¯[zÂÏ·á\]Íýjxò>džE€^¢½Â+ÃÌU­¶vˆMÉ(Ú9,6¨¯83þ”U/ó¦³$^÷P$LU® ‚)[à?]ÿý¿¢$ƒ¨‚)ßI ›³GOõ¦\  îúkSôÜÖ—›ÆcÃ_ø‚I0MPšã ¤px—í¾¾ã bzéQ×Nñˆk¡!µíïÛŒbÓeÑùbq¥‘Gåþ`…¸Þ=·,M‰N(vßEq?rº˜$FŠÔËOÓ)Ð}&¶}Á¦yȪƒjУìéµm ›p¨{:]ÞÜR³¡Ê‘žJ¢)tƒ½ØV;ˆ°‡W,ÖÐBj{]ñ^­ ‡J%ù1.0”ÚÏz©˜ŽÒ.ži{°ƒû÷R#âr+ˆT‰Šü¿Ñ.N9<9fêÔS©ã×´C…ïsM{bMa> endobj 2401 0 obj << /D [2399 0 R /XYZ 85.0394 794.5015 null] >> endobj 822 0 obj << /D [2399 0 R /XYZ 85.0394 650.8348 null] >> endobj 2402 0 obj << /D [2399 0 R /XYZ 85.0394 625.7398 null] >> endobj 826 0 obj << /D [2399 0 R /XYZ 85.0394 378.0874 null] >> endobj 2403 0 obj << /D [2399 0 R /XYZ 85.0394 350.2627 null] >> endobj 830 0 obj << /D [2399 0 R /XYZ 85.0394 153.7325 null] >> endobj 2404 0 obj << /D [2399 0 R /XYZ 85.0394 128.6375 null] >> endobj 2398 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2407 0 obj << /Length 2393 /Filter /FlateDecode >> stream xÚÅY_sÛ8ϧðtîAž]sùWsOé5·“Ý6—xgî¦ÛÅV]m˵”¦î§?€ eÊ–Îv(Aø€ÅˆÃ12)K­´£Ìjf¸0£ÙòŒ`îç3áy&is½žžýôw•,³©LGÓûHVÎxž‹Ñtþ>¹`šAO^_½}3žHÃK7ooiðÛÕ뛋›±Ê’áö÷ëëwŽ0O„άL.®¯/ß¾¹ú'1\ LÎõo—·ãÓ_Î.§ÒñÆW¨ñ§³÷øhûûåŒ3es3z†΄µr´<ÓF1£• ”ÅÙíÙ?:ѬûtÐP‚3©R9`))‡,e,K•TÎR¿7ÅCy>ž(Á“¦X®å䡨h¿uÓ®Še‰»Y"’ÅG¥™ÍyÚÙ;eÌÆy'çi=/Ú » ‘M…S4žoAx5£b¦ñlQ•«–ÆëMý°)–^ÙWA›¡\á©NŠÙ¬\· ¾(·*КjõàV…q·ŒgõrY¬æž·ñzs“EµòÜÅf,òäái Êýˆ¤,iÊÕ<|¶"1±|÷Aùé©l¼r˲A{ÓK[ã®pB0kŒtûhaZ©4)žÚÇzSµE[}ö¤¦Ü|.7ãL'°¾2Yâ”w3õsCÃN­Þ¬ëUã)÷ŽT/÷wb]ÐäÉÕŠ&j`ÙÐð¹vßηrW~½ð,¼0<áêÎe9vœx·«ÆÛëð|µdÜ…;Fæl5 ĉșέ9æÃ±;½¯×mFø@¯p˹×MèhE‘jÆ•~É(%Y–fÚ3ÌËEÙ– OxÉRêxaH#ÕEš²œst§ÈyGºÑ䋈4‘«5ç(#X&D:JyÆŒÉåT ¦IÌE  @¡ãB¥&>ZÑ÷Ïsà@ŠÅ¾„q"χn¾ ¨„@é)ê=wOE!,“"?mŸÀ4°l|àBjÔZõ×½À`·"¹ºÆ'j>÷ÑÖÐD}OÏv, 3ï4’¼þNFûX´D},šþ[ⸯ7^*‰äÉ×zå%ÍêU[T+ºKˆcmÞ»à¥*ç "<Ä}jódJA DÀ“§bKf“U½Y‹Å–fîJ¢zäˆÐÕ²Øl‰ºZ(ÊïÇ´GÇ`Éá&€CÒ´A`ʵy¥a·ˆ¶JˤX45‘œ^ð,h¢)Á"sÒKï c¯ŒÜnX°žèçžÏK³?öω½³LFßÄŸÉîº QjÒ™Ë]‡ò r£“:?ãÓñL.Â?’Ë-î|Qî/o-3¹°'—<‡Ë÷"ˆCRùFoý BëéíÕÏ0â!’WÇ)aÓ§?úAwÀÔnŠUSÌNÁ[`Á=Ûn—îõº¥¯œ Ä"LxÜTÑM9fú‚J¢¥†ÞÜhÔîR£Ì¦­ÂBˆã§¬!{Í5d¯'9æ:~Η;èuÈ£Ê ¸iÕTíÁY ©˜•®žÔ¢ãP£˜9³<Þ“?pi,¨áŽ1D ©ÙP7ã);#Zwi×+Ä œ!Ô;)Î!²ÜyB³.g>-Á›a¶’“‹àô $ÐŒ).Eÿ¬ƒ ¡i+{wçO.ä.ÐnjŸ™ð¯ô÷ýÝvOÄŸq!8­_Êb®.¸œ mH‹ Faƒ¸¾ï?š,=¾+'è$¾ /„é4ÝSøHV ,Zæ§ Õq ¬Üór yÔ¢¿²Ë ŒÏ ŒÜË ŒÏ p‚^i2˜Õ‘º”ÀÈÎm„O·‘|Á‘Ÿ«Å‚FO ^âJŠ´E/‹-¹w ùÔi߽3¬XÂu…xìœxyiu¿ï´û Îî‚£é¾1vâž«Ù㞬ØýûeTDP~µÇãA@6¯sõBÌ}ýÏ£Úÿº¥}iendstream endobj 2406 0 obj << /Type /Page /Contents 2407 0 R /Resources 2405 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2397 0 R >> endobj 2408 0 obj << /D [2406 0 R /XYZ 56.6929 794.5015 null] >> endobj 834 0 obj << /D [2406 0 R /XYZ 56.6929 740.3318 null] >> endobj 2409 0 obj << /D [2406 0 R /XYZ 56.6929 714.7319 null] >> endobj 2405 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F14 980 0 R /F60 1366 0 R /F41 1238 0 R >> /XObject << /Im2 1355 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2412 0 obj << /Length 1890 /Filter /FlateDecode >> stream xÚ­ÉnÛ8ôî¯ðQj–›¶™SÚ¦ƒE›IR`i²DÇBµ¸’'óõóÈGÊ’­$t’ƒžÉÇ·o$›SøgóÈ'TÄrÆ’ø”ùó´œÑù=ìý1cgé–C¬w7³·E8Ið`~³Њ"6¿Én½³ËËó/.þZ,¹O½3²Xú”ºÕ÷ç׋%“aÌaGê½€zï.¾|@ì?¾\#ðùâÝÕÙÕB„Þ߸pýíòò«Y¸YÜÝ|šßôBcTh‰Înïè<ý>Í(qäÏ÷ðƒÇ|^Τ/ˆ/…p+ÅìzögOp°kŽNÊñ#NXŠó)Kù1 ÆRÍ‚Ež*ëÕ¢vIQ pueWÖu〚dOURæ)QI¹-Ië7wm^Ý#Øm÷ùƒªü¡žŒ1h“`l /… Œ9çS€(8­j·M½R¿-–‚Q/«Ë$¯Þ‚ –E«šeåK7*ýá~ä–q§šÒ*R¯­fß# i(­<|,—$–Ly.:àøH¾E8Ñ Üíž&­¿(ŸEêj‡¥ìÂÆ(¿†Pþ•oDn¥6ɃÝHë=—vÅÖ ›Ã¨ðP*­0¨©cŒÄ¾ÏbZ}Kïf“ë3Œ{øe@.-v™ÊÜ/ÜEÉ`5‡ÃC/˜x@xkd«ï›¤´T)4Ö¦Þ#dIõ¸­KµÈWMÒ<áFšT¬îîÚc¹’)ý …—h¥"éô ßÛm‘§I—×é…$@úз6¹wѦcÏh²²Ñv»ÌîôpL`rw‡Çn—© Èbæ¸Fp? Tb@†<ÿK•à$Ž¢hºF,{ŠË!ÉÓÀa— Ÿ8k…“,C#µ­Ó-¯¶»îXnÁ Êþ?¹{НÈ-xL"Åc¹¿SÊ ug|ù*IƾóedP¾nµ›Û“*M õ¡Ø:Xh<Ý},Îr€„’±‰’ê4Óev̪²”òe~ç”ßÐqL$÷ÇüšEäíª£¢ç*ðwÎe¦V»{ àRYgŠ` îónãä®H›!|ÿûÜu‡lWnRP¿žŽZFÞá×Ö(} %Ϲz¡œ±—ý0ÄzÞ=–ñÄÉ'‰âà–i‚åȉÂðˆ%TMÔ9i­ÉÀ:«ºÍ»§qªÁE¶SUuS&Ö¬Em{h é…¨µžºéýcŠ¡œOÚ­Js ®Â•»¢ËM-6žÍÔ³¦÷9aBðWL?ÀzÁô˘þ¥ È8%aàÙÿR%é)¾"+ã‚„þ‘¬º‚µO¤ô#0ñ²Òßa¬°Æ¸XŠ1cã¹µir±gz§ÞÅ¥ý}(˸a-|Ü·©µkÚÜ °óúT1âÙQƒ÷£R(==óÂéQzk è«-žÂz08eª, £ŒÄ¸ËbkçÞ½›lCçžž õ÷jÁ¼«£CФ„pʱ¼Êލœõoõ j–àûÿ•¦kgŒµÛîZݲc–™vÈ&55/dj@îØ¼MŠM!—zŒ‡r‚°gK™„¢ „|¥¥ ±žÏ§ ëÊDGfŒ_ˆ`Äö×òÈQ|EFÆ ž¡£Œ…ÄŽ|šíБi$_6N5Áy”I‚“(Š£1g4vØùjP]u_æz¢w,r‘·B&"á{ˆCÌ¥êJÙD²[MÈÃweyõi”é‹"o¿Ñ÷C»Ì;3{šs+RÛ%ÕÒN.à)¢£HL ESÐë|ºØò蜅ôÒŒaêñÎMRéõ"¯,¶œÀ #zÎbÜ÷¤ÅÍ?úbWØ£ÎDv—0ÀØ9®‰=ªÇ }E\Žó ›¤½7j#6ó. I5¤R öBÙÏ$rÀUô\%ô¹¶Ãµ•r'.$[õˆKt4ƒðÚÚ­Ø+¾ð´£qI»}WùûÛöæ‰b¡¥ßÔF‚˜apØ+¦Î °a _½·ßï1÷†wg½¬CLÇàG—>îh Ô¡LUÝÁC° `4‰i_õÞÛ‡XxŸª|.ò9ºõ €2°ÅÖZUe¦„¦óÁ–­Å°ós§šÜ¤,›á&èZ…û‡«.¬c±Ö¤ëÒîŽæBËMdghR½‹é7M»*s“T?öj‡þ~4¥IQàÄ{̲þɺç0%ýÜκÛv´f'Ìì$28z¯ñ=PW…O È†ýCGhŸ9>» ¯™£ÕZ5ªJQá—_'δ·1ýµY# 5y jm¥ -·Çª¿k7„ÂA­k™T»¤°ZÈ[xC[úê1UÛ 8tIMw%D­EÚ¨%\±nÝŸšH˜p°™µ}k²IòÁ2\P›²3¿p±zÜIe®ü­N¶7G.vOGÏ#^æ-ƒ<÷Þ^ÕtöaðËo‡QEÏÌš‚JhŒ1sBi2á‹Þ¿žÊþ/*ßHÍendstream endobj 2411 0 obj << /Type /Page /Contents 2412 0 R /Resources 2410 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2397 0 R >> endobj 2413 0 obj << /D [2411 0 R /XYZ 85.0394 794.5015 null] >> endobj 838 0 obj << /D [2411 0 R /XYZ 85.0394 741.6375 null] >> endobj 2414 0 obj << /D [2411 0 R /XYZ 85.0394 716.9352 null] >> endobj 842 0 obj << /D [2411 0 R /XYZ 85.0394 420.5643 null] >> endobj 2415 0 obj << /D [2411 0 R /XYZ 85.0394 393.2598 null] >> endobj 2410 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2418 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj 2417 0 obj << /Type /Page /Contents 2418 0 R /Resources 2416 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2397 0 R >> endobj 2419 0 obj << /D [2417 0 R /XYZ 56.6929 794.5015 null] >> endobj 2416 0 obj << /ProcSet [ /PDF ] >> endobj 2422 0 obj << /Length 2012 /Filter /FlateDecode >> stream xÚµÛŽÛ¸õ=_a }ð+†wIûÔÜÚÌ™Í}HæAcÓ¶YRDy&FÑï!)KybQ 0&ÏýF±…?¶È¡"—‹4—DQ¦«ý+ºØÂÙß^±€#• J ›™ÓD‰Œ¨Œ§‹dLäíý«×ålÁ)Ñš«Åýfà¥Ó”Ð|q¿þº|Ó¶¦^—?o®èòíÍÃýoxK’4K™»ECJ´PÚßøTÔ‡¢Bü¶Ø;Üa’©y¸£ÑTeþÎ[ÂnF)]®Ë­Ãw"%Bkã®Ø›@‡/r’k®ÁˆÈ@f‡å.{¾ß8Oqõþî .ª¦ù~hq}è˪ì'ÁɕЂIFxÆP™/Ǻiméuxõá~°©¦„ °¨dš0•‹9»3“+yÁ)% =sìN$¼O$i]2` zj°Ö׿XÓ=™î!l“GÔI‰ FS¢r­€¯»\¬×±Á+^ x& xÍÕ M¡H¦U$¹ªŠY‚<'Y–æç7W nÊÊԃ˧B¦$ã4=§ùýÿ@s?¬Úê‰pQ¯²l‘ ñ·Û¦ëÿtÉÙ9‹Wž 2$gTœÓë¯Òëíÿ@ïçUz.œæèIÂõ ϯ’ûºÛ«_œÖ¿~7ÇÊ9%2§úœ´VúÁWDå\P>õÏWG:â:cĵâ¸ùq0ݱi{BÈÃ¥Ü)'2e$÷Ç$.çþ€5ÍýdwY4ʼnÎEúGD‘øÑ"ÖT´mÕ<U2±bÂø`ÙhÖ+Õ÷ý‡/ïþqû÷ûÛÏwö¤øs—ìTü_vMDЈߨ¢ëf_”54I—e½iº}Ñ—ˆ|¹ínX¶lZÓ* HÏ Ü~£T˜ŸåceÜ7M…'@+’íM‡”¶@¼Þ"&ö"8÷9íAX¾-¹IM—·=B½“Ë"¶»æ:ê2‰gìk€*ˆX¯aÁ]µmU¸ßµ}vZôáš—5ààº?tµYãñUÙŸC-µpƵh6w|",#}ع(ÍTV°ûÔØ>6ü±ZÞVB3¨/û².oØÒö]Ñ7^x¬™ $t>tœ !ÓбÚ÷ ìQÉøÕîšÆ‰®éIŒátoñèѬ '…?n6ø[öá4F  ×ò8ÈÀ Åù@„zï¡£%F¥h»lçˆùÆ]ö¿‡¾=ô.~]~ßt/Ç¡6,‹âï®x2ኛ üjs¨W.'ŠjàÞ¬g .\5Q*ý}ƒK’K{‰ÕY’,Ï蘓4M1ãßTý®9lw3¬¤‚‰Sˆk®åP)ŽK\!ø²v9^UG·óæ^#ü¹ìw[5û=X?©ÊÚà¦Äö°7uoëç"vQÙ±v… Ü?ý*Ü7ë@ÊûÙýBZc©ñÐJ(•Ó°JfL±Æâ!G…ú€‡H¶5┢nwªT¼2¾¶èå„=Bîmpi twÄM€>€©I<Õ±IÈG“»Þ:ÅìP0g2ºí\YtøZ.Ÿw¦Æ•+'/›|𯴠ŽLvóQ¥2çIú‚ ¿ÛòÉÔN}%–ÿ¬«ò»A¸)ºªô‰W~迸mŠÕkµ|{{÷1ò@ußBòƒîʼnS³™Í x±aŽ¾Ø—Tªb4Ct6ÏhµDº§UÎä4ù÷‡ª/ÛÊŒ³ÛN3ù1–ÖLÈòQ\ø$(Á¹x˜ %#Ø K‚ÀØçB„fÈiµFˆgߨT ĶfUº \á>¶=ÆM*¡*¾4 §9w¿f@¯š€ó\VU, a —Š<$ —Ô«ïî‹Ðª´–NËz&™R„q'Ôצ_½†TS=ÅR–ÁÉq1÷USofäžÚ¡p߆j^Wlñ}lå×~Øv¹o­ Þz·wws¨×s&e‡Ç´T×L*Å€Lê%šF  èìQø gU³Šïÿt÷`$Ч4ÓûÖž¡ê<…&CñÕyñ/•pãT{¼pÉ€Ù“4•]0Ƴ©9€j˜ÎyÄ÷£üFÃÀrüÆ!¥Ý?„»9 ÌϦwsS´”†§>ÍôÔR~6ÔY(n)¼3­ C(@½jM@kqæJ Ûux´6›ŠˆÅs'ÜL˜¤Z5»&šæ±å?•Å\΀ ©Š%ðÏÿþøùÓ‡ÿ¼&@°[ÍÌÑ™f£¤Ðby¿‹ºb#ëŸ 10b\ÔG„œ¢Â] =—ç’HÆÏš®¯mç©T´-4‰u,­Î^§ÃË…tL)Dëlm½÷S4ôåÛ;üÅÑï>â/~TñïW8-B¨UÑâ& 0°ê¯’뛉UæÉTçP ì™€éeš-?”8I:8ާÇÌ·x°©,‹¾‹_ &îM¤‰Ýü{:PüóaZLV—Z?“Öz>&‚ÀÞ³9žf \¸þ<ŒD3‡æïU½<”°ª†ÊU\m`<Gœ ÃSÖÎüAŒ&Œ&Aá Èí],!p2¼`Ú…Y#UÓaÁ!¾ûñ!ø&œ)]›i‡p¶1²›6¾|˜¸erþµáô€¸Ï³ŸJrÂÁïÎc›Á [°k@r*0‘ž³>c¿ä÷_¾ Ú«endstream endobj 2421 0 obj << /Type /Page /Contents 2422 0 R /Resources 2420 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2397 0 R >> endobj 2423 0 obj << /D [2421 0 R /XYZ 85.0394 794.5015 null] >> endobj 846 0 obj << /D [2421 0 R /XYZ 85.0394 769.5949 null] >> endobj 2424 0 obj << /D [2421 0 R /XYZ 85.0394 573.0107 null] >> endobj 850 0 obj << /D [2421 0 R /XYZ 85.0394 573.0107 null] >> endobj 2425 0 obj << /D [2421 0 R /XYZ 85.0394 538.4209 null] >> endobj 2426 0 obj << /D [2421 0 R /XYZ 85.0394 504.6118 null] >> endobj 2427 0 obj << /D [2421 0 R /XYZ 85.0394 432.7569 null] >> endobj 2428 0 obj << /D [2421 0 R /XYZ 85.0394 303.3232 null] >> endobj 2420 0 obj << /Font << /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2431 0 obj << /Length 3818 /Filter /FlateDecode >> stream xÚÍZYoãF~÷¯0‡h€ÓÙdöÀz’ÉÄAâÌŽl‚$´DÛÄH¤"RãL~ýVuU7µìû²0`5«ïê:¾ªny.àOž§Y’ª8·…IR!ÓóÕöLœßCÝ›3Ém–¾ÑrÜêÕÍÙg_i{^$E¦²ó›»ÑXy"ò\žß¬^¼JdòF‹//ß¼Xª,jqñöíë«//„ïT@h Ä⻋«.¾%ÚÛ4{óúúů7ßœ½¾ ‹/X +ùíìç_ÅùÖýÍ™Ht‘§çð!Yê|{fR¤FkOÙœ]Ÿý; 8ªu]£ "Q:S(y.eR¤©š° -’L+íXp}ùÝÛo_Ó¾~¸†Máž §ñNœCu¢Uf]— jÝÜÕ«rCuó¡]•}Ý6ôÝÞñ8r4°$&nœu}™LÚÄh“r›MÛ¾ïhÈMý¾úœ:˜ñ¨K)MbRàÝRæÀÄ4 ¾ÌààþÕUûÕž>šr[Q V_Ef_¦Iam6êñºË|A³OÎ[&VÊì<Ëlb³Ôœ8j´·rÇcòˆ€†V85¯}6m¡’4ÍÍÓÓúFÇÓN6\Ø$Õ…N[#Ës`ÒpKÙ‚ù†¤vO¿—o©¦\¯‰9÷“?ÕןRû–h¿ªýÇRÊ(š.ŠÅ̓Ÿ}U6Ôö–û»o7÷sböš›¬Û¾¯ÖKäœ%ª(^P@ªU½EñÕÈEÛ³ðê¼p{DjÉß0_Æ”ñ|H¨¹ÉªÝ´Ír]mêm OG…YU,þóPqkÇlÑv»M í$¦zt0ÐZ©XI˜Klh8Ù^éÖyØVMÏ*ÊzTÒÏCÛõx4/cŠ &%•&û ŠÊli7*ž§(yf–(ÝVw-µ¤owúusºïÛ:Leá4 9QÑK:!Ç#œÛ%òì9>ꌈòìž²‡FöáïÎÕ´êuµŽòN˜D ý ïrÐ:áy·j›î°é»ˆqƒUå`Ò¹ágU¿úl︜@§»ÈÈEšdFîð·K#ÓEÍìqÍÅx´¹»öЬ‰ÏZXe:ŸŠUïmáK8”<°\¹ƒ¬ÝÉé>¼ê«Aõ¡\ö¾™/ÖºbDækªÚÍèÊíÝ0ü1§T®¿ó¥‰±Ý óÜl÷‘a¤Jd¤z™=?ÊUœw^ᆲEjqè<·z´Ì]ã¥Òs—ðHÛl>BK#Çq\Ò3½P öBaÕî¹Ñ®mÖ¤FX¿/ ì‘¹F,ë͆*n+ßLš[a‰Ñ@kZú=tåí¦:¹ˆaƒnE -10R“3{J–¡ÕDÂx¹NõAÙ0ŒíÓÚYݦ hmîO p'\M ßm¸û©ñv6ȑᙦ¿»©Y]×ÝnS~DÆž@ )â.côÓ(aÜê4J­enѳIs‘d€ã““úFÇ“NN*O@ÙtÒº;É:§¨ã*ï®°šPWäÖsN‡ñ[ï:ü1·ï+n}Øf¶{^€j?ÍìQ«'˜í[9 ÈÀ1Êì§&˜=Ÿ4Îìñ¤5¨7Àk§……Dê¸%·WrL‡_¯"P¬¹91ú·CM…5QQÊb B™«Ÿ{IüûÝ\¸¾|Ã%ð?IÌÃY˜Á;ÏØZeI.ƒ&tW°U‚ß²áe(7õz¼¶˜YRˆ4›ZLœŠ5ý’¥.Š D}²ÐÏ.Ð_{@yг|]æ&—8 önWíÁÆo'( ¥ý°c“Õ²9*9ȺˆéQV5 ý– 0p& àž0œçnêïßÞ\~uýTÄ—¹†7Q+ ˆ;¥õ®ò6î*Sœuì*qј×Þ±Óz+¤‰}°b} ò@öeÔ3¸… ÍED>ÁÓäYê—Šâ`Çë5ŽOûãCÁR!" ·‡®§inyæ’*¼È¯Ö.üŽÛ¦"IV9BM!§~7¥uʱΜû´#bSõíþ=UÔM’R®*®tá ÐA¡HÜÇ•©«üüsüï2vqÑpw(.‚16 }[~¤Â-¯§ÛAÄô Äï.¼ÁŠTQîvÁÜž˜n gü„8-'Š‚% „£&÷ ܲŽ BíaÆ?ŸÅqÅ1‰°“‚p‚?^Ý•Æ1TÁújSº…â/"—WT&¥„¦îTàœ RRUÍÍ[Àûz½®úF¾a8ÖŠ¤;-WqµÊŒšªUÌ.k™¹È½Åu;ˆD>*Imêí²_5™cX¦—mÏt6+¸z`Ëœj°þÒÎP¶–__Ϭ××UW·ë˜éâ¾á_Ïz~ñP¶°8Ú7 Ò7=Ô¨Ý*¬ñ¾`‹¢ÀZª!ôvKk jñ¾ê"†?Ó) ù\Ôš‡Q«=¸t¶æáoËØJ3µk®$Eó~¼$¤„03ÖõD #"ƒÛz$w}G„TøË¡ìŠÂ@ PL‘68*™gú(D0 4›*&u ¤Î ç]½©<>[›äJØ‘±Í×Ã0¼“5ˆuû²~QJG„’~šÃ¬nÑ}:¿¿°W$B<вšKgz]ÍŽÒOXÖT<ãë9ŽDðô¤í)Ån@âݦ£å˜E÷Ð6k¢ß²Qt—‹ÌÎâ9ÂeSÿáP—â Pù Áf¥hq¹ŽK<o¹ý޽ ,ÖéT ‚p¤H©Êƒiõ>‘©õöàÐQ`9^óªÝnËf½D.úm±Oâ,”LdNefƒ½ÛÆí1i~#†«l8¶Õ¶õá!ı÷1¬«ÛÃý=ì¯ ÂN©ƒù—CI8ÉÒˆl–]{,}t‚•ì±%oOT—<_§VPç¦Hù8&<ÍOY{-“Tç~kË]|÷E!äÜ…™ fÖ1û®D‹±ý$nþ ¥ò‘ùw›q0Æö{NG{6§Ë×R›"±i>Óƒ“r¦ò9\Áq?”j‡u:’l¤6]V>œÎ{ؤ4(çäÔ°êË«k*pND[Á2x/Úã¼€‰¨ìU‘þ"»yÖ–Á¸²ÑäMM}áŸK.Û„oåí+z|¨ È1¬«¸[ÍC¿º¼ú’@V ›#â­Ézˆ£F¡†ÕÃä*L®xFí"— üçÀw¾84Š/í©t8œebô ³¿Ÿ8®,?>®aÞp?E3µ\ËÙ(jS‘ XµŽ×N”÷|Amÿ‚` ajQ¤³tŠås23Ü}çQ•CY„bÕGªrÑéÝ%!½$2± åâǯÞ%Dâ 9DPeyýýÅé„ôcÙE¯ ÒýQÄ8Ê lmß°¬­ò攵@pÈÃÆÁÛ±µÖ#(ùðóî°¡ÏuË¿X@Eu÷0¬/¶„¢é€ŠO-!ƒu†%Œ.t`Ü–¯ ¡8Näv>Hl™ÉA¼óÖ })Y/”Ri8UŽäm¹Û‘Ùý’È;·d& Ãå¶èê-˜ÖO“lÊpŒ¨@€Ž$B…œDÜ #ÉÒçóB€T5N‡Æ­Ò»5ïÆYJX¾ƒS”KEb¤ž¥3§iP«ÙKjÿ2#<¿@WáJ¼¤Wɹ¤Go+Ho2œÿ™\kðŽd×±®ðž,æÝÇó”á^{jÀåÓ†îHñ·"ü¯ÿ›ñ£"œkpz¹‘Iµ¢Þ"ÉÓðŒê‰´ž’Ö·*›Ø#Œ½‹L>{-¢ð‰Ðñ½H—D mª@µž¿-}»X•w=‹ ¥»f|IÜ—!@¢pÇÕqRÝ&‘ôD Ùԉ½‹hú˜k…žxý¯8¦ºY¢`%å~WFmoš¤ÆÚwÝ4ly¥·¼bÈ!C‘CŸVü$ êÞÞ¼#Bhä’Ír¸}®V}ý¡ÚøwSä.  Èf˜óΜçjºk<ë•'·GWüÐtô†Á·­PáX4ŸRSßÒk ãyуħkzµ‘ûÇ 8i–\¼£·“¼(8õ_G@S7XÑrw‡!ó4™+d»¡áÓbñî«/ÀQdô±­úJ-a•iá½~á–pyuC4;•=Ícyy—© iãúÄu—™toÖØÅ+÷R§ê÷aa›ò¶ÚtTF4 ›N¾Bb92JKLÞ «g'Ü´œ û”¦öî Ä”ã7W`l™ †x»ë9u4ÃqÀ’ëûfr˜çTòbüð'ÇÌMOäÛ±§QNiij¦!—áN‡¶@Oæj–¨á ËìpØØÁh¹bk‹‚Õ—='P¸=2ûæúò rú%o2ˆêëT¦=3)Ø e‹÷.K ’rÃ@ +ÉNf`[‘†Àì}\ŽrD-È‘‘Åâ'w.š¢ZTãM×i´ A ÔȢ뾫6wD$Veƒ®r‚—¨œå ›;ñèYcÀ}g"ÂUôÿü zxîml¢ó\ÅQ( ð»€2/ÊYw?á§ÓÇkÿ/À(ÅWendstream endobj 2430 0 obj << /Type /Page /Contents 2431 0 R /Resources 2429 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2432 0 obj << /D [2430 0 R /XYZ 56.6929 794.5015 null] >> endobj 2433 0 obj << /D [2430 0 R /XYZ 56.6929 752.2855 null] >> endobj 2434 0 obj << /D [2430 0 R /XYZ 56.6929 474.2043 null] >> endobj 2429 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R /F53 1333 0 R /F11 1459 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2438 0 obj << /Length 3270 /Filter /FlateDecode >> stream xÚ¥ZßsÛ6~÷_¡·“§üÞMœ8͹Ó$níÌõ&õ-Â'©Š”}úïo € EJ½¹ÉLKìbñáÛ]Ð|ÆàŸÉ8`"‹fi1ãñl¹¹`³gûxÁÌ -|©w÷oé, ²$Lf÷OÞ\2`RòÙ}ñm~u{ûáóõÍï—‹0fówÁå"flþéêó׫_¨ïö2 çW?ÜÁc³„8Š%l~}óñòáþç‹÷Îß`ÎZòçÅ·6+ÀîŸ/X 2Ï^á<ËÂÙæ"ŠEGBØžõÅÝůnBoT¿:æ€XÈ –a:â0ó@œ‰…ö@»R¸ˆ·?EÜå)šÃü(³8Ho6aĤ©·mYWÿ ¹Xxr" ÀðÐÈ­6ùrd²ôeqf„Êær!Ó¶Qã°ÅV˜Íë§ÁÐýÝÍÇ7Ô,ÔS¾_·$øÏOWã7#&…, XfM¯òúßMÒoM›D­ïJ{nri 9‚”ó ‹Á8i^#Öñ,à¥F±™bhÀ'©g\(2²6ež/Û}¾¦Nœ€s>Ð –Ì﵌é×Âöíœ~óF-’ˆÆTµ¬ UÐHÓîÊêù ŽpÜ’r™¯×f’gU©]Þ^ò¹–†žÇ½UTM£– P2°˜IøŽù% â$¸å}¾G0¡½é¼YÕûuAíGE¿mþ]™áוmí0ÎŒcZF”,9jÆïšæ´¿@X¹Ø7jgì;4­Ú4ô7º¡Œn_æU /eS>®ÍCY‘;€™‰Äúƒ»#ºS1¯÷ívßb;š?í.¹œ×Ù6èYŽž5¢;ƒ™õ³›£Y©õúo =¬Ê¦­wýƒ±p­&’Íÿ¥ýŠ2ƯØ$`£,ì´€ò޾–íʸÔw»È Ò@Q>ùH„Œ B,Í:›í -"–8W/°/¸aŒïäè X¬¡çϽڕ”ðP)U44ÞÖÔõ½ª_í»Š†èh@Pj¬Ÿë¬ocÞ5Z2§åQ‘—`°Q E2¿©hôÝÍçë7VIÙô ,êJ™Iˆ-Xy[Úé—²0*à|oMçvWæ­ñ:g h7ËN²0 Р02ŽúeˆS+c\}<•€è•$öl5-Xµ€4d/á{p°0c‘ÇÂE°¬«§‘Ù!`¥©ãâÀ™éÜô4[„pb*KD&›ðöë׿]ÆñüßdÈ—Ûû›/ŸïFÖ Nã ’@ª'` 1!ä–v»Q¸NN ]Õ~ó¨É):`Âð`º4­˜W^W%ære&xÂ)ŸÔ²¥g‚$t½ææe} ±cUÚ—Öuý}¿µ&h£Ì[›¼P¦[#™K;c6'¹è¬1äc×_Q6Ûu~ DÝÕ?$-Lh®kLW£Z3¶£1£ÃvÈü™Ú¥‡HiEÂZ&:WÁØJÁ v—À8o(ª4N¡ZµÛ”•y´þ€— ÜX;;¥ ÃÓ•WÍ+‘±–p¬ªVoÌi#`óæØHûêcf¹åFÕûvð&9¢ÕË‚Gˆ¤p@žKÕÎ&ÈδMrÚÚ´CtÁ»5u@ H‰[Œ<éœáÜ¿ÖZ¹Ù~¬Zªbâízo&oÊg£cËÈ<2‘–µ;¸A–¦–(îÃAÍ,Œ¸ô-lHÁ…ñ>ŠÐP,%ƒäܤÕĘìhl²Ž®“Å:cÇÀ8r ÚKè „g,•€<;ÒAUq…z -½éhsWê [Ooô€m*¯ˆÛ¡WãU[¡c ôx.2ëú‚@$±žÿ´_B&Á8Î8oh?Ákó—|½GÊ\hðϑv®Ë)“Á†Å5ŽãéØÁ,`N”¥èæ ¬ò—á‹Oõn3ž©ÌlZð­£øQÛ6âN)‚D&¡ V1é¥sbRDiõs¨ŽsñXÒÖÿý¨zc‹¡2ŒC(0”Œ–›FháKéb+’#Å–“Ò«üVÕír;TÌ@9ag4;©cÕäA±ñî¯x¬þ[[A2T·Ô˵îßßҘɫ¡K»–Rk|‡Êä0 -–™®™G€(ñã“®¡@DCŽÔRãëõ­.žÅƒ½¯Öª±;WÑïÕï?ýf8Ùp÷뱜i4vô MÇ꥙Êh.óưxN?Úz¤®*Š*ý‰)×›€Q$Óø‰Ÿ†‘/5 #'å`ô²‘mÍV-]æ­ŒUùHq¹xÑ)Ï ¸òlíWÓ7KÜ•‰IUÛRgW /¨ã(PØRý­j—owª©×/Seu»‚yB·Pi*E\¸‡.¨@_g¸·3†"—¢‰Þa´ï+ÞÝÇ î9eµ€µ÷Ô±\˜ fA®è]‹…½Û9Ä•®žÁOÕä™ÂP‘âä‘ò„¦O”rÙ-a”#Oiî(r¨zœ!}Ý:(#é  Ñ‚2öPPÆ–©6²Þ^âí%Ž ]QehnpÇß4ïp“Á¯Á2ÍÓ,¢9´cû™Á€ÕTw£{>dHi"Æ»2“!ò(_<˜ª³‡{.ˆ ¼ÄŽh2<ñ¶ò×ü?/(‹“˜§gæI@˜•ê ¶ª_'`–FAÊĜԱƒ«.¨d÷M¸¥ˆEŽ ´ùÎ2í¡—D+p7™º’„XRUìru}/5éâ0M‘…g¢/5íb'å\ <c@dÊ¢ÓÚÔ±ú¾¤èÖžþke¯%ò®Ri© {Œc›¾ƒU]6]9µ $ýa˜ùéñ8Šœ‹£$àBœ©}©.¶RNwž×Õú0I”'•wLy¤}œ*{ê!ëhWv˜Tçy—•»kJ¯JtÂT]Rr?å:È4d…g\çIp•ò\÷´ÎŸ§]wJ¹çº¡ö ×ùê¯þ2Ü’ é®ö;>Е€ªØ}jžtªN!y|¦˜ö¥¦ê¤:늓N=©¼sê‘öq§öÔë,˜g1±)64›b£Qíµ4ú°quM¿ãÜ78ê*ò6§ïøôXšIÊj0…àE˜…¦èÆ!¼e¿±éÎÚo÷»êDÁóºRæ²2L¡ªÇ’64—ò¡ùPªGì5¼n$…+ÄÏnê÷îõቮµÍŠßVõGKh½äë²0„ÒwY”„ö.QÄþåÒÜR@B‹j=ú\ÀÍ0˜ÁX$çÛz} Éøòà¯Jv«2^K#úú.`ÿ~ä4TV~=U}Eßöú>2À»ï­zb±Ò_,ç­Wvž=÷1$ã” Á/whx_œ3Š=Ðùåö?¯-¾|½§Ž]^=ãGäHèÕ23™Y-=™ÅfîsômóÑ£½˜qãEhøV½æÑÛÌ‘¥ØÛ—›8/¹dÐæzú¬øÉ_c¿ýÕ”³Ê»Xœ!'Oê9Y)GNË3ätJ¹GNCíää«×äGÚ¤zÒ¢ArCNØ¢}‚ÆûkúErZ®Ôò;*è)ÊkÉÂü}ôÏ%§ëÏÒã§ÎŒÙ(êóS(Ãî-÷78U}‚†¹*=\¾»ûð¾W[ÖO½Ä”®”&¡áL„g¢T'3 #Ó`=yÝ{BewÙ;Ð9~Õë)½¦¿S™¾ù.ü0ÈŽÞÿruwgïÕUå}Mu¿“íó[0õ§t"ðïßFVÇÜ÷ÿÿûÏìº?"ŒðLäD^$X‘qk:Š‹lhºûƒ¼cÛÿ cSAendstream endobj 2437 0 obj << /Type /Page /Contents 2438 0 R /Resources 2436 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2439 0 obj << /D [2437 0 R /XYZ 85.0394 794.5015 null] >> endobj 2440 0 obj << /D [2437 0 R /XYZ 85.0394 654.1216 null] >> endobj 2436 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F21 954 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2443 0 obj << /Length 2877 /Filter /FlateDecode >> stream xÚ¥Z[sÛ¸~÷¯Ð£<‰Q€A²3}H&i&Û6u×(‰¶8¡HE¤âõþúààÊ›ÒÝÉLqÎý@f+ ÿØ*DäQ¾JsNÊ’ÕöpEWO°öáŠiÌÝø¨·÷Wúkœ®r’‹H¬î½½2B³Œ­îw_Öo #×°]¿ûøáú& Öonoßz÷ñ?ðžP€€Òõ?Þ|ú÷›¿ãÜíu°ïï®îºzo™ñf4–œ|»úò@W;àû§+JâñYH~½4€³vŸ»¾™ òUèR*2„ñh¸¾/T´áN§äy´yû¥Ir~!ƒø¨û5(—ŸNæçEÚ.?ˆOçç€z?rÐ>0‚9#˜3rcN0Ø•uùThÓÀ±è÷¸ò¨tÓ‚j®•Ù^NkÓË}ÓËéÚÒq@´ eà|YB“ÐYIË=e¹Çby(0së‚™ Æjvó¢g1Ó¨#ëΙ' o‹²Q;LyrLSè²'Û t(¾–Ú«¾%_ã ýt'“Ìv:UæI,´J+“ë®5ÌöÃjV§]56X˜áy%œ9dy8×E?ä][.¾‹™\¡Ën0-¹”¯gC]§¦yÊ—CšueCÝö0nD(4,¾@٢ƤCƒ„Ês> í”ÐN‰Øï,`ZÆY»<^‹RÈ8ÉãtPÞuJowíYQ3é3P :=¨•ø´jTÔ{n8YKãl)…‚Ì¡}Ž’e'òQó^dQ.…bÔífÝh‘¼ó£ýiG ð†°ñoúŒƒüPW)Oªfð5æÍß@æõ!¡I_Ї‡ZЇA¹û¿Ó¬F¸×(é25æ Ôp*ËÑ€ƒ ƒÆís ‘³ª•ƒç±Tv}3l©åš=„ú\]ñ¹ý¨-mäX^bÛÈò×âp¬KåöÙz>Í ú´ÈIgŸFÒÅN†ì¾–/ØT 6¦Á„•bÓžu#ñîÓÝßÞÿ×oF ÷¼ Ô}Ìý^÷@.è¾Ò Ù¬´8¡mh¼'.ûjÞœ›Ú†(ÎûJš·~mwƒÚ¾ØÊÎnÞ<©€Þ6É.˜§‡Z0OƒÂ¼É§ÿËçÙŠ{‘²«¸G¤§+î€ö$-Û>=–êùxºÞ—¿Þàœ²xnŠ®ü¯ÊF‰“·Ye­îc£lfMå¸KnÁ„ùJ©–·ûsóUÏšr;Ȧ°@’<2yòóD&…#º[ºí¾€NqºAÏb’3@`éÒK ëD9A5&ã|h¥§%jŒ 3Ó¹±™Iݧy‘ÑFÕ¦ÔYºëñ^LêÑÄn¥9:ÐÄ]1D~–qwóÜ*{šºx¦"·¸xñÌ…­X”eÒ‹{m èæõÉU¿"™"†¢U:êÆäy´GåŽæY×?”r¡óŒUûk-A]7p> ;þ?"¢$""‰.d05",ÊõG}1‘¼Lç³HÛõG#âÓýQ@]·’qfSš2UŽ{۳˥%x=»Ä?âSž¢êújÛýYþøÂ¥ø!T4ƒ=JxcƒC±“ ,âÌáºê·Ò˜¿‚üy¬_u¨¹j›EcÛ”ÐyWÆ¢~¤Ýózywôy bê¾ ·:hÁ~4ȚϷÓhžy%¶DSCF$©%†”ÆÍ['‹ñOÊJPó’2w„U?¼~kLýù6¼³x=¿YÕMQ_øŒe”0F/dz5¯‹rz ˜t¹Æ`‘¼k Fô§ƒ€£Ùc+¥˜ÞÚÞ±I¥ˆÈÝ‚YnÕ[WnÝ ÞÂÅêò‘Jâ0Ôö)4Ö^z,ôä]±?Ÿ¼´‚Ôwo~ךl·ÿï«ye<[÷b,¬š“y“ˆSHŒ—zEµ`eMÂ]4„šÎE¼LÜ¢ÆÔ¡=•ÅQ’ÿ}úá_aR5ÅJ1 ¶ú~¼q :ÕjA14%‰¸Ô4ú¨Å”SŒþiv|Æ¡þIs¶Lᛒ „º‘5‘€ÀpàtÃn¸Ñ tÃí»tíXV¯N=qŽêá¨>¥šjõp_=\«‡kõðàÇàEõ¤)‰RqéOzhá/z4Èéf·«äÑŠz¶¡_¢îúù!ùÉvÞ'ï)FÅ£(&5Šk_õî4ƒ ‚ð1¡™ÜhFøšZ3Bk&µš™êí‘ý)u™¾4!òoá&äEW&ÿá?¹sPÈSÈQY4-yhä|, S’up¨±¥QÅ"šàýî Åendstream endobj 2442 0 obj << /Type /Page /Contents 2443 0 R /Resources 2441 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2444 0 obj << /D [2442 0 R /XYZ 56.6929 794.5015 null] >> endobj 2441 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F22 977 0 R /F21 954 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2447 0 obj << /Length 3119 /Filter /FlateDecode >> stream xÚ¥ZKsÛF¾ëW°*¨Ž1oààƒÉ^'YÛ)©l9>€äPD…h´£üúíž„R»Tó@cº§ç›~t–Â:Ë$Iy.f:D¦TΖ»«töÏÞ\QO3Dó.Õ«‡«¯¹žå$WLÍÖµ2’f=¬>&7>ܽ»}ûÛõœÉ4yE®ç2M“ß¼ûåæ'7÷á:gÉÍ›»{*™2 ¢H¦Òäöí›ëO?\Ý=DaºÓ”£$Ÿ¯>~Jg+û‡«”ð<“³¯0H Ís6Û] ɉœ‡™íÕýÕâ‚§öÕ1™É„šÍ¥ \r1®¦”¤¶=×8 è5‰lLM ÕôíǪþTl·çÛ¥œ‘L¥tÖ]sÀ9R Y3ÖaM¹&™ g¼ïMëN¢>¸v¹5…ï¢H¶³*›ý¶xrƒßÓ” Ž×€N3Ù3jêPM¨)PY5µåμ|h‰)’eLN3ŽTCÎgZ¢ MžõYƒ–ؽ`I»1¾Â\Ó¤>¶n¼¶ „NášÏGsxò¤5Êüâµä=F‚h©ˆ‡IO–ŒðL‚Æ,ëjjŸóT'AŒ•YÇm{’É D“ÒK,]Óÿ¦ò¶­ÙíÛ(§'mGžS§¢(ƒ%¹”tBp¡2î·«n¶¦i\¯Ý•ëQ×|-Ò×4KLãvãÒ® JÅEâ^¼ëÞzn¯®¿0eõèÙï·¥Y]D®‚ r*ž¹à]ªËÈT¹‡Ò4#Ð Ww’óé‚X_ðoÝ\yèB§:îæàúVsøÔèjßZUCç—Û®ƒê/ÏÉsøVE:#›SpSHϙ̼&)—çÌ>ƒo°™æó±ðhÿËX(×ß…wŒëDÝwPÛz¥"Þ}Û”[SµÛ§Î­¨ÕÊxP÷}nô2¦a3àö¦i&ðìh,š 1…æË<;Xî3½€äWcN½.¡u }«K|èqŒÝڵΦ84ÃС:'4wˆ#šÝÜšQZ䓨b:€¹+dØÁ ̌˄Yã,’_À¯TÛò3f…Yž‚nrÞG§³0#²p úŽw ¢1àlUäUu4¹ËíqeÎp[Ve[;3L)M.âNjŒš¤œF^—ê2ö"•ÝiµªÛæåíEôMr>áoÀz=Þ6Xâ\;µ`'@sgªpå d…aS|ño аg„ñCqpCpt#XKs¢2B€ªØ™‘#fš0¥èÉÝŽYB’ŠàoGÖÈ çLxÊX¡Ú®Ì |©ƒwmÊ•³ph’ì~M½=¶†8#Ê2E£´S¶p©Oa ¾Û£ŸG\bë5g)!àd•eÃcSâíx dþ½Ê+ºM[@LÖÓ¯è+hWe™ °å7ü´ËøB`oë1I¢å§{Ä3aí?ò ž@‚­¸ÎDò,`ò¢²\ZQa7^Zœ)ý“ýµµ[:AŒ4ðØú9‘¼+¼›–4µì‰dm¾:,“°¶@`áéøe«ÖöÞZ'‚~!7½-Úò‹qOª—¢òÔ>Fƒ©…!h¢w´q—›à¤ÖÁ=† .“U½+À0ú¸°lÚðJ—rxjîbFµˆqqXnÆlÎ2Î ÅÈRå˰’“çâJáj­J§ª¥×”x¸¸d„*®þ_p]¶© 5c©~Ʀv¨&lj ²6uq\7å_æå«UTG<É;R ™÷­ªÈ‰Î•ìs÷)¨øÐÞEC`Ø~„Dõ¯]ø$ÆžJŠøì¶lŒ¬‘p1¿Nînßݧ~ùQw®4Ö+X^ºsÉcž¶xjM¢À{?ywÅŸåî¸s¼1îúSI„–yÿžìÀ“:ZÛ-4®kch½o†^o¿0>Ýh€OçÒÏÛ+ Ô5>‡Ú;œnƒ£žó\'¿b½ÍmàzlÑ’÷Xgp ?jyÁ¨Ç¸‹öÌ€³n!2 wU­böåÞÝJ°Ð¹hÚ— _,ÎÃíSŸ'ËâØ˜^žˆ§>Ìë†,Íê…»&$NšÒé»Ö¥º|×"•½kfU5/¿¹XŘd|ªb 8W1z¬ïåÚj# —-‹ºÊ¸DMYWþyíÚ¨ÀÌz }Ϋ\ù7ãÑe´À í/”_.}ë/é¤,.˜€ñï_$þJÄóWÜž?Ìøu`"ˆ“V˜²çãxþç¾A¥$OClðmUã‰Ø0zBeÁÌÛºYã9m¼8N;cƒD,õåóûD­HÚ™/› dëuBR¯µê+!`:õÐöP÷áÕet§)Dµô™è¼K5î@K™;`]nËÊ @®2¢Á`OóTCú לèTå} >J ¦˼ö—µmW›´y•íÙSÂÎýûìèñ0&Á¶p Ø¢nü›v§s»U;†gWxî.>ÃÞæ¸+ª¹;F2«ôÌ'8¾ÅªXlq¡”B„½Ã =VÒyœq3#"uu;ïýÖaÊË›ìïÉÍáGªÂ Ñ[:Æ,Á½@t+x—]K8MŒªÉÖö‡{îá Är[,o„`Žuo(BœŠB«òqä†QM|ÕþxÓ@H¨¦ÏÔ»T—1©"¦ë "¸bh™B@òiæ‘jȽ¿]°ŽZ ÚgïÍ$ž›«1‡eg©ß¢¶éJ7 B{×*¶¦ZÅI¿‹ôüj^FAJA‡ú™n—j*¢`]”#_i +á`˜'YGª!ï³™C(÷yßbþ-´«Ñ`dz¸ð6Ì>2úg¡‚…}›‘BûT½W£± >)\s÷óµ”ɯ¯¯µHnÞþDÜôCXþ”¯Ã"6I¾,0"VÈËÔŠå¢aØ—æç9£/¶a8·)—›~4ÅI®ÒôMK…övÐt\ô>"@Â_˜Mñ¥ðÀî.BÂÂ3–OC§Ku:‘*Bga Í]Ã]kÒüF€H5”àÌfÚš‘ì‹p¿ó(ÿGÑÎg=>lArÔ]£±š†YŸ‰5nKÑN¸‡TÅ­ ~cA[çM‡ê~¦‚A(´+Èy&Ç#šXì}|Œ ‚Íh¾*.)$ϲgâœ.ÕÄ‘ªx¤6fyÑ'L2?ù„÷qŸÐcÿ³¸¶Á3¢¹L h¼¿ûÞõ! uÛ6¶ÎdgžÂŒÃq`!p¾àûý¥ÝÍí{çh¨­-a«No¿ÿð0&Ë„oˆŠÕªl!,ŽwsٺƷ Þ”Èü¯Ð!º ƒ@QДËMÑŒ»ŒhXbŠu °îc@iˆsÞãý½å9g_†ãb ‹"UÑã¥dX‘Ãb›ý¶À,r|«q1ô²›1¬îîöåÖ^±Æbo~;ò“ ‘1"r.ºÛ|î7 œÿ"cœÖ‰€óRÖÓÉýÛ7ßÿëæþî2 ð§R"rJÏU_›ßcµÜØ{o«!ØàÔÖ¸>Zw€ƒ¿óøíñ:KŽ®‹cß¿Œ†Û…óØ ‰‘¢:p±<ûm÷bœÉ/! ʳSÁ¿j%w6gAèïþŠèp,Ùù÷®aP ¾¶Ñ¯ð‹Q¶¡¬ŠQ˜æ˜Áä%áj$omNz÷£UÒD¥®¾Ic}”+õ\£²XAôu à±­ë?“õh‘ZjÂD,RÛ:rfþƘ1FXr¦ý‘£b„Ëѳ‹æp'S?i:ñýé—ÎÜø —gTÔ#VEŸ*éu×rŸÆ™±²/>ö¸c¬dŒôFÓhHE>ƒ§ÿØXÅç‡×•iÑ”ëÈwÚX…ô,çcv"Õþã_À~ß'4„‹Ù…/ò<„óœ¡pTÐsÑ%d92czDöÿ2C¿zendstream endobj 2446 0 obj << /Type /Page /Contents 2447 0 R /Resources 2445 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2448 0 obj << /D [2446 0 R /XYZ 85.0394 794.5015 null] >> endobj 2445 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F22 977 0 R /F53 1333 0 R /F41 1238 0 R /F21 954 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2451 0 obj << /Length 2727 /Filter /FlateDecode >> stream xÚ¥]sÛ6òÝ¿B7sò$Bü@ßœXIÕ:Ž9sw“æ&!‹c‰THÊŽï¦ÿ½»X€¢$ÚîMG ìb¿#?1 #i©G±V,ä"eë>º…µ'ÂáL<Ò¤õöúäÍû i¦#®½³Æ“DŒ®ó¯ã·L°S8ÏgN'2 ¹Ÿ]]M/Ïgÿ†yÈ8<»ürvA°«S h¦óÓo׿œL¯;fú  'ßO¾~ã£øþ儳@'áè&œ ­åh}¢Â€…*K¾Ã:¦àÉš‰LöøhŸN¡ÆíÒà _¿»"HSew¦¥±åÏ.ߘöÁÐDYÙèŽ8IËœPHÛÆ¼pgÔ)Ш ¥]¦îˆŒ°ÁÓQ/öú”æÁywÌâBîžw[.­J—8†B“fÎËWUu·Ý0<’¯—Îlr³H·+·«h¨KôÅ•$LàΜUV}5È6 YÊá2‡®â^Œ&2Ö,Äø0 "¦5-îÇ/§±_Ï®.¦ÄÍo_¦Ÿg”ɨp8ENut•ŒßÎ.Ñò•këÍʬMÙÚðIKÕ¢ãªo©")ã.žNÌ”èÑl7›ªn¢ÔlLV,É¥€Ê„ZqZí¬Ã2P°%¶5Æåµ5„®ŠÒmú‡¼pL§y^LÈDB” è~ƒªð«<dLrÚ傯±ÉbèÞŠéX{Ùܤ-š’øsy*ÆxKœV䨯ÒEÅbM‚1ÚRÄ4ŽÅ€õŠSrj¥üÞ·ahké@ùÆ Ø}íee¯¦#0às:`±Ž´ã÷¯Þ ³«æ⑜H¥+!À¶b¨K“@ìÇOò "ž¥½ŠDGܛЫAÕPrÑñL‡¹œ€"—ë*‚Útul̉da¼PV'Ž<Žó:ÓР(‹¶°7çÉ.ê&ÔOÁwæ“tÅ×÷à¨ë{T¢¨UxlSD¹$•:ÐÁ@@—ûv¸Lm¡g­?«*£\»³ø@u"·ã!‘ {Õ`×I J«@±óŸ¡Á)MZ:>ž7X4†—b¸§/EŠ•»HYµ4ØÔEÙz2†®ì°Âl½hª;Ç$¸œ•©T1 ã Ú—ië[Pÿ–qäM¾‘=v'0+¥¸ü¿½i¨…LȤíªûíèìü’˜¹ºúôù4„²ååNt6Ô[j&äËñ˽YÙNZú ³2·òt2·›…aì7åº ¨(¾µ‡PMD\O©{ìÛ/µm,È)P— ùbüRò«O“ñ¶lž· A®âƒpû~vá_ú+÷~|}cÚìMmšjuÏÀÅC¯3ÿøßÏŸ>NÿxÀÕ:â{Ú´a>uŽgóOÏÅx ÎUÓb°F_ï^ás&=`^6É&wæñÖ”½EK Ð}éEPŠ©N|Ÿß¿<‡*ƒ„Åa‡÷Äë*ÄPltö®øöˇù‹7»Æ7i÷'ögý‰ ²7`>þi¤rëg^?ØSC!Ãÿžñyw›¿ýåîX…ù5‘ÃÿÈ8IÁØ1…²JÿÝpÉÞÿ¯<+endstream endobj 2450 0 obj << /Type /Page /Contents 2451 0 R /Resources 2449 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2452 0 obj << /D [2450 0 R /XYZ 56.6929 794.5015 null] >> endobj 2453 0 obj << /D [2450 0 R /XYZ 56.6929 628.3593 null] >> endobj 2454 0 obj << /D [2450 0 R /XYZ 56.6929 338.1896 null] >> endobj 2455 0 obj << /D [2450 0 R /XYZ 56.6929 227.6111 null] >> endobj 2456 0 obj << /D [2450 0 R /XYZ 56.6929 146.3585 null] >> endobj 2457 0 obj << /D [2450 0 R /XYZ 56.6929 83.6007 null] >> endobj 2449 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R /F53 1333 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2460 0 obj << /Length 3447 /Filter /FlateDecode >> stream xÚ¥Ërã6òî¯ðQ®qðàóèÌL§²Ž×v6ٚ̒ ‹ŠÔˆ¤¼Î×o7º‘%û€fl4ý†äµ€yFÐYxda ]/·WâúÞ}w%yÎÜMš÷g}ó|õþ[\gA«øúyÝ£•"MåõóêóìöááÓýÇ»_oæ*³o‚›y$Äì_·÷?ßþH¸‡›LÍn¿ûô„±ÂI §ÅböýOOÏ7_ž¸úôì¹és,…FV¾^}þ"®WÀøW"ÐY]¿Âƒd–©ëíUé µv˜òêéêßž`ï­ýtJ‘Nƒ(UÉ„”¼–a ÃX deJeeº™KûÞÔM‹ªsQÄ÷ùÖ È©žDa–Ê‚(‰I–ök+³ß”JúxÿD@Y׿w;‚»¶(‹ö)ƒ2È¢H1I2R´ðÓ[UK9Qi˜kÈ8ާ¤"Q…O*DJ0ï“° å„ÒøYÇÆ °Ïóüê¬öÍóëá‹C-ic‘îÑ‘°«0 ‘¤°,ó¦¡iƒå@œišd<ËS¼Ÿ ç“ÆQÄS«UÝž%˜Žé=^¦×mf?APÇR¡Sl/RlßvfŠAdh'#z¿\¤÷šíYz¡§‡Ú<׈!ÑõÜ«¼ü<ßN¬2dh]æ/S«„A˜¤jÌu衘¡ -‡pÙÌþË”ÖϨ,’CåÿøééÃãÝÃóÝO÷þ£¡ñ@tªŽ:yj¢J‚í»ó;šƒ‡™å44ÅvW„So’öźÞ°3{€·EõBÏÖš knÀªLÏîZ"âèWðM^–L­kÌŠ ¶¦qYW þ%Ô ßß=0Ÿ«ÕþF¦3Ó4¦¡“äýð9’ßÉ+ ¯âtv(–†!³oràNÇzöËÆT„­jsKõ¥Ûš ŒÆ¢pÇvܵE]5ýy–d2{)¦z7qFNå΄G¹“Øí ¿tNC³©Q$ì¶Û|ÿFëÖkBnþ²†·°e’G‚ÁLª¡f—EeÈÕŽ·Š(+.x¯Á„€rÉÃÑ«¦ý¿‚‹¨§\JŠY»1¬êm^ ä¥d3 ×yKÿ ¦9 žº…ƒp·³*–XCÄ2¯ÈËfô]î–m[³š¯Ì²%$ÜÝÃ!¤É=•¢Wöà_/ë²®æ,[ÚÞ@²+SÛ¢Eþ´Œ‘pŒPÔ'ü0ZÏpïøæuS,74}™7fBƒd¢‚Pe(’Ê{¿¢,‰æâ–Y™uÞ•-!Ùpé!§ ÄZ†!¼ É[“G€Îg´£) ƒ,”ÑÐÉËMð¯³@ÊDö´E+à …¤ÖE…­b}á_š^ñtÊZ–€¦øþ/$¦Ê¥KÖGl|^R*ìR%C«ùÑúz¹é¶^‚¬¦ÀؘÒ,ÉT”5;žÉ… ø‚m»’b^N³­d<Ì…ì‰:×eÙGÚL%C1$¿YxÑ&c•:ÙùÂéæ4ØÈMûØçU³¶Y°rzè&LôÜЀ•ˆ/„öAÃÈíí&OÈ‹QLI±8Њg`–Ì#@¶´'ÝA×l~æýj9xð‡çGÂPV©ÇÅ) N2D¢g½} äW-ònM#Øß¢°QŸ@ç7S–” 2ªøBZ®"_ߨç,G6m#{JÓ Æ.õ AX°n[Ñ '„ýgqÈEGÃ*¦…óÓbœ­cg©Ù™eYŽï/ÙD_ jaDpC‹0àS «{Ä ;QD‹8nqÒž2wqpwÿL®b{Züù1ÿâü=ˆR µ«à²ãñÛ2cú³Pì⯫&:çP“ÛGºÅø—ȼYºô8åÒIt’s… 1ÌjB—OŠÊi*ÀÙž5O³É-à(YÆLÄ•µ£ > B_gœOൟC95Òky©šž¼4”à Ä;:ò½ËP)w­Í¼3é¤1T^ÞCˆ;;ÄàO>³Ç(Ιê%â8¡kÈwØ9†jî[°’ÁP[Ä’›¬ó£$ß*úÛuþ;òֻ’’†bMKÚ&êSÜ4Ó‘$dcCÀ«”Uêò€Æ&'°ž¶—LüÒú- ­Í+¹û”µ¡c’ƒ1ÉdjøÈÊð%¡K.³SW!¿k—³îM¥ä©`l ­Á2RïÝz´„«öÄèà­­O·dÆ ·Æ°©ãû¦ìpyg[;x DòO[;X ‡êÔ?€(4á,OöôHV¬f?Ä[èbC»/LC¶3eë+J´h.aà‘*Èì xmòê…ìM± z:{QdüòØÉy<ã¡¢“ìeâf) ¤òxÿîkÜÂT±/ŠjU,Añy³›úÕ]6I˜6®þ·yõF·%m±Ì– ½MÓT_ì—¨Tǃ~ %ÙïŒó*9¡] —eƒn×°áV5£^ ò¼:¿vê”ã ~×÷iΟã ÛòL° Ây;ɤîÖS䤟Èl(¯ó‡â™öûÈh•yÉ6âLéÚJýndzžù^kmÈ< X¸ã@ë¬t6Ãü læ¾®æl¹T7Ž__»,wÙ@´³xhÉŠ§ 6š3¹{Iâovçû3ÚšºGi:{rRZ `vŽ!Œ³÷ÄøÖy€Ç„ û}Äô6éj*E‹ ã“€Ø>ž*!Ýo„˜-0 #Êz=áÎIH¯¾ÒÀDáIþñ&öOnAc_|ÙrÅÞ+…®ˆE}Sۚܳ’3sÌ”»ÒE”oÉ Ÿ›â@ñûtTÑÅ'Ý`rßS$d‘ ð`ó]Ǧ/GUAMWfÖ’o‘&‹ƒoÞÈNØNõù¡Õ™’—ãVæûü]C"¤änÆAÐpâG,Kµ4<§¥x¥£Õ±/ô<]ͦ©«)®@½ ©tDÎ>âó©T…\3§–gR(H¹Ó,u^­Ý“:¸‹ql…±NJ§—„d‡-…sÜMˆ Ð˜¼k!1l!å°¿¬ Ï]³'ðM‡è©¿oÇ÷¤_»Â«^Â·ïø’ £Kjasg]Wå¤ÝlÂpŸ÷ö×o7vnÓ´¤SS?ÓX³é©_f ÿØüÓ¹ã/C(ÿÒT7È(DÅa&S¸I+cÖýìNyÿ?Êiãendstream endobj 2459 0 obj << /Type /Page /Contents 2460 0 R /Resources 2458 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2435 0 R >> endobj 2461 0 obj << /D [2459 0 R /XYZ 85.0394 794.5015 null] >> endobj 854 0 obj << /D [2459 0 R /XYZ 85.0394 769.5949 null] >> endobj 2462 0 obj << /D [2459 0 R /XYZ 85.0394 747.9963 null] >> endobj 2463 0 obj << /D [2459 0 R /XYZ 85.0394 712.4426 null] >> endobj 2464 0 obj << /D [2459 0 R /XYZ 85.0394 646.5299 null] >> endobj 2465 0 obj << /D [2459 0 R /XYZ 85.0394 574.5487 null] >> endobj 2458 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2468 0 obj << /Length 2714 /Filter /FlateDecode >> stream xÚíYAwÛ8¾çWø6Î{1+’"%í{{HwÖ3iš­3îëô X²£Yr-9™Ì¯€ Yf’ÎÎe›L‚À€â£þùHi¦‘Œ¢$d*àj´X£ÌýxÄ-ÏÄ1Mú\o¯Þ¼“Ñ(a‰zt½ìÉŠYÇ|t}¿e’ƒ„`|~9ŸOÏ&gÿšžý|>?žð„Çb|zu5½<Ÿ}>ž7ðÁøýéå/§D»:N€íÇéüøëõOGÓëN¯¾î<¨Ô·£/_ƒQ[øé(`2‰ÕèÆ“DŒÖG¡’L…R:Jy4?úw'°7k^õÚ‚LH-<ÆÂg •0-…4Ƹ¾ÍqoÞ…¼ÇÊ&#\ÕðLBbÙ“ÆC¦–¥Þ´E]u">^ÖÛcyc_ëKÖ°M©í[·uÓzD ÁÝ­ÞÖ$¶®ÊGã]“ivuéÛ.ß>±Ý¦U³©·-œŒÄs;Ô Dº-êÿÝ-ÕF ô)=špÎ¥„yÕm¼²·q|!Ƙ‰€ë—Z…qä¬Ðú­ ­Ç㢡_P6ÃQBJ“—ù¢¥q{›ÓÀ©Š´ÇMÎh-%ûkEšQ œ]€Íg<Í¢˜'–i‘Zunì:iõHÚ˜3Êõª*þ ”øøHÏ.OßOOˆ|9?!ƒ 1!¢dßàó§†QŒç³íèçéŽ9çcóÈǧŸß}´3y»7 5þõ6¯ˆVÕôÛ©"h£æ]²©7›|Qü"ÏN<>®Á@Ù×½ŒG¡ó²t×Öë´-iYÚuéœZ:µú¥›±\½Ùi›[c$’…ZtÆà{ÞEöH'ñ­!Åã,_¦»²5¦ÇEKŒe]ß5Ä€adhƤø '4—VÑÞ¦_wšæ7k¬Ô›]KüÅÒêáõs)Ћ•‹åÉ™ßÑ#óƒpÆ©UxUÜç•]÷^@pÊ„pzÏWв“Hm|×ifGfï8‡ÂòlP*käƒ ú&`a¨\ÀTéÚ0àȪ at1˜ÒOV·mžM2ð·ujÕ%`5LYFz5 iéÔ^Ôe]Á[e±.Ú<ëÞ³hÅ“ˆE¤'ÍçÕ`Ä(‰ø«N¡‹~kb0ë‹8$ÛÂàêú# ¶Å˜ŒÂñlI³é HÕ–gAM#c?ø]€‚Ó2 䨴é¶-ª•}I­~Õn}“oÉ:Z0‹ýX"78¿=°è!@ó*3‹˜Gû^þm‡kápY—eý0|%wJš'«$Ž­’fü[ ‚œ­0¨y€¹ÁPÑÿäB†JG1°ðg³ (¦X»QM¿©AQøÃ ¥:¤'x$ƒÀàÆJXÔUKÈT–foRžˆ²[ÝÚe¼ñ¡Ï"º8™üê+çXwÞ| žÝ‰yxNŒÞ‡t8ôVS:ùÝ’0ìwÞù«IR'/ÇÒ$”P¨FZ pË‘ó⢎ŒÁ˜ÊmÑpûApÒ25|• <¥ ¼C©PêB¨¿"• LŽK Oèè58ª«Ü@¨ N =í«¨Ú|{Op';1Mn§ÑW­ 7ƒê[í)•Ój^gK“¡Œ_ò’Ir¦âx`ù§òJÛR 2å•-u̸ÖÑ«h)DWPZ¢ð|‰a³„ì)ÊÈ…f¬]›ß0°ÓÒóS¬báƒxÊõÀd£ø¨"Š6ƒ”flBØ@”Øwœ–‘-é´9œ ôAq4@N³Fßú(†øM(gLoSJô›ÿ`ßY§¿ëÝšÀuv¹ÃÚí>£o­Üò€ÉU[´ÎLß]˜ èéÂ.ËM&(¦ ˜€5C›—¥ Â_Ñ(“}IdèÄVµ·'Ð,£¨×¾à² 3«€‰8Õ•Û†VïÍ%ã*ÿ½%–-…Œ³á3ÖrTû<:ÉO“Oþ‚§‰”‡¢½µ/ØâC@5&ãxP¹O?+5þôîRÿéÌöò}÷;!ÒÃm±¸µgÙ ¼£ ‹&ß÷¯ªÞ®]mÚÝÍžôº¼wq“ߦ÷ø (ñ×5®£ÎÖþ¥`¼×õÊ Û¥áfjí`wë|]»vrפ+KÎò›ÝjÕ P“ÈtÕx [&%:LÚbÅ•yT•ŠÅº«ZO<’BðTî:RÅ#F0uþÜeìý 9aRE]§½MÞ 9aqìLǺÐéÜ[B¤!ŠaM*!Ïìü’L2ÿåêêƒq¯kt8a)AjºsqÙo/6cˆ¨ ~Ì!eHÙÕǦ+ሒÌÀÓnvEÙ‘‚‰¤$° 3‰¯J+ÒÒ¶Å0•AgXX!XØÑL³Ûà††°MPÉ»€9],ò%RˆҊfS¦V´ ¶I ðViÐOŸÎÏf3ºë蔀±æ±–<%×—îW:€t´¥½)‚„aiÚ_|àO­‰SxÌ«Emkl¼™YúU¤ÑMîò%=7¶<·`u çj?gaòÓîŠP²i‰`bSÇx5I}8®í¯µ/(ÂÇ+"íÉ£—´íµ•mÂ\wpj¼92N<Ö»2b.‹»¼¯üî¶±ÕT<ìIM¬Ÿ¡Êä2¸õN›:3&ªÑxR«rÚÔØXC hƒMO•7Ä鯱⃨«qíÁ]¬ fN ž¡G´¿ç6V`‚Œýw±“Nâ¤/Ò\´r7©ŸVFÏgóÓ·S³†Šaèî&òê¾ c«ÖyÕ’îSðÜ›oX„¡)´ÐxÆæÆžÖææÁÔ³0 ~‚/e–º$ª5(öèŠéá…¢[i?ÿu©âk_z%€âuøŠU—öÇñxW5~°œe`½ˆÀ6HóÊ»Ùݹ >À×7y»x³5Y—AŒ/}+}ŸO§´»Ó‹ù‡×ñ;+V¥AÒ– ˆŸZbZ1„N@»¡äçZv_!Ž'f]«ŠÓÉâ6_Üe‹H‘ )6¼—þkT £ ´jíË¡T-Dd·F?ôÉÃ¥õ2_¥¶á€g°US4- Ÿ-Œ¨.í·u]²×mùXÕ3 GiúQ ¥#4—çSäêD(ÌÕþï,âݵ'â0úÜgŽŽËg vÿ2)}õ—LE¡K²ð=7Š{%ÌW'Òרî³.‹Ò[ðCmŽŸŒò²Wå7ó&…Œ(8ŒX ˆ4|þºàf¹­×wùã‹âc¨Šb-öÅÿós 0p¤ÿŽôD¼àŽ«çƒ==ã;«Dþßþ; b/Ið[ä ÚsŽqø þ@ë}¼?ŸÎÏ>ή®g.=9§CåÐâ‡pAö~ú]®b®Ll àÖÞ·]+Á¬¹†Éód"}^¬*Ó˜ÂÂÿùœ*góŽ¥;ÈEÚE]ߥM‘Ùµ>á‡d¨Ã3i çÔÜ+ì äþdKó^s¹³#ûÔîª{pIgÙ¸k {mñÌm3{î7¸ ~íðDiÐëßþøýô•Xâ]™÷»¶ˆƒ—µS íÅÃð@u÷™üP÷?¦ù#½endstream endobj 2467 0 obj << /Type /Page /Contents 2468 0 R /Resources 2466 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2469 0 obj << /D [2467 0 R /XYZ 56.6929 794.5015 null] >> endobj 2470 0 obj << /D [2467 0 R /XYZ 56.6929 523.9144 null] >> endobj 2471 0 obj << /D [2467 0 R /XYZ 56.6929 414.7474 null] >> endobj 2472 0 obj << /D [2467 0 R /XYZ 56.6929 353.4012 null] >> endobj 858 0 obj << /D [2467 0 R /XYZ 56.6929 315.6213 null] >> endobj 2473 0 obj << /D [2467 0 R /XYZ 56.6929 283.1208 null] >> endobj 2474 0 obj << /D [2467 0 R /XYZ 56.6929 248.0689 null] >> endobj 2475 0 obj << /D [2467 0 R /XYZ 56.6929 183.8008 null] >> endobj 2476 0 obj << /D [2467 0 R /XYZ 56.6929 95.2626 null] >> endobj 2466 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R /F53 1333 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2480 0 obj << /Length 2274 /Filter /FlateDecode >> stream xÚ­YÛrÛ8}÷Wèm骈ƒ+/óæqœYÏdíl¤ÌÌV’˜¤,V(R+Rv”¯ß @Š–«v·R&pЗƒnšÎü£³D†„§b§"”„ÊY¶¹ ³G˜ûõ‚Z¹SšûZ¿,/~zÇãY¦‹fË•·V’$¡³eþ9¸úðáæîíí_—s&IðKx9—„ÿ¸ºûtõe.S\ýz³¸œÓD0­$´ZD‚·w‹ÅÍõüúþ› qùuùÛÅͲ惧„kTÿ¾øü•Ìr8Ão$äi"gÏð@Bš¦l¶¹’‡Rpî$ÕÅââŸý‚Þ¬yuÊ’'¡LX­Ìc³Aín­:”ëu+ûf×ଖÕù`®ø÷›ùKgùÍ[qÁ{|ÔM÷F,ÓDh³ÚP‚SYì-¸´$Ç¥akq¼µTw†ª“àÙŽÇAñ]m¶U¡“NÆ&;´~f­Cƒ£™àá$„ª_vá0k6úw3¶ÀáíâÐé3w8¼‚ú}\¼±±Þ?[>ñ#1ÒF„ °ºm‹lnð»Ì‚°4¿yõtI) ²ÍÂf÷ˆRç‹ L(¥ˆ_IOëLÂ8-“0ùD€-’Trw pFpoU·>I!ÂV;°×š€8H‘†1â!ÆEëÖœ  $ÆMœz'IC¸¥#ï0§7‚¾6¸pÛCY«Ý‘BIð©utwäÈ¢í u^¤8™²0‘8ï1_ëeõZÆco§<¦ë™žâÚÕ®Ù|+gÜ–°0áðîY˜½ÖÎù’8L(O‡@ÿ¯nä:žìÔ‡`,¡K°ÿÒ‡ãblÎâ8Œu™0×õãX|,nnðÝ«÷‹û À$P^Aø7€ý ‘$ÿ¨e«3EýÂd[>Öšˆ¼é ÌdˆõêÓòï÷_y[wÅ®.:Üqq€›bc]vÝÔm³ëÊý渟¹ˆÜ~*´Óªp(È éAgÍS±S…£X…TJÄv§6Å42¸ciœ°—º… &àòG†c]ñ²ïö~âW;Ã÷{÷+¯ÈyÝš‹CÝlÛ²§Rx9T÷ ’ “……2©/ˆ³dà­`rLLqSš4N÷Ïóßñ4rHé)*í)¢ÜY×ì5´aÄ$µš_ݪ«‰U¡ÎI")OÊíÁz@å©n¶Fë寮ç\¨õ—Ë÷SPÓ02/½yuéú~n]Q@Y2^w7±.Ä %Ù „(uN=©jjq KFN@g¯‚†ú` &Æ¢ÜgöÑ©¦b´~íë4ÓÝ•`Ãx{³¸þxkºÏ zžæ9?ãG™G!©; ¨¯!]§$lñ¨EØÊ£¸±Å&/L+|~,ŸL£Û¬€p¤Ójƒg]÷jÖ´¯Õ“}©+7¦ÖÒMÑ©\u `}P·Ž/·ÈìÛbW†×ZQ·Jª›iªªÔ¶uw¤k£úÓ{ôöµj88uÝðDLÀ5Â%»Gpƒ68†nžP¯ æq2jƒÜŸØJê9tSpÃ^·®ZXÚI¬úaÎZ‚gÜ6mi˜ÆÈ6ªËÖØr€*º]ËÑyZÖwšM¦êÚ"ÂÆ=A§FÏ@¼R&’¡glGPà:¦Á¦AU¶¦'¶q§\¶`ÕÎ)˜ØH©ëÄÁ{XÕmá¦É÷•ÓÅ 4ÊÊ®j­Eú†.Ã"4ßh°Ý?Te¦º²©­De]ùä  RñDƒvÄÞ‚EUèI}ïëæIð`iŒÍb{.Mžiê@âpk™q*ÈžUev#«­~o&£‚¯ƒ8Ëö;Ûªe…ÙŽê~Híjpœ]ùè%x×3¥ÙÁ.¥êƒ©G4Ñpyöå1 ž×e¶ÖC±¿¯¬4SÐáÐÆïÆaß¿…&^œT(i;€†CŒU~Ü€ÀÑenlÏ+UV6;[TÞ”ë'q~›Hi‚`ÂY^7 ¤RZ§ `õ~ó04yŒ1Ò®Ñ|±a/­j¢ÂZØfŒ°Ã…²¶G4/TÍ®ìÖœÉ-1Ùà÷&FcºÝRÕoˆƒ±Ã¼4€‰ÿÑ‹çÒûFHkœkcf©º‰ ›`®.žñ·&ø‰MÏàòU…æhdy42•­ Ã׸ ËNúpè¿åáävW6»ÑFk5•uc)~­lçwD1âøïÛÒçrï`ÿ™­mª§ÂÖœq;brö2“'Љ§¯9ÔÕ\úDηè™1:c‰û8sP 7âØ^²ðª¹„˜û*‰S(Sº–=—•]á¡@É‘µ™¡ÜmVá¼»aˆT “6%í¶Ö¤Hòºò=’<úÆãÞg³X´ìÁΩZU‡E®™ Àhz¾kº’X@/×H‘\_ùë&Ç1&&ëO»ëðÆb6&µJ]PIiN@†Ñó+»­Ãa3Ÿ¹C£Ì\{Œcù1‘_Ö^A`›WïôÁåùdízð¡¶ÿÛ*¸ºàµmø„…m¨/–—þTÖÓŸCI_DþÏF9þÁŠcž$lú;‡B•ó”:PÚRTÈ1ôþ.§ØÿJ¤¨oendstream endobj 2479 0 obj << /Type /Page /Contents 2480 0 R /Resources 2478 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2481 0 obj << /D [2479 0 R /XYZ 85.0394 794.5015 null] >> endobj 2482 0 obj << /D [2479 0 R /XYZ 85.0394 751.93 null] >> endobj 2483 0 obj << /D [2479 0 R /XYZ 85.0394 546.4203 null] >> endobj 2484 0 obj << /D [2479 0 R /XYZ 85.0394 481.4562 null] >> endobj 862 0 obj << /D [2479 0 R /XYZ 85.0394 441.1625 null] >> endobj 2485 0 obj << /D [2479 0 R /XYZ 85.0394 404.0002 null] >> endobj 2486 0 obj << /D [2479 0 R /XYZ 85.0394 371.4021 null] >> endobj 2487 0 obj << /D [2479 0 R /XYZ 85.0394 303.5162 null] >> endobj 2488 0 obj << /D [2479 0 R /XYZ 85.0394 229.5618 null] >> endobj 2478 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2491 0 obj << /Length 2682 /Filter /FlateDecode >> stream xÚíZÍ—Û6¿Ï_á[4ïŬHJ¤´=¥í´M›M²™é~¼¶Ù–Çz‘¥©%gêþõ  -Ù²»_‡=ôÍÁ A?P#g1üÉYj„ÉU>³y"ÒX¦³åö&ž=ï›É2s/4J}ñpóÙ×ÚÎr‘efëÁ\™ˆ³LÎV?F_ˆDÜ qôÕÛûû»/ç_¾ûë݇WßÜÝÎe–¨8zõþýÝÛ¯^ÿýv®ÒÄA8Ž£?¿zûë7D{›«Þ¸¿ýùá»›»‡`ØÐxk´ê—›Žg+XÃw7±Ðy–Ξá!2ÏÕl{“¤Z¤‰ÖžRßÜßü%L8àºW'7CÆBi£&vCÉ™”"OS5ÚŽ4F+í¶ãÝû‡×ïÞž¯D +¥™Yi…ÍlvA3 ͇R^ñ„¼ê¯Qåg_=»2m`r”XWuyjVKÍLvÝ,/4a–*K…2p(Ff½^ƒ‹•‰ ².®C!MšŸ˜w2«rBŠ…ªŽ¦ëžÊeõS«rõ(ZFý¦lgqDB¿µ è5íne•ÅŠ¨k÷Øné©ß=Iá¼uù9Λg« 'þXv=Þ|Ѭü, ‘ðýÝ?ˆ‹b°,ðn*ò<·³9!Šš_Ó&Z•}¹ÛVM¹â犸˾>e`²NYŸ+ÅWоp;’³YšÌ:ß}¥ ˆmœñÎη›/¡ã°ù8á„s¡¤ Ó¬~wšö©¯Ú¦c{[úmÚž%­VǬ/màsÚPeS‘å™ßPE³7”Sho`°l·[Ú x¨asÅ¥Ø4&FI}=6‡R—c3H¹Mù~"6%d¢pøÁÓàåvw8µMªDÄi¬®¤&¬9Bå"ÖÐFæÝ—=x²%mšÌ³ÁÉC›¯jˆõ¼©–"},üâ²`î¢$ºÝ7+Hõ*×ÑWåºØ×¤#snéZîw¤¬é‰óÜî>VÍ#=Œ-‘RF—ý§¬Ð˜+®ûo uÅ^jcÿ%˜Ä;p[üZm÷—j‡üÈÚ 0^]72HMX9(%â\¥c3É*ñ‰!1ѧ¢Þ—LkéwÁ¬}ç (Åé[a1H¥4ƒu»#6Ë¥>í‰XDé¼çCäMQ~óa G/Éõ8jŸ){§6ä@z95È…;âº'Lxty=ÅêâŸÚ®«U]õ"´kâÃ6T«–•¬‹ªÞÓDpFµŽ£¿ zW2ïªGoˆÅÓ´âBâq&_•Ų¯>½+IZçCcµRÑv•C+é\€”²i÷¢õÕ–©nŸiÃŽ€Öý®ˆ†á8"g é¹ê7Dc¦Œê¶¡Â…TçQ÷nK„Mñ©/‰¼RþúÄчJ1ªCùÁ'bumý Ý“ÀÁ_Ë ú¹‹r݆å»xÇúª)mxñÆËÒïÓžkì¤>·|Ï—W$~øÐ•=8Ñ‚cl ß©šXϲmV•?1ÔwVaDÕÅÓSMYæ%èç¹ØùƒU]ÓhÁ5æ±lÊz^xµJBÉ£ƒñàÂ%ÓQ]6è•):™@ë=“ nSPdÁX ªÆp!Z˜K ½LnÀ);zÞ7•K 0$¥ŠÏRú-V+ZŽI¨Û¯q,¸¿þ öÚšèŶzA2èÚ‰€¸Ý÷eÇ{÷bó‚”9`°i÷»À]rWÅ!0ŸO™Ïeù1p·í){Û6ý&ð§ìCYìºiçT KpLxi *HÞ7uÙ1kTI“ ™B§@ù8y#jI<`Ú<á¢,Y;ef§¤%Šƒ>ë ¢q¼ð*ÆäÚŸ¼^O™–Y‘ÇJþ§¦¹Ü­³Ld‰ÌÇqu‚Æúª8´ü¶:'týYá¢?§aÕŸÆY †’_y‚î|sÎÞ{˜W‚@Þ"Øy =$6Öy= ¥.£‡ 5„Äcô a§SN|B»ªkÞ¼jcš0räd­…NÒdl%íû'ðÞjìlZ"-˜ÅG›Ÿñ[ÇÞGsïã\Ób¾\Ùȳ;—Üü#ì€~HÒ|<@8PÖàZÄc·xrAcðt—-u<@?±öàá8Axö:¨ŽÕÐáÊhE$ Tî9àË©„JjžêbéÀšÕ\Üq„º¬‚†é™žA)žoŒ@KÅ’õ–Ä'ü£S<þÀ1×ËøÃ‘6,×Ö¬<ôµ æ / ¶ôëpÍ<@…xP×­:ÁÚê#ްjŒ#¼UÚ/\Ó‰âÒ6îŒbDvÝŸvë~¬ž–K63à!Ô+zö+”й±(Hç€â@ño ‹ •Ïr£bÍP Ù d]Ðéic®VíDXè‡U'$@áÔP«g Gª= $Dãnή–/ÙÇ»‘ÔŠšy¢Qž³ƒK.i fè“K™gW%bEG¶Ê÷(±º°n¼ÚILÀQo¦—§™+°2‘ã*krégY5œô9ýHxædBcp”¥!$&õxÊ]VTLÐì–iý¦íJ"¹ôƒ¤Ýmíqÿ´L != LuP‰ …æŠ+ i•Eäðžw %Tí| ÿCŒÄþÇ©øsÇû/Á'­ðÖ\þÎÅöPê2| RÎ÷»ß»ØÞ•˜¼ =U Xð„‚¹ã$V×í R†ŽŽž‘ t:¶” ~ò NU…­O°ÙW¶4\0—âGÅé‹\‡Üºð•°.Çuih$OÎÑg1œ"}˜‹Ý)È—ÀRFÑ Ö £)гnF¹çá‡á®É¸L?#@…2æxƒªƘʤ™oÌL¸Ã"‹æSUÂ_/jÍwð«”Héj‡«€N¥¿»ÔŒÌð·¨;~ƒ€¾àSœ“k&òŠ’JäyæKSlË©{oƒ”¶Ç„;}Û>—tl±UÕšU±Jê»´ô-!˜´Ü ÝŠ ùp4ø ’³âLÄ2ÏGwõ!aœkK”w n@‰©"•b¯î»C›X6㞯ƒŠ^s†"× aQØWûK`èk€ÆÏTXyΡ’@%ö™ôPi\øÄxI2^R/IFDrˆ—²œñÒ‘;ÆKòˆ—š/IÆKr€—¨‰@-§xI^š €€ZþÿñÒTñPÒŠ :Ò«µc t¹tx!W9–S·KؾÈ/ÛíSU—”=±~<pJNk`°rÒU3ƒÐ¹ãÊaEšX92ô>ÜŸt£&ÁCÒzÆy2Ê„bè‚p>\×y,怜¤NøEÕáÓ @–8ú¡ó1ü‡ {%ô¾ƒC× ¥ð³Eb„¶–?GÜÝÑ»¯ÞÜ¿›°qs.²,×CtßòãªCØ•ùv&qWo©Û’!|w‰w%°§û…e¯~xøö݇k+ ¿Æ4Ò”œÉî]_nÙ¡_¶M×îúj¿½ô/:ø G+¦ý×ÿþpüGÄ e>/á‡UxÙx£pq21çÑËÿ(qnû?Ò¤Uendstream endobj 2490 0 obj << /Type /Page /Contents 2491 0 R /Resources 2489 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2492 0 obj << /D [2490 0 R /XYZ 56.6929 794.5015 null] >> endobj 2493 0 obj << /D [2490 0 R /XYZ 56.6929 750.8289 null] >> endobj 2494 0 obj << /D [2490 0 R /XYZ 56.6929 162.6734 null] >> endobj 2495 0 obj << /D [2490 0 R /XYZ 56.6929 86.4068 null] >> endobj 2489 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2498 0 obj << /Length 2389 /Filter /FlateDecode >> stream xÚµZÝsÛ6÷_¡éËÉ3&äÍœëÔÉYjï®I‰²9‘DÕ¤Kçþø[|Š@ºiï&3.v¿]ì2ÁðL$G˜©|R¨qLød±9Á“;x÷ú„8šÌe}ªïç'}ÅŠ‰BJP1™¯z¼$ÂR’É|ù~zþîÝåÍÅÕ?O3Êñô{tšqŒ§?žßütþÆÎ½;Utzþúrvš‘BbD\“ <½¸™Í._f³W·o¼¾ü×éÇù'—ó Y_{‚™Vëד÷ñd ›øá#¦$Ÿ|ŒˆRt²9É9C1`°Ü¶mµÈ–íê¡Ù|®¾êÍ„Œq$a†ú¦ÜTzXÓÒ@Eà×T=N§DN-7ƒíJ ;²PºñÌþÞÞÚß»j[=”]Ýlís×4k'6Dâœ:±¬` +vöuÛìÚº=´Šhà#F\I™B‘Àf(Ïaœt8Œ0Êú, Â9I8\ :Ã!ì÷Ù“Ýg=„rÄ©s›¥ëê©räÖRÊQ}ôIÑ0*R4'^H¹¾Kˆ àS‹Cë;ð)8w¤ËfSÖÛǘ,pœ?Ëq>“VcšÇìÞU½®@ûޤìÏ8@ňxªaÈÚo5Å QVÈ?b·ëçíV?T‹®yøš`Ês$('ÿghÃh‘à ‘Hþ`õb]¶íï?%ÿS‡{Ÿ­žeç=òP=†ÁGüÎ?ŽÁQ¡øñÜp»ÞQͨÈ.TÇÓ‹ËÙËÛ«wó«·7aUó9R9sÇYNåÌ»QóØí;8”òiw_é˜^Tëê·~x1«ï ØñÌñÅ þKk’KÕ6f°¨,•]4æw¹_y{«WžÙ¥¥“»¬>€Q·•£«·öõí«—v‚ .í¨Ü.MBÌü.œÚªÂ.€T•s¬ÎìpÕ<¸ôe6§óZýT¹”i¥Z­ú¹í­1Ãì¨àpq)ÏÊ©’ãÁ«Oåëƒã਴܌ŠT 1&é¸HO”Ù÷(ÌQ<ùSëàšýí<#vhìÕ‡rYßUmç^®ïš‡º»ß¸pÝÓU«òqíkÏ¥±¿^Ò§¦»?–¹]îç(ÁTI@xP…=c€Õˆ<•14À˜È½ŽD& Ð6þ-&ˆI E§àãõ©† T —+ETHaTHÅ÷©Ò9ÈrüNÐâíUB½>˜DçI Uz¤ß "Ú`bLYìÀ.;=ÙÃ.ã…˜Î=ÑS¹~¬,M³Jf¤*sšÜåj¼@¤ >ôn½ìONT³Ý 2¿îèwú<Á#±áÓÄ@*Ἢ‚ĉ8r·Ê_¿ÍíÈÇF½†É¨N)ÉcÑ’}o.–ª—›ÝºB ¬žøO I]C­ÜïñâO` rÁÆ#|Ÿj8Â*áÏ:†xT¤'JˆŒì Ân"‘WÛÅúq©í%ï/³ë¿´vøÅº5ŒüUôöÎ>›¢ˆ©ã¢Ž{1ýÇ)‡¨ÜÝ7ÆLÁ_;–ÍN_j˜cC Ü^µÓ:{™&ªêá}ùTùõÆ—ñôzvmg ³Ò8ÜD·lEìÕᘩ×k×Ûú¹Ù>U]µŒ{à*ï Þ=Ô[©Ì„qõèØ»­ôŠB´/o«Â$ʉz¦jèSø”§2>µNV „†`·¿¢ŒêB㚪„j‘ïA|Å„¨X·×Öµ4>Ršœ ?oô×§ŸõCᬠ³ÐÕt6lƒ‰M~Ea @¬ó#e¶4S¡ê_&/ b‚$®j#åAå‚QÑÏ'ZønWm—•SÉ8èÒyɮ怑.m Ä ²ôäQ ¬ÊÅ}Êc— 1ÚnÒµ…Ç’tE^¶õÒ½úYcY®ëeï[’¹D´ ïkcÿáÉ_-«vñPªÔØßòålø*Hq$6êË=¢aWöDÆ“>k) YÓQyžæX^t $•HÞõAkòÂÂî¡ðµlªqìײðèkÙ>ÉA-Û¿›ëÙÕÃײŽW,µ<ðAûŽÀ=þ™'Ð [ÇÑã,ÒwPÊe_ø¯Q˜¡\WtrL§@s¤Tb0"9&}­†›þ€­Õ*ŒäméÕ»Ñã¡¿oßK:ðý?Gú›w ®Èÿô§õýÿ"È¡µ—C7¤ ë¶Z¯”–äÅ¡êá#ü±îÿƒ¹æendstream endobj 2497 0 obj << /Type /Page /Contents 2498 0 R /Resources 2496 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2499 0 obj << /D [2497 0 R /XYZ 85.0394 794.5015 null] >> endobj 866 0 obj << /D [2497 0 R /XYZ 85.0394 769.5949 null] >> endobj 2500 0 obj << /D [2497 0 R /XYZ 85.0394 744.4041 null] >> endobj 2501 0 obj << /D [2497 0 R /XYZ 85.0394 712.3006 null] >> endobj 2502 0 obj << /D [2497 0 R /XYZ 85.0394 646.0353 null] >> endobj 2503 0 obj << /D [2497 0 R /XYZ 85.0394 555.085 null] >> endobj 2504 0 obj << /D [2497 0 R /XYZ 85.0394 479.7864 null] >> endobj 2496 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2507 0 obj << /Length 1585 /Filter /FlateDecode >> stream xÚµX[s›F~ׯУ4›½³Û7dˉÛq-¥“Ž“,!‡ W 'î¯ïYvA m#wÚ83a³ß~ç~bøG†B"©©†š#‰.Ö<|€woÄÉPЕšÌ¯ÏY8ÔHK*‡óUK!¬Ηw£ ’h xtv=›MOƒwÓ?Îoß_]F“éå8 B)9Šnn¦×gǶÀŒGWÑõ‡èÒ>»k:ŠÞLgãÏó_ÓyK®«ÁÌ0ûsp÷— Ç¯Œ˜Vbø n0"ZÓázÀC‚3Ö<ɳÁo-`çm½Õg.”K0 œª÷›  9`0Hc6J|fk¤ŒÙ‚'£èësÉ:’„ ÆCèF$Kž’lß:Dš*:ìy@¬ò£Ýã0EkÑg6KªÒú¤ú’ØÅ2¹ß><¤ùƒ½­‰!Ë4ÖZj.%LÂ4 a5âôctus9uº ð0 éËZpn‚ 0‡Ñý6Í–fId4{ÁUÚ§g3ûðöÖÞ¯6c¢FÅÚ>5{êó¸êj,Rüj-ü.ù¯³-Š5:Á˜PI$ö% VZ»_“çOÓÌñÊãuòªÇèYV|s6##8!0¸`¬³­áqçKkÝoÅ6sË{gÿ´,·ÉòB`@¢ÁwÜún™—e²–åjS¬ä8gµ×—«»;o6z‰>nÒ¼²Ë²X'Õ—]¬¤_“ï2ƒ¢Aíŵemül®–k½°ˆL£³(ŒB>Qgx)R9Á§”†Q¤D4Q“É(?ç^«HðóZïšGÇ §bá‰æ¾àÆý¨>¿¸´ÕêHL×¶c¤3p»ˆs³ ÖÉð`™”éCž,íÝý³½Vív‘.“¼J Ô"®Ò"wÆíVCJ@ˆ¹0ÏáÄq|’š?iS1x›ÅfïðÕ6Ë,ÛZ…1%öÖD¾‡€ ‘ UØ;ßF?'!’a¨úfßqCFÏC~J"JåcW ’<ÙÄUҤ˳+W6 >aüGÉà°§L\$ï2[=].ºÃ >9ÁnåÁÊCz•G !‹,ÓM²¨ŠOUhOÐ`™“|µWŠËjcrëð®§|WŸ@ÀƒÎ9bŒ5<Ú\ö“fIÙXuçí>&DoûûÓIØÔË ÓhL¨ý>LÝŸÏ¥¨uR×7ÉÆÚãjTX&:Ò'';‡RÊ{N-Û|iÞ:À§ÄA¤«=ó÷Îýž–U‰^P*fÓ©Ý]ÎÞWÓ¿&o^šZñW‘'×5.Ó½ 3]‹5œ\\Ÿ<Òö-×iJ@ٔǣÛd•ÔæLò…Kþ«8ßBÆÇ™¯/ÊñPÒ6ZIp¤ R8ÛóS{“BùC ï& —ÃqÎÈQ8䃬$=8[¥‡ÑŽÓ~•âkŸ `IÅã¿‘é…Eôaþöýíñx¸È«d“7eiö\VÉÚU¡Ó"/‹M•n×»c!ùlÂò])ΛQz+ÆÝ i…,¾·ƒf·0­*iËâµ?ßF!VûáÚB Øä\hWöçA›Á½ nÚ˜M´¢È^’PÏyñXB)Þ›Ž¡ï… Fj3Ù†{‡û»~8Ów!êÑ™ûfúVjß­êÌé$zÃ>ƒÔ1®qÓ~ã„ì¤hZù]À>[Ì» ö€ö›Gœ=›´ú²öà‚¤†Ìu’-häíSXBÃ}]¬V¦OÂB› ãû° lÀŒ ~v¸,³A·Èâ²ô 5"YíŸý¾Ó£°I?ˆ’£kWGWYìkì”C…UtïM»ºð ÷Õúw&°¿R´0¿ñy¿Þ_Ûcß ¿½)§~æAöµºà³[5ƒ«ïÃ`¾yšn;Ðþè´ûÄbJQÿ ›eCÊ(C¸: N0¢ zü!÷¿ô;Ðèendstream endobj 2506 0 obj << /Type /Page /Contents 2507 0 R /Resources 2505 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2508 0 obj << /D [2506 0 R /XYZ 56.6929 794.5015 null] >> endobj 2509 0 obj << /D [2506 0 R /XYZ 56.6929 692.8049 null] >> endobj 2510 0 obj << /D [2506 0 R /XYZ 56.6929 544.1607 null] >> endobj 2511 0 obj << /D [2506 0 R /XYZ 56.6929 446.1895 null] >> endobj 2512 0 obj << /D [2506 0 R /XYZ 56.6929 379.4876 null] >> endobj 2513 0 obj << /D [2506 0 R /XYZ 56.6929 300.8306 null] >> endobj 870 0 obj << /D [2506 0 R /XYZ 56.6929 259.3294 null] >> endobj 2514 0 obj << /D [2506 0 R /XYZ 56.6929 221.6367 null] >> endobj 2515 0 obj << /D [2506 0 R /XYZ 56.6929 188.5084 null] >> endobj 2516 0 obj << /D [2506 0 R /XYZ 56.6929 118.8847 null] >> endobj 2505 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R /F39 1178 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2519 0 obj << /Length 2924 /Filter /FlateDecode >> stream xÚ¥]sÛ¸ñÝ¿B3}¨<áðÉôɱu‰Ï‰íFNÛôîh‰–9¡HU¤âú~}X€(Ji§ãs ,€Å~ïRlBáME¨Hå$N%Q”©ÉrsF'k˜{Æ,ÎÌ!Í|¬wg?ý,âIJÒˆG“‡'o¯„Ð$a“‡Õ¯Ó‹ûûùíÕõ?Îg\Ñé;r>S”N?]Ü~¹øˆc÷ç)Ÿ^¼Ÿ/ÎgL%IH‘F‹èôêv±˜_Înæ_þ|÷éãÅ»ùÇóß~9›?tÄù`ThÊþuöëït²‚{ürF‰H5yJXšòÉæL*A””g‹³¿vz³féC”HˆJx<ÂÎ&Œ‘T)°D¥$\–\Í—Ÿ¯ï®ïnõmÌšž‹t\!qœDyU5M¾œ}Ë_Ÿvõ¦ÌóÒ.âÞ"àx”P ‹õšuÞ6ç3¡Ø–Yè¥hŸjŸsÖÅ÷¼Ò Ÿê}ÏÙ´Ä·§Ý9K¦õÑ2|,w¯Û¶Fø93«|Úý²j…Àã¾(W=üF)/óÆžPïô-&3Gø¬cšf;jÇoTÑE¾Ü»ƒôÌÃ0{ƒoYƒÏU®¨ò¾>?ÿlwâJ(»¢Z æ$’Š€ý „K9²ÿ˜eØ-}±”0!Ëî*Ûä#2á‘éŸà #ó¹Œ/z¤hðÙlóe¡o`.u,‰§Ëz³AÒa¶,ª¬DÐht{löMk¡¬]>#f·ÞÐi ¤Æ›ú£®,¤%cæ^ž ØÁI*Í$®ÞáM4Ç­ ó¢Z#¸Î«|—µùŠtšîYðZÄ„²Ølxg,bq`à”PÎ$b‰ÒqÿdQf=޳ÅCïdqô‰³ ©Š„/[Jâ$UVnY¹®w`:›!YL‚Eóø$]Îa¾ž0%IDÁÓx”-ò2_j#æœ[N€&¸Þe[ uô]`F_ÍÄ÷¬Ü[¤}¨ÂœÅàæ¤»ç€@Œhj1­ŽÁ¾nÿª?È]©7¨<Ì ‹Cí”Ň c”O¯±”NoÁðE8i†z œä*²Óø®·ïóËË÷w‹‡óXNíŠù%¬¾‡¸®3s£ôÊ¡ŠD*ü×LeT3µ±ÊnØjõ<ó}Ò2s(EÕäUS´à]G]ʵæRœL«Z?SõfØX pŽ~3_éË%Æ`+D³DÆjÈ× ‹fî­¡G‹ƒ÷ |C›gàxfQ¢L¹µƒ$&±b'o©À,»àªo柤lÜ3€}öÕ¯°@‘’ ‚ç÷m@kŸ³Öj˜§ðjÅl\¬Õºç|ùÍE¼'§Å(¶Y[<eѾº¥:ükÈp‘èø9¦œ·u›£äØ[ >J50‚û€ñÙh щ=ÇWY[ï^µµ_l¶e¾É«v`fÇØ†g}ÎâÂÛ6@ƒƒëÍÆŒv\ÙHÓ_+ö¯¥³€·hÓW,‹÷m Á²XfeiyÕ˜ô %aW;¹l„ŠlMŽÅ(S’ÊDœŽR>Öñ8Õaõzé™ "DÂOéFŽd‚AÈ Žü‚þŒ­†Ü g¶Ì¶Ùc ~)ÇÑ@E9Šž.ðÛ-·Ïë¸ÉcSãbctŠz=æ2uÞº1ëÕ Q0^4 C‹Ôî6t5Vªù¿·e±,ZOÞÔÕ@ì}Æ/:ãzãÙP¯ø£¦éh¥èM‚j<ðqíá ±BýH{<¬Úã°ŒöÌÇòF Íqñ?¯Öp½ƒ$Gp’€k:MZ‡5B[àG!Ù‹¨•âÿk0\îkóU éÄ"˜rň†‹=ªþÝ6¯‹8€7Ô~TŽÃÀßM,5»¿,J-.ý†®RC÷7—‹?1ô“à‡H"Ô@¥šýv[ï¬úm gçCjë:8—Ûoˆ1 U‘D„qþ%ð±Ž+A‡e” Q¨c¸rñ»+.Z)ˆê$]i„®@x „I(€vÍX €™Gk@0‡u%Û¬Ø!d’‡u%+;ÔP™RÌ—5®; P7™ÝúÑžµµq'_™ÏФõ|£Q(iŽ3L*ˬ_è”Ѹ 47k5ã<Ñ63åRè82çʺ½®Êíµë-pÆ\æ´šIÙ]ú#5ó°N¨™Ã2jVýÐ×è ·¯ÛCo#!TJž&®Ã¡.ÌM!Q’(ëë¨_ biRM> °ü°)[nÁWnášñr‹õy¦Ï‚aµE‰L… «-Ø6·„Ú,NýçÝíG´»Ãü ^2—oÆDª”i®¤Ü•ý©mÓè!½ÑÍüëO€í.]«°>èÂÊ ™£à9¿}¸~øŠ³= )†|߬iêeauÞmBš2ÄäÓçÚÜ´'¡?;Èõ°­øe1ÿ¬/Ëý›ã©·§FƒS£îÔˆ9LˆÒ»Áy8áv¼{øàŸÔ³…à « #Þ׆úà®6„[djÃÑäÕ+Çì•Ç1¯yÚ\=¤ãÖꌱ^¤•Š(™¦'Ïs8‡çöG)yƃ/ÃÊDÙM½Êßbzï’F›d6<×åjÖ´¯¥ìÎm½¯EZï[·Äíš·”™õïìpWö]EDI ©Œ5¼ÿ®ïª;›„§É ¦³u)ƒÚ¯Z–ûUŽ/6x™æßŸ[¢¢d˜ìê‘•I›qñ`»7PY™Å+|·-Þ~‚ÈU|·ÛE>ã„píZ@ªÑ±h”•áþXm¥c"ÖõÀ“faÚ“®Ã¸ Lð|ÉMB,Ð5m÷rÛKêA} ™-[MäØTÞ.­© MoL3[£ØšNïø‹ÃEÓí‘!ä>âG`½UÉ2VÊ w¹­¨¿ç»´A×Dý5ãúöê/}É0âõ©ÒÏ9s4·ÃŠ”*öPt6É%²T±¯H7ÇÜŒêmO{ ë„›pX†ðåx£”ƒúX—%øÚÃäQýMç4eÖiaý@ “”…´]W+­Y†AR8Õ0PŽøl ð®}€™ N.ëªÍŠ ;Öþ*Û ÓÜKi±Ÿ³ïy€Ç‡}{œ0*›`Y cUm‰2ض!Æõ÷'ÉBC :AÈT^߆Mv]^U%$’éÁÇ:®–Q„§Ñ""‚ÊÈêÁS™­Ô€ÁBˆÓtuX#„…U„ “QHÙBû#A¥Ëþe(A•mÞà¤q­>v?i¹îp”v¡)>|ä>AÂ÷P±ti WZÈi]éNƒ·®Š?Bªl‹ÁÕ"ˆ•J}æ›ÅMÿaìÆ}zYëªûè£6 ¾uÍÿvw3?®2<sŽ~¤2Ö •qXFeÞä‰T'tH#G†Y¥‰Ã#ß{ͧ®zòÓ][í]µnës4QL¬jžÃšÞµV`ô0Nm÷ÀY§ïÆ‹®T;jf÷iÍ.ŽJ*5_‡“Ó‚òŽËÉ!1=ˆI&yú<‡sx^Ð_L‰ä*<ï~WT®Eb%ŽÖµRšýf“í^ÃpÛµå»Í€eh&ë½n,÷½—ÃDCaÈ9ÿ§DHg wìQÙDŠ8ìôGÊçÄGJÄ1‚¹‹½‚(å¾È­Š]¾4]ö¡ßUœˆŒâYÎ]á'ÈáãħkqØ%BÐÁÙ–¿×Ÿ°tôîÃq÷Ó€ƒ¯j®y暪/»¢móŠûˆPDÿtc䢴ûðüÿB¤ÿ=ŒÔ•MÂÇyŸ‘2G”f“éôî·$‡´ÿ…«Bendstream endobj 2518 0 obj << /Type /Page /Contents 2519 0 R /Resources 2517 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2477 0 R >> endobj 2520 0 obj << /D [2518 0 R /XYZ 85.0394 794.5015 null] >> endobj 2521 0 obj << /D [2518 0 R /XYZ 85.0394 752.1413 null] >> endobj 2522 0 obj << /D [2518 0 R /XYZ 85.0394 646.9327 null] >> endobj 2517 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2525 0 obj << /Length 3027 /Filter /FlateDecode >> stream xÚ­ZYsÛ8~÷¯Ð›åŠÅà x<:ñÏÄvÖÖÔìÔd(‰²X¡H­HÙãýõÛnP¤DÉ©ÝÍT  F£Ñ¾¾@Ë€ÿäÀ^«xƾg„4ƒéòD žaìæD2ÏÈ1Ú\ŸÆ'¯u8ˆ½8PÁ`~9žŽ#3x…“q¬ËßhÏøZ;J~òtòF`kÔNí;ßDžQ~G£aUÑ{lÒ ¥¦Ð— K鿨”ì;6Ç…Ç6ú±»Ñ ðDƒ¶°½%SÏ’ªµd(=F;KÞ¤EºNê”®‰:ë3 ÓiiÛYÅĤ^¤kê׋¤ Üð¡iÞÞ½ñáÀÿàÂ÷N°Åuä—=Á¯¸äÇë@·8!Š Ü­e©ë|W­(€‹•ǵbž¥ÚgK08ÚŽROi '¨•§–Rg–ΓM^Óñø+—Ôn*f›ÃIòÄŒEüHߨóºH êe,DZLËâ%]×éŒÉ…“›Pãn ûunç;*6 X8¯Áv)T4ÁÖbchkÙrUÒJ*4¼’ \ ÿ.‹ôº‘âX®ŠxìJH°û'JRé5ËsêMRƒ3áUì¡ )«­l9ÜyZm¥ YPÂô$'r2{£‘„è|¸CáöFNìñ±J­:1lŒÚÕ™æÉ”ö4ä×E6]PwšT)õx{°äßYUgÅ3‘y³0©Üä3fM~0ïŠ-(¥Å4Å«‰CÄ›9±ñB©pÖü¶©ˆî¥ bé7òü r&¼/­(0>³p³=bTàùB2íeY¾¤ì@²ú G|ãIÇ=B›ë°Gh¸¬GX½ëVë².§åž[€%a7Q|\¹†«G»öÑH…nW¨®zì|͆ç+Æ«d‡^’|“R—<‚¯»¶v*¥büŒ¢áØÑwÅ(ò0’PSl–“”¥MÒú5µþ³3ê(cZ­/бÆ"ìâjëÔ€Õ.ÅCM?¿ #(€žôhìâ Ž¯ÊªÊ&yJvÃÐŽ£Øù@ %vkÏ›eZÔ4–8›ÇáìÍ:¿ˆ,iן‰ Œ6,¥p?Ü_cîxN¤û‡=¢d"sǃû¤X®ƒ„û7×Cö€Œ ;[' ?l`ƒ¶½˜·%aϰSœ§kf¶S¹hd’åYýÖM60^Ôöðyå¤NPy- ÈH³‹vL†I²Áoec WR ‘fý¶ªéŠ= wx1Bð8Ü[\Gàî¸,Ü_ú´öCpòô%ÝóÐq2"u\1ÇÔ£XÇ?  Nlºš‘¦Œ—q–N6ÏÏá§Uìð‘‰À µx'®µ¹Ž™ã²Gö¶W+(aâw–tL=Kvjá-v–¼Èóò]°Ð\×a_q¦ÄïB¨Üúm Ú¤ˆh¨Ø>s¥1£a8µ‚²9OX0g#ïö’F8UB³<›¥LÏê‘)sDZ9'JÂÒ›ì í %‚(èZ‡sQhMFQRg¤»oi5­©k} 𤙫„$i‹Iʘlä/åt†¡Nú6þ)6‰­¼"çÉU2çåÈ,ûT dsjßÊ 4ÁÎNÜ´1„#+NkbŸ¤}>aS5¶±;PåKûú,’¯E·QL%~˲ü´›]‚u$Ù¶>¤“jY “Ë‹—2“ÁL€>&[¬Û|0R>X"$H#°D©ùMa|{w{C"¾oîŸz¢ìR,oÉ|/9XA¾?µkèsEaœmW\ZøœÐ›miÉÇ’jøü»»»¼¤*B¶Ô/_îîžž<Äb 9ÝŒ…êp!UßÍðºÅ O?œR­BkatÊ•OVs)T5Xºæm5eYƒ ïîÆç\ÝÃ9eŠË½»ÓiT®³¥-I ò¹vªØZ³È°ZáBÏÂF }Z_7ëM»æ%º«» †´r˜‚HM T+}Ïßö®að,zhÏê×ÓeI]=<}mz³¦·p=»'œ½Ì©¶E6.Ãë…Ý]H>zh§årµ¡3®Œ§½¥Éš•B0KQϸz.žî)êÀPGù£E¹YÓYòVÙ#†[~.ÊuSæi²¢ž] ­Šù–eQ/XhwuKjÖ–k‰‚êà‡[¾¥ ò»>çP;›ZfœŠåiˆªU:­3›M墥þ~f`k5ˆtn‡šöŸïx•Îe oaÓº ëqXR p=ò,ÅŽ§BýN°nsÖ — ÖßÞ-B!ñJ?–s»•Ý:Tû Éð¸~ W‚<j7­tWANsbw´PÍ(ÕRYPëž9°Þ" Å>,¡Üì’Ú Ym&P-ìE´†›Eð®ßWñðb^Ûàa‡­Ïe%Î1»9¼¨MÖM•Œöw½'½)öóЧùfF çð*çæ”U'Xà…º%£(ë®0÷ Eù ¶X#‹®ÉàØÈý·fÃ¥ž³ÍNùŽ£jËU•,qA&ª­¤_9±5;Bõ:ßKT]qÒ²Œïà‹ò›ƒv'ïÉ zçy¶ÍuØ.k}v =câŸ1ƒÀƒÒLW¯áêѯc¾ðâ(» òsŒá0ˆ²ìá­hã;;èpQÎjèuÓŽ”ÔN˜!A‡é/`$€¨Äp'!6yåµî‘ì‘L¨d™d`ÉQ(wžd¸kMpÇ–ÄiÍpG½h‡iËURK˜Fv‹icÓ8d1#„imAœÉo#Lcë0}‹éŽ$B±ÓÄ ¥ç°žpòßcZÈýÕ;µk›ë¦—Åôc?¦…êg@m<ßÍqý®wAí«(êjÈ ŽØ5`‡A‘sÇÖºÍEЋ?æ‘ÿFpN˜¡[ç„६#çÅÝjp­¾T{²¥ƒu$¶°Ž¼Hź{ñþuòüìBzRµŠm¥%†·µ«K¬7ŒlЂVRиK¶Þ™’Áþ¿õ|Âþÿøó¶Œ•KåG_›ë0ú.‹¾Ûއ ‚ÀþàSžTq|\½†«G¿nbzΩ®‚ >í<t|šÁ¾6:™›_Ò¤ 3p•“Q;³~J7Ä PyQëZú–` B¯ª›nG㺞^/{KŽ'.Íö€IùÁÿ]Fxa Þy†nsA—ã²èºìómøÍ=ü¹x 7âW¯áêѯëÚ¤laWAÎ[•vï§Úå­XÏáÉ)Õä­m.Ê\¡“¹ù%µô®¬ Ðä)Ek-d“œ*÷ÔäV²ubÔ#—oYaîFm^Ï麉Ü1@q7›ûi?ž‹:çï–É[Û%â;Íübå8We•Õåºõ& ®{M_@Ùо÷Lºg2Œ›«û«Ç |ú_]îüUÁõí׫Ÿx´ù‹n·`ëCäiømWTPÎ`/óu¹Ì“ ½ï~ÅA]í¾`Uˆ·Êu/à™oò|»y,¯k÷16+,¼B*xpJ½­»íKÄö‹¬ýRµìùÌ¡´ð"?pÉÀ¯üó>$Iò!Ã=Zƒ— ñc{Î%4÷XÕ¨èe‰±¥3”½ ÷ܸ͓ܟld3ü–€õ4ábÊ[7O‚ór}4Í#oÛ§-\> endobj 2526 0 obj << /D [2524 0 R /XYZ 56.6929 794.5015 null] >> endobj 2527 0 obj << /D [2524 0 R /XYZ 56.6929 439.3142 null] >> endobj 2528 0 obj << /D [2524 0 R /XYZ 56.6929 95.301 null] >> endobj 2523 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F63 1385 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2532 0 obj << /Length 2297 /Filter /FlateDecode >> stream xÚµYKsÛ8¾ûWè°º&Bð"GÅ’“ÄöZJÕn99Ðe³F"="í”óë§ñ¢I ²<»5ÉA  ÙÝøÐh|€ÉÃ2P)ÂLóÔ¥˜¤ƒùúîaììˆxaPvµ>ÍŽ>ž29ÐH *³eÇ–BX)2˜-n“Ñõõär|ñŸã!Mqò SŒ“¯£Ëo£/®ïúXÓdt6™‰V©%iÔNÆ—Óéädøyòß³ÉåñÙïG“YV7t‚™‰éÏ£Ûx°€ü~„kƒŸÐÀˆhMë#ž2”rÆBÏêhzôïÖ`gÔ~ƒ¢Õ2Ž”o–j$e-`„wÓ *3Z°ï˜Èí©Ìá#.]{;^[­]·œtÜ 2}·%ü3n?žRÚÑ¥ql<¢v+Ö<äNø#qB™­s´w8AÓC¹ÕÑzª uª·¼v Úv‡ªë6˲Rq îª|Zç›bî›c¢’üÑýÔyÙdMQ•n¬Zn}™­î«MÑ<¬÷L!)%•îh½pÐ: ð[^;o»Üu[˜ˆEL*q0‹@Z|ǘæ×ó§¸òò²ªšÇMQ6ÐIwÓi˜JDUJaPȨVÖÝ¢¬ë|>'ËMµ^ewù*¢–H2!}ˆs·ÂY“ÛXEÒü¬Œ Ü*¯?˜–J~Âò:³‘j§r—Õù1I®åÒC„ÙÊÄN!_¸ÞºÖ½ŸL`šBuT2DôÙìsô¤ðoeû 3@BSYB@HSW»  ‡}^AöåöZ<>Ý­B¶3„äƒÏçr‰“PH²/J˜ì3 ‰†ð¦ò@8þû^<~îTXnAúË={ÈcQjIœ¡= ±öJn¥‡ ‹Nt¦•™i9׆cÎ .kæ•ý]¸¾æ!k¼‘¬tÂ]î €Á|cSÁôBVTû"ùU•Þ}7³#…÷Ô¬^œ)³G̨KÈŽ‘]\\\ ¡`úL¡v’'_¾'ÝŠY¾Î;Û €x´VX Ý¿â`•®¶áå¤ /ïÔÍaý˜Ïm9˜;=[V‹Ú° E“S;kè¯îž‹êÉ›ý >qC~#×Uiö, ¤¨_Í…Uî¿/«Æ&Ûôêl­‡ìÙgã}^æ›lÕ=²…ÏÚ|³.êކ×2Õ¢¾4°²qæ×`:ñ+0ú2½ŠàêÎÅôV=ƒL6(³`~úÁº¸/Mút†­]0ÑÙ#ªuØŸ..ÇΈöá,ÖEY@…ÊšP‚oòeî¦ZÎ= _³ò)‹UT"¢B„ª‹*‡"¡ Ýœž8‹3±'9åi¨4Q`‡Lq$5U}€GßfçW7‡‘½€º¼)óÆ…1}©a?ø‚tùSmšâiýê—#ÆEXPŽQª”£dÀƒcŒûk¶31jGI.áØØ˜Bе»äþ`¤T:Éqí­“Ô%ç+9iªjõžT|)«ÇöÇwÀ»ÔjÆ%R°æVÙr”Ì@‘Háf1ìXØ%ò¥ÈÜ z;ô<.e=F"QªE꤭"‘’wÍeÈÌÁê]Ä* £DŒBuñ+V!;gdÛdyФ!ÍËcÔ& @±Ü¶ÉZi±Ç"”ls;èúÔäÕrYçMÄ“H‘LYºí餕æOO¬²ºŽ)%õ¶éñA`Þ1ß6;9h6/ï‹2†v_­µ¸iO¦'7׳‹«ËÈ¥ü-öa>ÀIS™ö+eæÀÜÍé뤥eþ òcdCv§†ü[‚ÚŽ{vlZ™ÿ|‘ê_Ú›4‹ÒýZj g¡ÿ¢\lv ÷Áur. .æ^»ËžL‡Ô•“Âl\ËOFr?èzªý˜¿Å4›^œ9ÉÌnv¬±Ùu6wÔÎ LëÓ$~âµ™°÷]»ßî|¡Yø/Ýœ@ Š§‡ûbˆef.µáØ©•Ñ0 Ãüœ¿8Çö©ÀÓæŽcû¾ãu[ªO5Ã㪠“J¥;Ì)~‹O õÁ¾Ê â_@pû %hÒ^2ã ôÙIu¿šWëµÍÓX@æ²ÈÜÔ|ѲpçÂ> î/›¦sýT7^ÊšùÖ};+UKTAÕ¤ŸTí³ˆ{pbþjöó¡°Vãk~=îò¢¼ïÝòÅ{®¨WvwOwÞ1=«'p¬NÄÛÔ¿«e¹?qÿVËø D_ô‰>‚$ˆòüÞ{'×ÀäèZ­Hx½Û¬=vTÚo𝀀pó°+žÌ7/Mu¿ÉìSŒuÞ‚„`Ÿ7 ÛæbmÞhl±Ó“7[-c¬nRø­§ÿþ"`¦$ì›.Ó°@ ŽÔþF¿³^uâ2M)·“ ãf:ú:NmœÊ4¦ç#â[ãéèƒSº„I±þ í áKš ;¬}vî‡~Ùq 8999»šÎŽ¡\}) l]Ã÷Ί봨¶ƒLq4o°Y!¨Ó0lªêG[áÂó¦ ´ ÈAô›Vº7;*e2>…gªâ¸Xšúë*É@‰<ÏW+¨áyÓäüëèdèÑ ÍQ§M)ßîq8uz`Zb:Ôƒ ˆšéCÎAM­}a°Sô5! ç¥i̳ b'˺hŠçý ²%"ú7-Ü“ÿû¯{¯Zt‘Æ7(Ã1Óe° pm…ž2à›Ê> endobj 2533 0 obj << /D [2531 0 R /XYZ 85.0394 794.5015 null] >> endobj 2534 0 obj << /D [2531 0 R /XYZ 85.0394 590.9135 null] >> endobj 2535 0 obj << /D [2531 0 R /XYZ 85.0394 530.3944 null] >> endobj 874 0 obj << /D [2531 0 R /XYZ 85.0394 493.1893 null] >> endobj 1463 0 obj << /D [2531 0 R /XYZ 85.0394 457.3833 null] >> endobj 2536 0 obj << /D [2531 0 R /XYZ 85.0394 426.1417 null] >> endobj 2537 0 obj << /D [2531 0 R /XYZ 85.0394 362.7008 null] >> endobj 2538 0 obj << /D [2531 0 R /XYZ 85.0394 257.3259 null] >> endobj 2539 0 obj << /D [2531 0 R /XYZ 85.0394 142.9115 null] >> endobj 2530 0 obj << /Font << /F37 1042 0 R /F14 980 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F39 1178 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2542 0 obj << /Length 3322 /Filter /FlateDecode >> stream xÚ¥ËrÛ8òî¯PÕF®Š8x|Ìœ<¶âx<ãx#gwçu %Øb…"µ"óõÛnP¤Dɇ­”ƒÐ@7€~Sr$àŸ™(ˆR•Žâ4 Œf4_‰Ñ3Ì]ŸIÆ™x¤I맇³ïßëx”i¤¢ÑÃSg¯$I"G‹?Æ?qp;ˆñÕÝl6½œÜN»žÞOdš˜t|q?½»ºùÏùDÈ€*ĸ׋»Ï¿ÐØýyªÆ×ÓÙù_?ŸMZ¶º¬K¡‘§ÿžýñ—-à?Ÿ‰@…Ñ tD ÓTVg¡Ñ µö#ÅÙììŸí†Y·tð*¤”ŽÔÀ](Õ¹‹D&MÍ(6ii¥Ý]Ü<Á‘âd\Vئã¬x®6y³\Ñp^Óp½¶óüO!Ô¹ÛÅ;L¢q³´%¡}š]Ì>\HÂ}É‹‚†-µÛÚ.hîñ•Fö)Û o´- [×4›â­~ÿ>”Þu˜± œ¹žhÂéO†A¬’˜Qªu“Wåá)&¸r4ÑQ„Z˜ÑDÊ 5F¹Eîˆî|¡ˆÆ9,×±¿,óù’ÀyV[‚î@pt{n‡æÎÐ#ãйuÂVuc³ÈR”˜ñŸÂ¸øÃcûAläÉS12 ž¬KÉŒ³²¸Ý½(va]€ÐAʰí;Ó#ƒ¬7ˬ!¨+ÐågÈ=3´ó¥q/ §jãÕj5ùc^äÍ«_Ú, r·À}HÇ•n’ 1ðÐÈÍ]ÕXz9ùp¥ž¡ý v’$ú‚èŸ=£fW“5Õæ•P–ø|µ.ìÊ–Íž¸cºOGgvÑÙ6ØœËdláx“–÷ÎMÂŽ ‹®¥¿÷—ñ0»¹æ‹ýðëÅåä×+C=·)´;&¥”ãàø­h­Æ n%„7½úðŽüžØ5šeAkgI´féx¯¶ÏËÎ:˜7RÑ‚lÛT+xµyV¯„SÛÆ¯¶„4y蜬+S: i`p`#eK¢PZÈ#&p&$2hrÀ¸{$§3¤3‘îêŒ ’ÔhÖ™/öµÎ¿Ù}¾$˜ÑPK}’±鳞’‚–†RÅ=Öf­nÕ$t‘”ÛÕ£Ý\=Qû˜7ŒæÌC¶—VH< È$LA¬üNóe•Ïm'Äu€;µƒv âÉûW~¿ÉNÑÉRè ‘ZöÅ  ·QçàÁAðb ZmkT'ŽÑa0h›ë<`8IC€ô %„ <:ï}•?¡¤º[£É¶(VYyŒ¢&käÚ9©bÉ m(Òµ[¶ÄÁh³ÆKO&Vž âYßz2СS[ 9–B…» âIåL4Ø¿³9o»¯˜ƒA¢^õDˆà¬%Rdr< Ùâ°c–wBG²-/ÙLÇF´ç†÷ŸEº;gû½Ý|µ{€Õ¢*¿cb¥õ†¿Yz[¶Î6ÙÊ6 Ùp™ƒ¦ÌÉ­R É($£JŰ9ê Ž•UÃÈo@zäõ¿EùµÛ:/Ÿ Ìx_ =xÌŸÈÉ›ö íapÇ!´î}žÁ«/;* Bü­*- ÕùséØÂ —vRnÄï³ÛïjçÝ$YpH;ë`çÔkxrjã[ÜØ¹‰hülK»ÉË{;w|Œ„ìkÑ$G#OdÚá¾ÕŸÝ+qjåC2­]¬ãzÐb9=¸<Ѓ8PB‡§Iz¤’]=ˆU “0铼Ü+»$#U ûU¼¨×4ã‚.h«b1©›W—~$º•w6óh%«mã—¸]!%²M¶Èš eC¤ãŸ˜X[á#WÖ‹cb¼#òe‹²®í|Ä€«Ï´#Nö—Û¤ë9/¶ KÎb#dþ»šÆæ$ +'Œ,HÍÝâ½uþ<4\7-^PŸ ’±´ß¦`ó—}ÆÒ(H¤ O3æ‘ëÝ“€¤:îsvS.P®Üõ„Ú †ƒ,à$PmMÔµ šœWe“å”—öVQ8@ f¥`ìeöÕöðÔ^އ;â=äÏÜ £"n†Ø\åWøQ%Ü+]õÊÛt¥¼¹ë—bOæJ*N©å!S븴XN ¦oæJ¶|~) rOv’µk€·¾$¤A¨A{Ì}v:¢… è<Ëúºvá -Éã.^ZÏ‹£h™>®m9›ýBKˆ{.qZØ€±¬V„ÔVD…«U¡5•¦»ÇPm«Mcý нx$Úì}Öé†À°<ÿ›rù0v_'ò‚+öv)LÆ÷·—³HIÃL:9·‹]0=ŒÃºõ—y-åÔa ŽÇvµvN@Lñb³ci‹7p >Ê/¹¥ë;.— ÞW†árÙÁ:!—kWþÙ“Ë4ˆ±X>Ùóqû•DÉi¶<Ò[]‘L!ÊÙgkæ¾JˆÝ1=k¡~m:{¦Içí»Ø»I‡è¾o¼ÐлȻ˜ú}k‡PÌ%Dœ­J÷餃÷\æßú\ñÇ8©ƒ(J¢,Ö×à²RËÒf¾ÞçPì+ç©Ýï§é¿>ÞNÊ‹L ¶2êšO븼´XN^®BÞ oú4I4@²òê@¥"ꓼnó7wÔtcX,„m_»özÅ.|ª9,ÉyÐ'ÔXXÝ]ò†Óò‡¶âÝ,üØ©ègr¿÷Z“‹ã/eD„æ­—ê`x)å^êyØãè0öAP¸}§ƒq‚NÌiîZ¬öúå9 SҤϟK³UØZqW߆~FMÿŽ´Ÿˆ°Ó ÈCWØ¡qNÚwûVü™bb´_EõâT|Çm}t•Œhxõ/•ƒÅ‚® »ä_‹Y×%nÒ½/ðš¾”ÕKI d+Kà}É]ÑâOï/iXÄi’¦0¶\t¬¹»ýªºFñü“CA¹ÊK^3>‡ÝûŽiWæî»:*¾Jˆ%NKoé¸ðz$'»Ë+AnŸ¦çqéõl d©qÒ§w¿ÉK_cÁë¦ñÉÄj•m^û ­q¨÷4žêy‹¿@Øö“f¦ Lí·”·’f8bjŸ8ÿoõßøßâœøO8îIn‡Ì‰Lûåb‘oìÜýÆáÀš„¸7uŠ­瀯¾%I‰S‡±™mê½'NÈ5óÏB }mwFš~ôÓCÿâý.êgáÓÅžŸöášÿàò²É›Æ”^} hüy×ÀIEûêÿþÙî×raè$9b~UlXy¦ðÒ¤Q‡²Ã¿7;äý0M½7endstream endobj 2541 0 obj << /Type /Page /Contents 2542 0 R /Resources 2540 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2529 0 R >> endobj 2543 0 obj << /D [2541 0 R /XYZ 56.6929 794.5015 null] >> endobj 2540 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2546 0 obj << /Length 3245 /Filter /FlateDecode >> stream xÚ¥Évã6òî¯ðÍôŒÅÆBp™99í^œ‰ÝKy3yI”Ù|M‘j.vœ¯Ÿª@‘%Ï{Ó}T( …Úa~Îà??•ÏdœGIà+ÆÕùjsÆÎaíÓ'œ™Cš ±~Xœ½û(£óÄOBž/ÖZ±Ï☟/²ß¼ë¯_?ÜßÜþçr&ó~ð/gŠ1ïîúþ—ëŸöõ2Þõ§óËOb•RdÐBæÝÜÏçÞÏþõá×Oî/ÿXüxöaѳ5d3ixú~öÛì<ƒüxÆ| ÔÎ_àóy’ˆóÍY ¤¯)¤8›ŸýܬÚO§D¨ØW"Ïg€œD!Ÿó™Ì¢€º z >%0‡e6û¶P8_ü|Hì`K‡4±¥l™$~`G[Þèm}ÉcO¯ÒVgx+y‰ã:}®jœVkg áZ.9çžp3tüˆÁn¡”oÈh€uBFËÊè'³å»¡`rîlj‚Û³(m[ì³ÅyàÇa¤NóÕcM0&FÛ%~Äñ˜³¹n›Ë™×>iœdzvE‹?‹Ÿh¹Â±kmmÄŒæDâ›~ÅÉË“.q–‡²ªÊg]Û[³àÒÑMq 2×dç>Nn×{,öYh“Ÿ0aø‰RÂ-ßl+ÜIDŠvQhv2€¿ªR_Á4t‹Õ ŽÝÉìù’¶zÉ‹gKk ÚŠŀòÖÒæ^WºÙQE½%B)ÁÓÁiöŠ+)ÂIæ„l|¶‡‡F[vT|·—Ü+Òž)ìÁ/Oùê §«´Ñ8£ãÁ–æM›—¦ÃÂGUWd„š~#\gs:ÓåJ›«I"£?îûØ‘Mv*4¢ `­ ÚK0t¿ QFšƒºÆÎN@À‡DŒ)…ॄ› #B?`œpð,›êY7ä?Ú£n! „¯¤ŠN»…!Öq·ÐcY·°}Ó-l몭VÕ¡o?R*8Í\5ÁÝÈ7‰É0³G¾'Îðé±d—žÓ¢£EôCôG]ê}´³EñX_ã$_»¾Æ!c“}gï©¢n­N`aPHèüÖ×Çf@&ŽšßúÏm‘¯l }Ž‹¨tCdWIè Ò bE•`ø¢†GñXÕFnìoÈ”ò¿ôÕñnF¡”äu«qf³•Øe+ £l&”‘%¤0b» N0 À&mma(ºïÝ€„Î ²€Û¼Ò¦Bø;ÃTh[††­¸9›H,ŸAB|Ägà˜k´1$´q@‘'1Ë¥™5|»í–¥õˆ³#æÒÙä`jÀÒ”KAš`ž›¼ìz#'+cN¬¥ƒOs…?]²SrQŽP…£d´š¾/ÿd(ü8bâ´ bw=–uÍ” €ürª>U¯uùØ>fÊžf®ÇšànÜÈ}‰dÌÞ^æÁ\Œb†++Ë™…¸Vc+ØCc™3è)*9m”âÐg¢lغ€ŒÐlŽ ®Œ#àrÐ̈}.½*aÕÕ´c[PÚ‰):LÊÊé‰9qéZãÛ®ÞV÷ɱÃq\_ŒWU ÍÓú2À:¡/ËêËbJ_„(éÂg][·¯-RúòMÖz¬ ÞFÚ•̵Eô¬„ú…£t¬‡®ª>á1ùgûq…#µÌ×2U {IÔº • <Êa²É'»M×´HzI[è[Wf¾ë®ÇÔH9±ÐO’±ãÚ½”€Ó–ÎõËAÛ ~ØrFGT$®ño ]C[ˆG að3©[çˆÒ¸J‰Î’¶®ž¡ÜϳÌÑÇ8xGäk÷Ô9ÅÉ[r£óÛO¦Çǰ½ç>)²ÕàâÝÔz%Ù¾"ãRŸï®ßÏþF¯N´ñÍgCŸ¥*R›>¸Z;Fc‡þæ;•”E2¿ÿrÿѼ_!èþË0œòû!c{%Öý÷­íC‡®ƒ;Ø!u°ÃþdfŠœÕZׄlÕM¸·.˜¤Ë›/ÃÕ´ƒõ²µÂ§¡ð2ÌKNI)Àì¦PŸììh]—«úuÛºô¥Mj.š~Yìé콤ØçWE3åýÉ×»—TEÍÎ(¤=0» Zq"²!|(Ö5«=Ni1¥ÓÉÃúšaCoí¥ÍÞÙtz–Û|cK‘8ô>:Vì“x™›GUzÎ׸%çÓé}óÉŽåº*ŠêÅòÎCoi¬ŽGä¯`ýˆM4%kŸ?í]ÃâxOÏÊjÕ‹M…Sé]¼ô³¬Ÿ=¹™=“ùz“;P‹)kµZN†§à$zWÕfÛ¡Ìy„šÐWÖÄ”‰µ»ävââñžbO† '"˜=™¤Íþ0’1ÜòcYÕýÃu¡Ó-Îìf&pÞ¦*Û'":ÞÝ‚úýØ‘í¤ õÿæ¶pbðÝœ‚ÁÞ¡Lñ6Hõ ©dªöy§/KLy;zš¶ª|µçSF—1èr.cP64í–ÙDér}åÓ/~¬÷Oÿ÷>íþÀ+ˆ ŽÇG¼*$–&ÇçŽ)#K®ä>ë J‹h‚÷ÿU„mendstream endobj 2545 0 obj << /Type /Page /Contents 2546 0 R /Resources 2544 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2529 0 R >> endobj 2547 0 obj << /D [2545 0 R /XYZ 85.0394 794.5015 null] >> endobj 2548 0 obj << /D [2545 0 R /XYZ 85.0394 143.9886 null] >> endobj 2544 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F63 1385 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2551 0 obj << /Length 2985 /Filter /FlateDecode >> stream xÚ¥Z_sÛ6÷§ÐÃÍXžF$Ø>9µšK“ørµ;×^ÓJ¢,N%Ñ);ê§¿]ì"%JÎ\“@Àb±Xüöh9ˆà¿˜D$™Êi I3˜®.¢Á̽½L3òD£6Õ›û‹×?èt‰,QÉà~ÞâeEd­ÜÏ~¾©¸Ñðæöînüýèýø×·ãÛ«‘̬Ɇן>ooÞýr5R&b ¢áÇëÛŸ¯?ÐØ§«L ¯ßŽï®~¿ÿñb|Äj‹.#2ýyñÛïÑ`'øñ"v<ÃHÈ,SƒÕEl´0±Ö~dyqwñïÀ°5ë–ö©"6V'ƒ‘Ž……ýû&E*%¥&‰V:(LÉ>…y*TØèôõ‰nQJ)lf@2G2Ë›âu5Ÿ×Es¨ béX¦ƒöÎGòªU{[ œìxW45\M ›E›9h¨ZSû¼(§ šÌiäbG¿K¿º¢vÂL·“eY/ŠYw:lòWµ.±ÔÌ›bã§óf/Ä««‘ŽüÞ47’ŠTéŽ.EfŒr'y.—K KÉm¹ž.·3'‚ûE-±ƒŠÀ ¶¸kª[<ÖUÓe¶­=#whëòY– E§ÉðÝü`5\ê+ìÙa¾örÌä½¥¶zlÊŠ9.òš$BNxæ¨{ØIQ¬É¢P®WÔ%ŽÐ™ó|»l臻!h?+¯«glÄ‘õ1ÄÓÈû’š36@4ήû,lÓd_c‰ˆ"0•3‚š#É:à#‘Ù$m‹FØ×Ææ°CØÇÞ„6±Ç~‡Ê¡;¥__Q;a‚|Ú”OÀj¸HTì!NLâ~/„¸•=œ ‰Ì“@ÖkSÙÅÁâZı%vZ3ÄqÈÁ;„cGUQK8Fr‡ccÇ8åpŒ3„cm#ípÜÚŒpŒ­Ç1öŽ;œ¹^ÇT;”S¸ù¿qœ˜HÓóHnSÆr rhþ©ÍQ$Õ×ÀÙˆ8NÍyùU€‡Ž•µ] Ô–ÝvÔ–:¶Ôm*‚ž%E»™ŠÀ9a‚Í•´Ãâ©úÃÁ:Ïìam½çö»ÁµÆRñ–Ö6ÚÃÚ‚9fº ëÏQ¤ó‡çqáÊs¾ú®ZFÃw v܆ÂeïüݯÉΙ¯g§x°Ï7¿ eŸ›Óè“‘˜(y}-ª3èóT}ïzÐÁÜêäkÀ§„TYv^¼@Õ#_7™H…”úŽ€ >í=t|šÁ#|m*tJ¿¾¢E& «oJjgÎOé@\p%‡„AÞÔ¹–¾-ƒÐ«›Ð p4¸ëé÷²'±Ä!˜2 CPQNð÷Ñe+À`Ìytµ©N£+P9tÝôù6LÇÓ¯‹Ôp#ñyñU|]×&¥]9WUšUÎU¡ç2'¥B®Ú¦¢l:¥__Që®ÍŠeAÑZG2$¤Ž…KHy'¼de{øò-+Ìר]Vë`â#7Afp_í§Ø×}ŽLäýÝ*ßµ]â*÷ Œò±ªË¦Úì®Àx‡ ÚEõ\<°i<°‰<‰<•ˆX'ñ ÈkQAž§rÈ+{ýšTÆ#¯\Õ<åË#ØAìM4„³²ªá:°“V$*JºÒ1ì’„•š˜á#+‹œiÎi;1Õ¼ÚÐpN¿ñ*PíxŸ&¥b†}à.mMc¼S2<Ú‚ÂUrÌ0­ pà›#%·ÚÖž˜²T¨zaãÇ|ƒY*ï¨Í™lYä´î,W[g]ÐkÊ•Cf”ÑIb/u| [ìÓjääùÔÅ´„0¯Âîۦä{ô¾äx&hÕëK§Â$ *Œ½ õ¡ ãÖJ¶[ ©fÂîÁ±pâÂÇàØ46)ð‚¼Š6Œn†\ÇwxÃr8­Ö£¾z̯.–Á*µ2”_KŸ Á¸;D9ãè*9kƒ¶£XpŠÅN[,üí×Ê @Ü–ØGÏqSrPÆ½Š†€ÂzÅêCwEêC¿Dêü‹½,t[7$£TdqB9­Ã—õа±~  &E¹~ ¡)Ý ãæ\öùš~_a7 a´ÞN§E];S…Iwõޏ‚Ý6ûí¼¿Ì´ÇX[ =|l¯wèÑNËW´ªq Ÿïêï¨ëy.뢛Yøn»ê@sÖmríÒ),'—rÅ!ƒ wŽë0˜×¯¸œÓ çL :Çúa»*Ö MQ~ƒo[.!lÌht²£Q.7o7ÀœPÍn7æ—‚y\î.ÝÆÉðrU…îó%Ks9 c ß«6}®àrU^:û·Çöo:N9&µA»ï¶ålÒÓÑÌ®È75³[Uëfá<ž÷ÃÝEµeútHÜd¹Þ‚;f Ú-,Ê›¹èÅ®ð`É·œsfØRßákO?Î×J ê¼Ð¬sQ`>Ç+²(ÁQi}J‰×Ûñíø§k|º½ß“÷ã_ï˜A;‚FÄ!áÓàeø]öD B»4¡dY× Ñlì!P·Y&™HcÿX:­V˜ª¹×±Ìï|»ÜûNeS²(27 ¦Íi¨n6ä*`¨šÓ?Åe±W$BÜXGÐÏ$ ñ~ ÿÄ7yžSâ¿¡3 ¥yxá¢Ã,Îá¿#ŒiØq50†Å†î=rvÕâŸø/Ðk‹‚ÀŸñ[á´YÎ2úöLþñîvÄì×Úƒ¸üý‡ŸoÆ>¦‚¢1Vt˜q÷«œd”JŸÅœ¹qàªdlÕ˶zã–s…‚oJtÎ,1¿«†?¸SÃx5y*«-/›ÞÂòM±ÕÖÕÚ¨«e]¢Ïì¼³ªàõþ³äܧ²ÉÁSÃ"*ڹIJíýsÎm‹Íª¬ëS5ß({ú (8Í MEgþƒL¿IÂ$QHBÏ߈1ÁñÃϽ†Ë£‚¾ý†´‰æ\Æ…z·Z ø³XO7;ÿ… –…‹džµ+•wùçÇëïžèG$æ•u¼1ì}Ч"¼ÿUۇſ>{yš/ÈöÏ-Ð,ö½ECÔ­Æ¿\üôaübupfÆZ’òÀÙƒAÒS~Aã95ibG—¨êhxswM£$¬öÙ­ÿž€#³Ê=‰ÒµÛεK´Ä˜¯³ø’cA! ®è+=ŒHñµšhQǾ¤Åͨ¦¶+R*~c¨¶ËO˜°¾-fßöÈ„ÏwÂ*ëx’nè%Q4åÔ:¸ µ  `ÊÿþëvL½óG<°º{•ýið#ŸÆpEÕ-M[eÆQ‡Õ·'Ë#ðtzò¨(ÀëoÿÐ>ŒS¡í©¿P)DÚ ú,*Cšøø)ò >–ý ûX;endstream endobj 2550 0 obj << /Type /Page /Contents 2551 0 R /Resources 2549 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2529 0 R >> endobj 2552 0 obj << /D [2550 0 R /XYZ 56.6929 794.5015 null] >> endobj 2553 0 obj << /D [2550 0 R /XYZ 56.6929 364.4689 null] >> endobj 2554 0 obj << /D [2550 0 R /XYZ 56.6929 119.0358 null] >> endobj 2549 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R /F14 980 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2557 0 obj << /Length 1716 /Filter /FlateDecode >> stream xÚ¥X[sÚF~çW0Ó< ›½kÕ>96N'¶kœ¶3IX@(8î¯ïÙ‹„$/0m'3aWþöœ£s¾sY‘>†¤¯Â,æý(æH`"ú“U÷çð·w=â1à 4l¢Þ>öÞ\±¨£XRÙœ5d)„•"ýÇéçÁùýýèöòúϳ!xð ƃ緟Î?¸g÷g1œ¿φ$Ž920‰—·ãñèbø0úýîftöõñ}oôX›Õ4`flú«÷ù+îOá Þ÷0b±ý'Ø`‚iÕã‚!Á«ž,{ãÞoµÀÆ_íÑ+SH(|ÁUÈ"F’Qf}q£$«õR£I¾B¯0f¯¨$›{sEiã8î‰B‘ Î‰×ÙÙa1(iaV|à%½ögIãlÄÇÌXlŽN³¢Ð“áwý<×Y@“„e ïãГÍQ”º¨4j§ð Æt O­ÞÒG&±ð¼#Ú‰c©Šýá$›XbwdÈâE\@hA±Ô½G[ùz“îàB0Q”Ê Gµ?ki3\†,BJn±ãÑÈøüÃø.C*ᢇ"gç™þ‚Vðñdq“< ©XT6½½¾½tŠb¯oºJ³´(7I™oÜ£=Ó.tÙD»G“l›,ƒ>WˆJ)½øÅŠ0x¸ºp©`q@'ˆšükqŠ‹ÿ.ŽwÅçùIqáø²X ÅIÔŽïù§Ç_ïNö:+õ&Ó¥³bü\”zU¸ÍEžù¦L·«½ZŽ—Ô‹á aÌ¥ 3RP1GO•Þåß-g ”‰;•·ÉJ°+FJ±&á+¬$kÓJ#oje³ÍqË"[g=Ù¾¥þÏyæ~÷ãj²[åPÜI”ç,_iÑ-à˜„A逈Šd¨àšÜ§Â;ؘ0ÂͰ)Âc(Æ5ªéï Žÿ<\l¾VË{3Áš©3ÑsdZê^ê• BTÕ«ZàM@ ª¨jç4Ýè äôs@¨àHҚǵÐÑI¡:›§™HlÃj‰³zõàWåYºÔáÔ)"‚.ØŠøåh|ñp}ÿx}whPÁ¸g{·AEˆ±º½øþ45&'%ÙsR:NÚ…ëX¯Í† ]ú#Ží²ÉvàØ.=Û›0/ /`ªäLOÝ6õ\! Äj¥U?ë«—h7©f³mdX¦ŸÜb¤¾¾ç³}¹4öíØn&yV&вy'¡³ü©Q¦{„p-ì¤îáøÅèåóŽFAçÇ“³‰²ÉICÉY£ŒÞ᢫¦-Îù •( ²I)¸)*-•£UUð¶E2÷\éb¿1Ñ´ ý#-ÑAŸp“9á“êˆO*”õ‰/ ²U‘`dq¨~4m#‚ÂH -ÿ¨q5*`]k€ÀæHµ­»k²̱Üs&ÙG©ï%O‹t²èÀÃÜNœ Íݯ{V¤S}8 Ði•Œãah Ž„¡BÙ0l^P“"jFü£*+P@e‹š¢„ɶÊóŒÞq›´ äyU1À‡EÕÖ[nt[å;Ý9šoRè0(:ÐÃDÁ½Ë˜}ÔÃMÔa×(ëá]ˆè§ˆu[o‹åÐUhãÔQËjTÀ´îÍ€ Ù6-Ärým;Ÿ×1±–ö\1¹ì„Ϩ#>«PÖg£°ÏàÁ^ -§1ŠDú¸i5*`[ÛiŠŒ-ã>ÚÜí¥s‰£Á<ÝÁmÔ>»[ël<þà6ÎF¸ýÓ˜ þXT¸Î­a™ºÝSZ.œ˜û›‹ñO„¸ÇÅv½†iÛmÒÒ!¦z–l—&hVîž®¿O B~q½™B¿c¢Ó›ëðêÕºôu)3cw³þÔd¨:GUŸ2ÿ[½Î!6Œ¢˜ªlh Ž°¡BY6ÌÕ¨£*ëõRe¨FµT^åÖ)öö‰É ÍÆÔ*ý3ì•\$Û¢úzвŸàqUÏÔ'§A‰"Q_þ¬¿A›Õä–.p˜úšO\_…§`¥-ûÌ*9tâ¶®æ¹u²¬†MÚ~a#ëURN&é-…ˆ4=À¡d9‡2[.V9¢îx×—í1¯>y|x q .÷„áYt˜QÈêá¡ ÷sèOÇôU˜—úZ5c$¡-…÷›4+ e2?à¯âjDàvÛ¹ÜÖÝîÛÖ/¦u—Ý”…cá=w#ó91à\ÏÜÿû«åþë,‡±L)ö28Ö\AHe”q2¢kzý}ó¥íÿ¤¥4¦endstream endobj 2556 0 obj << /Type /Page /Contents 2557 0 R /Resources 2555 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2529 0 R >> endobj 2558 0 obj << /D [2556 0 R /XYZ 85.0394 794.5015 null] >> endobj 2559 0 obj << /D [2556 0 R /XYZ 85.0394 683.4656 null] >> endobj 2560 0 obj << /D [2556 0 R /XYZ 85.0394 619.4692 null] >> endobj 878 0 obj << /D [2556 0 R /XYZ 85.0394 579.8478 null] >> endobj 2561 0 obj << /D [2556 0 R /XYZ 85.0394 546.5386 null] >> endobj 2562 0 obj << /D [2556 0 R /XYZ 85.0394 510.6781 null] >> endobj 2563 0 obj << /D [2556 0 R /XYZ 85.0394 443.7598 null] >> endobj 2564 0 obj << /D [2556 0 R /XYZ 85.0394 382.7282 null] >> endobj 2565 0 obj << /D [2556 0 R /XYZ 85.0394 306.7766 null] >> endobj 2555 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F39 1178 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2568 0 obj << /Length 2420 /Filter /FlateDecode >> stream xÚµY[sÛ¶~÷¯ÐÛ‘§Š n¬ô¸qI¶“ä–(‹SŠÔ)»î¯? ,À‹D+™éI:S‹Åb±—o0Qø¤"Js=ŠuD$er´Ü^ÐÑ#Ìý|Á<Ï$0Mº\?-.~|'â‘&Zq5Z¬;²B“„«O㟈&— ޝïæóéÛÉ|ºXÜ|˜^N˜N_ÝßOï®o~¿œpIx)¸ºûõêi÷—Ø~žÎ/¿,~¹˜.½ºº3*¬Rÿ½øô…ŽVp„_.(:‘£gø „iÍGÛ‹H "#!%¿˜_ü§Ø™uKmÁ(áBñcp6bŒh)yÏR%¸pÖ˜O§x¨«ÛùG{XÅ;&¤#˜%"BîUQUérògúò˜Ÿ©¤ ü½ÁuBwÖ%ŒD(m~swÛh¿Ûj›YUïM]î‘4K×éþ’%ã´X¦Hú`ŠƒÉ´b*!\)åÅ)ðfäfïÞ¢D01Â#É<7ñ=ëM¸–$Ññh"¡\:Ϋ_ÿþ8ûªÙnŠ:Ýi:Ì_ª:ÝVøñ¶,ªr_g‡m»i ÷b@5'<„.D)…pôŽ¨ÒºÎ¶©]jy…$T&¨ÚAú€b’ê®Cƒ§ÒgÎc¯iP¹Þø9ð¼§dàÀGoÓÚ¬Lmðkê¿1ËÚå¶¥=£Î_ŠrWeÕqv FâD‰‘¤ ^ÆCÙÀà¤\B¾¼’*$fLÁ #ÂeJÄ`£á²”/|š¬¿„Ñ{<ìÝ ÓHëI «U¶O—îÞý-#¢x€ÐÛ¡àäDIéYë:Çb¢OŽÅÝU¸1ý±\¯á˜b•$±ѱث±ØžHC¾ £Ù7Ë—ÇògßGí›ï#öúûˆÝ|qY>1%ŠQìŠÈðiò4°-D3DåéS:,€Iëã §_=GZSÊsO4Å °i…‹Lö˜´ã&-¯ñ{W»t™Y¹©÷–n†L; é¹?dv¿Hz†^ì£à‹=CHã$cöqó 2^˜óÀ@8ÛüÑ!øB:ö¥IÂdŸå®Î  ÛFGã…ó!Hï¸ ¾–¦°nÝR éÁ3*ç:˜{xTè* ë$¿Ôì±ø»,CÀ›ÒF»=îRÂÆ{ÜÆ®µQ…xV+ÝÇÙª\×ÏÃÜìW)ô"[›·îóÙ§S®› ŸUý…~ÅîðgÕ&]½i$ jn‘oªMyÈWý…h§^‹NÒUÀZÅ‹Në% ½ ƒŽ* ÷›5 ¥°„XÇS@“*ЭHÏü¯…\œ-šHX–Û-¦4PóÌé ˜@Ÿz•C“ ¤PG^}  N­²í.Á½i   „ׯ{ÁQ@ÐÕú‘<Üsu¿û2yÀ6ïÆÊ6Ø–âmŸ-cl|diþ†×>.xÆ,Ù!WnÔ~µË)1L„?@£Q¿Â:έ<Úeg²}ØAÒ¡4‰) x_À?òƒ1æ‡Ìþ#m«ÙË|Ù"hX5Œ ÐD²Hö%£"h¬T'}ôíìÊÆÀÎ4†~H…°÷&ð°îØÌ~à.W)ÜŒÒ`R,ãñ‡Št×äp'ì/ï:Û~[gÛ_Œ+´eÍ ÊS¿ÇÒ6È‚ ž¶Q¹wÚ_æÁUB¤TË}æÒ ˜Q程¥ð…ÉA¬V¥Éñ.7K§³õBlB¦>3Zj#ÒgHÔž"йGo ¶ñÈò//j‡×ÌIïÝdʪ QÃ%S@Mþl^üDÕ\ŒŽÀ1+Ìr™‚ gœ.‡)^ʺe ˜õÆ'dù\„YûÛrå'(´Q6nÈÙ;ä£ë›N_(ü ˆ M"ÍÎß’:Lá9áô’˜\±]ï§ô–29»_à9ݯ  ô”1ëí÷£Ý=ØT°–Ôñø°[9×[šÃ á|ç« ”Ÿ­©ñž3‡O@*J¤t€N'MÖÙ@“büÛ¥”Pí ÌyAõÆLX‡…çÍ@Ñqm.¿µh€GX9ý |ÎòBYDãµÉÜHú:ni¦®Ó-¨àÚN˜±héÁ*–f”§fù‚¤¶ L¤r烤»´%É‹q糫Âù&B*Ÿ~½›ÚIl€‚Y´ôÀQ»D‡é¬Ê@LƒX‹ôÙäÝeËH-–³7L{Ų]Qî3¸˜ÉèY { 5¨ Tw ­"‰0,°[€°l¦мˆçðt–öà)ˆ@p™«Ð¸·C¯íPj˜fù„-í©Ó‚º†Æ’\èÅQ@z2ùÁK·x<‹ƒµM¬}kêDã©D{ªû¶KÛɆsEx‡q’—µÅK?!Üý:wâó zwÁïH럟Rò81ˆzIõypê0½NÉ“¡Q½A¤ÔC4]Å 1?«YÃtªZ¿Ñ„ÚN°«ÛÜ]!{&e0mœB½Öíy“-7¯=̵ÝÕq ^ñ¾ÈVg< \­¡Ï9ï‚×.ç„Û!'@O¦Ý£]çE««V¢ˆ´ÕîœVžg@©®õµµ9}¥Ðú‚‡î‚Û–fmy‹Å­Ÿ.ñ÷Py¶5Þ΢€Ž<ô%0ðˆ £ÌË ,˲xJ÷ˆƒ–\¹®ïæï§àx6#8pwž®ŠÍFøR:šÀ))?jMážQâNªp'‹QÃ]+á¡~Y®ªÅ1GpçGŠ+›”U¸Ý!^#)CІrÙJmQ Oï_\b‰*ª`ŒšÍ<ôbŸkw€o¶•tûª††KS¥ ZÚlùWVa¹´dXXäo°–Õüéy=A³jÿJa]n 8®O‚X݆PO*8àôÂqTé@+H%¢}¸µ0ûèûŠá·¸AF”õ^Á¶åS€‹¬~”$‚¥_ly^GÏã°`sÒ-B«ã³›–“Íz/(ŒÐ8ém6݆§‰CeÓð‡‹ªýÀZh_þ²ƒ×_Hbÿ7 mºñüg¿öï›QLD’ðácB–X¬‚RöœLªSú?žêþ?Ñ„Idendstream endobj 2567 0 obj << /Type /Page /Contents 2568 0 R /Resources 2566 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2576 0 R >> endobj 2569 0 obj << /D [2567 0 R /XYZ 56.6929 794.5015 null] >> endobj 2570 0 obj << /D [2567 0 R /XYZ 56.6929 752.2803 null] >> endobj 2571 0 obj << /D [2567 0 R /XYZ 56.6929 690.9123 null] >> endobj 882 0 obj << /D [2567 0 R /XYZ 56.6929 653.1174 null] >> endobj 1464 0 obj << /D [2567 0 R /XYZ 56.6929 620.6102 null] >> endobj 2572 0 obj << /D [2567 0 R /XYZ 56.6929 585.5517 null] >> endobj 2573 0 obj << /D [2567 0 R /XYZ 56.6929 521.2619 null] >> endobj 2574 0 obj << /D [2567 0 R /XYZ 56.6929 438.9484 null] >> endobj 2575 0 obj << /D [2567 0 R /XYZ 56.6929 269.4372 null] >> endobj 2566 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2579 0 obj << /Length 2823 /Filter /FlateDecode >> stream xÚµZÝsã6Ï_á™{°3·ÖŠ¢¨Ù§´›mÓk²¹Ú;½›¶²MÇšµ%×’“õþõ -Ù²mç’Q €ÀO?,z>ü‹^¢<_¦a/NCOùBõ¦«+¿÷}?\ æZ¦a“ë»ñÕÛ2î¥^QoXS¦epÍu1ÕÆ¤`Ï©§ÚNçõæÓ§8ÏËå²|1¶‹h0A€‰xPšåœd¦@l±¿Ã'øÅÄ:û»k10> ÂAURSú/®5s­…m™9áèUnIµùÎP ë‹Û³ìzAâ–|\9ÛélÃFýî+¦Ñθ:fNqJ2RÔÂá¢Ünèe–í*ãbˆòSQn(­BÇRgkje F0ߪ,ê mk7$§Ï?¡®!êEëÏV}Ãä·mp_šWy^1<ûì°ÖÓÒÜÂ$Ä1%üÁ¯× ¦VƒHN=š~sPaZÁÀlÃY§ ¤,I\gëãÚ‚³Ñ¶p"Xë 2kÛV¬­_ û'+˜Š`ÞÑ…¢ß`:]¿,“)_ËÚú¶œ7Ö°(€}Á8Çtl]«‚E±E©j™Çe?µAIRc‘Ê‚ž/‹Ü$è̈òYïè=·£KzNXÈz;YæÕ„°Ñí”|-M1 ƒtp3‡¤g»M¶f# ~Ò·cX©©k Jq ÕaÞ].)Îmq3]ng‡(ràûJI XÈîeeݶ­¬ [ +øŽm‘< ª–£~$/ ªÁuV–Ëàê¦ W°ÈUék`zR‰ä¼yŽ«Ã¾6°ROJ)Ú²`ùAÇ! [ˆ,©B‹¬—Á6r;¾¤ç„2Ì> jŠ B0€HÈêBA•=–Lqf™)˜B‹6¤^  ¬˜ý-”„qâÁÆãBîirF‰ã2(ù¥%¾/‚×ÀDzqSd7Jˆ©Ã¼6HX6CÎkÙÇ IØ«Ø`$”~ðiAÒä¢P&T2LOIÁžÀÒAS“ªÕsùÙ %†Tb‘’ØTcRBØžŠ)‰¿GJâÁžI¶‘ÕMfOO6øYÕ¬—Ö¬ZwG™æ›³•Û±Œ¿ ?!ú/ oÏt|Ìd°w×½*dîW@Ï÷†ž³Í1׆žòBÇ-ëyÒ¦h0ò$#(yM.‚4r;¾¤Afàå{NO ¼RÒAO:è±FLRªK>CZUíš…ÊSBÄíè+ ôæ âåÿ·Ê'ñ@)ˆ/T¾&×iX9.ƒ«÷]9 ωâ×U¾$M“óæ9®û+,¼DÛ@^SÑþƒ¼¦Â] z.ÜšªÉE«*häv|IO 4ÓKMuOúÂ-œŒ³pbMf÷“tÈå(C«`É˲xÒWS€bSßž8ÅáVŦ¹U¶kfÂUf 纬òºÜЃA»€}å3 ;s÷6'‘§`=Ūi“ë ò,—AÞèâZ~½Ñ3=ÕU…»ÑÈw‹Ö“ÈSxyÖPÇÕai ƒ©ðTŒˆnš:¤LMBÚ)ëáOEˆb1¨ìQ4˜ WF|òÂFt–ãþ¢¯\²àÃÅg𮿬—ù4gÅÕvÊ®À:`±6^pK„I™´Ñ†Qí¶·Ë'Ø%׋•y!é|u]¦F`õnDŠÎ";hðñÇ>H¤ÉAcµ­j¨¿À‚V”˽¯²ÚøÄÈ*+–v$ž%Y7uì†û˜ÀØdx?°ë×ÜTß&ìA5ø¤b]{:Õhpmð)5 Ål€‘`ÊÑ^FŸÚ7(d· »Îœ/9š‚¢ ¡´ß›²$pÆSC‹`´ˆoÖ.(¢O´\ƒ VŠ0Õ7{ ; c´çlù¦+.ô~ãµYÝÌyŠ9BØU'«[‡^Ž»›\§sŒã29&ï\5‰@Ùêfgw”VB˜elgms\ƵÒJA;m븴Eö@-RÝAg¦á¢œäŒÞÉöðHÅtâ d@~ã±oî"{¢ CTpPmØ@ÇÌœ›4#cÏÄAQãÏ?¤=%ìF@ñ:Ûdtä„ä=3f[êŒFàÄMu⊎HÃýѪŸÒLBkux`[h7Á(ÉÊÁó´}~EíÛº%¤=õL³ÌWE¿æŒi]èÒ–> endobj 2580 0 obj << /D [2578 0 R /XYZ 85.0394 794.5015 null] >> endobj 2581 0 obj << /D [2578 0 R /XYZ 85.0394 657.4255 null] >> endobj 2582 0 obj << /D [2578 0 R /XYZ 85.0394 112.9597 null] >> endobj 2577 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2585 0 obj << /Length 2239 /Filter /FlateDecode >> stream xÚ¥YÝsâ8Ï_Á#©}Y–ö-“d²ìÍ’°W[736‰wÀæ°Élö¯¿–õmdï*U±ÚÝ­ŸZýe2ÀðG‘@BQ5ˆG&Ñ`±¾ÀƒgX»¿ –fäˆFmªó‹«O,(¤ƒù²ÅK",%ÌÓ/È`t ,ððv2›ÝÝŒfãûÉ¿&w—#")‰‡×w“Ûñï—#a bŒ‡¿^O~»þlæ/^ßßÍ.¿Í¹¸›{ÍÚÚÌ´Zÿ¹øò RØÄ/1%£ÁøQŠÖ Ö¢$If ÉÍÕãÕõÕôj|u{•¬V}`èH#:h ?PÑT¤mÁ‚!Ê“ŽŽÛ¼¨áxh8Æ#µ6†'œ$ëìˆn™"Ú9uϨÑê+„ 32y‘ï×5µ ÚöËr ÷¬ñ­(7U^õÓɈ„lî8$ÁBéõi“_œLgÚ,š\‡ÒOܾ¾ˆ_FÉ77Z˜­Et‡+Ä™r¸X%Uºæ³Œ•¥òÓÇî%Oóm¶€»ñ`q$¨·VÏôÖîì!wˆ#æØgÅs^„üRW Ï1 p‰‚Ëǽè›é¨Î×!æ\õég¾<‹F¹«7»z´ÌW!¶fk¼ÏöÙ^üèQ ²*Nøÿü÷³úƒC -¿‘7!ÏîskÍ¡ÝÐYeÛÜ9È÷ãê¼Ý•ë$/ÞÏ1?Ë1מï5¨å{¿ƒgcåvÔ¡l¼;8¦?βý#×Yohó’t~Àq<)}JHÙ;©2™Ó:®6Á "¼Eyþ~lóç¿sjï¾qG!·Žåí>úÑÆ¦~´ áE¥ÏλNd›`‰iözäâÃ[8ó£ê¬û«êd[óR‘BqÉ>ÿùYÌê:dä$†èMØÕ~´ó£×£ÞÉ%2«ì5[½?Îüv%ºQ]Íþ¬Ásë2R¿z‰³Ò?ýè/?bg7T%«:˜#EðKÿù¼g€ ÜÔ ÕûOöÚŽtôw!`"IÒ‡é ¸r„з`ŠH!éÄ"vIyãönv3?ÎÇÿR MŒƒ¹ÈaîQî|¦&Ôi¤àM›C°fºr‰Èp\›)Èå5(™%œ˜là’™©ét6¾7s&_˜nAêxBž.ÓÝ"ëŠÕŠd–Ûk¶­L% åÒÀéôî iÛ ´¾$ÃFq‰¦›ÒL»m^ÃÚ›¨“z×´l[ætåölϼYX%×fÙÊ{y…ÕeLý’Ôf>¯>èª ¼dðâÖÐx5/ù*5sšCefÛY± xÛ5p}—ÈvcàY”µ.l¹[¹Œê¢FIøÝôrÚ•¥A?«ö’ã—<µ'mEš[RA¯ö‰‰nsJN‰X$\¹¬Ûf+ËÝ—ÎYÒô`ä`±‘úI·#í¨ÍÅ8ìœÚ|ži8󷈎w0QSm'}y€ŠÒ­’SòÍ¡¼6p°¦tòÑ–÷¯K&ÑùÖk¸«™î‹*0p{Ìè(*p:‚+~–Õ \UÌ"ÔÙ…Rž‘¨_é´SÚUB ?©˜# (F{ñ%V,îj6sÝÛ¬ê] (O­6š…{2Þ,ƒpâXK—gàlQ€ÓQ5pÞØYŒ(†Rå¤HGÙ‰ÉeWäM¹Þ€/|ÊWy ÆÆ„îü¦ÙO—£ˆ‘á½57³òº®mš mÿ0 „]Nä>ÉÖøáfȉOל'Ñò!c5z¤inZoLè^B@-I‘TÊy­´:¢T7x·Ràì ÛPÆxDŠ÷’÷v¯#Ù[Ô‡žGÔ­¾Žç.Wif×lPÜèa.@A‚Ûåù\2a¥x»m²oÈ}µß=iÝ{šã¶miËNÏ~êÒ?”"ÇtJ/Os XÇUPH*D,Ûš}.Ëïûc }k@$Ò‰ðn9mk@ÿß_&÷a¡¨gRÒð‰AêAÆV)­8‰ä¡åê˜øêþ_SoFgendstream endobj 2584 0 obj << /Type /Page /Contents 2585 0 R /Resources 2583 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2576 0 R >> endobj 2586 0 obj << /D [2584 0 R /XYZ 56.6929 794.5015 null] >> endobj 2587 0 obj << /D [2584 0 R /XYZ 56.6929 659.6547 null] >> endobj 2588 0 obj << /D [2584 0 R /XYZ 56.6929 595.7578 null] >> endobj 886 0 obj << /D [2584 0 R /XYZ 56.6929 556.2057 null] >> endobj 2589 0 obj << /D [2584 0 R /XYZ 56.6929 519.369 null] >> endobj 2590 0 obj << /D [2584 0 R /XYZ 56.6929 487.0966 null] >> endobj 2591 0 obj << /D [2584 0 R /XYZ 56.6929 420.2778 null] >> endobj 2592 0 obj << /D [2584 0 R /XYZ 56.6929 287.6148 null] >> endobj 2593 0 obj << /D [2584 0 R /XYZ 56.6929 199.8075 null] >> endobj 2583 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R /F39 1178 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2596 0 obj << /Length 3585 /Filter /FlateDecode >> stream xÚÅZM{ã¶¾ûWèi{Ÿ¬P|’@rrÖn²Ù]ïvåm’&9ÐeñY‰TEj÷×wP¤DÉÛôPû@h0ÀÌ; qø#kWNR§™áÂŒfë >z€¾ï.Dà™D¦I—ëÛ»‹¿þM¥#Ç\"“ÑÝ¢3–eÜZ1º›ÿ2¾zÿþæöúÕO—iøø[v91œß^Ý~¼zC´÷—Nޝ¾»™^N„•"&Á‘/áãëÛéôæådúê»Û¾»½¹üí›»V²®ô‚+ë_¿üÆGsXÄœ)gÍè~p&œ“£õ…6Š­T¤¬.¦oìôúW‡vCËŒÔÉhÌJ 7¼gœq{0Iµ`"qI»gR íYäÂ=›\.Ô%,1&u;š22 L);S .X¢Òþ”ïvÍf×\N”MÇU¹z–7˪Ή¸½vœÏ*ÿœ­yÚä5qf»¦ZgM1ËVôr:^geöÖû'\ÒÁâeÊYÊAîe˜—uÏ&uñPþ»*óðBWôT³Ä9ø_\N´”ã‚å -)´>|EyAÞ‚Þ¼À!F¥RÆs£‰Ì#ýÛÈ €.+çÔð4ÒÇWo‰Ö_xŠ)øøÕ‚zëu¶mBä.Êúñ+7œ {+ÖŠ%6ŸV0™,’„4dQÓsWçs\¤Rh¯o~”3¬Œ¨áǪ®ÂPå„¶Fº`mܲÙÙj7Ïç°RªñÝ_ç:LPïV ­H¿r.W¡{–•Ø0ãû@(J'þ¢g‡«¶ÅCQf+zÉøÑ˜E³Ð°9–¤Â†-ú˫ۗo>^ß ì¥‘Ì¤ÒFF£Þ-ýV¢ ›¦¨Ê %©dRkÕ×XUY5T¸0|Ϊõ}QâÂð×^ÆÞI ¡˜"N=yw9Iø¶Ù〘Ê2exáýÈu¾-p°]îÖ÷y ï6ó Ï€ÁaÀœìÄZï,0u¹NSËåWö8Q}}µÎD£ÌK8ÕüP2¡$³p°çEk¹dëYtjao{Â}¬Œ$(i†7žmŸ6ME¤%YÂü±µä@+}·ÉËéô ±‘ôdsø{áÏ8½Ú"e?¨õÉ·jP˜·hèYï6›jÛÔ`¥Ršý EY7Y9˃í¥Ì*cúú¶.Hµ|k³->gMN?>åO5µ~1Õš~eô ݵfOì¡£!p@¸Ô‰ÿ¸ÌKêÞ+2Õî´ï_¿œþY þpWE=ExÎsBÞGE0Q“ºúÝ‚çæÓ¬â›@\cÊ×›æ)èx¶Ä5y¢húC•áIÇuÚ$gÆØgÌ`ÏtÆ “7‚‡#ï¬À’óóEžãùºš ‘“MÓþ|ßå%ªYNŽözJÏc¸§ç5 {gËb5§&"kpÒ­º ÀÈ—ÙºbðÄÍd©K%¸Ò©†RL*ý*ëðPÚ€ó‡µF?‡°ï¹ßü^ÔÁËÀªÎ,Ù‚²®VÔºve“ ×}¤—×Õgtl'ôŤ–‰Q_«/¦Óú™¼¾¼Mˆ3MÜÆy±Íg`œOG° þK¹$9+YËt,Z4MÊTj{¢½FhÜ…ÝÙTub| DëÆÓM>+#£ˆJ§àÅõ$o”P/'l-‰N° â©ê‡,]âC($‘…Fó¡øø3y€Ä¬N™V²—Z<ì# Ë€}‰…ãÓç¯ ³â·Ùa:sþÉŸÿ§g&BôáÑ pmIjÎ Õ2KÕ(³¢¼®Xw—.m†`.E÷ˆ@®Yž=ºì¸«.7!º‹ä¬|:è‡)TöàCi©b8ôŽùö: Søpò@8¯°>.m_ÖnVAšb×'O[äiõLöÖa:}Ú‘ÉŸöjà´ÒÄ ‰RQGH0¥âÉY±Z¦c¹úñ‡ÞlïFd¢½9'f|ý“ pš¨«{¦ù¼ Aª7µ$DðØðç‰=FQ*"'|s*?Å´O\™R`_Ø ßJ€´lÙ<²„•$Æ=côûÈ¡Zt¥o§´Ášé¼:t¸ÎèCäò Q™?Ù&n› jë±€!u’ž¯å¯§ ¬Cv‹³w`>.4æ¤*\…“ľb:}äØáW㇠^×§âÔDßUè%1V¯Ή‚ëaÆ^•ÄÜ}UÓ¹ìy©åå“h$óâBç°f Ü?…ùéѦl’²_dùþÞ¾½>ˆ™I«¯¿ÿþíÛé”2tpŠ>³ø-FŒ%‡?’jm8GØÊ˜òè ýµ6_Ç® ØÝKj{@Ž·P x³ôõí‡õ 9¾êVâ.!;m€¼qKlØë·¤ÝöÃŽ¿ºõ‰µ)|pÐyå–³Tå<ÐöY þ" ƒFß³cOVv¹NcnËå1÷§!Ì•LÕnÕï EÒ¾ò|d'X¨>+jË5 kw[ `cÜAZÖöÿ‚ÀÞkö×%”=j&tr>~øÐæ@TWÂVÉ•IbŒŠ‰RÝMè꟤üûT*0‘ªÓ82ÏøZ̃â=¶1¥ÎšPÁ ¯”yfJÆÀ¡|[^Çá÷ª*òízUžt`äd\…¾*„ÑÉÑElSØöÀpSÑ. ‰ H÷õiüÕäª$ Ä)Dn™_O_S£B|Ê7Mc“b}/< uc(úŒ¡†Qwyý°(ÆT÷½¤pvb¯rÖY¹ó÷—m•ÈÏj™NdJ·Ù5•ÆN9ñ”9«Íñá`W޼5Þ¦î½5L¼´Š0}×)úŸô<òÖÖv½µ–©wlqH²ƒ”¥ ?ˆ²Cz‡ºOà„þØGàoÈ«ëÖŒ‰n ZÞi#GpÚû— :m?ptÚÈÖñ<Æ LžÐäxZØXŸÅDâ€-„&:%ÍÐQ9¡Ñwá:‰»¯ƒºâ³³ûð3„$:m6¶}FâiC×À&eœ[û,P]ݺ¦VwÓ˜ã p–CyJ™¾Mª¦qï¼JI´¸=†0:Q_æréº1ŽàZY ÐöB£õóÍÍ©[rÁ!V­qœ™_§æó´kE<˜LºÛ–Ô’©£¢'F:^(éHÛ½PëI½Ïaw!¯ÑNçÂ̧c‡ ›)¤ú#g-öGüñp&ýr8rÏ…3óc)Ÿ)‘w¹N‡3-—gƒeÓ΍\•ÿBe²(VÇ!L™NáÕ³âµ\òõ«d¢¨4í HŸAˆd\^ú2¸¯Ñ­ZГ ’¢*~ND³µçtk²"~)A :ÐyÄô9„ÿT*ÝOt˜èc„pYĪé`ôœB Ó^³±,JÉãÄñås>þ>ÁÚx~J®â— ìÖ MºÅÃr¬¿cvƒCßFÀI.‡Oö°"cA3¥ë¦-0‘Ó¼Õ°BFÅÿÓäOCö¾ZÉŽX¬®=®Û¯TT+Çã¶hšö*Þì+˜_%'"ü`žÅ©|ÕÚïÀ‹Î%T 7Xñà÷¬m]h5ýÂ÷¯ã-v«>O›1OYâž)u˜Îq`ò6¼<º‡TOëóóEžãùzãŽiiúó½ßeüB lU½¬¶aCêÝzmŸN\ ÐUS|¹ ç@‡ò°[çeçë…×´ƒ\ºU°/ýpM?¯iÊdšˆg>(Ü3ùž00ùs)ž»’‚}Ì·Wç@-~wxF°–éX²~m.v*z¢ýØfy=6|}.ª]½zšDãÃ.2>l!ÃÛdu{³@ó`„–ÄåpZè/±qŸw“Gš)Ôêî–ùªÀ©;©õÀ¦¬u¢,,Vï?î¡ÕÆûÍ~I¹>¬s?ÍV±°§ð¿²À™…!(YZPÊzP7‡\ é†KçÔ¬({UxŒc}óëêouäáǧ>ÌUàJ•R>ŠØø?´»ÿ>ÂAeí ¿Î~˜„ÂÆŠnÀÙ ¶},ûú‡ endstream endobj 2595 0 obj << /Type /Page /Contents 2596 0 R /Resources 2594 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2576 0 R >> endobj 2597 0 obj << /D [2595 0 R /XYZ 85.0394 794.5015 null] >> endobj 2594 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2600 0 obj << /Length 3487 /Filter /FlateDecode >> stream xڥ˒ã6îÞ_á[ÔU±">ôànía’™¤&ÉöÌNwj·6ÉAmÉmelÉ1åéq¾~”%Yr'µåƒ)!OBbÁO,â$LŒ4‹Ôè0ŽD¼Xín¢ÅÌ}w#gé‘–}¬¯n¾úV¥ šD&‹‡uVFY&ÅÏÁסˆÂ[ ¯ïîïß|³¼ûÝÝßݽ¹]ŠLŠ4xõþý›»×oÿs»”qø€EÁ?_ÝýôêG‚½¿52xõÝ›ûÛ_¾¿yóÐqÖç^D Ùúýæç_£E/ñýM*“Å‹gxˆBaŒ\ìnt¬ÂX+å!Û›û›u{³né¤4à…¤Jä„8¤ì‰#alL¼Hc&J*'Žòó¾:ÜŠ,(-¼[&‚|Ý–¶›’«ÓjËê†éOùöK|Ì‚ªe0¯&Rm^Õe‚Ó‘ Þ™ÃseË™%«¦¶UQÒÊ‚wnèÿ‘wu\Võ=Ù¦©1äug‚X š8–î­ÜpPÏÕvK#G þi›ý6_!ƒ~iÒ¥•øÎ¨ (×ùqÛâƒô@¸?YBhjžþý˜œñ¡YÓlÛ­Ö¸ÿšß¶^1ü±lŸË²aÛê©ÎÛ#ᨄ÷uH9 ©… iØV»Ò†Sò¸Gy&ÀîÿuP—ž ¢~õ­}›‰C“ œvÔÅ©â@›â(ÔZgŒØLÑBLfÅ1:G-‘¡ß3÷ï‹ Û}¹ª~‰"Y_ò²þ 0‘jÁ+‹ÚÚrµD±ýr¹Mš† ø1ã?•uyÈ[§ùÉHÜ–ÕnòÖ t©@I d‚=3«Ò´¢BVI°nSŠüdQg5*e»!`N8Þ¼rÖ.œ@ýAhÆ@*`V*JPQyoávÃ!oPñ²¼>Ѳòse[2ø&hÙŠ––€þzDγ8²9…ÿ³û çª¦ÿmi-cnr†Ñ[ÀÀËÂÍ–'6Õæ¸-^°Õ«a*D²HF©Ô3®‘–},òŒb"PtXø®Ë·¤@‰êa‚çÌTÂúSÕûc»áïHIúì •AHãëüuX öõVh…,rè|•qÀ,ÀX;AXë'—4ç¬ÂѤ¶¥ m:xßX[=nKB"b–ðzº0’™ÔI˜&‘dYü"¥nËÏ-þOžÁow¿DqÄw"O>6pï­to“Cþ<·G ˆàŒK~p©e =²Ú‡ >&š}[55=l¨vù¡Úž &Y.2Á“S|“ŽÂóÑú2y§:ßU+z@§â1Pü¼‡m˜ú1Åâ¸ÛÓŠ$ðnlìÏéøÐÚS29MÎë¦^âAÐ“× C ÅÀL~÷;?œtV ƒG&Û1˜Ûøª¡!çƒ ) "ƒhà<¬hIÂñ†qÑøíê¦ò/»ü#Ûþî¸ÚÐÈ–µe ‰ø’g1À‰vÖGÄ& ³Ø¤×}DkÞGtXÎGü6é#„ŒSVÃߪ¶¥@;ð‘Gë*gÖkïoI¬‡¼ý{ƒ …Lw”têIêÔ$aÍrG iP¹>»£çµ½ç·ÕºÄ0Ž.<‚Ü¥X÷qV]Ƙ¯¬=z²N'FZ—8¨³\‡Q›¡âŸ_%5ãÜT¥ÚOÉë²9Úž¦š,x»& ÚÖòûÈ)*@ªzEÄv%ØÉÖ™¿£ MÁeœðaéh'.X·§UŸ*·é²³›,š5_ÜRÉ(ØçÖ¹%!ïf˜w×’‚,N‘+—Ùäá6Õ0£TF²Ç™³(˜Ü8™A¤Mþ©R~ägBóùçˆÙÈ›Ž#âÈç»Éó~ðcè.sBˆFªìÂ:F* qѤ]ê}ˆ²—º%ðÎ¤Üø¹ª‹æ™Æäa‘Š„¹×†rÞ«!œ„¡fWýQúÅ<šÓÏ,3:8Ùq>äíÄ¥:GN‰,«L^*»¼i |Œ7²½xtPäWÚ|*çý¦Êšû)m:3¦'/>©Q«\xhËÿ¶ñxY€C?x­¥g—ÿæms°L§.x9ä´å±O I@NÏp°ÊW›IËqòuo¼9!—õdK9Ë““˜ êãî‘öŽ© C sU +šú‹–ÀÃÓSä¥àŸ¼ 8µ'I`k·¢Ùñ*8%½‚íÖ÷É:Eœ0Ÿ÷ž“gÙO¥=ô9™¦·õÞácˆ,Ëb˜« pè>²æ\%ïÛnO]BÎÊǯÚÓ©©ÐªÓ$T™y!ýîc͇ÖË…Ö'B+H lNùвRSW€ÙlÝ÷eòüñ@¸ÿ€KlÉJJ–ºOƒ;Ȳ£JÏD¥_Ž“%Pï ±ó¦‚7eêÔ{JÄü6ƒî4å8ÙRãiê«N‡ø)æ„¶E oöÿ÷Ÿç[uªlNqeCLƒ13…"’èÒ2ùÛÐKÞÿctÏ+endstream endobj 2599 0 obj << /Type /Page /Contents 2600 0 R /Resources 2598 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2576 0 R >> endobj 2601 0 obj << /D [2599 0 R /XYZ 56.6929 794.5015 null] >> endobj 2598 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F41 1238 0 R /F21 954 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2604 0 obj << /Length 3126 /Filter /FlateDecode >> stream xÚ½ÙrÛFò]_Á·@U"<'޼9±œrÅ1•ÊnŽ„$”I€!@ÉÞ¯ßîéž!@‚Lìlm©JÌôtÏôÝ Ê™€?9Ël,tnfinb+¤•ë 1{€µo.$ÃÌ=Ð|õÕíÅ‹×:åqž¨dv{?À•Å"Ëäìvù[ôòíÛë›Woþu9WVD_Å—s+DôÃË›Ÿ_~Oso/s½üæzq9—™’)Ip‰ˆ^Ý,×_Ïo¾¹ùõÇ›ëË?n¿½¸¾ 'ž^ Çúóâ·?Äl —øöBÄ:Ïìì^D,ó\ÍÖÆêØ­ýÌêbqñS@8Xu[§¸auÛL¥ìPjÀ)`l’Yjó8ÑJ;vü§m*ºv±½”YÄ/]ýÐTKß}¤gÿè!Wí¶î×À-EtûXw´ÒnúºmÅûzÓ…ïí«®ïâ#¾‰XXPªòXeVNKæC(º¦œ’º‡ÂkÎ:$™'qbmzž¤š 9æ¬ަc’ïªuû4`gÑïˆÃÌ”{÷Ö®éí}õ10«è'$Ò´ô\µÍCµe€²¯Ÿ*ÇÍYk‘Ï@cAQ”;ÀM»]«ÕÇK)et;Ò,z~¬P<©Š zlˆÆSÝîºÕÇy{ª½j/]çW ž«›Í®§aßÒ) L8lÛËÔxòE³Qsúîúß´‹R¶î¹twpçÖÒ…M0λÊÝ"÷›ÑKZ" 0 •ͪ(ýÒ3¨,í*h¢©ži…j¡ÐA,]7­/ˆŽYrxŠ 9xéúzµ"”Õ¦gr=Í5ßÔĩҟd¾I ꛻СƒOG>ñ|Æû²?O‡þ“ §:Ö)$e#÷Ü×bÄý¹±9óW‚Áâ‹3Xlž{ƒÅEr¦ˆõØ`qz`°øŠ‹O2X@Å«¥þkƒUcƒ}ÕÂEXËCÒÔ¯!‡ÄEò0ŸeÑÖd±Tž·é!Ôi«PN+·¤‰@BœiËú±…Ä¡]/«§Ã³½ÄVáž=\€š8Ý8ZA>/”o±©Êúw!i„ô²†Ü¡Ý±EЂ‹¬ð¤ã6Uסj%6zs?Ú ›j[ô¬=€èc×WkZZ¶žNÓö´Ì:õT/y{1aêÚB¬ÍC@|ÜzA¦µIœš,ërÂ25¸ Nð´h-¨MîjÈ;ªÏ$sP觺t‰™¶|/7{_ìV=m±/pO@{öм3;˜Û¾k Î0iÓ×xê²Úƙٔ~\g®Á5eúÐtc©/5ź¢)’§ÁŒåc±…OþC3rKOD¸â9ÌÝ ùc!kÏp·Ù#u‰ <ï˜ú®#aàò År|”žR±ÃœŽùJ>·ð’ÅŠ^@z»É<’4+ƒ/f),'Xi¡Î•ÒkXÝ,ë²Ð£¸7–#Îø2ôØîV¾våcâOº“Á=Ešw;C¨Ón'@9·³8J'LlŒù ’h‚äW9DseH.ÖÅù¥.Ôj| ËÀA€¬·—Y´+û©àŠa\+™}Jt…ü5†W¤Y‘TJÌ게³LX " \—µ]Ý·Û…aßCu4bYÃh]ôGØü™@EÓ$Ö‰–cÓ»«B¢ŠöŠó¥†õ¢o½Ú”«Ý² mеŸ>hyìÛ$õ=£Ú°ÏÜlkPÑ8ØÌ>µú…ŠmåÌSmb¼SÞnàâ»ÆMåuÕCÎEYº‰ÖPÝ‘%ãŠßV}(Ö5ÕéŠìW—8œ§éÇö™‰õ´ìB‘/À'ÚÓ/J_{ϧƒÀPϺÀ›{ ïÏaÝ)ä6ì)®‹’3ünWBb×Õ>åe@ÆV¼÷f Åö'œ :^ÿåQÈÔÔ¤3J­l¦¦¬ @2çh&Ã9·ÊæC Ñ\H÷„SŠU*)‡g'Œò„7jhÀ€0‚’‚m"•¾›"ö„VN2žwƒš±…´“§›D¾±#}?FrLpP|j´§2‰sØ£vÅÞ0â“ÐPåžìó0ÄpF,`¨0À¡/ºAA1%´)¹Ë–Í $‚¡·ð+GnaStýÕ1±ñ®¡8Nù–3,ÔIœˆ,ù,`8ÇBX˜ßíÒ…0çzžƒ¹ñÌÙ?Á qA©gèÒ¹o ÂsN ;¢ÁÐŒgÈ9XÇr„ÂÇÇþ•Ëð´½laùžÔ^<1"bf#ø8gŸ"-8v¬ôçKkˆáŒ´˜—–„)‚Âã÷wÛ óÂë<®:N ÔùK0};~¸Ewhq«» iîq:h/=ÞÒ»pxzò0œö=î:)¿} ±$ì;a…ÿ áZ ÈòþpΠ׃yáBFU5J?zmyšŠŠ\z™ãÜ® fPênï\V«j´°¤[׈љ±öMuœ©›¢¬F¥~Žûáš‘Þüx{Z–ÞÑö¿-®«¡øÄçÓµÆç°›iø`|²0P ·ôäGH_ ¡NÊ·ý©bcuhXõ«#E„2 2~}þ\jâ`#mS"6"IÆ'µ"”¦o%ð¸½ýžNðt¤öÕ$Ž(cÑþ»ŠÞwûq<þ¼ÃÈëõ¦ÝöAÝxä$a¾WèÑW˜!ÙyÀuÅœ ¸]"’qK5&Q&’Û&Vq#û¢Ý–N½^[5èbõ'ä ›± 8Ô›ê²\¸Ð<Ñ£y~¬]±erwA‘5šüÜäɰaÙémGãgúb £;ÆB) œ‰Âӗ寅óõÕÀ}Ô«’áIní}€eˆ½È­ðl™Pë ¿‘Aá´¤óNéÞ4qŽ]UF7rßÊ’èMCì80YpFº³í‘ôV¶ ø]— uWõÏT¦íi¤{®iR3÷xµÌõ4®N|ò «-þ."”´Ç™ËÉ%E'àÿ·¨!Ôé œù÷G½+'©1çIz  ’£Þÿ°bDòí¶n|¯‡Ü̦døÆ_Ù®7˜½´Íéߤ1”Çõ’=Й_0cÇîT+ï½ÐÉ;¢7ÕÈÒûyCIº¶It³¸þúþÓøžb—Ø%bÖûx±· ® Zÿƃæü=Œ²Þy¢òè—Kk#÷µz?þÛ FÄLÚAB­U‡¡6Èÿ~Gx •EC×–Î Û|Æœ´§ßà„ë[óI¦ä6“î™oËáè49=IO =çÁ˜Ô‰_riH¦¦U]„`øåµÿA›Icj7i(D4$ÖþPÈf™Èã‡ßƒŸý¿$Ö`endstream endobj 2603 0 obj << /Type /Page /Contents 2604 0 R /Resources 2602 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2576 0 R >> endobj 2605 0 obj << /D [2603 0 R /XYZ 85.0394 794.5015 null] >> endobj 2602 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2608 0 obj << /Length 2663 /Filter /FlateDecode >> stream xÚ­Z[wÛ6~÷¯ÐKÏʧ–€<û¤4nÖMâd#ç´»mh‰–¸–Hפ츿~g0o‚äínÌsù4ŸDðÇ'J3ŠtbÒ˜©ˆ«ÉrwMÖðîíw43O4ëS½¾>ûë÷ÒLR–j¡'×·½½% Ÿ\¯~ž¾fÍÊMW»¢é¸dÍžœ³¦ýní¯jG8£MaG{è> ŒÅ/‘Š®m¬âÑùg]ìŠmöàιêÎû0ˆSÅ" ¦Ä0ÚëlÛ”0¨rPžNËå‰rõÍj&Ṁr½ÍËüŽ ¼Î$fééá1à¬ËÖ0¢¼ƒuñ˜»·›ü+­ÈËeµ²>³¨øšNãéœ^¯²Úí‚ÎGVQ}«H‚r56ËH!ÕD¾þÛ3µ›.½79ñƒt²€'"R¦£¨ED”$ŠrU,­%(¿c„ã¨tßÊ1( ¾ܸ5ÄiˆÖdß´8Á™¸]G1‚ŠSq­_pÉÕ —ôTÖ%ÿrIÄîÆYµh¬ìUY…ãSʨä´t-U@¼A&Š)eøP¾1+Ã6|Õžƒ7¶?ª]VºÊÛéÄ`ºn‘Ûm¶Ÿ1öKdž',‰“—rEêÄÁx*{0óƒ ipyš¥' °ô ‚AÒÕC–ÎÖ©Ú:½ÌÍ{[Ôo`Ö"9_ÃËŸ®±*}ürM/|‰Åw•[…Åm¼é¨¦9B„}øvUÑÕ¸NL[’& ˆ2ÃZÐsÃaò¶zðh 0ÚÞ£òƒm¾ö.‚ÛG°uhR,ný¥vÆi,í4œ}*–Öܦ¸,Ë™kúb>À{D×¶ÍæóP„EŠdé,›ýCY{9r ­õ¬Ï§u¯ô‚ô‡;‹3!@Ìàr¯)D×íÞ­±yÎæTx jÙèöõ ñ –Lhã!ÀlRJ}¬¼ú} ìóﮂÎüùtjðy¹XnhxOú>Õ¾ö¨|“¹ü=0#æ~LGÒ@kL^/äç>Õñ4ÐRy@ç'¶ù*€¹Lzšµ' ° ÃtœŠ!ë6':þdǪÄ[…ÃRÖµ)㊈x6_7Vú$}Ét=ª¦óT(?bøO#™Œ¢xz¢ÏA …lðÏÅ}¾$7Ôºu4ÊÇQ½©öÛ­…àé0ƒv8©l`g6Ž ŒÕJ%ÓË[š*«ñîY›Ãp/_aQ4ö´ì¶f¸­×Þ9¹0žÁÜŒ‚9ÿšAdÅ•>ˆ´k-d(ÕRÒû‹lý_Ýç_Q±(&Å` ¨jG×ió·Õ¾t¬3?Ú>IG/±â7Ë ùªÄh/}µˆ†¸ïŽn\g=ôl( Ý]Ÿ­ …S±©žÏ9çÓWí’n±ÇάAˆØ þµšõíÖæÐèèz#m°ãa^w¡Ä?Í?|zÈ• šPL*W©(Œu ̶Ûꉬ¡DònGFÔÔ¹Ö4ìrtÒOÀ ’t”x<Žnp¿Íl@'zt¡ýM2o¼PosØŽ¾¨¯ˆòæ9Ðûq¼HÒtxÇ[¬ó2 Ï ¤a*‰Óá¡c]~×Ó„} …ò[nDl°Àb'/ôôun;x¼WåGú_žF€X}ýZït˜î µ¯_Rˆ)] 58¸É醸¡£àÝWì¼_£5ÿâÖ¸»íl·OËݾå@bð‰dÑ(žwY X¸Å ”çíØ·eƒR­7*ÝÞmݰӎH¦“–Ü5–¼EnÕ2ëpÓ¶ªîêž„à’dq½-W5ÂÏ@¿’š´k Q5{‘¹ï…xz$Äqi]ù¥Yãì 5ÖDrt;ófqw.=@ñ¡ØÝWM›Ú L—Jv¾û3zŸÑÌå 2[‡¦œÃ¡eàB –ˆxu¿Î4Œ°“ÀŒž=ûî@«†.bç~á2%á#±8$Ïc1B„ß„d_¿ËaÂçÓì¦zÄ‹gúåø„>פ)ãøQå|­á©ðǰ$߀T7þ|Ð¾Ñ iÅÀ$&~=#$8Vè—üݶ¼mŽð] O@s ìHo’O‹¤o¿ƒ-½÷úú™qaÝ€ª»¶ŠvtÇË™Tn²AÇò6Tltm±!]˜ M蚤–rxÞ^ñöhñ‡èàr¯3zqØ$p‡iiì5¾¾Á\ïA ¿ âŠkïi‘X2‡âq׉Bï]×û]عÇHû.¡DÀò>ÒÞíBшñ“Éä¿L"F> ¬ÈC+ú"¼¸¸ kÍß/>¾ °èst‚ Öå ™¿?ÇímåëË«7Ä&uÜVøu¡nüxXø¹_4õ!+÷Ù6债 ü wˆ?‚&îÓÀçï¿£ãHÊÀ~1g"Vüo§cþâvìØÿ HÅðc /‹Úû¿ÿ§ û÷‰D’ùÂ)Œb°X{¡Pp®Åa#ëþûàPöÿ]PPçendstream endobj 2607 0 obj << /Type /Page /Contents 2608 0 R /Resources 2606 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2609 0 obj << /D [2607 0 R /XYZ 56.6929 794.5015 null] >> endobj 2610 0 obj << /D [2607 0 R /XYZ 56.6929 349.1664 null] >> endobj 2611 0 obj << /D [2607 0 R /XYZ 56.6929 83.3187 null] >> endobj 2606 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F63 1385 0 R /F53 1333 0 R /F41 1238 0 R /F48 1258 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2615 0 obj << /Length 2289 /Filter /FlateDecode >> stream xÚ­YÝsÛ6÷_¡Gz&d‰/’˜>¥‰Ûss縖z½N’Z‚dN(R);Ê_ ,%wænüÀ%¸X,öã·»2™¤ðG&…HR&ù$—<)“ùú*¬àÛ/WÄòÄŽ)¹~š]ýð3Ë'2‘Í&³e «HÒ¢ “ÙâSôöþþæîýí®c*Òè§ä:iýëíÝïoÿ‰k÷×’Fo¹™Âkš¦90¢ù²4z7Þ¼‹ÿ}ópûóŸ×_f¿^Ý̼^¡î$eZ©¿®>}I' ¸Â¯WiÂd!&/ð’&DJ:Y_qÁÁs+õÕôê7/0øj¶ŽÙB°"ÍGŒAÉ—BÐ5„L2FZã÷Ù?>>è‹; l—NÀ œ¾Û¦WÛFõh¡é¾ëպ×wmÓµÛ¾Ú­­8•'ŒgÔÊái"ó ­¯My0k´hºNÍãgµ­–{½Uó2ÈÜðÞ•kuF³"c¡Ä¡£ÑgJs¤Ð]Ho…”æýœ¦t^öUÛàZß¶õAÿƒÕ´N")¬¹¦û¦ÝtUwìù ÜÇÀ"+–±1G¸˜èшN“TÚ ƇœŒ´c¹–ýÏñ*‚›Iš'BfÔûæuÙuÈ68ƒÊ¤(ri¹¾8‰7#µa2áªfU5jDâÍK¼}UbÕlv}¼l·ë²‘›“$gäXlûªØv[¦_Ñç‰1˜²|û`=µzVõß7ê7O}·”ÒeU«±PŒO Ç3‘Taïo¦ïnïg·ïü¦³i|’sG¹—b©SÓ¥‰Ò‰ÎEÔ?•:ÿ9J\°TÕá‡å®®÷¸ÔU«F-âwUΟp©¬Wà‡þií8ve®äퟬpHâ7"ýðÐ)«„* £†Øj?ðˆÖñ ¦xiNйŽ1”…„;?’ó§²j,Ø•ÛkRDvÓ¼]ojÕ«äpX7}4šž” ›÷œÄsF/ƒCÈåþ<—>×AA6„‚„2r‚¡b†ˆ¢¸¬™çQ-Œ+ yJ†ºM7j~ˆ°Ðàrkb£›!Ûå“vmrΠ Ê)¿lÐë¼A=—1èíˆA¡¢ìl Ìše TuyY?Ï5¢àÀ¬œA¼ 4œi{#«ÐÜXO¯õî£Ñ¿aëEíŒZ™žˆG÷m×UµB&Ö!ŸKƒSÀ¡-Ƀ·€~ÜãSƒMà,XqÎb…«ê°8oQÕmÚfa}¤›#އBvªI ä0#ÚIM_ÉÕú£Cs½“äa[3–ï¤(ýåå|¹Îç»ç2–ø~.ß/éóýôȱ|y»jZ7€1nP¦ð¡ ´nß\:$zÁ¨ç;{µ]ÛæÇ~‚ Û£­¶EJ‡­~úPšë¶Ç,a`êî¹H1’íÄf»É/ÆŠm2Œ±È}óµR¿X€0”òÆ`Üå#ÃNÍìÇn‡ñ¹ýjJ8Õ:U/c쀑Z‚ = 4ñAÓ‘– SVºÑ\úy¨pÞׯÍbØçrLùé] I`hòøà˜‘Ä{k [o´ÖÎ%þh¡»hp Øbim×ôc7ñGA9}ñ0Ö\cÛÜÇa3Ú'^Ä-øK¦‹Ýó ßýŠÃÞ\X€¥‰^®´XÝ€BUÿÚUþׇÜ[.wÖÜyðóŠ•ÄŠþlmÔ£]q²jUv½;ß~;  p†õUKÏopE¬pv\ÔJöz½½&ÑIŒ6 0Ú(;äÐ]c‰Æ n1ù åؼ¥ÔÇ’^¶yAm^РNêµ=>˱08º8€"XåŒÙõНÔé†õRøäFñª™×»…êŽ7,ˆý¨/ë‡vî`N C‘%ÕØìŽGmo‡§Ín»i;ÕÙÆßÕÉt¬Nºôñ:I MdQä®N~¯“œ‹bX'q,«ˆœ&üÿ^3ÈK–¾ò»PÀt¾:&÷3£sNF’¤ÖK{¦Ó“ö£"‘@%<Úsá˜5éǧ²ã¡ËU¯3ÿÔb"Ñÿ‰Ñ>õ?{þÏÿð:ügç +Š3ƒ\šIœRÚ $cǪûêþ_°÷endstream endobj 2614 0 obj << /Type /Page /Contents 2615 0 R /Resources 2613 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2616 0 obj << /D [2614 0 R /XYZ 85.0394 794.5015 null] >> endobj 2617 0 obj << /D [2614 0 R /XYZ 85.0394 752.3087 null] >> endobj 890 0 obj << /D [2614 0 R /XYZ 85.0394 714.7159 null] >> endobj 2618 0 obj << /D [2614 0 R /XYZ 85.0394 678.7396 null] >> endobj 2619 0 obj << /D [2614 0 R /XYZ 85.0394 647.3277 null] >> endobj 2620 0 obj << /D [2614 0 R /XYZ 85.0394 583.3288 null] >> endobj 2621 0 obj << /D [2614 0 R /XYZ 85.0394 513.2613 null] >> endobj 2622 0 obj << /D [2614 0 R /XYZ 85.0394 440.229 null] >> endobj 2613 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2625 0 obj << /Length 2210 /Filter /FlateDecode >> stream xÚ¥Y[sÛ¶~÷¯Ð[å™Á…ÁórÆuœÖmcûÄêœÎ$y )Èb"‘ªHú’_ß]\(R‚dg:™‰p±»ØË· ˆ(üc£X™òt”¤‰)‹GùꄎîáÛ/'ÌÑL<ѤOõóôäí{‘ŒR’J.GÓy—"T)6šÎ>&Œ“S`AÇWg.ÞMν8ÿýüúêýé„%LDã³››‹«w—NxLˆ)8»úóì»vsšòñÙ/·§_¦¿\L;ÍúÚ3*P­¿O>}¡£â·JDªâÑ#L(aiÊG«“($Ž„ð+˓ۓÿu {_ÍÖ 5%\H0g#ÆHÇ|`8%Rpaìq{qauöÇí5žvñžé¾ÁÒÈÏʺÖù¤.îËïU©?Ó˜*ø½±[EÚÛªQi¬€…1üåÕ;+)ug«¢,êf“5ÕÆ.}Ôs½9ej¬Ë\Û¥YÙfË€bL*Â¥”Ž}Hˆ¤Š Gðñý¹åQ!ü"Fx3GMÅÀ€AJ)Å$M7´gN½þø²í.ËFoJÝX5nŸëF¯j;9¯ÊºÚ4E»Úʈˆ$w|@;Æ£¨ aV QYf+=›ä Ë«rŽ›‘´£"J õÐ-%4Nìv­>sžØ‘ùl‡ðù3¥ü¾¿Ué(aeé§ I“0è±0™±ptTA I°ÿ§Éâ‹=t£¯Ý¨±Ç…¶Ü9M gqì"mVltðlI‡ŠDDò.&×y±Ô¨Œ—±î¤=u£ï_‚ñË¥ *¢r¿ï.nÏ?^ÞL/¯¯º]ƒ8q;‘¥²€Ü)m(!Ê…`ãf¡qàCä Lb6¾k»ZVÍ.^eeSäµ#­æ– èÉi‚)âñÀFì¾v""\ÉN»Ý`Fî.˜Ù¡?æã©U§û`T³á †ä€2‘ˆFkh,ëlScÂÆÇYéÆ~uŽ˜'˜0¶Y˜18Õ€ÕÆœ™'ãlYaþàžÇ¢YXªl¹´KV¥ÚNŠ2_¶3/áîÙ­6pŽ(•ã˹Ý\Vý½ŽÈ±¨×:/ðƒž½ dÄ‘q9ó½ÕMþÖÚ¡û2éÎ{ÉÀ} -þgmðøw¦çY»lˆæwN˜‚ªia®jôàœBõmA,eM ZJhÄ^ŽÆ©WÐ+æ¥ý[kpvÖh;3Žwž…c7ú©1ŽÄ`nó…%Êê€i™JHu:mÊYN¾éç€Z1…ˆK| cx¸Á0žæ®(gȬq$Ñ•Q£kfkÕż´>fŒX#>ÎÚ¦ZAúä”r\õ|ˆ³»ç€ |Üaº‡ìrTÜÕçIEX7wòämSç©õ¬¬ÔÚ·!“UæÔγ¶Ö!h–ð/~´àÐR5•e:ÏŠ¥O‘„D)åCó!O"°™·åœ¤cý K»\Ì IÀœ”³×ÛŽÃäYúǬ¶¼!"s]×óvIB) = â…x¥òÌàÛ‚D¸óÙµÊýuÁÏGp]?­—E^4OŒ1ÛÛa÷fKx2„ÚEõÖÚœÂ6òŠæâÚÔ¹ýÎÝuZhÊ ömúT¾ÑÞo:*”;Y슔’Ð4yA¤' ˆä;¾JÔŽÈ›MQºfÓTT´uvïû´vµÊ6_M‘Â~*,Ê­ƒýƒL’¬Ó£:bOe¬ã0Zö¥Ð7NBmR_7P'™L+×Q´Ü* œÇ©âCõÎQLƒBSÌÙ@mŒI¬ºûÈN[7„\ITÒ]ŒêÊ1ÅJeF®ŽÛ 02hš7ŃA,$€†¡ô»Ý~+‹]‰‡ñÓa²¶Âô·X&‚DrÜ]U.æ¾:»,îÕæÌÅS±*–Ùfùì[o3s°ÍÀÁØâ0‰x!¶zTGbËS™ØzØË<ð4DÇEz¢€H>l$b0èPd(ó£êî¾TÍ·_CµQÛô€Þ„§ßoï7ÙêG’›¥ nœw@Ÿê°:*ã€õ!è;*²ƒ¾}‘!èˆì9 j›[¯X QŠ÷-ýºvµ³é¶éÞ^„}Ò8oC-¬JììZÿÕ0«°#7þéu.8Ô>gmÜ I!&Æð…âÕ§:âAOe<ø´çAì@˜:.ÒD ÃD°¡Èÿ/°ƒp_š7¹|Âå}¼‹zæGŠÂ1è™iÐüØæJèCîê¼í`¾Õ ‡’3»µÖ¹7µ%0—*ø`W×Ë,wš™[«y½ÁæNÔÞݸJÆuºG+iÿnuížS`êò·Ú~À¶Ÿþû¾±á5ŽÓñÀQ¸ÏÐsWnl¡¶›‹GÙ¸åj{®b”zeàKÁql­–™…wº }Ô¥r=[Y ÷‹aÏv§mg>07Ì탎ìõX de«õR£Ã¢tüh£·¶w«¢qqó»Ö œgªMSï2E8ÀI^­P®ŠºcÁö`/s {–5ñoj}gNþ¶Z­·`gæ ÃÔÆ®ßòÈà…îj±‚«÷—j —»}‰“Þ{ !@Š%\òãÐ#:œÿžÈhôýPú“×eÿž¼Pò÷åÝèÍ#]wÑ@~ØÑ²ò¾Šš×¬²ºÑî-Ÿ§k¸í­CÉÀðª#Åk’!NI²íÝ:ºñR)ÝÒvƒ£1^øºç“ô˜0O²'làE …}a~½¹»ÜlkÛþ“ïðͦky¾Ví¦ôUÏ׺¢éz‘º©É¡ŸPàΆ¿{ÎD»dø×?¯lIŠ|Ø?£<‰ñ¾-½Rh &£}ß»böuÿ÷„…Çendstream endobj 2624 0 obj << /Type /Page /Contents 2625 0 R /Resources 2623 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2626 0 obj << /D [2624 0 R /XYZ 56.6929 794.5015 null] >> endobj 2627 0 obj << /D [2624 0 R /XYZ 56.6929 752.2879 null] >> endobj 2628 0 obj << /D [2624 0 R /XYZ 56.6929 690.9973 null] >> endobj 894 0 obj << /D [2624 0 R /XYZ 56.6929 653.2561 null] >> endobj 2629 0 obj << /D [2624 0 R /XYZ 56.6929 620.7725 null] >> endobj 2630 0 obj << /D [2624 0 R /XYZ 56.6929 585.7377 null] >> endobj 2631 0 obj << /D [2624 0 R /XYZ 56.6929 521.5252 null] >> endobj 2632 0 obj << /D [2624 0 R /XYZ 56.6929 463.1995 null] >> endobj 2633 0 obj << /D [2624 0 R /XYZ 56.6929 323.943 null] >> endobj 2623 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2636 0 obj << /Length 1904 /Filter /FlateDecode >> stream xÚÕYKsÛ6¾ëWèHÍTž$xTl¥u›Ø©­´&9Ð"d³¡H•¤âª¿¾‹)’¢ìÄÑtÚÑŒ‹}|XìK2Æð#c)f!!G1^®Gx|c߈£™ÖDÓ6ÕËÅèÅ+ŒCúÔ/V-^a)Éx¿÷foßÎ/Ï/~›L©ÀÞK4™ Œ½7³Ëw³×¶ïí$¤ÞìûùÍdJB ¦é|ì]ÎÞÌϧg?ÌÏ~úýêr>ù¸øq4_4šµµ'˜iµþ½ÿˆÇ1ñã#J1~€ŒHÒñzÄC‚3V÷¤£›ÑÏ ÃÖ¨™:„ Êýñˆ™†!à €`p‚ç{È(‚¬¦Ò}À˜¦*‹Öªo/¡1FÂq›ëì†j@8m '4DŒ0Ú•¾¸W°.,ðŒÐ’^¾²=Õ½ëXæ™Vòn[DU’gvÔªm ªÜöÝÖîÕò“ŠaUÞÅÊöfyeÉÊZ&z¾Š¿ƒ޽¤²$±ZEÛ´*¹FäÅ+ÞÆqX3âkóµþ/Tµ|¡ui@<ž2Ÿ")aM§„ PjÈÀ„•eÖÁ„2Ì/ä(ùzê @"Iͦ–Ýõ|ñîúÒ:ô/@Ö›½~.]ÏßKÀc Bð3Ñh:5øQIRPðT«R1!ÒSÕ¶ÈJ+-ÊìSýe0ƒVYEÕÖš¥ƒ'±Ä½ªÂðÉ Gö ,_û«J-+×\;–àÅCRªatju;ðÜÌçvòìõÍÕ€C |ÀKø#ßÙ©-¤þÎ3Õ6üXØvmð Øõ:¾¼¸<·LB§F¼N²¤¬ÀóÂv]«•![:ÞDÙ6JÔ%¾DÔ÷ýGÝ„Á‹eˆÙ»ÅW×O#p‘UªÈ”[Ñ›]Y©µ[«³<+ó¢J¶ë½XØðܧާˆPðac9ÄRˆ«àg6P3x@­v—.æ è"ò—ÕŒºË“¯7IªŒÓýÒÀ¶Z}u¤€öç(Mâ¤ÚÙ7Ã4É¹¥ñYÅu•çéä¸çt»,ß”IÙ¢>„~Fƒ1 ¢ØçCA”€õThÿy4º·Y˜Ë‡¢{C5€ÞdêÃÚ¼ŸÆëÖ}Óú£iýÙ´>7­¥…@°vøÇ Cœc.Ó¨,B&¬¦”A討«ŽàÒ‘®òbUCA¸CÖp|u:Ž&–s ÎtîmÇò÷Ód Êk(Öy¬†èÄûFïOOêý(?Öç·þ6~ú½9±~Ù‰ù½~’_©Š¤Ž­_âIùGˆ]iZç öĹJö‡§o IqÐç]œØúòië«]ªŽmLÙçwsbýª'ùÅI'€¼Ø 0ùT>Óʼn•|\p y=„äÔÙÿÏÐö¼iý: Ç×™˜ñglMÒíÁY¿µ]q0IÁÈ·d ‹G2PMÕÊ@íLÝÏAÏÈ<‚hÄó2ÏÙ‰ãã¿“ÉÀ¸.‘­ãŽ_Ë:9±ñÿõäõßO6'KöЂ}8b‹ ›¦†ÓD—Á×¥‰ÿmXÿf%¿$š?GÝ#§É%!éíúãÇÁPÊš÷ñqp… $ 0»×šóùÍÙõÅÛÅÅÕåW•êK_¿¼À§AscДæ¢É\¹Gp¯ÜeUô—ítÕî%pC½+Ü͹BŒÛÑú²ÇÜeOW~(ñ.*Û¹Q…Ž’‚lÉ ºözp/*ìdLÂ-—ÖÁÅØ9`\†)„è°¢ã\iæ’{÷*³­4b{Å”Ö iÍÕ9¡Þâ>)íØ:ú¤†T"Oˆl«ôô ëd¸-Õj›Z¹+sõ…FëB ’ªÐoQu6Ü*Mïê7z’+ÏMmü¡pÜàœôâ϶Øß§ïÕÚÕ‡2S¹ÓUŸý­ÞU•T—ðIÀ[厎Û‰¸ ä‘#Æ¡õ¡€]Ô”í,¸ &Y'id¬'M½öb€¤<ür”ÁhLëí¯«Rz·ÛÊÊ3E3¥ÑÎéo××´® ã5ô¦Q©¬ª r7ß©¿QËv‚9]ÏseN[­ ! û½í‹ìk«$jûí©B;cx³8Ntå5JÓÝ„¢Íb$4Ö&›Mšh÷0¬ª"YV°vfÈ@eRõY¥¥í¾ÝÙ§+¸j~T¯†)†éƒ„ž¥Ñ©‹Gm‡Ê·ÕF£Êìª$MmKW€õ¼;¶­¨tÏÌ=—•®²™¶EY·hˆÝ™õìÛÝ€KPÈ )ÄÁ€a†l_µ› L½_MЬצܗîì[w £©{jl˜u ·¿|D¹ì凳Þ:5κ½Þ–®¨UõhTwݺ½•u%W¯\·¯ºÏËzK¶U´Û·ÙÐC(ù!Â$ðŸB‰Á>æMB8(õ7¼#eOLõ7¢^Òº2ùêæàŽ»Æ@ІôðøMgOsü;Š£Ñ§q_X™âàcÂj’aÀBÆaó,ºM›êùíöî‚+:ö¹J—\R7P~ó§¬ýW; &%6†aý±3N)m ñE_uéVH}e=Ðýb¤åÔendstream endobj 2635 0 obj << /Type /Page /Contents 2636 0 R /Resources 2634 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2637 0 obj << /D [2635 0 R /XYZ 85.0394 794.5015 null] >> endobj 2638 0 obj << /D [2635 0 R /XYZ 85.0394 684.7381 null] >> endobj 2639 0 obj << /D [2635 0 R /XYZ 85.0394 622.0142 null] >> endobj 2640 0 obj << /D [2635 0 R /XYZ 85.0394 559.2902 null] >> endobj 898 0 obj << /D [2635 0 R /XYZ 85.0394 520.5531 null] >> endobj 2641 0 obj << /D [2635 0 R /XYZ 85.0394 487.6322 null] >> endobj 2642 0 obj << /D [2635 0 R /XYZ 85.0394 452.16 null] >> endobj 2643 0 obj << /D [2635 0 R /XYZ 85.0394 386.5142 null] >> endobj 2644 0 obj << /D [2635 0 R /XYZ 85.0394 236.5364 null] >> endobj 2645 0 obj << /D [2635 0 R /XYZ 85.0394 95.5488 null] >> endobj 2634 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F39 1178 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2648 0 obj << /Length 2943 /Filter /FlateDecode >> stream xÚÝZ[sÛÆ~ׯà[¨s»÷K;}P9u©J­¶ž&y€HPDB2AZq}ÏÞpã¤Ï´SkÆX,vÏžó+H&þÈDH$ 5e8˜ˆÉ|s'ðìë hf‘hÖ¦úòþâo˜šd$•“ûek-°Ödr¿øaú%" ]Âxz{usýÕìõ_®_û¯¿Þ^_Έ"”L¯îî®o¿zûþrFz Æxzsuû÷«ïüÜÝ¥¡Ó«¯¯ß]þtÿÍÅõ}ÍY›{‚™eëÃÅ?áÉñÍFÌh1y†Œˆ1t²¹à‚!Á‹3ë‹wß× ¶žºWSÒàB#A¹¹0¤ Ói™¤"Å1RX©Zf”¤d©¬Ìf«þA¥DØ(9i/v´e$JlI[[*‚°Ò½-ïvÅv諒_å~p¨²Ç0¬›M¶ûäo²íÂò_‹=:ÒI8¸ÂizJ8 шl‘͇AÑŒì×H¦¿_R0­ý¾?y˦\iÌšãûѼ~Tnן. !ÓA¹H¥‘áš ¦M5,™šÊ‰æã‘h€ÙœØ2%¶ì#ÁpoËj>滪(·AËæ)0×;˜,âK`Ä®¶Í6ùb6_åó_þ]nã m&4³d$Ð?í.‰ž–»ló`JîIw£€Õˆ"•SÀÏG `ˆQeÆ·ŒD‰-Ûg—üYwË®ò éu™-ŠícONŽnô#ÆtÆNny¶èÿ\vÛlíoŠ ¹qiµ¯†…J"ZŸ0÷6ÕˆP#•êÜã@²pe†<æë¬ªúŒ‰4¡|œ±H”`Œv¶#ÖÑ«.gïžòy±üÔ¢gæüµ6 ¼1‚§oómä[ÙÕ¬’òÅ« 1JùÛ[ûÐDXÖ?€¡ ªBhi‘BÆUѦVEMåTQ$Ta¡BM8ÙcK¤¨6ãlE¢[mE@˜W6ÎwغËwËr.€q6}*«ýÌÚ‚¿õøgœOÁQå»bÿÉ?p^¦²¹†6Ó»²ªŠ‡u ´‡¨¯Šùªý܉Ì9Ö2xÆxn{S$ôΩˆú—£ú’&¿8­Íúê§:ªFïþv)ÄôþæÔt0`_-ýõÊ_Ê00p´ˆ_£… h07v¥# hHqá¤ä¿ZXÿ#@ Rê³AIõ @EôTÈé"_çÙ>$ÆbzûÎ_ÝÓÉp:çì¥ ÓÇ‹ø¹ö®%ÓdáPà SXt]B à€aƒ6}»÷ϲuUúQm0v£Çõ!¬’-žÙ*[LÛ¸‚{N66ÙÞbÀ?-«zY¨:öE•»ŠèÀúá(G[ëÅ | ¤¸"/Â7Å·×øg†vH4#m€d“å&¨‡ÔJ™ž·÷›|8~*¯§&ÛÕ_¶¨ÙeG-SÇN¾ûùޤE ÌZ¢ogÃQ_gg¨{8V/̉8¢šóSIÑœ¼<}¡²Î|E•¹ ’26 /Ú…ÊXƒ˜}8ìýdL1Ý,Øk¾{.ªð‚®]„ë)²*•ÖAÉÜçuãn |„>#ÿâ¿ÉÍC‡ºf_|ÌÛmÈ÷©-üùÙ¾˜ð3S@é­&]¥TGæïsÿú‰)(ò(07Z?µ©†ë§šÊÕOËdý$5‹[Ç€­õ#˜"Êé8c‘(ÁX·”Uˆ¤ºœ¥KÙÀÍp-Ûî,wÚ”RÍ ±n.¦ Üá¸îYÝîó_÷c¸%éZªéïi/Ô`m3ßeÏC{€pˆ¦íR" .AèX€J‹j*‘ÊAåMªëAãµ1a…!ƒ…g­¦JðÖE ¤‰Â`‡¹-Œˆ£E;¶hé<„LãéÆN”·º®ï/¦o ˜%N@ fÎï‚Ä´©YgŒÙŒ¡¨ü¾‹2#×€±ƒyv¨BÌdL! µi×fÛ` ùÒy ~- û°]ç±éûe‹Ãæ©´™y¹ÝçÛÐOëÇ¿V;B³Æ†ìͰ šâô<bÒ=ɇlÈí”´!iý¶0gÙlbXÍQR­„!b°î.÷çÛ9A\Ô ‚N9‘1s²,Wû2S{ëÁ§ë&Œ\biç/ÅÖ~Ôp:§ŠA¦ñ¼£óÚ*iÇ~°ËžŠ…6]W%lž™8"åH1AÛÈ–©k”=DbªÎ¤=˜F=5VVy¶="ý™êó5{å-¸C »ùA1Œ¼!ÿd)©í{9bi3®^)q oî“B¸bk8ø;áW7¼iSÃxžmýà!R5}k¨>\Z³Þ.aÐnÊeÊ@>#Òg)#†£?Yÿ }Cî…ô2rÖ9¯Oàg×y¸à“ðn "ÜÍøWÅ#dŒ—ŠOCü½¾&t7'ƒ‘Œrp°DœˆdmªáHVS¹HöK:’i#ØHר€£1ú_‘(ÁW§k¬W¦ÇWì'š™aR‡k`.ÐÌ|õ›¶7œÒoi2}.\cFÓèŽH;æù‰eV¬ç"N  O…y'º5 ˵¦!(Ý>€Ýa€ó‡\RÖ«š˜P§r©œŠ")7,—›§bf«3Ú4ŽúßòÝŽ ÏÙn;œóK#cÙ‹ù>;8•iR¨B¤h+ xÜ–»Á¢Š,LÙ©d“b”Æ'>±µ©FL4R9ýBe_dëãdòvÁô8k5U‚·n²i?€¯ë0ç¿p2*§W.ÚÚÛÌ_b³S†æ©œ~Áä ;Œ9é+߯ò} \…7¬>ªÒ›Þ<Ìù“ú¯nöþcæ›W0,¶½÷WàÉ}ë¶Ù=|é¶ ÒLôâ`Çö]£Æ Ö·P›‡Ž3·`¾_Õ”*öflIˆý¡‡úGñÉÓ®Ød»"ö¢–u—(¯öõ—â§Ãò 9L @ÚglÚ7м6Õ0òj*‡¼M yIÉÍXpˆJ¨òGùŠD ¾º¨ÃPÙÞe¬)q0±Ý.Û—±7ÔÒÁ©Æ%LV«ò`Û[vlb_pn%“%–0OmVá¬ò°[Ýr7M¿Ôö±g\vB,àC‚oõAxã¦_µ Æ "Ï‹àÍ íf/ùü÷¼õË«÷3|*?åS ÅPèŸøTÞ"Áu r°¾IÁœšªk$¬!ÅWœŒ2iŽ™êÿ`|ïpõÚÑ×v¨ã¾‚‹ÿLI_YÓŽŸÄýgÊúÕ×öG}È¿ÞþŒÎÎüŒnL¿‰|‰¦Ä™HÍQl‹`>TϘˆcźéùç¤Rª«˜lüp.9LnW>ÆT†1•ÊÂÛL5}GÆœ›½$Sçií½û`ÂX⃠£µ§µ¡7^{Z×;/azè®~c4xÚ£Ö{ßÓÚš®ÕÌdÑÓvÞLµâÒóchŒáZÙÈó2ØÏ•y›øraþSïØ›ÇÃ’?ŸÄ“l÷o›ŸYs…˜Ö4mGT /ËÈ”eœHyìMìoä$MðþBòÈendstream endobj 2647 0 obj << /Type /Page /Contents 2648 0 R /Resources 2646 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2649 0 obj << /D [2647 0 R /XYZ 56.6929 794.5015 null] >> endobj 2646 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2652 0 obj << /Length 2564 /Filter /FlateDecode >> stream xÚÕZKsã6¾ûWè°UKUEÞŽ[N&;㙵4Ij“h‰±V"’Šãüúm¼(R†¨Éf/[>›@£ñõ×ÝÉÙ(0Ó|’jŽ&b²Ú_áÉgx÷Íñ2³ 4ëK½Y^}}ÇÒ‰FZR9Ynzs)„•"“åú§äúãÇùýíÛ§3*pòMgãäýõý§ëwnìãTÓäú›ùb:#)¡„3r'÷×ïç·³›oç7ÿø×‡ûùô—åwWóe§Y_{‚™Që׫Ÿ~Á“5lâ»+Œ˜Vbò ŒˆÖt²¿â‚!Á #»«ÅÕ?» {oí§1kp¡ \Nf‚#M´ŠÛ #,À³”i´³%1›)c³Ye6úõd=IBã)hfE6Å./³}~jÂ9¢8íMS®“ŠhGûkrˆRéP½¦)Oê¢Í§3ÆHòGUÚNªCûthÝhë÷Àû»Õ©Vx½‡“…yŠ(è MÞn"S’i¼8¥ ˆA¼`ÑÄæÂˆ“Tx‘YdhJ´h·yé6û¬Í¾íPÓfå:«§D%k7ÖñYnay+íÔ˜ÌhJ‘ÔZÀÑØ v½™¢­êç(›ªö*õ•–q…Ã¾Ìæ×³UµKØ“‰l‚"N©îŒ{êT¹R $)¾ï¾ÔyxwRÖ°uÞIÅ‚é÷Õú5²‰B’kŽêÕIE ›2$ 8ñ@³›m¾ú7É,±G˜¯*w”{Ûn³Ö½vGœûa×ÉÚ|í²ÆI­‹y³É@Ùº×/îy{¿XÌoœèãÁ¿ìÍÌ’&0´Å*ÛMI²{qƒù¯è[á¢tCO» šS@¢R*9„¬„<íVMS<îr×3o\3¬ûj„rÀý)ýL)ßdÅÎ<#0£qÁƒg~™èSÖ›í9«Ë3³18&-ƒ,xo²Ã®…&ñz—ëÈB£Twno&/>—UŸ[F#†)¿èÀ&Rh}Á7zR#¾¤¬o41êLj2œ£i_v¯½¬M„RãšuRÕÞÁ :rL†º-žòU±1ØSÚŸAöêØ±jsòn}Ø?YW€A&LëgŒé.rª Ó‰a¾ÆIž‡"Ð0(&Ò>»³PÔˆsvÏJkDÓ)6îétÇ4Ïç$öt­  ÝÌmþ{{–Bx°bLŒSh_ê<…vR–BñìYiÁÆò Š‘âb\¯ Ñk˜]È_å‰b>»`€BcSóÌÜcñ0"ùÞu† ‡ I¤“±YæñûS'!×>ÆuÓóqÝÊž'S%&Tþ™¸ÎFâºDTt¹Ü¥¸.QJXzŽ›­âQnž±Š4ÂOræ/ŒðìR„45µŠ¼ÏžÔ<ƒ”…gÍ~2Áë¢b0iÿ«âŠÈnÇ•ë¤"Ú @*(ÒâÒ@½›­ (ƇÖñ:Ž ¨eTßÓªËT|ÝÎ 5ÙImúlZE¹ÚÖ¹ëÀDû&z4^ˆ¾ _y9 >“C|>@+*ÿÖe®Ý¥Î¦Ó‹ùڧư.É9Y3ä»zª€–]ûÑcæM±/vY½ó£«Îf6Ù1hÈYlqÅ&gjó[}©óØê¤,¶–1ꃤ]0:J}q á¨bTD³!ùIħCÕùqéÈž‹¼\çµk¬vÅêŵïj°ÞsU{ñW˜4D±üqi:Â' fÆwž6 ó‰‹kå¿6‹‚fUŸ¾\WåßÛžœÉ´J®=R ºfê$t:;†Ç›¦9„ãï…L¿Š ®Y»Ú²&ÿUF8Ÿ„þ/—MÑ’ 8*þ?.—8Èiqé*¡/5ø eÿ¼¹ ¼L¦þF•ë¤"Ú ÉH—Ê¡v«­a4Èÿù…ºNÑ/aQ…ÀÊ´Ç¢vNË¢¦5̺͈cCCCö‚À¼ØgM›×}!×þÛÛû›wŸnç®wÂÄž4!®+yê à§ÌîZ«ïž'½3T'yäq‘îŠkµóɲ™¤Œ˜Œb8\Ú]Á9ž…x°‰Y JÿT\¼çbZ ­.Õò}©óàì¤,8oO—ÔÒ­£K¡È’Äa¨€Y:\òJg=_(@+œ²·©³sVV¥½Mêeñg1Û=g/¾ ˜¾ZÝHB킘¹ƒû³W’êâQIˆ( 1~T=©‘£ Rö¨~ˆñˆü`589J)ãŠuR͆‹ÛÕº[Så=os[ÛŽ-à¹ò¡U§¾ †18Þøù¾(ÍÛO‹Ýzå/¤Mјr•ÜK¹¡c2 d;{#áÔà_Ã,*`…Sïé<”4 Ä×·EÜ–/æaŠCwÛÉ]ycž“ Ø›ô“ ûjºU]P6ï>WuÑn÷®kßÃÝë̸ îXCpä†ã‹²ù­‚`þÿx ûGX^Ë=¡oòBf9ããÑߦA‚q5ºl'ôzÝá ¥D‚H2XxÙE–jŸª³š¸{‹Ó‹Œ#G>æ]>g½i$y§)Ë’²q£õ¥Î[­“rh!;F3Œ1Œ®ÝIE?¥F  ¬ÞÙî‹ì®pP;€ºÜÝ*sæ.ý˜/?=Ü»¿Ÿ‚ Éõ»OóEü*ŽÂ‘ @ï_Å1Í‚k87mu×ã’{Ÿ€¡´‡f¸G2LÜóÚUtµ{Î;z2ðÊ[HZBtì ì§4 ý\4gÌÔ˜g1Ÿ»¯ß->Dö3ŠaåòøcÍé,e¢Þk;Óƒ™TÈ73`&b×ÚQÞ±OlÂÁO9oÞÞߺù´ßÕB ÔVµù5Ó =äÝa+oÖ÷Yi~Ïz½<‘ Q)×ê¯ìÊ .RÄÀ¿oØëOËo?<\¶èÛâ`™{„,^ IÞû³¿©Ê¦ªÛâ°?÷ï@êæ"N‰;ÿò¿&ÿ SŠÆ½›aÚ¥ÌæˆLOUL!¡hÑý?à±7endstream endobj 2651 0 obj << /Type /Page /Contents 2652 0 R /Resources 2650 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2612 0 R >> endobj 2653 0 obj << /D [2651 0 R /XYZ 85.0394 794.5015 null] >> endobj 2654 0 obj << /D [2651 0 R /XYZ 85.0394 225.6507 null] >> endobj 2655 0 obj << /D [2651 0 R /XYZ 85.0394 155.4035 null] >> endobj 2656 0 obj << /D [2651 0 R /XYZ 85.0394 85.1564 null] >> endobj 2650 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2659 0 obj << /Length 2707 /Filter /FlateDecode >> stream xÚÝZ[oÛÊ~÷¯‡Ê€¹á^¹Š‰í>çÄq#§=@’š¢$©Ë÷×wöF“ÔRJÑÓ—&\ígfgg¿¹ÐxÂ<㉘ij(fˆ‡˜ÏÒÝY8[ÃÚû3liGô©ÞÞŸ½~G£YŒbAÄì~Õã%Q(%žÝ/¿Ìß"ÌÐ9°ç·o>\_„ÆTÌßÜÝ]ß^Ýü¿yT@†óon?¿ùÍÌÝÇdþæýõâüÛý/g×÷>}qH•2œ}ùΖ ú/g!¢±ä³ïð#D8ŽÉlwÆ8EœQêf¶g‹³¿w {«úU¯ pˆÄc‚g°GÊ`±o#"#ÒYá<À!l±HvÙRm øTÀ$Ó4·° æ!éYUQÖ4”šÊ¼® ô•ÈŒnŠ&«Š¬1¿–å.É 3VäfTgÕSVY 1F1çÄIˆai ‹ç¢Ü×y=6;Å(’‚Α`‰˜ùÌ„AoÂÁ6DÆbôYh2ìñ£Žª·oü°on$ºQj¶Â_8aЇsxÅ#-‹U¾VùÖz VpqÊ,mÇwéáK9’‚sKºÌÚu°Íž²íϳ½>É6+Öy‘Eç¶|ÌvõM»8E‚ 6 ºƒ²/Áº£Üy€{——Z¦«m²öH& ±H’±äâä†^¥û¶ö1Œ‘”Qúô…‹E\Žù7§%¯²´)«gS†á¸cªO‘ÿJÂ…;ElOñ³G”Ùµó³WÛ¼n²"«þƒ ´'7ÐÖAÆAÄÁù=u£t£1G‚aw\i’n²©+jûFƒY@AÌw f`óêzqùéæîþæãm÷Öc‰ì'}Œ=„b žÏB‡&€€þ<1+‹ºj¬¡\Ïp ;3þòðêvl&,$Gl~Q8ß'àÐz©\™g³±ŒÞÞÜ^™QlK8à*h›¼´RWÕ9–óÒJ»Y\"3zWVf°+5Ef!Âîf€y±*«]b˜ª°ážZ5€\¸ˆb§>½»¬Í®½è†Ì“bÙÍqäb–+lTûç&ÓrbPà©|4Nοçͦl³’hå×í.+šúÂsŠÀ•‘°ç3yŠì£Ð9Ñ÷|»5üm+Úî7t_%íÖêäk’u[u&’s5ãuW…ˆÑîN¾ÎšôµÖ ©HäQMÆHê.æ…›!'£ƒêk«,üly‘7y²µ‰@Ò$ã#0¸`Æ+åjðG›UyV££Ù9©úæd6´3“ðãñ¿OåR¨ÃøßQ)¹‹ Å1–ÇE:"Ⱦá #Ї"?×Ö¿o» [khˆöÖŠùjtC6em3±€ÄpKgïHšì“‡­,W|ÐÊ9Šeä₱ÂHy¬.rçê¤=®#Ê#²˜dãîEb¡Âì£mÚdÛmýGºmëü)CS^@Á‘CŸð‚>Õ´tT/Šû¼à¨ÈÎ Eú¼` ²ïâïìÿÈ ¸D8¢§¼ GuÄ •VÜæúbë«ú sªßWS‚DÅÇõë¨< ìE#$8”” •ÓxR´XJ9UŒ}QHî²ìDå1·é@Ì‘ZµHóp^…E­³‰þë6¨]ø|  ƒ–«,¤ë” ÃÑD@¦âHÁæ÷ª°/ÏF99uë|Lýn6I£F̸m™,óbí-ÕÁîÕ¤Û½zš¼h³Ú¾h¥}/«GC¬ bqµé˜o’Úl×í`§›¤X«$…RÈXšÚ w­«ú¹¾Þ€É÷ÍT›™R§ÿLÌc_ÖuþàÍ$ Q†Â_H LIŽºŒ½Ü[÷PŠÚ§ñêÉfÔ¤1ã…Ç}"% #þˆC ϘC®Ò¹­ÍD2—šØçC]nÛÆÎî“f£Ün]HŒ!¹"ÇÁ¥G4-ŽHCËÒ-ɘS¹?„ÕÂÑQå:¢Cí†À`Mè@»…nñÄöÕ`™d»²øKm)ÕÌÐèP(»ÀÍ<­Æ¡àÁS-ŒáZp‹æWꕵöw­Q•¤êº)]!âÉÑ1A8ôtŽ‘Ø!åC¸z˜£¦GþçZ\]}£Á]~(]ðNêQxv¦R)±1•IŸS›X×6öº“êYyÂ÷zTGœÏQiï»>é}£®ßûŽé×s¿½þ×WP'C0«!‹ÎVÏ{b0µ1ÉÂò{—4¨YUô~ÜgÅbñ›™0°E0°ÐEˆZ0°ƒ>ÓrŸpª uÞ˜ùºÝ«îO­ gF4í!€~¡l\ÔÖMR¤Š½tu^Pçë 5Ì©BÓŒöUþ”4–ô1{®Í¨W[Ç¡Þ=LÖYÚ/Knë‰pW"ÙòV­€³î(—±Àñî×ËÅ+Œ»Ú¸lìV}ͨwq̦ú…GpØÆw)J‹¹iñÅè¦d»}ó<î&›íÕ™c‘7CV…}¥&oŽ)’EÇoRŸjú&uTú&­ X•éˆ<"GÆ”"ÂC‘ŸÚq«Ä%YF‹+ë"kãY­+ÐÕ…É‘òŠU/ßÙÓ5÷5àçÿÒ7hÚ®¤ÅTž²kêˆ]•¶ëúÀ®qŸéˆ<"ûvBÄi8ù'Ùµë€X‚ÔE†­Åþm鉙£2 £ð¥Z7ˬª|ÑkÐ4>$(1BANRêÈ!9*}H;_aHzû}½bŽˆø¸^ŽÈ£× z„PŽ1À¦bù‡ó¶ÒýJ:7}K6ßGëæÚ:Ygf¸|I0ä¥4Y×êC¡ÂK—+kR»f~$/MÎqýEÇTtÝl%ËS´ ¾Gø2a0ëØèÌgŠüY.ЗÕò¤3äS4LblÔY$êU1 –]ç`˜.:»´ùñ3ÕžB°ûMæ’0Ø¡ûÒÝF0ºû{³¸;&QGbpr( qýÔ_m}ß÷ÞÀ1 ú˜@6!d$_«}}¸þp  ¤ˆügjè8žRQ D`y¨âÕõÛÏï‡.¤Øëaß:­ò÷9/|}"F•rΧþš×ék¸¥hó·Éêà$ÚÉXõgèq°ëMc#ÒPWœÌ˜»Ïެ“ˆE‚ÕÊÑj5D:Š âµ.mÑø`H}HÇ,:ü*:.Bºê-¨સæ¿B<ÌLA-$™™I–OIÑ(…Ýÿçr¾|¿µD—wŸkûw7–@§j­Þgi®ZÙÒ÷©…b ;í¦Ê8Hmá1:êØo.€ÕÂ}=P0ÀTcªÉªé–2[¨AÑîtÈgf7ŠVéofö.-3a‚=SµDwúò…sï Šbá¸WdhoVf&·Ls+­-lç–1›'ŒSöþ.úØÖí¢×óU»pilz1Ïu†Ý¹6Ã>îÓÕK+åe·K4õW3OÔŸºx>ì>ûü×Qóò'CL}““=q/ §”²òBìßÞêþo21Îtendstream endobj 2658 0 obj << /Type /Page /Contents 2659 0 R /Resources 2657 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2666 0 R >> endobj 2660 0 obj << /D [2658 0 R /XYZ 56.6929 794.5015 null] >> endobj 902 0 obj << /D [2658 0 R /XYZ 56.6929 769.5949 null] >> endobj 2661 0 obj << /D [2658 0 R /XYZ 56.6929 747.8192 null] >> endobj 2662 0 obj << /D [2658 0 R /XYZ 56.6929 711.7108 null] >> endobj 2663 0 obj << /D [2658 0 R /XYZ 56.6929 643.9803 null] >> endobj 2664 0 obj << /D [2658 0 R /XYZ 56.6929 558.2262 null] >> endobj 2665 0 obj << /D [2658 0 R /XYZ 56.6929 450.5864 null] >> endobj 2657 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2669 0 obj << /Length 2542 /Filter /FlateDecode >> stream xÚÅYÝoã6Ï_! '5—ŸúÀ=e»HѦ¹Û,ŠÍÄÚ•%¯%mvÿû›áŠdËÞÒ¢SäœÎüf8‡?e†q•ë(Í53\˜hµ½àÑŒ½½žfˆ–cª—·/Þ¨4ÊYžÈ$º½­•1že"º]ÿ_Þܼ¾~uõßÅR¿d‹¥á<þùòúýåOÔw³Èe|ùöõ;øT¹J€Hh¤Kx|}ùóëW‹ßo¼x};ð3æYp…Ì|ºøõw­õ/8Syf¢GøàL乌¶Ú(f´R¡§ºxwñ¯aÁѨ›:§m2f¤N¢%4r#’yMqÆ H¾L•%ó|Дsš T¨©å}ñ&Q#J!X–àÌ‘ìš}w¨ !9Ë´‰Æ;ñˆfø’ãݤa™Lû©l;[ÓaÝ7{j|êí¾´-}4~4ð÷â™ ¡™\Hq°¹T,Çã$"0%x|uO+×MGvgWåoœK»þžzº¥ÆÚÞ}åéÊvÄ’kÁ!Y’?®$Ï™RŸ?Ó1Õé3¨Ü™¶‡[æ’¥¨âì–hf˱Æò”¥ XâdËÿ,RïËÎ+ek·Íþ+µû¶xðÝmWtp¬åÊ«©kèDôX$¡ Kt8¶¶[7ýÜÁ©Œ)“OlÁ~)»#… ÓÀ‰’DDpñG|WeN²yßå`Ó)K’ä Ð<kùf˜1]j¸×L •Õž˜#ÉžA/R§Q¢3p«–(0•±I<ÏÊTý9Ýò)Ü<Ï–2g8¸TU'BÁØ6à ¨ê(6P9{÷ÍÈôݶø²l›ÕÇ#À&›ãI4Þø8@ªþ&* <‘O¼¬ªæÑ»ßXÐKš¥¹ç±.¶d0‡ø¥˜Ît„ìÁÒCe¿›Bä$´Í”2fV ÛäÉ$ ¤He»ö$BB†ù†úsR¨œé”ÂÈ4ÞaÊ)ŒT`ÞÜðô[i¸bBä!8Í`¤`&‘^.:þÛý¿vxy5´eüö$jj%qéA“C*¡5å¸}4Õ9Э|3µó/“Ž13Ïž0Úí¦é«5µœÁo_×veÛ¶Ìò`½÷|Æàƒòh8È+®Â×¶ø€Zeç¦yÆE[SgKÍ5°c‡YÀ„yJ)Ø ÙVJlcïŠ¸Ææ±k"D9pdS¸¼0ÞÞ÷õÜÙUá|Éœ Ø;Jߨƒ„ªz?>`>ÎrÛ}YNY¦kÅÊâZø¥™ãªÜ–˜Õ ß8€Ra¿' ëµ%U_ËúFÛ¯Ün‰àòæŠQïÕBÄ5Q%~Ÿ½õãwlmç·Â8£ØÇ êIóÄ35­A‰*v¬šõñÐïïþqÕ×R›4±ž§q'71ή†ÕÛ•7Š]×ìýlŒ¨3ÜÑ¡€‡að6/ðüÀÕ€s ‡]î›zkëŽ(}ÀàÇÚáÇšº3±»íw;4JÍc?aØczð@[ãŽýöÄ1q?wÎ“ÈÆGüpé²ÞøºéÜ1@ÂPµ ¶ÐUŠŽúü¡ÃàªëQ$l:—[Ú–:Æ<à75ô7Þš‹ “·ýTe×U³NäŽÕ"Ÿ¸*.)Š:´,5&ª Šà`t–z‚óPØää)À)`ïqL›à’ÂD/¤äŒYÂòÝÖóÑl=GÁ„°=6!r½¥ä)¤¹Yz`>ξ\25À&Z]2®Î’MaWÿ­,kTž¨þæ4Kiˆß¹TçӬʥYÝLš•3¸”‡Ó^—{»êð>wu 3”ŠÆÛ'Yj†»I’e$Äxòö~ØH@Ds7q™ÌçC²2¥æØ=Øò=®QÓŽ²¸'[ew´ EÒn+ç:Ár»¥û|TeíºÁwÜœ‡ªÅ²€ñ]ïù¼³X´€q¿µ‹5®îÌ[h‰1\Ï #æ}O]„û÷s2{ƒhÌ$È÷§do¹ËOóÿÃ'ÂŒS¹›„œ,Ó*Ð\î&3Åà–.þâÜM*ò$5Aò6^úLö&Î2‘ŠIö6ºñæÉ({K}ö–"žùžÒS±|èëU˜–Æe·¡ÔqEJÍd>¨pÙÏ€¹Ð ªÄÔ÷ˆçÒAZ|µÙƒc&-å“E“\–Ô8˜s.ú ¤‡,ÔùöaÄ9º‚ìfÝØ¶þGGݶ†€¶²ôÑÚU?ÊA±Ëeð»mZ?ƒ2¬öŸ˜Óñ …£L ã‚Ïýf” ÊÓPˆ"Yƒ8!៘Q€‹Ñ<„?wš©È†^[SEnEIŒN¨2`žÔƒþô Eê ’øsYÙë'»[cбuUìHBÈR€‹TM-Bm",˜Åв:Ǿú<÷ÿ›#"f.`˜óq rÞð~®ð ˜1áNÿ]åŠÓxß9ª;dL¥ZFã}gêžj†½iÝA1¸ç›)ïCŠ6-wg,ÍS3ËáaM@`½=ÄËÇfÿÑ…AwaqªõhaîW¡}T‡FYCd¤p _ï_ÝPcW¸"Mlü$[¬6Ô*ÖkÚ¤¥: 4ƒ:°YW„ׯá¡1)—]R0–t( +»¨¡ìòXV-N…hPÆ}}ŠŽíÆó²¶äΗá뇛÷-¾ð ™©dg‚‰,鯲žáPVå&l²ÂÒwÖi¥¶^|wÚ8_†ŸMù° ì}vWYÂàr·ÜÈ)ûûÀøÝb_Rü{ ôô¾Qω1.8Bp•C‘´H¶…¸óƒÕx#£8]…@™¦=t·Â–“Ñ3GY–{ yš¤:>ùÚ"Àƒ!0|ãmLu.Õ$xž®SbiäÔ ÚY¾†´c¾f_Ð&Œ½³]_ºLAžH›%Kñ˜<| K GÉSfX|WÙŽü¾w{œü–x¿w¹kë²¼§;€!ÊTì n `ÔXû€»>-§\©¯¦§õ–³,ÂMj2{8/‡«Ÿpä_åŽkŸÃ­–P³W>¤©Ï~ô}zÕ†[„99 Šc…7)”F$ù!ëFeÌd2áýøÆeÇendstream endobj 2668 0 obj << /Type /Page /Contents 2669 0 R /Resources 2667 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2666 0 R >> endobj 2670 0 obj << /D [2668 0 R /XYZ 85.0394 794.5015 null] >> endobj 2667 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F53 1333 0 R /F41 1238 0 R /F60 1366 0 R /F61 1369 0 R >> /XObject << /Im2 1355 0 R /Im3 1524 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2673 0 obj << /Length 2389 /Filter /FlateDecode >> stream xÚµYÝsÛ¸÷_Á·R3ƒ æžœÆIu“8i¢\;sw´Ùl$R'’þøï»‹iR¢ä^ÓŽgL\ì7v€xÀà‰Š”&Ð&ŽÆ“`µ½`Á-|{Á=ͼ#š©Þ,/^¿“:0‘QBËõ€W±4åÁ2ÿ5|ñ8š ^_~¼z;› i¤ /?¾º~»ø'¼' ¨€„±ðãåõ·Ë4÷yfDxùþêëì÷åÏWË^Ÿ¡ÎœITæ‹_gAªÿ|Á"iÒ$x€qcD°½ˆ%±”ÝÌæâëÅß{†ƒ¯né”b‘FJ*€n‘d ÿOÄÊÔy"Ë‚9ç*’é9f´3?ì—Œ™ÍS%Æ$Á\%"J9—}.ŠL’ŒRª#¡Sè$È)ŠÒ5úØQš(Q1GB΢DЏ#ŧÙ\ñp ÿExu‘TE¢(£¢Ø$Eá“|Ây—Î àœÑc¬[N*ì*˜YèUËÊœµmºUÕœ æ`±Ž5¶xek03†ò±·uÕîWßt¸)¶ESÏ@ Ô‘”›ð[¹F?tòÚ2kìæ ²€…¯`J'à—¢¦Å[›•žks—5ÝÈNxH(Ø,UÞæy;áÜžLpOR횢*‰gU‚ Î:¡!ë8Óu´ 0K+rÜw §0áÃ-'²J`ÌMürÖÊTt¹]x–$ ÅÍ!Ò°*iö 飈DÄS"@Åpn®Ücz¿Â$ýü ddÌ|··’,7ÍQ;«®ÚrÞ5CªÓ¾é©œs~9rŽŽ´‚T9+²#š9rÖ\¡Æ"ÿKÿÜ´ÅÆ©Ö¯þ”MàîŒTg<ØQ9>ú)‡5›E:ìDs•­îì| âP;. C&°ƒÏª×SMè'Fýê«4j¬à‡*óʳ&£Ñz?ãPª·¤z"Ç)­t¬&U?§@œR•E‰UoU·ÚÇl}ð-·ë¬Ýø<¸/ì¢ó£ðu 4‘ 9Hÿ_€d­¢™?Q ý‚Sá¾PR¼Ž¥D ·þ1¡(¼tÐø‹ûíÀò¢‹ðý)Èk8{@Á÷™A]‚­çˆ†ãYžÌCÎg s ’Ôd^:T$Ýo|®z£Î ×-á p8Çó[ &ûO=„<4Zû/%4SK¼5^˜}³¸~K#CœÚý š»ÝT;(7?´\ª%: ·’?Ñ ê…ϽݺÎO\<%b |"¿í&‹’ž=ÖmÓî{&›Õ–°å©†=̨ÊÑÿC»¤=  ÚÍ í»jsG5;]¼¿¾üðu¢˜0D±°Q.Ѓp¹+Tmè‰&0v¦–ÉÓÝ–¢5üXßU­ë§NÞø•˜V4r… ž«ªlHÀ†ÖPu‚/ˆ€k»‡¶ô“×uØ$hªEÚÁå}™¯&,Ðý >z¢gÕŽ5Â,®›å'Û—„„@ùRn_=•Èß¾}>ktÄ ççÅvDbG]‰Aü5œûGrßUÎñ+ß |_rs°?»ŽuÔ5(&3‡§]%àH Ì ~HuÆU•wÕâz‰mÊ#˜X^}ùxÔÔá kRŸ×¤§šPeä¾ʶ‚Ý8Öå®õ­3¯ÊóN‚H۱@Øš œ„}i¶C§×}3îœ^Û2/ÊÛe=ù¯ Æc³ç­‡Ò«i-ܸðDm™Ûߥ¥T?¬Pb'Q(d¨â_?]¿[¼ÿöå¾\|º~¹n,»sö(ž`·2fâRfÄJÆ㪻®€â€ªÞ¶Tnðè&CœÙ¸C]L= 暪¢ÁªÚî6ö‘¾6~2·õj_ÜtkÊn„£?1^$0ìûHIÌ;ä²{V„„ÇxüÄúåo9ð@ÈÕøà¾È­ßNÅ SœùàçAÒHGPOæSEjCË|[”EÝ€;*Ö/víu/»ü1+Ûl3á\®RD‹jxX=ˆTBÐ_èƒD=.€#,‘=ü?⥠¨!N\·@ÊymÛmVŸâ‹wc=xÇówuä¼"ƒ}Nà̶Êý7dèŽêî­Ù½F0á.ó.kèƒ ^EAH®ÂÅš¾Øú@.S„7OS‰AÃ#À ™5ÅÈi¾¢ä‰¡8²Dèƒ[ˆvuÓ8ÌP“4 ÿUµ{Ø÷4éuÄŠhdXZ§]JéÄwÙ½¥™>ç CßuÝâ`å©û1¦ÌËÓ‚éÃN ‚\§5Ü NØÇݦX ÂH|w["M|x`‚ö™¿Vƒs«úàÒÐwíAÍ«›lx¢= gŽ×­ì¥„ŽÓ¸KèQ^LÔÊ9gÐ¥4t_3Sj¬‹¿pø¶g ²—®D®ÅéDgìˆPäkÛ¬^;£"(šëã~¨"Àæú¬ôžèHüA7ä‘K‡â—“GÊ£ò“”­'¡”(Eõ… ¨g¢Óî鈜{î³ýë}[’‹¼£vE~¨…`¸“ØœU£':ÒcŒ=Y_•)2í¨AžÍ‹ü¼Ÿzá¯[ú±>CøG´ç_ cÁ™Dœ°TŽ2BuJ¡¡\³ã³HHhîǺÿßè¼endstream endobj 2672 0 obj << /Type /Page /Contents 2673 0 R /Resources 2671 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2666 0 R >> endobj 2674 0 obj << /D [2672 0 R /XYZ 56.6929 794.5015 null] >> endobj 2675 0 obj << /D [2672 0 R /XYZ 56.6929 404.0791 null] >> endobj 2676 0 obj << /D [2672 0 R /XYZ 56.6929 253.9299 null] >> endobj 2677 0 obj << /D [2672 0 R /XYZ 56.6929 130.862 null] >> endobj 2671 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F60 1366 0 R /F61 1369 0 R /F41 1238 0 R /F21 954 0 R /F63 1385 0 R /F53 1333 0 R /F39 1178 0 R /F48 1258 0 R >> /XObject << /Im2 1355 0 R /Im3 1524 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2680 0 obj << /Length 1417 /Filter /FlateDecode >> stream xÚÅW[oÛ6~÷¯Ð£ T/¢.Nãv Z'‹]`@ÛÆ¢cu2•Ir3ï×ïð&K±Òۀ€EžëÇC`ø‘ å³, ’,Blö<ÀÚÛ q<¡g û\ëÉ/oXd(‹i¬·=Y)ÂiJ‚uþq:¿½],/¯~Ÿ…”ãéš…ãéûùòÃü¥ÝÎ2:¿]¬f!áỈpÍãérþ~q^ß|¸[ÎßÝÞ]-׳ÏëëÉbÝ)×7€`¦5ûsòñ3r°ãz‚ËR<Á#’e4ØO"Îó”r²šüÖ ì­š­cá,E<¥ÉˆG( Açtàž¡˜Qf\²Z,¬åów«mø1ëù!Q”Ñ̰߽y žÉðÌc–Ò{„QÅ)lÓܯFjq }qÑÿ+Žÿ€¸b:Ub/óp³“›?6•Ú~§ðGΗÿ®”|¾\«|óœV>Õ3’Ne“ CþnWÎ Ã(‹âF>~ ðÅÕòÒ+s1Ë÷…*š¶mU[ÒÜJ{ºÚHKz/ÔA”#î qŠh §X Ç2Hš°c !ÏâˆÅ¶’>¬½¹‘ù,_®T+k%[«ÉêØ´rߨÉëJ5U݇ýéܱ(¦NNÄP’ʼn5ÊB‹¡\m@¾T‡Z‰ò±.T«÷ë ,F§‘Ù°®qõÀµ”a«Þˆ,£Û'J;êuøíÈm°“BÙïî°*´¾¹¸/ó¶ª÷cžÅÞ£ÜâQUMÑ<Ç”€AuG)$oÂÙ0òÆ£ˆ‰怀a_„Á‡ˆŒ fÇõ‚ƒŒ)°ÜË#(•D¾ ½wF³É³²ér±z}wu»¾ºYv»^L©—TÄ9£(ÎHâ42\.íÚ‹ Ta+;rµµ_ñÍX˜ú¸ú¸‹ï‡ßTVz¥B’¢,M­9×^>‹2'¿±a…éI:‡¶Ú‹¶Øˆ²<Úõ;¬•¹%ÜG¼GR¸3ã¼±0z=í¤rgì„zUh/riÉme¿ù¤;Ñl¼QKô€YÂÆµ )¥ˆó,"žj98†å²šz»4’Â5eñt½“ÚA°Ù¨»©Ì7·4)6;;y^´E¥ìLã§þæ²”=êÖñö61=Ðøz~Œ¶’&&;ôâ}¡DíôÑ© ZÃ-Ëê©PvIg¥ÉoÖÀ ](´!ÚÝ”C´¥ÛãCñøX::ž¸KöÌç3llO‹0hdýUÖ–±húR›VÔ­*¶­çnãîÐæÕ““g® ønjÑì ŒeÓ‹£¥år+eûÊCµµÎveVLLrê‘«F tK§*„IW…Àiôšö­QÆ÷G».‘*7>“Aá7:È&­(HSݺ%Ì߉_ÔØÍI9êJÊøú$wfs3 Iœc+Ðl6?ظ3(MàÜAàO0dmFãðØÇ“ƒG†2œú‹⯑%6ÍàzfJ!±¥UüP|5”.6zâc£ÇpvÕÛDG1Ò ±#["/–—,Lë$, %})<Êy:}*Z·—xE®?–PÕ§¨sýÑ}YLºš* (7f¥Îp›\)¥g¨b8Eã #Ïe><Í ŠÌÝIB¹eíÝB…°&¤»”¼-½[ë‚NÔ¾N§ûi/šÖ¶„aÿúêyú{Éùá[-ŸIÀAã [=÷èçm/ÁJX¹´ü)í.MÂðtûÙÝnì»ÝÞ ø/{\/áYg{é¯k3Y®ì Ï{h‹²h/½rGúi:ÒrâÎ¥ÿù|zïG biJOÛAÿ©÷ ñJiÃIBž«Þ½•Ïuÿ$Ö)Æendstream endobj 2679 0 obj << /Type /Page /Contents 2680 0 R /Resources 2678 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2666 0 R >> endobj 2681 0 obj << /D [2679 0 R /XYZ 85.0394 794.5015 null] >> endobj 2682 0 obj << /D [2679 0 R /XYZ 85.0394 751.9132 null] >> endobj 2683 0 obj << /D [2679 0 R /XYZ 85.0394 674.8216 null] >> endobj 906 0 obj << /D [2679 0 R /XYZ 85.0394 634.4081 null] >> endobj 2684 0 obj << /D [2679 0 R /XYZ 85.0394 597.1931 null] >> endobj 2685 0 obj << /D [2679 0 R /XYZ 85.0394 564.5425 null] >> endobj 2686 0 obj << /D [2679 0 R /XYZ 85.0394 496.4842 null] >> endobj 2687 0 obj << /D [2679 0 R /XYZ 85.0394 434.3126 null] >> endobj 2688 0 obj << /D [2679 0 R /XYZ 85.0394 259.4673 null] >> endobj 2689 0 obj << /D [2679 0 R /XYZ 85.0394 194.3308 null] >> endobj 910 0 obj << /D [2679 0 R /XYZ 85.0394 153.9173 null] >> endobj 2690 0 obj << /D [2679 0 R /XYZ 85.0394 116.8171 null] >> endobj 2691 0 obj << /D [2679 0 R /XYZ 85.0394 84.0518 null] >> endobj 2678 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F39 1178 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2694 0 obj << /Length 3962 /Filter /FlateDecode >> stream xÚ¥]sÛ6òÝ¿Âo¥§C|$úæÆi›k“æbwzwi(‘¶8‘HU¤ìª½þ÷ÛÅ.øeÊñÌgL`,‹ý†Äyâ<6¡±Òž'V‡q$âóÕö,:¿ƒ±ïÏÏYøI‹á¬ooÎ^~§’sZ#ÍùÍíWFi*ÎoòÁ·¡0á ˆ‚w׿¼¿º¼Htpóúb!¥V&¸|ÿþõ»«7ÿ‚~Ád˜EÁÛËw¿\þD°÷V—ß¿¾¾øtó³×7YCÒE¤¦ßÏ>~ŠÎs8Á?΢PÙ4>€N kåùöLÇ*ŒµR²9»>ûg‡p0ê–βBD¡TFÎðBŠs!BÇrČ؆FIå˜q}¬ê]S6Ó£(&©Qç‰Ò¡FÏm-€Ñ2âNÐ&B k€Â‘¥ÅÜùYHUÕvyÖ ¼ÿ¸È?ùÖU׺£Æ鳨ÇÝ͸{Äó½üˆíw–2 …N%‹{~\o³Õ7Ÿ>Ç*Ûß4Åj_´´lD°ÖÄ‘Iy™ßáóÜ6LS?ß–›b£aª•àyŸpÆùBGq¨Ÿ/º+D"íÜ>*´"ÒŒ -·E}hŸ±sò0ƒRÅaj☧òÝi¬ NI§S¬ûç`ïË¢9‰ÕN±~ø"Ö}Våõ6/îçêÐD±œ"½gž+ÐÕ2ÏÉ^|ÄkC™øDÇZµ:´‘9WT˜–\½¾~õáÍû›7?¿ëÖôTD°.WÏFÂN3åðÂâP m˜^ÐÒ…’IphŠ[iÐÖiËmÙì å·\ÑÀÕ»k‚þÂú„Àý…Hƒâ÷CÑ´ fŒ9/~‹"Yú$(+þðÝ+H¡Ìx猺È&¥Øß{4©! 2Ÿa$Ç7kwa‚l³©¸M„5õÁ5VźªÝ7ç©nø.ݤ8ÈòÜQ ˜8X·­ïýÀ­ƒÔ[Þ˜>ÖïóP¶k”p×ÙfÕH;R¯È˶¬îxëu1XŠgŒÆƒ<Ü!NŠ‚Kò ,åwmoÛ°=¸ ¬²ŠuÕfeõhZCd~áàÔÀc÷SñØÔßã¸×®=~wî~Áë=Ôs=ìΙ†2fÁý p‚ãжÔÊünØ9Ty±§fÞ‹%.cC€û2›Q‘‚§ÆËÿÓŠ"uä-[Í{fô¹úáÕ{j±pR.{“S»ª™ú%Ž^ðàòH_àóa!ÁY¥±IÆ÷þÖÉ ±4þ"Ý>|§ ª\ñe£ÈQ«cO/ ¼võ’ŠÏ³³6‹Á’G6uÓÎ^Ö“ÚØÎ)Y*ùV¡Õß*t˜VVuÊcŽõ>¯|pG}|Å*‚˜%5úYWl¤õaÝ35ÎÀwÉ}g´ñ hÐ6‘}#Œ1ÔøÚPQY£$øÐ«˜–ý¡¥ :UK`Çrü®y|Åk¶YÓ¢„a{h z²z8D_”9 -Ñ` Ÿp¥ G» Þ¾»|ûššnž“%˜PߎȞŒ‘A"k{ýóå3”:éäd&èÁ¦òЏÈgîG  ï…kj¼ (ûì]üèî‚Ð/IŸuõJ¥=êbO¾ p—¼G^,w¼]ã}ÆÚz7À™›{`8CÚ}¶"›îÐÜÖûmÆ4Kø%¹œ¸fñZãõ˜¹'¬yÓÙ[Öõlh†·Y^LÔ›î±C²Û”Þð­¥S&„ôžl´’¼°s7/üÜK&ñ¶¸š»djÝÅzþ’éD'.YB*ô,ýC ¥GÍL¨÷mçæJÜÌÛWwßwîþ°;º?¶‹sTGO‹1_-M }`hÂ(N“grQEÖ ëâ§y.2=å¢ÑÞ!@˹iÃÉÚâÎY:¶Ü¶dŒâ¬|ÿ,H$º§Åëòní×6…“Ih‘¼@cS{B‡5—mŠûbƒ6+–Á›É/°›vK‰=ÀVkìX/J–Þ¼l²å¦8am.l„{“­X÷,˜Úò®ÊÚ;*‚¹°ÎÌ׃`h9ßìkº"ã`Ù†b£‰±ãbbDAnš(…·Ùô¸'n®ß|?gYgœi”NÌ,ÁÚãŽGÁ­öå²àgÁ"dƒ—©Ž äœ)®]óR â·(Ž"ø'Noõôi9;oàŒÏxÌ*1Ó:Rt|}½pÌ€ž¦¼ ÃuL;Â0a€2`ÂÁ$[øÅ1“Nfg»ëxFŸfÍ3§aLÈ]¿¥qNÜLŽä ]W.(ùNPò¹ª³7 Óllx£O[(D «-n­¼VÞü>öüiðê°'â«èB¨GZ÷‹‰p·ø°C»W0ú¢ZíÞD@?ÛÜÕ{0[êÞÖmcDÁ… ~x{ùjÁI“>:êÛ«ØQ‘ër…v\&-N‡© v]"¢YP°!Dnx8ü\¹¤€uKæš™ŒoL=BÎgHÝ^Ù<àêÔÞð¡ÜlhfUùœœºà,µÀµæÐí˜::ÒHSl §#b#ÛÁN#ìö%9t„˜Ý†¾…£#M;H‡é3íƒ<-*^Õ&²¶H_æžzž‘¨hH ¿«÷s–¦¬š6F¿À´2!)[4«xš6Å+tÜg:„…m.£¡þ« L[2ÁCsÖsÊÔ„Fw±ÚË¢]½DqÏCHingtÅJˆíºšLS3nÒÙ(ö&M“ÒIÀsb±stn¶Ã9ldMS¯è–°ësG¡ß!Ž ö³d–kô·Œ]rÂ#ÄoÞóÌÛ÷_ÇãÃF|ººË‘¾¿^Ä÷ä®–‰EѤ¢çk4CÆDÏXúZÐËÁâVC><ƒÎöÐRñ{Æi¬6àœî‹Ù|îW z¸,5#ÄšV<):T¦KÀ»ä¸+šI§}/F_Ž3Æñdc\^TN ÷qî1 †é’s÷(8CåèiïÓÜ£T¨D÷oƒGE®2pŽÊ„6IõàÝgÀRÐ^…¯Å°dœ¹KK­Ä—¡1pÖ2±.ðyL1¸ {U>ŽhSi§Ñˆ4ر…ðyÍ»/³¦0š6†ä¥vJ„C…ÃÁ^á#IüÒ0½tuBˆdÌO’/‘Iú÷/D‰ì(ÎËfi{vÇyÄBÅI˜¤jòàº,|Ù=õ5ÙTŽO’Š‘éÀq· ÂÒ,ɹ‚3ø·³¥$Æ6eÅ›Lj<ˆ­â›"Û¨-þ@¦i ¹¨ ãÛìH£KFu_6¥ËËl ÊN©>´»C;W^Ü5ú ý†/MþqŠŸ"€ãØÒ˜/ –î)kê3»½Á€"°¯Øy6kH°æ Œó³ÎSJuÚû?é6 ÚJÒqóÅ\ô§Â8±òYÁŸìßÀ}¤×ôTºÆHlä83Áñ߇˘—5VÄ&Lµ–s¿0“7zøwöG@äw$ÌL&‰4œøyî~‘‡šé#ǶðU¿ò5#Æ ³ÍÚæŒÅ¤“ #ú§Ohwba„àä$ªÅÜ- ï4¦ ¿ŸŠ…Ç¿CXPAxîRãÐ(#z¦Í ˆ eԕ»úWi¹\b¼ÎªKâwèoŒ+JÖX—fžÉX„25“€ŸÒ°®º<ÎQœ„Bybò¼Âµº…f(74)ϯìö„Ü]ˆ vYɪÛ —ƒ…‹Ú<€#¿Úƒu\IvœŽÙc[-L¨Rí‰ÿñ/Dùwøµkûõ_ô[¿}•]¸*»[¨ù ’ø_3¬ÅÍVâSÙUûOl½Û—÷ó:-°!“/±’çïÞ&Ø[JÚ0¼{ÏÝ%FÖv Ë+°€Cž¸Nˆâîé M¾{Öšu‹ *O=X*Àw§rª°®.€µ.W¦ü” _®± ~d…o³+Våí±^Ø´6`}©aÁ¤H/Á®ë¸Ú¼èƒ]lƒ]¬U@ïMÅh×åì‹ç b/Cõô.xˆîÍ5Žº§ JÕÝ£}}ðÜ# zÉ|ù™™úí“W’!ÁFW`•  +ù›ÑgSƒ¡X€v¶Ôç’1´8ù†×°y*x`&¥÷‹Í¼{Œ’äQ~-mê£ ¡ü{’ðŽJt¥¢yX)s³êÁ)Ü!È"š(Œ¤JÇ÷‡EGœ Ž3}CNA¡»¨Õ0µFaÜ?5£œJ÷8ëËwêŽ`§G\‰ˆÕ¬óp 0}_æyQ¡ü;‚WuU«.½âÃ[Ï*«‰ £-7 ×¢AÉrÕÛrY}¸"a¹º‡ÛúP±ý)«?_úJî}¶¹?TTfz y}ƒ¥Å^1ÆŸ­%ò„E4¤HÖt^Ï;6±m„<Ìc2oXiŽu¬ç6s¯µø;Ûýè ¼å—ÀêH æ²²ý3Ì¿ù‚Ö:ã÷Ŧ˜ „N!'òbC*½ØÕ›ru> endobj 2695 0 obj << /D [2693 0 R /XYZ 56.6929 794.5015 null] >> endobj 2696 0 obj << /D [2693 0 R /XYZ 56.6929 749.2922 null] >> endobj 2697 0 obj << /D [2693 0 R /XYZ 56.6929 666.7399 null] >> endobj 2692 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F53 1333 0 R /F22 977 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2700 0 obj << /Length 3285 /Filter /FlateDecode >> stream xÚ¥ZÝsÛ6÷_á·“gj–ø$qoîÅí¤sqs±3½¹¶”HE¼ˆ¤*RIœ¿þØJ”âÎ.–Àb?~»X™]§ðÇ®s•¤ÂÈëÌÈD¥L]¯š«ôúÌýtňçÖ3ÝÆ\?<]}ÿ£È®Mb4××Oëh­°>#µÀõˆÜuHÝ"ùC ãó÷4åƒ=Òõ­Iæ<‹±Ä(ÅÝaêÖz‚Yð)Þ#™‘à?oêÕ™WE_!ñéôÙçz»ÅѲB&ÐV &R±xÚrel.t’1““vo?̀Ʉ‹`€n7Ô‰ÓÁ§¶Õ,ÑFˆÙVÙv¢p°U×¶ÕÊî› 6…Ò‰ÉólªÎ§MÝc¤5Å3œ"à¹C•®«}±Üíó¦jqTs18í°[ã3xŒ< (ãve…’¥ ‘ ²ÇsÍ)8˜ÎŒ×ùn^çR*o–¾ò;¢Ï€"‹N×íiÔš¥s`ËÛÑzúfÝÑ̨Ï~ÊJŠ €€À’u#–º à¸B‰f"{¡6Ržs¯a^"ÕìØ…öš>šaÐ_êæÐµnˆ\ÐÁ¢BÅVžkÏÆÑ²²j£˜‡÷šXÝ‘…ZKP>E™&õ©'ðê…HÓ !¤ðîËÈÊ`—²'Eÿ§r»’aP°È¡mdOmWÖýèÛÁO¬ºÃðW¼3O2HOÞ‡y{¤i*í‘*o]•ÇiEÚöÏøZ·8W±…ór£Hsi¬9ËÔãSøå½Š¸Ñ‹×k¤~%U}¯LŽ;ûp]BG /i~Õ5»ØŽlÂí¹ó)¤¬qåf^«äüã66„Úò4=œ .– ûºêÿpð †dšý¼i”Jõ±itêM£CG"щ¨½ˆ@˜ˆx+$#ÁÔh"M±DA\Î*ð[E‹E×nŸi§–¶¡vó¡“d.˜ZV!hr.øÔ@3Ы¾½y@ÞwÈ¡DÌ‘%F@Ùƒ,{0g×”Õ\^TY˜6ǪV|ÑïªUm“¿«U€P½;¸s®*|G·à´K å† þ uäpÀ¹ƒÌ5ÔíZ蹪Çeçwi»˜íºOuIª36…çzªºbF?YÂ¥wžïáØß£h3§×Pú²<`²õ"žY Ö Uë —<åS½ª¬ ïwŽêý>™(ÞR€iT Òkz~¬ž—Ö[%rBuÄ;¹£ ™4ˆyÉœ·Â˜$“Æ-Mm)2ŸhBÙ(r(>V›b_¬YÂë§œžàiÜ m(ê+üÁq„u0Ï%íI (u ÎPЋ…¤ ºc$Ê8„¹Y<‚ýs±“shî‹52C9WÕ™$W™Ou[Ö+ˆó·6aû‘!a®nwšì7ÝaKä%IIÕ,f ŸÆì#©ì /#ãÈ3nƒÖŽ (¨Þm#pï“PÖƵUŸ€c‘»Ï^?¼}ÿ„ßüøË»7wöz÷4SÃg°mš«üõ0ç*€ÃÄ¢´'eyÐ CZ:ůL%Êx_׊ÖMgdŒqüÂ’ýÎ7ÚÄïꪛtq_¸úØk×4˜é, çÚm늨Î(ö_ ö3CØÔmÝ6„&9;Š:ëÆ‚ó°»âjñØÙx³TڽǷp%œaë¨e1Õ6?Ñw»Ã~×õ.ŸÙû[zѲïqh5¾¨j;ƒcŸ­P,Xø‚ŠèIlñ QÁ˜¿yøüV÷µ[*¼Õ¦Z}ì‘Ë*Ë>]غI@Q?½>šþ Š„SHëq›ª¯p:^Ò}X©¬©ÖÇ5ŠXP¡Ìün§ýøù b`• È5'Э%QWX/;·ÖßS•¾{ëÁ€!ɫտÔxŸ‚ï;¢Õôi±ì1“À\T‰Á •0Â+B¨Ô+ÂRã3Û÷æÐÓ2KâhªöZãÄ€õ±aÿ:”ÿFŒ5‹G5‹!¹áé°žýaµªfIaïݧÄBå Œ–“Õþ ÷2A†D3þ°v@WOâ].žœw4;icæ„ë¢ÞÎÖ ÷póƒ°ÙxiY6=µ„å{´¡v® Ï¯Õ UuMìñÙ„ë”ýxNjZÉá‹åùZ®£'ëø–lJn‘í¶ûÜϹra ”:ÔÜ›ÜAÁã O0¹MX%2ŒgçÇgGKÛ ª¸¬µ‘P¯‘b,ã“\-Çýà$†,ëJa¯ CÃ~ÒíçìÚÔ}5EžÇÑoè30ð0`x‡”å¶h?âÐ盜ÐÚl4;×£eN³ç<Rëлhçj[–ÉÐT"@'„€¥W5úbi‹Õê©Mã¸|p‰*×$3ÊLÕà¯ÇËÐÑhéÞVPÓs ^=Ö+zyx¼Øš^¾ÃÍp¾uræ†GÍŸJ±EÓ¾Ù¨°zM7ɦ*¨R´ ™¢ã¬;çò?é"§Iª †ü•@ÎçàÄtsaÓ—Í4}Zšš§áð£2~³-ª?ŽEbF%™€+ÝE™׌P—JÓ$cRM¥z¬°P€ª°°k¥7´} ñZ¾Å'l¹Úá f^PªtÍwÞÓŒC§$“!‚.f.‘pçÈB£ÏÆb¦¿ÚÎ$ÞyáìP8fSèj­PpññwãNÑ &p¬Éì3º –smx&óDÚæþ·{µ*<õ’bþB!NÃèàœ}HFT 𢂰‘àXꙑ°@zçÌ6Ï9ÓÀöØ%}×ÍèÅ›‡»7÷xCpHën@we‹Qþòûõßz¤>þr‡Ä)öâ¤OÔz*„̰~öKÑžþ\–B蔡7Mfæ¹];w2µ…L«rÑîÅ€ï˨ñ¤l]yºÉ‘2ñ÷Ô€å6¤Èè›jDœhïrNá¥:i™«ÅWw)åpØn\R·C9·GAËçpoÒ2?rÿ¨³æ;ÏQvýîR«<Àú|ÏÜ7ꔘ.WÏ3ˆÊ¥€A*/#jÌuQ—=è¶[…¶bYî±rM3Ðãùey׌@“Fb¦“ÜH6•ˆÐ”g)¢)ÏXdý,Ê–;¶¾¥Š$óÍ  á!gP”‹DéðÀWÀ 0±$—‚*`ù_ñÇ9¯ û8’ÃÊ[ßUWÇ¿Ì2‰@ÊÄ74ç‰dæE0ʲlŠ¢° ¡(Š2éf‡E‹óVXö~¢Äº´åYmàšÛ"uùŒ4º;JjÎák(£§ávŽÆúÍ —:áÜMœã)Ë ŸØ¯²#L©Âýzˆ£Ó´»Â²æÆÊÕ­í+|·"Ú\ Kj»qŠ(çv\ûšÑâLÃïIƶkèO»Â«¯?´¡–< ,SI¾y&b®ó0¸|&ÄííÈ#ù”J4“ò² kFˆ 4輊–‰“F©yîÖZ¾m_ÆêÕ2wñý\¹¾~<ã³ °¸ãÎà…`P „_GbU‡`–ä<Í"ÀP”„´KB3k›>0ÑÒó¡d`ë1„°œ’¹™†–K/p_ý¸(0®³ý nD¨<ÉGaƒbav¾”, ]錿_™IáåäX–§Ãg€w/ lAç{}ñR„P´ŽËª4y=eÞÝ'ÿá›ø³áÃÁë@½—£gdº<Ääk[ø¬ê†ç¢GeR\!0Êp;Jé‰.tÖÏ—ê'ý4üšŠ”YWeB$Æø(Àãú‰MzY®&ÅäË‹¨Hiu?+ÜÄá”´ü뇹*Éð>ÏX=‡ÈƒìuÙêÓy«{&×¶þžê~P>±8(QÊL^Ü>0î?9¨€‡Ûh,Àhq·´ƒÉOßô¯ )! <·®‘m×À»E¸°Æ׈ßÿÎ I9úá¤:ù•g u9@7¡’9ƒu ¬ÇÙgìOê۪؟9•[&QEϽ=’sÿõ&TbÿUmÆip¢ÿû?âÆÿüƒä òœÏÛJ“NÀ¼PVv–‰cÑÃÿÎÊþ?Qje¤endstream endobj 2699 0 obj << /Type /Page /Contents 2700 0 R /Resources 2698 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2666 0 R >> endobj 2701 0 obj << /D [2699 0 R /XYZ 85.0394 794.5015 null] >> endobj 2702 0 obj << /D [2699 0 R /XYZ 85.0394 507.1706 null] >> endobj 2698 0 obj << /Font << /F37 1042 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2705 0 obj << /Length 2952 /Filter /FlateDecode >> stream xÚÍZ[oÛ¸~ϯðÛq€šË;¥Ç,Ú-ºèÝ&Å.̓b+‰P[r%9iί?ÛLI”œm÷àˆ(jLçòÍ I²ÀðGB"™Òt¡RŽ&b±ÞáÅ=|{{FÍÊ­BªŸ¯Î~ú…©EŠRIåâê.+A8IÈâjs½ü‰Îa¼üpùùãë‹sÅ—WoÎW”r&—?¾ùðúÝŸð.0%ÆËß.>|¾xoû>ž§tyñöÍåùÍÕ¯go®:¶BÖ fš§¯g×7x±üz†K±x‚ŒHšÒÅîŒ †gÌ÷lÏ.Ï~ï ¾šŸÆDÁE‚år±b%0\`)B€H‰IFY'0JbóTZ`_òg»ð2Ûå¶Õäë:o‡ë'4…U`¹'±ÒQEx¡/ÖC0s¹Ï×Å_Ó¼V¼l²Ö¶²íÖ6ûMÖúïY}N’eîˆ+û¼uïW—ïÞ®šâ¾Ì7î§MQÞûs½ÀŸ~,àŠ h¢RX‹““ ü^Ž‚®D)&îwû¬¨µÝ!M JÄ)(˜ÌŠ” A ѕ砧#â“*92› †KæhÖÕn—•«ºê1¯ëbcįYé”Ûi¹é$ìQÚ§ˆiôÆÛ¥ë~,2Ë Ù¥ &ž—U”]Ž8ر#©êÈ0 —D îGùʼnΒ ‘w:PD!.`¨y? ¨füÄSé[Λ($•dóóz¢È¼áSФPª?ïçÆ)àíååJ[´SWåô æ=P u `#à…3ÿÌ¿ŠÇl›—í`(mwÏÚE"ŠN¨HJ¯¢ûÓŠž0,mR“ê“ *ÊX2¯¾jZ}•áf»™Ð Á vŠéüÜUdò>€®uÈêÍn•ȹË?Î…Xå¦zjìŠ1¶ŸÀ…›ÂHº«;Ûh_SÙ^§ýpà@û8ñÚû}í‡Cií¯,`Q‰0lîáÕ¤e$ÌÎ0ªÿ’ap°é èf ÃSinê<Ûî,×¶=´"¡ŒöX8ù)J“$‰ÇýU7â ~ I!´Ï¯H7#¹DŒ’'ŠÌÚSH“ÅûÓþñƒÚã>ˆ2¥ý ©„R”`â±=*b†98 ÿœˆ»Ç‹íqÇÀ]E 9ØHÆ3¦àÑü¸’ ¸¶K‡4¥´"1F­»6ù]vضöÅf)ÆÐ4QQÆb p óû¥¾.€µ#ÅÕ÷ÇuUÞŘd(Õé©“&¼»s9žƒú€Ÿ02Œ’ƒÎE›ìÑ÷Müv½Í]2¶™vbÑŒá„T3Nì©ô2¯÷u^ç_oÜ*¿mª]V8˜±í•×iÈíSªM}ޱŽ*ÂYOò„"ŠAM=Ö>iÀµ‚IAjìrZÝÒêÐO÷¹:˜Æ:{וynlŸúi;3ØóÞ‘çß ˆo¶ýT´nŠÎ”û‰®T-ÂÛ@Fƒ…I”`üTê%”Î_’©WH5­ÝŽj¬Ýç—kƒjmž±Ž*ÂY_»I‰UŸµ íŽUŽ¢‚½LÞBpéåêõ/,ðCæ^º§³&pÀÆ5«2¹e½rA_@ÖÉè êWwƒJB°A¦Í€aÄhÌ›A@5cž*æäuÝäíØ l(_o³¦¹9²<2@Û”5ÏnGá·g£”2ÒgøŸuýÐ< |Ö¹#ÞÎ yWÔ'`^ÑÈáÍîUdœ×Õ=–ÃH¤eQÄ„m; ®)#éAŠ˜Pü»pȇ¶È¨&÷è6ÏŸ§ò¬Ú-$ЯìÛ»ö©=¯(Û¼.óV›?øÁø‡ÝLàãI‚ %Qó>RMûDGƒÆö –B*?ËnGáwèL ÒgØ$ŒJg㡇0ªœ‡èïYH:ȱ÷è ú§Ú)ô7›‚Aã”S0Ä!T¿Ä)ؼSHDôÝÿÄ'ÈI¹ßxÚ§}ƒs.¢R*þ<ŠBÕ‰ú.¤šñOõãbé²6ChÄ:¤„Óµ»ÌñÞQE˜ï ,úÌ_Ew)µ}$´³à.f¸ "¼‚T:gW²÷õƒn‘¥•t™8{ëYs6…Ýk HZ»§=wU½sÉ7›â¼ïÍCVÛbQ ãÏ’›b¿*#«J”.r亣D'§ÂXrÜæC@›pFcŠ•z™3jÅ?l·7­W˾-ÌF´‚ÞtѽF€¦'³FºaÀ ú?}jÀ‹¥à9;aS>HÔ¬&ÓÔª žðKÛp ­ü[¶n·Ïzk/wYk¬úm™éA žØÝsx3ÙwøÃ›ŒS· |c|üt_<æ1}30t@Bõ£ º€'[á„L(|Å¡" ªËqÈ÷d&³ ç¥Qª”œt^…GvD²|ª5ö–ö¥pO+kh4-¬)óAÑ|Ê¿¹;Šóï&/Û¬µ»Œ@eÔ4ŽºÇ^uÿåÌQoSA}{üäŽÞô¿‹IØgRŸÝ 1û!Õ4ìwTöí>¨ÃòM¾½Îo#ÜoÛíM$\cÀµ 7£½7e?fð³ké¨"‹éE\¢&`t½Õ¼Î·y니®öIíз¢©†€üáÅuéx@ŸP襜öÝ%šr$`ùNù»D”tsLæGD¦ê¤ ™ˆÅ|x«‹Í_ m©Q4ˆh1ŽE]€‘±t)£Ë§ÂNÂçÛÙ®zt;ñÜ ùäs$ûÖÖb•`Yß „ò'—TM$t)æÉ‹2:1ÈèÊÊ¥DÍa¿ßÁáQ ÂRŒ(Æ~ ð˜ø¡¦}ñkÆïËÊm¾òû ›~¢èÔ!̉oõä— ‘²;,ØrÝÛ¢}>'ãÓàB xv \ªpñTcpÉ6› \Ñ¢ùÎÄ2M™_@GYÁ0±L%ØUo c¼)Ñ™‡~”ù“mDì>%£‚K÷Ù]FÝrÁžœ*¹0„ažðYËLY·W1Wq‘>漬ˆ™+¹Ø HémLšäÈH)y¢Ø©¦Í®£²étõ4:&ë3‰ÙI=QdÒp}‰D˜‚ä{“¾.šý6{6¿«­uc}¨­I˜sDèØåM“ÝçÚ­¦'Zð ¦ðÕÞÞ€†-"‚& é°Ç+J)tGQ®óã¨6*iô¡}(Ýf¾8†ìgº¥+Š4=qRͨÏSÙ Ýš^8©‚ð«oÁÌNê‰"“öÔÇDrÚŸô&m†ç­=ÝA‡ÓÝß¾1ëPfu¬qÐ>n·Yùåx{dRÎ$Mµ_ž¸ÑRM˹£²Þ<åõÈQ€²òùi=QdÚÞE Ž —0p”PØŽ(* ¨‰'âTH5# Oep,¿=Œo¬ÄOçgõD‘Yi?àBÒþ¬Wçp겿ÈðrÆâ5R’iQƒuK÷Ó÷`0N€·9—q¹Xs4³&ßëjë‡?IîBØf3H1z4A*‚º{X\Ü S×ç~†±7^üöñ½½8ÖG'ˆCâÞmÙ„b{·ßÚ‹j–ÉŒý``Üt:<ûsªAŸß–…¿ÈÔ\ß ì.‹­«Ãvc§°7à¨>’w=ön…ì³ÉëÖöYÁ@ccÊ K«üX$íÒ`SIÏà±—$ êA:¨8ÐÚnB ³e '‘ËU[XþÆŸ>DèãòýÁESñB—ßÁ~\ûâÂNcß27NA²è#‘‡'øà.·A«©†“g–úÞ.ñ°7KÃý„ß¹û+MÄÊš3³.¿õÉŸ¾[X¬Ã;[áû×CÞ à¶Ã”D²¼_Û¬}o—.bGS7Z™6ßèuNÜyÄßv=Þêå ±d ZAö~,=SZÎDñ1tB ÂyƼÿ)À·–endstream endobj 2704 0 obj << /Type /Page /Contents 2705 0 R /Resources 2703 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2706 0 obj << /D [2704 0 R /XYZ 56.6929 794.5015 null] >> endobj 2707 0 obj << /D [2704 0 R /XYZ 56.6929 107.2827 null] >> endobj 2703 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F53 1333 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2711 0 obj << /Length 1792 /Filter /FlateDecode >> stream xÚíX_oÛ6÷§0°R%êe@š?]Ö&ËjØÐöA‘èX¨,¹¦œ4ß~G¥H²âvkæ‘<w?ÞÅÆ~l,¡<òÇaäA™'ëßÁÜ›s<³šiÖæz½_ðp‘(ð‚ñbÙ’% •’éÇÉÉÍÍùõÙå_Ó™'èä5™Î¥“«“ë'ïpìfy““7çsèú2ò‰…†/ “÷×g§ÓÏ‹ßGç‹F¶ÊŒr£Ë×ÑÇÏtœ‚æ¿(á‘ãèP¢È¯G¾àDøœ×#ùh>ú³ØšµK‡L ¸$Bzဠ|6d?$A¢ ~™Î8t¡w›4®”9H1F"!<Ëò+²8K§*W5]æéªÔQßâõ&W$)×8qÒÆž§©SB= K’Oi-Ô6,ô #ì€ÆZ©™>¾ð¼–€™3Â¥éӧ܈6ÍvÊäD%¥mSm½Éºvvð´f"ÆuØAû¤€?°CêxŠÖN^o'œj64†™xȪÕС/o³`N¬5´leû™n­ŠœÑÉb¥p¶Ígv úJš±U\‹p;`“ÆH,îþ|¢‚:ç™®9Eªa”tL =Ç„fM›­Úª¯Žý[Z®ã¬p½,ùRÄkÕ1ãaü –C2ú¸<½>¹:w°+×jÏu?‹RtPÀY­Cðÿë.ÓYegÄÄØ6«²²@Æ;Ui¤ªz­9òjµ½8]b›¬Tò¥^WÈkk`›‰¸Ý)ÜB·rg‰Äm±w k¹trÌ¥³;=nƒŽ½žƒÖ7 åþäÒQGGXát<‚„i<< ×¾5tm=¥+XÆY®­XáÄJX‰7EÖv*-U=Vº¥ê[¦+·YŒ !ðŠ§’p+×jlë»èS®®G`ßœ_€zX)ãgÉÜeÁ=±F7)›-“¸@Ý ]Ÿ(åYRK5±Åí¤P|^w3]Å€­ânÈSÛ)Ø67ÜA01÷δï/N‘€,è#åt*ÆÆY¨õN»)Ô kUÇ®]k1Dinɽè8H¡6K×¶…êžTl¬ñÒ&já}³;àñNnà ¼É­2Î0‚ÌÄò Žå0zv=ŸŸŸ"9Nk!Cx‚ ¤ÌE4mœçåаjéîô*¾WNÆûù団f·ç;…ÓàÚl;€ÃÞÝ$&"»ÄÆÍmò¡.1¥ŒYvqùJ¡~ÍC PQùœˆr¸LsL³6–(r Di¸Ì®ÇªJŽ·_ò{¸üŲ¯á¤áa ®}:q—AàuUØé:Ú`i’hªŠ*[º„—ªe¼Ë+—B]´ u”}Æ`<Šˆ/aóƒks=o°†Ëì>ÞowűÑ$=ÖP @V _Ôc_¼ë‹ 8¬Kõ¯LÇtž/ˆÏè«Æ<$šPÜ3×0Œ”QÐ.øScwgîÛ¼Lâ|V¹ã\—©zÖ¾ÔúQ|Ǿ-®ö­¹Ì‰ÞâUa~‹Q( mü+nÚ’|Iƃ…Ⱦ“ÈÜ5dº{NŠïÈ+&Bòj@ψô9ûQu¶0°FéÉáî€ßS¨–31?dÁaw4\ûþèAŒ½¨ëÛX«Yà#$T‘”6WÙž-8 ýíêätvu&zHK0bÌ6·õ.4T«3`¼S…-c›ªuk ÈÂï@í‰éÒÓÿ@;´Í6»wo‚Øx'KôGôç.ÔA ‡z4HcQi¦gfÚ'¤™žEš!:H3·nâÒúéØ&1îqÙMËóósíÉ»ù¸ŽGݧ„ÆñXšErâ1 <<À¥!~ÎÒGòR„Ž¡Ç) _PœÇ¨ÿ’â¤/þ»¸ /Ζµ/¨©_P\ÄÙˆƒ&³"m`w„ŸRåÌÔZmHÚýáÒxP 1*»µð¿@q¯¨|ýáÍ|øý‹ e­÷oäÕåBÄ\¾v¢ú{Jº+Ò¸¨r7©«Ò#“­$ ­¦lòP"­Õ&Þâãzð"ò à‡¥æAB÷ 3‹5 ± ÒæYØ7/ŒÛlÍ7 ;ºÓ˜ŽÌ®«Áïgó…«o²Ûm¼í—AY]A%ÛÇMUÞmãÍ*K\‚Û(Pê;}ä¾É.•­ëÏ1É*.îz…ÔrWížÍõgž\A|Ó-¯ù„ûAã5A¼€ ôa!Ä/Jai‘&õ¡ TJá>Y\7¹gïÔ֡aJ0«ñc‘ç…ÏTÐxŒ²¨¬šeîªÃ*˳êñ¹°ÜT£|(ÐŽ?ýöé´BV‘ϔƜ‚%yÄj¥ÌÉY(úª7Ÿr÷uÿrž›endstream endobj 2710 0 obj << /Type /Page /Contents 2711 0 R /Resources 2709 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2712 0 obj << /D [2710 0 R /XYZ 85.0394 794.5015 null] >> endobj 2713 0 obj << /D [2710 0 R /XYZ 85.0394 462.0323 null] >> endobj 2714 0 obj << /D [2710 0 R /XYZ 85.0394 288.682 null] >> endobj 2715 0 obj << /D [2710 0 R /XYZ 85.0394 209.4795 null] >> endobj 914 0 obj << /D [2710 0 R /XYZ 85.0394 155.6441 null] >> endobj 1341 0 obj << /D [2710 0 R /XYZ 85.0394 121.3428 null] >> endobj 2716 0 obj << /D [2710 0 R /XYZ 85.0394 84.4903 null] >> endobj 2709 0 obj << /Font << /F37 1042 0 R /F41 1238 0 R /F22 977 0 R /F21 954 0 R /F48 1258 0 R /F14 980 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2719 0 obj << /Length 3156 /Filter /FlateDecode >> stream xÚ­ZKsÛF¾ëWðªÊÏ{0{Sl'«ÔZöFJj«²9@$(¢L JÑþú힀AÊ)§xÀ`Ðèiôôãëi²…›)M´åvf¬$Š25[î.èìžýxÁÍ"-†Tßß]¼ýA˜™%Vs=»[xe„f›Ý­~›O˜!—À‚ξyÿîrÁefåüêóç7ï¯ÿ÷ŠPP:ÿxuóËÕ¿üÜçKËçW?~¸½üýî§‹w8C‘(Ë¿ýNg+ü§ J„ÍÔìn(aÖòÙîB*A”"Îl/n/þÝ1q"”Ðé§/ëÝ.¯yêz &3"Ñ‘`æà§Ú½øþÃí»Ÿ¯?ß]ºéÞê¡3ˆHÄJ&{ŸðT|¸ œ(àÞl»¿dÙ¼Þ6¬¨š·›ÂêÇbŸ·e]…Ûµ¿æþRå»@ ÉÈ9„>ñº À¡)VÅ€ó±Ô\ZØ ¨ši™YÈF#8´å¶l_"Ó<,÷œ‡uý=•«bågÊø Û0ñýõÍ{\4f)QŠòÔ‚‡b[äMÑÀWI‘ͯ×Â+J2É£ð§4.ˆÈ¢ÂKÒ é©þâäƒÜð\¶?]Õ~&Ú†›Ü–Uá§ëGÜÀ¢Þûkî¤}8슪mÞ\.ö­áq_Âd ó—fƒîéž6XeÿØ­½FŒ„ô@uTˆÏ}Þ* —Á¦¢{;ÉUgÿóà#ÏŸòr›ßoÃm/ÿˆºÜ‡¹á·i#‡,lÏΪ¾1Ñùnw¨ÊeÞ¢) £‚Âqä$FƒÆ©`Ðn\w£Ü_îÞ}öôà9U±lËK6¯+к¤Þ¬Veõà){ոװRÕ:!VÁô‚‰¢£)Èùª|(Û|‹7 SùPåíÁÛ¥3I)æ×•§ôÚªåaï)ªÖ?é›h0*ìðØÿ ðLËWmXR:ŒZÃxH¢•£2Wl%ÖvqÐÙªŽâKÐãöņVfåa< Ž«‰DÄ‘8n¾}¨÷ Â°ÖÂy^ÿùñêÝâã{…+Z6Þ”ËrhŠ@“ûK³ñ6ˆk»ûbéï[ñ¯EY•#•.Dâ„·)D©+Ø1-íün%)—«a>äîöúÇEÓ¾l«l¬7·Æ ´‰ f}ØÀ/ö‡¢iø¤£F¯MgôÆ¿k†ï7`?Ê_xµÝ& DgY8óCww,“€°Üä “­¿Ùš@yà ØyŒ-÷/!&øËDîç€L•¶f¦ ÄX°«oMýÃÅ€£‡Æ‰7hH¢ 8Gªø½œUý\…¯®G_?̕DŽ© !šþº‡_b#Hõ›•ûHìc½Â4Rý—Rþpè29<ÃyPÌWE[ìw>ÏÀô¦~öóþ¹cÔæË6LnYJt想!®#Ó%˜·?û<;õ~>#uã˜pÓÝ  †Ùë° h—艦¨é“LÇÅW¨7¤lúù¢dHk¥ã¢¤£Âuc%¢ÐÈHfÕéJ$¶ B³‘ò¼ˆÕ„Œ ˆR†p(5ò—¦˜@ÝœúÔêL½”°Î ‹Ü¥<S+wï£y. ÿùØ(} Êð DÎÀ«Œ< Q;¤¨,“©!}” YØì¹"Ñ„\CÍYÆgGrÝÕäY]¸î@ËàîÔ> Æ„éÎlzªQE ‰=†è>k,¹º‘ý.ˆ,/J×DOœà²oÂëðNî.æx~~wTgv7R¹Ýýu¼$d£!nž]2M,™¤ˆÔxŒœ,ù¡êÏMÁ1ïëèÛúáêÓJ@¼­„zE ª3JˆTN /Ó&.¤9Ó É4doj±¾é&2<þ„D°Ì¥¬N?ÁwgÒTʰ!bΫ­£šÐ[‚\)8‚Õ,]õ·u:6W`а´M)A—TivpFý7ê22<þ¬ÈÆ–²SÊk@Ðz„ÙkïÒ»ÑçGu˜ôQLÆ XžYsZ1jÇŒŠ¿O1‘á+Ší˜ù¯*&}ÂgßG“ç†8…x_ë˜Ëq*ô´ê³9âb“Y–›&œÉ©áY¸»õy@%'Úî¾Ý‡cÐ)SáP¬<Pþ€£(­æ;vùCXñ)ß–«.O«c°¸\˜”‚{<„³€‡&šÔV¦9?½Õ( ÃÁ^ØÒØÕÿÖ½î8.†,7r0ácýÊ'7ÐDÐŒ:ãîQ@MŲD{/Vo¦ÚŠª˜¯h+Ê'y„¼‘íÞ¡Aй¢þâ«Éu}Éæ{?ÎýCWWâ Â=£àÕCKÊz¸J´‡·®áÑÓÒ„ö¾ð­0`ˆìMè.f€&ô‚úbAú:ЪЕ¼¯R¼/C雽EÓ=ð¦j»Î0L!8î{MiÓ¬«â¾ÊÆ.Z¿6ÔüV zT}6È´˜jß  ®®ç7µ«©ízÕYl²Û‰@O;xë Ú¼t “as Ÿö®bÏúÓM˜¥; QV"áQkrô1ÇÐlIÆn@4lS FýÿFG÷°¢o]a±LwƒMþ¦ŠªØçaáØåÐ2T+Ïåâq*š¦™ì ¸?GPÌuÃæÀ»O?^ݼ¿p°Ñÿ)®ú*›Q­“jcÔ ¿™ê”âYUÙ_*„òjÔ*+Š*m”í/a£« ÝnbM* ïÏ¿¾jML:õ¡=ÕšŸ¡Ÿ†14¬ü_`ÞõmèíË×ümÀSÿã …^À·œ…³=ÿËX6fûüb[竉bL©Lž[0’ŒbJ\,ø³_0–:çkÚ®o𿺚ê ij$Eð/BbÒÎð¿ù/…ý_&%vy2~¢%j—u ¿™}¼¥áχDzÿà<‰endstream endobj 2718 0 obj << /Type /Page /Contents 2719 0 R /Resources 2717 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2720 0 obj << /D [2718 0 R /XYZ 56.6929 794.5015 null] >> endobj 2721 0 obj << /D [2718 0 R /XYZ 56.6929 749.4437 null] >> endobj 2722 0 obj << /D [2718 0 R /XYZ 56.6929 680.7174 null] >> endobj 2723 0 obj << /D [2718 0 R /XYZ 56.6929 501.4297 null] >> endobj 2724 0 obj << /D [2718 0 R /XYZ 56.6929 130.8593 null] >> endobj 2717 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F41 1238 0 R /F53 1333 0 R /F22 977 0 R /F63 1385 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2727 0 obj << /Length 3076 /Filter /FlateDecode >> stream xÚåZmsã¶þî_¡o•g" Þˆé''w—¹´¹\Ïδ™ä>Ð"e³IG¤ì8¿¾»X$%JN_¦“^ÇãÑr¹ÄËb÷y ù‚Á_d*aÂÊ…±2QŒ«Åº¾`‹;¸÷Õ÷6«`´[}qsñùa6±:Õ‹›Í¨­,aYÆ7ÅË«÷ï_¿{õöo—«T±åÉåJ1¶üæêÝwW&ÝûK›.¯¾z} —2³Œ¸A;Í–Þ½úòòãÍׯoâpÆCæLàX~¾øá#[0ò¯/X"l¦OpÁnmº¨/¤‰’BÍöâúâ/±ÁÑ]÷èœ ¤Ê•J½X)p9á'–0ó^^Iõà'™Íù)X¡Ÿvå¶Í œëço´YKždR`hökÛ”d4i2µI–ë~˜iF%Öí ÖÛ¼ëfš*É´R¿µ™Çª|šŒH,. }üx¸€©d‰TZ/Æn:rf´:öfšŽ{“*‘æ>qçr§ °þ¾$á®z,ÑÉQdùõ3,K !ýÂ"¬Î,r°¢EÞìÊî~n•M’¥Ì|R«¬a]ä ÞŒVÇ²â‰ä0è‰?¯×÷e±ß–Ú’TçUÓ—MÞ¬½bÓîþÅXÐF'šIs>ÆV§c!ZQ,ô»¼é6ånf´JŒòS -¡µ=ïÐhuìÑi8h›™¥S—~\zr±»mþx/›Ý%Ï–m}ðXw}h«+w ¹t¡²XqeÉ`T+nà áíær%˜ 6P NPª:ú]·ÍŒ¥—|y·wý–…¦¥ß}çW;å£)s ‚¢ß{¸j¶US®ºê®©š;o?vxÒå3hšëaXø\èæÕUmCítéÌŠª[çnäEYüt‚-óM_ÂŒvä›”é„1`Éç‰U*uc ¿êtI³­•æ®_¼öM#^Å1¢-•ë¶~Ø–}ù^ªð(_žx0]>UÛ-™ÜN†rW6å.ïÃ3OUORö8#6I)@Q=å½_Æî4ˆ0žˆÔ¼"#«3 ¬p ØÿLÂN‘á“€4ÃÊSžwe´:öå>„H=ÌÔ™oÊ~ë®´[wÔòÕ»ëë×_’ò§ò¹#ÉÓI9ÐD„QVôVt°UØiŠŠgÝ·;¯ú‘)Ö•¥‡ðŠÂ>J£xÐP¼êà@èb­û–gÀæ¯lX´ö¡§Qp…~ýh³åoß½"•¥Ÿ«¢®šªƒôíÉ €ó§â7[~“7û| Óá "„qÈè~&Â’Ô˜s£¾+$‚T©,x€öûÛmµÎý …]>”»ª-$_Ö4”»’îAc5IP´QG®Õ:’a©ÿôú{’?|èÊÎ4 |üБ¡oÞ·³¾Ï›»F3ÐFs@2 ¹à7ß÷m ³[C>“Š<µŠÀ*Rã¦",ùCÖê“8ŽMÝ܆jÄÐ:o º n~Þû¸ì®æ=Ý?z¢IÚ€$8üUÑt]¹ž‰<qÊcœúÉCÓ1A&pVKr-öÛzÈw Û¿TÉ@pà«öi¦?‘B ©0¶v7ÓOàñP®v„ÿ™¶¦E:†›Õ ÎË·]KA+2(jãÓµŸqîg6ÆAæêÔÜú;¾`U îÁÖg‘›¸SÏM^Wkº€(MHBL¹.}c?¦©|5ØeËï `>ºù¾…¼ªÊŽá`&ž°€cóXpP‰×íþ * ðù¶K0N±¨´°}Ï ç³,:¶:ꢄ g[Eî3Ü%c¡Î|™I³—Pý>ˆT¥°‘âæ¼7£Õ±;¶ehGð©?‘2鉄H¤ {"‰¢J‘‚è3Í"ÛÌ0%RÎy,Ò!e¥4™èŠt¡=!9E*Bu "¼ATäÔÖÁ{‘u¤Ñˆu|Ó5Yëx uðv ÔÖQ+ßA}ÿÓÚ²)îšY1ª§ 5„’v- »oŸJ¿qšPa1¾Þ‡ß¦í½*üº.‹ ™ uÌ„ª[+6éx \xßßí¾Ÿöâp,4Ñ{$ ƒŸ,_Õ¬©×º¤žãHR´q#XÕåf#Ì<ˆÇPZâA’æyPÁ^TóßʃFÆd›,yå[¯s<èúåA ÷…ÿ }‰T.ãœ}ÍÏžHMêDa†OÂÏï¹ôˆÉ1iãY\ÏÑW´Ò‘¾à¾@ïéKë}áÅ„¾à¡H_pó€¾@S5CáâÌa­æ¨ì¿ÅbJZ&Óö‚c«Ó,­p›]Yþ ьͲÇÿþãi2;ëÔÌŽ¼:Of·^ﻇÒÕx°Î{m]¸†ßœ~†ð… :S„tb´UÓ·Hª|CÐÁºÂ)Ý&U´O8Ã`ŽV…¢´ëH8 .:uYÀ tjÐ)Ÿp^®}H£ °Þ{µ#,Eu¸€ kåôN>ôNRÓîj‚b¼"7¾•çiºpDo‰4¸™OªåÛž”@ZçûÎÍ2 »«Žn8–†_bþÞîw›\ G·%=Öû¦n½a÷ y]„VÂ]ߎ'C3~pWóB£Ê›ùÙø½\ß—õCß…=ÛÖÈm9&­ Ì/lëî«pž}f‹è ¢_Ëæä™“€ñ)ÜiÇ™‘Õœ VùùÓi”™fþ§2áMÔY—龜|:ÿ¾jâÔ×M~ëb•ËdW¸ ÌérXxRiÄUå•+qá~Ó·HSù†' CPþ”–Û¹# ¡D1„‰1 àNœ”ƒ n#‰!ŸU(Aðì¤t0#}vЛ¼‰q1ÚàUQu?aac¬/lT¬Pç@ˆˆ9eø(‡ =ÜÁÃ퉔“`à_/‚ê>÷fá8',Lº¼Ú@½ŸÌéÇç²ñ¹ìšÌŸø‚ÇAÌŽG0r´¿ÛpÑ÷åÐÅð1º$TX;2æ1Œg<:ÀòÃnŠá‰ãš7Õ PC*W¿Ðz¬6»¶^Õ/ ’Â*ª›)IÝ—ÜžC½Sùk˜ƒSØm%’Y=¦ÚæÐ|D d  ÿ5aa-Ý$ïÁƒÖö–¤L«Ã>} jÉ—ß‚r÷Tá¸W"šÙLl¬ãSèú™ðŒ'‰D%ß蔿@­Š/}ÜUœ%^„Yž#›öEÅIÚHSŒ}ᇱÕiÚˆVîU0®§Õz[æÍÇÓ$’ÙDkaþ§.¿¡ÓÊì¼£Õ±ƒ§bm’BàL=|í< m 1šZEdñ (†ˆmŒ¸A»ëȯ0²ñ4ƪ¸9ç°L©Ž9G;B€„Q eÆ5ĨŒ–¸_£˜ êâ>d9þíïp‡ïŒ¥I b>ñÎI0™ayº‚s8t%²Dá7Çcÿ6±)Yendstream endobj 2726 0 obj << /Type /Page /Contents 2727 0 R /Resources 2725 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2728 0 obj << /D [2726 0 R /XYZ 85.0394 794.5015 null] >> endobj 2725 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F63 1385 0 R /F22 977 0 R /F21 954 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2731 0 obj << /Length 3112 /Filter /FlateDecode >> stream xÚÕÛ’Û¶õ}¿BoÑÎD0®1}r¼vºiêI²Û™t\?P"¥eL‘Ê’²£N>¾WâENã>tvv‚8œ;HþÈB$(QT-¤âH`"›ý ^ìàÝ·7ÄÁ¬<Ð*†úæñæÅ& ©„&‹Çm´WŠpš’Åcþnù "ÝÂxùÓÛ»W·+ÊSÅ—/øáõÛ»ûŸáY`Œ—ùö/¿·s?Ü*º|ùíë‡Û÷ßݼ~ äÄ$Ì4-¿Þ¼{9PþÝ FL¥bñ 0"JÑÅþ† †gÌÏT77?† £·f阸H‘ ø®©- á áHq¦Ì/#»P$É@³½%érûþR¸„D8K1>ÔQJ{D%ˆPAúœ¾®³uUÜ®‘ËæÙþæe{ž4¢°CÈ®¬wZ?^þ üÆ/Yg›Ÿ²gÍGng6Íþu庬ÊîtKY~ /_vOe@öYíá3#ÉÅ*µ¦Bc)!¨!3«Úƪ⺰¿Ç¶ÈíèSÙ=5ÇÎ>À.ö×в;î‹Ú½éÿ»ÛUnÇœ:æìCãw©wD˜&†L ô)ÄSn-ëG¿éo´±ôÀ Fò¹›t‹‹ßU¹)»ÊQ•—†bÓ¹- ȯS¨D!!XâTJ3V­]±Éºb×}vY¬2Må­ê‰Ù’¢$aró”ÕuQìÈRÄêU»¬çˆ^qÌîµàÈÞ‰”x[-sR’è2ð<ÞŸƒ&‰tðu¶/r´iêíÈÖ E\¦T«µÞÕ‹¤ËöPlÊíéLUŒE2¤Ž%o\‡ÙàT´ÃKÌDB’“'+‘¢8õ”4Ïí¸p0aéŸ޵@¦À=IBý±XŸÕ¬`Þh œN$E)g|ÞUÇPÓ®:@iŒùqÈ×·«BÖ»UVU¿¯6Ùæ©ø}õï¦.Þ»–ð„Å HÄdÐÔeñÉ#„œ¸bä\¢”†Søj*á½¶YFÔÓ¾PSýð÷X½VMÌ6šÇüü±e•|ùUkßîÝXûè¼ØfǪ3žË¬§öÂ(8hµvŒßœ>ÅQÃ}£´µG²D0õŽtk6ÔÞÕÃ“Ñ ÞMk·H;{¼¼ßÚ¹º9¿³£²,ÿÚù⪊6н|D™ÓáQ ¤à¯!ß¹¢ÔŒz(gjÏMÓµÓªWBÔý2šF$Fìv–4ä§ŸHg²>CNÏq§©ð@Ïà°}|Ö±Ý<™ƒ°R0 »Îm` /@‚ú(¯>g„äB}`©QQQƒ§i_CÿŠx€§˜ÀX§ÿ¬æ‰4AXð+¾/†šÖ¼e4¯kÞó†ŠB0âfæñ¨!}U!"$}   {r½ª€¦è„¨å>û`’ Õ½ÜôSVŸì—ä˜\M¿ÐéÅN;&ý°ÏòÂã°GtÜ=Ùuù âV¹±o‡;6y)Üÿüæ'ÔJ¥®›â˜N‘1aò¹íl–Úfµæéy­Ëæ×pïöYÛicð‹*C)¼€8Cz’rûÖøZS~q­¬ÃˆL!-€²Á§«ÃH¸…S ©">sh-žØZFJŠTR7éÇòŒ” äWn烕ø¦h¥“JÙ:¹Bæ$AúÆhåÚŸkmÆç?>y;{j‚¹L»ø DZgÎÐzXãä=/l_ÖÎð>=õD2L…$×8f:÷¥ÜSæ•®\ª¢óqKÙÁ”=Sæ ’“¬uÞ¼#¨óöP–¢ªûóžÃ™÷%æS`Í›*î3 ‘@O–{l ^Ù Nšs²üÉY² –¬×ZK¶ÛE–¬'‚%ëoÉzMãpK6#o´cfmµ¯nŒaÁŠ1·V SÎO±³ÃØYñ×®˜=ºåŸJíùõêµ[d©®*»+Ó1"*{pk!öÈ~iŽV»#lvQá>°±~íÌ ÷ý–•@Ûeϱ¯„áq—"R„)#W<ŠÀ*‰=Š×< XŽnÀ|ŽG‘±Gû&ŒGI@}á;4oÖwè—Þw˜qmϾCo3Øß'¶D@%%H_U>Ï¡HŽ$KÓ/âO´UϹ®£À¼/ ÓŽÄ‚˜Ìý9Û—È †‹ŠÊidâYaEH`æŒì¾¶i^õ]BE`ÔºõŽ|}Œú$Uñ±p¾}ò=˜bZF Ž0ÁòŠ˜"¨Iy¨ž°.2x& n>„Zj/ý1¥BêYâÔº¾UBÙÏ¡\ì“÷PøäôBªçÌ|V¶>Œž£®m7¹ô6«Ž32Ç :Õ•2 fd·SQ•"ÝÏšEë`†Xû²Ä "Yí—’%ž”ƒ4§ôJ{:†š–X€Ò¤o«cû4eÒ³XƒU°Žvëµø ™™Ä´T˜„ê^©Ãc¨©x¨ í›Ç*ðÒæTE|4mDûX9VÇ3éˆËø‘Mzý°aÖU4¥óbPC9\Ôï)¬D_çƒbÊ våGiè¡áFi”®ô`/¦îÞ>Ø9];ÌjSHCÊWnÝÌÊ­n9¯«Â¼£g¾vgd¢·4¢KšÔrjÏ•ç.ùñšuÙ:kݾd_gù*^6¯’Uê6È•¨CM«d€ *Ù=ÿ*9+†³Jä0®’=A•d\ºDN%õPó¯ÓoIí¥‹ž3}=0u5ü–Ù!]¶ÇuÞì³²6)»$qÚ#¸P(½Tëñ”":-1åêÛ¦+¼«ËB*ãKؼ)\ž©‹** ×)º Í·¥Ä>+ÎìÅR±q(fLá£ú£T\Óü3ÐŒâ; ۘʺc;ˆè  1‡Óà pöã“„¸¯dç]ÙªL'$À Ì£V ýk= Q“ é¢Rùã&Âw ]÷k#ΰ•s˜*ëMuÌí“ð«ô´+K†ɸBA±.ëüÅ«¿Ž( §ˆ$‰/´4N«¼k/’‹[R]yîÖÛæÿ `Î< ^èÅý۱ˌÀqxÏñTúœÞb{«Û€1îˆz;1•øtÆé;®—»nšZמ;×-œn­RêJRCÍ(°‡2¶î ·îÂo´í2‹úÜvào»ôß…;–pUÙvá*:Ü]—Þ õ¯jqŠTªþX¹êO ضB¯Ã%´ëÎ:y¸âlòHˆL¦øJÖCMI€2Ñ-«JpyæVS7Åôå–ù™ßÝãvÛ{ÿ·ùÖ™+Að+4Áì]ÔÈ©¸ÊàH¥ |^"j(’þiŠ$£i_&öó h±Ä·ažì×”1ϽºüŽÅ‡l'œÃ6c{[ š •'aŒö} Äχׯ FRˆnkCh¼èˆB‚9‹5¯Û¶Ø¬ì÷c—ã` ,õ]pûá„ÆVEÞÚaç¦L[ŽB>PtáÅðœ¦(Ô‡åS1v}NÙÐzÙl»°ðUOvô¸úÛHpØ¡›Ö§S.‹í!ó12£ËûÎu2Á6’T±~§Ï9ð‹6¸ûvdÚµÀ%N®Ø`5cƒÊ0Ô–»•ñESnqõÙ-p»Åòï­LÕù^Ò”vÎøEøµ·uðîñáþ[;õ¡8µv.ön!œÜìE¸±«Ü¥¤ùÔÈάOcÙuJ£×¯Wt£:|na>ù€ HÎ,ãl5=tÐèÇ'ßà†ËËLõÖM÷ä/*À7Àþi<ˆÚY'‹øã¦sïÿöúŸšŽU]욮̺xá¤ÂIpœ2!W>Ä;Í|‡ç€‚¶å…nžŽxë$…ú‚ûâÈ›¨¡8GŒ…6ôd•|NÅ&‹(¥PJ€î9I (.².ޤ’¼'‹;+†cprÚ›„Š^ÏŒžš~b±ƒ¨B¢ÊßPâ~",¸2QÕµÛ™«sÌÈ3ÚrxJyy“ …ÿ©ï¤>O•zóØ}dÊÀ)°Ñ áßÇŸþõü-„wHÑ'Â1•ÁâÄ¥e@d:´Œ 4ÓÚÿ ô£]endstream endobj 2730 0 obj << /Type /Page /Contents 2731 0 R /Resources 2729 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2732 0 obj << /D [2730 0 R /XYZ 56.6929 794.5015 null] >> endobj 2729 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F21 954 0 R /F14 980 0 R /F22 977 0 R /F41 1238 0 R /F63 1385 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2735 0 obj << /Length 3324 /Filter /FlateDecode >> stream xÚÝZmoÜ6þî_aèð²¤Hê¥ýä6i/Eâæjî€4ÀÉ»²W¨VÚ®´vÜ»ûï7ÃJÔ.ôpßß4ä¼=3C­:—ð§Îs+¤.ÌyVa¥²ç«í™<¿‡¹ïϯYúEËpÕ77g_~§³óBi’žßÜ´r!ó\߬ß/.ß½{uõòõ?^,+߈K+åâíåÕß.ßÐØ»E²¸üþÕ5tM^X¤2\—ÊÅOW/¿}ñáæ‡³W7ãqÂ#+©ñ,¿ž½ÿ Ï×pòΤÐEnÏ¡#…*Šä|{f¬ÖhíGš³ë³¿ŽƒY÷jLÆæÂ&&=_Z 4¬‰ J iñe¦ ¡eªFA™<&(¿ U®×¿um…Ü~ù]ªƒå&y"3Ø×M‹f4“BäyVð¢÷2VY–ò‚USö}„Œ¶"O­ý½dêê1v- T -úð!BT\è$÷ÇéÚ»úþ°/‡ºk®5¨-r¡TOd?®:~’„‹Jªt.ýËõúÅR'rQÒÃIÙµ7uƒMU,† õÕþ¡ÚS»î鹑/m[·÷h»0p³©_¨…òù2I`WkÁ~”…µ ³½Ý–-@@å‹ê×CMžFqO'½D…Ò“Hn_Ù4Ýã²­—xnÖëŒë\‰DjëvNδAGÏ[ä-Ë€·aœ8Õlž cMÂtž¢{‘j½½‚4Ò¼i0VÏ­6Ëòg­à” c3¿y?ìAØ$^#QàÂ,^Rj¿«VõÏR&ŠXe Ç3— “`´©[v: ×±9Àœ)ާtÓCõqàÖ¦hácwhü¶N£ëº-÷uóDÓ·Ly×”«ŠP3Ó&Tµœ›L[n«µ@IEdQœ¶%ïdã— à[ÂöŽêX&ÙÈXêÄŽ£ðÙ—L®y”gK|d |³ñ„À‘S«‚ÆM›²ßDØœC†h‹ñ7_tç´"‰ì ¾nŠTl=§šŠ4³Þ¬<ãÌâjÿ´ºû}¹ÛÔ+šqdÜä}ÕÒÞKörŒþæ*+§àÄ.îÜân‹=ãáÄ:ÒPwG#"¦h³øû¦jcpå"•Æû‘³‘£Úˆ$ÉTÀ(îÅp3”{8'ÈT=íï5Œ 릡Ñ[iºrM¼0 ‡$Óáí@0*9@è1üÍ|é‚ò¾£'¹¶Ô޽Ö]¢'›«²¥Æ®Ú÷uÏËË»Û5éðMž"]¤æMûr»kb0 ¹@šIª³>¼ôÕ£… ãØ ˜`<“ÕÄxÄW”εazÕGw>…mdï4‰1^éCw´Åºº+ öUdÃ¥|M5â+Iˆô÷çH€˜¥ûv >“J9ÊÆu»/þEÏáiÇK¶eúúš:w.cëOÁ«b}û'^🯿ˆp¾ä³Ì´ú³´òªª#1ÜîËÕ/ÕÀ µÓWÛz¹êšŽMª$>´QM‘ù·„€­ÕI2Ë£Má°Æ|&­ W=ŸVŽ«ßuÕü¡ÓÊP˜Ÿ £Íg¤9®:ç<,XH7 g›ËóeÕTƒ‹Ý”+ª1WTA®(}ê ¦\Qq®¨ŽrESÈÅ-å#Ö Ê%Ô„uLÀ‰I ;Ón_ßC†Ñ ¡#D|¨Ëx ôoæ®Ê/>c©ÁòÉ«ÚÃìíˆ$(Þ²ö†?‚(@ËÌP^u‚D‰L‚µ}Ú ‚UŸp¿Ê%‚õ= ›Àâ=B5—‹Øü7¬š œæu`·™ÃoÓŽ0ìðhlÅŠ´ d¨Õ!²T +SóiSWÚڼБвð̰ÃM߀IA&ct¶¨ÖµoB EŠO:¶$Õ®O0Q‹—W×ׯ¾¥ÁÑ\]g(^s穸·Üä¬Â%¨$Àà`qiû¸ˆzjcŽéží}ç ¨£"ÃËÀÒ(ɸ E«ì« U‹%ŽGv¯ìééÒcx—ƳÅÕ4µÚ”uÛ“b¿öt*–?ðJÝNe°k0Øâ+--á ù˜Ö b8Éœˆi€3¿î૊¦itÅÅZ?×e&‘IJ«O¬øL°†e0Ƽnèãë˜~å<‰& ë<à;a š©¶L3Fa\ öKO³½oxdO çÂ3äȹ<ÉÓðUªJsR­KEÜt9D˜‚²an¶§L±¥¥ à¦Îç–öŒI«LØ¢ðiê¡wÙVÏ®ÚÔ‹uÝïšò‰‹Ð!űd4¸¢ôe+Ÿ+¤ÕâuKsDoºÉ3 ˾ò¯R>  ÐØq^ãI0Uo8¨J¢=…SÞ×8ƒcžff:÷š°Ôå‚Õé›’M³íxÅSŹ[„¨¯V¨¦Ó8:ïöÿóU¡¦‹0Ù,™‰èâtšä{Wx! ‡S¨€± ÅqS. âDIò¬ä’k^ÌS¯Q<ça·ëð®ƒuáÏ2SƶAâUM®yÏ<ûccÖã¡ùV‹¯eÆëͺÅÆe€T§¥º5… ò-4×Læ‹w¡ òÐøàLG®¬Ù•ý-®@Wæ{è âOžœÆJçàˆË¸…CHê;6éÍO—oiî4€N£ÞÒ¿GS _–9‚>Y¾ð‰„Ôå}ïz<×§‚r>§’1hžá;TœÆñáäæZ ´Øtz„Å?'‰ùþáó‚¦@`_Åbnž «íQýd‚ô;³»P´ä?qËè äàIžœ\Œ|âc¿, (‡@Úñ‰*fØW°˜# “é£Ï$£¨9Á#QcGY¾m› 7,oÚÎÂpA”--.¸B¤*-Nîg)ä\px„ùƒ´ŒÞ %øùVÿ©™OÔÇ^êç&ÕQŸ?pßW#Œëª)¡? гúeÊHý¸d<’>GnüÄÛ{Mù¼{ªÎ‰ÍQïÀ'(Chc k¡TJ÷Ïo^¿}íŒèÿ»yýãÕu„Äœ¤Í_{Ç"6)ƒày\u'Œbð|,y`àBÏî¡^;"œ0áL¿)Ç+ׯŠê;ÜÂFK‰ðë´´ét­zòë1If-ØO&’Dæ¿ç?P_æ˜wÇ~î³).C’t•žM§©HR£§­£Ö#í™@Ý’¿Ó ´N”^b§Ÿˆ`¾´ ÿ!Ù “Ê£ö×Õø9×kéÎ_:@dïË{of«é«¢0tŸ€z™²ãc““ÞÖ,í÷ê½{ùæúÇOYÙäî— #-âÎ `b‰=à\̹oÕÑÁ() ,vG¸ ì)O„”#ê~óúê%½X0'ëm eÝ’÷’û©ºcïhW,«·e{9GôŒ_SÓ4 á)öÛ4üÝÖ±Ëe9ÊûÿþÝÚô»<“ çÉ3?x’Fh]((—JgÅñÑ­†ê3O²ÈÙÿ (º%;endstream endobj 2734 0 obj << /Type /Page /Contents 2735 0 R /Resources 2733 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2708 0 R >> endobj 2736 0 obj << /D [2734 0 R /XYZ 85.0394 794.5015 null] >> endobj 2737 0 obj << /D [2734 0 R /XYZ 85.0394 177.3318 null] >> endobj 2738 0 obj << /D [2734 0 R /XYZ 85.0394 85.432 null] >> endobj 2733 0 obj << /Font << /F37 1042 0 R /F48 1258 0 R /F63 1385 0 R /F22 977 0 R /F21 954 0 R /F53 1333 0 R /F41 1238 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2741 0 obj << /Length 2959 /Filter /FlateDecode >> stream xÚ¥ÛRä¶ò¯˜ªó“0Z],YÞóIJlB*Ër¶*UIÌŒWfl2¶!ü}ºÕ’oãa7uЇ‘[íV«ïÝF,8ü‰…6̤2]$iÌ4z±ÚñÅ=ìýx$<Î2 -‡XïnŽÞ|PÉ"e©‘fqs7 e·V,nÖ¿Eï˜°ìø›Ÿß|Ðj€,Yp  ÖçË÷gììÓå‘•I¡Rzzuu~ùþâ×ã¥ÔÈ/5çÑÇÓË/§¿ìê8•Ñéç×Hìèü¦»Èð²‚+¼Å_G¿ýÁk¸óÏGœ©ÔêÅ3]øÀp^•xÂdʃÄA$ Q59.fÄ»^Üá®ÚuìöTO¦7[š9[r¼¼Ç9z‰éO~wqùžŽK P¢u9@ïžò]Ç`³;6ª6´Ù6Ŧh^Ž…#dtó@÷âÎEôy`†¬Ä¸d<ù.IìÛêb[l2TuC«çb³¡Õ­³õÑöòÒÓ­ð—èûôë@õ¾x /d”…gÇö}ë5ûåÔ%&÷-)ï는 ³‰´=¢yîS5)ãR›©¥õ÷K‡J¨S¢L½„“z­XÒŠ%w@øóC!cH³XƒD 4Ð)Ýlî>©`"1Éù‹HÁ$Ó¡c,ɸb(1 ÌPÊäŸKcLtŒ‹úÞ?‚ Tþª?»XÏœ® ЩÖJ&©üx*À*×î¦t¥’ „c©‚Ef.JÄÆø•Oj}r„Y¥€‰ëäkâ1r‰¯z’Ö|Ö“8ž”ð'aŒ"I:W‚•s%øõ®”xWJ¸70&;p §ÐIMK‰ªÝ­ò%æsÌåû7J3‘Šà¨›±@•Æ æƒ‘ÅͲ|2sçhÉ„Ñãpˆå!XµOWPùF+W? ‚B\Ù Ú ]à*UX\\=Å´G"ŒG¯¨?\yäAi“×Þo㢀°Ás¡ÞØ„&v¦¾<½kú¢|N91Ž2ñÕ¸l¡O·qŸUž+ÇÄú$ÔÞ¡ê%ò°¶¦ÇúÎvûÂ;ó}C³C{w  ìØv FGË5 ;®„÷'ŒŠAø1Ãbi9Rë½ö½4Ôb¸A1 ¯Ðƒ&«º.n7þ%o:o眳DÚ•$óyrwªºZíd®aÖ ý•„ó!_u¨9¤“€Cî‘Ïy¡V,I­”š2 b’¡®“ÃòÝJ¦¹™”ïÛËmiÅ8Z’vMì5‚ ×°ÂoF?ÔF™‘>ð7Cè)(ß2šÔÜ(Å3\•íöÖÙ%ÒÇ¡z³žP øÞ¥Ò%H‡Wù.îææ³M¯PŒ›npöª¤ è$fx)©*Ã_Ll u¨êãÈá@Àquë‘|¼BzeÝä™pE¼;%¸0¬Q1®ûVÑyæÔ6>T}ƒˆùÄÙ(^JeögN+‚hÌß5 …») Pîîáj;'LÅ¿ ÕíWSˆÕ,HÃrLkáξ¿)_pŬÊ3ÔEîy³ÂáëMðÇþH7øó• ¬‹:ÌeÃèÝA=¹uպ׵ÐeÕ‡|°ãcËÐ?$Îp»Î†Ÿ$zÎ^jßU¹ÏË|Gï°1êøFhà×wnêÖéì@'n|(});þC §ðÙý.ÛΘªÄØ©ŽG4“ÅÀþ|§Ãy÷ù˜Ò”‚·^·>˜Æ$üí¥àtOÀ„ÐjKë ßz¤j3é+è±Ï¥–IÞu…ø¹l-Ÿó}ɤ塈ˆÇŸã?u eõ\zöê¹3¹e±Š©mñÊ¡Š ÕzâE¬ãPÈÝ–Dg|Åе|¡r(Š.¡Y7¢wfo=ìßÑ·´.åfJmÃf.&fºKدË2†uè)+*åp(ÖÐÙõCñH J,¸"ÅÝÔsÞ6aælO§Ÿ³‚ÛfOY±É: a`›•aÈOÙ}<¸ÎóI¢>ÿõôãÕ/çÓm á<ÌA3ü€>^ûñDøtSOs¨ÅØ¡i€¶ÿaæ³3ï¾ÿßÿîÐÿ#Hœ0e­ìÿ“aÜ‹hœ˜šÀJUX¾ÇzøÇˆ}Þÿ~ªîëendstream endobj 2740 0 obj << /Type /Page /Contents 2741 0 R /Resources 2739 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2748 0 R >> endobj 2742 0 obj << /D [2740 0 R /XYZ 56.6929 794.5015 null] >> endobj 2743 0 obj << /D [2740 0 R /XYZ 56.6929 752.1262 null] >> endobj 918 0 obj << /D [2740 0 R /XYZ 56.6929 713.2318 null] >> endobj 2744 0 obj << /D [2740 0 R /XYZ 56.6929 680.2418 null] >> endobj 2745 0 obj << /D [2740 0 R /XYZ 56.6929 644.7005 null] >> endobj 2746 0 obj << /D [2740 0 R /XYZ 56.6929 578.8284 null] >> endobj 2747 0 obj << /D [2740 0 R /XYZ 56.6929 518.8431 null] >> endobj 2739 0 obj << /Font << /F37 1042 0 R /F53 1333 0 R /F21 954 0 R /F22 977 0 R /F48 1258 0 R /F41 1238 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2751 0 obj << /Length 1703 /Filter /FlateDecode >> stream xÚ­XYsÛ6~×¯Ðø¥Ô4Dˆ‹G3yPlÙq±L&ÇMB[ŠtD*ŠÝæ¿w)J¦ãxÚÑÅbO|‹…èЃ†’x<à DzT“ùÀ^ÁÚÁ€Z·ar»\/.O÷y0ŒHä3x1íÈ ‰†tx‘~rƧ§“ã½Ã#—IÏyAF®ô<çh|ünüi§£ˆ9ãƒÉ9L™|`¢!}¹xõt_òŽ|E$R›¥%Ÿïí’Ý“ã}Í:˜\´öv}¢ׯ~|úâ SpíÕÀ#< åpÐ(bÃù@HN¤à¼¡äƒóÁÛV`gÕlí‹‘ä!‘! z‚ÄèRIÉ6¢$#âsÆ/“ã£Ó7tZЮӒ„¾”CWxDÐHöòºÎÊ¢¹>Äòo½«Õà⃟ªi¼Ìk·R‹oj1r)þ¼Lâ|VVõ3³Ñk¶°-©›‘Ë=à¯âùu®`Žüî–&Üö£&a‚"µÑëwÕþÄjÜeTáÿ§ºVUÝ?¤› »©ÕìmÆ5NÓ…ª*Õf ÏÃëraG’Kþ ‡?ï‰1ÉïFãA/âüª\dõl>r…Nùl'î<•½¯T²Ph©çìøûGÓ??©nE~sÉÄÉ¡bÙÁä6ʧ4Ï_üžßîôû@{}à›>ب>Æÿ~è†&m;güåaxê¿x½Š>®>¬Žùû¯—oŸ?ßy8òUÖžÛb3ÂBµF“SÏ xäÄ—å7…4õݤè‰ÖÅ1ÔÄ€Rak×¢H“Œ‘PÆ‘i•å9ʽ¼AUœH\VÖ´(Í7VY®Î¡ÔäÏ”&~&¹â"Ý’…@ lÏUjÄs×F‘Q"/Ú £=ž”R‡˜êáì–ó9¯tmgN]Ú¯ÑÂè†u@o€%ë=PÑÑî¶4½ÑùDOg5Ë’®Ì—(šÂª¬òK+$UŸ=Æ7 gÅZIï!CÓáü¦½ ') -áj¹ˆu9ÖÄÐÑ”\!à 0ŽÐrXËíbÑŽ0øzòˆ†ŽªuôàV¼˜YtU³Ôq­æª¨‘ži–¥jÔ˜´£¡Ä/Måb"lÒ:/Æ»îÑžÄYœ¨ÓÐPŒ0Èj»um,Γ<ÆDéqYÔqVÎ`­ä2®”ë œ¨")Ó¬¸ÂY9½Ï {*V«:•—•I$ÌL"á›–ËK“ ]–$Òcp‘s8¼ÏÓ´†$‚k¼ VÀu\ígÝ å.ˆƒ„‚Û½Y…;—h7ç«èÑ(ô6üáúÁV}éïB%µUP"q] ¨cN'ßİâ¥ôÕXŠIá Þ€f‹mË7"+/ ×ÍÑFT/tSWbð¯T¡"61~p¢Ê9Ž·óips7DT@d}ubä‚çÓ«6 ÝXù` 8a™ÿ°­UØ­ïÌ‹ Õ„ o˜þ€Ü­ã3¤P%K·ZõtpR_lT~¢¥÷ˆ–ÔÔ¶¿ÅJ5M@°38âK„‹Vg2ÃCFë<¿ABì;¥Q‹Á#£tÔ߀¼GQlÙ(7E›ä¤ÍõÉ ƒœo"²\Ö×KSµ(Ö|¨P*uÜJ=D BlÚ>éÐí²ºúôȉ—Aãk΢̫¾¸B¾ÀnËØ–Ð OÛ´\ô÷V¿š.Öé}ió¡;ðý†£Õv¼u`t½ÈtH,h8 å}$hÖô1¨ñáaÖ<(¼ªÇ‘²ðgˆ¡‘O„~ÛlØ­’Y‰}ÚÎ_E¹*lÿ›ÇÚåï¶ Öa6ƒØv³¦kÛÁÉ?øÙ2nãݤ;JAcø:MÐïóÉÙnå÷ð1sý$<Ü [‘"O³…%åU‘ÝZƒ‰Àƒï1 T×*É´òFkVôÝ‘¶Ù†ŒO"îG¿R‹€“wjgQsCpÊó8¢O›¯h(NEO³¢×8E2üÁkn¾Ær¨4"Šœs¥¶ì¨:ææÚk–ûê%ÁÃß’ &›}H§ë4xmê;÷págœÎ³"«j¶Fƒ&©©Â¼‰ÝvË8_'ìftT9¶0}vÀ[E_Â=Mx-Šþó!ë‚D@x²õÝpqO@qˆhc”Ž é¶éí_&wmÿ8NÆ—endstream endobj 2750 0 obj << /Type /Page /Contents 2751 0 R /Resources 2749 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2748 0 R >> endobj 2752 0 obj << /D [2750 0 R /XYZ 85.0394 794.5015 null] >> endobj 2753 0 obj << /D [2750 0 R /XYZ 85.0394 751.3734 null] >> endobj 2754 0 obj << /D [2750 0 R /XYZ 85.0394 109.3471 null] >> endobj 2749 0 obj << /Font << /F37 1042 0 R /F53 1333 0 R /F21 954 0 R /F41 1238 0 R /F22 977 0 R /F48 1258 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2757 0 obj << /Length 2475 /Filter /FlateDecode >> stream xÚ¥Y[oÛÆ~÷¯Ð£ TÛ½_Ð'7qs\4N;À’<Ðe‘HU¤âúüú3{I­,÷°VËáììÌ7ßÌ®ÈÙ‰¤¡f¢ G1™o.ðäž½» Af…f}©_ï/~þ©‰AFR9¹_öti„µ&“ûŗ鯈t *ðôÓíÛ7³7n{w}{9#†+>½úøñúöíÍ¿/gT`IŒ§ï¯n?_ýáç>^:½zw}wùíþ÷‹ëûdVßt‚™µé¯‹/ßðd;øý#f´˜<Á 6:Ù\pÁàŒÅ™õÅÝÅŸIaï©{5ë ‚e’f|AÉ„d„ gƒ$£Ì9ãîúÚoêê»v?ðíyOà)F'¾«ó¯X` ÿÈOþM;7›7õò±¬ÇÏ6›²ž7‹ÒÎ?ïÖ`¦·Q cìãssûÖ¿m‚i‹MUWm·+ºfç§>•ËrwIôÔ—~ê}Qï‹uf DjD¥ŒêQøfƸ@šAf Ü„½s®>ßÿëçó^¹©»rW—7äî¹íÊM뿼iê¶ÙuÕ~sX–#Æ% z8AJØo™CŒ‡NµoZQ&#”;ÑÛbSž0Ì Æ¸JáJZœ=_)U‡°ùÑ÷òÙ@ª'WMîšfóŽ^ò u÷\7Û¶jÇéÀ`kZ²‰À  vfà ©h¨€ŸÀ6R„HôT8hs’Ió$u¼w >ý2+¾Åу᪚ ,0ÄÔÜÒVÿ ^¬1Óœ‘ —tÎ3:!fZ qP¹¬Öÿ@å*¾g”KØaü ¼N¨xòíY{·ÝŒ>ʱü6Ò·Ëè›1F9$–‡Ì®¨Íæ„/€Ÿ”z¬¾=kn±Xìʶ}½º³*ç«]Ót‹j—³X^$¸$¥û³J÷m™ÓG9ðÔA]–¦…‚ ‡ù÷öúîͧ›÷7nÓK®ÒÇiqL 2Ó©@¥%3m¦ðÚWŒéã>‘LÚ™u”X6»Œ „3¤0+N&d–¦qÅKÏ8UÓ›.¬\„ÕJÿ .\øQ–.’?ʺ*ëðf±¶Ü öþovÿ|ÚUÝÌQë 81ÍeĨ'ª~I#§Ý*‡RIàJsÚ²nÍl èIqñìýå5CØpK¸™y³óu­Ý6õšq'xŠ ‘«v»fÝfVfq©"ìíjmiBèDr%Ô ðJÔÓv (ì]ëm®êŒ{$dœÑQ­%¦Å)ÿHŠMtòðìµ®À\äãÃmÉ4Ü ãsuˆìúù’2µM{lè9 áƒ&v—zºsOU·ò³)¼C·ˆ†:ê­š9·`¤˜ˆ†7Û Ý t·®)€‰ýÖOW) &¤¤|„»¢c z$«ÿGS-‚ «°íº,ÃÔÒõO'Ì –&”Øü„ìŇ~"šT"ŽÉØFè&¼vq70w¿ Ò˜0:†bмîšÇ6¾»„N>ßé¬g lÀ¡}wô¡aX@ùb—Ò—Š øq—’¤¸ê/)92†è——ŒB™%™CÅÈpÉ·Ž|ö]³ô™gÂ)©—g›!h¶ô!fýâ` xì~Uµ~¹¹çµXM¤'l!’Á#´ä\Iöª¼ Çꚥ#@€HÉüsÙÍóÈUÒK`—.`ãÓ Ìþ‘-ÚЬh&"·Ï­M‹Ô/ ôà4´XyìÉV0E Ý–óʺ櫈žV¶…µ#6rsñáþZwöhå¿v`ª;ÊN« ütZzuŸ ðßqà©€žRRr&òq’ˆïD]½bmú —Ιƒûš°MHë]·ß"[ (`(ëK*å1[ÁIê­yùdaƒÆÈŒÙ ó©=³bZ;°báÀêf—Å~Ýù/óf³ñ¤s¨Wu¹öOÒ,äØ%™Bø ÍbÏÓþÄe×ëæ)_åž‘q6›.Wv‚eûÚ.YŸ@5cT‰!ƒ»˜ÁÔcÎù¹È1Ä¡§îEÎWí×ͼXûáªi?‡¢ £ºñŸËýÎѵûrD!ÎvàM`¦Ã”öGîOûºÎû Z},¨é¹­VùJ® Ae*‚ÉE¥õâñ6BúÛuíŒ<4ø§ 3¬ûÁ…®;ý¡¥µK„µ.u›í¬ ¶ûTÞ®‹yê¿àE_Õ{¶ª©Ž-GXËQ*œì™Hýw~DÂABEýéTPm.<–m¼D!£ü»j;ß\Û ¶tÛ£s´­À*•üz®>ƒ\¢ö†ÉŒ t³´ëúƒƒÄÓMã½ë'ËuñÐØ£ÿz|òI ÚèóZâ‰iá<<çò‹Ã× Ž}ˆšÓÕ*‚ÇUUõ6ÿµ¯ü`ac"i„ìãïb³]G höGçð£:\Ù‘Un?mèì§E¨ý„›-‚¸[pÓt½î›q=}nö^ ]5ûuvwÆööòPJΟN…IÍ¥^ëmÍvñPÍØ‹<´R¨Qoõ9 wÛ(à ¶…wO28…ÛdìÚ3§BªSéI9És’ÿsô!ùs@$:ÕÜmoÙ™æ¶/uº¹MRÎåá–M²¡ËµIï]²õM# Î{Ù¶$•1neè$ UCëîR»eáΩg(;p¹Q³=‚‚>¨ævÎUs;¨ÂÄCÕµöwèßïmís“eüìžÊ2H’ Õ ‚P;`NÅ/0Ô Ù€1'u6‚Ø¡#pW!ì„êÓÑf ÎÙ™h÷¤^ˆv”rÑžç¢mN2÷ŸƒhÑLIèN^´-IeŒF›ÙþodÝçP]ûõ*Ïp¶b*íɃ¿N­Y:ø÷ªëå—Ïñ䛎§îÆ¢×"ÞLWgCÐpÈzň+膱êÿÆ‘ >VHLÏ¿'õBð£”sÓêè+6êÌ’Q(³ä öAOgËö`É»*´@ØÕpëõ•½°öÃ=4绀f9êA|ÈÚñÅ„#ËÇ}ê­\<óœRª^Y´0´ÞŒ ´(TIòrdzB§…\\¾¿†‚ãïY ~ɰY–%à¾iþµ}lˆŽŒ?HIWñüÈG°'¾’G”5Øžù’n!àÁfïÏ"2µÝ…ÿøQ¬ÝÅ ͦ¨êƒ(K¿~÷QcÎXá¨¦Ó±ÊæËåx>eYªÄéÂëÿþúðK;·wäúD‚ÂÑÁË2e 'šc=üV}lûE}Î6endstream endobj 2756 0 obj << /Type /Page /Contents 2757 0 R /Resources 2755 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2748 0 R >> endobj 2758 0 obj << /D [2756 0 R /XYZ 56.6929 794.5015 null] >> endobj 2759 0 obj << /D [2756 0 R /XYZ 56.6929 752.1993 null] >> endobj 2760 0 obj << /D [2756 0 R /XYZ 56.6929 689.9994 null] >> endobj 922 0 obj << /D [2756 0 R /XYZ 56.6929 651.6264 null] >> endobj 2761 0 obj << /D [2756 0 R /XYZ 56.6929 615.3075 null] >> endobj 2762 0 obj << /D [2756 0 R /XYZ 56.6929 583.553 null] >> endobj 2763 0 obj << /D [2756 0 R /XYZ 56.6929 518.4312 null] >> endobj 2764 0 obj << /D [2756 0 R /XYZ 56.6929 447.241 null] >> endobj 2765 0 obj << /D [2756 0 R /XYZ 56.6929 349.1756 null] >> endobj 2755 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F39 1178 0 R /F41 1238 0 R /F53 1333 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2768 0 obj << /Length 2199 /Filter /FlateDecode >> stream xÚ¥YÛnÛH}÷Wè‘F¾³ùèLœl‰ã;À™<0"e¡Ø IÅp°¿Õ7š¤ZÒ,Â&Yê®Ë©SU4Y`øGJ Ì2¾H3Ž&b±Þ]áÅ#¼{wE¼Ì*­ÆR¯®^½eé"C™¤rñ°í¥VŠ,Š/ÉõÝÝÍí›÷-WTàä5Z®ÆÉÇëÛÏ×ܳ»eF“ëw7÷ËÉ„  D±‘“8yóæö~õû§Û·ïnn—_þ¸ºyÔ«N03:ý¸úò/ °à+ŒX¦Äâ n0"YF»+.œ±ð¤¾º¿ú÷°áè­ýiÌ\($(—‹•V$; # /Áa£Œdjp%1‡)ã°ÕÞúê­d#IBÊhfEöºíçÞ à3ÅÅb|â‘^A(¢ŸFRTλߗëêoŒiÙ-W,“I¿-Ýb­w»¼)ÌHÖÛ¼iÊÚ½±šÚÕÓ¶l—D%¥³nâŠ1‚e0¯ÉweáÅÆj1Ž2–©ºêú²ñªltTÃ×}¥Ý‘lì©z9–0€æÜoØ6Å:r*¸Œ‡,S®’‡­5à€)”@j@„ x­TQnòCÝ;xW»BøÐ„=N$d ÍRrLc©Ó`¤,˜Ú˜2$ÁjœÞmªºwO]ôañX6e›÷UóèDBͶ‡~«ÛêWnA””%ïýž^H$z~ìb›!Á8™†¶{ÔTÒ¤ÐFk*IÒèÞ=Ú;´ý¬ŠÒ=ÈÿùwDÁd>¯Šòç+o×1ú$ˆJ‚eì4»–?Õϼ.›Þ[Tëò7sã¶ú 0‘±GÍKãQsu'7e×9«‰’(™˜ší@,“ïåó7Û ÷¤jö‡E¬T†L)™À ôŒØ($b< þèÆ0'8{`axÁ­¬òpÍÝ(§Í×}i¼c€a½á%[w5ÖþpDŸWE‰¹q>Í2`Ú`¼©šqb¯Í'ßJwèÊÂ=©ÀE^¸Çη8D‚„Hð§–=ì{kj^;ˆç¡Œø‘rÈI|bü(€©ˆT^°jŠj÷¢ý6ïÝ©³Â;Cg?…씩b3Ôoõ¡.YÛájl?MhÜ=ÀBI!´ e ­‹UGŒ(<”Eëá<¡3–"BøyÕ‚PDµ ™q }S'ºMÈŒÒJ’÷wîQÍÁÎKœ«ŠêæÐa\¨Š ¥ä¼*šÝ-/šó‡mžÚÞŒë¥ýÍézI±æfÿ[½tTJ%"¦iƒÊ¥ )Z.ûð¶Özÿ-_wwSÂBSxBä$E 1…âHè4ƒb­¬Ð:…€­·­Ö}QµGHä)üúÌsš BǪMË*E׎uûìh)Ë’§ªßºU¿aLB£ÇTÈœU‰'„Œ¦2]ï Vü–Ú]-mžÝaÊ ˜¥raZ÷ºõoÎbºL8¹Œu託zªêÚmÝ.UrðZÛ-‚uoø v™\ûWy±rxd„Aþš¦eÂó•±Íñ1ƒÌØ?K%{qá´Îaª”Ž’Þ g6$ªW¶uÅ„%OmÕ/¨ËÆÝ;gÕБüô®üEl–˜?s3¼ì!Gø,©üŽ„ýg§nôÁƒyôüRÇjš®CBŽ ¥HQ*éEÖ‚Á"crLÑÜ¥I¬.4Æc©3Ù¤,Ô§,(pí©)ë¬^Ôu¬WtÊš(æs×†Ëæ®ä§r—£4älî‚—)Éæ¹;@‰']Ù¿€Û.ôSc)³ÜÌΟ¶±ŒB§ˆ³†|€¾Z18Á7ì6S` zòcCSÆ+x''dðrÐ%Kòº V•¹ð Ls³)ÄuS?ϪÏKßhz¼ÙË—LðÅÉ%cîî¶¹/QUïÁµÂáGß@Ys=6ЄÁ ‹%”KèFÒ@ê7]¼ûps±ÃO$ÂJ¦®°š*Ú«T×ú)âSì!ÍÉ…RNM ©ÜëãЭx€ìÿýg’—?ÁˆÊ”¢ñö–anª( JsˆbsÕSZ·4¢ûd¦bendstream endobj 2767 0 obj << /Type /Page /Contents 2768 0 R /Resources 2766 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2748 0 R >> endobj 2769 0 obj << /D [2767 0 R /XYZ 85.0394 794.5015 null] >> endobj 2770 0 obj << /D [2767 0 R /XYZ 85.0394 465.3449 null] >> endobj 2771 0 obj << /D [2767 0 R /XYZ 85.0394 333.447 null] >> endobj 2772 0 obj << /D [2767 0 R /XYZ 85.0394 269.6416 null] >> endobj 926 0 obj << /D [2767 0 R /XYZ 85.0394 230.1531 null] >> endobj 2773 0 obj << /D [2767 0 R /XYZ 85.0394 193.3443 null] >> endobj 2774 0 obj << /D [2767 0 R /XYZ 85.0394 161.0999 null] >> endobj 2775 0 obj << /D [2767 0 R /XYZ 85.0394 94.3727 null] >> endobj 2766 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F63 1385 0 R /F22 977 0 R /F41 1238 0 R /F48 1258 0 R /F39 1178 0 R /F53 1333 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2778 0 obj << /Length 3021 /Filter /FlateDecode >> stream xÚ½ZÝoã6Ï_áGX³üu÷´í¦{)Úì¶Iº}P,%*K®%ošþõ7Ã!eI–8,²¢¨9œß|ÈbÁáŸXËl*ÓE’jf¸0‹õæ‚/áÙÇ hV‘h5¤úöîâ›ïU²HYj¥]Ü= ÖrŒ;'wùoËo™äì–àËnnWß}ºùþãÕÍåJ¤ÆÈåûÏŸ¯n>\ÿûr% b ä|ùÓû›_ßÿHsŸ/S ûxu{ùûÝWw=[CÖWÈÓŸ¿ýÎ9œà‡ ÎTêÌân8i*› m3Z©8S]Ü^üÜ/8xê_…àL*+gd!ÅB†§ äÌ*©¼0>\Ý~÷Ëõç»ëO7xÿÎA~|±’–)#Iry^·«uS?<u –jk˜²BÂ[H 4Å.늄æô2ËZþQ¼ÐýC³£Á¾-èÑýË B8fmâu»ßæ°èÌîZ3—8³:Ÿ[-E¸¸X¶)ò™•giªâ–`ZˆåuGì¶åf[•_8—t2µàíãN[65‘5tÍ_`—r»€,“ÄíbÕ«6ø»©ýRiŠ"ð× »²~¤ûŒ.$<¼‡ÓÁÀ-·»Ká–Í×2ïi»§bæä’K–J!Þ Gøã}EŽNë‘ÚÅÌr`uÊ%&¶/u—ýÍ:=—UPе.мÈ]CÒS¼Ê¤Gæ^Yvï ^Wû ¸Íjºe ¹9Ù°q“ÀÂÄ#Ifµmªrý2oæê¶âMQwŒ¸©dB'F޹”¼ì¬AÉõ¨¤]æÍ&+kšBáÑlÙÒL»-Öd`9=h)jÖÖÍfãMŸVe]ÀÉ•†:š"y"å}x¤ÈËñb¶g ñ6‹3ý>Ñ…sºEóÃ3ò±ˆp¿4\é}'—í)‰;ËÀz“7ÙO¤Tjd?à’ wËïBpàÚwsºå€5¾>°á«°ûffs!0L­÷¹ÙWá¬Q4t— M4ƒ?3–y­µeUåÚºå)µçæRxÃÌàs´çDg‡÷OŠSŠ„é4oôGžDŒî —þÌ­áœÀW`Õû¤6„#T4>ñŠÆ „°q±À™ ‚8 ´çº øÞHð<èäܬ·2ïA´ÄMÓqWàóX€ÿ¨Ò×°]1k{l/»¶¨¡³:ž>â9bkØ4£KÕ€iˆ¹‚‚]8 ”`ð\vOs “ %‚±eUÍiMÀáч¤ã%-º9;ŸE0ÉuÜq7nêŠü{¥A<ÑjlÇ=&;¾|~*| ×ùrÓôÒ‚»¢Êîr¼‰‚¶…‡ôÞŸû’ù?À¥’h HWÄÖkÄ8éܲ|˜9¼’‚I{ìç³ݧ‘1~¯ûÀp0u=P€ÝÐ]ôs ÒæãFNüoÈNÁ²Û—"ÃAWƒT l[9¦$˜+¾ùÉç_Çé¤`àIva”a"I’é­†T1û;΄{*Üw•sV“%®‡¼¬zlv`Ä›)sEîxrž»žj†=9 Á À1{·} D5©ˆ708pEó ]ÉíTtÄáw·×q”ÐìŒÛå{Læ¿f%Xlh×OM¹Ž{f¤V´J®—O›l½ÚäQ º >£X¤»Lû”‰•xR¸¸>œ1v2£œŽ¹K>~b„D¾_Þ=3Ë‹‡l_u!÷iÖf§ÌJC¦¢ÐËÏšÕê´YõTÞ¬ž¦[‚¿ð4yeËH4³åÐTØä&[~Þ•uΞ÷{jvA*íÂÜî…n|f×. °Ù"(µ‰“Þ÷˜Ú…g”ˆN¡\§ ÈäÈ+˜øÇgUc3ðÆy͈Î(&y½ü1çîb¬‰ 8‡Ï§Î  •Pg뉎9¹º0L ص‘«+¡C \•01OT[h(#Q¶‡Éº+×!ÐĂîÈqp¾w¼Çñ²Ñ£°uŽHõ(ª†$xŸ¡d4¢ÏŸHù ®àAj¦‘°«Ø¤tiÅ’m´;(š;×\µsù©fiÒg·5 Þñ2D‰4šçêïWW!w ÞJà­¥á *ù'Ì(ð<ÃsÙúêCÄŠ‚ âž,0Ñ/y“\…fxÉhé¶Øf!‡Ið¢ ñYC>,L:ŽÏMU5Ͼ˜1¾Ûà¯Ä5 †O3ÞΆ$$¿ÄÁ°Q‡$*´D¢þíãD+uLŒ[@ÝlãË,RH´˜¤¾ŠÀ M‚ú¬Ô 0ˆŽ¦ À‚&²9¸… ÒˆHßäÅ×o¹f2 µiU>z¾Îê[TéÏC½]‚ÄÏÕaÉ€’8ÕÐÌ}¸'}ç4¹É^h6/ Š[-¶á²¡«J ²ñ‡räØîˆ5‹ÏVã &Ð1Í©ºÙ¢KXÀ4nõ+õ’ÖÆê¥ÓÀ„0x¥Ë2¤:L‘jÈÚ™æ]lË€I@* Ýy¾"Ñ _#`²Øc¾ü¦ ayÈ{UìV‰s`$ø¯yð+F`„0Â}<᜷I˜h‹@DßeFø0‚·/"¦òØ\S™äø«î<þ™$c’2Ú½$õŸ„÷÷ÁIåÁIÑ %ö?¡’ ¯Æ“´a†&3ÿI&`¾®“ä­}!N>ªŒ§ìt»‰=½MἩ­øÿ»lû߸ì´3¿i é¨sãýíÕ±ðþÇÛO3ëO~(?@|ᆠø/6VOÌô N:šô[¨tx„üCŤõÛë›ôfË7a¶Ý«Cšú¥@ŒÅî56Lý”Õûlî¤qôY{ô…i((N°mDzyÿëÝ¿>ýòºP®kH˜ëXßúº&ÃwMÝ6»®ÜoNý¤F†¿ƒ™+Þ³ø?ÿÜæð³"0å܉z_&€?)ŒSx8áôq?Ì9æý?¤E> endobj 2779 0 obj << /D [2777 0 R /XYZ 56.6929 794.5015 null] >> endobj 2780 0 obj << /D [2777 0 R /XYZ 56.6929 751.9582 null] >> endobj 2781 0 obj << /D [2777 0 R /XYZ 56.6929 565.8108 null] >> endobj 2782 0 obj << /D [2777 0 R /XYZ 56.6929 148.6739 null] >> endobj 2783 0 obj << /D [2777 0 R /XYZ 56.6929 83.9989 null] >> endobj 2776 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F63 1385 0 R /F41 1238 0 R /F53 1333 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2786 0 obj << /Length 1276 /Filter /FlateDecode >> stream xÚ­W]oâ8}çW䤉ױc?Ò)Ûe4¥,Pi¥NRÚh!aHhÕùõ{Û!ÀŒ¦+Bì“ëësÏ=qˆ‡áG<Éf*ðB Ž ÷–›öžaî¦G,Æw ¿‰ºZôþø“…žBJPá-VXa)‰·ˆúÃét4¹ÿ3ð)Çý+4ð9ÆýÛáä~øÕŒMŠö‡7£9Ü¢Dãîgfv2¼ _z£EV3u‚™Îé{ïá{1ìàK#¦$÷Þà#¢õ6½€3ÄÆÜȺ7ïý]lÌVvQÁ™D\Ò°ƒ J< Ú"ƒ+$ezgŸ`` Úm£,Ú$zWÚg\¨ 6±ã“6ø•H„Ê«#T,~£44ÿÊ]”먴㩹Fq¼ÙOŠ"),2·×‹]æ;‹ÙæYœfÏfØUÁÜé5 ›l™ Å9µù1Ø5á¦òó÷,ßiq\7ä3`P0S¢‹g»¦<€ÿzÄsÐ—ß QÕ z¬Q-Öª pÖÀCùAºÖÐÀt«¶ ²Ù ™E"„ºè€:‡ˆ+Á-øz4ÿ<Oã»IýP»ÄR :’m‰!‘$Â%[×*˰-ºRÇE×Sß0Çãék`Yìžx0ḚV†5Ê€eTOMüáõõ 5à|çbŠÃŒÖ¹ï²ökž ùJP袢Œ F#«Ç¯ó;gêÒ Geô?˜•¼ >`"ÍçM¤FQ"€ä?ë°Éu‡fûÍHíÔKÀœ( ˆ…=vrìD‘þH̲«t4ÜáHˆŒ )ø̧%#‰pޤ :!h‡‘¡V“¢V‚ªÁM…ýBk\cò•0Xû|S6äÚ&ËT“Ø |ßGY™–ïíPÛ"Ùǹï꣇´Ö>r‰· èí%]¾XÉF™ùód5¼/ôr•À‹–Ћ|_9‡ó ½¾¾&YYçÛw3°rf“ƒ›î\gl6 ˜Û5‹fÇ¿¥¥Í)Ë;Ú'yM—É/˜æpvs;š,æ'Ç'«ÂBD¡—›¤‰r§Ó&©Qze×âHËRqvÒÍÌ ±‘„:_N­FuäÖ²m˜ %°ÑJn¬)×jYGU­€ôU³q-­ÝÌŒH?éwœhhþ´¥‰¤pHd¢£õ[©ÁY2¤$´0ýb^élÌÊÔ¬[ÓàVÙ÷ó¡_l.Ñv›˜—rG.@–`ø¿”‹tç‰Ü¾¯µ‡Š·û¥>/j÷Aç„¥8bú+ࢮ ó²r ÚþŽƒ) ª..YƒN×lÉm! hkÑ…Û°1ßf»×\Ô7©íèÓuþô^šJ5NÜN=gÉ>.ðOš²:Ož‰éÝ;£E!8?cD]\¸®Ü¢*Ä@w­¥mžúq„9jf|r^05xÉ÷ë¸íÒo»´,“ ûFCÔv›Âµu~øûñð Ç\ÐÎzÖ,*â’ÒìÉS¯¿4OsÿH ¾Üendstream endobj 2785 0 obj << /Type /Page /Contents 2786 0 R /Resources 2784 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2748 0 R >> endobj 2787 0 obj << /D [2785 0 R /XYZ 85.0394 794.5015 null] >> endobj 930 0 obj << /D [2785 0 R /XYZ 85.0394 769.5949 null] >> endobj 2788 0 obj << /D [2785 0 R /XYZ 85.0394 745.1845 null] >> endobj 2789 0 obj << /D [2785 0 R /XYZ 85.0394 713.9707 null] >> endobj 2790 0 obj << /D [2785 0 R /XYZ 85.0394 651.0924 null] >> endobj 2791 0 obj << /D [2785 0 R /XYZ 85.0394 594.1009 null] >> endobj 2792 0 obj << /D [2785 0 R /XYZ 85.0394 522.1893 null] >> endobj 2793 0 obj << /D [2785 0 R /XYZ 85.0394 462.2329 null] >> endobj 934 0 obj << /D [2785 0 R /XYZ 85.0394 425.448 null] >> endobj 2794 0 obj << /D [2785 0 R /XYZ 85.0394 389.7845 null] >> endobj 2795 0 obj << /D [2785 0 R /XYZ 85.0394 358.6854 null] >> endobj 2796 0 obj << /D [2785 0 R /XYZ 85.0394 295.8072 null] >> endobj 2797 0 obj << /D [2785 0 R /XYZ 85.0394 238.8156 null] >> endobj 2798 0 obj << /D [2785 0 R /XYZ 85.0394 166.904 null] >> endobj 2784 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F39 1178 0 R /F63 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2801 0 obj << /Length 1767 /Filter /FlateDecode >> stream xÚµXÝsÚH ç¯àíÌMÙî‡?iBzm’ ä¦7m³€§xM±)å¿?iµ6¸×vnn2´ZI«•~Ò DŸÃŸè! ™ô£ÄgA?+z¼¿„½×=ád†ÐðTêÕ¬÷òJEý„%¡ û³Å‰­˜ñ8ýÙüƒ÷ŠIÅ`‚{“éÅðúÝèbx5yÿp7ŠÄWÒÝÝo.'ïCpYνw£›‡Ñ[âÝ {=ž>ÍÞôƳֱSçWèÕ—Þ‡O¼?‡;¼éq¦’8èïaÁ™HÙ/z~ Xà+ÕpÖ½iïÏÖàÉ®Uí †àp¥PvDCо, yŽ a¡’ʆc:Ó¥Fo§·xÐ’'1äý¡ YìûVz›šùGpÿÄ RL·{™{eÑî:[g€1•0ß§£G³ëÛûž91µÞ]ÓiÓCU뢢ÅEiªr[ç»âxšÏ”6§ùW.ñcÉÌ«l¸*Òlø‘sùm·Amë\È‚ ¬øMZènßgAL6Ÿ²n}”2r²µó¡FÔg}p¼¥6z›ÖzNËÇ}–ë¹ÞùUo«îé6–“›ËGxz0å¦Ê«§8U‚Eq¨ú~3? Ã.\ ¸³ yß‹„!Â'&,æ|ÑQ­ÔYй‹ýË+8è¨>CÃI(ž®—å6¯WÅ`ŠÀ«t¶0tÜ}Øè†àr<½¸ŸÜÍ&·7?DÚ_!„ׯ[)Š·’ ÅÛrúÀ\ãF]ÒÀODn²õnž›å3E±JhJ"»%­³tW‘¢"´ §×£ßIh6¼¦ RûUž­ì¶€‹ìµ­I X o]š¥EÐõ*5 å¶çùRWµÕfY¯ˆ¶P;\¥•Ûr)³‚,ûœi†=!ò=ð[ІƒúwÝ!'â1¯«£¶ ®‹9k¾´æ5࢚e5Ö€Ôufû‰–$ø¨ésWÙÒƒÈ[¹¥°eõú`¡à,¸"µ©ÁuJº…®ªté ¥;ˆ“©ó äJCrY9w»àaM¼}Z_Œ^%<½Ø€îãZS…ïs›¬y°ìšÁåÍ”ˆ¼Ø¬uÚã*ÖÚL˜”±59[åˆ:€t­ QØ¡ ß0 ¸ÎßᨄEøªØ».÷ÚÑR‘Q6ò…jt$_¤"κ±Ú\/_çõ¡q¢Þ·~¸Ž‡$–RGˆŒÞS£Ӟè‡Tà¢Ë/ˆÜ¯´¡MWQÈDÈ…0bm 9¶)$‹ƒÈ5ž®WâIÿchðBQÎs”µ Ž©We¥É¸‘C`äÔªºlKÄ\”†öþCC—åý³p!D|ž§=J(ï8ØC¸õhq Ú¢V 'GlKp#öv¦#‰dA³Ä¯Ä"ŠUØtm3§c«ÎZ¨—¿Uίc·ËV½ MMkªª¬¢•^çFL¼É‚Â'BÁ¢ç,|¤?±ãP€Ÿ`õàš ,]s‰ùQ³í˜@·3v3ª`cÔDŸÞ.æ¶O†>чÚ"ÈE¹%Â5N{®õ®Ü±åŠxÔ1sqä•ÎA!ã®Vé¬+.ɺâV_Å>1éÁ"f ¤è”°Emh+%Q¨<"NC†ûû|½¦ì§È9™gA‘æuN\Ûçôh˜^d4!= IïŽ>‚zàÑL¼ àNÜ€DÉ ž¤9Àä9uS:mÙåm%ñ¥!vjû´m”J6ë¸3/mYŠ^à± ˜h Ûm=†eåÝ_]ЦÜoõue­ûø•Áÿƒ;µÃ JQÿAîzm窥£ê©}:ýfæ°™f™ÞÔi;_<6Ðl+E«·)‘mWC—»õÓ’©ò¥qx68,Q]¶´ÒOL/v&ssj×$‡g0¼ùϔ³¯©*ùî Oà Š'Nk^䤸t£Ô½^¸)ÙdÎËw©Ù¥ë €° Ãæm{Ñá€Ï’X('`“m²ŸÛóƒY°©ÖùeFÂ7Y?Qÿë7æ®ß.ŒR]_úxëßþ]ãø Ž1Çòø“Åéµd0P§ðr"Ÿ¹ÞüòÜ÷ÚŠ¨¸endstream endobj 2800 0 obj << /Type /Page /Contents 2801 0 R /Resources 2799 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2812 0 R >> endobj 2802 0 obj << /D [2800 0 R /XYZ 56.6929 794.5015 null] >> endobj 2803 0 obj << /D [2800 0 R /XYZ 56.6929 751.8011 null] >> endobj 2804 0 obj << /D [2800 0 R /XYZ 56.6929 685.5141 null] >> endobj 938 0 obj << /D [2800 0 R /XYZ 56.6929 644.3012 null] >> endobj 2805 0 obj << /D [2800 0 R /XYZ 56.6929 606.8498 null] >> endobj 2806 0 obj << /D [2800 0 R /XYZ 56.6929 573.7334 null] >> endobj 2807 0 obj << /D [2800 0 R /XYZ 56.6929 504.5246 null] >> endobj 2808 0 obj << /D [2800 0 R /XYZ 56.6929 441.2024 null] >> endobj 2809 0 obj << /D [2800 0 R /XYZ 56.6929 240.8182 null] >> endobj 2810 0 obj << /D [2800 0 R /XYZ 56.6929 150.6208 null] >> endobj 2811 0 obj << /D [2800 0 R /XYZ 56.6929 84.3338 null] >> endobj 2799 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2815 0 obj << /Length 1181 /Filter /FlateDecode >> stream xÚ¥W[o£8~ϯà‘Hƒ×W°µOi›i;š¦Ý&•Všh@ `FÝ_¿ÇØPHHºÒªRmìÏçòùœãâ`ø#Ž3Å@q$0Î&›`g {·b1^ òú¨«Õä·Ï,pR>õÕkO–DXJ⬢oîìéi¾¸¹ÿsêQÝ+4õÆîÃlñ2ûjÖž¦Šº³Ûù>IÀ€(×8»‹åüšÝÍ–wÓï«/“ùª³©o7ÁLôcòí;v"0ÿË#¦¤p~ÁFD)êd.œ±ve7YNþèöv›£c<&‘4!‚‡pĸOL…¨ hÄvkê îçe¼aIX&Ú-í1Ž|á«·³X¯ƒPÚcPT"?P¬A½‹hHü‹ÒÀ̶qÂ*6_ fÚê3Ƥ„ V0ˆì7‚—oy±/Óò˜qhcà»`©ÔA¬¥‚Ã|4Š0¢ÂëIh¸ãd$ˆZÐÐׯ|Ázx`8„Y†»jêù@q¸Û‡´J2ø$ÂM+MJZä¥ÙŽŠ,Ló1:¼V―›ùòúùþiuÿ¸è ï†#Å ³wp\‚tX{ÛË«(#n˜›±½5FÝd Ë6nsÓ°·Ë82ÓÂÂC3”qe×_ÍÙN q÷á H(!³fî*IKƒÚ´Z×±ëNAU˜q“Ä›¿íRҧ㵎xwàÏÏp—Fiõf"®±c„‡)‘n¼)š1*Íbš›14C™nóƘÿSä1úQ;{¾}y˜/VË“Ba£Ž+‚¤äþåÐì£Ú¼>ÍÕ…Ü‘R‚ Âú@k‡QÛðaé]%6ÅMÌëÙ¾aµø™F-}Í걿WŒ.AÐYÊ| [ùÁ”õP(kQÚô÷Ü<æ*$,/«îP#º¼AU•‚’¡ò¸¯„›×Ù:>è9‡ø‹Ò T‡|kö [°aÙ‚¥[çܽ®&”ój÷vtªÈÛ¥²Þï‹CÕÜÆ¸8óù ùÐ$•®"Ø'ä²éðtuÎêqy7óÈ'˜SæþJÒM2ܶi½úsýfÆÆB=i×sò;Œ,p7PãµuHïÀ›Â‰þ7ÞI1~êTŒ×zgæPê¸}׌¦ÐNÚ`Lm⇠‡Û:­çÃKx°%ÿ {¨ aØ¢´A½7á$5,ø@w‡Q>ŒC†H ´wùÛEb¯b†TQ°,ÜYÊÒ,.Ϧr™õÎfüÚîîãžÅÑY^Y #X\æµ:Ïk‡Òž½¿­Nuw€%¿¬·C(p ™"¥ †š;N­ †_ÝO ªáºÇ %è¤ `Pc4–ÃÞh>7'g_—æSçû€«ûÅÁ+{,ÊÒ<-+»6žãרV’5ë!Ìk¸øÓÞøQß÷móðiÄÐ. ³€çÏ×F¢ BŒõ"ZRA,zœ m-WG<Ì^VwÏgšÔ÷9¤XÛçiùVVqfÃøÒJcZgçZ{P¨ûñ‘(Á…ÿ»íÿmÃĤ¤ãáÆ04÷ žjk”vŽÈàØôî©íÿ+˜*Lendstream endobj 2814 0 obj << /Type /Page /Contents 2815 0 R /Resources 2813 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 2812 0 R >> endobj 2816 0 obj << /D [2814 0 R /XYZ 85.0394 794.5015 null] >> endobj 942 0 obj << /D [2814 0 R /XYZ 85.0394 769.5949 null] >> endobj 2817 0 obj << /D [2814 0 R /XYZ 85.0394 748.2826 null] >> endobj 2818 0 obj << /D [2814 0 R /XYZ 85.0394 713.6257 null] >> endobj 2819 0 obj << /D [2814 0 R /XYZ 85.0394 650.6518 null] >> endobj 2820 0 obj << /D [2814 0 R /XYZ 85.0394 593.5646 null] >> endobj 2821 0 obj << /D [2814 0 R /XYZ 85.0394 521.5574 null] >> endobj 2822 0 obj << /D [2814 0 R /XYZ 85.0394 335.9761 null] >> endobj 2823 0 obj << /D [2814 0 R /XYZ 85.0394 275.9241 null] >> endobj 2813 0 obj << /Font << /F37 1042 0 R /F21 954 0 R /F22 977 0 R /F41 1238 0 R /F53 1333 0 R /F39 1178 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2103 0 obj [946 0 R /Fit] endobj 1939 0 obj [946 0 R /Fit] endobj 1598 0 obj [946 0 R /Fit] endobj 2824 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 2130 0 obj << /Length1 1628 /Length2 8040 /Length3 532 /Length 8905 /Filter /FlateDecode >> stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅ呿‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.S5U =¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 ~"ÅVöè=”Žòíí`õ§ï3t;k‡–Bf?õ[¼„Y®¤¾ša£„+gl’ft]ÎB‚²w3ë‹,£ªˆôkêyô’­úÅ>¡ï„móW¯µrÅý¼0Ï”dË#»§BЏÝUJàžuÕñÆIÍôaòÔã·×¸§ ™ žL¦€Ädô<­cË-8àÒ—£t‰Äº4ú£|©D„¡¹šŒ]¸ãÏßE¯¡>ÓR·9xyôöŽ[Ìï`º~ͲûDœ¨'ˆº5e[-0GMÓ=KÊÊJþ&â&’PøS¤8ëãin,õ 2PU«r`ZÅÄí¢v8Q—ÁèÍ ×ë¯oã»o[2ÝO2Ó¾Ðm/Ÿß×Y¿üìvV¹"_=5Ó›é¶è áaÖ™7þv|g “y×&"YæЖ(¾+ÐMoûÁ|°>›à¦± vZÎI ÏW´Ä%^‘›üˆ¯­Ú]Ö%½ZÆÁ_Ï@ÄRdçÒÄ9è©‚†õ‘kãC¾¥HzõOlnÕžÝÍà™>{óbÙ7U^|ä-)G? 8òÞ¼x“mì¾%ÿjã=!•š[žž;[#ÆŠ™ éJ©/A%Ñv–µû`éióöíØœÇŒP~^z•çQ•7˜¿\扯â ÈÛ.|âùúÁèéᙪ9 x°¶`÷V¶v™öÉÝçñ–%®¨eßùbU€|;0}õd¯ºGŠŸ¡*ºS{…Oi,ÚŸ‹í–0M¾U_jL¬@qª?Ôªuo›`ö@è­Åû-€›-0Múp_ðà*Kþ*š´ll´8ðc©ïÑJ+cCôcr÷®4$G¡ŒÕ<;i¨Wi Ùªµ‡ý^gµ£¾ÕN!Î*{¶£ô…ÆW5'xs ^ÅÍ&o`Cð¸OïŠPÑ©4e¼BÃ9jÝ’N7t’2_M´Ô¢äÔ¸/\ä_‰¢{\”ñw“Ï‘qú\®û7«X­”ƒÞAÁ¥}Æ ¸È÷»Œq„z`²\F棖ûEœ!~õT¦¾\Ž'4/ýCîe– 7,î9tãÒ¾Â1 ¦’·IM^y/¢˜kIm;˜¨½}O«•oÐHâ•¡Ç6—]í7ôh`† J­TÂcweófœkÔ­—ÕRÐÓ(9%Ö¯c Ó·_Ü€¡èüêr_7ýGmÔ&œÐ‰lÞÆŽ Kê#TðÖ†§øñÞ ¿šûDE&ñžËœ^QH¶!’Þ»¸>àáÉà̹ç$ÚxþF`Š×Í4IŽ@N@ÒÖ>_9²J¾ÃEúOêá˜/kIÉu~~¦r–æw0§øF¼Öë!ÅÞÍ<-Ñ:yLj]óC&üwÏö䟃!•“®²h!¶‘6òÕÝýOÒÑéÃVwc1Ì{õX/MHÕ¼“øÍT(¯m­)5~Þ÷ú?É6nðýYº³`æj¶]`.Ò’·Ã‹imzdëøjXJ[”˜OX8wâê^ÞÔGÓö†^& ÌèWZGÅï] ðÍ}Ù ¦L5«ûrkÎw¯C3íñTS‡n‡a†’Í|­ïDÔR”ˆŸÆþÚgòý·¯0,‚…þ«dñ6›ô@‡Úò ‹6~ƒ uÿ'¢µ?s_¯Ð‡öÿŠ˜'u BêH—‚?ý $OíœàÅ€DÈåìØµö„÷¥½O%©4žñ­¢¯‘ÔðQ±¡8M”¬|â ãhƒÂ!ãëaž!ÉÇ86e}YÐ7IÏWë]¶Ž`…ÏÜ&ÂcD×rZ‹î”…µöíòj—«§ÐŒô6ZÑóÉÎõ»§ ÉDd߯çxãT  4ã¥éÐ|ùw%h± V–¾tf°‹ðÃ/ùäanЇhµ•]ªU•²ÆfÑhª¥Hm9Ôaêëô¦É’T›À…á/‰¡øOõ£èî.êš;{?W›¥~#ÂÝGÂÚM†ÑÐuEh 7m[E†lûÌì’ãÍcT±ˆU,ͧ˜¤÷Ö„½wú°aV.¯4žg®r ¯R«©*˜"‚¶±ºž¾<«0ÛÍÊõòÂh„Û‚†½z«Ã÷îîÛ²±žˆ©Ë_>)FMÁ¿EIÕú®´ËRÉs¡bÌo™ç-:ƒÒìXÖS¢ªÈœ‡(2³Ü{Y¥1³$Ê&?ÎIX>µWÑЃšÍçnPÊÉLÇ@¼¦‡2—­eýS¬+‹†^WD£gu¦í÷ùBü]8¸ïOÔ5mVl³Õé”VË(¼ÛmN^nml ÷’ s ÊõÙ±…- ™x³àiΛ*µ a1ןáu«+@Nñsâ),#Gu-/JÕ¥[òmš¬»º_ä>TÂåg?âD"gCó5®™,ý’ «gº%q\Éw&áÙ¤Û‡ø=rM±‰©þAÓǯ{Êò¾fņWÛ²%§›s¶J¡üêí;7¥ÒÂ"¡äÉU’wlQ-OfÌÚSá\Ð*¡BI:àà¬e’,Ï—¨xF)f‘ý\0l±÷„½Ý…ÇvãûÁ‚„@>:ûY´ÈÃ÷µ[e|&.$UÎ;M“íj¹ª_¸=*Þ äSó«—M¾¾rµøds‚ïP‚Ò*’÷Öåß `2¬„ šêÁT^£„J’¢¶¦ž¦Ÿ+õ¦ÐÛc8ÎÍ(¢•ÉÆOûX™rZu"Â&U =oöE±êPy*2ßî"VåÖTú•¼Ðc&úø¼-ÿ{ÄAÊ+jV•f³þ¥œÃš°8ãö©Ÿ· \b,>ÆÜ—(hwÌ©¹û†}ÞwW#3?¸šn/fƒ´ÛÇœ¥Ÿ— ˆ¯¼ø–HÕ‹ ÷S+AL—£vÊÑQ†¿«l0v^£žÁJIL”½}ÓÎß>ÏØ&é(üôãIßv0Ûu îò'+¢gôô÷Fvˆû§BôYO ­g©qq¯Ë+ä(ÖGb›‚±›Ì¿xê!±ùÒ‹§G >C{(©¼Ê°nwð,K ?EÚ7þBq&‚´”jɸˆ·?è¦ú-ŸCØüƒ%¥uXcýøââBïÅ ´;ÁµÜ3höŬ ¶÷Ét(‡„šœì :î´cØ¢>:ƒ‚¯úò‚#ÑǤ_VItSÏ$ëŽ`ø~"ÔܲÜr$ŒU–Y7÷“ø?¢ê¹iâ¯ÉqÅõãÏØISª5ñ4Â…èÑb“EÝêÑÑn›p³ú†-.ä‰ìošå•Hû~B»ÎÂî‚T§Z§Ï_)©OqÓzèß÷>ë˜Ê;­dpI¡rr1ÛA öÝPî2Pw]¶u¢èúä»(£ý/޾ªˆ§þßÜ¿~&æ[1¸Aé-KžÚEО5JÃ÷.føzßwi°h“bLñB³ß6ˆ^ñ*£–—qº'À°´TÈ8‰ÂWÏõ—„ãŽly&V¬AÕ²Kò^ˆâ½þÅY;/Vwúí}<÷Gc…R“#]›gùDÏ råV¥k¿½p¾Õ¼¥}ÃvGšAÐg•†7PöвS ÃÐÙ²¶©HÈ  9^©;¢Ìœp»Ãm%{r7E•€ÏŒµÂE±…ʨ*o,„ó QÞúʭ䦀(ô$íªy{Çgk9©‘5Â1ª0Û˜F3ŒÛ!s0¸4XàŠú#r¥Æ2á\8nqå°Ãs}䮀„s–è5)q…i¹C9ad¼¿`u ^<‰2@´ÄR­×$âÆ³—xº>áÈïž¡wdª‡}Té†×ÎÂËõ€Èøt\1Ü~‚9 ÿ½8ia D9©ì"Ð!gÑßqÝ ùA“ׯøŠ‰§j_dI*¡ »]‚ÄÙªAÓ8ﯙÎd@Iî?_ɽŽbÎJÊ8&1ß’bçy·ÌJü®J_ƒ|¡iïÂC®¡L;¡Æ–=x8"ÆÝù\šGd'—®®ðÖ/B¿ÝÞpRÆ'µsñX'MÂÁd;ŸäÕEûtGmý«†g¾ ¿¨öùWí},¾Ï†Ä›tÓk„fªõžÑ »›&oô/L¿ÇGìü²•âBZmÎOw݉Úñ¼>–¶ü^ÝvšÉŽHk6Œ´­¶DM0¦›}Öda'¨šßo·é˾xWp¼311ïçdϘ9óÅ­Ô§?¯jò>*§¨¦‰Ð:’-+X}7¿$ÏL\œö¦nD™ðì¡ÉX˜vWŠñ=mç¡|'M}„ç‹çÄ_’øÏ£÷rci%Åës܃ ¨ÄÏ,n±±ˆ" 5Ù½6ìÉ6úQèÒõmެöó–à+q®Æ¾ùÃ$ô|Òî]¾öÒñÕäË&æèñ²€Õ„KfVº”DfƒŒåZóbúä`#öZ·<Ò_Ç÷-¦ªÏôª _˜lg˜¨Î>«ŠTÂ70¡ðW~—ÛC!_ŽÎr¦x‰|„ŠúNx‡<7M–/&×gaÅj[²Ë±‹4—À¤ÀÖO–|¾1_JSw{ðÐıDÃP~ÜFY­Yy³]ˆ:¬aÔ_|žjÓM+ý­‚0@îhÅtÙl¿Êgšê…µAbDå·Ôw¿þ}ûYÕ×iîBÕ*jòýZö˦ÏN’FéT/Hn±úÁÖ“4ÑOEìØœz~Ÿ Þ88‡á ‹w|q£ªšîFªãÆÇ TT>/5—䬽%‰”dðqÚnCÃ%Î4ÃXDmeß:#ƒU¹Ø•l1~à 4±GL§%ÕëEЈ®ìÒ\;ãÛ8Å+§êJZdº×d¡K©¡ZÅIŽf3zV#W•c[Û¡*_-߈¯Þ­—¶5k ª€º—,ìd¿»Ìë÷S/úò¢×Ž Nâ)uóÒY~ ]ßjÑ×Ù˜fšuž²K,tÊ÷“\'gy¿÷5­<TÏ4CUMà£Ægÿ3Q£8Nð²Ã‰ËzN5\/MØr®]SÝé}pæ§VD@™:]¬ÔË7>1ÌÈéC•'ÛEÆŒ!…Ù7aVì:ASQ×µ{|ãÇj9YÈ4Ö|m Î·*_íw4ø!D1 ñX¿Ù¤X•³ç t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹ЇZg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖ná²¶Ë0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•ø©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6ë¶¡²BSHQø×¨.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôޱ§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ *s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€޶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øÏ¸3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlމâXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿA¡õ¨endstream endobj 2131 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 67 /LastChar 85 /Widths 2825 0 R /BaseFont /ZKJAMS+URWPalladioL-Bold-Slant_167 /FontDescriptor 2129 0 R >> endobj 2129 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 /FontName /ZKJAMS+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/C/D/E/H/I/O/R/S/T/U) /FontFile 2130 0 R >> endobj 2825 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj 2116 0 obj << /Length1 1630 /Length2 6133 /Length3 532 /Length 6982 /Filter /FlateDecode >> stream xÚíVuTÔí¶VA!¤†n†n”.IéΆ˜f(‘N)én$†FJ Á!¤[:%•$.úÝï|g}÷üuÏùë®;kͬ߻Ÿ½Ÿýìø½ki5´8¥¬á–y8 ÉÉÃÅ- Òy¦§aáèha …«pJ핎 HÀÈ(ã ±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 ³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø×º(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`y}yyUö}»þöÕ¸Ù¤¶—3ô߉ôTáÖÿ8üb’–†{‚¼9y„¸Aœ|7rx¸…ø@"|>ÿ"ëo"ž¿ÎªHW¨'Ȉ›‹››tóûç÷¯“Éßhä`Vpë_{£…´€Y߬Ú? ¿`+7W×› ÿ~ûo ÿóü{é!Oˆ`zn%lŸš‘†¬"Ïéé—5úÐÁƒÑâ\\£ý:ß¿Þî—¾(Rf~QÂU;(zÕä5¾í|¹ªÌ¶ÖÛAæÈÜž ÙË£ò¡g}ŸO4ÏôNˆ}-lZŒŸöU/Ê{LeÓP[wm©_ó™iÑÅ=àà;>WìýSVz÷|R†g_«”·¯´ÖÞ"®*ØþÊ”°yzÂÜÕ÷±§»ýðîûUJöìW8Œbî˜øL‘þ.Ù”O uJåÊߪݎË;BbubÁï<_^Ë¿Å`i¢KÙÅy¨yc@–‰Ÿ'\;ø$·®Q;S-”âs/, 9D¦Ô#,9ƦïKv²±SÐúê¿»èçö‰%…÷²õ-âÁ]3ëãÝ“±Ñ][™CæºÊlëŠÑLü‹¦ëÀ¢€5‘ؽrô›ìç3üܰ˜üDÑSjÛðôä)Wï8Ž*öÜŸèž“3@'}~+ÏÝ6‘žˆ•Ø\Žpµ<züuÚ>AbåPóبLbZ÷a3ÒYÍEœVÁ= ¾‹­{·^®2<¿}5aq€©ÿ_5¹Ûðòµ÷>›À¥´ê$C}ÀXй­œÕ÷ji—û­€G‡/§Œdû-!j¹;Ë6#ÔÜŠ.Oé­×ôÎc´¼$z¾I(ñØÇ/ Wj®½"¹ßKÒÿ¾ð{Lš¿ÞH¥hԻí:iÓFRF<g] Û39}—ÞÞF™8|à0­‰å‚Ô"¦¯£G$¼ ºêÆIª˜Ê΃ .–Šô‹µŸE·ÛCqüQmæoi\7yªàmûŠJ…0:næÅÊØê®óÆ XeŒ`Ãé’_ÿî½jâì…”Êr‰ÇO„DŸÓÕ6xÍ·o¯lŠýP¦ÿÎ*5„$8d”#ÙiWtu¿÷¾žG= kŸoHÉ]˜Ÿ:ã3ùN»­g}„™?&ì b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP ‚ÌÆŠ} fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ ñÆ‘r¾“'#LwDEëЙ}`?—$-`¤¦ÍC5Õ‡ 9æ3ÖXïžÊºUFC:ׇ¸T<íàìe¸z&îÄŠù @Õ!˜- “Ú½¡…´cEҼŸýÍó2¦±h’—Y#ªªÇSÀìjzaT €Õx…^ÉÊ9%î5Fõ¡ƒ…™y ×±ªälš2$g$?˜ß{v€¢è§à,¯ŽÀnD£ÍfGªªSH4‡S"€ÚóôöóãNƒ^œ¤ä½t!¢+ÏøÝ÷n©X#õg«uW ³}ceS÷ö¸ïcZ¦BF%×# èS=ªbÁõËFñÁp%ˆ&ˆ÷Ñ ÿø‡@§{›Â§ F$ ñÀèHvo»Vüy½¼Òç³³”ÎjÁÕŸ,_Âh^§–p³/â#Ó„HÊÀç„»ûÄŒ[‡¤Ê»B8Ò¬’%PË ™#¹&}Ô7uo(à–îu•úµÒ95ÀŒ¾?ËêcÕ8—ÄñâθÑ,™ê:f”†.‡Ðà¡ÝõÁ41hÀ›3):«;Ícƒ·ú‘¶Þ,èðY½:Nç5u…QEð ‰rŸ–²ÌûŠ!&.ÜYâü×É ú;á$¤`×yme~b©@{•3*¹‡ô÷¤” ¥Åêg`iDÕ˜|)1IŸ\°êjñ˜Î™+ Ä&j‰wé„™–£Á{÷…á«-G3µ«®ô*UÅmÖ­ïè, ï!¦ öOµìl•yóâúŽàäç?MµŽÇ¾Ä팼®sÞÀ±x»åÅ!¼´œ®“X>ÒIÙ»—X,×EAœ;¯è%Š]"N?v6ÁnÁ$W¥0O«W4¸»Æ—NQI…>Äóq†z#ÚQû3]º¹Ñ ·³®pBk¾j0ĵ¹Žjœßç]ZÙŸB dŠÌÓš­U• ÂIÛ9ä‚·œãƒÂè©õß½n^(Á•Ýh´7C¶¦2„K~V')Ïï±^š}zTÉúÔu?£F-!z_‚¬šÉÉ/U‚og4²Š’.§N™EhôáÍÎËåÔŒL^ѽð¹œfCÛïPI†^ÔLʸðˆ§/çÓö±’¾¿Ÿ\S ³©»ï™ή0‰Ú·˜O%”çp×ù1ÔA?P(åÞ.¤gÔ> ó¥ªÕl^Œ¨­Ý)e»ò3Pp[´dbõ¬ðVŠÿÒ³Ü4Å+β&VÊBÔ eŒCuOé‚¿# U9fiêCl·\r«ÒzÃÐWü®6êb1~i“EÉ5ÚÒ A¦¹§üÑœNƒÇ=< l””íyIæj%‡¨äÄiñ(<ÈO› õ;Zõ}¾TªL’[î^åÛA€Z…êþHKJühØûñœq/fóÄf¢8³?€æ¢%K]TkcÑøKEÄL1‡•·FÆîšÃºåØ KCÂCkÇxG®ï[v“U¤Dx?B;/³j8Ï,ã)¢ÉÏù٠űZ,wyð#½Ï«ÛŒr>xŒWÖÆú|nòÚ¸ £Á'¼Û#Í5C²&g«=O(½m°’úb6̶˲G„¬8Uc¬ÿ]ºÍ¼¯7A•Â]Êuþ 0œL2ä+¦ŽÀª²m>us¶„*6ºÏ‰l¾Ü]"¶ëÑ‚æNé9´v—ÈäN¼¥{– ñ°iÖÅ«Hºv!Y %Šžî=ó]©8¶á7ÎR8v4¹ïŽÚw²ts`üŽ<ÏJÅûŽç÷­F¨–¸ZçI°~¡0ÿ00+38)XAM&H.ž:lê}èt«ÈÃŽðÑÔ†2OÔé¢S;ö ·¢¿O±N~VRæèІŽ@òÐ`"䉡âÚÞ Ç1gWÍçaÕˆ¬±³òÚ*|“ ML–"1fäV½C«Ç3g{©ybí Z) BVÉ?+¢]ìOdaòÏCxy&&üÎóØáå½NRºu8ì§$¥ýuÆEžÇqU-‘ŒOqv´£ÝZŒ¦Ì@F~êºa3>hŠ j-Š"TB«Þçú XB‹ÑN ‰ÌÙd%JWܽóµÈT¿È$ÿ$H~@²&jM¤Iòüé.‡¿÷ywúÜB½ÐÛŠFög„”p¾áÚÀ7sº‰&RDî(ŠpÅ3¯ƒgƒL«Œ˜–)\°¯b„îeý¡u1ì9ÔaºÔ0•i l]˜dÞÊNºwÚøw T甼T ­31&Óãâå"q è{•tjIõOÙ#u‰Uð¤û/qA©SˆËÕ[7Š·oÑ4Ʀ^žÔ™Q™¦¤îŠ»Lzò9QT1q†}«caK"ªQv[‘,P.£d¡ù:üœFª±î¤R=éY@A ‡¶úL9’00#†ô}à…Ú¬ëè¾>€à)…fbˆû†7sÓ¿×ÄÅ}ä׊³ÒgÍ¿?FІæIP›˜ké÷2è´à2|Ö§™¥£[¶WBMåtè³<èù:28¢Ä;Xf1S§³EŠ&´×å0Ä0d—5ŤÐ4|ylæ©@Är˜léË@È}±}µ\"òSÐd5ŒÓkùp ü3ʇÏÎ +˜^h€&9I‰òÝ3¥–\—qaâ)&J™NBb0šNí`Ò.'39ë4^€îg(}*v–õ d ¯òˆ¦:ôw.Œô5%µS¯sý˜?™g:S &«t|EŸ4îsFCÏ­ÉAgd«'geߺÌ÷hÛghj34€ž>æ€\û¶=ñþJYÛQã$ŠØ]¸ˆúÿÜ•~­¡ËØÖåú¥·üD7_ÊkþoùåŸ6=:ëëòsâ²ØÒêÊNraý?{•>Jô^ï(Ï%ZR`“Wû€[s|-ð®öü:Q°ø`qXó d=ýóá ÷‡ïÒ·e¿Qé;)1ÄÚ*Ê7¼Ø¹°ùnéû`îû¥µ.{_æÎ™$ŽÛÕä6–¥³Á»úcË Äþ$úÄüÒGyÆß쳈‚Ñ÷2@~»ÌþH‚D›X®—vÑ ât‡’ÆŸ”|ùfOûcëQ?U?’N|bk¾ Ôt‰ò)MA ‡ç¨´‹›ÇŠ%î *ìN3zöû˜ Íð×90´­~âÜŠOg½`éÆ.æ%kK2œj/zÈ}âí;ZÑ‚tZ•„Œ±z‹D ÓNZV«ÊõBEí ýL¡T÷Æ{ši®G3È¥ã"y+â3’§[cͽ<å†Q@òæì+}·÷¼Íñ0þ’Dâ%ßéfL¹7®‡SìD nŸe‹ïãF cé¯ÿäφ=jýúÑ…fìÁµAÌ^He±œÆÌ€PP‹@Sò˜ÈÈ5D7Âþ˃¯íãìoÎ64ÒŽY›]l_o%а¤ÒÉSŽšŒæ©óAüŸhöUù»ÐyèvíS¬ÐD=ËOÃxýa“²I;ÊÃÖ‰do“LÈÁd<±~ŒÞg®¨ÙÏØÃîpðzÕ±5õ*¨2Ò1·2BÏ`«ùñG8nå^{bh…Þƒ1K÷©éVZ˜gí"2eF˜ˆA4”ÈTøxzrA¤ÚØ?ß]íÝÇKÚâ>/oA,™ƒÍßš7±2ÖõÒ%Ýá»ÆAüÄjLï¦#˜!elµqÏpj•žaîñæ"¬¹pÈ®¡³‘¾¬p_Û°~ö¬Yã$Ä/‚¬]‹>’7çWœ¶*CüGž§“0#,Ùâ÷4)jÒ-oï-Ž|?Ä-¹ùË&¿IµBžÛh«£ÞE,÷—TÍŒ‰ðÅd+pY´è´[Ñ[óär›¤–Û#.NkúLK õÀz?|ìþ…"Œ²*çÝ#Š;þ /Á¾Õ™uÛfxA…÷±øÊx­ëL1Ê-¢æíYa“êKá°¬†%õ= Ê\\ɨ²*‰)s,›]øŒÆ×!;ypÕãQ4ÎÞ0QÕÓôÍoúyAyuUç˜C”C”êØ‡o+Ê鼡 !‚Wc‡q…›—Á-®ä±s:£¸ùæf4#WßÐz½]!{ׄwETè ìyî¢LF׆‹úa‡õbÍ-dÇ&× Ú ö”bÇЃ 9µ³+&ì“[8Y)+TïD>ì ¹BÙ˜c¨Eü,„˜Lå÷0±ä+ƒ;n§ør’HN[µ‡ÚöÎ=úôÈôdWÌNP–t«ä¡iÿcƒ¨ðÞ "²`ŒÃ©£ÑÝ{(æ¸ËfÞ.Xçtri¯h¤½8òž¾³pKÇù\ëþǬÐ(oÈùÏœO5†wªÒÝäÊ™ÙÁæ)ÐúÃw¹¿Ýî\d?  å$µ² ?(°¡Âòr>9ð–u é '8°YÒ§hZ³”£ºØƒêÉÔöwl"éWißÈ8¢£_ø7Wlõ°ÙïLE ¼«/£â¼u‘&õ}\GuA+ÅŽö/E`åõy‘ʽJ÷íð­;z£÷ «¸¨oÞù8˨z»jI*Œ»æC®û,²M3noâ§Wïýœû0-5þ6ÚžàMÎînþ÷¨™ìÜrêU¯þq ‘x£´J60>y®ê$´7An¦“_ƒúµZ³+i5ºÅ‡Á) ¿{iR`FªFý“Sð™ñå»ÿa%€ðeå÷uì†Ò*à§œÅÊÎ9 |ÀÑå|,´­Hƒèn_ÙË%i·˜³¼Ã'µ+c% ü麖‘Ý@;¶zu@ Ëf#[2aPàØÄë üSÑò“ëùIý1›„túÉb¯Mˆ·gÃÞç+kÚ:ÙîSRc;¦ EKZªâ¤ØjU¡ª†z­iRûRž2ã ­¾~æ9 ¶hKI<üORdÑ*ãAŸYëêà“ºñp0Ÿéj<°÷8KgQ»$`¹dÌù4à|ÐÈ¥ñ„î±ÃäÂñœð*S妽.®R³+Õ„„§æ›u4ÝZ‹]Îó‰ú5ýíî9•Ôp"GõAìÛ²¨<èQQïg7 ,kŸœx¡ÊÓ,/0íV*Ò>xì€Ëøó]Â}ã´„I©Óës” Óšð±ßUÛôÖEÉ|5Ÿ®ÐÁÈ Yf†å?åõNöl sÊrO©XfÒP˜í‹ñ~øX‚­üÀ«WŸù‹è½¢§IË!›¨„q;·[ò'@‹9ªŒòÕÂBiÂ}—&Å‹þª7¤Ü<$Qj¥½€“¢A\©ø¶©šö}ùNm¢r•ˆÅ2~/¶^=1mê"’Ø$ìRÎBï"Öha¨H&Û€à;ÖÊ&K<Ëv|oäϬAF‘/ÜŸÈwÕFµ< †ævJ€®\§š¼ïô~ntG·9%¸M¤x½Ä¢«È5ŽÒܶ?¯ÈÎó¸Û™è]_Ä~l÷?Å 7`NKƾ)a;]¥%سï^»œSx5O‘uy·KEîÔßÇ (Z¢`‘®~VpùEaAzy÷UwJ­s÷Œ?´½‹š|: }ÒH»a‚º¾g)o}³=‹rrµM3v-ï€Ä@ Ùì'pÅXßÒ–× ÕB¾ª\h~8©$‰¼¼·ý˜7!g;É¥ƒ\®cf>}7›ùâžÐÙZسãÁÖ–Ü^-Už&( ÖËÓ»ÜIFÙØS­˜õOV_ºhýÐn-® X{$¢½‰¼û£@–rlZ™âɞˊ1o(­¶¨mèö¡Ðé»÷ÝõäIŒ]Œ_-ô‹ ¸Þû ò'zŸT¶n76Gت–·& úìIĆ‹7ÎÔ‰‰f¾uä3¾õˆ;)EO4,Źk&l‰#õ޾„˜¬Ù¶³ ½höâiF] ‹œx'´ÅfÊb\ñê{Ý?¬¹¶=ê3¤XTÕW©*®§‰\Ee¶©x‘@†Dz:ƒ!¡X¾ÂK ”G½èß>c{BŒÍCŒ±¹0šUÕ¼ƒ¿ªÝ•5xfœéÉU“Nhèòã»Z–$8û훎·òБÞåú¸;ß¾2~%~QÍ÷*|6οÀ.©ó¶H&l]ážçµÐ[èù%¥κƬ!ÙrOxÆ!.B˜“zuW,Ôêr‹9å™ÊT°CHÖ‘_e‘‰ÿð:û5r€û3.ñ4v—W”ò]ª[)ïó–äÙÀ—݈H¾ÌûùSޏ+¹ºfS4çHõ¿ÞzyàÂ*/ç%Šâ׻͠Ï8ôæãmº'7…\ì°Å÷K)8ÐÁ@£bÅî\ç±ÄÝÊ‚×[g“©»5é«ÅÖ¡’'¯ÔíÌ¥ºégˆ<‚â¢Ï8TŠqùœ_U å=¢¦#fœÞ*ª6í¶²*æ›\oi›–•`ûlj[ÛW*ˆ»ºœ2Ž(ËtŒp{ˆ¥6Í]š†}„¯>{?'CÆà§5zíEëÝÚÓÞ&vø¾öŠ ÷dYcØL‰8àÇÉu°à•GËÝšÎñtûëV²­ˆ’eÓëû­&KÅàჃ‘oS*.m•»8ÕîŒWQì3ÊDÌûj OpHY²ï®f>×¼ù‰_ôŸö‘Ƥ‰´»ø|EÀ’=PzêîXDƒ%½+C£ˆ1_ù¶‡=AýYœ:&Aaú;æ¬U¾öÝ*“ÍXJ·=à²ùˆ1¦¬ý<ð»©,|# O'Cƒµë“M]í¼æf°ºÜS4‡AÇ÷Mj€“Ò·ÐökxõÊáž™ËG‡ÞÕéú,óÔ92‚¬ ߸gp0o9)ÁM£«&ChVF=Vv¯ñõ­Åž¡üÜÈT·Žïvä(Ê´ãé¿7jzä­ ¾¹Â6]E³ÚŸÉÞeIGOIùç…&˜+ÊZ Sl© Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀñyœendstream endobj 2117 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 66 /LastChar 78 /Widths 2826 0 R /BaseFont /FLXFFM+URWPalladioL-BoldItal /FontDescriptor 2115 0 R >> endobj 2115 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 /FontName /FLXFFM+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 /FontBBox [-170 -300 1073 935] /Flags 4 /CharSet (/B/D/I/N) /FontFile 2116 0 R >> endobj 2826 0 obj [667 0 778 0 0 0 0 389 0 0 0 0 778 ] endobj 1458 0 obj << /Length1 771 /Length2 1151 /Length3 532 /Length 1712 /Filter /FlateDecode >> stream xÚíRiTSבª¡¬2©¤j=,Œy5„„H b,š0É 1÷†Ü’ÜK/7”AÄJª²,b£KFQQ*¬*u@©%Váp"­"<`ù,Rµ*N½`]]¥?Û_o½sþœýíïìýïlšG„œ!‚° °C ‡É‚`™LÊaòÌfSh´`V††( X8X©×î2Àæ yË„<>…‚±T#Ž$kàLŸ ñHãˆJ‰™’ÐÀ:²†J©rL…À„‘ DZ-X;q# ¬…Ó`<†˜@ˆŠàd¥°&4IQ5øo`HŸú6•ãi¤(à5)“H‘†j‚ÕÖjŒì“Zþ YS‹KôZíj¥n¢ü¤SÉ+uˆÖø;Ó¥ê 2 ‚qt*5~#NCˆ^75+%”ZD%B“µ0`p–3ÙËßàHš1ÀPB¨4@­Ô¦Á“8ŒBS•þMê`I$1AŠXïß¿v2¡DPBaL…ûödÌù#&Mˆc3ÙlI$÷ÛS”fbT…Aš ¸< Äq¥‘Bñ@& (l ³˜(FWéL6Pc8eâ_}Ø€¥…ÓÒ&Ð7°’'ftoûëÓ‚‚0C&c0¸<²{¹/àóØÙ"ªô8£Ääø½Õé) `ÅzSùmùxï©mÕ9âÊŽ£öô´ùæÃ[ÚÎm=iöcõø¹\Ã~PÀüê¼Õùcä˜SñpøW,HÍ륞eY2嬭ÝÎG7zù>ùŒª¡øÄi—J[[ÞÓØ~׺p µÁûÁžO蘭³¯]uï L¯¾yãå㜔í½V‡/!ÏÁbJBééU{à¨ÿÞ)¼2~?«Ä¬U—æÆï{êúÊJm¹Ý•rËÑ,0•Êì®›ý_ÌbÓ ê¾v gÊBkL‰`¥\8s¾Ïµ¨23°yßßÃÐÔ.ûef']Ðïa~·Kš—]-™w´ÜEU=OëZEµ…ëZÖ5ëÐ ùukò\Rê:¸þEœÔ†=´µIc/i¿.Ú1ýIÂóç=Ï^›¨ÍT™6îǧE{ûîL÷ò¢·±©öW?³xÄ*5_Ü%Da=+L­ºöe5Ê@Œàz®Û#ŸyZ¹”{Â1ÝÞ²ÉÖyÝhÙ/6Øb/¢öU<üùb³i?7QדtFqÓûRMýùÊךüé –F‰¤rQãL¬»?h®G€ë|¿ÙN¢øÐì´^è2ÞלÍrá-8&ô9ÐõÂoð‡âHKÃðaŸ9öƒ›ç¥ìdÞW,ÍôýÅî\xM’±Ã·æ„åû9KöBŠ,Æš½)Ǫë·éŒ³öÔ=䨕e}"jüN]Š‚Z¯ðO—Ò[ië/×<"œ #žW$1ñØÀ3Í-(ŽËLçžùh=Ï/>ùUWÀᵫ2wm|ðèæòÛ×S„}ÝýjªøÓâœ×[FºCõÎâÆ¶8+z÷¨ùö÷½ˆ óÙƒÎzOÿ˜¯4SkÏÿgtÅ×Y­Èdkc½ lûÆiPS…®Æ¹ \ R&{YÝ-2×o¥OÜQKSªi›„ zy¢²8Š•3н⤱j´BˆÊKOi—ÚL»=}ôq±ûÀS|Ó«aüú²Pà­òˆu#åãþw:Çõ¹®—‡ Ú:½L¦–½Ž“ïIš«Î0:æd4v–Ìs*33¼¶œþ(ósî§L ›læà«¥Ð7¶š¶m×\¯„E9ê8›£î³#1íyvïf¬¤R?AM‹kG ûjÃJz츘ù~¾åŽW”{‰¸ø•mlTí`›miü!®Ð¥AÕPgÚ}¡¢ÈñÃ(m0^¢ÈSµÞJܼrHV[|—ÃvÎAMVQçìü¦ówlúÑíÑ’tyù—ëÎñóÒ£ÎJx½³¾õ\X¨! Ä샅âªÉwÅÝaYÏ¿{zÇ>ddÑãè3æ‚üçšžÓ¾eEÒ¡Ë¢›-»i5ÚÆª’üݲÙÕ.ëß u:ÔvYxÕÉW[Qï“Ö1êâÅ«¸“Kݾ6&rBºLC›We@èáf,ÄquOƒKk 37WTÔy}ç°&±¾ýZiîOh¤¼ž:ÞZ¹o'2—Ð:_(°›qïƒ+±Ÿ~“TÅï=/nN¸ÚýùÈšüÖ=¡¡$VtñæX7<Ɉ8”WI­écÿÍEùÿ‰*-¬Ä L§ÄS(¿ùÛŒ£endstream endobj 1459 0 obj << /Type /Font /Subtype /Type1 /Encoding 2827 0 R /FirstChar 60 /LastChar 62 /Widths 2828 0 R /BaseFont /FFXBTY+CMMI10 /FontDescriptor 1457 0 R >> endobj 1457 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /FFXBTY+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) /FontFile 1458 0 R >> endobj 2828 0 obj [778 0 778 ] endobj 2827 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj 1447 0 obj << /Length1 1199 /Length2 2269 /Length3 544 /Length 3057 /Filter /FlateDecode >> stream xÚíWi<”k2e$ûrYF3v*ëØ:a4v*cæ™1Œf±oÅÉV–6É’c/BeK´˜("„Ò¢T”,Y¢Sï£Nõž^ßÞoïï}žÏ}_ÿëú_×õ¿¯ûã$Åi˜é> ÆÒ@#QF€=%À‡ÍÄái{4ö‚d¶- O @WRr¢°¨àš.hÁñ, †Á³ '_6`‡gZ(2Bé  5Jû»#a`”z8€Y ƒJ¡A†N`€4ŽH¥€Ä½ “Îf@¦@‚*\;3`A cPȾ,á¼×UUMMý§mhhø„}G Ȥi€2´©ôÀÕl…5HPáÄU_, oI¤°VÛ¾,V ‘¦f B6$“„¤,MU¨XKÑ‚°JÀ„¯ê‡¡0@ÔX˜æZúÓè!´ˆ5!…FüÚ‘¨éL£±A[Ìß þÓFY€.J eˆ2À %øj®¦v ¿‚èU3žFŒŠ¤$<• FQH ôG0ñÁ Àb°Á¨ˆþ¹ƒ£Ñ‘B`> :’Ÿì$}ÛÛáY J(à‰B¢PhµúþX탗H§QÃ~ºÛã@@s·£ãŒÚZýÿð47§C´h}@CË@@£¡> uµeý¡Çw-¾Z±xÊßµ¢~RÚÒHtÀð[K–ßÛ LhVÄ×ÑVþÉoOgQ €ø9F^(]4Aнæxý_sÈ~ÍaŦR¿*ƒø& iÂö«ªP¡‹³ª …ðQø 5l¸_]Áoâoº_áoìf424ÐZߌ¦%$b),‚ï·Ùù.7ñë±t&eõŠC!ºè_0'_ ÁŸ2™Ð¡|…@ñ—¤–4H¡‘ Q<ƒøÃ° Ø ¤Óד‚b¿ïI¨D  ð¡:aÇ!¿šCMKͤC4^ÞÓn×s^øÂ–Ó§P¹ÆÜmö’þ¥Ò:ùóY¹l§¯q•çz»õ\‰éÒ–)ú!þ†æÍÈÂ" ÂÜ6IRo‘—vÚmžÞ„è™AµKe•ÌÉ{cvËæ½|ù‚»’±Å]a\"],fë’Ç«×A0iÙòÂJ^‡×ª†âËqS6ÔhG#ØN åw8‡o÷µúûUv{ðÕ¿]©löî¸aίó ÑΪ™ö‘v/Õ7j¹{MkÙ·¬‘´|‘X¨»[{_àˆz÷%WDÊû¸sµ“¢Ù¯ÞJÆ»,Wh+Š*+šj-yœ·NU ýRYöáJëáV~á¡æV1è@ ¾|TZç&iÛž¸d…ÑÝi¶lžƒÔÂå\8ïu^ò´ì‡œíÊ\÷lÍfBK0>1ÿF›–Oß\òeäd‹ÁÐôÞ-¡§5 ;yÈÍŒÖà¦`^OïwûãæŒÏöbþгR.wNÎ9î{qÆvßQ¬}IýóŒW禽©:Óæ–®63qÈëÖ[s¸ûÈKpnCS—\$æRµ„ÖÎÏÞn:noL.g™¾@IÞè~m5sûÌ âãµVw·òÇKd­üQÍk1%šDœ:ô„':YeV«Ki²0õažä½õ-z–‹|w[ûJ¾+qwÌÓ¼¥aO=ýMTÚ‹Õïí%q± “Ñš“ËjÒ0QßÒ½Òã·1_Ajbå(GPõº{µüB§ì¯g‡Ošéö²¤-ÔbdD³Áov7`¥K)F™/ÜT<>D“á®_úÑ‹½)[­V´fÙf™ç®+‹éµ5Bµ"!ð7¯Œ¬hÂÎ'{ Ë üù§¼Ý°µ„mkx=ØD7Õ¹Uo3§:1<k{Ûg±¯†ùYêAÌF¤ }ÐŒÎ-Kœúç±eÝ×ËB pJžÁÔxs¼ºßã£åÝá§ö” Å9C"Ù¿½ØxAûŒ”u:8A<ŸlEõAuz¤%Ägí‡×á¼OÄšæ½ßù¶ ±!Ø›,;²"ïvÄýÂI”2Å9EÚ^´ ;®þ—^Ö)¡‰r,Zp¦É<Üþ~½YqÈ–Ά-Y~R\ :q›_f³ÂþÁòï dSþˆßv„˜º¨%Óg Y6Š]ò/ë"Š®ÚÇ>3ÔŒv\~i6W¸’ÊGœ_Ûï%X`nÔÓ—!_•GÑÞ×öJÀxoÅ>ºá»#ãi<Õç·O8ìYåÕ /\e²çë¶::îúq™˜[%»$OîäȽ±nd¬?£wu\zå…Çh„9™ßl·íåßsµÍoT£/Ä.¥˜o<ÊïVÇ«ÊðF9J›½u ­[‡Ö5.,hÏ× ,—à¥Pí.·õ>‘-&·7-/´M¤YØr WÍ¡†*j±“×rE/˜è=908æd šxríJzä)ýÏæ ø6™W26Óu†bÏ­t>²Ç|ºtéqdK Wª1øïãçýí_ª;fϵh”E¿“îz<ËXiWê¨bøÉë–î}1C•p}Ђ­ÿÛ#nó'ÝnïBù–ÂÓr;>ut5õ½Rsi/s¸‡R™í1f~RXJ½`lßu–øŽØà¡rwù}qw¼m8] #ÞpØê]þç–ÏSÏ$\Ï;Áö¹ëW›'ù´dWÙ¶ˆ¤Û¥‘ñJ[»“sÌ÷,˜íIV‘Å[\{f8ÉÈOùù"»úNßðeÂòa¼íŠWL•T°6Ï·(ò¬wîßþ\Q6¥ÔòE.³1}¯rÅîb£yœ ŸÌè»ÐÆ ˆÎÁ4ŽõÃ×ø³–sÊø³²AâŽ3ÒNŸžk—hœM?™!‰Ý‘zb¢•ÞUt¶qLLþ]ªòÓjܹ/šî‹^ºE|¸SΧa®{¯ñ1í;ð„û¾E Mš©>p­#SÇÐ7 |1í#çã‡èCMAû;ˆ}Þ™Wb—Ù^“²ƒÎ:oBƒ¹ož»ßÄÙ¸Tœ’$Ÿp@ÑÄ_÷…_÷1Õ+±Cˆ'Û‰¹Ý0{½qBù"ïÓÙÆßŸÓùŸ^±¸i„ç‹"ßÔHÖ&íž8Ël…¨šÌ·Qõ³ œVAà£nwýóK°½êäåJ-·=iVŵe‹c¼M !|îÖzÁ®/àíR/d|*ïÙjvåZZ½Wæuþb?vž)(fvµ‡s*»f5/A;(ѯéb§Œ·ty|Aøþl"jŽüÊy9áXI’ó8·ûMU´n£|ÏÓ’1ÕÈ^ DtPSaITïAgŸNqK¨RvÍÇ'÷súé©¢Gå4S­³’å‚ÉÚ¡%À_¸ÞHÊúBVúÝŸªœÓc”ÄŸ_y|6N´¿¨îƒØ—­÷—i2ÝôR1žÐóå{:QoN§öñ{öâsð¯¢CÊîèèMÊÄL$ ›8Ĺ·ç2;xwÀÛ ¤ˆ“‰ŽRÉ¿O¿Ë³àh•èŽï³nºúg³eiSσkÛüÏ ÄÌZñO”;æá§½'»™óÉyâ\q˜ UFdUvf¤Ý)‡ê„þ*uŽ%~cÛç b4rMMhÒ™Ó:Œ$ñNÁ‘|½£Šg°d§jEÿ|Ñ…*¡¨]N*÷B7‘…2&ÒL)Y& ³G†ˆŽEÜžI3Ï.só¸:U~F\TzŒäñÒyI´¯”È_ð(ß–¢öóÙ³ìöã8ή «ÄÓÁ²¾Äé×÷y’û•ë ø7ÃËØ›¶¥—ðÖaï ʧòôçwI þËþ‚ÿ Ä3Xô<ÃÁ™Ðåê¿ü_‡…@¡endstream endobj 1448 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 97 /LastChar 110 /Widths 2829 0 R /BaseFont /JQQLHD+NimbusSanL-ReguItal /FontDescriptor 1446 0 R >> endobj 1446 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 /FontName /JQQLHD+NimbusSanL-ReguItal /ItalicAngle -12 /StemV 88 /XHeight 523 /FontBBox [-178 -284 1108 953] /Flags 4 /CharSet (/a/c/n) /FontFile 1447 0 R >> endobj 2829 0 obj [556 0 500 0 0 0 0 0 0 0 0 0 0 556 ] endobj 1384 0 obj << /Length1 1624 /Length2 11252 /Length3 532 /Length 12120 /Filter /FlateDecode >> stream xÚíxePœë¶& ¸Ú¸;Á‚»»§Æi¬!Hp‡àîî.ÁÝ ÜÝÝ%ö>sî¹uæþš{MMWu×÷®g­g黪¾¦"SVc1µ3IÚ!Ll̬|EK[cg';°<“¨©’±%à ø„DE%æB,íÀâ@ˆ 2ˆƒLìì6^^^$*€˜½›£¥¹@«¡ªEÇÀÀø/É_*c·"o–N–æ`õÛƒ ÈÆÎÞ†¼Qü_ª@ˆ`fiˆ))kË(Jh¥5R 0ÈhPv~KÅ oi;èfvŽ›&v`SË¿Rsb~ãqNö Ë73« Èþ/ˆ`r´µtrz{X:Ì`È[ vK°‰³é_¼ÉÍìþÈÞÑîMÃö {#S¶s‚8™8ZÚCo^•Å%ÿ'ÄùË·“å °3{Ó4µ3qþ+¥¿±7š7´; WÈ_¾ŒASK'{ Û›ï72{GË¿Ãpv²›ÿ+F€#Èèhjrrz£yãþ«:ÿÊðŸ²ÚÛÛ¸ýmm÷·ÖÄ` qÙ˜1#±±¿ù4¼ù6·#±ü5,2`3;ë?ä¦ÎöÿÄ\@Žˆö¯™¡{ hj¶q˜‚ÌXí o.´ÿw]fþŸkòÿ@‹ÿGü?ÒÞÿ^sÿ½Gÿéÿwïó¿SK:ÛØ(mßàKð¶eìò€¿ö à¯Eãà ú?l€¶–6nÿ…Õ¿+jþé_dÿŽÉ@€o囿µ„‰™õbK'IKW©²%ÄÄ`´y«Ößr °)ÈÑÆ zëêß}3beý7LÝÂÒÄüWù?ýMÿ=ö·Fý9‹š”š²ˆÃµ[ÿÖT~›ˆº›=ð¿Ýh)Ø™þÇá/QQ;W€€‰›ÀÃÉ àáfóü/<þMÃö¯³âhé Ðeefee¼ýþóû¯“þ¿ÑH€MìLÿš5lú6fÿ!ø 6qvt|ëîß7ÿ-éžÿxÈd‚´8ggò9À*9-R—50*®ÛÓÅön о¨N=?×§Ò®Ó;9dƒ·Ìè©*¹þßK³Ûì‘ýóŽ,ýîPךÎDÐY‘']w.æ*u+7î‹AjʱÖwóùuX.VÍÝÍQUƒÂ'xâ_­Žç¿é|(\r}p(ïìѼL’j£pÛ0ê¡°ªóŽŽ©ã~ßÑô ôw^Âuï2dF!R}vE¥÷qÈ$ÒÑ(ó¥”ÁDÖ‹ùE¾ìêê MºÌ©’}‹9YBbS™¶ý^Cï§mÇ4á åPÇgö›XpÈ´ó1ðegçB˜ú´žpDøj]Éy&w¢¥**g›×L·v醤Ÿ§œ­_öÓŸz ƒ·µÕ4Lm¯`o¼.W¯ú|ÞÊ?F€ñv. ©ô¼AíkLMàrWôêk¦ÈiÂ~éŒKé ÍKw¢ÏŸ‹ ŸÇý¼_ã¿ä²—B4ª¸¼^g­vªðĶŸÃRkÞµT僲õ£»ÒéðŸðˆ«)uoG%E="Ó)­“%KÜ_|й„È& %*9¬ …‘Ö¶v£†ïkGะ»jcøá4-ï㊚©éEŠ+Έ–®•„Ëô\ÈšgœÕss×·”¯ø—«©—!´¥2cí7Ôaý¦"!šÿ¢éïØ…tg–òî¹·þc|LDÉ\‰¤&ÈôìýYx’Kèùƒæ7Õxÿµ›Óñ«ƒbký:’s唪¦åi#÷IA(/CC”9ž_-­í• :!vV— žþœã®°‘‹s§)¸›ú¤J¢âÞ‹9±ú‰$cÙS¥R›Åa~oÝÿÚjŠå.Ö6X⟼°’G¢GÞ^3¤:4Ò^UÚï¿ý±S_¹´Dá{NË â2ÇG‡Ý-?±ŒX€ 9~C÷¨Çn¼Þ¿#¢ÍRFÒËh’x›+Vr•7.q&cr¸&zèñHcý=H–ºmÁÉ௳\œÝÜ•Gºt Ï|dn÷· “ŽÎ5‚~aã;õJbk¼®ùdž¼æUeÝ™R¾l1‰Dn%ý¹$c•Ö¾¡¾Š—ÙÂ×\îÙÃ[¾äœ Ów’†ÈÙmÔZŽwŽÐ‚?:¢´š2¿!6©sÇ‹ýá—Ø j:ê´Š€–k„ ^P"–{&±TûS!_ó²ä '¦†S®!L)ÿáxÚêè1T¶‹âU·Ç¾ìb9, Žê¨<þ°1Ù[& jh[„ÄÁ4*iPgkƒß¶ót16^BpL—R¡,Ç\f¿7•tµëùh\ýZÛ„xàk÷M4X±¡eS>‰!>z´J¾¸è†k¿]sè¢'_äÀêÆoG£5!¸³‰N¶‹axóhËWö+hà´ÍFY”@a\]œ˜™©X*þ<Ô–0&}ÿ Û Fj%n׋~_/@1 ¢BÜŸFʧBÑkß¡ªµ¸0ÔƒÜІ¿¼YòìÖØWkhÚ•‡^ûí‰)|Äh“Þå &6›KÚ¹J·ƒ»üÁ§¢2ïð‹Û_9¡‘1ÆxLð±ëÜs.ï&¥ ƒÕ^‡R]ËøN¼Š¯Ÿk”ÈJÐqí0Ÿwôó¸¡RK$çe6œÉ¦çrøiàK &ãêvG{gž;Û‘8 ÿó SâZñ,2Ѧ4㤠ÝúÝ× ÚBÙ1K*!Æ x é*„Ðã³%¦LYIß±w—ÀrMk¹3ÌÆåæÙæôËSWè«"\ïÒÏ‚-(l;2.Ü/íð½Á”rTû©¥[Ó÷_{a]ÆÓ¦ÁTºVähÓKö"׈Ûz~³ì¹›Ss­z˜È·TV•Ójj&è#:=L*ñ ¾­#Àq~P¨õ œÑûH Û  ²(é¸ÛæîŒÄâ@•EåÆq‰Û/Ë–|ñçRãA1lâ] 2”aeñ© Œ°ð»‘~Ü…Ã2ô¸ý¶&Ñÿθ.ëÀ”G ¬r¶¬ÍÚ‹ççjCB»+!#¯ÂÝÉ‹˜Žócm¸è¦U†•tϤ‚ ŒÁùæã”j¹“¹‰>þ_€4 øÑ—è+¥ïšk°˜\È ‚ó'.«©Æ}IsÍ]|šWOÎü$ž`]Ö\<55Á¯ûHZÛú"?ù¶ª-D‘1¢‰âg¢fdÈp:)#&‡VÇqIÆïµ— ïy›ÆÒna×ÈM4%¸qú5ìI5x“Æ9Ũž­2ÓìÔÎt¯ˆæ‹hçý¦ŸÍQЪ WD1;wÝñ© Ïßc_õ}ú#=ô¼ào5Hçßc‡›ñž¡L ‰/óÌ÷=õUͰ;óD¶D¸ã»áA\zÞZ®³EWß)ýVÁÍ>}œñ[ÊýzîÞev^®‰ÄÄ2ªcZ|„õVÃDœªŽš´µ§à§gw&«/KGA‘?)ß²ƒ}­î=Ý·ŒU¦}£’‹òú•§”«0³ÁT~MÞç±]KËïßâO«K#› P]¦ À²ö\o1~Ñ„x%q2¯MsE1ó63ŸÊ|ñ2mƒór.e‹\YÙÖv0Ìëé&jø¥V]ßw†òóiNRRÑî3}W­WŽXè?6(S\ ŸG !™ËÝÌëo;ð •›7•’[„4$U˜» aŒrù&ú0ÉžK’Ð쨿5ÉÆ"Kg)üýgW#èí®ÊA2#¤ê‚‡ã~ØBÁÌ5Ÿƒð§¼³‚Dï$>¢‘©«qÆb-¢A ¨§Z¢%IðP”‹Ý!ÑmAñµNoT\Ÿgë ÒÒÍ’T˜\¥qâ"–ßPÏ‹¦y&åx—Ö™-ÃD-§('rQ׬áŒnÑ®½¼#vƒ°¶#Ô{ÁS]tsÁ⨔¢"@…ôE´vì, Ûª*¥9N¹¼MÔsÇövsQ¥¾ç“A\v²QáûVoñ‹QÀBWýj+r|‰}˜)hß~LþÝiJ#:äg‹ôÞ甕¯øƒÊòŠE’˜¥gE nDä9~Ìv¼ˆÑ_+©½ãFmÈ×+*ø²#eûêY|—bdIéï]Á8…Üѱ“%»‰.í;OIF«9 Gbží«Î#g¯"s[Š'´è NÍM ¢Gþ¾í¼cÞ¼æçsÜ%R\¸±é¯n6³×ÿ+Ù6Ô„š’åÌ(zé¯ñ´²1å6hd#¹•O?»»ç$ªlÊ< KÝ¿B›1òb” ¥óxØâ"ãb×7’qøá1¶ù*f< 3$yÔÆ í|Ãî¿ÕÍXÃ!bç^K×ûeçJç×ëïëÀsN^+èeaD87^2mNGð^´—² V;ã=±=›ì?`s±ˆÚѳÄ;÷ïOy`ZÌܪ§ ½îÌ‚ð¤cU±çô -ìùG5‡‰b%ÎÐõ 7÷…DC³e&/Fs xT ÎéEôØb#> 㜳Áÿ¾{oÈÆÍš šWã¦Õ94ÎdA§>> 1·Ç‚¥Lº/ûY~Z(K¾\U„e0Ù ×q8nJç‹>Ã×¶è«›mEm nŒŸ"TÆ>Œq®”6©hrÈáè¶Îƒg¾í’ÓR~*˜…¨«M¦ œ¨Çµ›Í0¸ÆË૦8ƒ.g¤k õ®÷IÄ ¶…@!}£¢ÐÁ.ŠûˆOª®&•ÙCJV‰UÐèN«ÇE"#FN±œWŽHP4ˆáDP€dÔf­½ü#§Àë½KÝTmIG<«äâ)Y6ðC ³BáªÁA‹´œ/X©ÏÐK’ têm–BŸ›|ôqk£JŸYwçþ!ëò1Ð_V§ÛÀQRФøÒ²ÁK^%[F7MyC0ÓùÔ$%¿µ5稳½ñ9ìOؼ•“UÑö¸¯¸í£j¢¨¼½Kž1J§6,ߪ5m-}Ï»~áÃ(öçz?l³+3±úzöhÓ?óB£Ã¼¥?ùx®ˆ-¶ˆMŸMÉ-ÞÈG×1wù#êŽSÖæ'%î¸i ¡E¯›Ry “Å¿ÐKôb ˆÆ=/yå8X=&îóµðThl¡ºK±a"›’ vÁ¦ ÕEµ\.”4y·SWO…æâ…Rw}ïº{HT×LpyA ­W&·Û’%ßqBÖËiÚ.Ø"äìÕÑIdú¼—×èD>©GÍ6ìÝ+þØaîø)Éya„`¸{"ôÁì‹®i‘ëôtR›ì-—1ÙzÈuŽ~âÇy¼ã1qa=!sÝl‰â…Ôþð¯$Äç57åUØå,A¡Y¦“Ò¦l‹S7N°C+¯nQô}×jq±Ézòu”ÕPß8†W*z¨rôW‹½°^ú+l#ág õrÔþë!7rYéÝî“U>“ÝÏÙ}ƒ&d¡¸¥)ª'ͦ•ˆü÷ˆQsJøóŸôtŠ–M^ #›SÖ]¥¦iq!1¥ýLx0_ЕýöKvýí…l›,†3ð.NŒY‘ã'uŠƒS~Åž)#d±^÷UćÈEÚZÇÃØ$ é¦oþ>ßB"†³õ©Þõ,ÈÇ(‡é&/Çï“\ù'!*“ýý’]¦ˆ4Y ÝœcPZg׿×,°-§ÒbdQ…«0$Ûc¶ŒýÉÓ£_lLÏ_†N]Ó î¾2BÐÁÐëÞƒ"ÛTí߆¾Ó§·¾¬óÑðqç‹ô#»I ›5‘U5¢—¶!Šð‹ê|ÿÜYÁú$Ž ³{Õn¿âÐBMnÎ9JG<ŽO5Î ”‹®†‰,ƒ8®Z%aKç±³ŒBã6ð©#ÇJ#ë|ÌáÃ(w¾Ãrz\ËãÖu³2”à’ðb¥†þàâO‰ã÷|257¬ÆîîÊ2–ù!&C#¤Z;ºx‹«Ëì|wÑzWpÏwBIøý £¿uQþû~[LwS,¬°Ž¾ ÙâØóèYj2ÑÌÅ=ºO¯ù5TÈíšVl{Ç¡ wÞ¤/ñ;p{¶šÁò·­A<ꣽm/Û»ì´á*Á<¾‰æY~ÄŽø¾&¤ènvâõõâS¦z*EJ«¤Æ4ílñàñCbÚ¦ ؆ð+% Ó9>Y™É®î©Ûl71›½ Ôé ×á2רZº9é4~sÜ»“ 9—‘)Ï£þ£Â2M=ßC¼ðX* õ;Q ŽKò¾Ô„Þ£”ñièÒr&$›÷_$!—>öŒ X ,wQ*¬w± [ÆÖ¹ð—'4‘„Ú”¨ÏBw®‰Ê¼å,Ês”³*b9Ióô[˜¼ö#àaé§åJ·_7'E™j«nsþš˜®¦›R‡ºÎhJôJË"{ösÊ;‰åì5J‚r!=R÷(‡®Hf‰? -¥C×8öyë—õ=a 8ÑŠ( fÑQÕ¹fNÁç÷t]YU¤Åsâ?ºÿzMñ#§÷]RW†mµâÕ6 8dK0(ù-ª{´×·,9áßqNa›‰t—r깈NÆ|Ò8úèãÿgEŠdN:¬0pBT¬SJeI{ɪ;o0ËÞú#¯õ#u³ €PqLìv³íÓÏfÃí!~×W-þ¢ï Þñþ}‚­:¤er""ä¾_:ÝìûÄkÑÏ•ŽªNIà¼*i¾‹ÿ‘Û׿ ïεŸ&¬R€Ûj{<ã°OeÅ]íÈPyà`¡o½±8”ˆjŸ$wÃIHrÌÇUE´¿`¥ö‘p¾½ÐgŽÀ9–™ys¼\è®ýBü~ý*âÙošw\·R–êbå&v®ç‚ØØT°y'« TÚ$Ë÷¥Ÿ¡aŽ+ÖÝOÛÓ$èïïzŠpY’EiI7èø¸¸Vî4 —¶=Úˆ†î ¹&̉¨Æ ¹›‚k±,e²i»r©ÏšTò jïÛ/&çæáÜZ`’5*Þ!üÁ%”Œ µ-Îaœ]ï}ýaAšËñ¼„UÖ*kàHÍŽÅ4@÷‚èüTL¤<…}X{giâð½šÿ[Ü Áò«gùLC_2ÿ2餟›˜³y€zhT }ïÜ=wÈÞªìñÒ65¡°±N0òÁ’Ù¸?'¼ò´ždŒ!a‡ý4©úãÞïÕßr›ú›†mñãWxïHŸe°ÉW´åÕÕÕ•áµ›æJ>=#êD½ÒrêRÚnGÕ ŽHraza.8‚G’öHó½+G_ìe#‡bS²Ê­µ»2þŒ»÷ "ôk?Ã7´ WTáFRÔbÙø Æ(7Ä$™ò2WV±½©!Ãï3ãf$hâ“ͦ_¤xª:»s ÷4í–’ë>úƒÝ†¡”ºëç®J—Ù•¨\Yá‡ñ»ÿË)\=¦,Šê)”*Ü»¶ËN³þ¢äâ&ãå[& ÿ’¶{‹š¯—ÙzjÁù›ÒŸj£x‚Uè:bo~¿G5Ú>‰æú)º¦¹ã=¥ –¶¶æû”Úû8êÉvÑQ¤Tk(,«HžžªèÛúö3ê…}ùxAɤcEë P'L“Rî&Ží±Î&ÖÀËŸXeØNWµnÁé6™¿Ã–Cžøþ£™‹6Ð 7@çõ *gð¢òãGQUàúT^%õÏ1ˆ-Æì4.LÕY"ô<Ÿ½cЭöô¦w8J½µ©¸N³Ÿ R1R¦“7¡<pëÅ%ÄaQ©@e},Ο諦ð”<Ï+Ìk¼àï±@Ú¿Š¼Äé8UçÃÓ(§D`˯ͩÔ`¸Éå«Á¿§ ìõb©$C°V!N¼Jú¶®¨<ÄitŠ]÷šb.­ñ€{½.sÈ@vº—7špõ¨óv,xkh ‰ƒY¸eÌ&-D! ¢ùÄ,Z}ÝJúrq K‘¼ŸZj‡~Jñ-_Ìkz¯yH› v:eó—õ-ÒQ8±N™¥aÐÆÐsöYønrªPÆtž›Â,àP§ÐÇRÛ¿hkÈÌÚbBF=´Ðwi…Ÿ¼!{2É÷w?ýåñx«l?Cýtãì‰-ˆÄ÷×z'“ù:8ÁFb£.³ÈØt4É_rmš‹ÕN$Ô;øõ[&R–Ì·R’wf®Ç‹MÐŒÏEöìµÜö»ßpÆ '“4¹O<â+Œ % C‘|L³B²^¨*1àc~…œk>FE¯Úÿøi·öƒƒ/…OºÊ ðóg-™Qü=ÉüëxƒHê\Bd$ú<äÁc )–ۿ߀P[,'ƒjŸ˜¾&Ä35 Ö‘Uì³×»°^æ~†öNãå WSXæÛàÂ9ágNƒ€¹šôÓWžRçÌ Ñuä YuÃ÷i2š¿q¹Á”R;´’A9V$„ ±Ð {›Õ±èÇb¸G5ÙŠé¤Òö~'Tª*tlÜ&ì#ÄBS6Eä/êìÖUhýj«ol‹ÐÆi tó~¿JŽ^SVBB°/¦õ®ÝMbizÔ6…tïKÇV „«‡¾ N`ŸÌIÖ9Ùœ{WºJÂóø„¿à“ÛsDøì ÿ¶!Ôg ³é?Ц§ž³Ø©‰]šmz.«RÊ.¯Â“\£H彚‰üå}çuJü³ì&ÜåµOýþk·GGœQ„¯:¤òØ ¨\Nš oŒÖÀ—Áf¹1%a`$dè €k Sl´@׿h¥Ê*冷¨›6ÀÖ!Þ ÖÔb‘YÃDú—¸8¹ãï ¸€´Y*^åõ$Ÿ–—pšÞiàØþ й;ªéÀ&1Þ-Ài{ª¨'ÒB{ŠÌ¤ä©Á€†Ñ7JÞŸ=Àø^‰Ÿ¥:NÙû°®ô|kZã]‡DºH]ý™î6L€0)?ŠCó‡ïV%;4ô”Õ_mÕq–‚×*øà¼’ñ>Ô®€÷Q7Ì2:´Ó]›øƒ§¨­òdö–ÜÄŽHáR>#ÿôÅ"­Ý…9©âÑßEób{xˆÄª,JüáI@\mçš7éÎ(]‚ª12fÀ®z`¸Ùo³¾¿=Áù¸èvß™øAW “ƒ,ÚÃ^m1Ù`³•"Ø&@D§‚ 1$XÕáAñó4¬–ÝÝuäûØËÝ»`”D·íÞ.Ià‰ƒ‘¦„§‡©Þ*õŸZ¶/ËGdð*Cp¢”,Gt­À(p©A„ürâgLX ó(ˆ qŽ…øƒ~ªHÐÑì}o¢qßYlL+æLp{¢p¯R¤ég5nf¥àF¾a æc×—C¾ÚïXÙ~kÁÅe™\ðWâ¸Îbä÷¨—LkR•æ¾Ç#ÚáNc„?žåYIëv-¡•OdÃØ¬õÚv§ÏΨÀ +§×åÞ ë5‰!ËÒµ’†¶B7h ¯ÔÎéÈ:(s¦¦5ÂæÇ¶:DÏcŠãeÍÕ± ÙÚ">“~Î$KÚH¾¢1Å6Äs/1~Sºò>T-Jà²ú‚H<ç@†Xi”"õ¥Žˆ™ha]ç¼H×ÞÈŒ-ŸCOiîÊ=ÑäEëbi“è`¬U~Â1æ7,j2(”~aœèJ§euþÈS:r )Ú¶Û 4°éã²mî×Üo¾mì6y§MoV#° VK³DýùÜ-mÙrée×€õ‰Ò°ø•>Vüð[M:x˜Äÿ‹à,!Ë^컬5|…ºùg×.Fß üÖßQV‰ÇA…–w n†ÍËNymIî¬`* ?~_E»Gmx9[P«¤€zP™Õb¡ƒãÒÈ\OÊcwühH²¡¨éÚ¬#Dë@¦3p4©@C²¶ ŠXÓñíUÎd-êóA¦Ó…Ý^zÉÊ-¬ð&—5Zãuöä…‹ÆÒùIÅ©¨Ú7/ƒ„kf7‘¡Tƒµ=K_ó;]å*gO±òâW‰;ý:ƒ åîÏùѦȵØk’ØÞ±Ô×äÖ¢HH ÝÞ+†¦fÝç¯Íc –«>}µñYñâi“÷’ÖÀÒÐ~)©ÙAeJo¿òP¤1±¤ˆaψ¶=ÖO]m(Þ,唘¸?ÑpçÆb°)³ÿ HëZ_îÇN×I¸3È*W /,éâÌVUCÙyBϼ¶‰FØCÁ#Ó\KÇ6L¶'H‚~^…)Æ[ÁPÑ0þN¹Bю㼑Ã$dt“SÅãVÌëd5m<zá [øH ´ž¾àçÂíT” É‘ {¢…õágÇ }o¹Ri£ˆ³i: €=Ó¤DP¨œÙþÔN,œj §¿´lÚ"îàÕ=çã1°é“'E,ŠžC“-·¶…\ùyUwÝ_™”(©,¢Œñ"ó[‡”óë.– «Ž‡¹Ûl3ÇSJï<´®WÜàÈzÅ*N"‡ïz¾þÖÚ32 J|ž€:;b*êŠPoì9°O¤k>'[é(¿ ú:v‚Ú\Mɹ/ªƒLÉXŒ3û`“'Ö6AûìW©;»¢S{B›‹fW½ÃyÉEÑÒÁ™z¾RÙ!6H^w®q¸ôÂz’{w=ôô~7ýp}‹‚QOßžA…»SÄ̓ÅîúY_ZçŠGP{kׄͥ§ ©x)Ìf G-‘çn ïNÜ3Rìk„¢ðƒ~+Ôä|c&”¸Æ'fޱ/„ÀáhiB‘ÝÍñ8µ3É÷0nîîeîcd¥…û6ëÀ2œº"úâW÷6ûž­¦±â%KÑupˆA~¯ ëMüï™ö­ ÃQ‡‹Gõ@¤>V/hCX+ ä¶²hžñÙõïUéýRª²Þ<”¡ôܵ> ÑŠÈL̲î ÐXg]ü?áãä%‚Y¼›^ –ù=<—$ÁJ-šL5Ë}ãÜHéÈy¼Œ€| Tˆ'&«44¬*ÿ¸æfmLX¨-¶«¾\ßgøi>ª¶ Ý„ ó"ŸG"~D&=4ª³¤nçBú †É»sŒ^ö.Òt6>-‚kZzHAwPêVU:wË üG‰úÐçè ¤½DU³/@Î#Á—¥…?¦ú —Ý¥-"—ÕkÆQ&öÂ[öY榻Õö%GÈ·›óÅ#H¼þ뺑RÑj&Cžúh²ì®Ç´d_FMÆ#IYùñ6;j(>í¤,]ÖvRJG²`‰õ_÷#YQ› ާ¸—3´l¸OH;j;ðIþůÛ/îᡲL„`íE!˜Bß^÷³Þ/áAœâ^’Ê×6 ãÛSGÙ1ßš¶Þ|+òüE+9Ò¢g[ôÀ9¿î}ëâí?è:{a·vZ}‡“ï7uP« ò[PýIbÿæ­Æ7Ô¡Î7a^pã¦ßöF€za£ÒMp¤µÔÌĽ×7ôØUN9$o¡›&s²O93¦¢]NŒ¡˜%~ð€ùÒ-˜È¡¹µë³Ä¢ós9LW›“œ@Ï™½€zE’fnŸªãy:z³×VÎ$£…Ö‚ê¿è§;‘Ôg±HQYz=ÊU~iœšžR GÅQyrshÄV@sÒ9ßHfúvõÒ<"’™ºdæ×<>K„ã®YX6†jpl勽8¨úP5TRàQôçWÿ/þí^_ò|\lʤrM©¹À4¢/@9¾½s²Šn^&5¿ ôP»v%ï4[gÖžõ»Y8¼ç•ûùjab² ø/^ØGͧÞà“ýuCzâε¤Í…ñKCñv™³(·¼ÞZ)÷F)<ß@’\|Þø™ Tï˜ELŽ[ã4=Ù‘qœ“üéS+ú.VõˆßM:r}wm1ŠÍí2[Ö6>ˆ=¯¸æÚÝý¤¾†ÙìVÓ¦x:ûDZƒºü„~aTAi\µ…9ø[}àSj“º¤Z:M¥døïEÿ8úDÎd¤I øÊ›¸½ðŽÝh.æ{Ó <´â°À1¹õ¦Rí³Ì­½²3 [Üñ{ƒ 9ȉ¨Ú^ûëM=lÑø†élâiŒ ôxñKfJÿ2ax´˜r‰ø¯l+A#0â4$E€“·@òä—FÎÆ\kwX˜ëï£Pÿ¸™­l™°VâÛr£Ä›þK¸€}<”×OÄ ôrþ÷–ë¬gþ°d„.îZ`ɵ{;Hws|äÁ ;ê9Ÿ1QÞJçY4ù§‘Òû™ótWtê©ÔáF¾Tâza²‡à¢Àyb®f¤û¬öä9©à´ïtŸ‡åÝ2¨»å¡·ýÃ²Åøn›}Üüöâ&Òß~ÞÇã3®[€‡Íu~j:ØÀ4?}… ÌMçº~1øŽòk9×Ýœ–4$àób´×wK4 CƒËXî2Eô¨YFl<>«`;U-èø÷MgZN]‚½³¼_JοútøºÁ÷A´K’Ôꆰ§—Nu˜DŽ;g£¥|(›…¾J¬¶‘Ø·â0êh,í tà4 3Ÿ£õfHæ)û§fÛ)ê{ÑpÔ©1ǦÈD®‡}t×’K&ÔÝ÷Íî$C]qH/Ÿ5ÝI}^NÞâ3v.£–.~"ÄCíýÙ¸¢òâ${þUË:!اJÙRðdNKá@Œ¤0ßqÛ,ß¹ ŸëÚ«ñ~·Žlv ëx®·¬aýo~þ?Áÿ&6  #ÄÎèhô¿»ò{“endstream endobj 1385 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 35 /LastChar 122 /Widths 2830 0 R /BaseFont /SGSPAZ+NimbusMonL-BoldObli /FontDescriptor 1383 0 R >> endobj 1383 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 /FontName /SGSPAZ+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 /FontBBox [-61 -278 840 871] /Flags 4 /CharSet (/numbersign/hyphen/period/slash/A/C/D/E/I/K/L/N/P/R/S/T/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 1384 0 R >> endobj 2830 0 obj [600 0 0 0 0 0 0 0 0 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 600 0 0 0 600 0 600 600 0 600 0 600 0 600 600 600 0 0 0 0 600 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj 1368 0 obj << /Length1 1608 /Length2 7939 /Length3 532 /Length 8790 /Filter /FlateDecode >> stream xÚívgPTݶ-HPPÉIhrM‘œirNlèZº›,Q@¢ 9G%#A2HÎ9ƒäŒd âC¿{ιõ½óëÞóëÕÛU»j¯9çsÌ9æZµY´tyd K¨"ÂÍäåЀÙ[:£tÁj<²8pk&`a‘CBÁhÂAŒ†>B!y¨@@%`È!Ý‘0[4€]_ǃ‹‹û_–ß!K÷xnw¢`6ÖÛ(áhu@ßBü7êB¡´-` ƒCršZÆ %»’†>@ êE‚á-gK8Ì  ³‚:  kÿk°B8@`¿KCñÞbÉ `Êj»Ýu³‚:þvq¡H{ uû €¡6H°ú¶hæ`w†ü&pk·Fü!äˆDÜFØßúnÁ´(4Ê sDn³jÉ+þÅm Fÿ΂ݺëÛHÂÊùwI|·0·^4怠¡nèß¹,¡ å»ßæ¾sDÂþÐpFÁlþÅ€€„Ú€‘8…º…¹ÅþÝÕ øoÕƒáîv#þDý“ ‚­y €·9­Ð·¹m`|¿ä`ùÿ²Cœÿás"ÿ4ˆý÷ÌpÜ’CpwjMÀ§@ߦ°ÿÏTæýωüø?"ðDÞÿ¸×è¿âÿíyþ;´¢3®¶¿€¿.Àí ƒ¨~ß1ÿW,Øwÿ7Ñ4„þÅð߀ÐàÛ6È8ØÜJÁÏËÿ—†R„¹A!Z0´•-À ¿íÑ»¾Š„à·Zþi#€(,ü7Ÿž-ÌÊÎáwÓŸˆþqA g~+ÏÞ|ʲ2*ÊJ\¿MÿDiݪŽÖsw¼%ö_u¨# ÿ\üÆ•E¸jDâ~çðerÉö%e>w$ò¶J¨ˆ$k|X‰A\–³³Ëóõû9[GowWgó1Në: Wz$>‹˜ 6!k˜¯S:”‰~‘g„e.0¦ãclKP«>»àÂÌ1yÕ’ Àd ÿS¡Õ¬çn9´éçï©|e>·'ëC‹›f§—ЛÙq€úY𵫄8ë$fÚõSëÁ·RÞoÛ@*¾« ʹAÔguG…*|«eB‰;}ƒv©¢]ùßÖÒï6”‡yÛ}sx/Gj¢T«$Jñ£•H âQ–®‹B~RlEÛ1w.ì*Çbr|¬½}$nÖ‡·Gs]> Ã?V1òx£+w¿³\õ9’e‡Ð†ŠØ¥ÍäÊv””7œœ¸äN­Ñ÷«/ùŠö.‹ú…&Ð)âá0äPùÝÚ…k¥ èé¹éÛR§ö ^8³÷&sݱ­|&éŸî#6cÕ¯‡‹úœ‚ œEë=öÚÊÔïƒ.Œ}(pÚéc8hXÔêëeM±¸ÄÈpefI­|š 8xÏŽo‚¹ Lœ¸Uˆ–¤¹ŸjñÝq*½ºÏáÃ'äy•JâêA@"]1\j-L¢3wذ¥`”µÇ,–>aZ¦¶où¿-Ž~æÚ n‹åãQQNq—5% zh±)è#*õò¸”l\ÌÕ/(YfÿY½wç½Jt½o­QêÅTHú{ò=Ó™5Ú R!ß1Âr<;Þâ$ûg2³£§Ä¯Cǥs‹©Ï¹å‹E#‡„2‰ó9[ª«eÖb äBñÇ›;qäë4‹¦y,'XÈ.ó¹^Ûû¾çm}l3S@+'éY“W[ZTç¤ay þR#ÁWeôùì¯w<Ààø!ËêHô‘ªÝ°a2Y'ŸxVc[ЃÖ̺«P‘|m÷L¨3X´•¢|FSp õ6!wˆ¥qi­ÍÖ)/)y4ž^ÉdÏ—“¦'»À+Oð+Wë³Ã/HŽõ°8³:̨%¾0€°nô™¦RºNSX)šÄ©wo¸Vá"n®¡U®uë.ýe‡°ƒ5­†âÁ„v0äÓ=Ì­²Ðµ”ž²­ÔÂtwï‡tKy…‰ ö €À›Á²Ãí/hÆnfÔÛYÏß35|\Ã)͹b€½^s$QÛ<.'DÑ (^‹òp߬h7š” ~Ý¢ñí‚…Ë.^,°‰ðzÈî§D€×û3ÊZú’|JRA.KÞ&[å/0õî¼2³–ÛOy«óCúÒB«e€öžt‹:¹ïäCA2µÅËV‘ÀP½'Ûz”êÅŒ~,ÁÑ’ØAkQèoL¹>3a…\Ôô‘¯&û‡EÂË"g>1doµÖ‰g·s<î÷‚Ž!4ž„…ÊÚ% ôi®ä%-#£`‚h-GwX8n^]>ÃÇWÅîió¦p•ÞUÚåâãÎäIdØxÓ„LµvˆNÀî8‡Ä|x©îóÊØÆ|çBSP߮ଗ–g Ô¢Jšóú¹mî9}Þ/@êcõH/š®JäÓü‚h_ÿܧ^à¼n‚K¼?71$ÕŽb¡’êRm:î^5c ¨íÇðêZDQ%qÞ©39ˆ;–*XgEvb»Ä#ªi.ƒRÍãÓLëŠ÷j;Už½À9ñû’šeÕôlëbZÊq5Sv‰¿P ÅùC»¬ÄÅYÚd42Ê¥¯XÜÿÑHC{€T óT½{bÕÞjÝ´?¦Ðàk)øeXïÙr™ÐWTbé£ÜlÝGN‹…1ß^¬ßNdVZ½”¤«ÔÀç,ZãˆÍaþgD¼äî-ç Çö7=s`[šzþáÞ•MåME÷¿€uG–h‰+÷ÜKI•9º¶Z¶ý3h#`+]¥J¢æ·šõ¬¥¸¦4 G‹Æä5ÍɦŸñ ¨/„~ 2…°ëIš%ƒR*µÈ¹ï¥‚CSž[çm•&ê,œ^ˆ®ül™ò‰0¼3F£!âù2°gáȺÝYzñ‚Ä^˜X@°æ¨Í›#díQ¿¸ ˜ßÈ?'ty…Š,ÿˆbx_¸ÂæÂ••ÌDC«½¬}F0j|{¯Õ\þ˜ßsžù¬—}8$QŒáinúAµ$o<½öR•eµ#"Uòe¥rÞ‰Kÿ ñÃ=Û`GS"“H®bʘ#6W?³æ—å‰ÖÎ+ëíø ·¯ô– -ÝI{ˆQeY:BøÂb¢÷‘>:_/!€ÐéË@íáÞÑȬýu¢‡3èµ+òLn¯óqŠq`Uúmò'ÄaeG-3¿rk ³o=m[¾Íbõ« ¢Ä"îE;A{°<¹æôþÊ1gŠº `F;¹Ex÷”‹S>EG‡t 62j"hkùýI5IëUÑ:ƒMn"A˜W¸Í(Î òÎqE„¹¯øç*+nû…Æ—²;OeŸöY:«*š“ïgœò'\Ý7"µkûl‡ÉqèËÑÌ'ð9‘Tgeix¿qVV^­ÐÅnOiêlÄ&Àh1ÿ¥n† Šo-R’È!î±~x“ýè‘·ÞøyoÏõÏ4íÙ{¦Å\4X ²‰¤÷•Ï´±ÝÈ/åµ½¸N%{’;4u)Ç!‹=íè¡ç"Â3¬¶Ðœš®`¬õ0¼f»åæ6ç -#vƒl|¯göÕšŽùí:qÄÔyN¿3-y„¨Å–UÇâ${Læ6¬ÆÚRøÉ™¼ó¥?"áZ¾þþË\øQ>È” §{õîû7l]¢ÍK*;”]Rï¼Eú4à[·NhÀƒµŒÆëÍö—¹|j"œl‰\ö#Ã$,¼¡û4”Ÿµc2"S%öÍOZ5éê˜-=_~/•˜ñøˆLreá’ŽÙ7/Ý4w„_3ìƒý-Æ_õg$¨L&{[äã¤.¸4Ë<±I ½U€QrW(aRë*­ª)}¤{öÜùóš×Õ}ÿSM#¶ú¹”è>ž6ʈ~1ô–r¢„tBÖPÒ—µD 7S£á±iþ1N­@¤s‘e¸ö{‹>“õèÆw ™mÜtW?e‡ÌŠØÇRXÝŸ¶« qÐNøb%2t)( æß-Ö§9¢A¸‰Éš2žŠŸ±;Njf:¯ƒ9NÃïÊœT)š…ùïš=l“'v!V‚»ú7?êÑš\“Äk=ò†º¦ù^š-2~ë‰Uïs‘.»o¨ËªüaMfsÍ%W2b+¯ø¾ (̰?ø6|Kú‘œ™µÁ86<6zlDÌ)®VésF¢¹¦GfôZ¸èøJü P!HlÆ<¼H›8ºîeg©õ/¶D-¾ú‰¤÷ ã›UêYœqáÕ±Ç øË *Ïp›Â¤A wÓ'v•ù7Vš4¶¨ž+jÙÚN9dB<ï·NZN,±$íŽÝ\ë|.ʳ4 Úu&IFlµPÈ‹˜<>ê¼çO}ö•>ݧ·ðgžF±;YuQTˆ §ÿæ‡ ¬ßôtD¤ûfP˜{s“cÞ·+J .>xi¾’²È¦{¹3Åš®Þ~—ÛãŒd@ãa‚äÄ·Ž„kï887Kp¥ôRXŠCãóѰáTîEQæü^w~@³ßG±¸½Kë3rÎN¡ÀK’jùÚˆYi†Fý€ðF®ÒQG÷QÜKV1Wñ-ˆÄ]uÓ£¦¦Ç¦—D'Å4Žs^ï¥%͇aT{¦®ŒL7“ù—Šð¾äá®^8¡cññçî6S½¤(¸ZÉ€û`2$éß=ŸÝ›·4Žânâ%ÝÄ5Ì&¨¦ȇrŸšÉPjÔj©VÝ J%ž8#/Ô+¶tt:WšœÁcÓ0¤¾öíjMö“¼úŒº£èZ×aóŽÛÆýCØÛÉ7Û¾!-6‹Ú¯¿˜6œ6ÛÛj~ÁSis?ÛíS`¡°è%«èëÆ6¢™hSSÄrþû¤N¹’QëÔ_’­÷êsucÛUi¦¡G1ÞÔ‡´é <Õ ,¡7%ç”b>×Èê/7ÑÀdú^ÉÀŽ‹½ì±/ߤžâ:»özÝoW7…~Äf¥:7âTWÊxû¤¸1RTùã¢öƒ¿°ò}‘<}wD>‰ß­+=ó¦ºf7µ½îÓã'Z׫@='´EþMÅ)TÀSwú‹-Ñl:m‘Ÿ“¡ä÷ËG¡;r­ÒÐ/Ã*ޤfŠÞó-xz }~ÏLcÄçt>í ÔN$c÷¬¤úœ ú=nÆ©ngþõžå ÆIE^ÕÖŠdÙh›•™&|Œ݃Ûtmðp6ðQYMã©©SÝ;h†.¯ÚÉ/Švö˜ È6èDz‹~¾:ûK¸Æ&†Æ$€±sfƒr®©X¨Õ‡ìÝåö©6¸ÒY|CÈœ‘ÄHRÊ=›Ð<Ž3 S=ÍêU%6?Q<ÇÛSOújÞò5®+òr+׎™s[VŠ"ƒ¹ˆÛ­R@BLȼô½øóÉ*ùOx<‚Ýr”†a¯@$ñjKSMƒï”Øvª*8¬rŸâ¼Y¼ˆ5æ‡ßr¿™”‹ïÔØ žÓâ8»­KÔ°§Ý;…§—?\—§Fä»j8‚\šO“§•׆øžŽu8a”öÖömÐú»«MÌø©rÛvÙjÐC;L‰C`„>Vx­iôALí+©Å[ƒ~þº†KIoä&žá2j4+»,~£7RQÅV$èÃL|‰<ÉœÄÐÖzÜÒýÁÏßo„˜0»T 2chÊ›îà !dÌF æö/¨˜õpŽI^ø©Ý©²‰µ([|«Fv/f»H/>_!üËê¹ocG¥%ÅÉ s5“•ŽnÇ5¾Z‚ÏÝŸ¤±ðJ©ýšžÇÝ\UËúö¡ î[Ÿ2Êíß2û²Qx„úûs‘½¯Ø«PU XäxŠnO IÇäœ÷îÍóÍè v ó4ýð CihTðÞ²° ÇÒf%’2Žãl}Þç×^#ò†-¼hC¤ó|7Äïçiжr àÕýŠQÉH‚d.à–ŒñÆld„1(_¾wiNŽ3ªÖO^U·s5@p».ú0}¼ƒµ³W Oyâ|g܇;Òðh¬Ù#1|éôë6Ög²›œ·UëáÇ rk_‹öw€º«¹j!:/œ*¼È_Ô¦ ¶S+³(#>û­pKÕs%ìÛø“hj£ê·ßN \O–ˆuõ–.½½h8¤Ëµ[%-n&í—o{Ø,OJ‹ä k ƒ$4Œsz!¼¢‡bÃ7Ú‡vçˆemÝÊ5Hcý™’W¤uÊTãO³‰³7 †³Ê;B¥È†“ŸÌõáõý"¡dËUŒtúÀóñ[í¹0!Ã<Ú—(U½›È>ä9íÁ;˜Ö€7¤ÊÞ­:À¤Õ²y £7À­ÔÁT}I”C¶–‘Qîì¹È\·ÞWõ3›Ã½ZÆ™&ÝhÄlÊÞK\o`~~çt!•†ó(à'¤§tq Y†¶bëÑ4r3ÛDZëòa[ö_ó> (ÁÔE7 bO;8<0¹8Ô4;Õª>*ËVëu?+«h–H½~šq»x/·}$ãºÊá+¡V8|ýƒ!Ù‘`Ç©³Mò×ÎàåÇøQÝ'ï³eò^JYõžâ7:¯?¾kñs”ÛqWç®fa Š’Œý4>§ ÇZ'úy]Ü;_GdRÁú È•†bn¥æf§çƒ\Qù²1³7›^voŸØ4Ò-מyþ«wýE’ñ$-¤;k3¡j¹õ½³"í§¬kEŸÄ¼ÕSíÇ»õ7ó´ÎˆÏÖ1ªÉœÛü¤¦Ð#,õ÷9ïÓ¬æ1Om—’÷Ÿ»uÄËnP“ÒZ}7LÎ$·*1e¥PÈ mêõ¶ÇC gùVGŠñGÈÚ=Êïà9’"ðfÙ°ÙèRÒxªú;ø®^í,‚£åzOirŠ>׳wÈÍcÅ¥˜?!wÏÇFNyÆ/^€Â(Œ’‰‚SÌ—òñy`LÿâÅ”ÎàQwѳˆ.ýÌéììç ²7L‡²m³‚Ô-Ôc—†\Âý îãE>`­X|úZ-‡ŒØ3!lüqÆ×ƒíŒšˆfrMºîôaúKãŠÌˆxè¯Rnºí®{ɼD£?ø&´ÌFóŸ´T%ɘZ8­U6 3ú·<Ȉ› h¥=¯`·C-ãZ*¾•‘Û3ØJ`+>…p˜;w cÁ¿ù\åµdf؆:îÉVÂÊ£QÏ Ló¶Ú±{i C¤üD8þúñ7.4ß=£Nƒ~ØA·™Y¼ŸíQíì ;dÕÚÞùYÌú.ëÅ3¬m Œ·Ò'OܧZM•ÈkÚEä»óÔAøV¿F+áÖØ\7H”ÕÁ¬–ÞÙ‹s± A7µ¢¿ï?å151"yUF„I×íòÏfwÊ*Q;1WG¬ä‡üÖWG9 dòú“¢Ï¡ã6–±hò¶þ|áç RÖ/?‚jïVÈttf=]«­mîXCh-»E²`?|(“躃Øçw¹©”]“RÉÆè·¸¿½ú‚[O÷^Üä'^m[ñ™4]aÄ‘þÖ9ö5QºÄ”ÔbcÅ‘n"¾ÿ]½GF&<ç ¤3dRµ°%‘ ”Ê.Óµ­ÉÂÆWòQmw)‡GÒDa™e¹ÔÖlNA|¦Z–ýÒ½‹Lýƒ÷ÛE}b\ÝîL» &épƒ·gr[‹÷šßžz÷ìòdÈÄ º‚íüë£-« ‡Z‹ÎîpnöŒ´Ð|˨) 2xqô¦S=w¶Æß jIž6a›6Ä.OSy]ÆñþS§oa¶Ô«ˆÌ±â£Š51r»%ob2üpȈEÐ&â§ÜÈÕöIòÊp¤ì‚è¯ôV²í­NæçiX¯Ô²»Í æá‡A$­Ñe$D{òD¾Ÿû‡‡';,Ög¦•k\Ü Gái3¼q¸Qþ¥L‚¨99ö]/9(C쯆IV-u—ß $#ô?(Ð%¤<×~ü^nsÑÔpPpmªJÛ7'êüyô,YEj–lw‹hÓ> ;Ko·ˆíŲ"ƒÞhÆðÇû­uÔÌm:n=¦ÇŠX—N7ŒÐä£Ïà‘Çžßi®1zUL-íµf½+OGÅŽF÷Ù*v|­FO]ÆvGÓÙŸ¥¥>Š?$¡$ï.ÇpHSî 4ó¢1Ž‹,V‰Æ;…Š¥"mLôWµOËétoÕÛu_Ý„fhJ#ʯ\ü¦CÀ¹÷)O!òiç¸SÔD3ŸJ6IÐëYåÍW«;Õ9#%“UÔ…ò@KÁÝDFjðc¾®=ésË‹¯N|½Ý‘m*ú‰¯—œœR–Ph< ßûÒøºà;wíöÐ5Ÿ÷ãyí]³õ–èÏáÊ͇# Xæ"¢Úbò3¸ý]ub7¾‚夨õù-ÅsÅK>ˆ<– !!’=j‰Á bê÷](åÏi·t9ù KÆ.Ha½+-Ε[åòÿÑÒñx Ciif|-is \‹¦ÿ€|6±m¦ÍñŠ =“1ä`K^!y9ÊÌßIjX÷žXHO~ûLý쫜ÈF7v—")òï@µW™[zb™®ÕÚ4“*ý÷L´ªŽœ0–¯z$¹Š/‚„à{>UiO³ýE©²5êæ÷”t¦=Ä;î €¯À4?œt€sTeù›!4J%h¹‰¸—ŽQÏ:µ¿yÓ´(kY¸³½M>X‹– sôqÀirÐÀ³8!ÂùÕÏS€¤Sì$óÅ­$R÷Ñ•amPÍ$?çÔg•ËŸ˜Vd[ƒ1ËiÇO°<Ø_¥¶%yМáZ.›eˆô¤Xþ*Iò{()õŠ_¼¾êW÷ºÛ £x}kã¾ããVÔ³Ö–I͵'EÜöGi‚õÂV;áåÏ¿Ø×6™+Ý$Éž {ýTö"1Мä5v-V$ÍlÂÞ¯«ª›bݦ´³ã)º§ÊoS6”hLGñ…îÇ,v%¹u©I~®]%¾)Ñ}ú‚¸2¸  âoJ°]^¯ÿRÓ HmØ;Âúž³d¶ù핈`)ÑÑëùÄÚ”°•dv 8>ÔfN-öÓ¥]¥rÆp4’ w0N¼‚+à.ƒÅf4¢Îf Œý˜¬ê/7r¦ÀCêOÝpñ%\ï‚©.úÌ•â{šÞ‚§mÝ’ó³éÁm÷µp7ßßçŽÆQ}⥜ñMÃècFn°ãH¶ÈH¿­D^{D ^HÒœð.xØ´Yæ^¥$ÃNèR¾äK'^é’²td?õ’¸I}²ß©fxaúÁ(‹Œ™K‹ ŠÖâ€MÓÞ*ôSæ›iô‘ h šŒ%–ýb¢¨¦—úˆ*äÝ*Wæò(#]V’Ü<ši#ÒY²•Š‚DÁ°¡ÃÕFFV鹕6ÁóÑÕ+3ÙøÛM~o£¼ Wö¥Ø…Ú ©5QÐ8ÿµ;¼³Óæ?¾z¤á ½³0MñÇ€nZ_:¾ª"‰4Oñ÷ ™Ë±NGÕÛØW,vÕxF™GM2Îzä}ézÚZç=¯‘ZO+Itš_¿Êk÷ïMj ëgàÒk/^R\LsG‰ ²© 3ã½+ôÞÊ•÷aˆlª Ïn×–OBw:ëÌDöƒ^ቃ€¸Rn¹šd¢¯ÅÓò;SÓtd®ÌA~z M“èRVt}õÚ+'˜ †4~}µ÷°}³íÚš[T:áµ%|Å’Q"èXê³ÚÎÝ9"áòç0Tw³È‹d·¿Pô@åÉ@ÅìÓEâòxOæî¹à åÏIXUb_4²üQ ¨:ù©^\õ47ãÇU¸µ& ²ðc óŒA«`á0Ôýµ˜—™žÌ‘¥ˆß·%¢y†.Sz¾M²hàž·ãý°óg #$SÿçÅOÁëÏàBø[yã¦5åž Šq(OÜâƒL#‘'Þ/ãØ«*ûü©¯ð5X1œæ)ol×Ós[2L&³d´/øÿ—ÁÿøÀ #Ñ{0ÒŽàÿã)Àendstream endobj 1369 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 36 /LastChar 121 /Widths 2831 0 R /BaseFont /HBAJHG+NimbusSanL-Bold /FontDescriptor 1367 0 R >> endobj 1367 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 /FontName /HBAJHG+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y) /FontFile 1368 0 R >> endobj 2831 0 obj [556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ] endobj 1365 0 obj << /Length1 1166 /Length2 8911 /Length3 544 /Length 9724 /Filter /FlateDecode >> stream xÚízU\\kö%‚»înA‚»»;PHî®!x 8 îîîîîÁƒ<$ýý¿ÝÓ·{žæm~Sõp¾o­}ÖÞ{}ûœz) U 1Kˆ9Pveá`e(ƒÌÝ\4ÌÀŠ,ê@k7À+Èc†LC£ rµþýJH8Í\A°¤™ë+¯iãP2sp²8ØØß ðp¼®Ù¹þ „8 TAo€*Ðèl¿R’ 7 ØUÃÍÑÑ´Tº@Üœ-€.«×Êþ3+@âèå ²¶qÐk©ë0011ÿ áàçç˜{ýÅ$. k0€öuá´‡8þ‘éUB:¿mùG¬ª•™”%Èõvô6®®ŽllŽVfÀWŒÕÅŠ tecx-T l)qøCÀùÏ$AÎ@‹×¦¼Øþî›âöùØ ¶ü³%K7G6-0ÈÉ ('ù?Á¯ò¿0k +€‡“Ÿt=-lØþH©éåü“äø6[úù8BVfö.@?ðõ‚ìãbæ¸:»ý|þwâßwÈK…+Àhýz ÿR…VÿØ+™¹:ƒ<ì¬ììö?¾ÿ\½¨%lïõ¯pe3 €MLYZLMéï½ÿ3J\ò*ÉÂÁÇ `á|Çó:)¯Šü<\Wü§ùð'ªjúŸ:Ùÿ%)¶‚øÿÑΫµätvyMýŸcÌøw}eˆ+È ÿ×è²ó°¿NÍë…㿎Կñÿu°þžCÚÍÞþOWèÿaàÕ€"àGìÍœÿ#ÜÌdïõ_nø{ ðÓÿБs5³Yˆ­íÿiÈEä ´T¹ZØüc\þrÙòÏç¨ qýñ$X8x8þÆiÚ€,ìÀ@—׳ø“‚-ÿ–R l±­®¯SiælùOàÚÂÍÙùÕž?èõÞ¿öV ×@O òÊ"ÄB0Ô¶6´ý¡ZŒØƒe’«Wëî·97rŒ=ô7V˜^e»bîÜÛwŸ³$UÇl„+ `•`¡Ã㉥bø<ìøÅ;X°°Ã°`d#‰NYë„”P/駯Øûˆ¢ R¾Kx Ê^P”ÝéÑKL`i„CpHôœTà‰ÉÊò+TŽøñž‚ÏUdíýÕàçG:%Ùmƒ#RPä»géäõQOï±+:°LûÅÑxæÃe]k/͉õJø:'º8ŸlJÛ¬žªGóy乌טòQK6‡ Ñ+íLvþ˜ð‰Å16(ÎñkX„Éßš†+…¨pœº–QÄ´Ôß^î)RêÔ[W,,¨Þ‘õÉ»ãp%n×)iuGYÖǚπñZ¬Õˆv4¹›îµ:®uľõ­«GZýÖ:„<=Ÿ@‡ª˜yÝ—l:GBÎÚOAs½À:rÁUuiw™ª¨,w‘ʽVç±ÌwZ6ç]ºš½žW߯e ͹„縤h£öÙ8âØYWÑtÔ¸c}ü5æ?°5&Jt”ùËÞ¨—OÉËÛòÁHÌîZ‚pr_‘\OœÅ±„4šß²~òIÝbâí‡y"ûÊ“¬4òŽZ¦¿;‚Àždz™RÑ t[^cíÆ=ðàæ÷Ÿ‘øÜÏ•ä =X}§^ÍóâÓÌ:Ë;}ß %[µ, ýÉЛ>µÞܱ^4AXç%ä#¬wÛ±W:eÅNã¥S¶SÈ“H f÷ÖϦŠKuP ·}.óF!Ö§•"k¯“/ågö«ÉФÁ  ê2³Õ°"Ý ÝkÇÃñJ ¬°PÙÜHyCOÍbñ¶ªß+óN)$Ñd®å]šU$浈—DÚ!΢ê퉆‘´dGGü4Éøp«lУ³LdÒîJ Ò-¹¢TÓÞœl-t=ª²ÃlÌš2iΊÚÞÝÿåOóáQDWX™ ¼ åßSͦ¶ ðå«xÂAÄ¢<ÄQ“IÔ/‚ŸÅe8XW…4XÞO¼ŒiÿÞä]óÓ̇ô+ö`dsaÄÝ´6âÄêÒú6këás‹ƒÉضÇÇ8–²"‹½ö6~r_¢¾;cç˜Oü$µytégÿ¬žñé¼ôˆøy! æ“_;ædx–Vªÿ`©«m%sÝ8Kçïˆ&êîvp§ ïfæZJÛãåªxfɰE#ƒb˜&Zazé{_¼ÚH☦τÎ{KÙu¤®€ë™IJSÆÊ=x4ÆŽ: äAºýá£,ñ‹iÃ01bT2l$qm®JþïiÏ`—Õü@;å³v{"•X”IAÖ¼Á~ر*ŠexATöxšÛX'ˆè.m;„E…ÛC·ù¦_ëÔmÆã± ݤV¾¨Ñ]V$Ë:\îøCت2™Gƒ»1­– dT4ûp+p˜®s,JÞÆG‹Lúí¢“¨.Ó¸¥-¯¡†“7Ã}‹?ñýˆ²K*Þ@P¿5ðä±Ýçr tWïËßSzy×SìX…»|Û;PRàFá/x˜ìbúðYM¤+#d!&»À¸&æ*I˶ ‘U‘ëQ2ÛañáË5Z#ЛÞöWLAjÔÙ¯é>@“"˜»põ‚Öã;$8¿†²NXæÜG°ìVFPüãï§3‹!ao|n›ôØ\–`Ä9Ù©¦Y"]°Ý1I`¡ØQ²¯ô9WfD$ë%bJ=ÓBM·–Еõ„|}GC¶;%ýkȃ_Â[]Õ¸QJ•)MÓ?¡×(ür ~é9[m;3l }“}Æp%gˤ¿!ríS-Q‡‰<=•]»Å©É¤LˆógψæÌþÍ)j‡Ÿm‹{¢R××ãÑQædÙœNæ<#C=$V㙃gú±rÃÜ+…>ºJäå28´(”ø±ºød•ز3/áUFIÏú€.Cw'S»Ռ۠ŽjXPK bæøÃ[HS>õ@‘z¾‡˜„Œ1>ÎYçÑ>ÅÊSÞ³Sh¥£#ʱ¸Ëú;!á· 0/xßydÉPPÜÞ_Àê$…´2¡V]Ò.)„îÅw™é "E2 øNÙ‡cO4 µ[àÖH¡¾ 2^zϾÞ#2%H²æ6 »aZË^à]w¾u¨­ûNåqj•{Þë«+ˆ[—‰Uб›7&NÒ|¬)CÃÒå¥o½~—t‚K v¦·àEqŽz,¿u‘ªÜyÛ6» -oÓÄ%š§Óžƒ]ÒzÝþ¦WÕÄUÆ“ßþ¢¥?C§¤Â¨Z*c„¥²7ìCO0;Åtõg 5Ô,Jð`.‹òf [¦zêÛðb–Á>¡1Æšƒç Яªh 0/Dý-å€ÈŒcæ½]‡KºðÂý!¢½ž¿ ÎÐçê!ù‚nÝÇé½:b7£¨>Ã}fÁ•Ù=Ф‚xFä(;Ž´xã5‚feTï\y¶+-7O› >â])µïÁÞCö'9ó&ÏrýÎkÄ ¤ƒÏ–Gµ­Ü+?R?®Çв}t“-KèÉè6œòšPUJ*_]ðñK{7«ùfFÂÈô\ÝBÀ]Mþ!~`o8m­äx3>_.{g‡-Űâ-‹êKT')™90˸|Jxæü?ŒbƒyºZ†—b”ºÖvÕñöS¦Óþ~½ð§P”ÙTG:;F…5Ûa8K¾ÕËúŠ0Ÿ~__l&׫Bo‹xM›ßÏÍ Å øÃ“haeÜ1ºÛôȇ>ì0x;J Û”†Ôáz©ò]É”çQÓ Ëlå6¹hèÏû©Ü)sýüµéð´ÊçzïüR|Gz”ñEß@«M†!»0µç‘“þ¢Â5Ï;©Ó÷›|3Òáž4!Âð…ßÄo+Õ{w¸Šý\Wá )rtÏŠ“¡÷FŸ¯3]¾ Лù ËŸ’n´3–? ,õŽzíFÞMÎ_6uÑ‘—‰òµRçW¾J }­ØüN²îé_ßDЄIxúÆfÛ´Âçš‚óX»ÊT¦`à§{cI_‹^²¢$Ž=}‡FŸTÐYô$Ý£TôÔ4= ðf ß뉳àyÎåéìcàÕæ†i€7Ú„W²¬öUëhñ) $e H—7qcM÷=¦Œ¼Z^“¤qs°Y7 ¯gê«‘å„~L´lµ”^èHaÃ+ÏOÅB"jóV‚¬…ÉÛ:K÷ M46ô’Ô”bB ßM”“X¿©*2Â'ԛцdJ䤨£1ˆ¡ñûx!ßãIEöY×{é[²ÚúdŽ6v¨'÷"ê ²'3ÇHØqR“†ÊÝüB ò',ºÄ¸­ZI®¹ÂÃÈ·e”u­>^  ¢3•/ðåãÉÕw¢éªŸ?8´Ç0JÒ²*û´ÛŸ¥‘!HbÿzâÚ·Öì®ÿÍfŽ—Dûµ¶ Aÿxš£UÛ°éu÷QÓ%íÒ縸¥S†3 ¸¶â¦Ç>¦¤70KÿºD$4ô@CjÎA6‡úØÁCÜÅÊ~†×Á6_Ÿï]Òæ$pÓOp†9¦ ŠF1ŽnϤd¡äo Áüñ-¡¶±cæº2V&«-7¸)‰¬på׋oHÄ'Q„ð‡¼È»PÍŽ…»þ®!ÔÊ€Þ;«s+_ñZ8¹ñ{ºJAþY‰`$(OmÆä.™\x•!qƒ"*¶À×à3dBŸ.ŠQ~0‹Oz‚bÌì7ôí’[ê¸Vü/S%.mÏàyþƾg®Ä³.'’K…9›‚ÓöJÈ Âתè!Œ¶}1êý_rç‡Ô岪j”Ϛ˟~‚¤$Ò[ײ%›5¤'ØqŠÇ ¬õt¸ÃQQ‹8˜Îo! cú»â«Ì;ìãàc B$æàO|‡féã«îèB¹·öÅÓ¶6›$Xu %áIEœŸ·ºÉò%FÅÝd=²g[“'±&áJŸÄ½s ¡Ê6˜®fi#8ûÈ#àÐgeÌqñ ×ÉŸHüÖ¡d´ý^Žë« c4È.FTOi-ãU¨§µÔ¹‘™½Ï?“¤1ÄÕÕ„ëÖW¨ ÙB¨ØècK?*q޼û\‚-÷P™®t¿…ïh?9X^9¬É±m|1æ&®Ê“–JòVF¾]LÜjÍ©üª2˾ ø`}DV*†eê l+ìnä ¥Z„IÀàgjY¥®ƒõÝxé±ÜÜ‚¼½Z¸ÃüÔ¹hbì6`? æô˜*š¦Ï­ït<×kØì6$¸ü7l>÷“åj‹q]a˜Ü ù‹m­Ø~~´¨ïçÆ³K~øpF¹-ÑË ×YkUDø+•’_ÑgÏÙzÁóþ»-/¡Øw+[¥™ÐIHÓ–Î!$-û„œ²Xb¼§‹@RŒ´¾ûh.ƒ žP4a€ã¶VØ:!+¤»×¶×î‡ûl ´0j;¥÷oŽâVA[…Îá‰`‘Ú1dËíæ;Õ6áŸïÍ&6ò3ÅŽ Þí·³ÕíëJèþ:g×A6ÉÚ›Ò®œtјûSÓ­&‡£sO1Äõ7d% YIe*sÇ~ö]/ê¬nojÉw«ùèjh~í”®>ŒäXzÖ»Œ¼Q÷R©¬»’¶Å>%ÂHõ#æ­¹ÍcFd¡Q=i€?$P¬ð³V:F[Y“˜­]äk[€ ûzqùHw|×qž&2ß%4ƒüý^T~¥!Ypçh·û )XOAlþ莻ªÇÁCžòšvšÈÊ—\mKéÂáçÞ7Œƒ;vAʼnš„}¢ûŒ–4Yä-ÅŸ³×{#+Hm ~±s8Ì9µp/¾{Ô.Ï9m«ŸÅ%²2ê¶©xWEGÖg=Ñaœ‡ý‘*þ3ì[ã¼"EÉ<˜÷ðê¥pÉJâ‹Zô¹X¤.«‹fÛk V–séGk´#¸ß=ìk×O+n¨A%¶ ¶b§èôÊÆ;Šü$\ްèêÂD˜‰Î¸.Jñâ¬ïFÍ]‘\Jdì?QÞàÒ!—ÇÚó‰ý‹ùëvúžé¹Õ ·A˜É’Z-Ÿ„Ù¤^Ð+ØÓ‹¥õÕ È¬ —/èwŠ_ð4jF6 D=÷= ÜiY ¡¦=—%èû±Çn1Q[Q-µÇ=W¯4Õ2-wCýdä‹û}š“$¾]Á”v'¨ÿÔUÆh¤#ãCåTŒÙgé B#Ï$Åà×îûè^oÍv-Oó ;™a§(#…¤Ób¤Å,J‡rXÙKVd–g»[Cýx¯–6.øf{EkÇ7™»yÚé$ ˆ~ÂÊ%ç©k·­YWÌ‘cåËwP@@6BÇèHt'öqåÈâƒ[®Tþ{7†¨@×V@õî±9¥ú墑-7!¼çì«=pÕ0:Ý/s¼h 1(šïr’»&Çí4D òÊ¢rÈY*caVøõÈ€ØV¤®M'êÞ1V>?®#n>¿ƒñ—þ«ÉÒ£!SÆ€j–©Nj5J6Dä„oÔ¨µ8廿J¨‡Õ+QiÛz¯éØä-³Ö³Uéh±«û ÄU¼\4Èòá ÜÞ¯Jý¨»} ûIøR1\ÏKÌj‚MM ÔÖ[èÛ ã`R°tžLIþÀbÀrgÎˬ!ÔÆ{qÒrÖðú3P†§œôêÓkë±Ñù›Ý #IM1<§²m%2?©Êš’.óE ]EÀ]-»us®(x†Í¥Šm#ðÝ)TÁ‚Ÿâ©©²QE¸uÝàÊ¿IÓ<„­E¿w…Z3×ËçT$Q[&héã$ÿhkVen|Äm§ {ä W R ÷&w?Øú&aÅ/ê?1ê0Öù½úر6é÷&Üþ0†£,Æu;m· uÚä‚úí&º‘ï^C“u"Ëe_(w´#øÕd5J, ;çaÌ3EßÁ,EÕ–¸™zèBeò³ æ:-ÀåøJÜë¥Óbb½¿j‡%Úˆ!í«û0ê®.>h~÷ycLWܨɱ¢n©.È£sr´nÕVÆöÍZŒˬ‚²ÔÂUŠÀö|¥¿Î¥åÚþ ‹Ç=É7÷N„ V—|¡°ƒw¤¢&닱¿•Èè ñ}¯ö㳂ÌÅïø^ŽOu” Ï™r•‘¿½Lyk¬«P9~gë(ïòZð틆GªDöž;Nþ¬œo™ÍI¥âÉlá§¢åЪ!ÔÞ˜ìb‚uh*²Òˆ&úË'cÔns®~Af=çRhÈâ2,š9tX¥Üä]œË1Â&Û'©AX™»ãp …-ζmmˆ¢ðÔýa¨òó=“d£q !³“Nγ߱ý„ta¬ä{La¯FH5¿[Þ{a˜šöǤp=Þ_«lä˜ñ¬#ub >Íýøee‘þ„1~ž¹Lèdé×§‰˜§òUPG;K‰SH9÷µóO9)ÖÃdøì)Só̇”ùdؾh€vå× ?9kèd¢^—Û1ÊÖ¤Gœ¯¯¢Ö —ü2@vùÈ}˜ÞIæ,h~‰:ߺ$HÖìgù@ÃÔîO¹Óp*@û8¼ÏÙ©zF64¡Ësó"î@­,íþždb©d\‰œ=ãhŸ#§ˆ‘øíÍ-”Un`ÌÔg­ñ3“HR\»q=éí­pȸ¤Šø(âög=:À£³¦Ä'ƒ}ÞXºÝ^ýb©¯-øo¸óÁ‘ ÌÄŠvu ˜ȧ„P겄A• ]fv/‚Í–~H;ô„¾u oRùxoù}‰fí0æóÞÕj[+uñêN†Ã¶¤P!%8¼ÿH|›‘]@^Kl!@^) <8›Ž·n|,ÝyŠâOÉ6MýZîzq´:}1üä$?ÃÃJž<Žñ èix±ÿ«]×»+ é´ UÖzNYTm_ ~É­m.7,Db nuM±ŽÂϺaW! Ó‡gÒx 4*Hzé·<Ì04,%ÿ£ëzЦˆÕÔg”ó¹f÷é8¶Ñéî)¡¸<‚¤ðöù½ã™·t"ú_9ËÙØ‰5|ó»9Ä ×Q§XÍþÔn{2θI™ÕŒg$=A.u‰÷›ÚjÁ†û…浉MO´÷ I~b $tdIî~AáB"Ð9ÍÙü97d'ŠÚ >Šªï7¡1 ¹Q\cHj?רQâX!ó¢KÌó= í Cä üë‡]¢U+(}µÌ}‚önB-ý²ä‡¥­pÖã‚–Ÿ8½5üÕ±]‚bɶ[Ò}ûs~3L±Xw’žrº_o=af—'œ=s‹¸à8Fag£Ð|ýæŸÛ†><¦¥ª˜œ:¨¡Ó”¦ iåSât)Ñ °¢$3ÕnÙþŠÞΖú•·_›GJí¤·Ž\ÑÂ¥T§h¯9´KÕª-ŸÝ²»ñu—©Óe¦IùFÆwòÅ'3½=ÊÿvŠfcuÇ0ŒQHãàšÙ,r6*\ƒP™Â*«Å*…`¹ÈEs} ü4{sâc*‘·äL*Ò¶ù‘Â_dîf*탴uÇ༕Nå£Û¤7‚eYÎ[¬ LÌ‚@Œ“»kæƒE´±dUÐîp¯Cú‡,4ëöt'ÑPi)Rð9]CêwÕªˆ’AtîÅœ“yb³IÇÅ­¾ ]4oýØõ[/ðtœ:áüú¸<öHM° $2OÞåÜ?çf>ØE¨}“„% ÃXiMÊ®iÖÆÐ¥­#o&Éþ÷ú¾„28\ŽÈ •Åüº`²tzþ¥LrÓfê­·-m8ºmîC⡬¶.£×^‡Æï/_˜ó¼soûqýœz³`¸ùÐiNWILä±Ðl;˜ì °õð}‚ßëR­Ó=¡/‰ ±8Eµ7é=;jš‹e§8ý¥ 3&˜eGᨵœ…A&Ü`6ö1Üû3#ï¯ýFö€gØüÑ:M·D´)2 àü¥™uÉ"tt®¸òí ™œzŸŠôÍ‚í ÌN†ÊŒ»*ž;+[åñ­ŸB–{Œ~g+bò¡zü*É =x¯Îc9GØý}]e ìq§ZŸµ`)¡µ-MêìÒ¯x5«9Ù©s‡(‰žObõÝ@wk›«`må¹£x!WOŸ§LÐ[óÔ4"–:ëêô—ƒ[°‘»g10Å«š5íÂssÌv³ïÈÌœ¤ObŽÐW½E´«iÚ^7êµÈA·ã,»ßô͘O”¥ÍœÓï[§9õÓf¶ô9°åÂ#Ÿ×–6l¦G“š˜Þ1ÊÓdQqÆÞË®sÀ¨„JÉøï}ˆ °Ü,€‘;`aÖ5!€bä¯àbÖl§ÍS*Köì„¢Gµ„ î’ØÌ¯üLXz¨ÈµÌAí!gßÚF÷¤Iè¢MnÞã?µ-§¹éÏʨNm*°ô²èîˆéE1ô+[çD•½Ì‰Ðö|® ”[t¬H‹Nôç‡\Ðë¬Ü»pÝ ‡=glßy#Íæ µ—ÖX×,Ê<¡m$Ýê ÕÛŸX%`z¼Lõƒ™±î¤Þ1{È‘HÓ#ýEENð=’ôGž»‡.>iîS ®Eò€R‰ÁÞâ–ì–.£aÍIÖÛ^š}²iø/ÕÈ䆪wÅL~4?O¤#V΂öOØ”%';Ãê!“Üd·p²…q!oceZ³sbØàß Ðú‡ä9¬PjK¢!zóÙ!ñHaŸ´Þãïÿ¼£êOß,?€úVÐz¾’¢Œ¤ñ¸gTW-Š«XÑèƒðN¨PÊ94X}chAc~‡^ÅûI8Y½-°Ji ¾á.˜<®¯ÇIâšo,¦ÙNì¥#ÊͽÊûÊàùk¤lùnýh2³ÒþÝu<Aíâ$FŒþ¦ÏD!þ:ƒêj%FDõŠ‚QúPÀ„´èÖ#מbG¡³°ï\ùe%mËf›‘g'CÕ䦨 Ñ)Ê$‰‡x`A%*›H«¶#Ì'å;…p‘ûÚ9ß/iÔ¤N…ï#‰yàE×Óz˜8ƒÄÛ¼êpXe€N®Ñ †µ§r%ç˜û7¯¼Çé&ï`Foùª’׬ó›}tW™ë',4Ó‘õÊ™‘8‘À`Z*\-šðú[Ü‚JåÕ®{i!Ux„T û•ˆ¼‘‡ômÙ85û)îÛ¼e¢ý¾KµÔÌ;¨žè{ÜÈ¡¾è{´Ñe¼Žò»~!–±l˜×R¡^n`žTG?ÂŽÎCMž—û[©s¬ ;ZWÀá¤ì`±3iSw-iUÉCW©%Lí®GcM¦ÕãÿªzâÊZ•*¨±…¿ ÚVâ>xj„E‹ŒwêIo³}‚üH—ã Örú ãkÑnT‚e¿S< ¢x K»«- 1…‹54ËÆa«÷-ÕÜ@ÚUóªîÐsL/}8ÀѶ›Ñl¡ò‰ó9È+ß©O¹È¨qD‹£RKˆ7hëÀûÚë,l³Ž[‹x³#‹³ÆÒ4 ¶ÿÚ®½–ZJS•ñ~´õÓp+S!¨yWC6Æjy.Lä“X5­ ^g˜Â£˜ýÿòƒüÿþŸ°°š9»BÌœí}œ.®ç?þ€‡ü¿iKendstream endobj 1366 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 2 /LastChar 151 /Widths 2832 0 R /BaseFont /ANFAQR+NimbusSanL-Regu /FontDescriptor 1364 0 R >> endobj 1364 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 /FontName /ANFAQR+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) /FontFile 1365 0 R >> endobj 2832 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] endobj 1332 0 obj << /Length1 1630 /Length2 12198 /Length3 532 /Length 13075 /Filter /FlateDecode >> stream xÚíueTœí’-îîNãîÜ%hpw§±†Æàî‚[ ¸$¸Cp‚»{pw¸|ß™™3ëÜù53¿îº½V÷zŸÚU»ªž]o5 …Š:‹¸ÈÌRäèÊÂÁÊ.øt0ssQ9*²¨YZ»)›Ùï $ØÒÔr”2uµh[Z¤,Íœœ~~~$€$ÈÉ ´¶qÐkªi3011ÿÓò— ÀÌëß‘÷H µ#€öýÁÝÒää`éèúNñßT·´¸ÚX¬€ö–Ie]¹Oô?i>Z:Z‚Mí*nﭘ斎.– +`ÿÀähü«5Öw.q€)ÀÅÉÒøféinéôÄ p²;]\ÞŸ@€5ØÔÑõý\A £¹½›Å_¼Û­@ä½{8¼cïd* Ws0ÐÉðžUEJæuºÚ˜ºþ•Ûø@Vïž s·¿Zú{§yG]MŽ.WKO׿r™Y,€.Nö¦^ï¹ßÉœÀÀ¿Ëps:Zÿ³fØÒÚlaoéâòNóÎý×íü³OÀêÞÔÉÉÞëïhÐß^ÿQÐÕÅÒÞŠ‰ƒó=§¹ë{nk #Û_Ã"çhp°ÿÃnáæô%øï ¢ÿkfÞ‹0µ9Ú{,,­Ø>\ßSèÿ{*³þï‰ü¿ ñÿŠÀÿ+òþÏÄýWþÓKü?}Ÿÿ•ZÆÍÞþ“©ÃûücÉÞ·  økÏØ›‚íg7Ëÿ+ÌÔhïõ_þ«£¶å?Šý7¾…å\Mß/EÜÑú]NVö˜.2@OK  «¹ ÀÊÔþýÎþ¶k:ZX‚펖ïÚþ}­ïAììÿ‚iØÍíÿ祣ſ–ÿ.×ßų)ê¨Ë*¨3ýWöoO•÷IpÕðr²ü[m%Åþâ‘y|X>pX8¹x¼¼Ü>¿ÿ"ãß4ÿ<+™º‚ž}vVvvÀûï¿ÿy2üiGsÅ_“£îjêhñ>lÿaø 6wƒß5þûýoúßϽ¥¥§¥9ÒâÈ\0Ä6#+Óµ?w`TJ¿§‹z Ô©´^£¨ ° Ô±ÁÿÝä¹:”µa\àµÙköÓËŽ<ãî`ž=]gšåi>‰Cwæ*m+/Ón›Q)jæ‘vŒÏÙŒâ:ŒÞv­ÝÍQU5£’g8ÒñV.0ÂÙC •{A õ­š¿yz]±‚ªÛ8ï¾å#v37o–áÅÍ,]?üÐ^ò/›Úh›5ºëž?}dÑ{P ½5m¯!„äHûÒf¬‰§dþý€Ö$ª×|Éôç’”6ŠÛXÇÈ%éWUµTø¦q‚—IêÁò¶™fyø_¥›×¼¥¨ÅZ˲Y6-¾ "ø`€·§«Ssw–]<¦ŒiøBø®ë¿aac‹#›‡&Ê×hRÏ»Ÿ«µ®GÖvzq‰2dìJddÔkSÜ2ìXu'´9 Æc¾HÁ(9,#©sŠ_-!Îa3‹á‘ŒC˜ºÛ;ô×T†ë…§’—üøˆQ—ï?Ž2Å`«'co@ujN½§±ÔìIŸl‡|5ñãQ>\uf2¨8gBš`1pL-DîÝJI{p™ÝÁ`c~æ_jr­1Ðö[ “‹Ë@i[‰LvËMˆmîò­æÈ‘Ê)ÜÑ˹ʱ…¦º(«DqQSxÞèHfIÖnBÄéø¾´ElÆ£ç¬W¢˜ªm”ÇϤæÑkªviKž£Øv|ž9”#„éçÝ7£ì›æùÐ ÅX®}€·Õ(¦%ÜõÅìò[NHš“ KÒáÙ9 Ìú)d¬%ãä…˜|°màGB“©’ÛEAýxˆ,+š1õœdæëKZ7`t­ï̸—Œ¼œXŽvL—tˆO%?2ìl_‚YP•mKç:="50®ò« ˆ *›záuâ0FÇ+ñeóK:­î¦À¶ä¼ªÍÖ7=ðjLE#‘4Sý”NžZ’º«ýЯâg9ºtMäRë¹ÂtÂïœõ¥O_³¶1 0qÂÓŒžú¿§EÀÊÈÐpŸáôžÇUŸçÊÔ4>0ä"úíü 7%ˆ aBþdT:¼x‡v š–uéIùýÂ1s7êpco$ÀÐçg¼ÄrŒáÂ=æ%ìúYbO82§çþæëñV’NødcP]]“å0þäU~V(az. R‘7úã·'<+²˜BµK=ú¢k¤‘y•*®\z‰Ì¶‘öAý&ë1:zý.F¥Êlj‡¥ö¢©Ð/bF»Ãµ+Δ_xR埲¦`°ÄkÛB æ‹w>‡L~þ¨‹«à´}…Ò¢ýåˆÚ,avöxƒˆîÚvj.<õ@Ù>€™ÛT{`A‹ƒÓê¢%:NG?ÿz¼äRÄJûgï*›NE€‘÷A@35 |YPìÚ×0Äù/æÒœ9¸Ìyúôˆ ð¢Ì9]Éó°R Øg¼Âç…V’¢aMá4é-PvHí6&-cËšœ‹D‰ý\lÇ~ ô°'eöÏ®§%¼I/FËøËÓFìE“ùé`q «…Қ¤ˆ‰±¾b:§áhôvÿq$ç´ÝdЉçìD•w.Š¢jýÄÅÍ`è°Ð2Þý`.A†Œ­ÅKimÂÏ…a3P8¢¬û€ÞÅÿ}?ÎAlÉmBZ 5ŠULÎïÆsf$¾i+g‚ ‚íyð7Ÿ¸Óý@܈¨ _¹j¹°I$<¨“4H©· Ä èG¼ cNëîfï#™L]/3[ k‚žÛF1I“‘ÐZPÕÖÎ|ÊÍUjn:/$ã¹ú¥\+«A^æÿ²l%¿˜ÑLÉ ?14Àén%8ØD²çú$ë+Ðúl¥û‡¯ž/ £Äc ‘…AЏáþ\*¢·tS˜ª84}|Lv»ÉÅ™ÝÅ«c_+‹Ga=ßcì®Ù‹=wI»ÿ&=ðÄ~E÷‡þrk»ŽœÈ™`dr·Š)m•¯1'Ð(CÛ±çK¯ghÍ}Æ7°^(h1Õè@qU~B,¾^$oÄ7=¬·ƒÜê1ŒÛ1×ÿìcpùð·°xÒ\5Zsé ž° —å+Ãl_y4~÷å>­€ºÚ~(Þ(õ47Ø5„»9 õǦñ+Š69þRBzVï·þ}m¨Ï9ªi ŒÄÓûÒ÷v‰ø†ãXdõÕgà‘sç•âµ ɼŒ`¹I݃¼#<\a"4È‹šP*ýf~s~ûsªuöcso6lJö©…\˜vûeÂÏ™´BŽà’QEý‚eƒõÑWVLËq«•2[Œ%úÚ?^õ)²œ½ðB8·Û‡Èå@4}º”rsù -ûŽ?•& kÃÅÊÄÎ ñù‰Ÿ¦…õG5yõõa,½…Ê‹ŠõB׉tF«š›Äüñ.9XÇiód o¡¿Ž­//ßpLŽ˜©8H¤Òù=d*ip>Ò]¨ ËnHB9T°öRŠ”½<"ˆn1yO¤áÑXã'¼Ïºo ¿Ðç4³jh²v‡fëÁ£ð¨ZÈa‡¸LÕZ‹áBÿ³Í±âˆÇxâ…µˆe„M¢E{Ï­ç5 «ªßâdèCê;ý@"hŽ/]ì…ÎØ’^—/y—£ƒÙ˜™‡ö@_!¹cThügëV Ãbzl†¼sËÔ½H*uÈ&<[BŸæ.Š‘VÓ–ÅfÅ/'AëŸü£u(µ¶ éËKX`° ;;Ü·92ç'šÂæTú# sc— J =ºP× @ä{M Ý|_],{£;WI¿ËVRíúJˆúC˜¶ç寧ƒ¨¼`ù«Ò Ñ eÙ o(³ýÊл˜É¯‰SÆ›IŒ åÚ¤¨GÒÚc $g¢‚_m¢õ^vÙ8/“;È‚ÖTk>‡ ãÍ´ò¹ÀxóGr)‹MŠÜ–~×Svfཿ>‹·RÂÄðùÁ/löÁµ¹6 m óý¯|pÄ¥oâÂRwGbÈoÄÀ½ ‚œU¸Hcý\ª dïáòì_ãz$›GÈR8~Û9 C[±–zl~0𰆔bµ98 ub’2͠挡#x1]Ūª»„½SSX†)%‘¶vèNëvGÜÏÝÌÍ<æ3Ñ€*Óõ²'jŠ:€Ÿ=ÑYä;>â¬(–ÀM¡q×Ö'åäë)7M2,¡áîy*.‹1@ÄÓ`S«`-NpCk‹ ÀÌðÝdh‹ºJ'Q^ý|¥ÄÁTE`¬…òöÅc".eDt•yÉÃ7sÄ\©¥€BzN„¢ý‰"Âíèn µ3¯qOÒ‘ÉÀTãÇ~¸˜6Þ÷üžv6᪨I-hd¬/½Å‚…ÔœxLv ãhU°ê˜2;»k¡$[(,èöÜ4D½> CÌr[ãzîiÕQ·¤ÐãÝ Yè2E|Û7lB²‹QDÏJ¢šKÇ®ÙhÜɾ]Vˇ9%^«ª…ÈVŸ¢d º×0L²q®Pz'E+sãSo⨡caMRV$Y°º¢%§F†‘ )—Ç­õRϼ€¢§iT]ޏ kÂù6RÔqAO­ÓÆêÄR‘‡s*A-\×.v! ²Ûݨ½É§ÕW(+ŸìhRzÄL }qàú—3Q¢H-”;iüc\8¼¶I.è‚»gàž§=Æuƒ@¿a}îÜ4Ѱ.Ïy gä+ÿÈÖ=\ò³Ë/B4Úfðy5á#“Re_‘›S1Ù‡ú„iëÜ>|™§¢2=«ªÌp9Du”à¸Ñ}b²ïT³-¸k¤èÔg‹AúÃ;6Œ­Çp§Ö¨ÿŒÞl<Œ¦7y>C––ß…Æ£Ö&sÞK4ßD‘>Çâs¡uˆÿmùU:©‚t,Á—¥‰„b½±ªÆ\ÙHH%<ÓJƹÍ=O°î—æö¹¹2›~ ÎßíÌHß,+'Ï‘¢ÅTZ Ð΄lÒz_EÞìá)•¬w¦Ð»Ò;rç1Ì*,G͉R#ý¹ºªfšÓº+9áµpm‡êÈ}ÎÓwtS(`‚žZ¶Uó¼_r²¨ª}¤ùl fÔV’ e<]¬¸À½iÓ€x˜êÕûxžÍkúåýONîæ²Ÿ~3àéUd:~£ü¨ÙE £UôýP•í÷÷@d(Æ,ÝÕa _’¶›&Æ(x¼¹(;YK¢´m ¤gÓÁýl‘Â[z*Vi\£€0l†È%{#©w¶%„‚‘SZ#ÃÓ„ŠãuõµÈ¾P3Õ¢Ó>§Š§õ#¾EÜ9i1W°i´Þ¥ljÃæ–’mؘu‘Ö¶^méàôsMæÛrªz‰Ôå¬lƲ0¡ á¬:&~–­ s£'âæAeþ‚êž²-ÝÌÆdèÖ²ó©µâ ƒv5ß9ŸKæ½P²k´Å'N.¦À»tìWÛWBÌEß-=л‡e‡–ºb}¶+~õsè7@ÿ{´åÜ>rÔ¹Ööf%:>õˆYgv¼=³¬v˜‘'ˆ¹ Vº67xVT~'/ck«‘§Í/ÕuÙA¬øÜÑ:ûRÇ?ç­Þk‚sg‘iÿ±žPh%ÿn\õO«{œÐAQðDÑQEôÔ)&ð{ÑH ­ÅgdooEãºlNœ|þØ>®þÖáãöˆ¶{úZÛx þÆà^•qåç%Џã]в :̈wÔ¨ô›WšôM6ËhðÀxë¸æ7ª+ãk¤ [þÎz.=¦â5|TË_ú´olÆØ–75I ¶_ýÓ>‰˜al×b@0¸=RÚº!&‰MvR·áhžÞë0ΊÆ8ÏJ9¯x|`åüú“ˆeznh;ü¹úŠÍödìš÷ZUçµC¢ˆþ¢l:ROÞ‡ƒâožÃ'ûóR#]ã”2S2:5(0õp‡ÝzÇî+øë÷Uë„þDÓ/fc:N­àh̘ÖÙUàEoYr ¿ lY´x!Š}¯'5RåÊvêj­ B>ì&>@57ìš‘ŸN ‰?âþ¤ÿé –6ÍSX sÊo§2ž¼1!-ÂgܧÈz寂¿`Ê~Fò‰ø`)A¡Xƒu©àõ"ý$ Ñ2qPù5yÈ`œvG::’ÓB*&|ë¡/]qÃß”AY-Ž¢ãÍìµÐ(;¸Ðól“V –úË÷™Oß…bôgƈ6🪔ž¶[ÞC£Ã‡Ï¤PQF;™i´ (ðozùB†®²4¦“ ôö’Vå9dé…YÛYÚ%FÎq<Úðlµöܬ9k>—{ª?ÍÖ†!Ò{‰7 ýuØx=6O_Ç9Iaܵs´ ÍËaFr\eáâU¥„ÈíÁŠsA+)3tv!´ËCtƒú>dKÝ6n¿¿a»3yÂ2ŒÑßd£}š&¢ÚOžWÃl¢-%v¯4 Àáwë?&3P«t4 £`¡{»VÞK ¬Ìér_),ºRÊþ*¯™á!ôö)ys'eàê±¹’LSYx"€ß:j6hNÅ·K]endšµua6êLäN÷(|Ž:v&ÒèZø%$‰ág¥‰Óña"ûv?­€˜[ã–+ŸŒNžîÝtétmKNÙ‘7¸°èÕÏî\Ç<ïI f†ZT`Ыä·XNÍøžö4Ý2¤Ûèß|i½^eí_ˆIDF‘„øà³¿µ±Z`¦¡KŽÖ†KÔ×2BúÁëúpqœ\ÙøëíË.l'ä·â×>]||LÞÂF®#ŒIj0Œ)»¾ðe®™ÈüæQNÓ¯YÞQåD‰Ð[,zTLWWùý°“$s}c"8Þ9kÚu±jþü›ž#ãZ…Â'؞ϛîÃz3*Ýýt±4Š· ,è… ,ÆB3YæònR4º…÷ “:LçéWÍú6ŽF,ÉH,½™P(ñŒëW²òô'ëÁG òø&‘¿QŠ´ÍX*ZÚš0ä†r1­Þ®áuòdÙsiê*“­ß{ÓŸUDØ™>¤|xeÐ ÜP©îŠa 蔡_åÛ<጑$Æâõ‡ÏºßòÕRUf ¥\Ð)Éën¡á0 ‡ô]†Ëfcж ¨0PX>e"Ž&;%=-õò?eOA„Žb]ìaÇ1'A€¡ Þª¹$¿ÎaÝ_ÎR>Y$‰îBs!/Ðe™iË }£õµIòfêÝÍôÜúTØiTÛÓxÃÌ_#ýÜ™éA¦+v“¿˜¾fÆ÷DÓ†­äj]È ¨à›<É)rc_f{^'ô-ÊÇù‹n…(ˆà+Ä£xu3q’;  ÚÂ…€‡WüH"åÄ f“(2s2c=Ý€2ºf3Aîc½Ö¾ƒ'‹ÇÜ#îgé Dv»²;ªÜd憄ñ)_CTæ†)Þvæ™æ¤Ÿ÷u¾Z›\*ë€eKľó”~²ê¿&’aþÔ,—‰¬¬W Ñ`Lø÷© ýqÅœ>QFF(‘W¡Ì­][Z$&g~*2´k]ä#? ŠUú"ü¹vêå`ÇÂLä[)!QeoþûcùàYö§>ÒY#Ü@‚E’og†j`øïøˆ›…ŠDáøÖ¿¤/w¸&2¼j=ÌŠè…Ké°§ãoá4fVš|(ýh¢f~Qà»Z—–˜5>9¯G‹ï"ÎT2i<›eî¼u"(¶l†’§åâªG\{Ð×-úG™) ™J²®ŸDºR†Õ›¡É«*(TâûZôéÿŠ1!"¨¾31þŠnÜyÎŽ‚TZöê¶j­nLs‚‹´‡ÔõLM*& Þ‡;@&¯pèêÍíZßK6¸n|‚¸Œõ”•D"…"þ”ÜÌ$½³YÔ ¨ø¶‚Œty+Þ£5?é‡Wv…ÃÅÍpéÉa6¨™haOáÏbåÙ i{7FkÿÁYý6ûÃ,k¤M,ë‹Yjé<$ùà:ØŽ`v–óJª<ÐCu"ɉ>ƒ²*ìhP&\îY×3¥ÌôqQ§vËgdþ¥Có¢w¸OgŸËµ>†eô8V¿?¹k2E·D`F‡ê…Ï_ãCb½µ´m yo{ Ú%gö2ųdÊõöKþÖñ s°ˆñŽ0 ËEA:·/vm©ÿXŸÍƒÒ:W…cKA· T°ÇÑdŽfd¬¾]¼+B†«S'ßl=]ãä0¿1¾lÓo\[ãç*%—D¡Mã¡bìÑÍŸƒHªy³¼5Ä«x>Q a ˜ÕÎAÙ«DX_Úq£z0¢T‰SƒËÄW乫[‘Q~xò8±içí×%@å]™8+É‘”t·­: <‡¯bb…‡ªqQñ|<]ÃûCÚ0{ÛÔlh9c<$nÀ¸t«ls%•-Ћ!4Š^™Á>·?” ŸT½0"½;­ ¡A¸ñ“?Qºe„ºÙ®×[{ð‹6~itÈcГ®g.JË÷ŸfЩ0'ݲn÷©é!²¾/',**é@l7ˆ“Kx|µ£›ôB£Æ±ŸÞ¢b±3•áƒÍ·ª®uY¤ªÃËöp‘sñü혧ƒÛn%Ò°þvàXû×–qOZõ'‚bÍ P¸ïÄÁ´±~ ©ÃÄ&õêËú2e¼J$y¬ÙcçÏû ïÛ#;c̉'}¬1å9ÿ¸§E99 ˜E'ÂAüWå®bß–îÒ1«ÍCqüß/²®Gž›è_Šà¿ˆó5T¯-FyÕfŠnCAóޝqc?„öŽ6rCºÐ-§_Í_²UKHø” ”Ú;á¢P8vPzÛ`Ÿ| dW„Œ5ög¾6C*~µKŒJTï|¡}_NŸë_hŒþÊ>&"W?¾ÓªÆôpI¤×Ó–4¢Ä˜Ç(;Q%ÿ ޹›þvC¶Y¿¬& ÇCS"·Jè^»X…í,ÉÃ-»›š†{’øÈM¾]S“‰ƒSNϼ¤°Ÿi3œ8´Ë, x€fž¾/c-3½¡gÐäÖ/ÝêlÊóU¿Ø5¤uºÍmº }MXšŠ¥,›àî©gûhÄ&7. þ :;?º/}‹g(ɬ²5üÜŽ¾îÈ–ðG;tî Bþ©|‹ 9÷Ãe›œðÊðb?ýGö` Fœ¼8Jnõ܉Î\ñß{zD÷¿gsööÈsã"‚éxwº­fÐû/]Ôf— ÃîàiŸ…q E×Ê·‰ðÏqà|Þ+÷BAÿȸíÈ“&–áçJ#iƱA×i\ê•–æ-9{àë)uïYP•~úP.óXªŽ³Ü+ó XèO¹òÉÁÕ: qò­]@—³¸ƒ—Aì)–éX€ “ÔŽ;KûaåsÄ£óã«õiàŸ°c»ìû-¶á7ßøŠQä*.´©Þò“a¯x:7ø(¿Ë§â?×D½3g’PñüXÊŸ>)®øh(ùøÑÖ¦ë£S‚×ý/)Î]Žqä ’¤Á¢$°$—-?Q㓪"+Pt>Ÿ#°Ë©Í|AbMfvDk"þ’Cõb¿<§Ù b¯ŒÐ6µ³bOFØY‚0®ÁðŠ¿+à YZ-«UFå,¥c1Ö n|]Æ+^Yà¸lö¥ß˜·rªÏ(˜ã(7*í_äœf*YËc;ùùfO(jxÙ*j (-xÃaÿC"‚ F/ô® vÑP¾Íɰ6cÊûži$ã©- imÊ߬oêdèy´M÷sÝ[…–¸¶êk‡}äÖ—sD»qY ò¶<$"ê›áÂÉåÐØ6L“ Âi‹å‡S7•=·Ù–L¤9ªëù_q\ñ­{üƒcéaÇ=;¦n;N*ÉA N¯'±íB‰›»“Ï¥]ö!ä`%Q.ÊÚobÐÄ–¡×œ…!"BÙˆÿbGŠ|»þΓÏù(ÎX¶n›¥R|P1j?{u.÷ú{_ð´§>ôöGg„ o>Øï?=MÖ'·ï ™ÙÔ7H¤æË¤°—XQK&Ú Ú3†ÀøHHab7Ôøö¨yÕû6æ »ÁO¢Ë³óÚLÍ&!«ҋòmK8åXw÷L²oa|(œ¾‚ó.ÙN•\¹–ÝZ¥ÞÆB(]ù3бèÍ$ö¦ûúqà,wJo±pİp˃üT¡>fË…§‰é6V\d€ì¼–0©‡öÃø^êBܾ§´R›¤—TçÚ”c„€”•+x(Œu½|Ö÷„¹¬½­‡Sؽ†»}hÓ Aѱ„‚0œÏ9F£–ØŸL+óê-Å:™¬<Ô²v(‘—™uC¤4r¥…Ñ9»Fîþ)Ú~}.‰Ï%aòAã]Í#}Ÿ¶éÛ¯IS“œŠõß"ú]f[åôîŒÚþh\^ùX_ÄçèoÚK´­iKôŸ£‰Û$¨Õgö9ƒ®©~Ò:9¦n–9¨vÿªÃ.BaãkAÖéQÿÑCæZù«S®Óo z^«u6•è)¥œocíâãÞh-n:#u˜]kŠÞ¬º_ß%ÍX*ŽH¬*æÎàë!âóá3VÔÖ¡Hb@"[!†;$2P_yû•<ëàH‡O™Ú2‚v8Î Ù’¯.ãW5ºÃ!?‰c¯Á®ÖZޤO–ì¡ñÏö­ ÜkwQW÷ÃHœuÈ\AÅ2ÍÛÎÄ IÛs]-â-Ür䌕4È©:ÞJ¡ê¨}ŒƒÝß’IëV\e e mÌÆ`'P¿:«mÎÅÿë®Rø`•«ÌÊ@L6Ft<]†Ä®û•q®±G 6³H Ïæ¯~6µKV{ùV“è®®¡Ûw–±cSC àå®üñ §Ùä-~÷ÓÐpa…6³³$Uª÷Nž «€´Ó/¯h_€ Sâ‡Q$’äüyóädü$™=«u%-Æ ä#4UW]Á·¢mâ”ÌÞ)˜IJH_Úø®Tg¥®x2ÚëË=Jo8DGèûЬÏ„zÎ"$u‹Ë®™¶'Xg¾ìm–úÂO1ý¶’ò¹=£'ñšÛ”Ü…V7)GMGìûñ{´ín~LSW"Ââ&­?®/ïÁ}Ò-Ÿ1ÛØ«ÄüXÝÕí’'+'ˆQ¼l[Ë¿"P™+å;k(av*쬔Z¹¶{J  ‹w_p:ÝL)e\¸©%õ´‰„#IÒwIfÚ°ÒKGìó§ÝÀ ëdùFXp6P¾—X[šÍB3Ö\±¦'K´ F.ÇÄÌî”v²ÓGOK|ˉÐxÉh޾ 3ʽµÿ|Ú¯lC7N@ææNÚcÿ™OŽPî&X5(:â ý‡)‡,Íì[d€Æª¬U„Q4%¡=`'»ÊÏþþ.¬ ½±©OiW‰DRÿ«Ã-O·”‘¬‡úcÉd¹\$/ßæÇF1|›¾ÀÐ0(Šoóí?àç[éÿ¬^ðîêRyâüŽTbàË›‘œ¾ñÎŒƒýÓ´í&®õÎ"EÏŸ¿Ò sfs5ØÂG ƒ4›99~ó5¼óÝΉôÛ.¼²P•CÛa÷‡]iðØu†)oât§ dÄ“„þîgµ?eÇÚ(w+ûœ…çb$¸Ž²°/!ÆÕxl%aÄqº$ú„eþ™ —›)%{® žëî¢Û„ÚdÀ k·€Ø4bÄn¢{Iˆ”S”¦3.ßH€êãŒ8¹ù…P”³}Zê¼ÊIŔߜŒ‘˜â:˜nz7à>Ä{3:ÈJ:ƒã¯è ûDë2wñÏ¡ÍÁ)=ý“ATMrˆ»‚^Ò´‹¸¼„‚pÁozjýªœrLvX8乓§žM@ä“hªî-…co_dÀ¦ËY¹ôÏBºaxÔúÚN*I{g³–š©~oÈMVFÒÞœ’V$›KËÐk3HÁô0@©Ž…1§÷Y}m9GåLÿF‚Œd7´j¦÷Ûðµ$í÷Böû_Úª±ê–°¤£½´Û̾—(i¼.B¬=?¾²2 QÃQ$wý>Ubï%>QšGî²úÍEÆMq’áê¶9úŸ˜?ß”p¶£o›à©èp.E‰~˜ž´ ™QæqE)å Š{ šÙŽÊÉ7=µ;‰%puqcú0=Cë̱E62â 0å¡ÍÅà{më?»Õ¦¨ú‡ÀÅÉ…T8[Áм2¶ÉYJ$+.°82WE5PCZÂÕ¦"~ ðZ‰k½Ž>T/Ú×íBe÷“¸ š¾ðQÆFBFœA_s={fm´aõ~Ž+ÀÖRW…ÁŒfC©È¤“ëÌ{5ùµ´ˆHni‚§§:vƒC™˜9žnͺ¬NõDljS“²9ÿ¬ZµL†¾AE?íz¹¾è™AvX 9ñ*Èî«“†].ŠƒøÆâZ%×H%û«òWjOüìdÈcäyžAÐì9c€™!áàU3ÆkoMéwǩÅc~5*xþöw;Ê(ÏÁ½&eKeïSÇYÁìì 3(k·>­¾Ÿ~*LŽeŽ·új€..SR÷ã+q2-ñ |Gñ6 G8ÌÔ(Ì—îWÂNkY0† äwÞ8!´w§’–³à0an‡Æþ?ü ý‚ÿ'Ìí-MÁ® S°ÒÿíB ìendstream endobj 1333 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 34 /LastChar 122 /Widths 2833 0 R /BaseFont /LXSHKS+NimbusMonL-ReguObli /FontDescriptor 1331 0 R >> endobj 1331 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /LXSHKS+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/slash/zero/four/six/colon/equal/B/C/D/E/F/I/K/L/N/O/R/S/T/W/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 1332 0 R >> endobj 2833 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 600 600 0 0 0 600 0 600 0 0 0 600 0 0 600 0 0 0 0 600 600 600 600 600 0 0 600 0 600 600 0 600 600 0 0 600 600 600 0 0 600 0 600 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1257 0 obj << /Length1 1606 /Length2 17489 /Length3 532 /Length 18402 /Filter /FlateDecode >> stream xÚ¬µcx¦]Ó%ÛfçŠm›ÛöÛ¶mÛ¤c;騶mwœô×÷óÌÌ;Çóͯ™÷Çy箪½jU­Ú{“+ªÐ ›ÚÅíí\虘xò–¶Æ®Îröv²ô"ö6¦€¿Fv8rrQ' ‘‹¥½˜‘  4ˆM,,fnnn8r€¨½ƒ§“¥¹… €JMYƒš––î¿,ÿ„Œ=ÿ§çïNgKs;Åß7 ½ƒ-ÐÎå/ÄÿõF àb˜YÚ¢ ŠZRò* y5€ÐèddPt5¶±4ÈZšíœÔ3{'€Í¿{;SËJsfø‹%ì 08;M,ÿnz˜þqÑ€N¶–ÎÎÿ–Îs'#;—¿=p±XڙظšþCà¯ÝÌþ_„œìÿFØþõýS´wvq6q²tpüͪ(&þož.F.ÿäv¶üëØ›ý4µ7qý§¤ùþÂüõºYÚ9\€.ÿä2L-lŒ<ÿæþ æàdù/®Î–væÿÅ€à47r2µ:;ÿ…ù‹ýOwþ«NÀÿV½‘ƒƒç¿vÛÿ+êq°tqÚ˜1À1³üÍiâò7·¹¥ã?ƒ"egf`fú·ÝÔÕáúÜ€NÿjÕ?3Cý—„‘©½'ÀhÇ(oïò7%€êÿNe†ÿ>‘ÿ$þoø¿EÞÿ7qÿS£ÿíÿ¿žçÿ„wµ±‘7²ý;ÿ¾`o{€,àŸ;æÿkdkiãùˆþÏ@ à¿þŸ@¤\Œþ¶AØÎü¯L Lÿ6Z:‹[zM-]L,fF6{ô/»š)ÐÉÆÒøW˵@ÏÌÄô>U Kk»šÎþoÐÎô?™ÿ•ç_¼e„åThÿó6ýW”â_Õ]T=þûuÈÙ›þ¯Å?""öoz6V= '€ƒ‹ÀÅÉìûÈö/æÿZ˹8Yztþ–ÌÄü¯ÂÿÇ÷_+½ÿ€ùngboúÏ”¨¸Ù™þ¬ÿeøÇmâêäôWÏõ¿ÿÏõ¿FôšÀ­-Û›ð†XedgºÔaçOŠé ô1ƒ‡:”7ª–ÔØ÷úgDìrW~Ô†24Mó|µ{.;|JÓöaÙPö¦¯ |I©û‹P·(:9i‚õË3/4b¼oew ´9˜Ôö&•”õË> §;Y`nž©HÝŠ0ÈžüLÒâ1»Pš@ÐêŠÏ/(’OŸŸ(ÇF†‡zï ûñióâaÉyÝ )¢óðµÕª¼#i–޳Æ'm°„.˜Ì{‡¥¸±86"˜#x·ª†Ý}¯±ïOUàG앆‰]/­¼‚ú“çúð“:÷›Ì(º‰ïv~bH$߸JŸ¬³¢œò{d`!˜-× ÇJ¹EÆæöÄ‚ºÀý:yŠåÛ-߃E‘œc麉”ÿÌIQ?sP£²Áø˜7VB¹«q#CñìéÏä®Nc€¯@gÏÁ¬óqY: ‹#6?GÍœ'¨òÙºë Ö À_`ðü*ë’Psz þÞuû[T9Pƒæ¸‘WÅЯçøÅxqD¹ædªw^sÄM]SÏx .¯‰¹í9I1X0ô®-ƒHG¹æ ê¢[UØ—DgŸ‡ãµË V«å0çÛ8æ£\¼Ý þZ¯a®¿fm×àaÀ5jî(!ò8þ ƒþ¶­¡^€èÍ{[„ïÃ÷ˆ’áØÒû§Ÿæ¿òç‚F.“@mô¤…{ *üàYa^’>#‘»È^™éµ]M»ñ!O>Ú6:ì௽µ©ß¿Øüäi:.C³ªwtã~êËRþÚÐxùܳð›A£^ë€3w=¨ÄËM¶ï9Ïqºx+ïˆäš§(·%Ìß2U‘ÂÙ‚q·¸«H.¿ž°Mý¥Óæ[ÔÞ»V›éïx"æk“­Ú«öþÕ—n:™C -cšÈá7Ÿ¥íß)ß ÂëÜùšï‰–PdÊû<€‡2¨O»ðK4ÿDí€ó]ë&²A– K0É¡R6uÙ ]Þ ½ÚIoï»f€^êØ‘é­?rËÈÒhéN¿³MzK¾3üºí±å8?•…ð51"AAžiꘫL’æ2=­Fæ–=éû&û-¯uuY#RæýÁ)„ã`î„ •H1KwJ,b#DÌÔ*S³=œ2èqvÚD‚„ŽQ§nî÷ßáB0$fúî‘UMpšà¯š¦tD6•“ÿ1ºµ…ðÇ9Ÿ’®„÷x¬Y \Â,áüº§Òç5qí'tî‘‹ †¥És™¿Ò³-,ðUfÙšÆ$}°:êPX~ ´!çI p4œ>Ô(ïTŠI}\‡1Œ¯¨D=Jð[¾Ï¼aš¾в=Ð|öÒ½ÖÿRB)¥¹¥´Ÿúhþ!s†íòÙMT/å÷<0YÛ?íþŽ !ªU Ïš(6ŸN{=GÑZœbIPÔ×â·ß¼hß#SlîLŸôq6q 3H;îÉ¢–ÄÆUTt=¶kxR©MTIßý4#Ææ|Î*_ ̤QkJ„Á܉?Ø?DñÞ<Ý fKhÁß­wl£1Џ‰2O}zzqÀ¤&~”zÞr,R p·Šœžq—<%@‹ \Âß ‡ñªco‡?ÜÞ/ú×Ñljçù®ý„¨²ÒÅ¡s7X Gä:ö£°çZe²\é9`¶õkò$4•D™—3¶ÑHb²ý2HôüQ\`­„mÛhf*“sbóà'ý©ÌJ&?ý(d0îæmè…MùÐÁ¶å̯L³Ö.KÔgZj‹¸¿°äQc»ÊÎ Úˆy\•°‡3À44ž•Ɖ×O8SÀÊ›ó‘Ëm¸4"Ñ6yøâÙí vJ‘ß¿p鯛l›:d_gB÷áú Ó~»t½Åõ³nIÎËâ%9@C«%Ô˜8pœÁvþ¤÷Òf0„>Lýº„Öûê×Ì.¥2´sü[o]lý"p5ÙMÚŒeŠÿ5óÂÅ~-!Ϻþ.Á£^#„u|ë’[3´¾¯“¾ÄÒ Fê^4½¾sŠ5%Bw/k~Ýw½ªˆ˜;ÿ\'’¶a†òñ͇ñ· .’µèN~T1”t?9¼lxffÌóÌÀ— ¶ÕAÐX-^ØðÙa–ë|“Så;(Ÿô¶JN­m;~@‹°°a-ö{»Š+eü2·mÀ3yK¢<’æÞ`ê¯Â4}XšŒ¯µžÉ‰pUþÆØ›ºÅ1›ûïH D³áúGšÝSTïÝ6wzB2 ,îÀ¢ù&¿#gîê-ò§uýÆ6ûÔO^‡ »mÚztÓd¢v—‚fßY5xuÑ"ê‚"Ë9Èpú̳Eº/¬èŸ&>²0€ãíoŽÆ ¨¡ü•Ûˆ¢…[0tÛòÝí%÷ÚRçœÐÕEïñù[#û{Rñâ"+Q ¨Q˜JšzAgXʦݼ™Wú-cJyû(ƒ›K’êD½9Bº<¬䤒¹.Ÿk§EE˜¬Ûæà]¯@w×O.4~Z¢ÜFµÒEibK7 @ÆÆ=óYZ[åTmWZ2JîQ2²Qeì£r›+®¦~"þ•»Íá i)ÃL3œºØj/:ïñÙÒòЧDx:sIßmšÝ?W\„¤˜0¼‰|GZ5÷tp4.\P,5¿ .üRø#.c+g÷¯ð”ãlkÑ´Eò-P›æO&ûïÓ ³ŽfsYÎ5‘²p™¯ë"Aå?©ëÊqf¯²¦+„ÓÿÄà Á´2ߘŒk”¸CéÅTÐô‡²£‚:˜ó˜¿8 {½1Odyh¥Ø€TùJ^:–Èæ c6±×µB¾³˜ þ Ç›IU"E¥ý. û º¬-v—ÃbÕåTpXE'x,’¯äb€ÂôÅ_)i,{Å1>(Eâ:?Ÿ`lT`ŒÚä®÷d±% Ö8A·[œãÓbÒσiòfgrÐK¹)'™Ê›¨‚ôY<çÒŒ®W`¾3—+L{LøN‡ÊìÍtØ<ˆH­[wä}w‘ŠaÌ`óLÔH•Yšï<5|G_”*Ù#ˆØùèO–q«w×8c(úûVu1qýÙ­â.çÈö¡ø¹<Ô ]ÖÇ-m£W‰©âCÎÙjƒ„cGnå{ÅøLÂêŽ%Uƒ/_6)§¯ýmÀŠð£Íš%Ê4ž½yIg` íP¾æ~ê=‹âAzò˜3æµvtG4pE9#.‰PUº†Ü»zCçÇ}Æâ LP‚ö(ØÔP9•Õ¯E÷ä]†³{dq¢l2°éìä·ŸÀÞ«=Ø)Ñ7FÂ+sFYI!hr%÷å¨Ë>)ñ•ü…?[P£5agë­ÅŽP«43Ú?#À~V÷ðk¼¤ÜVS⥲ $ÏÿºTó“ÒÂðøÕyD]ÇædÊÚþ+ŠRFãk>æ}úS­Çˆ¡#ÔêÆB1¬€µÜjõpBã0o´‹º¾ûZˆÈušp…€ë¢rxu$±Ã…¶_ã /öƒ–®¥ï§j.Ä7%í ª¡G‚a¿Gå}uÊúVÕñb6ïY‰=A@X+éäO÷¼^Õ v8^l‘[þ¼Æù÷yöõÁËò>Õ&‚ ×KºR‰P® Ìé"Vxag˜ˆ<ß_’Šn“Šõ^ÂDR`HÜÅ·ÁuXÿdÀà½ômgëH'â²Vħl«tk¨µÊS¸˜ª éýÑÔ*%ì5ÖÓšü&ô¼üÔ¨‹$ê`øÐ•¸ ±ì!Ò5.û^ü€p¿m v›É?°…'rÝX#k³r"çúYr™áÞÔVêÀ»—ãlç8Ìw)Úu‚Íü˜|’š“ÿ:°Aæýz‡~·§1V4?ªäšuæ×õ“…<2I_³^KT L÷a.„º¤ƒ­ ÒîBœn]×qÀ~æ‹yçÿ)‹'•üD#s‘&Ç>1˜`ðÀ/kY'c´¡èƳE ‘1K±ï{ø<Ùâé§}ô¹ø*i›µ#ÝRüÈ}bÃ1™$ýøsX?üU+·¦‚áæª2|Ų[°*}¿Ïþ5Ô®z`oA'å|³âÎP‘øÅyYß›×/\ƒ•ø¢n­B'ö¯ÕŠæ¹âÀÈDót$Bv#çâ6ojdœ®äÔ[ÊÓ·ÈI²úÔüiÊ›õ–· ­‡®k¹õ#á™àzòÜ·û@Ô‰‡b§lS©gI©,?ΦF˜.)okòè?øó¹uÀpÈëÎ2[—MùÇ/v\TàÔuÖ¨O‰ß¼ÒC|^ˆX³·™¶eˆ.'Ü1Ð?SXï[ԛлüüZ¿CküvÒ·´S—' ˜dN†2?Ô_î v$ÕËкK£Ø¥p“nQ¦OŠŠ{óoì]dÜîÛç´ ‹&x_öÔwü^u(à Ç•i,ˆA > xÞíO? 7Gjƒ}> >ˆ‘òø—´iÌè@6¤«ÛðkÐÚ­L¤…¢×úN<üŸYghi­†ªKí[JA³†sl1œÎ£aÞWsö£ÛWT˶)À¢BT»[¸(µ–‰…ý HKŠru*'ì:¯½ˆ=d1lÃQ“–+»PÔQmÆÕQùDZ$!—è´9£ l˜YñŸ]œ•dq…ÝL+½|q£7(Ÿ2ìd»²GàR"‹5—ãtí )ï]J)táê[ c2¨º.#ãý—åï`ì Óö°d+(sEK¸r¦›% ØÝÏ? g'×±j×ýtòišïÒ——ýß iÉmYÁ5ñÑCÀÓLí¯Wù )É'³…BO  š‘¨Li¨¬3Œë†*¼ õás3OzU¶Û”`…J#€©xÃ!Ç LáCZ±ÿòLZå$’mÿ†ÏÓ×=O€–Pt®|ø:²ðj?âWˆõfm×?n®8!ùC·"ê59,±4 %¢£¼ÈoJLú¥N®yæ¡oSj› ­åÑ úŒé남xM·qCoŽ¥K¹=¬ÝxmPE»‘– × vWÂILE³ùu³bÖ[â*°…ë9x÷wµÇØwá‘”}M’V2Cßçñ¾"ò÷ħʉåÖ]B>¦ÆeëækBz ÊX û´0 MßÎU»Èœ ˜‹8&ŒSÿùnärKx3{+ÞÛnàáŠ,R´Ë³3uf•å]êo)–xw\{+·(çK—ùÍ ”§áó”_(­î~ZE·ÃŽ¿r=´1¡Gå{â¯'¼Hcß¡G3^ožš=Ë]¤Ë˜ñÔèàro]|QC±÷•аd½o­=œ$st"‰Ø5£‚Ÿö¥£ék¥v,g>è˜Ì'‡¦¡*¾®´ÔùÉ%ÊÐàQº§âÑM!5 0ʬpÂt)ÿNðˤ—zÆŠ@̳k^=]©õnuœ§ ü…¤eyÍ„j‰8ÙÂH¤i…”]LäKjOÔ”*Ó…kê†k[„Ÿ¿[@Z\;'“tÐÅaÅ[)a»8¦cm÷ˆÏt£Pp+MDL×bû|¨b1y¾#4&ƒ¯âw”qi+è!‡hæÖïxQ»Ðý"¾;e¹ƒO­8Âz©Ñ¢æCq5®Í¥+ÔæôFŸ´ù~A×¹1×óbÄÆËüšN)«¶I;Rñ€”@xùL,ç(S= ÷}¹‚Χ®–¸Ã1}Éqœ|¤å8»5‘þ·×úÚç¥!€ñ5®Y®®Ütðe½¬¹LÍ¢®š"S¤ªžÂ•ëj…¼¡ñ]Ê8_QÌ.Füº бŽXß4ÎÛç¨Ns+‡ýg¤$¢Tº¥T^JVå‚w£>ÙqscêìÇæ ™P}öÛÖ¬M­r÷S…`8:º·!öëþ¹,æÉtW™çY=«‹y¶£—5÷í îJêÞ5t*¹D³ã9ŒþÁÔ)AV)ýK\Žd@ æ0Æ[‚‰00¿ÔÛI”eIõ ޹¥ ŒaØ&oäx¹—ö°ÌëÝñ‡þî…\¼%½š.²™{!µ£ 54\ß!µÆ?`wÒ¬E»œSѬ(› uѺ?^|êƒßvkižGäZ³6ž€Ï6Å*Öí…y hŽÈõ›\OôÜ`&;\ô­(áü­:Ç©Ýân´v(DøâôdˆaÖgÙÛ’ñFþ148¹¢ßŒÇ%‰»13#r¨MÔ°4â8‰ÜéTÃÛŽ bbÅiïй$Üꢙo¦žRk¢l&ÃÆ«zëKB{¦k&×;ô­Ü"di“ óGîÞÏèô•D§S5}¾ÒØ’Å*ØóNFoï@Š'}è/矓§¶Rf}b ‰hæBds@hé1 7`Q'YBô¥Í]ľ²†kï×Zü{Ùïç‘á ³’çÐgð!ã’ Nn¼–¬îTâžÇ6™!x~Áx¾¾†]¢ìñ$nR“ê ÜQÍàæÃÁ«ñX±Ø%ZxNç¨ç”tºðà‡Um½_a°H R¶3Õ"Dd¯q½›$»! º[êуA±Ë;]3Ž=ßcR|ëù’”ŸÆ_Ý™ö6æ-þÄ{–2¨2ÏRu6›ããžVX~V ±üÖŽ…š|S‚—²¨¡ñÕÄÎ.ÉŠÒÂjZu~“,_JÿqB欱˜<Ža˜Šrˆ‰¡;ü°û&YÜ øNCǯ¹ûÄ„¦¬¿7«òÚÞ S€˜Ù;!%áòP_¥‚gMâêšPϛɚ\Un­èæoˆè[,w‰àÙdµˆíÏ­½hø;i¬cWã]h(»IPlf€YltDÆ—®ãÄzÁjõ¹÷¾üòÞ=Â83©g&ô_†¾Zݺ$;mU@Î5 o»˜š=ªk¤íѳ€ú倥¨ûü}Â;š»è*øríçexJ˜Q/^~X YY<-é ‘(‰Ä¯5E2íõ«ßÀó¬:ØP~¡)ûá5œµt—^f>_<ýÅÅ“ü»T=éóóYÍÅoîQ}¸…hÃÍ®#²Ÿ~ꩆšÛÒ…ó\L=SÉ ™<U¿S·ÞÙ$µWbH6¤yÁ”¬Ð¸Ž¨ÏýZöÊöG“ƒA¶O?~{À‚2aáM’ô—tî!ì"-®sš\ '*ì&¬TÀ\´l§S4êŒ^\v›¤øŠº™HX™ÈÆÙþŒo”–¬0ä=SКãuãö&¯!ëP_é…_¡´):Œš?Xô®K×ÿ€¹Æ·þî0³E®Òï¨î…UDkãnSá»ì[tðF0+ÝÓ ×{]ýÅÕBÁö–°°ìÃÎIAÚ —zÀov©°Êû°&Ïåi0iª<øY£ZØßó!Í?´ý®?¾³W‰ý20[Ý:Ü&æ>CÕ¦Êg–­ÐzÅ‚çÁ~¥þ‰9ÇàÈA~!ûQ‹;‚ô øü,®oƒ¸E%÷—…<4y{7nÓKç ’–‚Kß°RHHæÓz…»óákÛßñK¹?NCC6Þí›….&ââƒAôh8€õ)Íð7íÖš\D?øÜ1ñ½$q”UÞB Š.˪U)•؇I|æûFÀ…†\§â¦Ý`%ÚÐSC<\ôèÉ"´ZLáCX#”¶´çá·†PË1ÍH9Ž?·­ìRK–"Äß”ìœn[O2ïC¢Ó› Åq\`Þ³ ,‡­1ólw:)*Ü F Ï_ÁÓ+øªÑ"¡8cöFÀ5L¼{ÂrsH¦ D"('²—çReLüƨ“sFòZ«ƒg[>¸´b‹¤wW,¼@•© tNlÔÄ{=ãÝ|üS/³Ì?!7vw¾¡Q@ØÒ¢lÎAµÅöö&N¼ÍÈ o”ã©J<ÛíŸSš ¤i˜Ê§~Ĭu;àÍbg8³L¥w}²­³,'2iiæýäzºk×Ûº„–~NûºõåßÚø±Ôuʫ Œ½NÄ·Ã,Ñ/YÔèO”Û’ïÆ19øC00eÁEc•æ¹v\¿MÛEÂÄk%À'½‰´ëžd6$kŽŸüHLب¥fà"°ÆèQŽºüqwÞ¨Âõ–ØßHªU-^?P‰1r;Õ0›,9ˆ¢ #ÞqÔ¹¯WgŠ"=‘H;n&¾³ö–2Y‰BÙ³ç²)î?ÕçŸ}4‹Á]=F5úË—nÜŒîôwçá,tµ¯kΉœU¾k£ó‡s“VKZsÕ‘/d?‚ÛÛ;î:êzpµúíÀ´""BÛý`“ô†v℉eÌ"¦>‰~6„¥ï'YRVfåŒY½’Ÿ–óTîèæ‚tÚ«úåÞ, R¥G”þSÂ[ñ¨E«ïäß:—’LO-í;¯®It• ñDR¬\$ò³Ï;•&ë÷ã€^j£nŒüî£?æ}8Î=dÐÉ…¥ç…„ÇqUFˆ¸æ¬C%5ëÛÈK’am}ÇcJË#Úq&ÅF€§‘pà'ÍTïŽ1Ê”è;œaVyöÃb …¸ý<—×þNð?ìv ¶ ÂÔ Mz¹òš3'¥ËÎü$‰`”8ëŠ?SB…|Z~‡*6'ê|±”ËËÂV>á0ñ’G™„½ú÷Ô±Ö½ÿÔ±XÕT'§M×JJš&÷î`ƒ!–á)=fؘþPs—â?<ˆiwç:%K Œ¯ Ý0ˆVí¯Àœq4kŸZÐ]¾Æ†wîT$þN Uj°ë ÚsÎ÷üòŠöc_ùät ô²zš7[Wy¶èjI¬5 Ô eʒث߈…¥G ¬sÉ«t“J¿çî‰ñ&K"’Ý™¬ñ3b¡ùm)pògõÞ¨Ò@7ZðbùZëë3 $‡–}ÉR?Vô]×s³ëhœHª'H¯œhaVþ|£ïËrË«Ñ ùq½u™Lâ.”_˜÷†ôÛ X„jNÞ(Õ°‚|'þùuÐסCxöÁ  ôyp{Qéõ¤–œVžb#!fw:òâgÐüÚ´Õž´%…͆|qÊžçO˜Šlû¬øMýÛç{DmN>©qH©ciqX̶8;ÏïÌÞUSÙìÍØL1c‹›åp³¼ÉíúÛ‹)$™[ôZ¾¥auq¸Pð°uz/Û{n[R$ø²O}R`£uv>÷r'`©f–:‡ÜÅàœ£l—6¹q{¿bŠp‰áå3À#Úv6ñYๆZTø‰mX¢ßÝ…|áOÝõ œ`F{’l†”0S™· Wv)ËÔûN²ÑqáŽQµµ©íF¼ß©$úE'­")jé¶jE$ÖÖ¿Eý~ì·S/`ImØ ‹L{þËú½ýܨU¶¥!ð™H¤^:ôrºµ‚ƒÌd{gçY4¿‘‘qˆŸ 7ýMÿà2ÝQø1ŽøDAu}×Á½µ¬q¸kJ³é‚’@#‰áy^sy·åÂJ£UÞ¤X)nÄ̺C«Ù"ôÆù*kbíÇŠƒ@àÕá;Œ©Âx¶S½B2Ýj÷5tÝ2ÔsŒÿ% ýRð§§öü'¤¾7Æm)V/øºBƒªÅ¹ ¬cè¦)¶Ù&¹\^Ʊéàòô±„âOúr·s»SçKCdÄË,,YŽRßùøÁ*Qp»pZ¸ñIDtžœJTŠÝ†œÎq1Üü xµËô3õûžÑuô¤aH/Ôìî_ÅCR k—†XzÇJ—F fi§b…¢ÃlùK§Í…ý`èñüªÅÆÒ?ÿ à9;¤Kg±'¹ ‘[3£!<£n“7ó˛̆¬C<²ý|1&‚»ù£ßÛÝN|«‹ù¤qµñKÂµŠ§nÞÃlo,Á¥é&z¡‡s€$–. ë»;Ãû±$•Q_%ßwàìÕ—Â)HHlÈÖAuxøÇÁG­“YŸÖž!j5ä#м-î Dsô·Â=$Nªcr©O>¼š È­yëq"0*ÎUúu¬G Úºñš_õsú.¸:Ô¯ÉØÌÞ4Yoø6;¾ôé½pI§QÀ7L8Ô„Â٬ܻ¶ËóAºóçFuÍév>¢Šñ¢âïé[R…Í[ѧaÈÞÞêßêÕ÷â­ät$=n §n ªþØü‘¨n9Ñ羘cá*ý®Vó,CêpÍ›„H hí&.ö}EMÄ¢]زÊ:³š/5C¸À7‡‰å ”Ûñè™7º5¤:êÇÔ‡õ¥k¼Žjs‹f&1¬KÆZLsØv¬ÀqUµ¢RÌÎZñ5¨¤¦|ßCú£•Ø8ú¼Ÿ÷&d‰ç›š ¹¯õ2¥/Ô>)kY­õà¸s†Öå¡©½LÐÝ(^øYv 1«­À,Út˜•IpÀéÌž8™? ÐÓø~!OÓ¤[gàUbw³´ úT:Áh­Ê­Ë²sMZþ÷œ‰Òb–= ;[¥$´ËZÅ_WHÂA¯:LÊÚ¢9ÈGÑYì¥b›Ï × zeRhPzj#‚N ú˜yújtA‹Š‹¦§e’²É°‚ÄÙºèÄé‚;§g†•Dê¹S,ºQ­€]>TÃ.X »”ÄüU›B]8÷‰­k÷¡²ìè HÛa¢Ùk^ì‘þ'í}ƒE%·š«Ïòâ[ÅRÅÙ, VQ…€Ãù®:Wì ò1x˜ÅÉ„ŽÌ:ÏÃŽ]é%·{²Èïh¬Wáæ,@a&##€)E+6R]¡L˜q“Ëó§G8ëBçŸsJйSjú –%ˆß®5[/ty§åVëÚËè©2—f&,b0C”¼qbÜ*ÚÕæWÒ©=n7]7Çm2ÔÚ$Ú7/5^õÔ?S¶ý®„žÈòNòvÍOéC¥ÜC½‡:R×j1ÉK–pùÁÕ¸´î*ÓŠŒl È:á4Ñ¿„0L5‘ð3[j¶]Gp¾€Œ¤Jpïz t(23/L@öcEƒ¶‡Iüy{I6£4ýÃÒDò95‰ÌâaÅÞÖg¸ÆaWž‚i…^››J<Þ&ØÀ© ¿Îèug P:¦ì<}vSs¯j8 À+$f¸”~`ŸAN0ÍÎy¸ê=(­­UHyJ³þ|²õ™(À¹³o–X³Û§™E –:b¢Ó”u³ñTÃzÐ4}qƒü£ý á_>ÃkØDG£c’§8²Ï1|° ‚XXÒ§ßz¤•tCo¡Æg$‚>½Q'µ/ÓÚ.÷#SŒ[âa¹ëÎsœa§½ØM Wå³l¦ækÌîØ5>=Ä)ËwôæJ9Wvg«ÞkËŽ2|–‡‚{‚µ='æà9§/[ ÙÌT‚Dó†çÊ³Š–žyÂϤF¯õÙ]eÿ¾Ød^"„þ J¶ÔÇ:ÅÄzê9âMÂh³#P7œ¢»£…ÀÙkšžò7(P‘ÅÈP€òaÒ•éÀ}ÝöëŠ,$ê&€×VÖ@b)]‚níòÔgê?Î. X½VÖz°bŸžãÛøà3у¿[B!¬¸à‹0|ù¬°1¾Ì%Y¶RhÇæüÅõ¼LçÝbÍ”lsœRK'äîP ÷ÕJò5äÐ:^¼lµþ¨æ/-"H:%§`#¾èµKv’cdò¦d aYŠòTaØ ÃløK.»VµÖ"ÔÇ”Ýè ËF0QÃ7šÑájR°šðð:?­ {ó×Zû0'æ^­^TK‰)—&ž×aj ¨%ùìczÉ€a÷ô…¦‰^n¸¾‘³:òÉï&/_!•ƽ:0~¾î»ãÉ„G su©“4ûºVÔn:-}5Ä} ŠRúãmïåªàªskŽÌÛd‰…(U¡\ÂzµMÄ© ÑEÅnDµº“o,zŠþJH0ÿ\™Úkõ»mqWE)×¼ÈîÐÖ̺þâîocé» Ž[œI“QW$JÛJj¸ºÂ)'Ÿ%Õ)A3uñFéж۵ õÇ*"Åô»ß8~¡¸à~†‹!‰zךb§Êg´‹æ¯}oÔý¢àÐæaiCÇn/‡‘?,ÊÊ­æm»Iƒ¬~©§à¯áâñZyó§ú™Š‡úx®ãª)§øÆRtpÄÌÌUÎz+ö$ÎÖÌÇOНÏLªh’€¹eÒKÛ¡IâGhÒ˜åS” $¾5(D[ Vx±Ò/¡Ê‘…kTzÏJë À.Ç_N¸wKÍ:4bu‚jðtg¥+û”HåbÐÊhªôŠð%ªÔ™Á,–ĵ½A¼jŸŸr‚SÛ ôözF¼ëDÈN Ø£ô¨1©þÁVG ÒÑœD¥ˆ}™’ˆFV†#s¹RI)­p¿ÎwŽÂ/Pcé×ßט½<ŸjØtVmÇÈ¿®’RŠTC°p¢íßj]ºç²ç` ¾@ËÁÛƒ…Ô ð ÷åΚó"v#ڬ͡F« ø©,_ëgi%} ‡ÛÖ+·ž"- ´é¨Zî.K–ع®ÓúÖàp¾W %ø>U£ {ü~èð¡É`8~}B¾-Z×=üé«XêBù ùùðž^Q@e¼tœ»|ìלPCC†VJ—eJ­ ~•ksÅŽÊŇ 8t¶M‡ý=¹Š 79µhÕ½ûâÄm|ƒÃNAåÙ€ñxš´S”m‹êÂg~#c´¶:*7Êye ,ùÒ’j¯þ¹òÁ;çlñ{ªýö„—¯K»pNÀk)Óè²É ÷Y«2Ýœ z¯9ó%Þ¥ì7þL³ {¿_­…~¹9Lé>¦œaO*x¢¹Ô¨ÏL¿’ñÅWÄi¸žUÑ3l%Ø"pM|C³FvËØAØeˆÜѬ!^íüõñ h¤^¢Ü( ¡/ÍÂaIú ]€á?êù=à"»Ñ¾Èß ¬_ikS?ýsQÈù/ ¶2>ÀTá’¬s.ªÃää; v€)íÛ¢ñ“Ùqoh±°ò×r‹âÝhRå3u%ß/tîÃáéÊ»(‹üåÚ^CìÒ*˜š˜^ñ‹UØòêÃìcí° '}ü¸ÔÙ7œo7£È> "û¢ö9=*VÑÔ,Št&¶[f‹²âÏuÒï[Ï ˜f%LJ0#ðÝæÐ©à…å|3 JO­›ó0#‚ÆÙ±âI ýÚÒ®®lÜŠ7£QâxÛ˜ËZeŽü&è?—Ž;þT4ù©Ü4Þû†ÚVyª»jÞqƒi1EY–ËÝ»&µ­6BØå†…êÝÒ1ñ!„c41ïýÖº Ў锉WŠAkxg}¸ƒQ0w}+õ¤ì/ÙO)O ⊞t$màVg†CÊ\?/iÑwi5ô¶_W.ó®í$gÁušã´a•F&;ÂÌY… ÊðrÉ"ÌË–#¹<¯•”å,N1Ä«2n´Íõn³§ªG¯ˆ&‹a y‚sº‰ËÖíŠ!&e WCÛD<À͇u[xù¤ô°þI°f„¨ñSíMhÇqÊFôÁÊ ?ßAY­Ni¤ç,ÞäƒÞIxq©ÝÌ'L'ÄyÎÿ’wãJ¢£Šd¹' ›Ò’¼hPOãSh}ƒý[ó©pwB‰|ÉïÚSvý²Ø”q"ö%µ¾éò„€NRßû"ÒÈÙ:›"›™k8•ïh²šÇD}Ò¹*…0оÈUyâb)0ù4rân+õ­>Úq´Lxi?é~MÍ¥ÎÌÌ–¬l‰ž@îôøµxøé–\àÇð âΡÓVi?”²§×Ÿ‹÷D¿.IDTô…­¯ÙÓÏJ‚ŒSvš[ ¬C@º6¥_ž¼64®‚ŒÑêÈÁž˜iê;©žsU±weÚëâQ«TqïëìñÖɱ?~ÜËô&Ø!骮¶¦¿®ˆ2™Q¿ôƒÊ²¦ˆê ÝJ_®x¬[9Ÿˆï%ßÏÃÿXTUµês‰›$½H£7Н å+P¨7ùuW­@Ùò9ÿƒÖ«œm®z5åqÔüGš{ÜEÈOÔæJä4걨ÇN3ôÊ{¢&¸GOo’G MP()Ò$š×Ž·Ý/F†jÖÖ*¿L¼ °DüÑJ,Æ@¨£¬!,Zf92X>À~Њz'0E–œSL<Šp¯”¯Cºå}ýšà]²ß¤`ŸðJß®¹‘JÄšTß(ÂT&ÕÑT»Í¤OA¦|°Ê©vqLÈ{ж„ô.ýÔü´N·¯=…8?¼Êìó`û¾¤–E¥ºŠvbÛKI³dkí î€þT·bgJÂÿ\[!; ‡Nµ`ÔhH:óƒËž$)úµJÐßù‘ëBXѸq•©eÝ÷ÛpÌc¹Û ² ñlF»ÄË´“î‰Yi RÔtõ«= :tIBd•Îͼz54fsÁ¯jÃ-0D¥êÙ›Ö½üpë¨Õ¥œ$2Í…Š¿u ËÞðSëu€¬’.ï¨Ñ†6oîjŒ&r#ùÀ²(º)!ªg7÷,*ˆ17ˆ˜|Ê·ëuÌ6œªŒs`n´k*2#]‘)'ìHì© õœÕ¢&ZÝ5*ý'&9ç@ë·”™ÆP/ç)Fîõxs¸ÕI¸gz™ã0"#Ðh§õï~î_ÜyËB}uÈÓÑ&…*<ø›}‘ìCò^ÜÜr;Ÿz·–"{·ekà;ÑNy)]uŽ`,<Ä=|,&!¶µ¡ßïÅãÝñ¤3*ºEçY| •ßr- ûAd@ÍŽÆÁPQÁ³p³§U‘J°ÿ»Õ¯%—¤KBh$µxEŸÝÎz=+ª­OíTº+Æ/ÊýÀ©ÃÎ6Úû¥=¿;߆Rzfm\Ü>(É\½8Ý*ޝœ¡‡L ž]aÑãçâ†î<äÓˆñdþ€¿6pУˆe,_JàÌÁ4 34‹>úË—âl¸ê)8•C7ðÒƒ¤kUǸ¹€//É×`rHRôHåý5KÅMOÚ9ýà{/*ƒæ,¼HÂÆ¶‡©gþxvç’†"² ²¦!<]ƒ±Ë¿í‰HYFù•èŽ^KshšQ’b½Ž=GÕ-=²&‡æéï¹z¡ÉwZÕ–W¦$¥­é,ÿŸ‹’óé¿ßým¨½™4Ý(‡.ÈVÞgØ â…#“¾™û½ ¬Æ±nùêN íæóuŽÁÃBØÕÕpÃDÉ«[5“+£H5?¼üÆ.ÙÆùT¨41ººí1Åú%ÎáØ¡*#å±?ª DúÐaó‰ú00wÛkÇ­Nó ´ß9ÒÁ¡ÂCQË„}_l#‚‚3î[ë¡ãg>¨[„Mãé²U'7ñ³ºrc®¹ÓèIßH.KX5W«êJïYüñŠV¹á"aV«ã½FÊæ|(]El¦7DÔ³Õ*ë=ð-€­ –ŸA)MÓéÔD|fñY¬–ÔfT8ìœçP4‹#e2ì ™y€?„i¨~ì)‚ÇŹ,Pr’¨ï0À¢TÂÀô<^Id}þÖš6öÅð†/d,¾}ÜNÅÌÈsK˜ÐvtSçÖ¡<¼°ÿPHÁœ‡ÜôBʲ„a}3\Ù²v>pO=³ì!‘ÅÃVúõþK¨ —‡Œ~E²EÛºIÌûk¼rx•Öd†!P̒ݳï¤ó ¡q—ëxm)²²ÿ‰†Ÿ`nü$æfK‡•©ÿ5rwªûô|Û=c‚ÁR'ø¥ú®³ÚXÖ¶m€¥ðWªºþƒ„+§g÷ˆƒ7.^{çzKŒ†ªÉÕÛóŽÉ¶‰a“þXûiu[qPj¢ãn«ñ®ä3co¼„¢,b‹/ÎO/ÍÙTû…òÀòbíý°±„wàL”KH{1¹±/ø͵ݶþLk™FÜ/¢ûç‚ ¬Õ^®¸á³]h(ì4Žoc)Uzš¤MÖ LÛ°3q¹ù)=[öoRH×ÃÆ³$ýìÛéÙ>XF³ÜL ,^`™zƒò¥•®S$b)US•àÄ$¦aÉX©¸¢Ë×S½Ë}ªç²i}ÜÌ)àZ߆›ôŸèL¯œ%aÒäz›­c­‹Ë|!y±ÞlÜÄÑêåœ Í¬ÒœËŸt•¹dÞÞy9ÆÃDŸ”ÄêÚ@÷Ÿ¶ÜÕ¦¥ØY!ª=€zÛ#/‹'GËÜ·c¯+Á2ŽFyu&v¯sFsha·y(ý^æ[š¡Þ-sç\Í16 ãËá"’'9‚··B:ËLyG(ŽûÓ冬'Ve‚‚¯Úº@ujo)"BCþß M½Í2Ȥʿg[†ªªK3{Ð…GåNu‰Ý€uY^b%T ïåIÐ}¾ËûÈd–@OBrÎ"ˆÉã,#’Ë$OoÞ}ù»±vJ?bä}ßÓ©·Ötq0RUüä Q+›gg¦Ohªýgž“Yæ’ÖžJ<ÝÎð(n»Â²T¤‹Õî´Þ¬ w | »âÂöÛ ´Týrˆ/ºËè8ˆÙãÐ8m-,ªŒ£ÛÃå éíZ{[„ðKšçß%[M" ú"Aîû˜ƒs†#X}æÌ—¸~6³1*5Å-:X¦r½U\‹EˆföŸ æåS=¼ÒÖP9û; ¶R>Eã¥4ä ñ¥DöLå«ß"­ZìÆ .5à‘Î/è‡û"îØèMÄK²ea°gýç(E :¿µ#7­‡ kµ·¡¶Â 3íÇTIøá®¿R­´ xÞä¤~À2KY¸7§FtP‹õ*ZÌÃÀ“ï}Ô÷á…÷`âðERß¶@¦Æø"ê^3H*ÍcéZG¥~?ŠîÖcÐw¥¶7αÎ_zkB â½ÈþvÕ¼[Š"e'ä ±ï¡¯‚º&Õ‰ï¶/¾à~áãCºƒÑW ÀÆÇŒ~¶ê E—ì v¥÷‡ß?Æ&*Ï“âsÀlÕHú”í,ôœà×›CâܗWJûmð3º^LrŠt›ì4?æ÷bÙ†Æ`’Ôi(„%|H%"JmŠŠÆ,6#9“w§Œ{ñŠŸ‚×ÂþÈÝ=óæüçس¹ÌÑÉB²$²î4ªÂ»ôöòƒçž+mÂá¨ÿ•%§:¿ÞܧþwLÑ9­ å¾HeV˜zcÎVN¶çû¯ÉGœ˜²uH]fƒ¾¶Î]5 ¥k<p 7€ºóÌ´ë˃Á‡t‡YŸHiÿ S¦T‘±âzHªÐ]BN0‚ïg ¾ÒoN Rð³µîÃúïÆZÙ¯^3§÷×?çÖ×KÂÒ÷Òà3‡Ž·üÕeQÿ>ãI …à°‚z-;0_ŒwÐÂN¶¯Íy#Ѷz©méR°hEØšz¦Þ¿;=¢PfÍ êlËS˧ŽhÞ7Ù*Úª8H­“~]}öñú¯ 6èì ½‘RÎpIYi­Ù§GŸW2u.ë{Ÿ!¹â—Ìé Y²)Ÿ½õ¥¥q£ÑÆFXLÏÄIÌ(­¯¨w¢[9¹‡\lûýé«Ts¹þ¿væüŸ †x(æX®¡“;×c®ÜW„äf¹ÂȘ³!9fD£¹šåêáqåÒÄèE͵%ËPî9b(Ïñþö~Þïðå° dæÈiÉ6y3¢EéCeÍ*Föˆ©ô|X‹î/QŠ?ØÃÛüý•|,1¡<ªQÃÎ?Üùþtm—ÏïvÝ—Øm9æËúz¦µõÔ㬆ˆ,½RÛ2Ö «êm÷¥w4'(w¬߬ ã‘ÇOL2^pÏ”vX/ Öå Ú”Üiã¥á®£dðµfÓgÀªï¦«’äy"ÖÏ+¢·G]`á ²VÄÒ`.à›W—û·ëŒÓ²{9?Š/ÄB/‚@ñ9RW~ÑÀ¥ŽJûáÞ¹¨ÇÓoÚ1À³‹0zhIÊ$@¤¦>Z¸3W\pnŽóî|#~PWþó&¶ÞUõ§<”s‰,ÊØh>„ªÇ-WôÙjäkËom=8_¯hË9€=“\Y–•08¸¬£­|Cÿ?'ÐÚ…Ë×)ððÈñ6„!Ÿ‚ÊÑöƒËJתG³²¯ö1…nTRH;ÊÞ µY§VÏâR'¶Q—CÝGK^§—Cò˜‚ÀƒyuWg¥<‰‰»»Í z,H¶˜D¸ªS¶1Œ°=¿ØS5Á†ô-þÿ¨ºPFjŸˆ76ZnØàüdîVËüæ-«6aF×b3ˆêrìfãBÔ™‹.Ý?Äæ´æóÅ‹³Ò€+ÔVW{§ S¤ÂÜFE¯Éܱ¬ß]½5›­ &¡£U"¾åÀ„‘Èì4Q±AOÞgЈ]âvv0‰l$îe±ort&wç–O·7”]!8MoRÀ\ÛÂÜ08Q¶¹Zöá¹íF‹¸*ýº‚Eݦ²P™Qª n@=z¸÷š’4ßå kuwMõJØ=ÄL¹s´MŒ¸”0î,°1ƒ³ÝHkf~Ôüí«qÛ¬¾™¬Tg—j9W²°…œ`Ï%f=@¥vRiWä_Wz{pO;Ì8áQVŒÎÙj|á Õô#f¶|oàÇ]'àê¡þÛO‘ó/U„)?Jm0Ã:Vg)«F ÐF[Œáßb¸BÃzýáƒmO´´ÁO ”e4ëT¹7‰â5Äjxf£vZ¸Qoãh¤ÒÔFrôØTâ[:÷ï¾Î–ÚoušÀ@ªI"3ÞÇ“{Î:&ðŽñÓz÷¿Ør$=JKè¿'DçÄ×ÄA5 «3LÛOn™>³ò³—Ká&áse^Öê2¬‡ºØ‡«)DÀB¡¶ ý¹ $ÙO¯kFúh ¸ Í6Ë0æÉ2Æ]IÓOÌ v]²H—Îy©JÞ$"ÿþz¢19¤ÍƒƒWÁˤyù@\Éö’‚Zö‡+‡M4ë4¤´èXù–ç´$êø?G;ŠáÖM÷£ûdŽEß‘R´5ÏRÒ»¾tµwÙØ~ó+ûýyVQBÂââ±ÆIz½ØŽ'4t™gOóIbJ¥‚œÍ ~¹Šôá—K¤²ÌÃî<ó;Õc–ÎŽ“–n÷…Ùn•am1®ö~`–`?“-Çë~-" £¤oåí£6•vtQŽ¿CêV‰>j†ŸÍkÖn§tAîp¶üálæUÔ ÀØPRtZ”kkDV‹9Ñl¿÷˜Ï…pÖþ£æ™i‘¬²UÑMñÁØ¥†jY ÜÔðBîšu¾rš#P®É9•8®TÎ…ž›v3˜p#œ;@í¿Äõÿà"ð €GFG„Á#C¸þÜ@|ºendstream endobj 1258 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 34 /LastChar 125 /Widths 2834 0 R /BaseFont /PKANOS+NimbusMonL-Bold /FontDescriptor 1256 0 R >> endobj 1256 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 /FontName /PKANOS+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 /FontBBox [-43 -278 681 871] /Flags 4 /CharSet (/quotedbl/numbersign/quoteright/parenleft/parenright/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) /FontFile 1257 0 R >> endobj 2834 0 obj [600 600 0 0 0 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1237 0 obj << /Length1 1612 /Length2 18918 /Length3 532 /Length 19829 /Filter /FlateDecode >> stream xÚ¬¶eTœÝÖ%ŠCpw),¸www÷ wNpww÷àÜÝÝÝÝnÞsºûëqnß?}¿5Ƴ—Ì5ךkïQ”¤Jª Âfö&@ {;Ff€ÈÖÄÕYÞÞNŽAhá økd‡§¤u»€ìíÄŒ]€<M @ h `e°pssÃSDí<@–.juM::úÿ²ü0ñüŸž¿™Î ;À׿n@{[ Ë_ˆÿëDU àb ˜ƒl€QE%miIµ¤‚:@ht2¶(¹šØ€Lr S 3`nï°ù÷`jogú§5gÆ¿XÂÎc€³Ðô7 èa tøÇEp:Ù‚œÿ~@Î 'c;—¿3p±€ìLm\Íþ!ð×nnÿ/BNö#lÿúþ‚)Ù;»8›:\«*‰Iü›§‹¥±Ë?µAÝ{ó¿‘fö¦®ÿ´ô/ß_˜¿^c3ÀèáòO- À äì`cìù·ö_0'пh¸:ƒì,þ‹=À haìdftvþ óûŸéüWŸ€ÿ­{cÏeÛÿ+êq¹8mÌáYXÿÖ4uù[ÛdÏôÏ¢HÛ™ÛX˜ÿm7suøŸ>7 Ó¿DýÏÎÐü%alfogã 0šÃ3)Ø»ü-  þ¿S™ñ¿Oäÿ‰ÿ[þo‘÷ÿŸ¸ÿ©Ñÿv‰ÿÿÞçÿ„–pµ±Q0¶ý»ÿ~`_{€àŸ7ÆÆØéÿnl ²ñü?$üg &ðß$ÿ?p¤]ŒÿCØÎ⯠̌Ìÿ6‚œ%@@3%‹©%ÀÜØæï¤þeW·3:Ù€ì€ý×0 ,ÌÌÿáS³™ZÛý3zö»€vfÿIþ¯Hÿ¢Î¤*)¥¤%O÷Ÿoê¿¢”þjï¢æéð—ØÿhEÞÞìþÁ±÷x3ü½ ¬ß8 r±°|ÿ?Tû Ëå]œ@Ý¿-3³ü«ñÿñû¯“þÀˆÛ™Ú›ý³+ª.Ævf×ëþq›º:9ýUõ_7þoÃÿóü¯E=€¦ðË ö¦¼ÁVi™é.u8¹cbº½Ý,!¥ jEþ5ö]~ia[Ü•Foµ!Œ<¿=çOÞ÷dh÷‡º±m¨ºR€ù„ßÉiz ÐÖ¿¶qÒí2”"¥ŸjFy_ÎÉmBép0kìo)«”¼ÁM´}s‚»|¤ñ'w+ðǤxp@ö5Mý‹ÕŽÚ†^Wxrú5ñèñêÏðà@×5tÏ]NìJ^7(¤¯‘þŽ9‚:ê•Þá40éMˆ×­—$šÞy”ø¶r/Jù+v­roIÐé­‚|‰òNR-{UZØW3‘|‰ÜÓ¹Ÿ«®”âÎ8|M„ãA½7SÖA“™°?‰î!®¨{üëlkh_zsg'•ÛKº7ÃìQ23 †»V!‹¶88Szé-ŠÈZßʲÃìb“ÿ<Ìišð·uO[מʙåê;Õeâ*1žü =Æ:nâ(4n¼ë—jºÒQ•"/>Uöló½ˆtë% ˆ/÷€{`‰ÔÒE¨N»cj,Uoo–›U{Lê,þòÛ’`>8[œÂ—;1Œ"ŽÛd6k$T÷ó¤ï0ÃcÃ=­ò8Àëø‡ël2ø©ÙB ÿ-NE>…°­VQ?SÛ׊Û_ZßjcxÊSH£k‹_G–‘'²Âøøc±£ ~´½ Àë5ر3ìä=Í’ù9õC[¿êŽX? Cz!‹YÀGóµgàÝzŽD7 8’(GD¹‚Hñ%.fjM ýÈ#§:Ð YœƒN o‰ÓûFp=)I%ú&Ç.½Ù™£J©³k´ ¾< ý6K†#„Rcxü¸ ÙÀ[‹ Ó´ä'¥ÆÈÆtŠ(¤"ßž6¤}ºb#›¬]uŒ'ÙßšÌüå;ƒw÷ùÁm±Um•Ý“ðI¯Ó!mü,Žæ4FØBÝ`Kÿ±4û m¡[SPk<¶)óÒ ƒq-†)åÔ\ †µp¤ –Þ•4âϵ[Š•€M—EäÇCÊ%£ŽíAT-o|Ø–yfEézÒîeFN ‡Š~ë—|ÄÒ°¥î¯jQÕ_@X¼R¶x»Ûq0W}á¢fÞ’¦žN8ª°ÃÍŽ›5tšµí3¹(›+M©^Ú÷sžD‹êèî³’ú‡üè/Q²“_h¯>v|xÓˆ}\ 9—T cå»{*m‡¹p(D¥zB\¨=ì{9Å ¶Ù8Ñݳ"&”×·ß—4^v†¬ð!Åj‚M°ñP¿–wêYgäM_DrWÕE´ýf?ÈLöö1;ÊlÊ’ÙD,俼S¾ìý:Êû‡@X9ðEþcGBÉ:PŽrùUn xJÅxQí½…jûk2Æê¹”ygZn™E0±¹¬"rõ%°#žØèÍÐOà…¨³qEÎûДv`æPᥧÜàÉù¼ ¶Ÿm}ÆOà}LZÝÂ:|,'˜Hõ•ù½g{ã[CcÖ­–ç®3Ê”_!qI¹1Ãl–›wløeû"-ð–·v:!”UËñžêG¬ç!E²ºZ™tÿÍýwÏ%ÿmVçÇ"òyìÄæçÇrü८\Q‰Ï¾ó`¸4Æ)Þ°7¹ÕÉ.#³r.±cHVXÏëg/Ö=É.æµfø¸~ë’Pæþ©AåhèK•H…fŬDû‹I/îsÓ¶#ÒïàwƒÈ¤÷³ó@OÑÐKÍD7èÃ8MfÎÆg8eÇÊ)dôvˆÌǘìÅrD éÙ'в¯•ñâ lL¨¿ýÈ­‹^æPc$°I’}£]‹¥â ªÒ¼FÙR÷eàBIÔb ©Έžáòú޷‹³ªÊHÆA¦ô»{ÿYw˜Š+¹¨ª¶ DÇùgÚƒ€Á³Uô9qS±½?×Bx«õ¿ñ ¿kJMÄÙ™ðÄWÊ\²t—¼ÑŒƒ½°Õ¦’”pSÿpgrIô¿ ùªZ‡ä+%V õŽó‰ì«£®˜s•WDéôö *îD‚ I0ÿñùB–«œD‹×jA+jGŒ;Ó¹8&ˆé1Ýú“çŠÏù^3¡™¶"íÁ:š·eWÕ6^#—ÎBõ¨,^Øsõ®‰¢3|«´{ëõšÕ4¼:ªEßn‚¢!!×ܹ~ńﶵÝû-aÿà¥.jýÈóøʺžQQ9½‡¹š‡Œ‡4®Ow@›ÜÇ0¦wÞò¼«\M(ÓC…åP"×j GU½þìØ ·kÒ³[ІrÆ{è—~UŒª@a{K­ ázÑ…cÈß?æÚÝz´éÖ+i€hO/%—QÈÍËÒÝÍžHtNã²ú¡P˜@þ“‹i”ø‡:=»(-;%ç—kÁ§µÔ}Q[²“•L¡q«nód01ÙLÑåB7éoU`;N÷0×ràjnv’;Ýn÷i•ŠÅYý‡w’>½XeL0}rá'Œvªz ‰u¦brº{T×9úF†8ðË×RC°LŸa¿øŒt¡kÏa£LO1Ga î~¡‘  n.ÁŸ`¿6á Ç»•öAWÏhÒgMv×þ°e}Ò}õBWš2jËŸD]÷æ%IRèI¼è'Ešôh_-– ½’¾¯Î•k¦z>xžiwµÑ~µcx Úˆ«•šà<‚®†m!X"™¿Bþ¨«À²²±€ìê&[ûQ­"wÓÅ~©›‡;¶×¦Dà¹|öÁ>¿ü°y–úN¦ªôLÍÔ)ø³Ê‰_x®¸Ÿœ.ü´ãۂ̳ëÓxªÿÆQ:+Ú>³ )Ĩ‘‡+F¨?¹ñ¤¤fX´^R¼G'Ϭ_U¨}Œ•€;ÔK軈¹Ù&KzMÏ8J@}gTÙ%¹( õª*J ð¥)½?—Ä$úï):p.„ÌHÃ`Ɔ–í"–ñŽNÔÂIª\x¶'kƒeFbR´ëyf=whoŒºÓ²èŠÕ–Dð"~VWn îMŸp!Cð÷° ¿Þ‚Ã}Ï1ΪrÅLM# DÏhÿ”ž±j¡Lò\¢dBpïФäö,×eeÔ-¨¾‘Þqº˜Â0x{ûë35HŠuîD#·&9!„é¼oyŒÜâ!ƒU§"*p÷@®ãMéɯ墤C%˜”{lwN5ÁöM<8ëDL!¬!»x¼—,ûÝXÄì¸=‚”ðfßyÑ!ì×v•,LI?_ ­Íç›ë=%„³SýúhÀtÅFŽm"ºÜÝ„I‰/5rîl 3üjX¡Ïñ0I9ò©|)S-1!¿¸R*¸/‘‘7÷ñ=KìõÇ^A0ÀµŠýömÕ[+V$@ÒÁÛ“ ˆ¤þÕ…:õ5‚ž,ßE4J Ëª«ÄR_:ÇPÛ|óŒ0HÍ‘ä[7r Û&i;IÖ›Cr-ß¾­»@Š/qÆ–ûÎ6LøÄV“P_ìYҰR'ÂÇT%íýR{=¼{µÓËò ¬%’„ud+úÓ¾ß+U4ÉKîÀÇYC44—R'ìð58¿G—³‰“@-ΊÁÒÛ…«:r>‘O¯•p¯»µWþN–Ò;⟟¼G¿ò¤sf„p•@Æ‘ÎÏ…)¢e‚ KNÏvýQs¸k¤èŠªá$™›¸Œgë.‹1ìXÿÓÌ3@¶-V•vØ¥áß¡ü”ªA´½P„ú½p4ëªpç¹H?SOšð¡]øÊüÛAk»%Ögwrˆç|Ÿê=­FߊP3߬æYŽ!ÖÒ.(o-z•Ö¤jk:\Žë'ç¬* eVf Øø(³n…ó`¡»LŸÕÂvs8È-7†²HŠÊmUøfnmo1K±xí[J{ϛѕTË0<8i*_×/³bY»ïIý‰P¡ö5,4‰ßWÓwkõÄCóÂ܈ë[9œ†H.áê;pÂ϶¡gˆ•Ú†PìYÍoJÔav QßFݘª-1²7¹óH%ÿCEzÌ¢º"®F _ZCÓ9 šiOóÐôz7Ânè8zU­Úœ{/–7ðåT™|;ŒÈF¬­«ãýA'I\ÅwÐÝ–eõ õ&R^'0ÇŽçå]â—å äåöù¥&}b³î*R%K×V´IGgdµT,ø™Î¾½_XY»¿`6‹bÚ|üÓe0mêr€vøñ]%…?ªzÖiõ£½aÛqß§W‰¬@€+Ò—~† ¡½ÿ3ʤ%i Öý‹Úq²¯Y¿ž#wÔA“–bþ¢›WT@¶Mj0ôí–lbX`=<ž+vÕ4¿ûi¯?4 ±¼[¤áÏmÁ—?(‡g¬¼Ó™iÔÆ.çH¨œP±é„„Ôª¸±LÈ/& ûë²L•k§âÛ‹¾þø»E~]˜ïýÇÀ wÉ·O…Á%ß:=6(¤³‚wžlB)L¼]Qëg;Cæb0¤8c;vFy×bïŒÉSJ•W½Š>aW<Á Þ7ìÒ ²äˆfã½ï}7 Ó+>nÁtKX‹@ƒÞÕÏ+K-”¹aOç¼Z£ò"ýNTXvè¾Óø>Š&Pö"rS¨ÐÚŸÖ49fÔ² s7Œo‚Âls•˜}Oé’Ó”§ï×¶x)Õx'!ó®X––)ˆóšÑ0ÝÏwRsʩϱìl9üH˜I2™"¿_2øÒ$3:px“ewxF {ÄÅ®,Ùø;K¡Û9ÙÛX©eóÐûˆA’Ô1U± Ð ·L¹í³7ã!ÀÐÁ|ž>ªÔMÈÑ`·ù·'Ó5sÞï‘w°ü£5¡†ó·#ò8Šæ7£ò­kƒ°;·{Ú%’ÓZ1N–7mc…IÞñ’Q†X¡u#P!†7S½ç·âÅ­j¦_ƒ¡ý½ÒµØ%DN+zÓ’}4˜€XWŒû]oæ‘]D]t™l¬ Øj³8F¥LfÎÙlw6§ëcðÃñ¯µ$-5×Ì(î´ÄÁãÄô¨Œ‡_§…l{ŒÐ}n£>¾6¸kV“zkdô”‹‹wðI3¿ò8SÄËR`Br#Ã&º4¾=¡þxqâdm/Â0ŠÃ¹ùæd!j}оzu?ºðu·izý#¥rzV¾‚—ê!H¹iBÒ”„0(óÊ4w¿#ךBz¶Ój(O˜é}JîgúÔ–5g•h}›÷YÆß½'1x„Ìž'ðöBçKH?6#s>ÝeÄÛé£ywüFxçgHQ-ëÄ„ZÓN ¤úLÆ…{ø]w˜£ÕA‹ÇÛÂT“öïY2%‚Oý:{Τœ·ù¹mf%Ii ¨_Ðʾâ\¬_;‡÷¾”|#@ªF¤œq®#oËbæSI•˜µ–˜Ã-ˆ¸o+ݪQoôT@7×d-‰ŽTX‘§Âòy)ÁÝ!t+1Èô&?)ûà%]Nij¡)[RúŸ±ù–VìdíCÊåMÐöîØ©´Wp&Y¹ü“/ÿ$ Ã-|÷æè‘€˜Ä-OjB$ü‰Â£W Ux.. «"²ßÐ(ã÷\j›¯1fµ4a¹þ+ò„¿, yç­~Øâù`Ùá¶„ç3Mœ:áÜiÁu´L18*½‡hB0øÝu”ã†Ï»5Ù*¼£ ?j»€$éø‹ùï‚ÀpQ¹<ÂÓ¥Cï¹æ—sål{ÔTB”¥Ú w¦héRs¿4á&æ}¼™˜NÜt-÷sjôÓD…„¹"¯ÔD0x›Ìwõ`è9G[Nºxw×"ws—Õ×Ù¥†ùã°Y…ug…TïŠNCbÀ˜óÑîZg#Ï^ª-Ýu4ìfÂÃ7ËODΉYoüÍoV¶NZ¿Ã2'iþ YíW‚†Ý §çtÖXå1Ûé–±}G_û†¡ñçdÊÃÏ™6LéFgY‚eQ®Òé i•Á6(tÛ»Z=GÌRxwfþóä(“°-jdJTèS(<ŒöQz_´)ÿG0Õès+?Ä„ë#(½¢8ªË›Ýg6‘„Mš2 N¼ ãŰÕ9IµƒÍEƒ¹ŠVΓ×êX‚(¡<Ì1å×;“5s‹!—–3ß 9ÈÛ:gWoV‡Z|ß§Èv´€1r/#J *?ŒK(âî N»$Û#ˆ&:tõœù±–”–ÄnùJ×ÜÒë«Ô¦ŽÀ`ÆW؈4ï¶5¤Y‰á]É÷Ïú$Õ£¾‡u=WL@¤)B(Û€ÛëþÖ4øt¸¹8oži–¥ÎÅ$3.Øø÷2šz¿Æ(†R¦"è/#(©<¼šjï¢d}Ö†n“{ŽËËÖÖðyBúN€­~Y ó‘wÂ33¨º…j˜"iQÖ}(­‡|Rb–+{ý€ù6b‡º´ë„ʹV Í-¤œêYa¾÷H7¹éÇ1½zWõêÄѬx»!Õøöêåøö‘ÄœlÂ0Fì,e„:¬þ„Nˆ ÅB”qHÛ¦}Þ#ÀäËì”ú3=¾Ç¼Úµ¢QÞDm£Žœ4wý,)Ö½™1®¼¹up~«ÊO¤*âÊØ8Á9yZ“΂ 2ÚRb*AI9»´ä¤~Ño¹!æ[^ž­Õçø8u’.ý²Ä"Jé—«rœ® em‹ÆŽÄPÃÁ›g[¨;"­HTlï›`R¬ŸÝ¿kh>ÄùWTD_º|*§-“XÀÝ~Xü™%Õò™”“ÎôK¿ãQwË /(ðõ°&›f­s¾×9² ÉýZŠ@¸-Ü?Ibõ7ÊÞ |«4 Æ´…­²Öø•—«Yü;%¦Ý´ûNŒà]‰Öš9m0ëzšÈ®É‚—G®¿>õ½´.[ùé'GkúF·_á~(~þÒTpZ{HýÏØ@ò4Юբ¿"¾6ÖÌ&ž_èpx Wùë ÆÑ•š°J]èBePÛÍÛ¨¯T_]v—Â'_ªƒeg; Ñ+ÃfP­\Zá!ŽZæt'³˜^LE ƒÆF¾øoÜXfTÎslÓ)¿ L'»4Ò†í;Ví&:’ò$é® ôæø¢ê üÝJ Q>ÊI±Íº£ÄÜ÷fŠ›Òwë+Üó±H‘Œ?ˆ'ܦT˜ÔV³F#Õjpi5’LÒhN‘ÚACõg#ž¥©}E7^å òæØo?G …?§Ãi¯³•&¯‡®I'$½{È •9&ù¢Ü1Ä/^%Õø´—:Èé'?–@NdŽ2†Èßùvѱò6ªÚ’gâb+LËá{¬«±ç'GsÓÍhñâ`W[$,AØCh%Ô¯˜À¼:JIx` Œ\œ “µPîû¶Ô­þ~ôJwÀÑîé,ÜmüÚ¿íZ§ ¦{Ol©®U[.$\’#}6¡d»Ç7…¢‘±÷ÙKûÄâHö­‚¼5]±®·¥:] î®ðçb¢Ü&G÷Eï,Di8#YQ½œ•œIï à$'5/k¡àw…l®Y‰Ý ë÷õ««—àN»lôÅÏá—*ðŒÄÒ| ¨ÂLǯ¼>|5CUR^²Û+ò9Ðôn4®5ÝSK2) SyвÖ"Èði˜mFY²;{2n–ò{beMÛœËlƒ[»©²ßlÔÎ_Æè¬šªÅÛܼ,ô_àMˆ© ÿ¤VÕøxÿCƒ©~Ò´•”âÒ'ié`Ÿ{¦C(XÂ)!@¢ãF/-QHW=^í±ód½´Á"÷úƒc-Èl»z¿fNX”ÙÏKí©V²3í&•òÜ&}¸vv§+ˆš6¾à½ŠÒÖoë¨ÿ:PÅÆÑ§qY›Fx£žël°õÖîOùdÊåè²[ÿ«útn¿©.TpP?”ýs‰Ãúr)>Hñ¾êÌ‘\/M×HžÓG{<ÓŒ<—6a3©_æúaÝA$-ÝðáS*¦ægbœöô!þ°BL%#xä>Å-«uNßV“®¬ó»1G¿u™ƒF‡:ê˜I?Æ“õ òI_9LÅœ—º££×ï2£`ïÑŽ³ à(Â"óâÊââ¥â¯$è·AOL?†›—ô­$,Шϭœäg‚tê½˜ÊÆ@«œáYÐàÆ{•â ›* –®Â›ïõäë!á’ö 8|BÛañµlùòw Å eO²‰{|Ué‘ ’0N˜°à&ª+û¼½É\§Žð"ñO¥@O³èœ~*X˜}[Á4|¥í‡z‰§_w46ƒì=ØïZu‡ ¤7ḭ́—°zÒÄëßlrÕÔOd6 „Ý7RÚc#É?—ê<:süíâ•lgØ?ÁĵvO®„ší?ÿxâlóÊgoGXçÖ¥‚^;Z) 7læX êû½˜Ãù.z>ŒÈ*Ÿ(dc-ê™äÃË ŒÕ΄¥ f心Áüö­ß¼µýÃ­ÈÜ ŽÜ¿SB¿’(è “ì½&Ýèô;„M;ã`Ó <ÖÅ4}Áߣ‡ÌõÎZÄHÝ%"[9¢ÜÍm ý¢ –%«'S ÔD=èfrž:IâvÛAp¹DçóQ!âÞ™0³6‘,5¦§’6"ß%:ú/ÛG˜«KïãHÒ7ÓQj‰RJYÈ8 ¬w?Ö ”ü–¤l„t¾rÿÄJÄ^9(Kpà©lДHkVà”嚟B‘´µV»™Ózœ‚|)ì{ ü‚09nÞO#qzÀñ‹TØu¡/)…2ßšo˜"Gþ†x˜Rš0»ä\ˆuvØDà—¯è~д×ÅúG„/Ý+™± ‚Ö9=>òL4€‰ßÑ#-™éDWÎÍ>Ф© Ïž !†'wĬñ áB .—ùöOõÞ,,³Šãr ¿AâÔH|®CÍ.¹nÍ16"aóÆÙS8awY!½{ìbù Ì|[¯fvƺk@#2Ýá{kdÏãµQs¸ Ûº55Ö5a«F=Þ¿ŸòÝPÖ—£MÕ!ôƒ?ÖX3½…O!ù_wvCó²1h~ÿJ°¶¸SägÜÂ+º*ï%:{šÍª'r(E%$ÅwþÞ}xnƒ»ùˆ3øâ›§M¢¨ÊÐIj¿éÇêýå‡5yHdõ²ç^úÑsŽýßø¼TêâÀ<— ’ÃüŒÑLMñòúò ÑÍ”›ÑYò×aýSx5+LëØQuì=FõqÃÀæ­R ½ÚÞLU¦wÛ¼ñMöÑâ´§;‰aÓÒ@˜¦X]Ü*u¼“#ŽÇ{ºCÍIå3ïñ÷ÜE·£j¢]4KÔÝ´oó×Ð fS'CUº|îX‹±ùйÀe­Ü×(a rÁsÊÁ±&4UlVð^0|Ù¯ Ò*‘z^®de/švæÔ{ø´¼T+Q¢koESM¾‡1yìHG›ÿfb§G0Ë"¯ò°OÐ*mQ•sÑ&eÚi<ä¬Ò£¦t2âŒ}0h·7ˆ±>£B?Y䥒ºò§x“QC›‰êêzÀå(*Ì©|–24œ®ÖõM®jea/1ÚA|bô¬Îs*R@Ða1aoÁaéÞ'×½/–‚Þ|z6&±‰.åܶºo¢Qr¶ Z %5+'£¾múˆ×aiu5ç+j¥¨@1?ª¡mÈØöS«¼¦éá[m1’Ž8ú+]ƒÄ¥Ò[9™ÙX[9M¾)¬Þ¼z$¹÷f%•—1j:üå'ïìhr"R„amE‘¿¯>ÚœjÍ8*ž5‹âàÛ,•«‚ˆì R‚z-G™|¨¢Ì¾2î‰àæGàhÏ%4ìž#ÝѨÏÇè 1do»XXØÙƒDÑWAq„EH}Â×[O¯Å_ˆ.µ£– ®y¢Òس]E6ñ—qÙy—TSX„n0«_ãjœpïïYüØ÷L›w˜ æÂù›†5:?•rºevåk¡aÝŠ I„Fäð¯èÊÇ!œŒ.‘Lñ2¥Ï0ñUFÓöFu5ìaÆû‹îò ÏÏÓ¡ô{q¯|©S©¥/æ0¯mÕ³˜Ïf½[64 È}çúµY ’ÔEVÛ$*­ý¹¶WGû•»“![/ÔŸmáËÀãKC|¿»OÞh¼¸ ŸåôéxN|ËÔËH-‘ œq©äuEóo+|ÈG¼WÅ£A+ùÝÄnSG§¨­Í¾Ÿk¼·½ë‡Fp±Ó,ìÃøáÍÂ¥.<_jÏJÖØû‡Xº~¶ópEZh7Í\‰Î) »>|~Å]Z´ëvm Æð¨IË4ïÞîn>Wèdͬz3 Íi[˜%<²Å–úð7a3Qˆá3Œ ù±R¹›iÕ¦2yÓz±¾ÏP{àK±úÉj¢õ…LÙRTê†që_å°ŒñŽ™>W§¶Q…è}½[ãnï´'™ËH=ks•þžðë\Œ‚¡Ð‘rÌéž`àƒø V”øÓÂÇ/Ca´í¡—xvÄï âdÅçÕÅFH®KlçMàZ º},c®6qa+Àí fuýÖÄ•Q¤ÜÕ†ñ nh’×ßÅoßÝg xZÍ8Ò>­DÜ™‚ç{JÝ>zNl‰–òM̱°;MLVü¼GõåŠÑcâ›Y*ø.—I܆”Éþ’¥2kÇ›V(…K·Ò ʉ;¦^ /Ós$ýM½'ŒÌA¬-cU²~YÞ„µ~Ý¿Fê{È_ å_×@.Z­$ÑößE_ù*š!’Ë™cõ–p隀Á«“–¢Í ÕÜ­yýØÐ˪Mt×Ådàýä§×>§ÕY4·ðjSâMÀ¬f‹Âæ{Qì|$dÚJmâ“…¤ þAèôHm¯|[À@#_ìã<éÎýyj0_1ÆP»UÙÏÒ%ÂQÍGžyõ¤‡ežCn|ã«|ÖZŠ}‹Dµmo¾6Ý<(ãÓx MŒžœV*5û£ÞI# iK_ê©¶r.ØA ùõg!e&S» :£çèÒqÿíjžoCãëCjOQÑ”o:¦…^NómºÒd‹VætI‹¸¤j±ãf}á¯ÑüÙ³_›uÁ-îWtï¨*à/ ‰ï²ûÄjD-Ö´at©ÓŽî]*ŸC" A𨒕pdŽ4ë¬y©Hò^®†Tüﷺ΀SÄKÉ3}•S¶Å¨!²yû|'yûµÄåý·(f6Íåé´8\záxít_ ’óðYí|è†ï)\ƒ– Uzhn”õ’±F«ÝõFhrL¦‡6eu¿—£%=m¬üÞñ9lxîØØj.«C*g@2^ºo'-çú€µçGx õ“’~$#Ó ºðmÄ.¬Tዯ©èUÐXô‡NÎzãúMJ ,­àÉ]«ò6æò®z²¯Mt-îè[¹0S ÕÏõ°~RЖõâ©e‡Â¨`îô«á„ö௓§æoPÐÁ`ŸS¡uyØuçöw˪Xðm©¯Þš¬à, «Ç”ƒÛj¡·ÊI÷Òž®˜•°R R]§L¹ûwØ“x#xæÄ¡¥Èª÷8X\ðéцRò/ó‘.}Ey Îz„“”Òr-J}ò–{K*6«ZxV‚6:5"åß(m—ƲªëmîÎWq¸Ê“¤—1Õ y¾ÆÁd‚Ÿû‘µ¾'Qnî~Šò3‰æ)•@+ë8e \|)úJN=qCeIÅ ×DêͲùÈ@qØìü4ÀI#¯o=éüÙ)R9iI#Ò¶‚Uéî¸à…Æ©'3ø aÅÒB-‡ÿ²Ô%6n¸?_CpLC;iœ~³¨À9ߤZär1J6³&Þ½%{4Þ7c·Ù•°¼óÚ oË~¦c÷Þ*ô[K¨à×ì¡èÜ$~|”aº&ñÈv{kù‰ÃH ÈÛâÆ;ó2ði†ÊŸXæ)ï¡nÓ¯EØl¸½möÙî¿ôeñ‹X Z4øhKjž¾’/8ôì¸ònÉòPUÓê0~Þ¥ÿ&ê‹~¾F4ò$[èQšá~:,´4@×il眗Dqd^#!OÊ#8š/€ö#æõ¬¨õÛði€Šú4{˜[ëôK~žÇ¢ÁõW{ô³¯*=ÑŒ?˜üqÃHkã©AÝø£æ¤“PÓ¤ùËÏÊ‹Á* u3áIýùÉÃ]g ¢¨2NÒšdkÇlÛÁŒÞoàóÖd#ÌÅ$­x´‡`äÂuóKè7·(’ ÿ¡üòöC…}]A)AùàIóýµ· Vû7ŸÓj%‹µ–¨Bܯ@%”èŠ:îI•ò­=î‘Ô9Ürµá ê¨*gˆxæ…ˆ7HJȸÕƒ³Ù Çèý’»~1«/×úGí)HÃ"Uî0QŒ@‚[ü©Ûù¥ýÁ®Ü¶ÓÉRWüÃɆ_Ç@Bk\’iX'U°?º¥k2Ö´p7&ÿ.¢Ü¶åÈMX;eö“¢oÛ2È–gÝ %ûi­0/ˆQ¥ìEÞ ;EÞí Y¢l·ˆ&H×F ~ÛðÛòÔ[ £( i’™ýÖˆ­×äj_ç‡s‡¡œø¥ëÅ"$-FT¦×/òsãHêTÄÞpW:¾­K°—¯ââãýteLâ <Û娗‡Awù±M6&p µC Ÿƒ*ŒeD-@HP˜Qز߶­ÿ{ ­­?–>=£Ù~$eºd Š00…ü×gÙ±B`–š>åÐð ÿÔ¥DAü¼l UõÀ] qGØbÚŠÆêÞÀŸ×fçQûŽF¨]E¿!t—9f!§8ý*.îƒ:¤b1“áîJ6âqÇ)•P—ANV°d{!áS?ž˜œ£ /5W³åš [RÈa;ü¾U¿a£ÅNY¯ H8ú)ö_ŸáaTÁÝ;Æ¢Ís÷í“qüèÏ¢5¿ÛÐ@îÑåf9'w‰-jÖL¦)ÉÐW©ßÞé_‘ dï^ãŠüŸí, „i×ËúöŸÂ¢ªž3b|8}X²«­c2¼¤Òw[noGD÷¤€¬0Rzó,ÎÂW7¥X$›Búbu`¿ÿÔ ]s¦lä@AD£Òªœ ÕÁ–ŸšŒ…¦rsúé°ôkwF+sBwþÆš÷ˆ8Á AAH·ù¬ˆcÿm,E‹4o:¸®Kl?¿ò$J€Û-§1ñ±TφQqÇ«¢Q—9©!T0TkgÀŠ,q½³µIÚ´ ü—žŸ‡4sض_S§Ç‹ ï@>2¼õ®±?=šU²rúZú±#z{¿žt‡¹þNs_±II"TÑÔNôŒÎAenHEÛqu¡C–XžZAFN–ñè¬7Í~A v‰ ¥)qõÍm—Ôï.ú­ñXx[d£E¹•3¿¬¿£¨Žñ$èÓ_'Í”,„2ÏGãRØ:<•±ÄJ‡6i¥Ìö˜,Ç.‡{ÕúÑÅÒ"CqJ"ˆlã`z‚.ƒðüÚæ_ˆiœîÁÑýl…`CPPkÖÌ÷~ćõÈ}âµ1ñKº+GÂ\Ú²·5ÂQ`Ž—ØŸlŒ>¦ÆÒÍ6&® *P»p¾»°¹‚t±Ï . áêªøy •Ƹ:J|a1š˜›¿î19êzžÅÜ&LŸú‡çå¸tudzÒ8†Ì5XZG”H¢ÊZж‰Åé«þó*¢µývÛý Çó8œu6#Š—ó§Ïß5Æ:À Ø%qÚÊ·Œˆ LÏyÌì<¡‹9M8 ß\sz.bÁ&ÆÙô^¦²ÇçDÀp)q` (}ñ„ÓÍ=9Yÿù£5œQª¿ZÀlÔ„û¤È©žõ¾ùj‚ißùÚ¹P~`å3ëT¬c•j‚*nñ6­"“¿0T7ü^ÓïÚ&ȃ`F‘¨AÿT 3»„˜$?‰J¸öÅ«ÝQþžp´N•òÐ+Xd¾o£š“CvØ9¿ÙÓÀ?ÃJŽK'ñ[Pì~U³.·34ŽrPu,•C<w”Lí0¡7r“îæ;(Ç%²%b†%wä«x£ ÉÛøìmáP~&ž†»ªòòbh ÝËïË ·Ä2E.œ€ÍuN¢fxŽcȧ=´@j„•¦r 4ƒ®ùRqîÄ®—ÂPÕÁa*ýº}œ]ÆKàôF ûI‘ OPe¶ª  )ÿçkt£—‰DŠšÓŠ´´·„±{„§eE+w½«N( e"Y._.³{s…bvÈñÂwÐúAá/àwŸiIãÜ6ƒÖ7ç"a:ž‚i½­šÜ$ôŠ’0šý%)zË?Ñ!Ûp:£Ò?ÖÌ…•l º&ŠWîaê¨2)Ö×yPu/|KÏÝõHüäæúÇ"gm{y×j¹ážz²LÅ«åÏóý:Õš0ôMT¤õÛ%ÄT¹›4Š‘l¯±Ñ}†³TÕq‹G>‘7¨ž!ït–rÞ‰­5¼÷$™™§‹#zZÞ<)Úz/…ǬþÜyÆ1 â÷ åoÄ—]l)Hüã*_g²ïॾù‹Ø>¢¶V;_ ‰òî’ΪBg^ÿ—eóÀÊpEù”û:ÉÒûeÌìËþè™m8²t€6û´]þ–WEh6B[©uíRŽŠ>oZ‘O¶úDþ];I»ýsÏ©•„´9ÙçFG·zhˆMÂ…K ÷ë]ÅŽæ?aÒ¬†Ñú›5Hþåï9¡vÜŒ¥½n)Þ¥:•t¯7–ª¾ü%>yůASÓbxEÆ÷îœBšÆ×¢ Ñ`]Ïë aSí(‹ÓÒœwz´»õšØ#uT"KÉÀ6:$Î:›Ðfi?šú{0NÄr)ߘkª{Ì÷ûKeRí_Õ-jK ;UÙ¿b´`]#—¾w¬Múå|F<°žZ³d” S’k+Â]‰GE§zætwq³Àæ¡ÐCéç\K/§Ö0ÿŒö– S."¯7ë•;/aA ñzü^ ÑÒˆ€?7;eöÏ®ooö1ԽᷟkÆ|o±Žy[¤‹¤8¯ûEÅ%Þ[þ÷¿ÌYx˜M 5ñ×êÔHE£½kæ–Qˆ† êìŠ'D]OmSù$‘íuÈ:LYüœtˆÒÀ–¦Ih¹ï°/f4¨ÀglãA á’Ÿ­­å;BÌ€êÍT ¯•i=Â~(ï[U”C—O»yˆÈrl®¥Ú¶ûfžyçä¨*×OK˜;’H©¡ÉÐI>d‡z(øõhëIëSÇ÷A™ÔŽEÙËÏî_ÒšÉ,®¸ÙzkXŒ¬cߦ{1瞤ýÙkå^;[ó¶7’c»\Lœ'¡Jcª:xäŽOˆþ+®žn¼¿—Â{ÑcS]´ïþÌ7ì}Î)Ô‰óÝ}ˆÆ{C­ÓÉenO1"OëAz‚ÖÎÆzÑø„r¹Yãi‘/œÚOöN9ò ¡`‘¾úÙöP-ÔzèUã¯ØÅn{©ô*L¶n“é,‰„ ÷~2PÅ&]E©õÕ%·"b¢>u±‘5åÖJ§ò¸i·!.Þýúû‚ùHQòÆØPøzm%eÊ þÎ!ANsÐL’Írl ?Ùy‡Ã$4­MgÖ:LF±QÞ°XqgÕY v‘o$ðS^F4§!@Û~Yxr™Ãúœ_¿ecyú@Mòs¤ÆŸÃ$Cÿ±\¡·R š°ìje£O1 >ÆÉÇ‚QÈp0‹P+Ì$ÐŒñT@ÜK­¯N9•äh& Â-ÒÁÊZ‚ÇsøÎ˜3V¼ÕÄû€HK5îÊ¿"gJ¨KÙ]°½:Öî–äû{Ëaö"»Aj{Õƒú¹›¨ïëÇQ,´7dµBŠfªøºç…ªO&^øþ„ã*Ö=£\/:ìŠ XûY$ µö‚ÞŸPotÛa,pBÇþdÔÙ²þ)/^Úeºlš‰b|kk±YÀõm>?ÄÇ‹SBêÆU§æyôܲqEBÞWwU9´\+Åÿ(C a¶±vmøº´ï\vZíßa¥«B)%UlÖñÖ}ô³ŸÂ3ø,|ñ‘òÈ’›p9îì "¢¨CznÎ {Q ò4¾öXœ+ó_ˆ,#n¢òî9ä-ãn—²:¥6!¬½ûvü?íšW?Ž@k•ÚAí¥ˆÕ ´6µ+©MÍÄŽR[iíP£Ô5jU­ÔÞ{Ï5‹U;Ô(uŸîý÷íþîy?çœ ¾ØÄÂj­ƒ(èãECI¡Ma†p¢ã<æåÖïQ×NvìG´.w`v¤`¬}žMø  ÅÓÝ:]¤ŸcЇ¿¢¸äÙ–¢ QÛ’Øß |” 4ŸK(°÷¶¤›Šñ_üžàB8EÉ­IgòŽÙµ5ô7¶_´Ò׊ûuŠÈ`QË]ÿH_aOÁ^ÕÏúASˆG†‘˜ÆN,ý˜œ½<º%kCÜà"ÙÚ”¶Qbºw¢ÕyÜŠ&Š}RÙL%J}k’šgP¥'˜ç Ýï_íèÙY/ ¥*ªÌAŠ®"„ï…ýˆ‰½æ[‹,å$t<úøZ%Œìj_܉GÍ·¯žÆÔíÃe—hºÝŒõ(:üJPžÈ[eZ°àîÿɯv…®Ý#sŠ} ÉÞ®³É{ãn÷¬fAëN:\®¢}‘¦~(¸_ª—"piùÜ'gxä½Z‹Ž|ýAîgKô£¸dae9–óÉÍk[ž|Ø ‰iA=ÓOEw@énŸZM?|IihÄ,É8ÉÆ”“ÚÜ s9^bXzpôbÛRóÔsçHñþ–T+wVyb+Žš;×r¯Aà=æÉÕ­Ø{ì&# o˜hÌj³;G™‘÷ ú¢÷ŒvÁÖ´ ¸ï>Jåw¿Îço$NóÝõ8±ÅSS‹‚t.¥0ºbÏ‘º¢±d·v-æ€KÀ;Já´‘ëP‹Aø»Å"Áßè%äð¸HHO_}=Ê+¥Më°{oÜQà Æª¿™a=–%eôýÖª ¢w?]IäîT4 7ݾ´h33ÏVêÞ&ñæT3Õµ,Ù M±õ5j²5 E‹/6DËÆ} êch`jò†VIÄÎàT@¾\R²(ègÿÝ>‡s†Íìe>‹¿’Â{nnî¼EªV‡ð+]àn½liV%› mÃN —›¤x…¿ZlÌIN 2:î’Òm>çú¯Ú¬4Ú*P ÄI’s,R¥ÁÃ]€$öÓÈ'[¢mƯÞjŠg¢Ô2í­(}î ×,f¯•YIãÝÃ:娵ôÅ®bT,y«†xr åNUðrÁŸ fDc‡·Ðj‘rK{Ãú !ð«\í61¡ÅcñïK®„‘ÀÑ—R¦>½(!zÐ?€lË­•pP ¾Í2ãôjQß9ú˜@!EËø¢DýÍÜ–¬&´¨ë9E3Âë5!‘‰e1¶!µ‹²y<²`j4é_>ÆÄW¥D'àftX=UÖÿ|ÛÅPUlý¬­Gð÷«Ûÿ®‚þ]§šzñrž*¸¡"TI‘E¨h—´”àÝ¢‘Ý´hg. ×4vð/9ŽÑÙ±¤‹lð)œ ÉЙ½b\œÓ×G~Èó™¦9š“ˆ¡®v3ƒ½¬$=šÿ­·lÆ(4­i0©ûÓÜ^5°Ùï1w8;[Å-bÂ0Pc}íþ˸ý„>l#Mé㬹Ëzôá ó)ÔÁböZ%åóAôPû)ß(ú®[ÁúŒ»b˜SÃùÖžV)àu©wAµÞh”'&Ÿã+¯£±M¢ÜBê ¿õÁ/ÕÀ¼ÉöfaZª<ßæ%V¬ž´ëb8ŠA×+O4°’Äm¯Ðó‚¨÷ŽÈLÚ•ËÅím&m%qßAë9DZ¸Ð¥þ™±öl˜Ã}eSŒhÕsdçºqƒ„™Ç(:üNåÊš\~yõ¾<¤ÙEXëng*r†óqS‘M×w¼-­o ÜÏÉMLvšÂ%Ÿê,ž˜Õ]nOHä7åÓSì&ï(“FÙ*Œ§›wHm䙼bˆ ëð8ÿ²çÏË£ 'k³ç›1­L8_A…>áŠvp1¬ªu­iÔ9AÅ÷Rœ„’ ОÂÈÀn“µ:)?|Ü= º­HlOÉ~M·QúŸJnÆýâôŠ"Çe^51¡ôÛ•¥ôˆD†Ó^¥{÷ùvCâaAýü!Ñô×VW‰.)>O'ØûU˧w±eÔõ«_ýÔ=²Í¬…é½8íË”ºYÚô-%ž)¹õ?‹2å#Äq­1Õ»SÀЊ­Nåä›ì¤Ê h/ÀS…ïSµ$‡_Mãºï„иŽJ.ðoÉÄ.Ç‘H-ûd~bÒö„ê¯WÏL­çQúqõ­ÄÊ]’Y] óQU)h/ *gé§A·@ØÑ÷ Q=Ù£á½Zø*>ä1XÕUßU©w4ÚMúabœ¿=)¦\›¨ù@áE&À[D{Ÿ[têE1×x½ M¡„£ÉãB¤&vIA{}ɨüØ?òXcçR&YØÜ„*3cµ,;S˜©fKnLXӌȊeL§KSü,‘Ó.ýï)•òýX©"pnüÁúþµ¾îÛžU1¨ÙVv¥~UŸXÐßs$gúaÄ9Ò³¤Çnï¿ã½Hú1™ÐÈžùº)ïæãÙ=d†Ôõš³¹~~,Ä!OΔ¯ ¡ÃJúbŒ…’Y›Ÿ8gƒÄh5•.ı.ׯ‡Å2F™1˜$’«©š2yx°6Ãò7%ë~t @Ü&)HÊûh?HuÕgOÀ^(¦!ÚéX]ÐäWL.C{_zÑäÅ@Þ#›(ÈôE˜O¼ê ÓD€cßä Ú!}±~#Ý®S²N[€­ùáãjR”^bÿçnx)\æI% á’ë†)†°sµ‰,(³÷zÌS‘)åãø§I²%?õÇ:.©M9ø˜² xaPÊe6éÔvàHÒ#ޭȶ{›Ciq{a î_æ7KbËͤ\Þâ?MÃòõ¬Î±Iž9ˆSïfâúó’Í¢qÖcU…D”R&ºP8ÐÌÉq‘púÛS¦™¾ì­§Ó@K¹¥í2y4,à nzñ~†ŠùÝB‡âw¡8²X7Õ…VËÆ¶ê ÿ/HñÛ‡8ž4ŸŒ[½‰;[ ]άT ¼HŠ¢oŒRUÚ÷q§X ‘ôö}‘÷S·‡¨õ`Yœød2¦ÐyÔ¾õ\¼Ã1?a#ò£uÄT!šÃZG=Q’›ü×Î]ÐÖc›9/±§dÒœ…i¬¬ õZ§¯‘6’4Lv+åÆË È/¾{Vsü¡æ;¥5Þ‹ÉÙ“÷°KqÐ@-Âú¥˜UJð¹;ÑÓn ïŽéU/"%ó<ÄÝ{ŸÉÖéFq+£¿ ªÎòêžëÍxì¯÷ŸQg›a+q%²½[ƒFe$™Mí%¸³År@]CÆ"pI“:%?0F»X¸_¥fÌN1¶Î®HŒ¹\Y2¾{Íï!"¹´èÊ­6fB®“»Åõè¤ÑO0–0¿Hú^˜4WíagUv;Ö—FñIôüzçõYˆØýÂè`²ËÁ¬€óÈ5è”CPWžà¾2‰ssFHâzS汕˳ŒÍ¤ }<.ëÙiµD{ä\Ì£º9! özד!î0в÷V;Ö&Ké¯(MœV}îüøQècL“ÈÒÎ3ïAT‹ëêןÌ&Ê'g®çÅVÆ´FÚÞùÊy¢tc¬óºøÒ-yfgA‘zTz¼ì®øŽ-:y@ƒ¥±ÿ\¸"•?PVÏWÕE†È3Ê lDK\$UÔw¬>rß©Dè%<»ÕìÚW”åv\ÏÓŒ ø¿€§Jœ‹ê¸RdÉ¢‹È7Ûv:î.íÜñQ;–/±˜¡ŸƒåDá¢'·]°çew7¾QÅ A}Ü[®L¼«#²GŽ_aâÍ¿KH¤ŸŸ‰‚h ¼ª»,_&½òîoy£pB7vKŽ£¬NhÄO1û_¦¾¶®rD™91Üð)ÍÞºsùTAÍöæ÷Ý¥éëc5?Í‚ÒÚ.îçþy;4Ûú/¡üà"€ps°óòñxeç…¤ü@qMendstream endobj 1238 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 33 /LastChar 125 /Widths 2835 0 R /BaseFont /SGHPXM+NimbusMonL-Regu /FontDescriptor 1236 0 R >> endobj 1236 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 /FontName /SGHPXM+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) /FontFile 1237 0 R >> endobj 2835 0 obj [600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1177 0 obj << /Length1 1620 /Length2 20127 /Length3 532 /Length 21035 /Filter /FlateDecode >> stream xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&%%Q-ueºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î vÌó_ŸäsýðKÞ`zŒ—6$Aïܪ“³ÖUª Ô¼qTÉŒ!ÝNë”›Å/˜4ú#pöpò>ÙMBˆÁrêM<õlb®‚‡é‹à\jÑhŽ!··qèš–í:—… u>5±“ª——‡³›G¿:×MÎ{òεÁéKœJC·Ò@µ¾/)qpgŸ”­µí‚ ¨•Šgý´»Û]^ÕÞƒÛ1Ü ½û߬Dþµß™á…°ä]xŠ©9ØhNT:™~«„r…7Ôè¯Ar Òx‹'£º줔(IÖR×Äf*®•5`™xZi”çe™•Vê]è®tßó ¦@ßë¨ÖŸ :º·WH’gå Îãí;g¡ÎÞqQþ6ÿ*<È8Ô²nir{:^2‘@àcÆÃLˆ&º¢a™³SûI˜ ¡NÕÊÁãɤðÛeã‘[‹}­H}öA÷4OöÖgí „7N•{œP¾©3¹¥Œ/Ä[Ö]ªp­Cƒ’½f±eB8|* ÿá´%Q0d’hyŽÏË9€œH7þ5'i}=½ó{LXwÜëaä6Aº„ï5Ëo7F—Aµbñ#¹‰…O[?ˆny= ¯7…³¾ÏÆ_žMSÑÓ<Ÿj²¹O-ÄËOrlºÈ|!•¡ÀºüV„, y©+¥, ßê¹2š_Sûà£#üåž ·${qÛF2<üm=àmûS}ü{/°¥ÖÌ:i­‚ƒ‹\’³¦ææŒ"×îS©ÄÙM>?gЀñ¤kMí!,£sê-Ð@‘œm.êÎ@ušltÚŽ£{±/¦£¢a?©8AްKjðæêBQù–‹Mør“J­õ¡F7ÇET¤tVÂÌ''¿3ÉØn¦»3=æÜ½‰(®!að5÷åñŠ&'×ì ®n612"à8F•–²£ _;Ù¦kžO„ÝÓjwX í¨FVfzÙâ1ÖãðÆé›­iàRQKzó€ü§$·+ ,o@rÂð*šAnú³,½,¶¹}ºeÄ)ywÉG~­(JYœ…Gåy T0}O7&·wŠÖŸ D©ÓÙé@ê±=Iµ~½sŽè#"Jk6ÿ´µªt‰`úb˜B½”ÿ}FžÎå”ê¡scÆ_»K3B|=iLõ÷*öY/È× d@OÏ9FÔ•Îk…&÷;®/Þ¯/]ÁH}ÄËg•ëYnq¿C…å#!èkšž®¸B<.›/æÇ¤¯çXd\ºiÐØñ-z+ŠÉ¥KHõQ´ h¦ÿFÏÀÁÕØ wˆÇÕµÊÉàŽÌ– $^?Bäu):pã uÖêShÏ©ÏUbŸ¼ƒMÝ(¶&gPð \`{$¾ɦc¢¹Ýà%_ µæ”¼:ËÔiÏ¿J”­¶¸•#HÆÌ)o=A¨|iÃHo5¦x8ûÕ¬¹Ùî?[8V=—¦­Mº.ïS`Ç¿%¼à%¨âÙÞëju¦JÕs¦þð²=ö–ÒkŒVH‹CÁVÑ"¯•›ˆøKŒÉúÖxÞfªxkžv7`­ÄJmœ,™iì‹—³é éM|ó‚X2<».Íhì¾0úd²n¬ØÕ ŽgÈ-KÇkenI`sã\ãQ ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈЍð"AÏ@ ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸÐ-Ž¡ÀULµ îu!lIã$)ùºI@ÂÁA5ØÀ4“î¬Y’ËËŒÞòQ€!I…ó Ôû´Þܼõz2‹÷¤#‚JÇ_N‚aºäYCÏ>\z…„–gĈÏs³Ìjd¨¦!X¸ˆÓ wÜ2mö8Ùp!os´C?yTÿ@[Qc×Üÿq…ÒŽ¥Á=5(æÎ¡m³× ÔIìÑ/Ôa1VGKj]Ø w´Ú}oä¿8A#çÁ°\SêœM,ZkyÀºHí(¨ ·³ÔŠSñçöš]MC~ÌTŸÜ¤Pg}÷p€‡€ J¥'Þ fØ‘Vý"‡øíbÇdsªÝë~£vz-t±~ŸU²ôn5\±ìÕµIýS«Uÿ >¢KóHšÃmµ[»nKYݼ øËÈ|(ÚÍs@w³™ >sϽ°V…–šü ®ÙÞÇ+×Xª‰‘†€9õUW«K8†?é `(zšŒÜ›×Io_eîÁ‘Í>&p×$ÏoLòŠJß´/õý…›R-“ÃOÃÄ,Á‰ þØFáÒÓýâùu.Í­Ž©X€²£ÝF:ûL@¥å߸‰+¸CVçD§›î$2ܘ±­¤‚Tô¦:‡4Oòü?ŒÙì7ØC *™VBÆò6Vjó­šÛ¾§ ÷fÝÆ1÷ídž ¿ô |ÒÞÞ@OBG À§˜«T ˜Ã1=Úuø1&\ÛTĉº(Ð64Ï›§¼ì¥—¿ž6ÇnÚ4~ÆcÅÛ[zFbÆ’RJ»žƒ.¶¡ÖkŽãÃÞDþÈÉ+GâzƒîÔ¹m_C|øþ0/–­Xµ³-`_1+Rå¬Ë¸ƒðžM*&`*ó|ÜTF-ò\<óãT¢Щ› 7³ Âý7GÓ\[C2Öb”Ÿ‘„fÊPš{í›ÔW‹Ìà±(B(¾\íɵ^*L²€N8)”póiÿ *aG„ò7(…ÛŸòŽUvÝ9ÝÛ” NŽri$!誨’«¼Ž×ãý±"ðníyæñàg±ë?ϳ· ÓøÖ8Zj"kô 䓆üùàÆUb´r¤ |Ù÷̓ÌÛ­ç,¤p†é÷ƒ³ÍÚ…ïßý«½ >õz´ø#㉸Pb¦ÝÝ7K"*t²[ÝqýXÁ2¢?Ù®Î>¿cQµôÄ ³ì$"½ƒd" <Ò-ד º!ú!áŒI™o‚öé­•“0óV;q„¿kù ÚAƱç!²‡Í¹iÉ—?E«\6ï•qV½w8á’Ž_ö3—‘¡DÏ RöpÓd‡á~.ÖàËR“Eû?ø¿±ó­šK1à v¿»1 ëæƒÙ(ˆ¼JCü à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)2x¤iÎ#§·5ž.‰©sV ñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8 lV{v”ƒîÞw©³î~¯ìýý«&À꾃~èôÓEKå½ây­ Dj”¹÷-vá'†H=~€Œøä“þܦð!UMÌÆ‚qzÝKs"œÏòçžNIZÇ&s™/í}‡•‚ðQE´¶åï¼1àE˜»×AÖö¹›€Ú8!ZŒ%©u4¶7×)-¹¢þxÏ ÌŠi#Ò},V{ 3ê™Lk0Ûd±À1èÙýåÇN@ˆñ€ÖXzdöi¢ð»†¢”YµÇÙ¹þÕ‚ÅmË.»ÎÅ)6>NSã"jú¦HËèË­LnE™ƒ¦üÂKh°ï_ŽÆˆ\RÙßC* 5¦ T(´eLjÔ9úÞÓ…eñrWtA…¤ÙlõtŽcKª¿ÔL©ÓšïÃÍCm á‚cÆó7ªÓû:³HAÁÏÑ×$k!å8Õ#[;mñW¨$¥„ÊQã]T”PpÎÊ©j0)¤p)8H‹Ûä—4ÞÌd9ãYVä]mze;ûµª.ò+ÜôÖÆ¼9+C­…ŒµÍ7ÈÀaÀõñú%B{PçÑó²ŒG>¦ï\8ÞÓ>\ùë ¾07ÙtîRÝçP{myZí2÷<ijœçâzxÒô £'2ºñÉþD–£,9tÞ±¾vR§ðSpCŠ%è²³O»¢‘χæhÇeUfL†öH)”éßѦ"¥2¦TVÞ¤Vx/>’^޳Š$pEÚŸ ºþ<˜÷|š‡+œüäî˜jlJ¢ÂKiMù éÝÙ—áø~‰Ò!ÖQ‡ü{Ç´ûô"¹HПc!v©+2é5ÍlqJ®‚MÏWàï3hŸsÞ:®ÕýT‡1›ãð1QâÑ?nÑa»A› ²¨ÍÜf§”RéTø§qÉíæÛ·>Åé™*QÕŠú™Égš¾p¸ãù€ß°L£¥ÍùŒ„Ê«˜½HÔvN„4'F ­Ÿ_?jw­í€ë`Dz?ú¾É¤‡ªŸ}¯? ]{•jåqL®tsµN!CPóÅñ5ˆÃ·Ì|Ïå~º0È žÕ iê“Ojh¤Jb§ =¯ÉŒÕÿ;Ñõ¥efÚU»oÕŠþ-gì©Ù¯–Ï‚ƒ‡ÐhèCÌÖ¼Á‹Xž 0Kvî5möAœáÅ\AW*£PôŒ~é_rqúõ§EÓ<ÕÔCvCX± ¸q`3'¹¤­„{èF°–$õh\..‡ ¤õc½ÑŒ â†Ù]ÖÛi ¹ýhIèu ü–¶ô#”;üÌÎl²k¾HSEb0pßÂéôÈUÖùz¶ˆ~ë> º.F5|EKÖ_kßU­†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2 ZK …‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡L"Y ^ßî/;>Ìûjö‚cÊP;É)>¡ˆD‚qL¢‘hF‡\§›:ÄzPªÂK b÷{Ž:bÌ_ÊúDÓýx©4—wB<ÂhESUÈyè,ºf=°jŦc³Ûb¤€™×Nx”ØBÞ.Ô¿œÃóoRKŽNMðͱŒNpt ØA¬¡â ϹùèÓAØûE lÞn_V~M TÈüð ÛIX¨_QW:ÿµ ]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r EþØÜlgøÕ_:jûìe ‚¡¡¬¯ 3"=%…m7áûìç‚=~WéFF× 4"K¬³DÜ'ªÑ?¶úï…nÞüú M q‚8IoÜ•ªÅö›ÍL-Ô…`€ToÞ½*Pvz:N“x ›ÝžÜ™3*IŸeÀ4µô ;S9Á%]9Ao¢ÁN©‡’p6/€ôJš6:7õ"élÈ2îqœÞ܃A«ñ)Û«Â!F—?+Íõ­ÙV³d$7ÁÌ&áýWW(Þg0 ÎÜ#Úž8¤;ßJì­¯ý‰Ù¡L¹ŒÙOÝ5 oYÖᘠAÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=@[›CQƒi«m®þ²´! ÚÕìΨWtŠã ?oAZdævò6I›¼)’þ‰èRUÛÌ(Á@Ú”µ²âa»¦Ð£ñ Ûå²ÛšÖ/ì¬ý&Å%é¾ACF÷êÏa¶šƒ;öùZjûâÛQBÙ„ãljÎYIN«ä…{Ïy|—hX®t²RML‡WK&q¨aEPjÍ–_ê›Í2ÒÙmYL¡£Ý§ÎŒrêgsÓ¯NãÚ‹+A׃²„7g¨ëÞÊN óké…%¦~aÝ–o¥­~F¼».û#3{9D«Áä1;â´æ ÍôQôÃZÏú8w&_a†¶j¡ã÷q ´r©>Ý}~9ÃQ‡“¹ýñQËöš‚¸¸ÅÒRß nº_Ø;úáW„ZÏ(œd ÆÅÕ>¤õ„‹ÁêÍ¢*qöŒ‚#röwQ;£œjÚÆ^kNÿyŠÕzÁ tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940Œܧk¤ÿe:ä#_tRáY L©£½N‡íAKZ' KLH§£tvH¶ÐSÑe6óSò<ø]©k>¿2 GÇNê#u0UóQŽÅÕòK»/ó<'\`ÛyæÒ5êLZ íèÄn™çšz‹ˆÆL²˜)ÏvŒX¡[M5þÉž„¤´‚o®HõÌLg‡œQäzä<¸±5î6Ýc²±ï.U¨vÉM{bUWåL¼Ù¾Î,mxÙ*û+‚ikX‚â{uõ<„NZ'8ƒ,T¥~ Xè%{2Ñ/f>[µª¦Dîïö|Ý¡±šöœ©.q´Ÿ›l¢”„AMãSæKæí3r,ÁãZ<Ë›¬ïám)œ+h¯zìÏa~¥^Ø‹Yºxà½M67­ }¾Q@°ë_Â! ¡nÒ q£^c7Nh?–Dbk]z‘Zøù·Íà[ÛX=mÅ›P :žž‰ÍW½G°tC#<áß×V Â'¦ŠÒyÞÄ1ò\ðÎòˆ¿ƒˆ§9&åŒÂT«âÞ°;¯oQ Äd²’Ø[EÜ­°¿ÈÇ`n—ÅædþǦiBŠFtù£¿ mŽ<{ töJD|Ï;±Æ&G‚iþco§Àå²-çaA3©±W(æ‚2MYÕô(mò¤ œFã³{gþz&V__éa6ÎÇp›¯ØalĺÃuwðnæc"8¡n‡:Ñ!1w‡Í‘˜Ý¿g•à ˆ%ù[ÛÃÞI‘nÓåÙ–~gdº/~û¬ugÉp¡`ÁPþôTiHŸì2\)ÜЙÍàÿ®ºþ0æ‡zx)œE½ Úéq;7,¦ýs¸ƒ,ª‡izÕ­éü*ið¾\~]•mî§Æ Æ K•!ì†ß!ou4›¿›û‹†«ðw<«^UG‰/)cy¯$Ë‹> täCÔž•6rеð‚jåº)×ä; æC'17'IÙŬõ1:Ï–¼pV%¤»Ã 2°ÅѦyWýö¾¥jÖÎŒUËü«üÂ@¹,íðÊ&©¾JèS"§oóZ²,¢tëpbýèÒúc•û"i}„¦Z~K¹ŠX`i~l…`šúI‹%âù>ÑH—ÓVÒE©ÆÅU …ú©KÜÖ·w+ÁJS¼=öËŸ.Ç=|µ >üô=ÛŒ ’ú C¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s· @qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6•[x² _#6}°Åf T¬…%*FųÖËÇ}Ù‘8?´Ï›P Ò¬“ê<7í¹õìÒÂgVq_î½ò±fKú–lFîkÉ(w(:Wâyx­¹CIBÞâ‚Û¨[NõbÖcpq¹Ú4j´¥"#žþs7¾hÐag•Þ^c QÔ'?ªæå´AÂÞÊ…øh¹(LMa.‰(<ûù ¹â¹®ÄÃä%ÄkëºT)ƽØGbª8Ø—ö×tà,D¿“¿¾µ•*Òš.S:µ›èY|Ùä'Fz„yÎv~lˆ²Ð…ÿþ5£àfâ¤û–¤A-í-³ñsEZEÄ÷QàÝÜ=‹þ‹ÑMTsî›?8á‡t2eVe&…¾1›B¦\q(ɽAˆð"_²ó8ŽvTD=°e™U³ÓÚÖ®e#"EîÍÌ-ûax‘Se¯;ŠF$­àÈY‘×Ç7¢=HÞ¯½~òp±Õ¿þ) ’ýÐ+PXY-x"yQùºì€ìCˆ«=³&o™ù…ŠÒ¿$¿Bb‰ÔÜ“Q80ƒÁ˜jU¥9Ãüró5½C£öñ²·Ëä—A<Õ¦¡1RÁgó[¼X- ?¼§µebÑ×k^6*Ù J ¬(І¦7Ü1)ºPïNଛ/r§t ªX¥õø&™ ¥ƒÆôÏážµÓfÇH­öõŒ’°.ÛJó9øP>µe't§l†ƒì1M¾#,Çä1¾#Ü­ÕÄš#[ÀN).·E¶/°6~ª§ˆÄ•T1˜ôY¶#ß:a³áI]ï¡‘g=㟗ì26®HZÄ+ØÃîk z|~ÝX!ö×½’F`à[m”Ý»”}«SqÁM÷]»&ÃÍÝùԛꚥ‘ü…@ÏHÈúû Ónê c—™XúAÒœü.; ®¯˜›'·Œ©½C›ˆ^zºnõâ塳ýæzI‡•f®.µ[bO\–äïoË2@c„ÓRvÛQ“5¦_nuˆ+ç±Þ0p%í(p“ ,\íqºGÞâ•ÕœJÈzpˆF­zè€ÙB+>„ iÎÞbcýЗޜ:È3\0/¡4ÜcàˆýÚTÑýŒ§m q¢Òß\cÇ úb{OhD~éì#­Hýð&Åû˜éì¿Íäj…¾d›ÐTC ÿcä¢Be({fŸ9¢z±í¯ãîí+¸ƒ»ˆÚ2HŸÃ{Y³ït”CX¿4±5=vßê „$òVëlY„ÒT PNóD© “¿÷Âá4¾4k[ç†ÙÎ|y©RøŒ³„‚KÝOsOsN±< –$õ ßO8,xìÔÝMSc1#ØÐ¥[±V¤Dæó:1lž ÔzÔ,•é$âλ›¼ôá·µ©¤C}cç RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Ä óè·¶²ú0 pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ˜-”a¦¿FJá`éˆöF%†m„lï×Ñ|GÅ“ˆ9€lö,Îh¶IŽ¢‡…ÿNEI ýõ>ähÜ—ð¥‡Ôâ VG¯ªuIl?¦_a‡EÁX¬¬¡Ó]VbîÒ\ß0—ð&®Bs:¹¨k~`µ8î¶ÈÑgk[÷Þ–C*qÁí%b,ˆÍ¦Y=S„Ü›)kT}3ÐwZúY+Ì¿¸‰Z™ m@}‹å],×jIºJëÇ™Œs³mæ™!É=â1P1@\¨²5ãd £ÊÕ¢+ 3[9DŒ§Ý´º;A‘þsš-lFQRÒÀöÛa¾Övþ[A(Ïô䕨:>Üa$/)œ¦ÿâMU_q£ªÀX9ð(ÂÙ9Nø†Ó3+öš¸wQžugGвeŽd‹@ÂLkZÍöç@QvÛ˜Š!-+¬d±ëO%è \é¥&û)Ë£zÝ»èëvÁ10 䘰²ÿø£T7ÞúûèÌ›ó÷Ï eN£Ow·OªCõ§{gW¸¦u‡3Ž«›°ž¯uÇ*/[ê7,›¸Gܰ”¿¤Z·R ®²¡Ï”ÊÇ‚À“É*ì5tõŠQ,öO^ÇHO‡^!VçnõYç†ã2?K0eXËk¦·zy*’"\ü®æj‰¸gFÓïiêC.Níe†Êë”–"—²a÷4TÔîÛϹÿ)ÂP~CMH” sü•cň$çi~}c5mDÍÚ64òÀG¬þ¢ÏsÒœ¸—Ò¸×õs† ¹žGîì¾íʨ ¶49×ÔüɆÿ»–21“膞„P1Ün`‡\¨_RðbèÖ‡èΑ6ÂdÙ.ÛNã²êü–û:ããœÀË<2¹»ì¼‹¶Q†.j”¤ãôiaŠ(«Ť{+ÚE çøx£ƒ®Ñãz#ú€½ãJÿy‘ÃEäºF•“Róª»ÿø†D¯11tü@Ct´Y$Á¼šGj™¯%?¼äX+å•?L¤ÔÛ˜‡Í”_´Ò#(?Êô\˜ã@¨nw"àYl™À<”w„ÙY)ª5avQÿÊ%éömŒ—êÆ5=–AâŒ*$$–-Ò{OcŒËüŒÖ3n¡÷j¦&•3ì£Ç€ÄY+÷U&‡Zg\'ãMnÿ@÷W¢4’: zvlAÚ”‘…‡’>é„Üo¦˜Vü_Ù¹šÇ};*ˆux’ÆC,(¨ƒ|ýÜñ¹Ú÷zw¹)ç`‚‚zÂÐg\ÔMñJÿ¤žÜɆ'ާ¡j9åÛôWÙM¶¬út5àÅWª˜»ž›Eþvó[rǺ4®€Ü’™`h—=¿©ÆôB•š¹ÍjÂìI~ •[ak‰¸‹ £fÍ6•9í]ØTɰbµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! ©›86·§FåK•5JíB«×½VYg©»,&à1:¥ËãŒ'„D=lï«&è©IãQ ¯€äÌWƺ¥„RÒŠHw²ˆsë&üÙ­kèàûmïyoµ©ltxebmHçfïêïo&Hì*âj¦Î¾kÒrX›0 — ó=è^›,›.Âå˜/Z—[’áXýõ~™?4ÒxÈÙ'€äñq ´¤ª^JÙ[K™†OøHÊW|Ý@yw³IÉ:—ˆ™ô U-MÎL áÖœZàZÌBÊíXÃ6‚|6å˃ÃçÙÚœ—äºëZ£ÇØÅ³%GÁc‡0Cüs‰ö[}‹#µ\ˆae¤Ãú4R{ ä{ÙãaË4#ôbÏ7áÅÂ…z¬«@½‰ FC̳„…žóc’ÒNÜ4.~4\jtÑõœáåxþ;²![EâOB ÆwkäL•1Ó-M‰Ë㤶@fõ$²&©U"Ë*u A½ ¼ë0å ®ÏØ¿îZïܪc~[Q7µê4è©Hšñq‡Ôø°7ò=­³ž‰’ §™òÆú˜“duˆ?ÎÕ+r^9kæÖqæ§œa^NžbÁ:ÐÞ“ªC=>JÅЕd›dg‡¼]ÕúˆËz@øeaªCšs5z Q/FÐé­Dú÷8È«âX²D›íŽO@Ñ% U÷Méd>kZ|èdü%ÎÐ?,cYÎMw5ÊÃÃP|øTëZBŒåæxM~`Ô•ä×P Ïoé†-Ë»ç² ¹ Y¶ñ­Î±‹èÞÛ°ëÙC¼aŸèß7嶸מ 뜻%CAÌ‚¬UV´‰Maü€¤Ï¹uñçó„áÜêÀ:œð؃CÛ(|#ºÉ& ÇëéòɼÏÈ8GÙx被 гp<BÌýÀ«›[¤Êñ+ÇÕ˳ž8b׈×[ÍT|­¥#NùæQß§CW;Gˆ|SmÿFÞÖil±^õãþ™ef C¹‡¸·á¢y JòëL;˜L]¸îÙÙeÂAÚbˆPAIÛdðIÔPîÅ¡êîµx£x¤ÀvóóZVSshö†ñ<(ïmýyh·-®Í䦊ŽEʼnqØ•!fmÝSÚ‡ðËZŒóÈAöÉlxýJ|Ÿ¶q³åT ÒŽ4˜Ìýý—HUUmnˆ øCWÜ]Òï[÷²;ZØtnh3¦œ¨8 ì.(Ðë[Ù_ô~{hRÒ¡tá%kj†)á¦U12Óx±g¥×_nŸò‘±q»ÉWŘÄÕÜh95Ýô릆‚˪¿´¥eI]"è+©$jW M vžÈæ ZTb"}¤ªTS ‘O{hŠ?"ʲ|kêz*uÖqÎtR‡c7J—‚5ø Z‚†R ×·³÷ŒAÿÞ]ÿ¹:#¥µI丙û@òñœPœ p9EñxŒ9"úˆçFëÒ1“ä2cÈÝVâârÌàOÜ>KÖ>uÒ»jì¡ír¡Ž#ú$ÝQoë <µ ƒº²#×_›Êÿ~†L²¸Q“Îxêœ-ñ9t­@i_Àš9™’»ÂuŸîçrÿ ÑÅÛ±åprkBÙûCzÆaÑÓ3ëÌ"!²2ö]3¾v{ÌÆY­»G «Œs» Oå×náR¤C2¾&`ñNƒ§Eƒ“\ÙÍ9È&Bê.üŒ¶Ù· nRV'“BV’äýáú%h:¾.l¶CÑy%4KÉÂTÙfÝ4„T·:ùÔÖ4_'áULšj€žXËÜý¤öiû ÃÆûêç”´c§=`²¨øqªe˜ßC´Ü¥îóÚlméòùfôæw Ñå#ÑÇ’tx³%;$àh én÷ý ‰7pP0OÇI¢£§f2TûvÆafÕ4Qö“ ˆ,‘XûÜLܧ–zá_ÐáVM¹‡¦OšdvÉDþeQܪ#騩èªmc…PðQh–ȳç%w"?/]]‡iîä-7.ã ’ÿ¦VÆ|K‰bÆ”`ˆëF¡·bÈÑ¢-ñ1Œ¨y4T,}ueé'ÊÇõ»•ã Nø0mT#?[½ø<ÿ=†C³)õðœC“$²h,™#O±Píe8ÒE(,–# s¼zMÎ)0Ý‚³0µÀ²DU4–;ÒðÕ…1¦ãŠ~Ç0W€/MY$g´™•A-5 Òþ 7ãnîS}Ž@N:°óï3ÆúZ½Fõkwy<Òð‹÷ÜhŠKÏ=s+8T¬ªÈáö@°on»ÕÜDük w¢ïž@8'ïop°ò›KéC©ºyϚʡ½ H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$ …hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{Ä­Æ»òni†n½$›B×:õÒ©~’Xvy x’9c…Y w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë2L"ôÄEñK‡æPüÚ÷AÍí"I1„'{†§³ úº¿¯c¼NøŒß_lbéøûö— m„nĜɫí÷Zäo£‚³|t0ó>ú>S‹Â™ÔRú—°zaI¿ î%ÕA˜">© •N~ú‚×-† ®2-QVçh-‰úó ýÞpܹâÛ/–¹"5vÎf—GWnT66þ8éô^úÞu¾4+k‹O5Q]¬NÙ  ¡-ël_M¸k˜ÚûAú=é&;4³áhgVå°CºìÞÃ5ÉÕMå×\Æ»8Ô\¬è”&fO³úÇ;^‘RÒ.æ,S–¼÷ƒ`÷‰†¹¼3y°f?s&†ñÊ; WÙ,¼K#«©Ù¯®øbj[¸_VM2ë*BWMЬ3@¿1(Ÿ¸éŽ÷ÏÉXúŒ¶UÑäDär ÷ñÇtƒ7Õ‘l g h/‚Ÿw˼¯rÔú'‡cÀUµÁªqFÜŠ%ÿÖi8ÉÜÕYýXò³+~¢‹Ùäûó¥rkHú¶>O­ÐÑѤ²v†1˜#°^:á?Q7Q¥×8Tnn¨tÑ#œ6nœlÕó Úî×îŽq Òo)³S™2áØ¢c—¶FäKa·\®ó*‡©‘@èž›XsIÅXðûh‰ðeýÖ8%W6¤¹¤‹»Ü²yÕŠ½¢uoUêJP'mͧésŠêø?¹ÄÆŽÞמ+Ü¿eB*£HH:`rÀL]¿ºH.âØð~}Êη¡>¼üHÇ8š½D ýâ.ºQÞùÎ_]Ì—%×ÏØª3©W$@2?d…°Õã¾Â`¾²ß³Þ׆>xÊ:ªÔý°™9•YæÒÊßÞñ˜¥ãë^:?Ü'°‡eIº¼¨-„~ä˦MÕ7W¥_ÓÞàÁ¥MxqÅß)w¾€Ì}®+È Á‘ÄâGu™.­Y6¸D£‰ý}KCîý§WçRPn"8U+Sœ÷ÂøÌûyvÝôL½3ìüî3QÁš\É–ä>¨UHC{ϊѼ•€Q¹!÷Å“÷.¼?;L9§ZšÒE¾é«v¥Ž}03|­˜6þ–ˆ¶9£,whœ-ÇËŸ­×;?zøpÙÍ„y8àŽ9Ë¥H»ÑHîÍÄû-q˜˜\—1άÄ.5HLUcß|{¨8óŒòZßÔç`äô³ÁPß½Q5åŽèz”=ûŒW0zúU÷Þ r còRˆžÿžDCh-&¦)¬u#Å>"1™k–ôÿ »žÍÌÃá±N”vD#¹¢A窠›`_ÝxXÒÈwgÞ„ÏÙå 솋ÛÈK+´CܦA"Ê âc§x~XÃJo(¦cé;‚÷ÿ¨š#1âŽøé}SUx °f=”4+ÿ䎧õZ›…HK0 —€_úØî*Ý– ·£ý7<³Y6ªãvl¤ÎݱæŒú‹Ù¸™‡ÈÈc?m·Ò†h¡ˆÕ©Åç•¥RäÍ×”»L|âÊLwõø Ρò°¤¼AçYKr¼Ï¹ÙÖJÑkW½b%òyQ·ŠTæ9æ‹Ló"$N¬½ôž‡9ȯòL¡åùö;û¿ZÆMú›¦Ýj{wAÆILTI¨£%èÔ&ëö…ôâÞ %§½(1ã:«/h•¶µôÕ9óUÖô”‘­Í¡i¬rÝxUæ¸ÂÝPÂ#á61”#,*@Š –üb±·Tx8ÙÄç{ëG79yçÐê°ÀCþ“væ$Põ`Ò匀V–ƒÿþu6®%…Ùqc†¬Ó:†wtÎì•NôwØÒPÄv©*û&<û'ývýЊâ¹!ÔA"OýMBð¼"ðÛQܸ…ÍK) z²>Ç'áØóô-oâŠÌ#°±ÛÓ­ÀD/&Ësg k7/;ô^D÷‡ÞKÉÁ¤ ŸCH-²oS<ÛõCoõšÂÛw˜´øŒª"ØK–_Š­"H‘¬ûVpÆsáõpa¡£_Ì×SÈÚua¯õ°Ü±l|ÚV±{+ wókÎ:¤6= s÷(HfUôRê¸zP¢[E  ïcYÄEùºŽsûr~3§Ÿ°3ŸMÆ?å¦T‚°ÍZ5ÕèR˜±˜rL‰buO[ˆ`×w\ÁU·?‚‹œWà&ó+Дzu(“ Ø!ÌìÅûR% 2ú§8xdßÿó <ÌЃ|Šˆîç }®rw‚RÕ:Mp’òÛBÿÉ]˜RòöÖ„½®íX((gÿ¶Ä?ɸ‹e»¿è­ÚXÄ`]¹#ƒÝ’X—ÕofQg è¿ÏU„»7­‰¥äœ“sõö‘ ý£Ëw5Y¬•ÓaM(Ã]Fƒn\^¥BW¢É–Œ~3 ܯ*ù V}ÒD¦ÿôð¥ÎÈ }ˆÒçq=G/¦8õ6ÙüÍ/]Z?ó{P>yêU•œµú}éË2&@žÊå:Þä®þ;TÆ Ý‚Æ¯9ÎÖïSftt7,-–‘hV©©< ®ÙÒ]+,àŒA‡Ø  •;…ÔzEå]þ<Ïßý‹Ìɤ C™Ñ6ïðÖR®{ÒºsŽyZÍÒ+±êÈÜôÄk´ѤFÈZ‰!FÝmP€×:%•éd Ü)„lk2'¨ á"€”Öó±âµ|syùͱÕe€\ûÊJ;YýMªI­‘_£ƒ~Æ1bfÓõÝd=–ÙþÅ|SÅ=UkΫ S­‚DÍ0 »(ë%ªUÎ17%g:F‡°ÞZ?{¡ßs·1SÊ« „]« G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb ÕÓþÿkŸ,ÛšŠ( ¢Ä’n¤Gw3pÔèÝH·„4 I‘.é–îÝ%HŒîîÚ{ÿÃûí>÷ü€óá<ÏñÊ@J>N‘÷x°íþ®/Àï^ÈnÙv®Q’U õ×=[#Cã]6öçÑŠŸ‚h& ’Œ# ëyƒòk»6úq ÅGÕkX:gׂ še£¤xu®ôØ\CùqKå1¦g ¡lø 7[Ù²Ì4Òÿ¹[PÞÿøç¥ÏFÔ´²ÿšûI#pŒ"­ªºóöWwxN¥&ÿÊYGú鯄¾åoK?\aùt@½=¥¢D#UŠ&ÐmÂ΃:Kó#˜´ÏÙf`ÃN¯Ú¬5}=ÿúfy$V·‹Id”-é%#©¾¯{z²5…رF’oö¾!²’»÷ØIáMØïä†H}ØÝÖR´x`î/Æ]è›Òª^3±Í7é¶ûñâ¬Â^µñŠ ·(FLH³~å¶ÞÖ@Õ6Jäó¾xÌ0V?K£ÈÕJÑ}gy,‹¨†/ã©$þ¸Ì~“Æp\!#…þö/»-ñæ –Ú3Uv+l•EM ´Dýý_O‰uò!÷¶:) G‚·Ñ é91¬ÄdÐ~í@§q&±ÑŸ<¹¥ËŠ)üÁžjÄÆpîp ãO`6ÿÓaÌ€“Ê ‰bœ›³ƒø*Ln•OA‚+«ä¿dWÍXäøkÚ—­ ÞÎÓÒU±?*›¢jžêß_ +µ¸¹­Cí­u†Æ…¥v‹øò¬WU˜}öÔ“LÂØÏÚ(kœ¾¨RoiÍ^$Hé~ÒøÈz’T ñ׿·xû0­®Åψ_ShúÜ2\o­EŠã¦=U´ž$¸_N Ó–jz͉Q Žò2Oa}=AÀmãUv”'·ýÆû9û¨,Yó‹Äg“ˆÐ‰$¥°®ÇªÍ3|Zí-Ä ïùnS;ÝŠM‚­fˆðÓ%¸<%kDpu47û95%–T +G“¢æ×*T‹J<Èü«˜t‡'On¬ÄÂ.ÚrÁ.0£€w=J/ê_GppÄÒ A߃Ðd=F¹­ÖO-ZÁ 9†àU‹¯ùsÃÄh #a™jÔì‚NÌ– tNcñ§VF¢ïÎ{Ȭ¦ˆUŠñŽ*Cs~ö²sg_ܱu™É¢QªÀU4“å²7+ç!|¸`Të‘…>“¯7º–s™as¬G&S]EHøáWIÁ`³ “èÖöAÊ;ÒteÞÇ¢œauÛ,>:.² ðž¯ÔÏ´ZÕ׈‚œâ^ž>ñ·!eÖ²ØäÛ¶(¥/J‹@Ëz ¼–F]¢wò¿ÝÓÏõwÁ/…=£ÆhŒcsËtö„t˹¢Æ1|Pú1—ŠR,·²ÖÑï„$8É ,f¬S¼‚Ô·Nï¡Ó¡›¾¼xœñςȥéJ#ìKÛ1íü±SŸä{årsê,<+ö‰ÙöÙœ¼U1*µþôD'î¿ð|ÂBÕF5Ç .‰Õ+‹f¬æ-åuÝÓ±oFã”’zeí­ðÓ„A ǫ᱙—KØ+·,V cšðôŽ­/EþrË‹î ×öëMƒ}#j€œ§Z¬R‰¾^¢/dõäx”z[]ï9OµÈŒý/Âæ7¯>’òT-)AB鈢C• §x”ï±IàI稂i¸t¿@€"JUîU}mÐ'sÌ’™ž,Ð~bèºAòFKEOlÔýðp€.Xb¢ùçöÞ†£EcÌ9¦È<üE¶0mª¥±|ÿléæ3‰•Ïý="þØæœÖ¦wÆ:—æˆà#!¦%Ö§’\Fj¦¦Â‡ÊIK°';Iª…¢ö}hë­w™å9²T¥tM¸JÌtü‘á,H‡î"ûDHÔz 97qtÅÝÄŒ‰ÂuØ VqtîÁô™?'¯`¹NøÊù3²–œGÜ*˜é²HÚªÒ ¾|W]ò {êîTõÌqý]A÷,’ùÚäÊÖoU¯¤h¨,Œ¶‰wnmƒk¥ºþ Þžê|f¿â‰™TJ8‡6¨Š5¢äÇ„ãÒ¢1,Ôlvˆ^Ìýµ•Žã¦!ã½ì Z¿ÖæÚYôšÎß×b&¾¼ÿÕ‰šºCåu‹Îø{é±Âf¹ªÛy¡ "|ùª<ärÌÌ„)=¤˜ï0gxÛS°^Ø«šéqGGÙàèá´àL–{ù¾±~û™ÓwéAÆH¨º…°íMÊe:ùf> *®b&¸Fd!$xöœóhú¤ýGr55õž?õ'GžLq ú¬ÀœÖÕéž´AA´F߃ƒCÛw ´VøsÞkw{竱>·0¾8ÏöÖ >¿ô=Hq«•3õ¦x:ˆé©d9QL ­þ°¨]Y¦šÍ"±J[^}ÔÊåâÍò"5=4Ÿ*«cuýiÛë‹%ïQˆu8aA#&S¢"\£¥å^u›ìèès² ×CbGó|cïî•ûl.lض²¡5·•Ÿò6Ëü¥“)>5“ܸþäc%Y ÒZ}ϲJ¼G=™ì f¡»ínÈ!Ò[\ŠÒ^H0©mÄõ˜Àw'¯E¹íTŠÀ—±¶À˜•«qRð}øù[õ{ñ½ÈLðƒDß¶ÔÐWd6¬!Í<ã÷é](XâJKR K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW¶ ¤¾ÌÄi~=úï°VÕõZ5dw0uÃ{+M VÅkzÏjG‰7¸zb4@ˆKPñ±Ë6§ð]É"‡ÇÂЗË×øVà]ßQè³ø%áRˆ¥¯>2àsÙsÍ@ü+§hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤ÒøÉ‰ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ ¹ƒ%ÔÕÝÙêjý7-âendstream endobj 1178 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 2 /LastChar 151 /Widths 2836 0 R /BaseFont /QQCYVR+URWPalladioL-Ital /FontDescriptor 1176 0 R >> endobj 1176 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 /FontName /QQCYVR+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 /FontBBox [-170 -305 1010 941] /Flags 4 /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 1177 0 R >> endobj 2836 0 obj [528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj 1041 0 obj << /Length1 1630 /Length2 16214 /Length3 532 /Length 17112 /Filter /FlateDecode >> stream xÚ¬¹eTœm“-Œ»kÐ4îî4¸»»7.»»»‚»»»»Cp ÜõËó¾gfΚs~o~õ}Õ®ÚUWíº«W¯¦ QTa6µ76··1°02óÔ”5llŒLö² Êö¶F€¿f ŠïNfF  ½¨ÈŒ af 53°²Xxxx(ßí<œ€– õ_::úÿ²üã0öøäo¤3ÐÂ@ù÷ÁÕÌÆÞÁÖÌô—âÿ9PÅÌ ²4˜mÌßµ¤ä%Ôòj 3;3'#€¢‹± Ð 41³s6£˜Û;lþ}˜ØÛ™ÿ¹š3ã_.ag€ÀÙÁÌø7ÌÌÝÄÌáˆà`æd tvþû :,œŒì@{²íLl\Lÿ)à¯ÝÜþ_98Ùÿõ°ý‹ý%S´w9›8@€¿YEÅÿ]'ÈÒôOngà_`oþ×ÓÔÞÄåŸ+ý ûKóíœ 3wÐ?¹ŒÍ¦@g#¿¹ÿ’98ÿU†‹3ÐÎâ¿* 8™Y9™Ú˜9;ÿ¥ùËýOwþ란ÿíöF6ÿжÿ—×Ö9›Ù˜3"°°þÍiú›Ûh‡ÀôϨHÙ™ÛX˜ÿm7uqøÌÕÌé_ ¢þgfhþadjogã053G`’·ýM  þS™ñNäÿ‰ÿGþ‘÷ÿŸ¸ÿ]£ÿí%þÿû>ÿwjqy#[³þcÇdÿ,»ÿÃÛÈhãñóÿïžfÿ.òÿJ#2úÛ a;‹¿r0ð0²s3óü:‹ÝÍL K€¹‘Íß^ýË®fgjæd´3û«é¿Ú ``afþo˜ª%ÐÄÚîŸæsü2³3ýïõÿ•é_Õ3ÉHKkŠKÐý{•AÅæï|°prý;Bñï$€T=Ìÿ+†œ½éþá±wx1°prX¹Ùþ¾€¬,v6ŸÿKî±ü×YÎätè0323³ü%ýç“ùŸÜÿièý71;{ÓfGddgúwÜþÓðlââäôWåm€¿×ÿó¿ßÌÌÝÌamÙÞ„/Ø*=+T‹›7<)ªÓßË9âPÒ ZXà_mßã—¾ÃSaøVÂØ8ÍûÑæ±têð~ M{8Ú‹cCÕ“jvñƒÐ‡Œ¦¯ýeÝa “~ rÆ™F´×å¢ì6”6'³úá²~ñ Ñt›Üå#?™k?ùƒНIZ}v'Z#FíÏÓ3ʤ“ǪÁ±‘ᡞk辺Ü8x >W(dÊ(Ç\Amµr±ÊõÖ½.c_ñõwi~HVÓãʈßHyê…ÕØ7˜ñÀ¬€–}­á­º>›IÝo‰©›¡³XaW‘Í–êS«±­8Õ¿ˆ_$®°>µbÝÇÜ·¿<=jpŒYK‚kßìä °ø«üVþ]%ÄÕ3rñ<ñî5 !®®ãûz#l’–TÍáf‘xÙHÌë"äfëñP“ÃÐUeWcƒ¨ý°%Mg–@rW%v__ðÆ7ÊJ ÑÞ¡xÂ6%xË\5äh=Ëæ¶ƒ¬f'Ë¡r¾¬Ao JÎÓ€íÐ’½’=49þ­Ÿq€ûNH\åg½FK/2þ'ùÙQAtšåµ†,ß´œÖsù+–Z% ž•Ví0ªD]Z( ‹ž Æ©lÝÊNõíëÓËv‰â›iŒ^ñ9 qÛ^U²a˜ÝåD\pœY-FEð‘ÄRÁešQ^ÿˆçš*B ¬$gÞ{E޲&ÂÀèΨ³Ûº Éõ–H6vyRº[˜}°¡EHSÕi+ÁMÎ%gbŠþå xšA²©² õÏѺÎ3;V@Óà/ çFôÖÃAV„è8ËP^Xü”àÍë/ ™Ã›õ+:’ÌÃ>-ÀF~‘ÛÔ»:Xm* 3èª_º°šjk͇"éá½èAýÜ“:£2½+&Ü£ø§$¥&k†,_•ÿîiÂtâwˆQ^×ü\Bª“ÍÍU¿¾]Ÿ| çot+dÙa@lMvì1€8·³læ ¹S0~øñ Éá4p}ެ5FÞuU7tD”£g|/šN·Jc ?KÔ9ÞJ(¤‰ÍÆÆ6ûwò|ÛCëB'u;0ËóˆÎ2{ ioQS‘¸sžû+;ótîfCö8äÔ— ­Þ߆ñh›Ä¹ƒˆÅ y-)„Kå/?8ú|ôL§‚#YGðuClÆÆÈ›ÇjBd‚ÜpÜ{k‡ ×zµ·€‡½âiaJ×D´‹Ep“F³–ÁËäöŰþ$äÇ~½®€¾M2°ª‡ªØÐ5©Ã’-S!-¸|÷[•;‰EùÔȨ2È ÇFbzÎK××§±Ÿ„zÍ*Õ)]æIyÔažKéi5ßý¬} ½0œÍ4qXÙwÕdÅ®ºèSÍ¥Ô®?õ§ßýCÞR›0›&T˪¢§£ª(6¦º!X~xH½3ðe½ýò™¹„}f3§ßÔ _(ä¥HÌRˆ*kŠa¾Î’«&ÚŽ…‰Œ%ÔÑÿz¨¾§Gð–Y£>}C "eD}ðW:ä‡çèßfˆtó÷’»¨¬"ç"M. ¯W¶äbz³Š:È/Ñ0´ˆÇêçîà¯Ï€„)7×wo‰2ÞDçjþ¡=ë×yÜ<"nÃÙ÷µjŸ¨T'Åà8Æòk•Læ“ ¹ÓõHi<¤wT¬ò},vfuÖC_L½e+k¦³”¹3¢_üѱ&­JCæ#CTüëT2ÜhŒ•@[åÅaîKÅŠ­º[=‹“oÄ.Z…æc¤Ì;ÜHÿâ¸K×ÙgQ­]2÷Á=¬‹y0ê[w%à{'v¯rî «_ks(Þ;6“:Yס›q uËQÏÈÿënD…§ sþÈɨ˜¼{9-v©cO±ڸ–S§Ð홤9D48_‹*U4óä¹Þ‹”ìu ?«ÖT#¿ì„¹×,8dÜjQ¬\΂¸eŒªø£»øÇ]FbO× ¦<qk–x»h³©ŽÚ鬲Çá™>Z5æ Th¯éñÈL†ÌÉV¨À r9׊<3Eê‡c"g 2þY8)Ì”R ýç¼ø¶zÆÑ)ÉUÂ^¼±Æ|ÿ@ʰ›#Áx¨‘Œjx$FŒjäôˆ›Ï„éa+Å2ö}”N£˜_Ùa³òÈ/Ò)lgª71h#ÖùЯîøwzj:îÖYtC&ãGˆ!{hëú°B•¸J[Éè ®Ÿr‚ !¬!¾XGâUÀjñÕajÓâ1‹B9°E‰øA ¼×)Ïù³%ÂÆõ3ätö»IƒØ³ÄýÜsfLë¨vjé5Ö¶0’òþ+ä»Tê8ñ›¯}Jžè³~ ,ŠÚŒ„¬E@h¨Ù´:æãÂõ„ÞλÃVH<ñŸZÔy{X¨2h†´–²×.‡\E‰]?5ëJ`×­›ÔÞQdB+,߆ϭ?sŸP7¢ÉoX‡W³œÜÛÐ$yÅE%{²qÑ´…Ñ”‡¸qÝPÜï„c~(^Šœ3~pÇZ¥¶ ™¦K.†¢ÍUiÎTcºiÖ]…&é;ç]1;&ƒ¡3–3#5' 9 ‚–¶ú‘ÕKÕ¹B/:nâW#9ÄE ?o£yç ý«9I¢Ä­£½0 ¸ƒöäÕO"Á„7ìˆx—»!6)ðp¯¯âžd <)ˆ½ï-¢£:»ËÜ\Lø›Œ°¿qM毞s Lýz,Gi_'}yùÿŠÒ9¸¶²y 77%H‚—Ÿ Ømµât ³ià”z3ñ,É@þ. êÉ}Q¿L¶ ¿m™ŸÏÈä¢x™àÞé—›ÎD62Ÿ.ÅÏù‘ñœ¶ñEõš£¿9ñh.ˆ³’~§›x3×ø8:~ªè—Xø[ R¦nåÄ~¾Ži ´ÈxTŸÉEmõmªM§h¶{”ˆ¯â¸Î&<ÿ˜c]5†Ç}à/ŠhôþzD`ü­wÿ ~8fZ¹­l´ð¼÷ÂU(¹õSc›åÙx|§oÈHwHTípÐ\ÂdYUÀKrE¶;R9Â0H çåKGÌÕƒõ7ÂGì¸Jô;^g‘â©…as&ísià‹WñŸE¬çkéEñ¹'Ð WĦ4µý"/·ßD3!v&0s{Ý``Um1^ 6P›Yõ”j‡þ[µ¶ú$öò{ˆ¨¶€a‡KN„üHcdžGTñƧâÛÈh½Öd{ ôÉsØþbâ`ñ[× ¬ˆ¸c˜‡%‘–Ng++Ówóã'6÷ˆ Á?¼ßVí¸ÐGw vðš+½ÐÕ۲棋æŒíéÊQ÷JŽM'‘yŸ× <‚lÇ%Ÿ êòh èwù¾ex‘xª}Žk [ý£ø“’[ÊkÄãrÂùä”·t‹?0E?… Û¥”e%`µ;v|ºe:ù|9ÍÈ]±ÃŒQʉŽ_@q´Õb’;ðÙ$jyù™Ûô¤›Z1Döiõˆ¬Y¸²–ƒ>wõ®¨m™‹ÝŽ0’#×ɲq‘]éë¶’EµCÂúÃL'IÚøÎ t$ÒŸ&­Ryt©¸nódà’@³0¬«®áñ¬EjSTh†@)–´D÷þ÷D¦\ÝÝQcçFϨ6obë7^ê—…ú5—ÍIÙ™}-úo#H »ß ŸÀ:CÇcœŒ ›ˆ§ò aDm™»êߎ1γ.ý—~¨ï_¢œré›ÇëIEÐ9hÆ8cäÅÌ]½h&B@¹Š_«±¶¾-1WÔ¥nå Ž.½ÞÍdà?…®Éžu¾wÕôùÎÐò`8 óãÿ²uË2V„"jUŠD‰ô+·úúClûÑè2êû“ò,éë0(í<ïÜ«XÔ\ý¦êƒ¶åI“‰­~7=IË´LñkrÅ_5ŠBP,¦ÈÜ€R…Ÿ„÷)·Üíû5`Óû6•€h9|Ò’DÖõLý[j-ñJ"Âé£4ÝôäyB>g§Í±Âã×1™ú©ZÖh’*Màç†ÍuÞ…ÒÇœÍð(Í/®›ÐŠHÞ̤w/›U4ˆŽÛ y/òEù$7p 4%öƒï™®?íef‰ý1Í:@k^¹5S#J«.Ðk.ZøÈóíKýa }‹à×’²òõ¢µÄójÁ©«ì7(8–FƒžHü‡JtÏ*Tªßèá¨Tµ/}qŽä•çåÚ&Ã{P|ŒgÒú{ªVS!•ì'¿œ¸`¯î¯ÊQ %÷kÇ2#ê}ÖöM­,ÙÑ;Ìbè·£*,½l ’»±ÝªÍΔožÝ¼Úˆ§§ô·J„Äö­Ú(›Y ±Ôšû^Æ£%órw—t[_mú*ëkîCœÓU’uý×oˆN¢çžÁ§û’éŽoÀ‚µW÷ |+ý@´YÀvÖ’ß­+±›¥bàNëƒEb¯/-ì~¢þ¾Ÿœ’¤¼}"Q ÏÕÃÆYƒL+½{ Ô½¨qدG:Øg̘‹Û…ݾªòSP°“jkÂHúg)ÉÎ%èfh&Ñg7,u8Ö1÷ÿÔ^­‚…2st½ö>Èäj”•sÓ„ã»ÅQqõ`Wªž dÝê§É‚¶¡ÔÌ) ™b4±ÌZqt4=ß yÐoH0—,ñ¡´ìšd䦄ߚÚ^ÉM_MŠiM–pÊh_M{#°ÖQ%m¿%Ï ¹ÿärþbK‘_›­ìRÄõÓéKƒõz:؈X†E¤ZLHKìíDãàž¢–Íþ(§¡ö§D¯ç3Ý8jl%XÍ\Å·À¤„)U– ßµgÁxAóÆ„8Œ$L6p«ÀÂI‘¸`@Q-]´cÃËêÓ#ÆÇƒÏD½¼S§¶OŠ.3ø³ýÂô޲Ù-ϧs’KΔe‚Ña0n1·‡}ª»íWs—ÏÇ»ép²Ã¼Q.2““öjÊëP§Þ‚‹¿V[h妪ïš@îì %Ó®†¾2ÿ¤üð½´lôå™b|(¶õC';»¬Ò(žÃ‡Äd/b-u¦»ó„ éË\9ãv UCÎ…Fq9ÞîâL[é$EP\ö ²r‚‰Lã!±ÙjÀÂ;™¤Œ5R}(ÍêñŸ‘×9F0VkvA«¡ þôB°ša^½/l%<'bÉA:,¿…Q¾6ô…±>뉞Éiád7|Kms0æóp”òi=H:ú‚q¨©©äXŽ8|›ýÐBHø7ßè; EÆ- åuK“Ö|Fòb«ƒê FæâUþpjBÓ™¯+p«×'ž-íI œ:Ëp^ÒPZót+Sõ&Iˆ‰—»±ùaûÜþYÎö^luoç·óÝ㸘ÐùïÎuûx•¾ª´ÍÜ«¨!ˆM5/âKöPRd.úZbá–»ë ü"V¿zkM3[Ðy©o“W¤ávLEáÖ³£aº„´^ÐíˆÜcùÈ„‘GQ‘ <öjT~8ö’-ü9£˜U—!æÏ¹FøØÏò걚Ô{ITiï›U h‡rè¶Í¯®ßîêÑÂ_“ÝÿÅî0˜" KpƒG‘qß×­\•æŸÈtg~Ÿ`ªæÓõ”0ª0ïEW½³¦¾¥Áè"ЍP…wR"7~iJígæÛ{·¢õóÏ39b´ñö¼¦hùËuÇt’÷}òùtP´‰ß°s;_¾û½ÁÐ’|ÂÞ¨C*¯V—À`ÛnÞw`%bEce"~tM!F„ Z—[ƒ&ˆˆ<9’¨ãÃ(³?ìñÛ0ÅϲqiÑÉAâ®™æÍpšPOË`'$Ü¿];ë€y4žrþš ëöñšÕ¦¸Þñc§$¥ E>K ÍÁX`ãQäJn6ãDï„èu˜ÚOÿ±ÒÆEÞ€/,w} fDF~ïâ,I£,o1ݶÛ= Œ0S¬ú„¬î/ÝM·Õ$®»ûöÎ÷ Üׇ—ɹOvéÙ8¦/sFZ­AÙå†Õ{’¥§ë´ú¦®ìªê¼Ê±Äþ,Áz£§^¬›g8°Êðè|‹ò:æãz¡WCñ+¯¹J;Ù!C[Ìsºk¥Bˆ"9´‡ «|-&AhFÇ“}•Ñ~;EchÅ念‘D7ä¿ÑQÍÏÐ J‹<±ZnôaÙÒ²òޝÙ.Où%¼¡Øªª2óee¬rÕÙÅ`·{-Ù†ebPA“…Ó¨k’ì‰تr¤ú$œÄ“£èʘɃq [;–:‰ð…ø©¢>r á Ùk$­Àw,S~äžš Þ„´¡à%Çͧûª”Šçˆ ˰¢nö“gë)ô,ˆ²=t¯é­¾SÒIä~~ºœH¨4¶-ü…Qˆö+Ö”¯ÀclÍ&äÓïç—E‚ö¼¦"*Êt™8`èα û`°M»rŠ×0j5¹?Ší‹zUgz$C·*´­ä¯1uè~ ŽS…J $%$„ìM3oÂgnþqh± š“`ÔÙ3¤F07  ÔE"ˆÊôŸ ²1"¯² ‹e–EßÍú“ 99ôN ^ÐÎã’·oÍíÙÕJ6h”"ˆ¼Þx*µ¨ž4šþLÞí–L»Pºç§U!HUÞ™D(Òwsü¼ðÞø’6»¿Ÿ¸µoyJí.èa³ÙƆZz`èbç9™=SG¢v%ÊÃß¡²nÎI¸“$ϾxÅÜ—?ˬݢh œf1Æj•uRbqÛ‡:"PÕ!ŒÖåq” PÖœÁ…9¼ÒZX»ö€­æ½`èuçoEU—B“,N8Í,Uã)~¾…5°0ܲ0XPT“Ö[8VÓçÑy&=dgôÂ!îwºÝƒè]°Y.z•è”Óº„:þèÏçÆâ¾éçGÖ¬ IgÆò ¨¯ óÎ’þe2ðƒC%nú÷|ÖŽÔ×:ÃåÐo»·ëΜ_®X|Z?Jø „«"Õ3Šh¾HéÂú”øZÇÕbI‡«4l'Å4F¤CàÌø”‹¶§Óu -¼=eýX2$züVW-§X¯æ%¨°'÷ÖÊJ¯M?o2â†ux¿*¤ÄBl]ÉlŠV(B¹înWLÒn÷Pó5>€#2`#èÜ]i«Š@¶ÇšÉ"÷h<hl—ð€.Cwî$k˜3óΙXo"ݽ«‘Ýe‚†õ3|ŸÒ¥,t›CP"¸íIøºÏôX`óEnØwž¬òŸ( )ë¥üáYÙ¨Lúšô ©ŠWÈ BUt¶¨7ލ÷:cï õÇêÃ&nnvíõ¿ñ¯ÚKtbóD…ï¤3æ”ñ¦™ör¶å+a©p8¼m¿žÕð«<„«q.aÉÐ1Ú¹BiZšQ2›º¦ÎcÃ'`»O&zK•›Û#×ÍS"e®¯3cæðô.DÖ×ï”,S|QØ4|f¢BþÍ´¿6‹ß%7FÚ{+H¶±’½_ø?ºÙ©[¶úth§¡H4?a;Ö´|+Gv|Âj[ÇÀ*XÛ•½û¸$ºíþ³‘ßìk-vDÓ „&Aá àÍõƒY« .€tª9´ZÝb‘„{ 嬔QÊö·Y?—£Y—YYÁWÂÙEÔ™q¡çÌÞák¹;;BfìßJâÛ¯â®yµ­mͼ}ê,˜¡‰×ßÐæË‚š ¦¡¡§(¾¥Ý ôEüÙ±—KAÂl liôìJ}{^Ø{QÒâˆPcûü™S'ó!1–¿uÇ^õdL ƒpù©ßÓÕFrdƒUÖDþaÏ¡TA*²ÓÎT؉„ç4W¡6ÌզܰŽ4Û‹ÊÃO;G§@Özj‹åC)/y”Áó~s—Ý-ëAXœpÿ[ Þ@¸ vNXÐÔ'^ÍõNôØM2ðŽ]¾9R7†D†Š#£JÑ.H¥V•ã ^ R*5% ¤çeG•¡ˆ½:wtåz*ü Æm¿|MkÈ[°íׯ eÛŸwftú2Hô d6hh˜ H..9ë<˜;š5 ‚”9ù´G¨»{9~¦Õ ŽÔ¯sN¹±…îŸ{ךŸ6Z;}.p-3œ¢œ¯÷VŽöÕkîrõ| yÃCÉ omè9i}‘ørΦOžâßâ8UUÏÐÑ稈S¥Äö­&ø Ón\;"~Ô´ÞÅL\˜l =›sïÁŠ./5ˆ›PÝÍ–êY»¤ÂP†ÙÜIò눗®­û÷Ù)­þX¡ÈxËæضf )Û¢²$¶‘zi«ÊñSp­ƒ4ÊÚ×ÂÙ7Ä„±¼ÜŸ{óÃEgüZ¢ ­vZºK—/ÒeUßNB)¶4¤|ÄçC§/;ý~ÿYôØ"Y°Ž.ªûÍ"voÓò“6Ì¡¥¾c\hZvÛOå)m¡Y6“¯´,Z³– ÁÃ穇‹µ1Xè_F»H,@¨ÖQ«M6Jü¨vi…))g·ÿ¦Vlkj´­}ˆÿC3¹) ®†X6 ééû)4ÝNÔ¾CÎù¯©?±YÕ±mžCÇ;E*q\—´…hûÉÎ=u]w+Ì̬¥ lãp Õ/…L‹z¼ÒÓ‘¹ ¼ ø§P}ƒ5"Ÿ¦èÌýÐwx“s½ÏÎ]ë“›ÜPè‡þLíaÁ7mÉÇ.8»q5šl¿É Å¢Híûˆ•äu.ûóAýŒ”¥Ð4^xsÉx„xGO‰v^ü9-g¦Ùó øŠçoû×l‚û­ª¼)MÜl‹9kÇÉ¢*îÞKÑ!5޼[âÿõ/QþA…‰â}@þÕ~ˆ uRô pŒq6-tžž¹/bšE×íËkÍ}³Žn+œÀÜ[ Ê©>ªus¿ýÎ.¹˜:ÜRgj@à󇦄ٸU‡µè`äs<®;ö¬cÞvüW¼²¢8§èĈðuŸÊ =æ_<þ†î쌲;¢½&øŸ3ØGm–t‚ Š×gš»ø3þ×Rƒ‹‹:šÖÐ •@>Ç¡˜C@Š[BxUŽJ•by^=³Ï±s÷Ìð5‡oäeè0tyhÊ~ô¬ðZ;ÍP¥wQº¾B—³˜"‡ç‰nBÀL¥­šø³S/‹¾¾×¡3gþ¤Bââ µ{º¯n–"_Í×O¶Œ¬6{‹1¤ ò@1ÈÅŽt—»·Þ£¾_Úê£pŠ*•ˆBØÙz© ^]ÀºU€»zƪž\^Dq’á84,‹ð(ÒWï¤:ÍTÅ˨.lÉéÊ¦ÅÆðú VT§±Š—ãìÌo8¿_kÄ8Å"»D¡•H 1ÆÔ¹Šèf=Ô°_ž,wU ÙMr²~`Arv¦íµµ+ó<Á…>jÀú–÷gL¢‡ÎÇÓž@˜&¨–¢ä°2"‚77×Ö&6¤/8SÄ7[LfÙå1¹û_.Ÿßy)~9gg—»D#ùzôΕ=‰ƒäCuÏ—nDt ‚ç/áf8+¾Ü¶ kAU>ƒîÔÂamÕ¦hm÷½ äF{…—øt˜‘ò `9z+".üè/<­¾¨ß+j‹®¬¸WZO‚DYæt¹<‡ÚæØ”róZ€IülÆA±R–O3ú=2 Ñðbæ*&„óc™m—yÏÕÖÇ7Wbɨµî¢j)W,Ͷ+Ë’éN$’‡+ÓgY0ÅhÀ>k²ôdGEúÊ|³(1qÊ÷â'Ê´éuX„n›‘6ÖÜ-ÚE)ù!Ñ*ÔžÂï*²dFæ«íñµDùôI% úƒÉTæO^î¡û~ OFâjÅÐýÖ÷%j{=Ê¿Ë2»ð–rUÿ‚‘¯E„0ÕíýX¢ž^ß¹!ÊÉãy.Ê·ŽÂ9¯"¯ûI™ÓµE1·¤ ™ý¸fÇNèöR¤tC åaÔlbÉšRfQëtF‡äÔr£š5”+¹s¾Ò”4GUÌœÏÉ£Äw VÈöŠ·°oý¤èFàš>š$’ã‹afH¶É'Ât× ŸjØ¥±ÃÊÝ¥å—D‡(È-%~™­U::®ctº–.æÃpàšS-dÉ+MSfeðÛnO BÙo?óFMéu$óÂ"ñG}}»ã¢ÃàmpÅMØ”· þ1îUXÙjù<ù0±½É'KyY)Ün”ËmS&ÙÜ0 ö䵋P˜ë4yž FÞu\–Úwùò#U|þæ"ß‚Ïйô°BT ך4|:'Ÿ.j‚DØò2=W¸¬hÛh–T¦Ýu¸xÔêéQûn)S)Ÿ›èoâȪp…ÁÞ§ð 6¿ ”’Ã4erZ؃àdY®Ô®ocròï~'1ƒå;Âj5ÏѦd~+x éK›åËîNðcæO¦ú tPJ’ç´÷ö¢¯˜Ö"é‘0{…ëÉÁ^wãyiZÝá[½ zµdíçØÀÆÅë<ÁH†¡î0=]wÀ6¬| ýSr‚$Áõ¾Æ¤$<µ¢% Ϻ0k5G`¯º‚éN–lõÊ[dœ³Ci¦€ûè:OÕß$Hç—¨æîÅh«F¶±ë[Ö%PM4sabÈ-½Žª›Å{³Û%¦d4—Â_¨YÅgÃík‰¥?/ŒÅ¥“ é=ëåO/­h!ö¸Î@\‰ŠÛs̽ «§`=‰Ïb„¥G²}¯”Iu…áêAÁÖÙE…6ãÞRM%0³4Éãy˜3Š“öl“]ÊT8y—zËŽÀÌg˜ JÏ…U.UXZ}Èg3Ï%ÊËýáÁCu«Å’œÍ]i’°-»·Õ¨˜¶^¦†ç\4Ê ÷Ö!×èC>BPÉQIÿ&é2«~ГV~‘Ë|ÊéØoLÅ"4ãÊ]ÝÊÔ¢l¾˜\äf#ÁvÅäïX×Ô¤ êü–àmÃÉ*4j©CæO×ÖºËxD&‰—«ïF‘þí] u­SªO¸…6ç@_‹ö€AZT¨ßÞ¬O²2œUä±2^¡$·i>œj›,8X1€­«6õ×3°Òo™¦ \=[£ íŪIŸ½yÚ‘Z3°OÞ’LÆP5é’‰èG¹eá³Y9í«:h  ƒ”Tv>ˆiö´ÒÎò^Y¼Ù²ßgðIFAåÄ®ÐꦒƎ?ÔÖ±ò0°x"F ª_L@Ä%½q)•Í­yHóãÒnDk°E8®t6ݾ>9k¯Š¥¯ñ&î,?cPƒGÚÞS. [å¡W÷z¢!yÏ€•MgÇ$,Ï].~ûÜHgÊWCå1N’‡ì@¨ŸÆ$šÔÁ]ûÓ‰ÈÅ÷ì½îþ0Ñʺ\½(ŽìØS¯áB¯}!ò=Ói /ŠAd¡"Ü*!­6c­$ïèhxw1V{BFÈÓfh_ñúQ€p9£žl?i4}G^$oŒæC»Nˆ'¤“Ý8ö)R}LÓL!o¹#­¡B•jcqmƒ[Œ8v-;8eT„`úÕþäíÇæHyÐΖßE¿¨Õ4ˆf&=]sP;AG|2\¤ZägâH‡Hg³4ܧÃDÊ´b"ñE¯lO„¹öÒb\ÓJýÞÆMšÑƒlóÊ/K¿̰뻃j[ƒYÝÊ~ê™Ü~7œÎø<`S9¿Ã°ÿm\c,°íŒŠsQeÙN ÊÈ;éŽÅ!vj.“M{5…欳Ý3äIœiHžë$ÄU).t‰3<­2úʯÇý­ŽïT!ôOÝ™½øHÑ'Þ®¯bØžžÃ³áwg–E¯]Œ •g2£|ržœï)ÔÚïÒcû”ÎxðªÊ*¨ØÖ¤ß0£O˜j* )t”òWó|Lë|ß~|I2½B‡(u€ë“/ü®€/)w?3§.+‹÷‡õ^È &\qV|v´ã¤ÅSdéÌøÀúN9ïJNþÐкk£éM ÌRH^ —XÆ#vç dM6±5J­’â®F‘à¯ø5Öbåfƒí ¿ÛGdpOÓFR +S ²¼ÛXCÓàŒÚ¤ÉÈAlÈm‡å5ªýÕ6A,q$2@Ñ.\[p´YƾQ?ŠóÊ¦ï ¿£1Àòâï×çoݬY’2Û_d(BÙUEl¦‰çåR¡±±œ¹ ´uªÜrìö:cÚ-s‘¬ôHÕ'àÙ1újœ4èOo_ƒ«æš!–5˜E±#Ö5ûUãŒaÛq!ªhùUÆÓAô_îͶ”ßD°l®»»yÈ27$üpE¿.PhûîŸP%Rà÷„XŒWƒ.à•%÷‰³2T~ ÒjKEl<ºŠ~$òÛ$‘ª[¥” ánÖtNúÂDÊ‹‘ô>üÚˆp"@XcdÝuz¢¥EÂ勲åSq(ŽPxðuör„Ç‚pŠüå¡¢•ß1?_qÔq(ÿn#·ž€iDžV ³Øjnfßr»ÅM,ª¨D“­ç9Ζï#Ò?á“ýöÀÉÜ! ï»_E&JnãÅ@­jZ”¦é§J$hÁÎd’8§.Ds³Zhð’o‘ÑHÈû ¹¼vr{SÔ‡'æœÂãÄ  ïqVyé7[ˆsœˆåhe¸œã“ÜÄ Æ/uÇ.E•V´d]y¿½.õ¸$µ$•Ê7ï]ó쉯ŸôEéÃäGÞÒu{ɉßÕÌñéï r-Q\ý»ë Vª¿yg¹òGáÄv´œœÓ?MK‘i)ìS:PÓ$ãæ·4ê”uËr(Ÿöìo'p6 Ng[™ÛÇp'@x¾6*°ǪNQ‘HÝrŠÌÕ…±?iS'tç$À4©h›-yXÆÊEþZˆÚh£2œ¾ íaB-ëAvº6U¾¦°áh\ìá—¢aÕ´i¥òndud‘ÏçÖ¦B¥„êN‡Ï²I×n‘Ÿ”éûaVðø‡T6ÊÐpG}ØRz{õíïó¢_¥Z®¡>„9böR¸jxú’[u·O#³Ô•BC•n"ç÷6è.ýDÉ·¾”žW ¹ Ø#^“dù¢ÚìÖ¢/çÀ‡¿»…æ¾· &¢ñ™Ë¿ÊÈŠ¥P‰Zè,ÐZø¤£„‚£8››hwqÙkÂ5G.Iôt8Ž@ h\[ú‘2³Ê5-"¾ì”)}ðýî‰d6{]ãÚê•°Èð[جs[±3ß¼Z_Nß~ueгè_w¥hòée¦’=/ùp‰fÐÃ+æ»u^§N‚Ö¾ò'?óHºé½TjAf¾ëÈ[Ü9ªE«1Om¢.ÔkX;Hn´ë-Çþ´2êp®ú}ìÑRÃÙù,ÛA qÇœøY£2m"8¿Œ8Öñ›3b bgÁŽèÍÅðÿÁÛD¶«I5Â7éþuóþ-ŸÂLŽÞõW³<…u"(å"‚!šæ»Uöc“P‹+Ns£B—FØ—ê09+ùÚ}‡~°þ·zöb Âßù¡™˜öh?…ŽPd .Ë?ëÇ| øÚg¡c}’Q µ‘ÃMߪ›ž¿fõ•ð*3¡8¸1ÍåíXÈ׿Úo–¾vØû—€%ˆœÇMoÅ5†µ~¡4éM˜ã<®üÌ_¥©©¦dpƒ~Wê¡òÑeE©ÁÝS‰„>@åò·ÈÕäæñÜ=hh1â’ f(þ¼ E`§l?ÊÎYÒ|á³y6þœÿ& M…¿®œ¥¬7ËÍ+›®žÂ9b»_­IŽáÅT5üÎö»öH¿¹¬¸Vµl©Ül}’‰“¡z|cu8S3…Õh™W¸À›éŠ8Â^zê{~r˜éë‰qõ`=V˜áñºoà‚]½Ì‘`»Y¦ÏOÖ ê d–6‡gÖ”fS±¦ßµ›L)Çó8¼^ê)|àXû”ï;»ž‡Š¹Øî´²­Â‘ÝŠäÅá‰K®sF?¯/èdpÓ x«†ñø\Qwv¹õ-° NÓÇß@ à93Ϊ(E}jÈN_µ*’¥„ßÀð.=£‹F~é²ÿÁг[7¼¯¨õ^ªI½ª¦L6Ÿx‡à2TDÃ÷œI_—ö¬ý\ФÍîRñ{B¶H×dicìÆÌR¥jñÈ q¬,<¹è%™ïô¬Dñ¸œ URæ­oæ¤Fé$ÝÙžqþínŸTåY{âÓYÌëÈÉ$ó™hzu_˜ 8ŸÏ¤$IÐIuîÔG|¨1š »5]²œIÁu'6…#ÂPB6ûãËJã*%ºŽù€3¸ãä¹Ù¹h¶WÝ‘þò<éLÂÆz5Õ#6SÅo’8x}éAÞT,=³p¾š4B¯ò‹Â’yV˜=äB^¡·1þ®.¯¢q§2îïpEåQY8Vþl Ð0…W"Px[`ºb÷çOjû§g U©ÇsáU1 }r¾Á·ö“nèTß‚T¤ÞÆ¿äž?C5ø5ʨôÕ­wÝ6cûbZbÓ­i¦¾»Z›§m{qm!/·¸j)¥“ˆïºûÞC8/[šãpºnPÔߨ,§¹˜Håm0ôG³æ@ðÕÌJ@ÕÀ{ ÛÁ$ýJú£ë‡2A=fò;Ð[ϬœSWêèV—Ë^Î}×mÓö/eæ<°+»ÈàET">^ ŸX’ÑÀûÍùŒo/¼^Zž¦a´Èn—Ý­=ZéÑñ«‚n,Ë}°¡ÖËý=C½|üŒ_ôVƒÀõ¬áô®‘—u´‘ö²àb5ƒþP‡ÌŸYá˜÷Û#ýTfCÆëhz[!6 Â%–ÜDD+ýÔŠ°·`«@’c4V´ ‰+@‘ÖÏɤ8>êWZ«Ìü,ü î*µ64Õ’d|v#å½MW¢íQ zAß:æ5å)y?žxPqºbÔíÛ]ÂÞ¹­Qc ZÃÉ]ƒ+(“NÀèÐïú$,%-àgžM]>«U¦WÚ±ß Ó’È #á—,Æ~‹Bc Ø^’$~ÿ¾MØ]ÂŒÿƒT¢#ˆrµiønƸÿDÃùphå#f(6 á7ŽIöýxŸÑ•»ö¶Ì¢ÿ¯²5„«/î9x¼âí@'— ˆ›;¹ŸÑT“ûÛ†4ààO„Cqü¹ßK'õFÂ1!LmšÊ?ª´¬;_G‰ey›—ÊßyƒF’/æŒ <0~¹–¯)û`W÷Ro¥²'OdÈe€äÏ*Ô3ØÑåï„!zi%Z„”¦Ë®èG‹ˆ@äp²=ʇkµŸ˜t.d>?ƒflåAÂ5ñŸ¶„²R EˆÙs%;¥°ô ƒH~«ul D û–Œ[ÅØžÊó©yOKGê)$1€.9R?‰Aõ™µý¹û #@Õ¾ê¨æƒ‘—†)g³OY\.umwv¤¨Ò5{x†!šÿÉKM m;k¾‹ƒÍÚr2miA2¡éàK $& É3ÆÄ=žºkô“ ˜RŸ§µ×J[R!|ò6´b%§O«OD?Â%ËæºÐ`p·‚`iÈCÑßV®…Û„]ð-¡s«ÉAðrç˜øöåCú i²ã Á„¾xz´Ÿg(ÕPöÇÂ2Á’+©ç„C'"éŠÍ™î1t1lîdÊ>hàüÄy)¤…šái"AùÚåÏ¥+ÕÎ-bÚÂ*ÓG¬öløeε ÎÚ‚­Ê_àCæÐ¯@pÉê׌ RÁ›óÓ*8bø |nq) 5OÉÆŽèdÃe˜)üƒÄYÅ!± Ô¸O|‚ÜÎ@ÏpWõkyp)xõ(s~á°Lê‘–»{‘£Y˩Ƽ•âϪ‰…¹Û楽IèÙ÷Úžãõt«á’ò-©0AÜ::Äñp=Ï“ˆM<¯üò*3êЈ¢¥Ãvüï«÷çûŒým¡F69C¤ûWd6AÔG¶%hQÜÓ¬3cŠ~B ž¨ª3d8º„$3‹žèþ ó:m~Ý N«4‡²d¾Øšû:ž¯÷×¼Bì±Ûd‹J_¢ ÝÒ¤ÄEö~±ÌƒÙÄû\–„Ã^;Z(WêÐËÜm×MœÏŒ´X¯væ¯%8EÙôWµ’´èé0ás>dã ߀•ñüF;yÞ?“(îË/s„›/=)bù·Yõ¼†„µÕ|{cV‡~µIhªÈotùÝ>\Iüh<¾*ÞÚlGÊ:)^œšý2y~ÐÏÙoÞ†ØÆzR‰v¦¸ß´œ2Pw«ƒ-ä8·.P7A@íËreêš½l-†Ù"2‡ñÿhàtÎZ,4}r\û2Þ K4Òü rhscß{J¸­Í¬N,&í.ˆåW?õ˜ìõ™b¤^5Ì`é"’ש/$ˆv_&ñ—n_óæ,Q¹(¼¢9½ž‹1ÐKB‡Æ”f6¯N̪—á ËÔ-g¥Îú1ýÒá‘Ç\€ëy,Þ³‡˜Ù}ž}Òæ™³~5#û’â=bí-J^>F1vÅŽl„Å iº‡ÀÞ=û:Y±Î¿#¹;ÝàÏ’m‡!èÌ}°u[Åjì¦1€£Ôà+;¼±0Fz¥Æ¨–̪¶Ì„ü¡ a·õÒGW ¢ ¹˜Ý”0k—Ô~ÿ¡ÊΘ$Õ$:Û··ìllKór} Rå—Ο•:­ÝÆj§SÚ­|%%º‰vÅÜtæ÷}äÎÜ Æ4œ¢×õ¿þÞg»¨W„ä)¶.¡Ýjo‰(`¤®¸ø3³_ä|{[­=öÃѶ *L•Ôz¹zÀÊi¶?sr‚ú5:XœM½Ûj‘žÛ¯l_«XWúýOÕ0œùO˜rêȈ0wòÿ7E®Õ?ÿm]~»úàD¾?œñ޹,à¾$ôƒc2‹™‹ã鏿ߋM|&ìšp{³×Ó\Ì «e •Œ¤·Æý:®s”CrªÞr±[G^…_x[´?ÒØæå'®Öܬž ¥Škv5‰GlŸ뽺>QÄè5ó†…¼~šÒÙŽÝ  ÙvnÂ|*ÑÐaòÝ¥ÉÿÞ^á=tønÚÖ•_ÎïxPðdòùCß•b­RæwWbgÖJ?~årοþC¬[BýädƯ{ñ h§úÍwÓ‰Ï'}2~Ñ]Ø6å°âÙŒ9û ²&ÜÔîNÖñûö¡î±`luî‹)G2O=ßùEßCùä”Õùù[ ¹ÓÏ™wŸ˜sìÇÆâ@•»¯M·åöMXvºóEÿÿu9~Û¤k²¹¶…ê¼ ª?yÉg“º”òÌÜ{ç;OÛ«YŸ$3iÕæ#ÛÏn•8²oväóŽ7¯ã}ËÏëÕýÜá?÷þ¹ësÿ„æÕäÈ©Ù÷pö.Õ`¹fýO©a›K<­ÛNîêè=|ˆuÖïD©â¹µßýÝ^Ú(šDªM?T¹CÂxÝ;)ñ´g¥ÙENÓ/Û¾}õ%×ÊÛJ®Q†…É9©‰E%ù¹‰EÙ\.vEendstream endobj 1042 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 35 /LastChar 90 /Widths 2837 0 R /BaseFont /KJJXFG+URWPalladioL-Roma-Slant_167 /FontDescriptor 1040 0 R >> endobj 1040 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 /FontName /KJJXFG+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/numbersign/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z) /FontFile 1041 0 R >> endobj 2837 0 obj [500 0 0 0 0 333 333 0 0 250 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ] endobj 979 0 obj << /Length1 862 /Length2 1251 /Length3 532 /Length 1861 /Filter /FlateDecode >> stream xÚíUkTgnõJÀ+Å€€¸ æ2@ Š,š–K© É„’ L P. (‚€`P¡r¨´RZ/Àåb°¢à©¡ 7‚ V®º‚îzìÒŸ»¿öìÌŸyŸçùÞï™çýÎùÌL˜Þ'6» B1$‚4ÀÙÍûH@"gfæŒÂ˜‡÷@b˜€öö à$ @*@¶£QÈ4ªÎ pFÂ"Q^0W X8²(²œ0ÊcABÀ saÖƒño„ŃőDÀ‰Ï¼Wˆ/X£0›ˆA€Íc‰ 8˜'Ä‘1„°[†Ù’°·TŒŠ0S€fò³ÈF„üH€ sp$wÛ Æœü7L­lî"áóÝ!Ábû¥”þÂC?ò„IÄ0 ¸!l®”úÀËæÜ`6O"XÉ2ÄŸÇróa€ÚÉÖÔe‚'ráIa6“'fqÄÁK8,d¯´‚Å·d„äçîÊpgZ½™ëÉ„xBñþÈ0 ¿S/Õà»K åI2‘L1!ö¾ý X±ÙgBÂæ ƒ Õ€PŠÄa'«¨@4ð„lX ÀRÌ1‰(DÄØ‹&à (nq¬ 5@bñPf-NM¼È.T€„eÿ "S0 …X0æü¶~/ýn‹áúÀ2ÀV¨ˆ‰¸Kð_ƒ£Ói4bìm±A[ÀÎŽóoB–Ea¡xélbñ¿­9cÍ~eV”žÂDV)äqNkÏf¦g0Ü=}¿Ðˆ;Üœ—àðL­î{^ñ´ 9³clK˜:™q¼õÅà„Õ”hÜ[›v±«Ô7ÅÐ<¾Øàh3S éT~f½Š¡@rÚoÐ}/ìïâ&gs£¦RÏþfú"nðÉï6…~Œ¶šÐ@nîËž‰q38QÆ}¦ô¨s¨.36!öÚÛ%õ„DàQYR»rÍü ëÀN¿}÷)ÆáqYGÂÇL˜ºå²ËÚ 5×u e!³;t"4矕Šia«õcf¸¦wëŽ=“j_*ð9¹ãG5ÅRÒúmÍ~vàýéê›^g|ÖA×Ïý(ôº³¾ê—áyóG†ÕÇT²>ù%ÜûùÒïüm¨t2|}þÕ›ò«r¢ ¡u¢µÿf‘-UqôÁ¤òZåõ1Ià sIy‹r átÛ¿4ÏçÂjHÖe•Å£ª¦Æžºù”ÀAÑBtWQõ1måqÿ=Õ*•ú”Qíž< bŒXW˜vþW÷]…Ê”äùˆ-ùC×+vÌc4{·<°;¶a¶ée¢…ê›Ì*¦éjãâ¾…’J€¾m¸X]0ðI¼½lÀ-\Ÿ0JcM|Z”ÐÐΘë’ä4ä&ä¸Ë/G‘3—"ž­6:åøâžèK¢î p”Q[MCÀí¿§:íZ7sç.œZ_(sU­ŠÖì3нÓéR6ªÛºPËÞÝrkÔ1dÈ骖$ˆß¦ùӂ̯)$øùä¥kÎØlHDLrÒÆ» ¶ë®Ë6ÚKâðýñaMóøÇÔ³[=mǧ²iNùM‡Åãàès&?|uD5â¿6|ôç¾}U]Ý‘S]É>±®¦síÒ”ÓÊ©;Û» Çwe{> endobj 978 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /ZNLINP+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) /FontFile 979 0 R >> endobj 2839 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj 2838 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj 976 0 obj << /Length1 1616 /Length2 25435 /Length3 532 /Length 26323 /Filter /FlateDecode >> stream xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶»lW—mÛúú}ïܹ³î̯ùæG®õœˆ8;vÄ>'Öz2“„@^‰FÀØÎÐDÔÎÖ‰†–ž ¢¨&o`mm`la'M£hgcøkf"!r01p²°³6p2ᨙ„MŒŒŒ(€½»ƒ…™¹€ü/õYþ ºÿ§çïNG 3[éßk;{[§¿ÿוLLNæ&S k€œ¼†„¬€\LV fbkâ`` w6´¶0H[™Ø:šPLíÖÿ±ÙÙ[üSš#í_,G€ÀÑÞÄÈâï67#û\Ô{ GÇ¿Ï G€™ƒ­Óß8Ù,l¬ÿ!ð×nj÷/!{»¿6}Áäí,ì³Ê ‹þO's§r;ZüuìLÿFÛ9ÿSÒ¿¾¿0½N¶Ž'7§ršŒ-í­ Üÿæþ fï`ñ/ gG [³ÿb@ p013p0¶6qtü óûŸîüW€ÿ¥z{{k÷wÛýõ?9X89šX›ÒB10þÍiäô7·™…-Ý?GEÂÖÔÀ@ÿvcgûÿô¹˜8üÛ òÎ Å_Æv¶ÖîcS(:Y;§¿)äÿw*Óþ¿ùÿÄÿOþ"ïÿ?qÿ»FÿË%þÿ{Ÿÿ;´¨³µµ¬É¿›ÿ9cÒ€†Œíÿm`caíþŠÿï‘j&ÿAòÿ#ádð·¶få §¥ÿ£…£¨…›‰±¼…“‘9ÀÔÀúoŸþµ«Ø›8X[ØšüÕóßVhèéÿ›OÙÜÂÈÊöŸÆ³ü‡ËÄÖø¿sÿ+Ñ¿ÌéääU¨þ÷™úoœü_í”ÝíÿRû¥ÈØÿÏÅ?(‚‚vnOVV #;Óß+ÇÈà`fòþ?düˆá¿Ö2Nn­¿eÓ3ü[üÿøü×Jç¿ÁˆØÙÿsZ”œ lÿ°ÿiøÇmäìàðW×ïüߢÿsýïQ71q31‚ZýcgÄd™–™îT‡ž;<)¬ÕßÇ2l_Ú¨\TàWc×ë›¶ÃQ©ÿQLÛ4ÍùÕî¾tfÿy Iy8Ú‡fMÖ›br•ãMDñ»q“´“ê0€N·6ý\-ÊózQzT“•^õpwRAQ·äwº“Éòú™ÂÈ¥À…øÉÎÇ(µ!µ ¡ ©®ðìœ4ñäù‰lpldx¨÷ì÷6UNìO.PXÒH¿_9Ø|š*"U­ªm{½Zl†>¢kŸ’rNXÁ™ÍÏË#¾#)W–cÜàã™þ_ û4Ã[õ½\Ö“ÚÜ )!³(¡7-æOªS+1mh5›xob7(ß1ncnÛ/Oúj,ØcVâ?4ïvrxü”NO«ùÙzG®^'>=ÔDUµ|ÞïŒRkXA boë ¹ÝÄ?F#Øé€zÝUd´•™U˜€€ë¾lÓèÅ`Ü”ñÜÖ–x½° 2ã 4wH^P „±?2Ö„õYÚγx,:œ,g'+@³ñVÁ¶ùÄç)€v(‰Þ‰žšmŽ6ÌØC áàUûZ­RR Ž_&½þ’ÞŸfx¯%Ê3® ôEþsÈC®” ô“‘Bå0²TU’?…šÜ¡ˆhÍÒVùòýåm»T úÃ8Z§ä‚Û°ý ³:I?Ôöz"6›Èbœ^%\‰Wl©à:Õ ·įkU*Bœ5÷³2[Q‚j`tgÔÑuÍšàvK0 µ"1Í5Ô.H_Ï,¸¹ú,•û.ûš5¡VI÷úäGª^’±¢ yá×h}×¹­Z  ypÓ‚u=jëé 3\xœa(74nŠïRýƒ&cx£aYKÜ¿‰~ػբÉI·XiêS¨“2ø ú›G²¨†lkÕ›$ñé³øI ñƒ<½*­;:̽¤PœT1]š«ÚowŽ0~,A¸ÕO˜Ó%/‡ìdccÅ÷‹k×{GKÌ‘›j™(+ÔBUÞD# ¡6ª:Mð%¿s¾†I¼;v #wïRUèB&%Ô øªÕ(cÊïZB™ª³/7í¿ '|8¾—}Z£6Ã*DLi´¯kâ'/rn¶èXÐ60µ!~Èaïގا*\Dxc(uè³?^NWù ±CVØñ Áá´ÅÚQ[´¬5üŠvȈ0Kïø^•vµÚ*V¦°cœ (p3“¸µMÖiÒ|#Óƒ}5ãByE¦Ç•yÖÌÞ¢º<^×<;>3ýXÎFM.ê8ÈÆœFß©þsÂ^Î tI¼\nk2NÓRÅ[>Ëooã© Æ,í`ë±19â–±Ú`©@W4·¾º¦á¢Õ>Í-‹Ã>ÑÔP…[\ÊùñÓÄS}™Å˜†`ãÃímš/øŒÇü]GæÜêƒ?å£,J/k¨Ýï´ÛÞæÀá’z„¡¹uMv–ԌΡ» :0jÚê­¬°ŽCgþ!ñ!YBRÕ¿i†D¯@!µrC!,ç´¦Üoieq$wj¤q•M4räMÈ©X¢Z_ì¹Îãi¨ä/JF y Ètp(¬2îZ‘Ç¢Ùð‚:–ÃOxäb=ê:äH@,bŽ“t!ÅãKMdþöÑ•`£ªj•*ЪC[L+x¯Ù}£C”‚ÿ€!‘Éã|†ëuî—ÔU’ÔézÔerðˆá Ã\·ÍZ åjWqFW [ï•~s­É"Ëšã±ÄÜ]£Vf;ŸTiËá®Ë)Mîr“p¦ì*žx×çRiH¯Ñ)Ç€(gÕrÎ÷G²/܇ç»l—W>aÏB·8zÉCö +SŸÒð¾ÿVVí ý1*YØe"KàP½µyüˆ»4¨ù:ad8åË>)4 ü.~æ„#×ݤãŒo*ðY­oRhŠRâÇ^Iréç­«ˆeö¤8ó'\,|Èìk8‰–6óì }ü¾¤ùj‹ÏL>а²‡ÌgñšÐ¬þ¤–\0é b¦¿bh¡!­{âaÀbOé¦Üàõéhiä¸á X z‚G)gàcúl¶É©ðÝu½^QC˜ûèÕi]s]°?Å"*Âü$fOv‘¢ö¬ì› T!ŠåPXÙÖМ³P•Õ¸« "è ƒ7käþkÂ[ŸŠÐâÓn¥% „¸rñƒ‹3!ö†¿wqŠ+÷-×}ñ¨C}3X¶[G\v¿Vl=Šþ~ƒìBjÅžµ@L wº Œèf‚ý.ÓÐr›'<Òü¶Ž¿Âfæ4ùJ äŸt^ gÃÓŒr;‘s ¦ŸVhŒ@€'ǽêdòÉ,·œÇÝRSJÿkþNF¶å€ƒ²ÂLŒ{ÛY-k^zB$ëeì/ff‡äícA3RNÔïÜ¿iV,{1£Ñ5-æÃuÝÙ³¾î»®™Û:ºÉ›í%n`pD8©L°aìkK+$ù;½Gµ.gZ}1J9ŒGZ1 ˆGR—xµœT‹U—y±ZmaiIç÷:ž3œ˜û,“ãfbpñ¤–ê<Þ¥˜Â„ús´K–ð²}²ÂÏ·ÅU5^åR d ¾KÐLTj¥:Õ5Ç ¡3ϳTaþZβˆç“d«×Vp6(áË~€ù2‘±<½d=ʬG÷Á #œåúú#&Ž¢² ‡^å¬ßÌ lô³î@p® ’Œ”JEcžì e‰;LÙƒ*#.P8Ý^NrÁO®w¢êåÃPäåú‡ªî©¯HÏùñâÊ›%ƒÓÆ{¤Û«Â¹}‹÷þta2XÑ`Ȱ½W(Pl®ôt‹8áníÝ1¯v«Ÿ<ñ¾Í4­åF¦˜4d¤Dr´4J„)Ÿùë¸L²µ% ç?·ëÚUA§tkݱxèL ë…3kà N,ˆÛ3«QÉĸǹ‰–B´‚7’ûÄL³_ËgƒÕ ñŽ1Ü ˜šæ}›Û}}<‘3°2èRÍp´$ðʧFu(#6AìFÏÊ2/ÕÐ:C Ífg4ÎS" >ˆö—H¨äµ>8h¡Š¡3lÒ {%ྼ¿#‡«BÈ,>‚^@Ò¬Ç0nÓCížU½šÂZ ^u»éên®p% À#d_Ðby¾ÅéZDzl€÷„R%ìS¢Ù+L}êPS«‰$1Ád8Ç2cæÃJœ¸Lx™ Ь3µ”êR'1ãøj”õz×>‰Lþ(²¬’|ê0aÑ“F±ŸÓ@=›ù~Ï¿úê|ô¿æe•|¶ÌaÅ%`n2ꎥ›÷£(Y°+ϼ<š5ºiÒª­¾^ƒß*ñ™ÉšÔ]e©¼FµïkÇÝÃtE‡Á,¬°J^óÅ4»þvŠêk€½{çGiþ;¦ÁdkGÜ>Àòß è¡€)GÑu—R &¶©‰½õøtêœ^ÞÔÜøì-ÑÔü “Ý^‹¤dD(g„6µÕ¬kbŒ¡¨Gšƒ&%‰Å¤`æL²Ìµáöè7˜ƒ“6‚Ã[ä¦ôžÊs^sdï ©DhdÑn«_ÉBH¤EÙ®sñ®+ ø—I›&ÃX9!«<O |è¥5©ÓÑ ÕMêÔž5…ÅÉmW¶Ä!ßCXéží´*m¤ÈjÏCB€5BŒÏ)Õ‡d"ZÕጼ B^moJ ¡ì‘×Y±øRAD%HX—«Èë·ÀÇ*ÆÚ0Úýé –ì?9Ö–]©e¢ßÄŒB<ÙÁ„CdÀ‹l•z GzX°ö0F!ëþ½{¬‡VH•ZÄ2[t”€pS³õ.aQ[í)©u3Ñ /üI*Ô•ª"ù(T€}vÄ8™xfüzY X¥û™w·$]-aÁ¥æ»ãBó!xCšœÍþe‰7Ä…`¯n‹³¹êûÅÛ §ÔrDš‡ê_ƒç8ÉÈ˳f^‘±Ðò飯K$xþdC#‹C7‹Úˆì´½‡hâžrvôîešxÐÖðà˵ˆ$Ôï­JÄ›'¯ë¡¦¯Cy2äÀªŸå‚¡ŠÆZd1”ûÎçÐ"ÁØSX}j3r>“¢0¥\Ò;QõԾɇ¥-§ ¶ŠX©Ýo‹ LëèR×R$A[sã¦ø—òÂ`®/lÜ#ùhŸÁœŽq½Ä 'õzkü™]sÑ ÜÞ¬(Q¹Íþ©iv`cöù¸-Óz X_ÑZzVm÷ïȆ·ÐQfúq¯<–^È¥Òî\èƒçB©.ô lräê‰åÓÊgj´øod‘ƒ|¤ˆ¡Ð \yh´v‚öµ:ãY_¶”œJË”(Øž#¼&bd·‡¥”<Xd”¾×!}ÔÃúŒT†‰ÀR‘‡òÕ­¥×Ý“ÐÄJxÝ­&Æõ…/¾uQ~4NŸ­]º›?•‹=gæ8ã +ßçœ;…!à< >î]&“ŸYdŠÃ/"Á&ZïY±Åº,nGÔ®Gz§õk+ñ¥\£>k•ᄞjß6Ù6–Ô8tµÄO§&¢„œ´bú‰|uTè@ ê^[Û5œ¼N¿C'¾ŠŒ |€[ƒ ‹.æ†×KÍkÈÛS›«‹LRPÓ9›þ•ªëŒ<‹j»F^×°–ä¼ BNËZLè¦íSxëÆ3Hã€Â\oA;}ˆ2+õâVœ2ÍH á}I\’c‚H0¾+ÞúÜÈ| ‡™r@ŸZo_ß±¼AÚ êú<V{VIÚÝLná_ïÞ‡¾’õ™”÷Õ.µÀ…gV+Ĭ²jw5# óBÂ:2s²uá§(•ÈaŽÌ9:¯Ü·2tƒ³DKÖ<ôG¡Âç龡31•ÝÊt#íg\ .˜íu6îi²ÙJŽÈoµïxöZ×× _s ZËòh°V5¼}r¯ÙÑþ3DXÿ8Ëé6æQàÊ)’v÷ØÜkxÞÝé÷)Jæ¿ßd%ÌAm=ÇÂ(#Õ KY8ý_ u1`ÑΑI¬ÎP¨@àÜžÇ?M}®‰# ¯‘½Ð‘˜W–íg wÃ!hºÊ¢ßµÝf‚]\@˜¶Lyìodªš¹øw‡“>B«Õ·¼Ë¿/K€µUræÈŸ¾UI±íº«à ߖϰêEˤúÍv°Aõ="™‚—7YðÞúÒmÒ–ŠƒïÙ{óEƒ1°0[=Z>Â|¸ªÞ¬O ‰Î§uw¸OL¾+‚Æ…‰ÝmdYÎH޶d6)îf¹³|õiÃ?Rëv&?¿;5âf³¸ÃcÃ+©@¨¢®Á¢zª?%ÉȾª ¿—0;¿ÀstÀZÕù{Ëõ½l5¤1.q~<ú£Ö8Ï–í£ŸËækì*„ç^ï¶ŽÊ# uæ g…ß·.:ÿaâ5’Ö‹AZiD+¦ßuFƉ }¶û½é2™¸ (ùp~·ª³x¢ :’3 ¶¾/e…)ÁÌ ¼äÇRi¯z>ïuÙ1VÏм ÿ¬&‘ 3ŸL.~Y _²©Ð‹âOàvH"r§¦$ µém½‹bS™ Ê´íðà4Ò§ÏUGB]¾\,k¶Q¥b=RÊ@¥=Ã~51.=!ê´ùFß l ‚&mò·³Ûïð¢Ì2ùzAS’VŽÃJŸ|)Ï!ã¡=ÜHŸwÃØ4*ö‚õ¶ê¹¦pT™ÖÔöä&º,Ä‘ciQª ôyi´zoj/»«"fuCR×óÁ¨A€$c÷¾E׽݂“Ù²)Ò››òUóAJ7JC“ðÐIïäZºÚÿúzëñX:ܪÑÖÕùK”ìÆ_•RÆŽå¼Ù!òTçžÃÙZszäXŽï€mLu ÑiÙ&ŸÈCŽÏ È4¤ -ÿ^{°Ù¤‡tÛEþÇbQwÈ—ô,G§8ÑÄ^û® Çðª4î‡c‰¹ j%cx ËŠž+qšér ´Ê/W?KìŸ%¼Nt ¾:c¯ì bóÜw² º'7$c²ÐˆÐ!•ÎݧC½¬ç$Ê?bï¨þìl"OâŽK±¾'˜w bx—‰Üêüj¹£O@ÿÙ,s[»6ýªícávÑY¹hd_æ“,VŒ œb¨ ‰ð#"^ÆÃg¶µ¸!ÿÉ#i/“ªñd—ÁÐRD4ìŒ-%…·#àrþvf"I(&!QƒÑCG¨swEe`Ff÷Ëڌ札RC†×Ëîï+ZsÃãØHz–Xf--¦¼…”N)±;±shs{£•aVXAת]¾b9ï"Áúpœä•Ôm90$j®„ÎxLYxCÀ8ÏB¿Ãí¼ìùìéÒeEá…i˜U ê#‘ÕA¤’¯ÍŒ’a «Ç­´©¾T#$5? éŸè¯¡³präZè<§ ÑM{å«¡x¦¯¡É! ‚)±6¿Up‚Ó¼ÌÑÜŒ0+ü9r×óÕ>ÞYãÃô d3–Ò_`gbת}û rÂWf¯(¾ Ê.T³ûœ$rG~‡ÌR)G…-ú²O2£l?ÂBüX CÇäd"iXćÎà÷ÈÏ:ŽçEN?’OÁL¦5ÍÔ ©é9÷°Ó?—~P5Â+ ¼þÒ† yÕôÔ#ß3-­Ò.\¶´ù¥„• çÄŽV¿°:‰ŸÏj¥×ÎÛ|M¿Ÿ®'Š©iÕἠ;‡¹‹*ƒúŠðºG­o´×ã®æ¬Ñ@z-Ã=é÷îÛƒîø»^]bÄËŠ¬N -IýJ€°ÀjDM;©ËœU×ô™Ã|ÁÊȳ5à ¶!yJ6Ü#½ºø5ÒÇ-u ´–Otÿ‹Ê‡ßk§]Ã3¤¬„0¥`áÊ“êí~©/^Cë÷•µp­Éü7scË Oó‹¿£hˆ-Þ€îi î¸[jÄ'Õƒ´§!¶—7žÝÔY¿EΜީÊËi`µêm£¢>TÓñ1Z`NŸ‡ ¤'ü±i“’Jbÿ€‰9XêÊÚ—µp,½ÓW¥ÂÔr×!KšÂÎèü`‡ž„Õà@l®/­Øúæ.z”ÈÙä+ö<7›ƒ\i0zlý£b©UÐ{S›|€h•Yƒ‘æ>…mL0 ‹¾¾„,qÊdnï#çK{êºýÂI_r(®¬µ׉Òõv/ˆÏñó÷†ÙÈBDßÑÑ#…iâ·d‡W¸ˆ½÷šЛ­ðƒ‹_¥¿". (ø§ãÙ¤'§I?DØD (F¸Úù–|‘³e¾Q6 j1‰jß$¢Âü®ºÛSRßÈ’+6\޹FÝ‘ZüýuMb±*eR^ÞZWjSC¹0r”2â’]òÃ5|ô¹Ñ^òI€Õ+`ô«†‹ÐtúIÚÙô©Úòó¬ƒ î ä¶Ôñ{uÚ¸M¯ýœîdßËæ6Ú´Qµœ ‹¬)Ì Ÿž6Ö=jÆdÝ;í¡Ô¶„µ¼n*_>;y<"¸ü,߸藵’ðð’d ËD¨Q TÇëÌÙêÏÜÍåïØ`.ø|Mõ­ºí$õ´ÃÉ*šö7 ´¢Z•—C^“úkVa=žBž«ÃUõu‹VQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]«®[¿o:}ºûg<$ÈVX„~\î@uOG®1uçæM ‰0). UòòÉÈhW' Vws˜‡×ˆ¢ƒ•\ =;3؇ZÑm{§fÇu1{©‚q®‹é%Ñ)(Û+Ë*jóºpd±NáNK¶›áóú E‹´Ø*ë_ªŒ®NvL¢Q°-ëlr±ô¦‡³ý4Ý!aA…ÚxYGmfBv_C…³ØÞbšÅ³”ÖšÐÐ ¢œñ £‘I½… M©:l/ ?Xå›èSîvåžÉ›åÎÁñiM„ED“¬Êòòn[»yÙ §” •Ýõ§âCå5úú©:‰È•5æ—€pªð)-Æw‹ú^RÕõ` ÎWLÛQÁݰN’ G¶R¦ZIí¤s$ÍîÛî…‹Š¯r¡šn¡CÚÍä¥ÛŠÌÞÉç…Ûiçtd9,kQÏŽùpMî8Åx¢Ew=sõóŒ«ÓjÀ˜#ˆÛ•¾€áꌳE–o!)»)öÒoõoÊQQù,bR¬÷„Sö«NÁ\S_+Ç‚øÚ¾‡Üzh(èˆÃA¦ó_Ûð¡v/Û¤¼øAÇJ ½dcb4Çåøñ¾ó?Ä 9èùD‘Q™q…@Y;Ñv/£™YQ‹|§Ò²—(¶º×.…çb˜r&âßå…k?UŒãþýjŠÍO&ÃŽ)~«t‚t±è„©@ŸíÓ.*­NÊ}Ü2ö¡xyB‰W!Jªõ%*x|ê~¢É–\Ä»èÇ„2ýâ±¼3 ËxèÆgòSt”HbŽ;³öªY^DVdf¢kèï¹Ï{’¯íýåyˆwœ›:¨º&šI;cǵø° Â÷œó(—ÂR ™1ü˜|Þ_"UZ¤l€¹y%NOHnEVïpéþÞkfôüÔ•h£“ߘ:nâÓL-eéYi^»ô~¿„NãÙ§äFV†»"Šá=Ô%61‚*?ÕQ,SN4¶öJÂÊøè6cøò䀀à‹+挿zóN{…hi„'È~Í+›2‡ÿÛn4¾›åç™Ḭ̂u[ñú8´^Ó‘u—‘gV4=S ç,® à>‚™uhXáB(ÚòÖðKgó ­¯úä´†Ý}Ji:~U~¢˜ž¶qé\Êf§NyñHï]#Åû˜½ÐÄÅ,sx®ðäCð3шx×y{Ÿþ:l~"û8àÖÅÂÛ«ù%ól÷¨tf')hÌØ3аc ÿÔЩÒòIÞõש£1„Ò`he>ÓÖF]к÷'ÆWºPBä’½sÒ+5ñßÚ§xOÆ«à‚ž£.Ht3<Àú©*m(ó¯­K´Ÿe`erł食~ Òb‰ò—vüÉÍ6£ZC°QÎí÷±èû¡öJ]7 ëÂ0lD26 ²íº†‡…òüäò8‰D—UµR}c›ŒÑG$Æ«Z+E<|»»ÅX·ävT —tò²ù¯T2)ë´z›O,:]3ÏÖø1Uœ‰˜Ct<¬:8.J†¶Cæ^ ENc­wî ¬ O-¾”+ÉagÙ€ÆAÇ>Ú/ŽÏ×Ë_‹¨i*ˆ{ºº„˼WÐPºb껾ÏÈXÌP@d˜‹ïU%¥:©a:ƒÚ’¥Þ³4IDÁ­•ß%_…=!ȘÎa\*ß¼¼ê<»áae)£éŒð"0£míÉ­¦€ |°Uá„6ÁâPx0-öQ“ŠCÜ4Œdx^Ždh:)³]4Û',P Åoè­noƒ=ë줾mz{ôÆÃ¸Ãi?ê—á4ô!ö åðA5±÷ÙîÏçì} %Õ EJž;l¶¸Ûü ³]AQ°ë±€2 ½'T/]y{ˆs”és†îæëqÀÇ$Ië¾í(Ò̯³’”šeÞ¼é4nGGq·¸Ä0uZí‰b óÑ£€‡« ²``ƒ¿ísœ l·ÎF)peÍÑôpÅzFÝO•Œ~3SºË?¨àÉ>î#À€B8 p’Ù)À`¤cLå?Æë'DÒk±G*7,}LðüDÉSXV¿;Â)‡É*{õ\Úz5pÇ-Jêè Íî»KDO²‘×oyAƒ5ȃèòö6w  Q¼RxÜ^ÏGçÊÕÛ·Ì9Ö=øÕ!ކ˶±€ü©¦âù)X“`I:qSŒÄ¸Œ)>]K!@ÌYqQ Á‰¸âÇQÔUw¹jKNFÀ-§W<¬<èÔÜu·¦BEjêü--Ï¢V[š©ÀÉþ­±Âõå$@V×)Í÷qEAâ–žƒùñðM±È³/øã.>cS5ûÚvñîJÜ«5À­½|+­ÝÌ…k%SbºÁŒT„-Õ©ÏJ|õO†AykÑ\ÅgHöÊŸQçfß$àϹ‹-ß ß&Îiý'g…ÙÂë§Ð>Aïz?¶ã¶¢;)Yw¼¨®Ðõx.ˆöø:¾‘À‹Œ‘rmHÆËÈN(þ4ašUk×Ïb>‰º–¢$藍´Ùy°B’µWÊ{P¿núÇLZNI‹ÿÕLT_áŠI•%¼ß†Ë‡ü¯6d¶PY¹£;È,DúïÜ¥ýj´ «²NÑ÷›ËÑkýlµÅë/ráB•G‡Öɰ”ejôÒœ@ŽÙ>Ã…ÝØhªîB=2»% <òÚU¡~^d‰ñÓɰ´eÖòóh –PB­åÃ=¿ò‹BDêôðÉ\Ÿ³Öy LJq ¼X*`Ú6wY=Ò*PØC2À×ç»á0ñÓ òDG^d£~‚ÈâÌÝMÕ·ù–½épíEàÐÄÑ)KßÛÊÃxFnØ·Û¢ÕÜagKd;lzm£’•âÐr~­†gš‚‰iêËU#T¹µo%™Ð›y’øÍâö\8ÉJv+¡k_g¿üÙÚ-V›j1õ•¯¦¼uT~fåšË’4|¤W[‘s4`²¡`«Ç/ÿNQÔÜЋ¶eURè/-,îë‡h-,@$Î>¡óüsxÅÕeë¿ú ‘Š<ò–÷‰DGyPß ûîÝóüø¦Ø|t”Ž&ÍR}m†6à6NŸŠsu!!À\Õw‡ë EÉ€Ó“{þ«dÏSíÍ"¹l¥GrwÖ?E4žæ"[SUGYþæÜ øZŠ.V«‡§G¯Kb)¤ž†¤Œ,]1ccQ­ÎO2œ…á´ÒåÇh‚ TÓ÷ã φ»™¼u‹gÂö<†¤|d±‚Z5Úd¥ÇøG?fIiÿÑPU=Ý Ì­}¢à“RIêM¼•e½¨pl,¤3*ÄT·þÑ)0v’ôz‹ïü1Š4jH¤†¼a\P™ï&?§’©7¨— Þ=á”7?îÖ ñËu.›ÄZ=•“ز‹,-~ ‡JÐÚôr&ëm û\Zæâo®ð¼‹I^†ÀÐùío¤Ll‡ ¥TeæN"‘ˆc{Oп ›Xñjÿd'ÚŽ“La.Ï4ag•¦¬5ÎÁ ^|eV ó8BгMðöŽ5·krÌ¡¦É‰†Î*óî˜E”•ÎŔІð®8𱊭C‘ ÁSjÜNŒ1I2ÿñó¡& ‘Oäs³=xVWG8 sÛ‡æk=¡ük‰Œ{>Îi…ÊÌ¢%‚Å{M6C(E,w6¡ÂÌTþŠföW§u7»¹Äb(á5œ!þ¬Ÿ±wœŠËóÕ³Îàö#4ky[8†ªÇ‚nÔ{ÖBzQå ù·=CÇzñ+AÇÍ¥ÛJnÝÄ©‘tÕ¨¦Ú²55G¡%2¶êFÑœuÐa÷3š¾€m”Rj2²®h,ÖÚ/Æ+7*°¦â©\X*ñ|ÑÎNDP~D­õ¦×G¢2ìˆôB«ÜÒŠLëë¼èŒ!$ï™ïS¢pKÈ8K2o ïÚf'ƒýÙoÚÛ±Qñ<\¼‹Á(’_æC×㨄ÆþøEþw‘½"[”Xq¬ða¯fÙ`Ë7P • ×»ge‘œ—óL2±[Ú–rЛç¾l‚¾ÄP# 3ÿJÌs*Ýð“2Ÿø%—éîIjCk;×9óMO8÷=†Ñr€ç\F›x¡ÅáÕƒø&3Üà¥l¬Qäù u~¯I¹c¾Só„vûkVµ­bœÑtU(%9ÜZe¹d5PÅ/$9ö…ÃÝ»IÁ¼üþë©­×Ì3WäTz§pÝí¤çÄê&ÓYM~1¯èš2õºnÅfµ—޳QfO­ö‡4îKïËkY.&꯳yÿˆÃct:ÚiþYƒ½Ö@0.¼Ø›å¸Ì`ã:S5ãFRaKl;:VBJís¹³¬o*ms@UÒ¥ÂÙሼ3¥U ˆìôrÙЙêÃ"_¦íBpwBFæoû9õ†®&âו‚”ôQ·QR/ÛÛ5!ÓÎ .“Ÿ²l8mdÇÄ×ÕB„¾É•‰ ¿eI¹Q!b'ìž´ô§W)±„LŽå•ºgÏ‘„™°w‘£ : 3¡= ϧ‘¥QTŠú¾šèÍzÅ„(¿¡gÎ"ßl®3‡ ”‡îoÞƒ+Z¦oáöà4Ę=tÉK-Æ4ä|~üaPX/D&_õÅ;*¡ÿªð!„ i,ö,–xou*Œ…Â0c*SäH˜èµù¼ŒÜ’µÙ:üØr9Њ6p(ŒˆÿÔLGEË?9Ø6E¦ø Cø6ÜìzU ‰ÉJo½TÓ xõ3ÇÂæ´Yæ ¹ZK®ºµdy—ªÀWÄ ÷—Jbæ°W‡Õ$“¤)!`'<ü¡a¾ó=¤#Û·jõ嘕Wqo˜ý–)_¬HÅ3ÔAIW²~{ŽÑÇî/‹&Ëß]wÞÎZƒòO°^åûµÁHñë)¯­ÿ z¤ÙÖ¶5.7N`‹O:KõhìÙœ=ºû1¯å'ˆ¨d[àÀ®¦ží¡¥gío²wG³Í\û¢922 ñŸzK}·Øp$ÖÈ,b—›rd)^ÔYW† ×1š Ëœ¦6p-eÑù[n$„:J°¨&bSEa‡H—‚ÑW¾öqŽ11ÀcyÇK#m)!Æm±¾59õU$}À[çÓƒç¸×‚%÷‚~H®‹>¬¬ß5LzcxíEk“ˆ¹ú¼Ñs:A²óp6¹önÁ¥+²àP õÉA¡‚éÛôÄ”,,¨Íb6ôʘŽUÀ%"ðÔ”ç~qf?2ÎÆ‰RW‹êKС:¯¼(Pò~£¿˜ e*²»ž¬hq»¯ù‘1'¡Û~PŸÓìªLqŒÙ*£0ìÔϺ Ÿ`tÞYïwý.Ã×›Ù/ˆ' xû:ï+#™:ãàiÝAÏDÛq´˜&¥´‰ÊbbÔǘ•vÄUòMj^³i5s×B1¯]IO]Îé£o>¤ˆâØN§ÅfÁ+žK|ŠV÷Ø0µ¢ÚÉ„šU®=ÙOBб^#±ðWœsé¤ >*¸ÂCÄÖ«ö#ëÂJ¦2öǶߦ¯×!GÏñ_>pfR o"awo`¡áÒ½ˆ5dX³¶£q—˜þtÏ–!´¤”µ†¤zØddœ“hYκ®F)ØôkIáæ:YõäcT…›<–E\+Ïév+²'é‘Ö"~M«éËî~»On7" .ˆß‰¥ë…EÞµðô»w DeIBZ0P ¶Kí¾ª¹Ð7hĪy ÛÁ@^“H·vîâó1ôצs²5?ns÷ü*<À´eºbME„NÇúDš`¡æWÃ@V©h£ÿÃ8´¡ ”v}‰¤ìcJVÐ}e!¥´ï »QV=´›|8Ñ»äëTË+E¾+,»0–¸µ'su\~Ña&©ß”œo»Uÿ *··_߃i‹›Âæ‚~ìT™¡#e¤ïº¹·7\XWqwƒsÚái—[~‹D¬î¶- r…9G„-ùWc]ÇgP-UŒ*L£ºtÃæ»z³$ZU>3níñXÁHw¡šó ‰NúÍ¡®bºZÔ…­Ù“ëPkY¬~J†‹Ô€ œsF#ÅÁ¬“Lÿýµù–†`´OÝe‰®ã3X8¨ E¸m4* aÀ-&N(»ŸóšÌQ·i¿&­;Ðkè.í ò$7c ¢öázh˜O¥ó 8Ýúæj¡Ã‹‘/%j±A³Àóë™c5$ Óür’ o|*…i(²^j”-°ó!"÷ñ,°ž'Ôqˆ¤âùŤCU#‰†y0-Hr\'¾Ñè5‡¤%O_JíS<^ÖácP°ZþZ5‚Ò¶m…ú[éîI’àÙ0ÃQùÎÇhpð§Ò•>þ‰­žuê]O‰´öd­ã)/P2‚©:Îçùþ– b ¶9G\ ÷Ù¸8 ÙcCܱ2ò~$GÄ"¸1ó ×?Õƒä“~VYP¤øv`3UQ¿þftI›¼gl6yë_Æ[øHWõ[0°—j†BƒLgxN†N¼°8wtãr&ð$Òá“÷ûÄ;gU¹®YG¤"È„´ç>Žg_X©øQ˜4»¦‰=|dÚçüü)Õû6MG§;#Q~lØ ,IŒ¿&˜^ý¾"Ï ¦¢Øqr,Íß®Ê>î&x콋Ád@ÜhìÒZtES·Úå«\¹ž@mú½§!ÂuëäŠVE–Fw¶á=¿ÆæÖ!(*p5®,Á©ªÛ(î²7á]·}ø Ø#¹Fý_ßµ©Àóן®T"1'¦è·ßÄÂF}k#I«î 5\]lßQ|––~rÀ¥RÅ;¿$cHp‹ëʳƿ4(b£R\uÖ¾íØ×¿Å`T¦alqñ¿è•6 ߬ Ê®£JñŸ9W¤3}Z–íP JBÛo8X~t©Ÿõ¬Ä6ñŠB¶ eî$Âjp¥dJºlw Äì³j…P*GŸfºI«B0îù¡°~’Á›«'H–!kÇàëJП¬YYã¹³æÖ‡^SmÙ \õÓ® ¼¤®ìâÖ±hßÕ%µ5i»+Yç²úŒqk«ôáï$‰nµ‡Ôf(~±ÕØDÉŒE)Ð_hÛ¹†‰'¦óp;ØæaÀ8¼~´P¯P(n[)Yãb“¦’jŸH§·Þ?€Ëø%ƒ.Ÿ(Ú”dh±ºOÈ’yý<ªØ›aàTR±i¹˜)G[o«K,c7·M ±Ç¦$!»K ºŽÔ`¦H°€âyßÑËåtBµçÃ\k1(‚ÔéڢáoÅô¤’•#e »@ ਉäeF€ÜŽ€h'2hÔS#ÚÏ*ÊçŒ.×’_XÏe˜à~ÇR†5¡X?ÿ\Ôü¹ˆ0]бà/|Wõíé‘,‡þ­§ŸÍÔ‡ì©ÝžŽ˜Ý«žÖO››J¯7rÀÙõóšiÊÒ…–§ß½„bçk¦Wu(CÄ AÕ‰&ä„ cÖ),§‰/½ôŽÝMºŠõ»ªH¡À"¿â8˜åšçLêÖ9ŽXÇÔ•kQw£íC3dÚW +"YЇ|ã^4,}3ø»Ëö:-z)}¯Tmk—5— Ù‚Î@…x*m¤·*ˆKßÉi.%íîŸ[Jà¬*×»J“Öî±gÐ]X™Ÿô¿(ú„•²ÏÕ*xz^̰ªäx¥#}!*ϰkšc¿fº/&…‹·ø÷A#«ƒj26”cÏLw;Ë©îdËɃØúääöh=¾=ûjK6H‰QQ¨íŽA«¿¯*Æ%§Áuãô¥h½²›5Zãìâ$ ~‹õDrá™õß]»l.f> «ËåÉÄ‚—DK&«ž ¹oà÷ø§}!)ucŒM€£”Ú#&<S—JÊîáÂb&:g#ŒÍ¼á‘¥mâ›2÷–<¶ Ü5Ç+Iö*|Îü®’UZ­p_%6opõÉ_IO7;”Cô@¢™”人D@2¡B'…õ,0™ânN-ÖkƒS[7p,sÍ >­ëÝ]àÚt¶Ÿ¾ÿòM5nڛē ìhT?]ÙÅ+e@Ch@JH$ êÏ&>2ýã°£­ YúDXQÕ¾ŠÈ‰Õ ŠÃÒâ¦Æ\x+¿`2eÉ µ^´ôB|iCEÊ·\=Ùü*7CRLžÜt›x,3¶J%A ~†Ó`®*w‡Zý.¨#WÈáˆêS‹“É*&ÖLL~'Ñ;¶M'&% ê"×[*moº¿ôH^ú‚ nM6)•U«¬¢WVg§Ä&x Kí{Ç¿]zÉ ¹º˜X£fÜ<#}ôÞœl:\ ö%\á·Ñ–ÔõWYŠd÷ŒÂ[‹¡Þ äº\œÚ9IxúIÞpÌšäµBÔ:¶—³ìôxÅÚQn¸ÌÄ/„œõÞwŠëÂ\Ó ùÐÈ/ç:køTqjNÅë“j…㜸\—³†g›d8¤¤ŽšÚ’ãLZ¾Ã¸]âì´¶Ï T&¬ï66ªÌ½*|¥0w« vî&‹®l5fÙšEÉÿô̹ñ$\wñ£O*9ÑÔÅþ–œÓ'¤ŽY…gðP±°Ñ‘*3•ˆ~ª Mpœ(i¹p—ÂMœ;Uk>$×,>c§ˆa&¼(öBŽ“,Ÿe£Ü ýG±ýN;ã8ñsø¨ï牑1 \°Q“âæZbgxÁqÚŸ¦)1â­Ûw!hK{…Ñh­¯\¾ò–§¢,ˆOÀ°h|ÎÞØéjn‰‘£#ÍúÅ4|ÑÓ²qÔÑÁ¹õ1³Gï¶&dðb<àËVOÇW­R‰<­¦*›¸!ôøP_1[,±Œv÷~Î оrŠ€¹³¶fúÎÒ6Ð…i„ €ƒC#ÂuÃè÷Ê­¢‘i˜=ÒL\™¼æÕÙ¢'¯Æ’•Â835PòîL±ÇSÌÍQýí–Ór& €cÛ¶9±&¶mÛ¶mÛ¶&úbÛ¶mÛÉþï°w[ÛÐ7]§ê´sÐç eˆ%Ó29§b²øÇ¦+îäò3ÎøÅ/åÚ¬¿ÛŒS¾\æDéH¶ÎÇhyvÿ9ž^¹þS”s9õsꔜ\ÊP[ ãÇcƺîÄJ¡Cr‰ŠÂéå»N,à] 5ý…–øþ$Þ8†$ŠøìœˆOݨ<˜c½åÙ~JÊÊ9¥÷ÍhçS€iÅÝbd%÷:ãÈd`‘KêÞÙßdžs%¬àÏnLdèŒ÷Òv7© ý¿'¾-ØGŸs¶Ö¶ 48§4î²Gá0>¾Wlx{O..ʼn6mD¸—ÚµQ¤]ä]Ž.†Ø0k–:3ê‘M}úf¸âH]*Ñ|ïâ |@…Òï‡H ™ÂÖ„ Æ;¾晜åâÈÑ¥¹Ìx0»°WäîÎ{Þ~ ƒÐ ñ2×"ËOÿi"4§^¦"ˆËoå<ð­áÏ'¸ä[ÓÄõ* wX¼ê `؆ ÅuŒÕ×´$¦0o±ƒ¢ã ÿnlkÄ=³÷0ú@TÓ~"Ó,àçÜñOÞ\à}ü½ mxTÀÈ ²?+Ÿðwíxª¬ò“ÞcÄ1¨+EâyT;°O ”¼´„Ì•4YHU†Ûî: À’´6c§ŸL<ôwÐvbif”” èAÆ1`Ï”yþ–b“àÂ…–WƒÌà.šžîý˜ìãObéFv©rüh€ÕÌ} §¾ FUStŽüõ¥¶£ŽÆÝAï¥i’h Õj=úè@ÂÅðÂÅþ°•¼Sá"ŸÎîÓb¸®"úáÀT°îJƒôúïë&n‹™Ë‚'ÊøOIµé„o„œrÃîä8й+óu¯é¬¦ÎuܬȔ  AˆÄÒŒS€w¢3"cöèF‘þH™ÿU¬þ›€ªb;6ý@>œãžÊß7)Sz'Ìä­Cs"Oõ«—$Ö‡Xž|ê#ϳ݀¸®3Éþ¸x0±Ý¾Æ@ÁJ&íæ×jJ¨µjÃ[ä-ÙL˜N`žFšxóMCÜÞ ›³R_Óf·âéÛßVç v¡>  $àdã<#OG1Û¢F7û™m@`ƒ“rº”®½C><ªˆF[·ŽI<.f$#Ðüõ‰F¼ úóÓZ—zð}‚4JÚ‡©‚­oI†yjø[xWûêJ¢rédªM.£ é¤+ÿÖÁHc4àÎ’» KA(‰ÔÎH$ƆÑåϨÓ})mŒ=TmñyDÊö7©ÏîEx×$޾—6êñUÙªû®'.•ÁÛ|uKuË 5y¢¼qžYàΈf'«|~ÁÅ Þ°Mœ6Qï¥ùTú‹­K¸«ÿ*èžø’ªq7ØØ]—It§$&p`Iç©Å2‰õ؃jÏÕ›“ªÝ;$ù‰’wÜ®\#諸,©ÝAÕuÍ–[ˆÃÚy”a‰@ÔðkÓq l‹ã„ªiÊÈ´8üø11—z]S”y.Ó‰ޡ䙒KS¡ÖÃŽª]ˆÓþR \L_A8D[8ÔWIµú.€Xm:;a1i”D¡rœ9?ÃÍÇy¿DcŒµüHËûEíN `«Ä0«gP²x_—t¤‹ò`$“4™É¿¶ìÏB–Ïñ—½ ÈO [±€%~@ó{Pæ>5&m7 B7,•"~³È7 °í¡èë<]€Ö»ôZzËËæê¬¼.“ú²ûcñkèw29…É!®C³h‚øouÓTI֧͆g%72bæ•2æ+š>J\¶¨"f#ô!}“me1ë5Ä-t’d 8Ë(Ä^ìmn-ÊläŽíw­5q1U>f\}±ã±-ý°+òÛ"@vÉ2TÆ«¹¥ ìÎ[ ¶ ÿøVfÄX#Û;Á7å‰ SCsìtLÑp|† _VçuÞEª¡ôx7?Ž ëDäMvŽCÛp—àŒCˆ~xeÇè ñ„E ©Vš‡Ûé¥ÀÜpŒc1C xnÏÛppÔnÆÀŒ:ݨ¬}tS4ÎÕº´ÐûKÜ^ÅÝbh6˜,•áNfÊm×A˜ªŠ ·×é¶ ™‚mƒpÞÄÄ%å˜swÃÕö) 5n V¨~vu²H§xæùpðms¹¿ÃÁ’£;>^tùù—FVN_í!–tïYš° ù\ ü¹— h;°?;{í.+¢ö-ße×½´a…úL[{«-F°fWþ2'ùCQ”Ø5áV:áþ¶î†¥ý÷EXî8/ æˆÂØ™8Qo5ð~…zˆ. s¦H¯vÝSââyó’Ì’ÒÄÅØÞ60ÜtfíÌ{°§mŠÒ¸0Ý«|bXA¹áÅ[æÍ‡ÈÜ:î_Ünt#®äI÷kŠÏ …ç1+¸ˆ‰ÏÓ"êÞKÖ{ÓÛ/‹ ¢üí¤rÊ…èthì¹9Uˆî‹t–T{´Sï„óo°@.¦œî'`܃@Éõ¡&Ž)›@ü)ª*¢\æ’Æ\w¥+¦ß‰Ö[!\àn³W»óÏòy"×ÅUù&§xÞfq®fÕð FU`gõÂP (Tí@1åo^•P£ÀÀ4ÌìÈ,kÎ×ÚL½ôfB:6Ñ䟨sàÉ„61‰Ãûy|«<º„GCÝEƲ’]Ø/ Öyâë‘Ò±¯§1*9pèÞAäÎÎ=ƒ@Ì'°ÔqÁ/éû7#¨®VvÝ™ó!NE»¨é'zÏ“SŸ¼ZÌ·la‚¦Ë"BM‘â¾RšB°áÏIU°gfý–zð–üuñ?yî%“Çaàòikí붤ÇS|’J¨Îú]£W¹á—XQ|/¨Q$·ÿJ ua±gƒ¢ –å_ƒ!ã=üYG5¼J¼†jÁqŒÚhä&àÿâ^LÊ:®lt­œ1€åËmù. +wv¤89Œ{*îçiMgë {.z%Þ_+›¡7Áƒ¹«°,aWz‰-«‘.ÚñÅ.a.¹üšD6ª/ÊJuíÞùÌÓîpñFÁ “Ã(Ãh¸ è£Ãl¶bòÆÙÒùŒ™á«ÍUþíùäEáOÇizÃÑC·8=|“„ÿPˆò ‹ÒíÒµþwR[2WëßñY†îKyU<³ÉÏx6œ€´á­‰ùaÌ«–í/G»üœ”üÆés¡Óâ/öìrôd‡!¦Ág+æÃRÐù=à 1kj“d‡_†¦K8§¶Þ³Ç{”‘Q[AÕ§Ž2‡¯¯žüÔ®—nWÛµ`²ÊÿÍŽ@Æ~i’¼÷ s^Ã9ÃòÊBµY§hÍs5‹vÃx'£älÐöäüÓjkIz Ù·bv áI`As[_¸ï ƒÄ(}®™˜/—BÅeUx:ð,¦ -‡¿ðP R^M•jœìØÄL×ö°ÃìX <Ô¬½¸.G·eÎBs¡ÝÏñ}ú55”’c0ùu½0Gî(OSån:Nˆì¯”WÊh\†(¤f1ŸhË>ä$?¾#"†ØPðŸÄãÜY1"³Ï?“M¡¶2¢Þ6ë«3:j;¯T•k¤Ñ(CïÐIW‹/˜£å•-”UàO䊶$U­^”ÈÅ¢'TóîÄ=_ɱˆÝ FñÖ'Ò­˜ºÝF¢ŽJ9u\Wµ:íÍnO>ÚqÚÇÄ;Ñû(OA'©‹3è¬?ßh Õ¬áÆ|ö\Çê‡AÃìTK‡ X,ã5¡Orð¹Ë 0Œ¤åU›ç€ %ΣÅû*‡$ªmظqç‰s²'E=/Ü1J‹ñ«¹á7³`’$zŒŽš ^ÆA*…¢ß*ÁÛy’ ²§7däÏŸ-[m‘ºÑë¯àrÛÞ˜;»™{sut¦>ç;qAs4ø,NÉ¢4n¬(¾¹Ò}X <‰´¸Ñv5tâ¢Ä¼f:Å(õ#¬ +oµ òš }ú¯oñO;xGÖy$öî%0¼˜n„xç²klÈ ŠQñÒZ³E’\ƒË!žÊN¬@qñ™Éñ:7"+ÅV›Õ’ÑÏWÈ"êžSÂoºQõÂõ}_'ÝȰáo¶ï>1ño‹fc( BûùoȾªúÆ/ÿÉjpÇ-t=Ÿ@H}¥ØôûÓº"}‘¹1ÍÕO†YžudHâë¹é©¾Ä3¼Tê«jì¿¢¯:!#g7ö{á\SâŠS  þÂ.çŠÍ§&ãz¿Õ®`/÷îïY0[;%°ýÔy D«F}T±i„)È„câÅèoóv@Šˆa©hÒ1íU+fa`ƒkm~›U˜°Ëe~—ÔO¯•j® „išD(˜°¾ùak• à_°M9Qú‡¨]`e‚¤tþýº†L*¡âóË”¾€ pe8YoÿÖ̪î@ù8³ «.÷ âÖ¾¾˜PèÊÇp4Ž9aÍ/!õŽíwZ+@ÒOš·p·JÓÒmïw]KEÈp›žN•¤CiŠá¼L!×5òàd íÂq‡]ÎtD?ÒSÂ5g¸oç>Ô¥çÁI Õï`ŸÌ^šá ùÒ#èóB:©‘êÛ;:— Ìâ2†¾³>–È#©u¼‚! Éùøf]pî­Ä–Á[oò19—¥b½âÉxQÔΞH:B\ÃGMÆ·ö³5/‚)¡Ô©àg»g¼«‹<œÇ‡D§>¡?»§ýe³R[⪠Sêò Uµ°W¦+­¨SÒÇp§-ÿDjë3Ž sneé6O¾ÍlY¡¸;ãß¿Ç5ú˜Lý:àÑ0Š[5´q!‹:Ms<”ýñÊ’º?ú„»£þyQ|ULëÁÒŽ~ w˜™³T³îœ>l¸ŽqèJ™V[5ÊO§ÕXüЦx:u‰t‰åÆÕ#;IITBÂ!ñà•¶õêd}T|KË® ›Ü«¨Ö5"sVÚGZò×gkïá.W ÈMBU7{:ãKIÐ ˆ—ˆw›&(8Ü“æ½Ì±ñ1ÑÔ^Ú¯Ãàrð£0ë[kf÷Õ*}¹ß@„Æäö}7YÃê¨Æz'·KeªÛ$Ó²bI EÙ#ßï{†,’æÕ~ExT.!Ì.ѸqGhý9p2À@Êp_Œ^Šòû»âÑ@Æëøæn ^ãÂÍ’ºñjQ‘ãj韹ԤíÌw/®xáúÄ3@ŽKÑå=µ…T¯à™ªFãõÏ'‹J.ô'¤w£1’ñú8ŠCå#ðóÔ†,éx‘ï6ÓÆ/Hi4’&ÕM~ÿh/ˆGðvâ2•øÃ:jp} ¤gIp;pƒRM1¸ÄÜo¡\ rGþ@Lrêjhx%8ŸÚ>l«Ý^=é⪲ F+©d€†µ‰¼½¾B`o%冴ržÊ7.Õ…þÓ”.ÓÃOçkÀîöHÐ?šnü\ûÊ—–ò¦þIØcl6_å?2aZòEô‡C8žF~Ôè,KzŒoŒ‡JO*·ÒÄh^–R…{Q '!²·¤äõì‰ ás(;Í9r£aC¶Ê`:ðY;ÛQ™!¾4Ê——rÌ|¸’¢Î_”àvî‰ÐRëX.üfvÜd¢9=‚Ð]·b>ùÆÿÌÎë'Ãè¢9"¶•†³¡Õ—lS-†ÜZAqªïÙØÕèúD žÓ”5Š•sAŽª¤{ žç?˜X{.ú:„bíò·ëÕÊÝEhâ.ÍúB_ƲÁæSËvçô]þŸê7Xà…ÕÒ— Î  UÕD”7¥OªˆÆr#\¿»õe]©ôwÞ#Ê q°ŸuMÙþ›Šü$ÔÍÈͨ­Îܰé´=•qð#çgþÕPäŒÏ´áÏûójb2Žû‡¤S°RY«Ã€…rSðûÁ2ïü‘lãïPi5v\?%•–ì|]‡?jßSšaõæ…à ·ŸâK‹âS7§xÐhît²­ííXÌ÷»øñ½QYM·õÉÛ*02÷—'(~@÷*cx.ag$Ì.6ÊÎ0~zGóÓþZ²¿o­xä²&ËN‰U]œPÄZ/ú~Q¶Îö\[Ö$ñãR[öé–’t—/)$¯h´<¤ŽcéýÃÄð±9>Z|É ˆÞ¨¬ghH€ñj~…îç °QÏšd"ÄÙdž>É×¥‚–ÉsJ¿öãô5BíìÀ½Ã¾DÑYÁß9TFÛiô…H¿=~!µ”_£ÿÕhz Ûé³RÇ=@QXÚ›$ùQŸ2laŽ(ðvºQ„ ]jŠÖ-`ëÇ8öJ•§ä.?N*êh âÚ2T‰1ßš—Š ØH¸XiÅsèG ñÜH¤¤Ò»¬²Ø2qTÿHj¸U´úX>ísý’jÊ–å¨*ì"‰Â;FtÒb[9S™õmIße êÙ©ï•×`±–¼ì«í‚ú{}Xíl\ER«êb{E,ìêlÁ¨ž¶`Ë eFõÌÔøÜ ¤ó¼ Ú˜Â_‹Ú}L݇yûCö=z´©Å¯ž.ÉÔQ;¨iœ„ 6J†bj ‘ýÎn¤‘M©l"cÊ9Ѷ›|îÄó¯”ííU}]íbÐn ܮфôK¤‰þ䯸¡§Úб[ÂãÏ.åð¢X Øm‘yLpÅì•\’ho;¶ÓèïÙ±Zظ¿‘+ÿ¼÷£Ì®Î2é€_zñÌ·^ioůW'<ßf(àÂÏ›¡‹"Ç™·Åô%O™Îr(ÊQzΩDP±pH*u`ب#_çß!×Vê´P2âý/ˆ|ð ‹„oçš>“ÇCü±ð+5ëã(w8ëÉ,4ë1Ù|†U_5Y}6bïü§a…«JhÛà’;îdÁq¤Ÿr(ÂkVU˜U”UH3~Ì cs_lŽ+ä¨ÿhK9õ°7V? PÔ3)lmŒ;œ¸—ü“5|—î”+ÀTÅv‰¼Ô_òF^›b QãLT?yÇ¥ðb²èewïA© !ÅdYò]mÝ ÏÈÍ[ŸC9Év%?Ó8|5hç´¯¾±ÛØ!Vu9=ziSݦÀî.YÊtrg¤Eæ“M€”6lA«X9·Í]ÿ;Ïÿ…ily@±ÝrW‘Ä–q±éi½‚Í)踂°ózgùÓRb˜È©ó4"ñ®, ºÞ¶_ÖÄ·ú“bµó˜¡lòUÉv²1‚åM)K(§ÓCŒ„YÀÖ²E¤$®“Vn.Ÿ…dìV[ÒƹGs \°l{ˆ<­û$\Û5•/—»ì…ñVT~BŒ-ÍPÕ¨Áª•¤;çì‰R½‘€óÊ6Ç›fŸ©é\_–ú˜Çkè~/ôí¼ÜòÌõ8úBÇ—^ýØ€PQ¥ ³ÛúCÚsß (e–²$‡²‹Zoê/’G¹!…Þ–*û‘0ëŒH¦l‚Ë,·î«UtoÐpiØ ¸é:P—ìª|T0¼û•¨Á.I™>qÝ䬈 ·“*ô×píû ×ä£ ž‹0˜?Rñ1BÀ>ƒIÒ½ÐÇlàM7ú˜ Vÿ1_I©Sœ *îÆÿL^È®pµçòÙ ¾úK&pNM•»h0JPÒ×H•Bùö)»E|Ùq±P0‚8«záj­ö!€ïφÖxÂST]Rç‘RÇBh…ÙŠøŒ§Í¹¿h‘z™š-B·g¥èhhЇú©[*-öW¿ Ýk™êFÍi™?Dvr_´ ÖŠ,]%&z´µ­b š}!4E.OÈ꺟¿®a(th$³£´'uOºcŸŒ)Ók»óo¸.(6ôãzµÒN+O‡ ‘(Ë4$u×PjzJŸR®¨.÷Á„ =ÞÖ v×?úF1Ίi*B“™FT, ±K¸æ¥±Ò_™Hf73ë#I|’W«ÌΧÛ}†,ʃ.Ž•„¢¤ò·ô³é²1ëÓ’è—Çù/ VT2×Y J«„1¨”t²òšÕd}™ÀÞõmuªêzì¥j×LÛ"`“¹ú,ÜŸþ8ù_*‘äm"!éÛÖR1G,UÃäÓñóî§eú4ól *¶ù.¡žð“ÝËè)Çl(X1ÊVXÃÎÔ Êí ÖwhL¤ì ®@9ahŽàô ?Ötß8 “ÒôUn>6þû¯Šr²²8\¤!õ†o§‰^ÎòßuZC’ù”ª”DèIöùéýƒÀpuÕ?Õmg˭ͨº‹ÞC‚¬Ú’ÑûJžô E”n‡ ”“%F7ÿ8ÉÔw*J!ÔI4-w xÓ‡‚32‚F·ÓãP>›ÁýÔgñªc Î5õVÓ¤öû4+Ë™@%;”pÅV_¦˜ãû4É”66`%9etIhÓiãšOƒ;Š•¹Oß;dÎOY…݆Ô˪rÿðgÖŠú]k¨ð–×ä ÌæèšÕsÜï&ÂÑ©¯¤”:€—1µ›æ½ßÜ»Mãe´Í޳2®Írtj9 ÅZìì†Ì–¿€ƒ¨ÁIÒ2ü;^é—:„ªÜ‰ƒè»r[{sÅží"Üqác‘Ò¶þÞb.,“Å‹Ñòm÷…aÿÃN”ˆžj,?w&+çÊoØ`QÜÚŠ¥ãüh*ës8· FÕü£n °‚)•Å·ðË¡xYà;éÊy%Ÿõ¬ÙÀ•MmR'¡<²Ñ^ˆV¨ß<´PKŽvKlô½ÚóÎвß¿`Ž|Ù?±Ì-Ê@H†­O.oühr ‡)Í1p’}l‹ÈÙ¤û¨¯šð1ônQ“Öü:”ƒ‘96êì(…+õƒ<“4Ã7Q|ÿF1°²¨üñ#\õl1ï,äÝ?7Âeì7®Œ½nØ<É„3ÄÓ›rhNBRòÂÑC ^[ÜÀ!ÄŠxMcOÝ—ÙPFt>l¿‹JF¢‡ßÂöð1’£†°åïxDÑv hÇÚ ¥åã—r¢fY—òU·zifÁUÆz*JfU¤ËÞ ½ ýä|ÿ:Ð(Pk<’¥WÝìo*Á]ö…gP³Šþ,ÚFjî¶%™;ɘ¹á9L9.DœÇǦÝ@sOµhòÚ³BãtÑsÒ~ˆ®›×)-ÉAª×ZØkfbTfðNššöVUÇåøîÆè&ܼ+0™Ž#õ±8håÌñÉð¨}êeía¬N…Iû{ ˜ïÂΟ&vÊÈë:s]>°WŠë‚ W ·1®$&-/~æ.`É.m6$ûŲüIÀ‰Ú¤5utý³ ÊäÇSméWX`  ÍFÛm @¢ñТ¥êf3­™ÔC¿ÁFÕÆ"œØ™»á䦳(5I¸/L½’¡Y²ìñÓQ#”ý†YhŽu}T¤¤¼?¹N/Ö‹c ¿5Ll0¡Ë>‚w¸ìÛl­\pÓ;jC©ür»-JÝW¿¶Ùå mÜ1&Êî­ò4WÃ’Yµ+Äü#-½é"”¥{užo‘ÊëæSýË•@’Ô=õ˜½½Ž3³ÎØ}Vs’:Á ú“æ‘«£»{gˆó#Ñqöúb‚6+7îŸw&ŽXÙÿy¨7ípý„¬ó󋃱wéÍãCN(³¹9ã啦°ìX";¥‡üÌøf­gÜGÀÖ]S—ê£fçù¹”åI|Fys±fèÇøý8AœFæõÛŒ.W¿Hø,ÌFFÙQѹ,PŸåí F"O­rŒ\4nšÑž3"VÂ5°Êpø-f¥šs ÇГöÞVMýͲ:“®³m›ÓWBÖþü/ùÁÿ ±©¡“‹½­¡“5Ìÿu…Cendstream endobj 977 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 2 /LastChar 216 /Widths 2840 0 R /BaseFont /ARQOPU+URWPalladioL-Roma /FontDescriptor 975 0 R >> endobj 975 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 /FontName /ARQOPU+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblleft/quotedblright/endash/emdash/Oslash) /FontFile 976 0 R >> endobj 2840 0 obj [605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 500 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ] endobj 953 0 obj << /Length1 1614 /Length2 24962 /Length3 532 /Length 25846 /Filter /FlateDecode >> stream xÚ¬zceß³eÙU]¶ÕeÛ¶m[·lÛv—mÛ¶m³ËìrMÿþOoæÓÌûp"ÎÎ̽re®Ü;î8dD Ê´‚&#S1€3-#¡ª’º‚¡¡‰%@†V`cBø×Ì CF&ìhjèl °1t6å"T75!15&db"däää„!#Ø{8Zš[8RüÅ ¤¦¦ù/Ë?!„Fÿáù»ÓÉÒÜŽüï‹«© ÀÞÖÔÎù/ÄÿóFeSSBg SB3KSBayMI9qB q9UBqS;SGCB#KcBKcS;'SJB3€#¡Í¿-v&–ÿ”æD÷KЉÐÐÉÞÔØòï6SwcSû\4„ö¦Ž¶–NNß -Í íœÿöÀ@higlãbò¿v3À¿Ù;þFØþõýS89;;ZÚ;þͪ "öo<- ÿÉídù×M0ûi0vù§¤ùþÂüõ:ZÚ9:›º;ÿ“ËÈ”ÐÄÒÉÞÆÐãoî¿`öŽ–ÿ¢áâdigþ_ hMÍ MlLœþÂüÅþ§;ÿU'áÿV½¡½½Ç¿vþõŸ,LmÌè`™þæ4vþ›ÛÜÒ†þŸQ‘´322ü›ÝÄÅþ?|®¦ŽÿjÅ?3Cù—„¡ ÀÎÆƒÐÄÔ †^àü7%!Åÿ›Êtÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´˜‹œ¡­é¿6þÇC(CøÏ%óÚZÚxüßÂÿ{¤ºé¿qü¿¡H:þm„ ù_1èþÍhé$fénj¢`éllAhfhó·Kÿ²«Ú™˜:ÚXÚ™þUó_$¤ed`øo> Kck»ÚÎúo.S;“ÿNý¯@ÿ"N¯,+/+.DýÞ¨ÿŠSø«¼³Š‡ý_jÿ^‰,Àä?ÿ  Ü ½hY™i™ÿ¸¿|8™Y}þ/ÿÄø_kYCgGKwBí¿eÿÝùOñÿþü×J÷¿ÁˆÚLþ™egC;“¿ãõŸ†ÜÆ.ŽŽUý׉ÿ[ô¬ÿ5è¦¦î¦Æ0ë+cî`«ô_Îu¹#S"Ú}Œ #!ö¥*Eþ5€^¿ôð=ÎJƒÚº¦®¯våßöŸGRTÇc}è6?{SM¯óq}H(û ¶É;Ù©éõJá3.Ô£½n–dvÁ´ØÔŽ÷§•ôJ> ðf:™¡nþPú“¸ø£’>Û#ø§5Ä¡u!6!×þ¾ O:ûóüsh|td¸÷¼ÿ‡:'šŒÛ ž<Êß!‡_KµB´ª‰üº=7Ê„çð±E$g¹”YSÞ~jÚk’Ï.©DÜæ¢Øçú8)n†Ï-ÊFí¢F©Áïb\/Ckæê÷åjô§E fH{ð 1Ycgl ñi0–Wä¯}Ã4¿ ðtóE&Åt¶Z \&—Ešà’º››¹š#/(/25©â¾î‚C‡ã{»ò-o8J<îqæÔ§ -ü e¬bô:miØ:N©«z|+hytH_ÇÎ`77Ùa‰ z“~q„•ÖógÙ2 .ó,½6ß ¢]¥º®†œQ9Ñhˆ{˜ÐÖ¦•ü>g÷D>‹ÇÇZìA\¨$¼w>(ŸÁU²àN[SA«›€ÛD"B0£ÿþŠt·ž7<<—‚jÌ-¨ìn]¢O ø3E¦D¤2ÅœŒŽœ%§OÔƒ4ƒØ¹y‰ È.cvCèá600£¿v 㼑a1Н@x×" ÙÍÕƒHQzHÈÈH<àtáŒË{â,ȸ†ÍÊ·K3”’/Y”Ôty®žˆW"So¼¥¯Úh‰í}oSOw½MOY%9 Ü~ü¬1ÑYpy(Û©˜_H÷²YÔïÄd¤P\Ó8xü0°lmçä+öôkç9cí%ˆ5ï׫M‡G}«/¶»+¡CUa.44@BØ^»÷GQê-îØ-¦e©%C§,µpj s—„„¦?l•%Ë1àL­x‚wcŠ2cQ: \´Ò+j|.÷`ÆiNººÏ¥ÍiÔnÌÔp=fu˜…îF×vÉVv¥®‡ÞÑ¥ÄÚ ÃòF-C?Iƒ3q+ºë¡8yŸ^q[bÏÉN-w¿*÷üAfÊR"ì-vkìi:‹¸±ª±8±ä‡¿ T`ë=ÎT(V¸ýw¿96@â2b4¨ñùƹ°+÷é0Lݽ=¯¨üÁÏò›¬<²Ka‡Y|:Ò—žú-E¤M…š;Wl~(ب âüuù‚½E¿û˜ÐÅœ‘ƒ(ub°†Ñðâ%Cä%«xzªÀ¸Èûj§¼.²_ǵ'Ô–=m7ÛBÀÆ£¨{×ÄÍ꼫ÂVÅè4ïÇ.M¦­À³ì†´= Ò1 (g Q5Cý{žÒf[óÁÙ ðå=‚Ci«]Éî•.Òf›Þ%tP6–ùz;7d„Ôär&ö½¢Ó©ƒRê}bÕ %\X»²b1ã áê¡×ßO¿UæÝ¥šQ=ÑlËs]T­+$O¶18¶ðææ#¶V0BxkÅx‹‡YT•º]Ö²Äò}‹ZZ–Äëe1该P,É}éîjÀ(RŽ›¡ÛDZù4 P˜ bw×4ªeÜêI˜@ ¿Rq24§iÒƒo•æ7…j,;Y;ŒqªúQOhIäÊÓBuNí|ÚÌ 6q #z~bj#ü¨Šèò‚Æj~Ä •C{")ñ`uà*hñÜ>—UF«,뢇7æÛ–8*Ä´‰·mz¾ÞGW‹Qù©“ö­æ^ˆ$SÐz¶~a•6©á­ºÐ…Pí—>l”é›/Ü{\kkàÏI¼‚èbÈÇd¡!èEUÓcˆÝýd ¿†#[Î+¥º*™€Ü°@·¿ßå|Ë>SsüîóFPF¬ÙB¨þŽ0¶m粿R‚–Pï[#@Y4K £»åí8c tÔÙÇYm̃z‘HÄcKKÑœ¨ÈÏM›ÕœÏÀmí¤š–ÍEyk T³>â§c6fé‘„®@=3eåìü±í=Æ?bÛ va4¾c•¦Ùk÷Á½§ÜðÝHdTD@þŒ}ŒŠþIÔ€q~!òôþ30§)R§±–à~ú×Ïq?¬íG¥(›VÓ²rà>1·Pþ ù[m=ý!34ò ´¥ó´6xнó†ÌqKà¶PNøPÚ¶;e£SoIáªÁ@…>Y§%Çu EåhÊŠåFô¡ÊˆwwÉd[ÿîÿƸê§!^z‰†—T¯ ¹ \ òË"Ïþ¤ X÷½Ÿ}‰s¤´¯çœÏ¡À˜5/䊬t ”èÕØ„"Â[k!ì„FŽuôe>‚•M‹.Wa6æ„pà]c†J7´žÆ”=GÇ p}JP{Ÿõ¼Ý E™Ùê¼I~ˆÛb¦(g¿SsÃîÃu ik›à:ÌÛG³a²Cå^X¦ê.ZÅ{Ò `'æA!˜üåöhzBåFüÂO/Ësmu«¤†,óHë‘c¶»²‚lq 9ÛÒ1,&Õh?Ú{†fùíÇî–b—.Îú¤X†×Í…²þ%ÜÂôûÄö([žA«ÞÃú)µÁ‘Ò\x˪wÔ!„k·gÒs„ ¦’/`0Š]AP§ !$þ‰öÜa£Em¯ˆkõS}¨á9´úÝÑÅï´x©"ÃG…ØY+çZƒ‚0˜Ú+-§np¯ŽõÖ!2>T¾¡ú”÷.6yçÇC¾ç 5ŸÉ»p{á0|õg-#™Š¼Öê‚}‰€D&8ºÀd··oßxð°Ï¯ØËV;AdðŽÔŠÚJ¹Nd-³º5¬(> Þcd‹²bCÕðD½ƒåù¨àua¼rI¤,âÇÌÍEGªK_bò-T¡þ`fØ«Ì‹Ž©3ûH@W¿ëŸ#·¤‚Ó•JxÚ…aì~ÒG` Áæ©dlv@ݳ,•v½oЦ1³dBz{ù,;¥WZöÝ cÿD‰tÉÜ¢Ýæ¾½ßÀ7ª5_]` {ù…+FŸô|R ‘ ¢Šcâ b>l œ­VŠ(‰zÖu ÞÐu¹˜3ý\7n%“´Œ@TÁ{0¸JØü ‘y„›K ¢UÃÑäs ¾&¹G Ùp3Šþa°³Òi£·×¯t¯B.ãA%ÐÝ¡ÿxcû}`¢¢ñ'ÓöÚ¹úmQ(4>H:6:æÔfOÞñ“¤p€ fÊIû þÏ‹±hÒÏ£èÛ9û½ú¸v7òr蟮fA‚åêÛËêããYaŽïuSi?eXAO‚8ôÿÜ ;ßýBtÆÅ3{’ù¹Iøõº9Í”\V†õ+ÛÇ€¶‹ˆn„ÒdK;h¢¢ïïñXOÕ ŒÆBW÷ƒd#öMDâá¹{F&Æü¹*|ö«:È^?\ ʽK–ôÜa›\KR1§8_üŠ·å’&G¢±H]š+ÜFÇÝ>µ[zY¢àÈ‹|N™Í·C¼ý8H?»¿ §5BfØLÅÇ£Oœõ vN±1¾{‘/IÖ‰¡ƒÿÛa/¦Àl+oDNk1Ç~â tjÐâS*Ó<Ï|µßCqiÄ™àå^Ös‡oôT»ãœTEÁ«£É ®3¥Ý õ}>²–7²@éã#ÂÖÝb'§8zðã3ÖÂlÞ¸oW¶Ïκa«ø%ýÈ1Éa€%ëêµ¶ç–‰£ÊÎ0z À!>÷º˜µÒÿ"qWîàdÝjê}_ 7ÿéqó*Bjû’€’V(HóŽx /ƨÏÏ9êc$§Ôcµo©Š~DxÀrßõ¡%´ÎSݪ5H•ž%ß·‚S|úKžÜÃ9²^É¿šj(o÷׋YÞ§‰'7í…Úª½4«üÏõg4œcõƒD“zuP¥ãeñ»1o.øN™Na«5Ø¡F‹W]âÉ+‹j£qD÷3…±¨•öÅãìææ˜VÛ‚u¦êä÷™qTƒ‘´ZoVÀÍÏÓaàïß|ð]Îæ{{jeD˜¨t¹çµ*aPÔñ®†žåVaü2Î\}‚–z3²žzû¾æèª¿Üp °ñ:cù夨i¥½xÚáÞ(ó6»‘Ö/k©ÀKÏÖÃj©Ågâã4*&Ä‹Ù%.‚¡b¬‚Ću–èúØï߇ày|Ê… ò®†©¡æw˜W–ë`md…û«‚Öq`ä1²jÃYߥB! fð+Ƽ)éêd$@X{Lé ·ÃfEƒšíºDKÖƒ)®H| dëbÆèá’«§å3C b—ƒz°>ïzAìÕhõ.‡[Ð ^ ~†sR–ðþögØ=΂/Qqqˆ! SíC幄{ìyÇÄ—¦‘¨êVeÚ&ò<\4Xõ#¸òYȵ²„Û¤ ŠfÇ/ Èa‡óm‡SyZAð‡°âŠŒAÝÈ{ûßüxm¤=Í=ë?ªâÛ9fÐ ‚;’RóJ4Y§W#($EóqÃ.ÃöŒ€VCÐcÓ -|&dòÒô’ÇÃA ~x¢˜¾eÄ6žŸpã"ˆtBù( iQ\mBj7}¹íƒ®€rfLJÀ)q&*»2K¾%c£Ø“Hâ®!?©°ÉJ½¹è ¥&´3o:ðKÞ†c§Õ¡©Fì¶$ʧ@ºO¹D¿ù)ûÛ—»³Þr µ0ºG÷J…ìãYÜû!JPðúèR ™d71uî€6+ß¶Rƒu¸"#jK¥’ 2™ê[drKX©+²áW nC-¹&TIªhÂPü! Ó_t‹yó–L¬ › Q­‚Å9XF„qœ{¿'‹©Ý‹ük[K´›u“ã+|VìÃѲÂÒH#©ì¥]Ã&Û.›^dK@?x³&øvZô=A [êWE2h(ÀW?8޲#ñ~´Âš,YbàÂE¶hŒ¨Ø%K ^üæFÛÏ}îï¿*6&UÂB%;è>ÙDƒ]8Èöâ^]ÞÀUœ­ß[.3f;§Ï]¢«‰ê8p ®´ Q·lM;v]ï“%FÄŸ±ç›Y›ýTˬCÞŠ"gãÒö0›²‰Þš˜Ÿ‹à› àÕÇÙÏãØ°©ý«¯Jw-!ÜÀ~e•œB+SÝP3h "ð= 5}Ö;QÍõË^ŠïÊ¿[±«sâ#Ï·HYr) Å!µüôÕd¸µ@Æ×<8Zõ^ìMÌVhè¹³üç@÷Ô»¤‘ÎÙôCYÝ–«Ä N÷>éå4Ÿà?÷÷'o̲[6PM4Ó÷€»‘«4×®ͳó¬Ý¹ÞRRé’;™Ý¸#Üš}3‰òìÌC‡—xˆ™Ëœ7¶Ð–µ*Ó»ö}†¢ßÊÐR.$­D í}Óeï)FqÞø  œìî8w³ÔyLÅ•?›Sí…ÐRèJµæ6Ø.°,RÑÕSKè %tîú ìh¶só¹©Qظ®§g%¸ú"Ì ÅX¤Ö*qÊífˆC!TãËüÌeSŒ7p /077’m&cW VáÆãþñÇŸZyꚌÆ(e‰GHŒ¥ÁÖë¡„ÞhÚY8LÝ6ú}96wc$ÚêÿþÛJªèè„C/7&_JSËñ´z ÔVg¿NÃ}aãµ4·º<â¦?y—†õâÁÕëònà°JV€5…\ô±ÅÿÚwTä¤iô…uvjc—`\l$Â'üÃéú[úHõCÿ»O»ÏðsÀG¹zÇ%Á¦«ËªIšÚF=/çó~Ãç‘qç*Oéâ¶;¸‘_ºNê½&úÓ©8õÏh­°WäÒýÒ±wÒð3ú©á¸X‰„›¸ˆRÛz9Ðø|y2 —º¸ôôÅò‹>.CC{¸mÜl|³„ýˆÈ7n€§;[í:`ØÏÓp×>ø0=Çù^|V”áÚÀUññ,±[ý&¸¤h«¸YÊArÇ3{%-"CøuiíÄÀoóô2^þë•5EêOÐã–`ª«¨ï6ú×UüÇ^’,†‘jp.å)tiÒ+"¨¤ïë¬,÷ØéØaKÔxjTèD0î}Ó$Óïn\¯,\>~šX6ô‘¶5ÙüF;ÜRåÅ-SnŽÖÏ)PÖ’ maKËîf×èËÀŠXTø®ó·œè—ôÑ–`9$&Í·µÄÉmv"c°k›í޾¶‘n|ʺtw³­z ÂíÛŠ­²žYÎ%ÈB¥*(\=È.αˆ¢8w#Ðù÷–ºÒÑ$1wlºL1AjÕÅ#j)KÜk²ãùmË¥4šHkÛMáfyÉ7ϽfêWp^ÂãmlUüî_qRy:+dóÞ™? ˆÔošÃ»ÎJÅi4ÍER‡\¤äbc¨ÛJi n‡¤˜n|YÆœ! ¾ÿ`TÓqÖ'6¾ZÃ:‹†XµX–Oß•vnw³sÚDbF:Þ]Õ–YµÊGÍ]šF+Ú?ÕÞ›*g)WuPþò}~No0”¡sï„ ‘c啯úäQoà.ó+i‘ =ÈÕýŠN¬m·þÃpí.=Œ¥5®óš®H·><ǨíÉ:‰[¢óÕ³Ž_ùg›ÒXtItàó ÂÞeî£õ‡ùÞƒýÙ¤ç¯sÌ†Í Ë›ò.ò¬Xp-ó醤Jæó}¯ÕIµ»µã'µfĶÉtðt‰%æÓß—qÖ³ˆ˜sBÚ|È’ñ#m?çÂÀÃì38õíbxx9Ùä"<âp@ÂïåÞã"«ø¾<9nHÍ~àA Öpß>Jª§@?ͰWhKàœ ÍÉ¿LÞ«/á9Pø«0½°Ù1%áT} ú Ðsë}dÙ•:äçä!–r]|(FA ­]Ù¹Bz•&ƒŠ¶qEÁ€Äz¾×ÅúÈ—6é蜿?¨&ñ¢~|Ù¡óÁáþ$ê³ÿ.‹e¼$\t>£F‡œôs7lAKë–;/k·äbç}¨È×dU)=Úxƒ­PÝ q¿—å¶ÍÉFÆÕHɳÜ)Åb%€ÃÓ°Jem}cæqì.ýeóëþCP»,2òvx¹>–™?þ¥)Œ-6üš_úGûß+åªØ=âø†]¢¯‘nkGbº,»öð¦»tê§`m-5çÂ:¨ "ë8wùª7ªŠz#à™¹8(bº+øÈ ‡aw†*œò”û×”ºMS¼¬R‘Û¨ð– ,ݾ‰Þ¼Và2GT¹Ñ÷£RnUÐÔiu G1;ÑA3½­@ÔïÊ‘*r-Ÿi)ßî„2‰°VutȦýÇ£Ò=¼2ì0¸ŽcªXÇA§?4‚Á Ç|ñi(Ò©é¥EwáF0ñ™j'9Å–Ó:•£ÌCúàÄ!Ô‰1Ù>(9rô6É`æ dlxEÞ©U†÷J„c§±”¤Ó’©EUXƒêy±ÝqIì¾óÜX &š HR¥—¬ö«–­9ÂþnäüÌó#ò…?rŠ5¼Õ5ï!¦š½q¥ÍñËå´åHbÏÄÂxâ&þ‡玠œŽy@Ôr4,Tq¼¸„8ÁEåÎ!O˜"e‡Rv³„ÂÚÙ&ð¯Ï½.Æ{¦}c<µw¿þŠÔ•¦ P ZB¢«tÆJÞ®Lg}9d11×B0î•e7!(›Åð[‹‡¼Ö;%*u›G]CO-†¥7Cc%0J'Šrwè‡X®RØ1¤õ¬[CØu­]{R½‰?·‡"8¨·JÇ?‡2)ĆV pÏ÷Smbr˜]WB²SuM™bcDðCGh ðæëô/ýÌ¥ýí=Pwÿ8Ä<‡3.žOÑ·Ô[u©…í_19‡pÊ*ÃÑÔ3àG uç÷*¦oŒ9¢ôƒ‰Öåáèç…EóM½=,¹×…]¿’¼‡›–©¨±¨S¼¯á ‰åÑS¶wÆR6(Ö¦dÁçÉéñCÖÈi®â¼)»à£»¤²C¹Ivâ xTP* Œ˜®mr HÍ ¼ÀBòñ[;Ù]JzKcÑ¥LGÅé(‡*7™LƒSó;e¸ ‚zEmu£âæ-G§¢­Ã»¾¨ l¿£øPžOÙv¬^OF=à=¹Äò©>ÃSC ñL,4p¬Åj< lcn¹ø5•»…+E3¹\‹1¸Až¦ªç裸¾‡ö"BÑ(cWú:$ ˜Ób \dá‹QpLq%20ü¾°euY™Ÿ“ xÓ&J£BrÒÓ·]Wwd#°—.M«,úí}“XOe€„ŸÇÆC.ñ©àÖ‘8þ¤ï¦>>“æ‚:€ÎV>Å`½–ô(¹K«†Z#80ÿQÞ¹—‰2„¿¹¥€Ybº 2Ìý£É”È Éyqs×UÏõrÜocÞ™2çWç:ã}€Lª/ñ8Ý¿>ß®;mÒyÕµž@^þ—¥™hþ¶JsÝFC ‡˜*ó½bS.®óøw€¶/˜¼³ú¹[9¸ªÄ«—™‚߯ÌYÅmÝ8â÷•9/Á‹juõ•&€«}&8ép­Ç)g¸[eãnÙ(ܹ)&ÙäSÖ XÓ—ìðÞR žyÝ…±9ü û‹åñÈã©| §#¶v ŽdηúŠàByò*7‚`Dhõ¾<ôTÔ£—’kO‘²iç+àÚ Twý%-å=†y¿5¤Ç}÷õ¾<§a'EY"½ƒù«$ª¨‚/Úô ,y¼, —ånêdAéUš’_ÛõúæáÈ›X ™¯[ïãƒb†Dë4¢[‹ß’R¥áÇÅU±—ã$ž7U$›Ó°¥ëÙ+ÂXÖó;­_LE'Ä NÎE¸™GÉÎËòh±F2¤ìÍ4%¡ â_ñÐîI~:idt—ÅìÒfù*ÖŸ|1^(¬x"ïh(“ Tc÷8)Iʾ%•u«õ]Õhµ‡ cI”Ú³lñúâHæÚéij¿Úöµ>’Pø´Í7•ŸD£-ÚÜ™¨Z3͇¼DµÐ™k2Uµ³VPÑèÕ¿¼‰™™Š<ù×9'xœßžÐÉFeÜ« hV_äP8"ùu˜u•ë|…%šñE=žá¢ø¼´ƒ™ P‡Þ2*ê×{‘ˆL“&«KX¡hS€ŸújëÿŒãWbpajŽŠfŒÞ€1•%ß]ÔTaNŽ™-vš[ío’ùÒCQ1hS¥ fXb‘ Qà’M°+‚¹ˆkR°+ml®UW–B´@õ<²Ç×~Pÿ•ù»ZœIAHthÛ§ín³_àV‘pö½ùcÄ7l_µª„3?ƒ–êÛ)d;û¸a¥¸2J°bµ¬HðkL'.ü…~tñ¿<.ëíLgú èÕ¬`}¨å‡‘‚¢Ïô~ÿz_øRb‰ìïE‰´‹ù¬aQá“"f\J♃lU:sLÖƒ´ò‚'µq1|ue¦ÌŠÁ„1¨}"EÅjÕÕãʱí€>@‡æVŒQ¬&W‘6hNkÆ~À,Jp o8𜨄¡ZÌ^Nm*»È—ÐUØR÷ƒ¹1®ãFÚp\Mw‚zyaÚOÐäŽûù}®®¥]1ž¾«8—)T”;¢!è|-û¯~¤øêèëÅ—Ù ¥LŒ¸ñ]V¤œë"˜Ý…"GŒI×Q4™€™ %Â<ö“9SŠ_#ïd„)±a˜/5-‚gÃ3$ám¯Û½N üQvû½ChäBͿכ"‚î­‹ŸüЧKµ©Ðj¯[ Ægè-—“a´(ö«]A™°u¥$k¿ùí tAz;@;3ò‹¡M]w£­6IãnxWd?7¨'ãv¼ã|åço¾>U%€`µæ~a¬P?ŒŒàpޝH¿{5ìà‰=ºZõPìa®”|0r±ø(öÇ =„€ ×÷ÁÃ86oÖþ%KdX]‚Â}x9ó5ÜÄÛ0®0$1¸Ö£“92u7ȼ6 SîªÙT²Åàj&!8¦á$_¶~;9AÖp ¢Go± ‚Ùr"ƒÇ¦Û¹gš¡ÄÑ‘ºö6èl•*?õ×{Û'´£·b„éLÚþg&ÂW$„ tçñŒiû0÷wÂî±í‹IP7 \¼m£ºe&ÿsá "¹M9Ÿ7dò?æ¼ÜFº´È¡ö?í_¨Ô§Ïj–[‹x‡—/{=Y2-vÂݪ-Uº_ä¸ô" aHÍÿé,“ÂÓQv‡ŃG•qƤu±!4 ·³Tú¬@R¨3³š¬z(7vÖ¼Ëï)h“Ü &° vŽa$:„W?Sv©ÿ¢Q“Fn[·‰ýª‘;]£óØ[ºâ&­üe¼—N…6˜ZSFÄ¢üÊĤ£” [q’EÓ•ìxd§rP?.tÕG¤“|áÝkØ!× $ ñ:º?ûüËéW,#½çÎ=©EèåE.t]}©váG^,š;I!{¹Ú½X[ÙÚJå_3¢-ÿûaÌp2~銃ÜG«­ÂG on®±ˆÒž¶ ®áJ<©ö; €öÜ x3ø÷­µ ¦'qטáŸodôY™(±Ÿ¦,óÓE_3µ#¤1š‘jsÅû³Rñüd~ «ä…ÛÁ0|XÛ(rž[äñÅ n£ ?ÀïÛj ë&a5"Gçã^ªxv¬ûĉ1 µ§i–Î+VÍÀ§Ušš"súØ€ˆÐ¾§4gW¸Öïd}/®W(¥Z-å™ì£ÎØŽæ>BG‹z©k[Yš¼õ‹}2I#‰Ç½È‡™6¶B÷_È0Wši?>üŠ¿ý§ˆg²¾/ýôºèô¡¶Ë’…P‰œÀWëÐâl?/ nãöS׳A‡Œœÿx‘P»p†SæÅJ3o6^lIðB,<9ù}Š`'‚(ÈY¾U÷»«|oOŽn¨‡ ‹òÁÃÞ ä‡ÙD-€ðÀCô¹Å óÛײ‘–RX›0+RH¢_ƒ°844œèX‘¹a¤!qô9ìäpâ˜LX3“€B„¢¡YzÈ«2ס†oòØ èùú÷ f©ý‹‚Îzø3ºd”ó‚oˆŽH×üÅöOé% @¥¢ч"<ÓR:Ï£‡±|Ò-#%<õxZö:YÊö;¿;OL;S¹~ózA´®#Òhc0lúÙ1™Ô鯂·(ímÂïi¸„ ž/rÿؼ@“ž\±mbçQR†Aɽ»C|ÛÛ$÷cdñW&Áe_¾y©Öó»Þ?cîŽsç°t.Dì]¿ÇË„Yv¬@ôVêèïiå]?—ÉŸ¦i4ß ©\¬Òœ0æÔ=þ «,ÍÎ…<„%ç?—hõkËmaý©¨Pøìø#D¥~Y;l8躈X Ð}iÆž€måòÉh’PïÛGÎ5ÉÄcð"‹áb>’'m]âÊjºEѾÎ.06IÔX“èÞ$ð¨?pÉÄycÑ™h#Á8G݆¿:taU@Æ¡ÐÛÝÒç$âÀåʸâ2ãǰèàI<ãÖ$v>»»dÝñæ—ÎÀ i ‘ fÚ åg5NAV–£OÆÒHë˜ñA½=ôk~ –B´ð+õ.´ÃZ†= 0ѸDÌ[P5xœS_ξê\ßÛk£{ºy*V—†ƒÊ»âç!­åhÚéWf5vK¾ íÊÐ,6E5‹˜Lä´ïná™ $t*0m®ŽF,–r^Ô.ÙLþ†Ý-)˜¬½ãükN¸ÎAÓ_TÀôLšûªÞ­ “سïñ¼g‡œ&{(¾Öx4¦¾æ±»Ý9ˆ’9ÌYÕ]”ý ®3[ù;ìÛ. $šÃžúSá2ZЯ ϼ'ýPb€Hù‡š^•9¥vv&!Q ¥±¹ÏT>KIëkO‡T*ÃL÷ giÒÆíÍ5;¯>öšühöu1mì~ýâ (f3?9S× ÜýHË™8±ýû¬›ÄD8ñº¢¸ÆBÄèläPÈAÅìc_^®E„ºý¥P“e]´}¢¡(a“×4Å›æPý‚]Mì´Ú…„iÔÆöÄÃ¥°×hxy04YÖeÃ#+, xŠ&déïXð‰xkÛ‡½zX Dbôô´¹¡`C°áP/þõ²sª=JNOˆ¡,t¶R{B—vx±ª“ó&(2PçI— dŠýŠtyú}Z^áM1NÍŽ{.°»”x0ŒXdJ§4A.ù/.ùüÙpl)u»ˆds£[ÈêùUn@Z´55(Y†@Á ÙÌ[îæP6eù c!Ë•…º^‰°805Db~ØnÌ×€£î¸›ó‰Õ9ãqÈy[uN°ù~TÊZ•wD‡¢à%HíN`N¬W´Vú Ò©.QDKª;^Ö3ïÇÞ@ˆ§Š-˜Õ£~sŸút× µO÷\ !߆vO/Š~·.:‡7±hSuLc„’èǪó­6õôÇ'ft¼f·Â˜'DŸoö—žŠ[¹šñýŨ™3ý{>Êk @ÞÁ,i¦Èî1hìêZ&DïÈñÌ«ñ 8¦DJ!BÊò2'BYÞ®:M˜ûæZg­Lí¬º“i:®>ýA_¹âX“À %¸±™rI¿R»ún¹RÕ]¶ )Ú¬=Ç(š’ïŒçÄ„f;¶2Ó1‰’êC»;ÖÀ‰žëÍ­ôÃÅmQ i3²taYXÉŸñ–#O¾ÑÓÃÅÓ%Ô3|¯)~ÿ¸ó¼MPîU#€ŽIø’ÿo’töŠÉJ‡ ™ 6‡@%ì„gùyÀgl‰+Èe©,²’4¸A&3;}­Œq5¿&³@†+*´PÌ^°A—+‘YIz¿o0lü›…ûã~3ÜJsW!©„0‚{21ì*òÏÍ_.À±š¶Ã´Ö¹7^ÀШ`ëXÕÒXýpZ8Ú¼Ê/¸5:œJ%jõÅ>Q›­>Lï'‘n%«ê$]èJO>CûÔ)„ž™8¡ˆ!k8`¢ó#÷1­½á¦VKÏ*Ï—aÐeª`Ò!מCuub¬KÜô7¯ºá®/{Ô HÛ#M3'¨â"Ç0ó>ö-åŒO2)üpèZd..Húì°éý°½Raþ1™$ÇyAu­§‚ ’`Êìâ-h>ýÒncaC–¼$?*„Q !:Ї£@XIƒ¹È3¯¡ÉHd’–í ë†@©ÒLwÒ ªÊŠQ”¤¯mHŠI¿ž´!J@­ôl6‘P·Ï?¼‘ÝËzØhFZÍÓ¤êI¼Ê§A&˜üäE—C Èz©Ltª=øµ¿ˆ( šëÊ—2{À0ï5ºûšõ¨Aƒ.ôºòȤ;HGëG–‹>hTlmiàÿ–kC‘ÍCtßqhâàV…Ëš¤ge9IƒÇ‡ç°ª¾ƒÆ9UF¸¬Òªøø£ô¬.Xì›:…kõ²kZÈ^GàMçÌ©’ïCÞ·EÉŠ[=ŸCF’j™@^8j3 ²µÔùöB;\ׯÁ5{ÍmÉqÛ‚†SíÁQ¸cL6˜-lBsÁm,ù}EŠ­Ú¤Rï ¬C‰•+ŸÃzÖd yk誗\‘‰aRÙ¯>=”P’Šzj¯f~eëÏK†*jk7(SbÖ›—q6.ºº;lÝsߎQvvâÉ$¤Í´ ¢3bššA¾öíù¼w²P„²ðœ&.Ó£š­˜¥Ân•ƒ87Û`Áà'3?lÍ€ uÇÚ+‰ç§ÏH§µjx²ËóñáKÝŸ¹4î’ŽOštf =”WîÃí'et¡oPÍ4Dz§Óc‚­ýü5+A|ÁÒt¸Mk½ê#´tgb³€k÷í¤Z¤¨HHµfüêS‘¬öAxm iËŸÒ39¤J6ÒŠ~ócñ0R–((sR:ɶ¡µ)³…âÃ\‰~¡ú3áXšZÃSZr_N¥™ŒM7°6â;Pî=Œ!·þö»$Q¯I cQžò>u¯ìÕ{K’e®Èmphxª¥í‚ŸÞ…‡ýThȪù(ª60ÓÔ|ž:t_h­ËÓ9|×pÍ’Òó†y" Të¥k#ZÌkÆ Ä¬}\°ŠË‡‚—ÕMCEýLw· Þ0?†+»Þ[øj˜[NiäJ¸«v¹.±ÅÑ·!4Íçî‰Ø·ÅÀnuʶ‰éíß©Fu“/FMÞsËÇÙaeÊò2ð”/@ÊrWr>Òb˜@]&¦aL.,º*¦A ¾žÈbÇ]‰-ùË [}F¼¯¬gŤTí®1¤]žÁÞ÷å*„È…³Y£Ž®Íïå>÷Ô‹eÜ.å¿38ö§hgXWü„{Xß%ƒ5*˜Ä…›Ô¸«úÊ*1²ñ°Ö’&þÑgºl×Dàpk•o¤ògªëk«NËcqÌ ;#Øa‚b'H3ßè´x¥ÓqWŒƒ¼ÖíÏGH8P–Gm¸xÙæ¼^#©‚TNØ ´Þ7ÜU¢·f±¿á>÷j¢+Ö@׸—oÏH‡çR=2Ž¥›»»?y…AbäÖlTòÜBgⵑÅ„ÄëV ¢@í8XÔìÈô‘±ù EMIÚV‚àµðµ¸ËìiÜ*¼ð`Nö}ïT¬?AÛÊiÎò ú[¢5] «-ŠS\Ë×ME4ÐÐéëh¤®W^ƒÙZR=þ¾€‡8vm7;m&ÚC:Gõ­VcG‡z¾9ê =ô!:0Š ×Oq/Ëf…hm‡y¢iñ’Öñ]ùÆñû‰_ÑMÔÍyÈäaMx3,Hr»sGù®TñƇÛd;Ò6±nô‚âÑ‹'Ÿ’5ÝGêÏ[ŸÈ…/ô¥pˆÉFk<”–@ ¼,…I;q©h…o{“ T DzaZÚrÒºŒ¼?»A~v+­œ6•ÎF­¨)¥V˜ŒÓÀ7Ò©| ¶©Ê`ô‹S+ÙWZ·†-à9/°9Pû£©0×¼hEÿS»¹¤DöšÇ©|؃‡ÅôQ§é ‡õ6K^9÷9AÚ02í ôJþu"3PÉÝ0.@;îpíWê–¢%ÅË)ÓÔ±Ä(a»„Š•ds,¥œ€°fKRìî$‘Ûò ZÂ[²’&ÞƒVb$×@(· ÆEPÚj·ŒOÜ ¬vÜŽÒÂ0ÑÚú+ãÏàªèšúœJ0LöØ}‡‘åʲY¢Š†„WYø‡õê9VäêüÖX‡ˆ‹Þ`÷§9Q±GÀ6a°!PÔHú‰nœ\lÝ7iÇüq·¶ @ùä|ûCITÌk?›uÃÃã¼o÷d¶j«/OÝr 7ú;È<Ü+£¶qíæ#›4Ö[Lõº˜`Õ)¦ÈÌÂï—¬w¿I,ÕÑ­¿ð_ϱs–õ¤›ÚáÅÿ±3mÁ 㬩¶uÉ]Ÿ&¾šdð™žA³‡¡jJY¥»Œ×QhéÛßkhÔdÕPcŠ5¥õ¢J´$~¿5 µÅþ¾3ئúQnEOê_ ß2Åiâ(ªt…Ö¨¶–+ÈÓk¿(ŸQg䔈‚jl.¬¤žmtkñRP|>Š=}nJ *8ÇÈ„g_WÝ®Œ—õ+¼•Íä6¶ðhÕmØóÚ¹ ˆÿwkÍn‹ØÖæaðÙF=U§k\!÷é“>Í}Éþ²Ò6c°ÅìC½ïPUÈñ¾Á¾FÖ,Éà¾eö4°Gñeá šÑ¢Å"W)œÇzO§$#G^†¾I6ºb¡lì4=E§8ÁâÄ«ðÔc‰þo˜iw¨ ={€õôI=Wlº·(N˜]ü;h|-Pn%Xª²ˆ~~»'"«òÉ@Õ]͹à*ΪDÝ*Õ&¯æZL‰~TŒPé–¹CL è$Ù‰™”ÈÌ=cöñUa~-,'lÉ÷ûMZ9×Q)¡7HüÏ$_‰qšÑÁ%Û‘º/Ó"Xô{nKï"£2œ¥¦ ‘ì¬d)³ÐŠ¥ƒÔçSìýÜh× ÁɈÒ%zæÃȱåm™,~ÇfVߨ-¬&¨u¨úáê$Ý›7üg5úІÓd6Ш†ù¦Sº Ì”L·„€çï*w«žJÿäŸ‹ã¤æt‚¢«0¶\Nê´e“ûéãÏüŸ¨ö5M.áäþ;ÿÑ÷7øÕq‚ªˆ@ü uk… Õ˜Vº›à)(Ѽ.¾1½€”(ЈŒ£ ´¬)¢bwµý OmÅE5à Á‰ ñT9Ý%ઢ#òJ&Vû0/ËÔ%ྀÏ9RÒÛN…Ô°º‘”óÙÀañ< i«ˆajàX±‹¶"A—•ÁødÙdµ`Ö?­É¸Ó¿aûÐ#7Îò¬'Z0ñãèhm£­ªš`”±wh Bú#Û>öcðÁ§yÿÍÓËì z>½ûÔCÏÌç0¤d‹÷èóx@©%p‡;¾Ë0ÄîÞ›ñS"GÝ8m°>I» Þq|=…ÍÞºÖÁPŽÙŠ `*¾âõ•W±2å —Ê„s(ҨʑieM¬î3ò °vÓ.ÈøÛæê:‡d}ȃüÂF[ËM¥þC‡e/Eœ·ß¼¢Ca-(PÞB‡‚_ŽO¶ó:Z•žŸOXM³¹)@õ' ¬(–3ºéìØ¬Dæ7"|¶Òp ¬>;äò4 Hãò%åý<ƒÓ`µdmÜ9,à]a:Ïõa:¤^ê­ÿÏi‡/ÕGR ,¿TPÚ£>Ÿ°8ÛWò¸¹‰ÜÁ0›ZÂÚ`íL^ìRIsHq“Èo]¿¸§³Ík~ŽrAF¸Ç¹¬ä¢4¾±")F6bëô¾j’}Û‰úüÕg[ŸBÕYXº4 ßú ry¾é¿ÖôŽH‰²ýÒ¾¦aD ?sˆ±1#3êø*,€œÈ™Ù¦5-€ó‘6A2F4´,^ é¶Ñ§­²+óýþµ‰áÁ°³YMwò•¥›p±¼ô"xf¼< €Ø‚´¡pèÿ‰?ÚÌo‡ _X*GÑ ãd´°¨Ðê÷†'fÏò€—ºÉ¨sD?B©õܺfµl'ô¶¯î”a ’f‰:ÑÐ×R[£D2Êž¯º,éWoìúÖb=U-I@ÉÃ-ÚvA±(©ñß›e©wÄF÷CV]œWÆÖ,õ®QÌ^‡5·qÈPòZáEodÌ”ªëµ¶ eƒ‚ë`ÌCïRØ‘·Uyeü¶{6ëæ…V †L޶û„Äk³Ðá ÕTt@"´æ ‹Ë¨4ÃÉÚâÊêˆr¯vžO%•‡Û›XU[Ïæ²kC‚?Ê„êöLSp]}¸Äö¾¢Xêb\*OBŽwKhÙk6T È ‹w~öÍté-7µ³{-¬§±È+Jè­ä?$üyüÎGnŠÙVËz—‰ãÒòARáJSIðÊ}D“Ä(íŒäˆ²«ØÇ–w½SwR᱌ú½ ©ŒiDœéî[“ä:¯–â§ù‰Æ–äAlw’.ò>ªìJ•gvX9Y#òêjèžW.Ò*W®.1õ×ÛF)7Àa^¤»<š‹44EŠXòî¯Qœt ¨þ‚+Wrëu¿ßœp@[Ç7ƒ}§È‰6y”ò‰Q#Â~e;r¬bxSîæ(|åaôÉ·ŸËSÇ·IYÎl'7W?Ø`m,ËÉŠ9³–-ÄhrlWÓ½òõa… 3Gˆ Q³âuÚ«Z`é¨[†‚šÀqHkU<¸‹µøDhW&?׳fךîOŠ£Ù'UÜ¿5µ·Y<Ÿž™ÞúýyìÖgJ¯bèsõŸ:†‚†ÐNòÐÜ«•£»ÎØWÚ| ¤º(R.g8u$=Vâcø”§„áä¿‹¶I+É«Xg•Q8“9!®î )Ò¥mjô\oBÓcl^Ü‚¹=aä–>T~E¸Í+ý&¤ iX£¬mý®Ê‹†TÆfx¬ÀjΈ]þ!ˆ„ô„¹Ï¯[z C è?yfš*ñëzáCy(cdy÷s`uÉ5ÄÖdÀ·6Îè°XÃahJ•Ù0‹e¦sdôM„•nÐ]E7ݱ`‰Â<j8áð-xÚ;ÎCXdeÐü¦ `»ù}ý•O˜‚O=ŸÈkˆÎ«ºb¹EèA®Ø#-a_rD‘I¼(r-ÇþFËš.E‚¤J5Úº—k|¤Ü«ÁãTßKÏlô Nö¸­bë×Q·Ôñ0m4Û¥@ªÔv>²Ï Üì”E1ØÝoaöG·.Åö‹ÄÂ`lÚ¾8 ³ÖŽ'úsa·fZT5‡¼x›}Í #÷š„89 ¾87|»3üÀž¢½Qݬ¥£e(þ!¡/4ëðä†)ò4qœ—}WÄ3a!PöNœWÄneE,,ô=—š,Cåg\"RzŒ•ÙC"àIºöTÞî>WJVÃZ!ÂA$U⻊æé±™áïy˜ðÒ#bµª/ c?`×m¬‰»ÅpTQ*•‹×CA±sr|!{ ê#eºx;ÑtïJ“ ¼©_»ïÍyz`˜L ÐâýC²q ¢;Õ©ä÷ÕøÐ¡1Îèwÿk½ðõ6¸hâ3ÐÞ· Z5Ž6äà-o/E«(–.ŸèAEþ”ö£À„CÀ°azs <2‡rðj“Á÷LYb”¢Y ä£GjG½o’¢¬¸æåÌÉ¡h½ú\÷Éá¦æf¬³Z¢Ùš·Îz]â¡Úú"ó/)+ Š?eõèŸ:¦–z±˜NƘdbh5·Þ¦cT~tsq ÛŽ}½<ÂÑ{>)? | WfìxV'ÆSɈ·ë c–&øYÏ–FA ‡¿0&ägÜUó1hü-îÕx=ùž¿ö ŸÅ¦Rþ¨ò[,rhtDx㤣ڶ ì”íÑj#]…—°¦škSÑNf†#bÅ·.ÆÚð°ú™ ò«P!›è„1Aü’v‘ — dBDv'OWs˜:n *vÛ ³ðX±BgЦwµ3ŽþXÜC«¸ñ­ÊE‡œ.ô«Ö¾ ޾ˣ Ü<”¿;³©µËä‘PTåðã°ñ\þüo*ú¿ŠÿÄ\5•Yt™‘ÖÎhý¹j¦aµšS` ¨ÓÁBÃryx/7KèƒAMñÍs;žØ‚+Ÿ<È{/yq C³‹3¢«;šk`ŠÓùõƒ,Ï«Ã1Cdæ}ÝÖ“!ƒ#©á+³g› á–{r<”æÄÀ? ”p²‚Ì’>›®Ì!—Hûç¿Í»LûJ,Æw‘É/S±l{;0bòÏß™V®héá[æƒßOX8÷Æ ¸x&Ÿ§8GÔL‘-‰ÕÿhÔ~ŰÓ_vÅ;]hyÞy ¯Co¥ßä<ç|˜ U ¾×¶±ýX:½ë£`Íò|Ï/\Û0wwN†½-Ÿ©,‘ýœp`ì…Ζ 4C–ŠÅÎm’s]­ßxÙˆ´Šà&ð®²É)ÑêûÄ«.å}#2,dþ"( y¦–Ai|N[TðjÄðº/†,d\rjÏæ]?öt¼wÖ¹œ ®æ¬è›Ná—Ÿ8çÇ"OðùÁ›‚jÚw ‘T ï’«­ºàmf¬®–ˆ‚8VÙ17f“®If)¶˜ÉÇ{§˜µ†¿o¼É î0–HÓAýñR6b5}c¼àoÌM r*'WèU+”z±öÍÀl#GKfaÆéQôTZÉqNÕﬨàdg‰÷i+3|ª#@Ýì&ÞM„ÙÝÑ>©LV¼«¹wJöº/$pžG ¾†6ªìk¿ÏÈ6úXð7ä´/3²† {¿RÓ„¥cpçÊ´(§×"¿îzQcöê0ÖóŸ\¸PCåYsP¥ä+}›Tã|ìÔ:Pd¨~½9iÜü1I4]‚Ýdë´m¼°ÃÞ¥íhqËÖD€•6Ñ©M,XJ:ß,ú´÷zk¯IÿÅ´(„ª¡Z©#äÒH]Sø?BĦcêO–‹Â†òö-À<q»×ëMX,SŒáy±ÍôwWf2%n§./[v}|5z|{ÿºx«:CB'ÇC^._C®u +ŽáoÑÑoJÓoä€à).D¦\u𼓠m|-zÐ#çbûŠ×—†rÿ ì ¥ ‘ Zèñ‚%Qú¥.¦™?úgÚC)àhÄf‘¢qÿŒ‘~T/Ão­?”˜\i†4þþcΔï‹Ö'Ex zßz§zëŒm$?Ñó/ Ó–SëOó8õÂîU’ÎÈÓ[ܿ˟¢Ú_|hÖnÒp»Ék§5LÞöË=¨ã´“oACØLÑŸrоYŸdÌ»aëÁ>×r;hIýYh\Íf¡×ŸŸ]õœµÏ­®Ð>ê*¨paºÂ “ÓÙÈêßh,8}Š‚Úb ¤£RǶŽ×ºUÛ;ƒîÿ"äê§~êOš†¹S(°^Ÿhçö²š<|m·Ä6ÃüPÛN>Œ6nÅú$%¦OÕAGøWšbÀ£¶°à0ªþËesè‚Vî¬qSÓ©£(þKÜTnEdýŽöéë+W§êS÷á”a •é “?“pÜ_¯ÅÓH^ƒyß œÚ ~+H!]š°È׫wž‘žÓY“bˆˆ³ÄzÞ•XÄuÇgÛë&^J;â ”<¿Ý•>½ã€)ͽݵ‰ÿ‚|ªX]$ Ô¯ÏzÃý'G7·€X´ž\b"Y)ºÖŸŽéA‘º óë7Áx—GàÔú±k¥8[}ŠMgb{Ľ;$p•yˆö]â—²BÒ±ásoi« ‹)§ŠgÅÊ ˆ@éå› ú,rq²Ë8å…ó‘~˜bF6Ö^Tãj~ƒ=áóqøòê¹¼è{‚'Î-‚í9ÊŒFü[#U‰ËÆûóðØRÃ~,é‚É^MÑ|PóÏ¿ï×'T—´Ù$ªÁ4eŽ.‘³o’­è2ÿVÑ8VHJõ®/ºÆ¡Ë5w†8ÔÍ}øý¨ZkŒ-"´ˆGŒˆ¦U¸Ö¾$ŸGlg|ÖýÜ8y`Hë ‡»ô䪬þ\;hÀ¯Éf¨`&i»cßbêQ^Ú>ð< Øwh¬ƒÁ’ãl„«$I¦‘5œ]±RžχäÍ(GƬ/áOtgO(P»Scí!|@¬¿|N0É¢"¿±íq¶P5R@hAiËDì[pêñjÀgÕêõ¢¦‘ÿ@‰Tn£6Fz¸;GË‚­5‘r0çÔcÁ[ï(þ;ÎÙØ0d»UÕz<ºÈ&ÇZô¾¾ `§ù§€×NåÑ99* ‡ ñôˆÌÒ"â©üsÈLSM^÷›MÇݦ¸é¹ùc!CFEYÝO§_F¦À¡1¿ÂÑï9oú˜}SSQ¼ôìCÁžÉ¡N(²õo¢áÐ윅Dé}ñfi¹“ël¼&‚m~¸«¸òÂÇM´9t‚VTQêƒÕ~뻀Ÿò1AjEñÚ¶ÁP6#V ¡ÜJ5äàýµ›{Þöþs|¥P9bT¦ºX4Yp’P;ÎÊõëYý—†½w@4*4¥¢y§©‘(ƒ‘Om:Η²¬ÀÐÇô™§¯yCöÉEá S:äúK AüQwÞEè³4Í,ya;dÈ”/#ðƒ“co;Æ©¡£«åhÙÛÕÐJ¹­¡0q½Î• C§Gußx{ÛÄœ„B;ÀÐ\g•~—àèiœlðv¿¹ôõÇ™‰7ßZ F¢¹fŸq:ƃ¿øëC }bÉ„•Óµ Vß¹ D¶53Ÿ¸‡ vðGПO*&æ\ŠÛ+>h-s›N¾)h2ÞGŽ>hÌÂéG:süFeæV6Êœ-ª‹¼¦)¯tà‡\§óŽŸ2E}˜Äç—å1£¹VY…4È)‹®x¹ 5Cð hó¾èmÆ€‡qŒÆá:4›ùÆaB-ª-nÍØðneVŠÄÖL$Œç _68ý0¿gዶ‚›ž´ýÅ©< ^W¹?·eÜ/ >S•³Ë%åqUEV Jã(†N` /õÍþ`ôV’(H…ó¬ÐC>ø¢H§A®æIØO¯õ–0ÄhfÙý˜)š_x〘ÄIMme}Wì‚|Èà¾NÅÁä2¼Ô°yÅÑ¿_ÑdrEˆ »ÙŲVÓ¬w#ºÞp}§ —;Å_G°n\OªˆàPcŽ>n?ÿcpåÈñò‡VA0]† A§Ä ©$'AÞÖÆ\ëÊB“7#ã\@3À¸þƒ&?^äûë<Ì)a…Q& a~ÌpyöÁÖèò4|N®´ˆÑ?s~ï>î7¾-¸fxÛóÖpS(}g±‹tóOƒe¯¢:;¬ëgu _"êhN;6º—WìŒ /´~›ó\4ÓnŠ•ÕúÂÅBTS0vQ‡=>WOóoƒÅ䙈°|´:u – §"—U±Ð)f~Æ™·ì‚Ò²çuÜ€é­rrm¡ Z QRÊ,!ß1H«¡txLÞæq»`ØZðžc‰$R¢²ZQø¯pgMF«ðÁïu ´6N‘h¥XEÕ—n¤ë³£¦ug÷Øen0Ôq?9nüÓ?Ž·ŽœìµbÜ(¥¹/CÏHã[ašóÔþ`áTÙ­p !MàÏyªtþâ Cýe¡°,ž¶N;‘à§ÞeK œÊ‘÷©˜’¤¥|OO>œÿý¨o2ƒ{n[2<'Y †-hoì‡C–=1¼‘9êˆÃoŠõ’švƒ#ŸoÚM]­ö]œKM,˜;]-S§ÜçMñ¨¸é¾Z¤÷ U;;¯TÐ9Îá757@iÓÕ84& ƒÂóqI¾ÞŽ´n‹TèÔ=ZÓBÿü:åT(a v|(‚bV~Qù`N~‚ñÑÕÓéáîÞ¸ RƒÀöðša‡ÄP@xD|i`­-.O&~F`4y£UÓÿ HÉMÌöÞ8Y€T¯B"y”x†\äñŽmÄ´Õ¤Ê诰¹ì·÷O±,‰D¶8–ëÈá û0Ñô<¡;+BP¡j­uÛ4¡ú…wÒý}"íç…ïÌiߟÁ±%¨N_M|“HCqíÇ4ÆŠE‚èH¸û¼.²4 ùÄì©¢"£ÂŒÚ1§@ÓÇ%ìÏã:ptu2DØ/jÏNÚ‚âî þ ª×“?ŒÎ^TEul ^´­—çq<Üÿ-¯+ž4ÛŸ^êJìZá­¡'+ŽÊÕJuˆá‚Ç­+~¨ìóh~)à‡A¤ž¢(ÚçèÚØJUË€/)²|(8îñ¨¿‚Å_ Ñúõ@ €Ërs»îX ˆ—#®#>|:+CƒMü\ûÅðêUT°ÎšÍOa\ŸÊTÅId`Éÿ!)µkâºüzwˆÔ|êˆ  •Dà^ ½Z£d²Më³åø°Áaÿü23T„Šv0¬­Yäð #54.qþê1œß(.¸2Òê°!w@BS]×kl,¨ÊEX›Ý¯¾ÜWÀSÇ«GôV h›À JJ”ðú»,aüø‡´Oe=²§ùsõB.-9É?…–ZEè·v"‚‹ÏCÿ£3N©eçí û9–¹ŒäˆÊæ9a#Þò4)CË;ùW¦5Á™-öO­¥DÉ¢Ra‰¶µºçiN¿°4ÿ!VV(䂸„ih%tL_ܶ?ó&·ç\cT ´1rÕ¤‹©Â–C|YÙEoç“âÙšFæm†‰bégâáH:ÏwüØ'Ѐ±ÇPzüܯ*ªÍÅë¯Ö:N­/jÛÆÜ„PÏHEÆSsÏùo’OÜ¡³Þ+"¡&íÌß èæEÍÞè„Ðg­ &ÜMÖOßõ!pú7ØÉ¯2­Ž!l3YÅB!6tÓº²vo›·ãfÜg+/“ácÒË`Èqèa;žñËxù<ý}(ìšLÐöBýÊ”ˆ;ÍÖL„ê(õ~D™êq¢˜M©Çá5b*àÎöæÞúŸ{ôÚ8iøxÃk|ƒ¬n›Ôš…ÒÚE_SXï=ˆ÷ãf+¤m"ðÞзs®õ:é‹ÜKÎÑ4åÖ·!D›ÕñØúÀHþæ1}’  C ej»ÌO²oDª­2Œ°š@Þ­ªÄhGO‹& fÑŒx\q¨åÓH*“«×EãñÎŽ`ghÕ`Uð1í$!7³NN¬âä–NM•)ña{®yµWϺç)®‘nS˜~Ø€gÆI ôÈû8³¶}ÊàL‡TòíÌF¯C0‘;pŒ/h° [Ç.ùõ§¨²B4 '…¡ºtdˆÀ4¡~0$îãò†W`TAj@qy‹2 UÉl\²lå¯ì×½T¤Š]×ÈÌO“bq<1~úÂfÍÊ’ì—W¨8’…­¶ÓÃI¿ÞK?›@‹§² WSuÝG4W¿! ÍrÞø§ˆ(ªyô[üÚ´æ»Ú•ã¨öï¶aÎûBá±j{6úMóT÷¶×9—0:'@:5+¹×ñ®¶ëde=—'’M•~‚†L=F¾‘d cƒ~N¬5s²czçR5$þ'6«3yi@1¼¢r¤y¬ƒÒNXr˜‡š¦ù‘÷·HQ¢H9=WZ8 ¦ú;M/åEÔ±²ïp ʹ1M„òÒñžT;¨ÙŸ[bÙøøáïj ù¶–è.h¶íùÂ’í1§O d6ä2Ó•€Sõ„ Ò¸oMîî›@¢ŸqþŸ6²PËH¶4ß`ŽÞ,A»ªõÑôòï$ApC“"€»¨?'æh±fl²!‰ ·âGTW ï&ù®®Ó|®í \͹„²Rªä°õEódø ¸I)T€r¦X(±0~18²’ÀVÅTLþÇÆŽC‰ÕÅRMº(v¬|ŒQ|Þ¸V-'±é·ÞóVÈTú¦Jeˆ«Ôa‡ˆur Ûõ¤)gˆµæÂi{Ç¢VP€ææp¸D7ý™ÑÍH¸p½÷öÙt£¿# rKاjŠ-üòPýñöÕe©,´“ föö’ ^~ à å‡8q¤Â麈^ñLŽq–}¨Bƒ CáÛ–åÊ— >²–{lõᾃËS×ê&“Uq/û"ƒèÆåc@b³Ó­SÞâÉsøq‰›ÕûºD ) N›^è—t2¬UÓpÓcolêâæë µõ&-\Üþ»Ö-U¾þÔì̧A­ >˜ÖO¯îì¦0{ˆcY[GÜ 9èpa0õƒÑßœÀƒwsi‘÷ëÛÇ* tô†tŸš…  [¥wÝÙ.Ÿ+$è+ÚÓ_ý¤iÌÕKÕ6(ý"oˆ¦—2'å™GÉž?IHééæóP´¾÷‡ʧ)ê^pA9"?kòowÖÕ—Ÿ†_²;tÊ+ioáÜ‚•êú _ÏfZYX/JÿŠPžUºÐ±;Äó™Ã¾¨5ÃÎ~¢M~;-5”äÖ$„€`3’’˜à0ßnpöã¤ÒE›­ðÆúb89qÄZ¥| ž½¢ MæƒVþu–/÷Š#ÇÍKáZ…hyœñ¼+Ó«†NM²×ö@/.DJŽ`D¿‰o !µãmYgKà”‹ù÷ÿ•£B}ôçüÂÛZ = U³W¯Û䉊ù¥tàC½^¦W QŒÝ›îl6;¹E& ˆÈš.®*·Kcî):+©†¸uó‘=t‹b'´á": EúPjAõ¶Õ ª±E@ ûõo`¦iqKQ`_`+§|,33yºGÖÿÚæa#^¸“¯™ÆÀ¤Çð—àBÝ®éãó8OÝòUÐÇ3&]¥§J°Æ$h ‹YH<(|í HhtÊc­µ YjCorpôaá‘Ögnj/#;ÌèâCŠ7±]c¥£ÿ|I4aü½ï¯kÅ3|M&ïæ†Àh¿}®²L¸­¿‚fµÝ¤TíR8g¤=Œë&í‰A¬ >ª¢Ûd÷C{z‰-6ð7Tœçܧž p"ÿ²±(¯Ÿûº`h/áw»7¢»ªîÈ” û½U6´‹°ÚS +ÑT~¯Tç°Ç&µÖªñ˜ü¶×êI z {çNÊ€‘±6qZü(úX(ø¢ZyÁ´~´ãÅ¥ÙÛØ§°ÞÊ›H#æPÞ ½¨©5¯O3þU¬–.œ) @X±®Kàð`ç0’’A©2ã?Â’§¤1à*\Ü& Ï×ò•Es”òœ³e»`Ž-Ä_ø£½—†›}t`òC;]t:ü#?=*rež‡¾ZNžÿµ×Þ ÞÏ-aæ:-ƒ;ž""·È¶ êÝ'(ž¶b—PÝò$&¦‰É&ŸydÌG­<‡#{BŸí’Tdõ/úYýþª·Áè`þÜ(JæsmjžãdàѦÞ#¶«âÝ]¹CÑdH€ Aþ–/“6óN#廄ìØ~L´Zî{u”õ¬ Ã!÷9Ïô—LKº÷i7µucÞ>OàáøvI7Ö&^’ÎxP˜Õ•éAN»²Ÿ:+(Ìíû2®»]Iï[ʵ`ùø¯à?B`î`iêêîôÃÔÕð?áìendstream endobj 954 0 obj << /Type /Font /Subtype /Type1 /Encoding 2824 0 R /FirstChar 2 /LastChar 151 /Widths 2841 0 R /BaseFont /SMOMGB+URWPalladioL-Bold /FontDescriptor 952 0 R >> endobj 952 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 /FontName /SMOMGB+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash) /FontFile 953 0 R >> endobj 2841 0 obj [611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ] endobj 955 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [946 0 R 972 0 R 982 0 R 1037 0 R 1101 0 R 1164 0 R] >> endobj 1246 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [1226 0 R 1248 0 R 1260 0 R 1273 0 R 1284 0 R 1291 0 R] >> endobj 1307 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [1303 0 R 1309 0 R 1317 0 R 1326 0 R 1336 0 R 1344 0 R] >> endobj 1354 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [1351 0 R 1357 0 R 1379 0 R 1392 0 R 1398 0 R 1402 0 R] >> endobj 1415 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [1407 0 R 1417 0 R 1426 0 R 1433 0 R 1439 0 R 1443 0 R] >> endobj 1462 0 obj << /Type /Pages /Count 6 /Parent 2842 0 R /Kids [1453 0 R 1466 0 R 1474 0 R 1484 0 R 1493 0 R 1499 0 R] >> endobj 1509 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1505 0 R 1511 0 R 1520 0 R 1526 0 R 1532 0 R 1541 0 R] >> endobj 1551 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1548 0 R 1553 0 R 1563 0 R 1567 0 R 1574 0 R 1583 0 R] >> endobj 1597 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1591 0 R 1600 0 R 1612 0 R 1618 0 R 1624 0 R 1630 0 R] >> endobj 1638 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1634 0 R 1640 0 R 1646 0 R 1657 0 R 1661 0 R 1665 0 R] >> endobj 1673 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1669 0 R 1675 0 R 1679 0 R 1685 0 R 1690 0 R 1695 0 R] >> endobj 1706 0 obj << /Type /Pages /Count 6 /Parent 2843 0 R /Kids [1701 0 R 1708 0 R 1718 0 R 1722 0 R 1726 0 R 1730 0 R] >> endobj 1745 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1740 0 R 1747 0 R 1755 0 R 1760 0 R 1764 0 R 1768 0 R] >> endobj 1781 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1774 0 R 1783 0 R 1788 0 R 1796 0 R 1801 0 R 1808 0 R] >> endobj 1818 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1813 0 R 1821 0 R 1828 0 R 1832 0 R 1836 0 R 1840 0 R] >> endobj 1850 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1846 0 R 1852 0 R 1856 0 R 1861 0 R 1865 0 R 1870 0 R] >> endobj 1886 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1875 0 R 1888 0 R 1896 0 R 1901 0 R 1905 0 R 1909 0 R] >> endobj 1916 0 obj << /Type /Pages /Count 6 /Parent 2844 0 R /Kids [1913 0 R 1918 0 R 1926 0 R 1930 0 R 1941 0 R 1959 0 R] >> endobj 1988 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [1973 0 R 1990 0 R 2001 0 R 2007 0 R 2011 0 R 2021 0 R] >> endobj 2032 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [2027 0 R 2034 0 R 2044 0 R 2056 0 R 2064 0 R 2072 0 R] >> endobj 2083 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [2076 0 R 2085 0 R 2093 0 R 2105 0 R 2112 0 R 2120 0 R] >> endobj 2135 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [2126 0 R 2137 0 R 2141 0 R 2145 0 R 2156 0 R 2160 0 R] >> endobj 2176 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [2167 0 R 2178 0 R 2237 0 R 2293 0 R 2347 0 R 2382 0 R] >> endobj 2397 0 obj << /Type /Pages /Count 6 /Parent 2845 0 R /Kids [2390 0 R 2399 0 R 2406 0 R 2411 0 R 2417 0 R 2421 0 R] >> endobj 2435 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2430 0 R 2437 0 R 2442 0 R 2446 0 R 2450 0 R 2459 0 R] >> endobj 2477 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2467 0 R 2479 0 R 2490 0 R 2497 0 R 2506 0 R 2518 0 R] >> endobj 2529 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2524 0 R 2531 0 R 2541 0 R 2545 0 R 2550 0 R 2556 0 R] >> endobj 2576 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2567 0 R 2578 0 R 2584 0 R 2595 0 R 2599 0 R 2603 0 R] >> endobj 2612 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2607 0 R 2614 0 R 2624 0 R 2635 0 R 2647 0 R 2651 0 R] >> endobj 2666 0 obj << /Type /Pages /Count 6 /Parent 2846 0 R /Kids [2658 0 R 2668 0 R 2672 0 R 2679 0 R 2693 0 R 2699 0 R] >> endobj 2708 0 obj << /Type /Pages /Count 6 /Parent 2847 0 R /Kids [2704 0 R 2710 0 R 2718 0 R 2726 0 R 2730 0 R 2734 0 R] >> endobj 2748 0 obj << /Type /Pages /Count 6 /Parent 2847 0 R /Kids [2740 0 R 2750 0 R 2756 0 R 2767 0 R 2777 0 R 2785 0 R] >> endobj 2812 0 obj << /Type /Pages /Count 2 /Parent 2847 0 R /Kids [2800 0 R 2814 0 R] >> endobj 2842 0 obj << /Type /Pages /Count 36 /Parent 2848 0 R /Kids [955 0 R 1246 0 R 1307 0 R 1354 0 R 1415 0 R 1462 0 R] >> endobj 2843 0 obj << /Type /Pages /Count 36 /Parent 2848 0 R /Kids [1509 0 R 1551 0 R 1597 0 R 1638 0 R 1673 0 R 1706 0 R] >> endobj 2844 0 obj << /Type /Pages /Count 36 /Parent 2848 0 R /Kids [1745 0 R 1781 0 R 1818 0 R 1850 0 R 1886 0 R 1916 0 R] >> endobj 2845 0 obj << /Type /Pages /Count 36 /Parent 2848 0 R /Kids [1988 0 R 2032 0 R 2083 0 R 2135 0 R 2176 0 R 2397 0 R] >> endobj 2846 0 obj << /Type /Pages /Count 36 /Parent 2848 0 R /Kids [2435 0 R 2477 0 R 2529 0 R 2576 0 R 2612 0 R 2666 0 R] >> endobj 2847 0 obj << /Type /Pages /Count 14 /Parent 2848 0 R /Kids [2708 0 R 2748 0 R 2812 0 R] >> endobj 2848 0 obj << /Type /Pages /Count 194 /Kids [2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R 2847 0 R] >> endobj 2849 0 obj << /Type /Outlines /First 7 0 R /Last 847 0 R /Count 10 >> endobj 943 0 obj << /Title 944 0 R /A 941 0 R /Parent 847 0 R /Prev 939 0 R >> endobj 939 0 obj << /Title 940 0 R /A 937 0 R /Parent 847 0 R /Prev 935 0 R /Next 943 0 R >> endobj 935 0 obj << /Title 936 0 R /A 933 0 R /Parent 847 0 R /Prev 931 0 R /Next 939 0 R >> endobj 931 0 obj << /Title 932 0 R /A 929 0 R /Parent 847 0 R /Prev 927 0 R /Next 935 0 R >> endobj 927 0 obj << /Title 928 0 R /A 925 0 R /Parent 847 0 R /Prev 923 0 R /Next 931 0 R >> endobj 923 0 obj << /Title 924 0 R /A 921 0 R /Parent 847 0 R /Prev 919 0 R /Next 927 0 R >> endobj 919 0 obj << /Title 920 0 R /A 917 0 R /Parent 847 0 R /Prev 915 0 R /Next 923 0 R >> endobj 915 0 obj << /Title 916 0 R /A 913 0 R /Parent 847 0 R /Prev 911 0 R /Next 919 0 R >> endobj 911 0 obj << /Title 912 0 R /A 909 0 R /Parent 847 0 R /Prev 907 0 R /Next 915 0 R >> endobj 907 0 obj << /Title 908 0 R /A 905 0 R /Parent 847 0 R /Prev 903 0 R /Next 911 0 R >> endobj 903 0 obj << /Title 904 0 R /A 901 0 R /Parent 847 0 R /Prev 899 0 R /Next 907 0 R >> endobj 899 0 obj << /Title 900 0 R /A 897 0 R /Parent 847 0 R /Prev 895 0 R /Next 903 0 R >> endobj 895 0 obj << /Title 896 0 R /A 893 0 R /Parent 847 0 R /Prev 891 0 R /Next 899 0 R >> endobj 891 0 obj << /Title 892 0 R /A 889 0 R /Parent 847 0 R /Prev 887 0 R /Next 895 0 R >> endobj 887 0 obj << /Title 888 0 R /A 885 0 R /Parent 847 0 R /Prev 883 0 R /Next 891 0 R >> endobj 883 0 obj << /Title 884 0 R /A 881 0 R /Parent 847 0 R /Prev 879 0 R /Next 887 0 R >> endobj 879 0 obj << /Title 880 0 R /A 877 0 R /Parent 847 0 R /Prev 875 0 R /Next 883 0 R >> endobj 875 0 obj << /Title 876 0 R /A 873 0 R /Parent 847 0 R /Prev 871 0 R /Next 879 0 R >> endobj 871 0 obj << /Title 872 0 R /A 869 0 R /Parent 847 0 R /Prev 867 0 R /Next 875 0 R >> endobj 867 0 obj << /Title 868 0 R /A 865 0 R /Parent 847 0 R /Prev 863 0 R /Next 871 0 R >> endobj 863 0 obj << /Title 864 0 R /A 861 0 R /Parent 847 0 R /Prev 859 0 R /Next 867 0 R >> endobj 859 0 obj << /Title 860 0 R /A 857 0 R /Parent 847 0 R /Prev 855 0 R /Next 863 0 R >> endobj 855 0 obj << /Title 856 0 R /A 853 0 R /Parent 847 0 R /Prev 851 0 R /Next 859 0 R >> endobj 851 0 obj << /Title 852 0 R /A 849 0 R /Parent 847 0 R /Next 855 0 R >> endobj 847 0 obj << /Title 848 0 R /A 845 0 R /Parent 2849 0 R /Prev 755 0 R /First 851 0 R /Last 943 0 R /Count -24 >> endobj 843 0 obj << /Title 844 0 R /A 841 0 R /Parent 791 0 R /Prev 815 0 R >> endobj 839 0 obj << /Title 840 0 R /A 837 0 R /Parent 815 0 R /Prev 835 0 R >> endobj 835 0 obj << /Title 836 0 R /A 833 0 R /Parent 815 0 R /Prev 831 0 R /Next 839 0 R >> endobj 831 0 obj << /Title 832 0 R /A 829 0 R /Parent 815 0 R /Prev 827 0 R /Next 835 0 R >> endobj 827 0 obj << /Title 828 0 R /A 825 0 R /Parent 815 0 R /Prev 823 0 R /Next 831 0 R >> endobj 823 0 obj << /Title 824 0 R /A 821 0 R /Parent 815 0 R /Prev 819 0 R /Next 827 0 R >> endobj 819 0 obj << /Title 820 0 R /A 817 0 R /Parent 815 0 R /Next 823 0 R >> endobj 815 0 obj << /Title 816 0 R /A 813 0 R /Parent 791 0 R /Prev 811 0 R /Next 843 0 R /First 819 0 R /Last 839 0 R /Count -6 >> endobj 811 0 obj << /Title 812 0 R /A 809 0 R /Parent 791 0 R /Prev 807 0 R /Next 815 0 R >> endobj 807 0 obj << /Title 808 0 R /A 805 0 R /Parent 791 0 R /Prev 803 0 R /Next 811 0 R >> endobj 803 0 obj << /Title 804 0 R /A 801 0 R /Parent 791 0 R /Prev 799 0 R /Next 807 0 R >> endobj 799 0 obj << /Title 800 0 R /A 797 0 R /Parent 791 0 R /Prev 795 0 R /Next 803 0 R >> endobj 795 0 obj << /Title 796 0 R /A 793 0 R /Parent 791 0 R /Next 799 0 R >> endobj 791 0 obj << /Title 792 0 R /A 789 0 R /Parent 755 0 R /Prev 775 0 R /First 795 0 R /Last 843 0 R /Count -7 >> endobj 787 0 obj << /Title 788 0 R /A 785 0 R /Parent 775 0 R /Prev 783 0 R >> endobj 783 0 obj << /Title 784 0 R /A 781 0 R /Parent 775 0 R /Prev 779 0 R /Next 787 0 R >> endobj 779 0 obj << /Title 780 0 R /A 777 0 R /Parent 775 0 R /Next 783 0 R >> endobj 775 0 obj << /Title 776 0 R /A 773 0 R /Parent 755 0 R /Prev 767 0 R /Next 791 0 R /First 779 0 R /Last 787 0 R /Count -3 >> endobj 771 0 obj << /Title 772 0 R /A 769 0 R /Parent 767 0 R >> endobj 767 0 obj << /Title 768 0 R /A 765 0 R /Parent 755 0 R /Prev 759 0 R /Next 775 0 R /First 771 0 R /Last 771 0 R /Count -1 >> endobj 763 0 obj << /Title 764 0 R /A 761 0 R /Parent 759 0 R >> endobj 759 0 obj << /Title 760 0 R /A 757 0 R /Parent 755 0 R /Next 767 0 R /First 763 0 R /Last 763 0 R /Count -1 >> endobj 755 0 obj << /Title 756 0 R /A 753 0 R /Parent 2849 0 R /Prev 735 0 R /Next 847 0 R /First 759 0 R /Last 791 0 R /Count -4 >> endobj 751 0 obj << /Title 752 0 R /A 749 0 R /Parent 735 0 R /Prev 747 0 R >> endobj 747 0 obj << /Title 748 0 R /A 745 0 R /Parent 735 0 R /Prev 739 0 R /Next 751 0 R >> endobj 743 0 obj << /Title 744 0 R /A 741 0 R /Parent 739 0 R >> endobj 739 0 obj << /Title 740 0 R /A 737 0 R /Parent 735 0 R /Next 747 0 R /First 743 0 R /Last 743 0 R /Count -1 >> endobj 735 0 obj << /Title 736 0 R /A 733 0 R /Parent 2849 0 R /Prev 711 0 R /Next 755 0 R /First 739 0 R /Last 751 0 R /Count -3 >> endobj 731 0 obj << /Title 732 0 R /A 729 0 R /Parent 711 0 R /Prev 719 0 R >> endobj 727 0 obj << /Title 728 0 R /A 725 0 R /Parent 719 0 R /Prev 723 0 R >> endobj 723 0 obj << /Title 724 0 R /A 721 0 R /Parent 719 0 R /Next 727 0 R >> endobj 719 0 obj << /Title 720 0 R /A 717 0 R /Parent 711 0 R /Prev 715 0 R /Next 731 0 R /First 723 0 R /Last 727 0 R /Count -2 >> endobj 715 0 obj << /Title 716 0 R /A 713 0 R /Parent 711 0 R /Next 719 0 R >> endobj 711 0 obj << /Title 712 0 R /A 709 0 R /Parent 2849 0 R /Prev 363 0 R /Next 735 0 R /First 715 0 R /Last 731 0 R /Count -3 >> endobj 707 0 obj << /Title 708 0 R /A 705 0 R /Parent 687 0 R /Prev 703 0 R >> endobj 703 0 obj << /Title 704 0 R /A 701 0 R /Parent 687 0 R /Prev 699 0 R /Next 707 0 R >> endobj 699 0 obj << /Title 700 0 R /A 697 0 R /Parent 687 0 R /Prev 695 0 R /Next 703 0 R >> endobj 695 0 obj << /Title 696 0 R /A 693 0 R /Parent 687 0 R /Prev 691 0 R /Next 699 0 R >> endobj 691 0 obj << /Title 692 0 R /A 689 0 R /Parent 687 0 R /Next 695 0 R >> endobj 687 0 obj << /Title 688 0 R /A 685 0 R /Parent 679 0 R /Prev 683 0 R /First 691 0 R /Last 707 0 R /Count -5 >> endobj 683 0 obj << /Title 684 0 R /A 681 0 R /Parent 679 0 R /Next 687 0 R >> endobj 679 0 obj << /Title 680 0 R /A 677 0 R /Parent 363 0 R /Prev 623 0 R /First 683 0 R /Last 687 0 R /Count -2 >> endobj 675 0 obj << /Title 676 0 R /A 673 0 R /Parent 623 0 R /Prev 671 0 R >> endobj 671 0 obj << /Title 672 0 R /A 669 0 R /Parent 623 0 R /Prev 651 0 R /Next 675 0 R >> endobj 667 0 obj << /Title 668 0 R /A 665 0 R /Parent 651 0 R /Prev 663 0 R >> endobj 663 0 obj << /Title 664 0 R /A 661 0 R /Parent 651 0 R /Prev 659 0 R /Next 667 0 R >> endobj 659 0 obj << /Title 660 0 R /A 657 0 R /Parent 651 0 R /Prev 655 0 R /Next 663 0 R >> endobj 655 0 obj << /Title 656 0 R /A 653 0 R /Parent 651 0 R /Next 659 0 R >> endobj 651 0 obj << /Title 652 0 R /A 649 0 R /Parent 623 0 R /Prev 647 0 R /Next 671 0 R /First 655 0 R /Last 667 0 R /Count -4 >> endobj 647 0 obj << /Title 648 0 R /A 645 0 R /Parent 623 0 R /Prev 643 0 R /Next 651 0 R >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R /Parent 623 0 R /Prev 639 0 R /Next 647 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R /Parent 623 0 R /Prev 627 0 R /Next 643 0 R >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R /Parent 627 0 R /Prev 631 0 R >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R /Parent 627 0 R /Next 635 0 R >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R /Parent 623 0 R /Next 639 0 R /First 631 0 R /Last 635 0 R /Count -2 >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R /Parent 363 0 R /Prev 395 0 R /Next 679 0 R /First 627 0 R /Last 675 0 R /Count -7 >> endobj 619 0 obj << /Title 620 0 R /A 617 0 R /Parent 603 0 R /Prev 615 0 R >> endobj 615 0 obj << /Title 616 0 R /A 613 0 R /Parent 603 0 R /Prev 611 0 R /Next 619 0 R >> endobj 611 0 obj << /Title 612 0 R /A 609 0 R /Parent 603 0 R /Prev 607 0 R /Next 615 0 R >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R /Parent 603 0 R /Next 611 0 R >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R /Parent 395 0 R /Prev 599 0 R /First 607 0 R /Last 619 0 R /Count -4 >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R /Parent 395 0 R /Prev 595 0 R /Next 603 0 R >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R /Parent 395 0 R /Prev 591 0 R /Next 599 0 R >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R /Parent 395 0 R /Prev 587 0 R /Next 595 0 R >> endobj 587 0 obj << /Title 588 0 R /A 585 0 R /Parent 395 0 R /Prev 583 0 R /Next 591 0 R >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R /Parent 395 0 R /Prev 579 0 R /Next 587 0 R >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R /Parent 395 0 R /Prev 575 0 R /Next 583 0 R >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R /Parent 395 0 R /Prev 571 0 R /Next 579 0 R >> endobj 571 0 obj << /Title 572 0 R /A 569 0 R /Parent 395 0 R /Prev 567 0 R /Next 575 0 R >> endobj 567 0 obj << /Title 568 0 R /A 565 0 R /Parent 395 0 R /Prev 563 0 R /Next 571 0 R >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R /Parent 395 0 R /Prev 559 0 R /Next 567 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R /Parent 395 0 R /Prev 471 0 R /Next 563 0 R >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R /Parent 471 0 R /Prev 551 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R /Parent 471 0 R /Prev 547 0 R /Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R /Parent 471 0 R /Prev 543 0 R /Next 551 0 R >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R /Parent 471 0 R /Prev 539 0 R /Next 547 0 R >> endobj 539 0 obj << /Title 540 0 R /A 537 0 R /Parent 471 0 R /Prev 535 0 R /Next 543 0 R >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R /Parent 471 0 R /Prev 531 0 R /Next 539 0 R >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R /Parent 471 0 R /Prev 527 0 R /Next 535 0 R >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R /Parent 471 0 R /Prev 523 0 R /Next 531 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R /Parent 471 0 R /Prev 519 0 R /Next 527 0 R >> endobj 519 0 obj << /Title 520 0 R /A 517 0 R /Parent 471 0 R /Prev 515 0 R /Next 523 0 R >> endobj 515 0 obj << /Title 516 0 R /A 513 0 R /Parent 471 0 R /Prev 511 0 R /Next 519 0 R >> endobj 511 0 obj << /Title 512 0 R /A 509 0 R /Parent 471 0 R /Prev 507 0 R /Next 515 0 R >> endobj 507 0 obj << /Title 508 0 R /A 505 0 R /Parent 471 0 R /Prev 503 0 R /Next 511 0 R >> endobj 503 0 obj << /Title 504 0 R /A 501 0 R /Parent 471 0 R /Prev 499 0 R /Next 507 0 R >> endobj 499 0 obj << /Title 500 0 R /A 497 0 R /Parent 471 0 R /Prev 495 0 R /Next 503 0 R >> endobj 495 0 obj << /Title 496 0 R /A 493 0 R /Parent 471 0 R /Prev 491 0 R /Next 499 0 R >> endobj 491 0 obj << /Title 492 0 R /A 489 0 R /Parent 471 0 R /Prev 487 0 R /Next 495 0 R >> endobj 487 0 obj << /Title 488 0 R /A 485 0 R /Parent 471 0 R /Prev 483 0 R /Next 491 0 R >> endobj 483 0 obj << /Title 484 0 R /A 481 0 R /Parent 471 0 R /Prev 479 0 R /Next 487 0 R >> endobj 479 0 obj << /Title 480 0 R /A 477 0 R /Parent 471 0 R /Prev 475 0 R /Next 483 0 R >> endobj 475 0 obj << /Title 476 0 R /A 473 0 R /Parent 471 0 R /Next 479 0 R >> endobj 471 0 obj << /Title 472 0 R /A 469 0 R /Parent 395 0 R /Prev 467 0 R /Next 559 0 R /First 475 0 R /Last 555 0 R /Count -21 >> endobj 467 0 obj << /Title 468 0 R /A 465 0 R /Parent 395 0 R /Prev 463 0 R /Next 471 0 R >> endobj 463 0 obj << /Title 464 0 R /A 461 0 R /Parent 395 0 R /Prev 459 0 R /Next 467 0 R >> endobj 459 0 obj << /Title 460 0 R /A 457 0 R /Parent 395 0 R /Prev 455 0 R /Next 463 0 R >> endobj 455 0 obj << /Title 456 0 R /A 453 0 R /Parent 395 0 R /Prev 451 0 R /Next 459 0 R >> endobj 451 0 obj << /Title 452 0 R /A 449 0 R /Parent 395 0 R /Prev 435 0 R /Next 455 0 R >> endobj 447 0 obj << /Title 448 0 R /A 445 0 R /Parent 435 0 R /Prev 443 0 R >> endobj 443 0 obj << /Title 444 0 R /A 441 0 R /Parent 435 0 R /Prev 439 0 R /Next 447 0 R >> endobj 439 0 obj << /Title 440 0 R /A 437 0 R /Parent 435 0 R /Next 443 0 R >> endobj 435 0 obj << /Title 436 0 R /A 433 0 R /Parent 395 0 R /Prev 431 0 R /Next 451 0 R /First 439 0 R /Last 447 0 R /Count -3 >> endobj 431 0 obj << /Title 432 0 R /A 429 0 R /Parent 395 0 R /Prev 427 0 R /Next 435 0 R >> endobj 427 0 obj << /Title 428 0 R /A 425 0 R /Parent 395 0 R /Prev 423 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R /Parent 395 0 R /Prev 419 0 R /Next 427 0 R >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R /Parent 395 0 R /Prev 415 0 R /Next 423 0 R >> endobj 415 0 obj << /Title 416 0 R /A 413 0 R /Parent 395 0 R /Prev 411 0 R /Next 419 0 R >> endobj 411 0 obj << /Title 412 0 R /A 409 0 R /Parent 395 0 R /Prev 407 0 R /Next 415 0 R >> endobj 407 0 obj << /Title 408 0 R /A 405 0 R /Parent 395 0 R /Prev 403 0 R /Next 411 0 R >> endobj 403 0 obj << /Title 404 0 R /A 401 0 R /Parent 395 0 R /Prev 399 0 R /Next 407 0 R >> endobj 399 0 obj << /Title 400 0 R /A 397 0 R /Parent 395 0 R /Next 403 0 R >> endobj 395 0 obj << /Title 396 0 R /A 393 0 R /Parent 363 0 R /Prev 367 0 R /Next 623 0 R /First 399 0 R /Last 603 0 R /Count -28 >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R /Parent 383 0 R /Prev 387 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R /Parent 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R /Parent 367 0 R /Prev 371 0 R /First 387 0 R /Last 391 0 R /Count -2 >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R /Parent 371 0 R /Prev 375 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R /Parent 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R /Parent 367 0 R /Next 383 0 R /First 375 0 R /Last 379 0 R /Count -2 >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R /Parent 363 0 R /Next 395 0 R /First 371 0 R /Last 383 0 R /Count -2 >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R /Parent 2849 0 R /Prev 351 0 R /Next 711 0 R /First 367 0 R /Last 679 0 R /Count -4 >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R /Parent 351 0 R /Prev 355 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R /Parent 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R /Parent 2849 0 R /Prev 131 0 R /Next 363 0 R /First 355 0 R /Last 359 0 R /Count -2 >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 339 0 R /Prev 343 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R /Parent 339 0 R /Next 347 0 R >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R /Parent 131 0 R /Prev 287 0 R /First 343 0 R /Last 347 0 R /Count -2 >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R /Parent 287 0 R /Prev 331 0 R >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R /Parent 287 0 R /Prev 327 0 R /Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R /Parent 287 0 R /Prev 323 0 R /Next 331 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 287 0 R /Prev 307 0 R /Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R /Parent 307 0 R /Prev 315 0 R >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R /Parent 307 0 R /Prev 311 0 R /Next 319 0 R >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R /Parent 307 0 R /Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R /Parent 287 0 R /Prev 291 0 R /Next 323 0 R /First 311 0 R /Last 319 0 R /Count -3 >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R /Parent 291 0 R /Prev 299 0 R >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R /Parent 291 0 R /Prev 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R /Parent 291 0 R /Next 299 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R /Parent 287 0 R /Next 307 0 R /First 295 0 R /Last 303 0 R /Count -3 >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R /Parent 131 0 R /Prev 275 0 R /Next 339 0 R /First 291 0 R /Last 335 0 R /Count -6 >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R /Parent 275 0 R /Prev 279 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R /Parent 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R /Parent 131 0 R /Prev 219 0 R /Next 287 0 R /First 279 0 R /Last 283 0 R /Count -2 >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R /Parent 219 0 R /Prev 267 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R /Parent 219 0 R /Prev 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R /Parent 219 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R /Parent 219 0 R /Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R /Parent 219 0 R /Prev 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R /Parent 219 0 R /Prev 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R /Parent 219 0 R /Prev 243 0 R /Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R /Parent 219 0 R /Prev 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 219 0 R /Prev 235 0 R /Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 219 0 R /Prev 231 0 R /Next 239 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 219 0 R /Prev 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 219 0 R /Prev 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 131 0 R /Prev 203 0 R /Next 275 0 R /First 223 0 R /Last 271 0 R /Count -13 >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 203 0 R /Prev 211 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 203 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 131 0 R /Prev 199 0 R /Next 219 0 R /First 207 0 R /Last 215 0 R /Count -3 >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 131 0 R /Prev 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 131 0 R /Prev 159 0 R /Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 159 0 R /Prev 187 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 159 0 R /Prev 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 159 0 R /Prev 179 0 R /Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 159 0 R /Prev 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 159 0 R /Prev 163 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 163 0 R /Prev 167 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 159 0 R /Next 175 0 R /First 167 0 R /Last 171 0 R /Count -2 >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 131 0 R /Prev 151 0 R /Next 195 0 R /First 163 0 R /Last 191 0 R /Count -6 >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 151 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 131 0 R /Prev 147 0 R /Next 159 0 R /First 155 0 R /Last 155 0 R /Count -1 >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 131 0 R /Prev 139 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 139 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 131 0 R /Prev 135 0 R /Next 147 0 R /First 143 0 R /Last 143 0 R /Count -1 >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 2849 0 R /Prev 91 0 R /Next 351 0 R /First 135 0 R /Last 339 0 R /Count -12 >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 111 0 R /Prev 115 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 115 0 R /Prev 119 0 R >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 115 0 R /Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 111 0 R /Next 127 0 R /First 119 0 R /Last 123 0 R /Count -2 >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 91 0 R /Prev 107 0 R /First 115 0 R /Last 127 0 R /Count -2 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 91 0 R /Prev 95 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 95 0 R /Prev 99 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 91 0 R /Next 107 0 R /First 99 0 R /Last 103 0 R /Count -2 >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 2849 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R /Last 111 0 R /Count -3 >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 67 0 R /Prev 83 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 67 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 67 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 67 0 R /Prev 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 2849 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R /Last 87 0 R /Count -5 >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 23 0 R /Prev 55 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 55 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 23 0 R /Prev 39 0 R /Next 63 0 R /First 59 0 R /Last 59 0 R /Count -1 >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 39 0 R /Prev 47 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 39 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 23 0 R /Prev 35 0 R /Next 55 0 R /First 43 0 R /Last 51 0 R /Count -3 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 23 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 23 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 7 0 R /Prev 19 0 R /First 27 0 R /Last 63 0 R /Count -6 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 2849 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj 2850 0 obj << /Names [(Access_Control_Lists) 2124 0 R (Bv9ARM.ch01) 1250 0 R (Bv9ARM.ch02) 1294 0 R (Bv9ARM.ch03) 1312 0 R (Bv9ARM.ch04) 1360 0 R (Bv9ARM.ch05) 1544 0 R (Bv9ARM.ch06) 1556 0 R (Bv9ARM.ch07) 2123 0 R (Bv9ARM.ch08) 2148 0 R (Bv9ARM.ch09) 2163 0 R (Bv9ARM.ch10) 2424 0 R (Configuration_File_Grammar) 1579 0 R (DNSSEC) 1430 0 R (Doc-Start) 951 0 R (Setting_TTLs) 2049 0 R (acache) 1301 0 R (access_control) 1743 0 R (acl) 1587 0 R (address_match_lists) 1561 0 R (admin_tools) 1334 0 R (appendix.A) 754 0 R (appendix.B) 846 0 R (bibliography) 2171 0 R (bind9.library) 2380 0 R (boolean_options) 1375 0 R (builtin) 1817 0 R (chapter*.1) 985 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 350 0 R (chapter.6) 362 0 R (chapter.7) 710 0 R (chapter.8) 734 0 R (cite.RFC1033) 2299 0 R (cite.RFC1034) 2184 0 R (cite.RFC1035) 2186 0 R (cite.RFC1101) 2281 0 R (cite.RFC1123) 2283 0 R (cite.RFC1183) 2243 0 R (cite.RFC1464) 2321 0 R (cite.RFC1535) 2229 0 R (cite.RFC1536) 2231 0 R (cite.RFC1537) 2301 0 R (cite.RFC1591) 2285 0 R (cite.RFC1706) 2245 0 R (cite.RFC1712) 2341 0 R (cite.RFC1713) 2323 0 R (cite.RFC1794) 2325 0 R (cite.RFC1876) 2247 0 R (cite.RFC1912) 2303 0 R (cite.RFC1982) 2233 0 R (cite.RFC1995) 2191 0 R (cite.RFC1996) 2193 0 R (cite.RFC2010) 2305 0 R (cite.RFC2052) 2249 0 R (cite.RFC2065) 2353 0 R (cite.RFC2136) 2195 0 R (cite.RFC2137) 2355 0 R (cite.RFC2163) 2251 0 R (cite.RFC2168) 2253 0 R (cite.RFC2181) 2197 0 R (cite.RFC2219) 2307 0 R (cite.RFC2230) 2255 0 R (cite.RFC2240) 2327 0 R (cite.RFC2308) 2199 0 R (cite.RFC2317) 2287 0 R (cite.RFC2345) 2329 0 R (cite.RFC2352) 2331 0 R (cite.RFC2535) 2357 0 R (cite.RFC2536) 2257 0 R (cite.RFC2537) 2259 0 R (cite.RFC2538) 2261 0 R (cite.RFC2539) 2263 0 R (cite.RFC2540) 2265 0 R (cite.RFC2671) 2201 0 R (cite.RFC2672) 2203 0 R (cite.RFC2673) 2343 0 R (cite.RFC2782) 2267 0 R (cite.RFC2825) 2311 0 R (cite.RFC2826) 2289 0 R (cite.RFC2845) 2205 0 R (cite.RFC2874) 2345 0 R (cite.RFC2915) 2269 0 R (cite.RFC2929) 2291 0 R (cite.RFC2930) 2207 0 R (cite.RFC2931) 2209 0 R (cite.RFC3007) 2211 0 R (cite.RFC3008) 2359 0 R (cite.RFC3071) 2333 0 R (cite.RFC3090) 2361 0 R (cite.RFC3110) 2271 0 R (cite.RFC3123) 2273 0 R (cite.RFC3225) 2217 0 R (cite.RFC3258) 2335 0 R (cite.RFC3445) 2363 0 R (cite.RFC3490) 2313 0 R (cite.RFC3491) 2315 0 R (cite.RFC3492) 2317 0 R (cite.RFC3596) 2275 0 R (cite.RFC3597) 2277 0 R (cite.RFC3645) 2213 0 R (cite.RFC3655) 2365 0 R (cite.RFC3658) 2367 0 R (cite.RFC3755) 2369 0 R (cite.RFC3757) 2371 0 R (cite.RFC3833) 2219 0 R (cite.RFC3845) 2373 0 R (cite.RFC3901) 2337 0 R (cite.RFC4033) 2221 0 R (cite.RFC4034) 2223 0 R (cite.RFC4035) 2225 0 R (cite.RFC4074) 2235 0 R (cite.RFC974) 2188 0 R (cite.id2513574) 2378 0 R (clients-per-query) 2103 0 R (configuration_file_elements) 1557 0 R (controls_statement_definition_and_usage) 1342 0 R (diagnostic_tools) 1282 0 R (dnssec.dynamic.zones) 1449 0 R (dynamic_update) 1370 0 R (dynamic_update_policies) 1377 0 R (dynamic_update_security) 1753 0 R (empty) 1825 0 R (historical_dns_information) 2165 0 R (id2466570) 1251 0 R (id2466594) 1252 0 R (id2467484) 1253 0 R (id2467494) 1254 0 R (id2467734) 1264 0 R (id2467755) 1265 0 R (id2467789) 1266 0 R (id2467874) 1269 0 R (id2467966) 1262 0 R (id2470272) 1276 0 R (id2470295) 1279 0 R (id2470393) 1280 0 R (id2470414) 1281 0 R (id2470444) 1287 0 R (id2470480) 1288 0 R (id2470574) 1289 0 R (id2470609) 1295 0 R (id2470635) 1296 0 R (id2470716) 1297 0 R (id2470742) 1300 0 R (id2470753) 1306 0 R (id2470785) 1314 0 R (id2470801) 1315 0 R (id2470823) 1320 0 R (id2470840) 1321 0 R (id2471245) 1329 0 R (id2471251) 1330 0 R (id2472304) 1347 0 R (id2472315) 1348 0 R (id2472878) 1389 0 R (id2472897) 1395 0 R (id2473330) 1410 0 R (id2473347) 1411 0 R (id2473453) 1412 0 R (id2473472) 1413 0 R (id2473482) 1414 0 R (id2473518) 1420 0 R (id2473576) 1421 0 R (id2473625) 1423 0 R (id2473639) 1424 0 R (id2473688) 1429 0 R (id2473893) 1431 0 R (id2473972) 1436 0 R (id2474121) 1437 0 R (id2474548) 1450 0 R (id2474585) 1451 0 R (id2474758) 1456 0 R (id2474861) 1469 0 R (id2474967) 1470 0 R (id2474980) 1471 0 R (id2475081) 1472 0 R (id2475108) 1477 0 R (id2475117) 1478 0 R (id2475127) 1479 0 R (id2475140) 1480 0 R (id2475245) 1481 0 R (id2475255) 1482 0 R (id2475361) 1488 0 R (id2475383) 1490 0 R (id2475485) 1497 0 R (id2475650) 1502 0 R (id2475719) 1503 0 R (id2475836) 1508 0 R (id2475987) 1514 0 R (id2475995) 1515 0 R (id2476027) 1516 0 R (id2476064) 1517 0 R (id2476112) 1518 0 R (id2476142) 1523 0 R (id2476546) 1529 0 R (id2476728) 1530 0 R (id2476782) 1535 0 R (id2476844) 1537 0 R (id2476866) 1538 0 R (id2476899) 1545 0 R (id2477114) 1558 0 R (id2478008) 1570 0 R (id2478036) 1571 0 R (id2478310) 1572 0 R (id2478325) 1577 0 R (id2478423) 1578 0 R (id2478498) 1580 0 R (id2478902) 1586 0 R (id2478945) 1588 0 R (id2479092) 1594 0 R (id2479588) 1603 0 R (id2479605) 1604 0 R (id2479628) 1605 0 R (id2479652) 1606 0 R (id2479742) 1610 0 R (id2479868) 1615 0 R (id2479921) 1616 0 R (id2480617) 1627 0 R (id2481560) 1637 0 R (id2481690) 1643 0 R (id2482148) 1649 0 R (id2482290) 1650 0 R (id2482354) 1653 0 R (id2482397) 1654 0 R (id2482419) 1655 0 R (id2486036) 1704 0 R (id2488549) 1735 0 R (id2488676) 1737 0 R (id2489237) 1752 0 R (id2490386) 1771 0 R (id2490514) 1777 0 R (id2490936) 1786 0 R (id2491438) 1804 0 R (id2493310) 1843 0 R (id2493436) 1849 0 R (id2494139) 1859 0 R (id2495348) 1880 0 R (id2495587) 1892 0 R (id2495702) 1894 0 R (id2496144) 1899 0 R (id2497924) 1921 0 R (id2497931) 1922 0 R (id2497937) 1923 0 R (id2498608) 1934 0 R (id2498709) 1935 0 R (id2500878) 2004 0 R (id2501474) 2014 0 R (id2501492) 2015 0 R (id2501512) 2018 0 R (id2501749) 2024 0 R (id2502987) 2030 0 R (id2503115) 2037 0 R (id2503273) 2038 0 R (id2503568) 2040 0 R (id2503704) 2042 0 R (id2503722) 2047 0 R (id2504195) 2050 0 R (id2504320) 2052 0 R (id2504334) 2053 0 R (id2504446) 2059 0 R (id2504469) 2060 0 R (id2504485) 2061 0 R (id2504546) 2062 0 R (id2504615) 2067 0 R (id2504720) 2068 0 R (id2504864) 2069 0 R (id2505306) 2080 0 R (id2505673) 2089 0 R (id2505678) 2090 0 R (id2507379) 2097 0 R (id2507385) 2098 0 R (id2507762) 2100 0 R (id2507767) 2101 0 R (id2508852) 2108 0 R (id2508952) 2109 0 R (id2509293) 2118 0 R (id2509521) 2132 0 R (id2509670) 2133 0 R (id2509730) 2134 0 R (id2509810) 2149 0 R (id2509815) 2150 0 R (id2509963) 2151 0 R (id2509980) 2152 0 R (id2510042) 2164 0 R (id2510146) 2170 0 R (id2510470) 2175 0 R (id2510472) 2182 0 R (id2510481) 2187 0 R (id2510504) 2183 0 R (id2510528) 2185 0 R (id2510564) 2196 0 R (id2510590) 2198 0 R (id2510616) 2190 0 R (id2510641) 2192 0 R (id2510664) 2194 0 R (id2510720) 2200 0 R (id2510746) 2202 0 R (id2510773) 2204 0 R (id2510835) 2206 0 R (id2510865) 2208 0 R (id2510894) 2210 0 R (id2510921) 2212 0 R (id2510996) 2215 0 R (id2511003) 2216 0 R (id2511030) 2218 0 R (id2511066) 2220 0 R (id2511131) 2222 0 R (id2511196) 2224 0 R (id2511261) 2227 0 R (id2511270) 2228 0 R (id2511296) 2230 0 R (id2511364) 2232 0 R (id2511399) 2234 0 R (id2511440) 2241 0 R (id2511445) 2242 0 R (id2511502) 2244 0 R (id2511540) 2252 0 R (id2511575) 2246 0 R (id2511629) 2248 0 R (id2511736) 2250 0 R (id2511762) 2254 0 R (id2511787) 2256 0 R (id2511814) 2258 0 R (id2511841) 2260 0 R (id2511880) 2262 0 R (id2511910) 2264 0 R (id2511940) 2266 0 R (id2511982) 2268 0 R (id2512016) 2270 0 R (id2512042) 2272 0 R (id2512066) 2274 0 R (id2512123) 2276 0 R (id2512148) 2279 0 R (id2512155) 2280 0 R (id2512181) 2282 0 R (id2512203) 2284 0 R (id2512227) 2286 0 R (id2512273) 2288 0 R (id2512296) 2290 0 R (id2512346) 2297 0 R (id2512354) 2298 0 R (id2512377) 2300 0 R (id2512404) 2302 0 R (id2512430) 2304 0 R (id2512467) 2306 0 R (id2512507) 2309 0 R (id2512513) 2310 0 R (id2512545) 2312 0 R (id2512659) 2314 0 R (id2512694) 2316 0 R (id2512721) 2319 0 R (id2512739) 2320 0 R (id2512829) 2322 0 R (id2512855) 2324 0 R (id2512881) 2326 0 R (id2512904) 2328 0 R (id2512950) 2330 0 R (id2512973) 2332 0 R (id2513000) 2334 0 R (id2513026) 2336 0 R (id2513063) 2339 0 R (id2513069) 2340 0 R (id2513127) 2342 0 R (id2513154) 2344 0 R (id2513190) 2351 0 R (id2513202) 2352 0 R (id2513241) 2354 0 R (id2513268) 2356 0 R (id2513298) 2358 0 R (id2513323) 2360 0 R (id2513350) 2362 0 R (id2513386) 2364 0 R (id2513422) 2366 0 R (id2513449) 2368 0 R (id2513476) 2370 0 R (id2513521) 2372 0 R (id2513562) 2375 0 R (id2513572) 2377 0 R (id2513574) 2379 0 R (id2513730) 2385 0 R (id2513739) 2386 0 R (id2513764) 2387 0 R (id2513863) 2388 0 R (id2513940) 2393 0 R (id2513966) 2395 0 R (id2513975) 2396 0 R (id2514134) 2402 0 R (id2514187) 2403 0 R (id2514251) 2404 0 R (id2514266) 2409 0 R (id2514466) 2414 0 R (id2514530) 2415 0 R (incremental_zone_transfers) 1386 0 R (internet_drafts) 2374 0 R (ipv6addresses) 1539 0 R (journal) 1382 0 R (lwresd) 1546 0 R (man.arpaname) 2788 0 R (man.ddns-confgen) 2773 0 R (man.dig) 2425 0 R (man.dnssec-checkds) 2473 0 R (man.dnssec-coverage) 2485 0 R (man.dnssec-dsfromkey) 2500 0 R (man.dnssec-keyfromlabel) 2514 0 R (man.dnssec-keygen) 1463 0 R (man.dnssec-revoke) 2561 0 R (man.dnssec-settime) 1464 0 R (man.dnssec-signzone) 2589 0 R (man.dnssec-verify) 2618 0 R (man.genrandom) 2794 0 R (man.host) 2462 0 R (man.isc-hmac-fixup) 2805 0 R (man.named) 2661 0 R (man.named-checkconf) 2629 0 R (man.named-checkzone) 2641 0 R (man.named-journalprint) 2684 0 R (man.nsec3hash) 2817 0 R (man.nsupdate) 2690 0 R (man.rndc) 1341 0 R (man.rndc-confgen) 2761 0 R (man.rndc.conf) 2744 0 R (managed-keys) 1491 0 R (notify) 1361 0 R (options) 1672 0 R (page.1) 950 0 R (page.10) 1338 0 R (page.100) 1943 0 R (page.101) 1961 0 R (page.102) 1975 0 R (page.103) 1992 0 R (page.104) 2003 0 R (page.105) 2009 0 R (page.106) 2013 0 R (page.107) 2023 0 R (page.108) 2029 0 R (page.109) 2036 0 R (page.11) 1346 0 R (page.110) 2046 0 R (page.111) 2058 0 R (page.112) 2066 0 R (page.113) 2074 0 R (page.114) 2078 0 R (page.115) 2087 0 R (page.116) 2095 0 R (page.117) 2107 0 R (page.118) 2114 0 R (page.119) 2122 0 R (page.12) 1353 0 R (page.120) 2128 0 R (page.121) 2139 0 R (page.122) 2143 0 R (page.123) 2147 0 R (page.124) 2158 0 R (page.125) 2162 0 R (page.126) 2169 0 R (page.127) 2180 0 R (page.128) 2239 0 R (page.129) 2295 0 R (page.13) 1359 0 R (page.130) 2349 0 R (page.131) 2384 0 R (page.132) 2392 0 R (page.133) 2401 0 R (page.134) 2408 0 R (page.135) 2413 0 R (page.136) 2419 0 R (page.137) 2423 0 R (page.138) 2432 0 R (page.139) 2439 0 R (page.14) 1381 0 R (page.140) 2444 0 R (page.141) 2448 0 R (page.142) 2452 0 R (page.143) 2461 0 R (page.144) 2469 0 R (page.145) 2481 0 R (page.146) 2492 0 R (page.147) 2499 0 R (page.148) 2508 0 R (page.149) 2520 0 R (page.15) 1394 0 R (page.150) 2526 0 R (page.151) 2533 0 R (page.152) 2543 0 R (page.153) 2547 0 R (page.154) 2552 0 R (page.155) 2558 0 R (page.156) 2569 0 R (page.157) 2580 0 R (page.158) 2586 0 R (page.159) 2597 0 R (page.16) 1400 0 R (page.160) 2601 0 R (page.161) 2605 0 R (page.162) 2609 0 R (page.163) 2616 0 R (page.164) 2626 0 R (page.165) 2637 0 R (page.166) 2649 0 R (page.167) 2653 0 R (page.168) 2660 0 R (page.169) 2670 0 R (page.17) 1404 0 R (page.170) 2674 0 R (page.171) 2681 0 R (page.172) 2695 0 R (page.173) 2701 0 R (page.174) 2706 0 R (page.175) 2712 0 R (page.176) 2720 0 R (page.177) 2728 0 R (page.178) 2732 0 R (page.179) 2736 0 R (page.18) 1409 0 R (page.180) 2742 0 R (page.181) 2752 0 R (page.182) 2758 0 R (page.183) 2769 0 R (page.184) 2779 0 R (page.185) 2787 0 R (page.186) 2802 0 R (page.187) 2816 0 R (page.19) 1419 0 R (page.2) 974 0 R (page.20) 1428 0 R (page.21) 1435 0 R (page.22) 1441 0 R (page.23) 1445 0 R (page.24) 1455 0 R (page.25) 1468 0 R (page.26) 1476 0 R (page.27) 1486 0 R (page.28) 1495 0 R (page.29) 1501 0 R (page.3) 1275 0 R (page.30) 1507 0 R (page.31) 1513 0 R (page.32) 1522 0 R (page.33) 1528 0 R (page.34) 1534 0 R (page.35) 1543 0 R (page.36) 1550 0 R (page.37) 1555 0 R (page.38) 1565 0 R (page.39) 1569 0 R (page.4) 1286 0 R (page.40) 1576 0 R (page.41) 1585 0 R (page.42) 1593 0 R (page.43) 1602 0 R (page.44) 1614 0 R (page.45) 1620 0 R (page.46) 1626 0 R (page.47) 1632 0 R (page.48) 1636 0 R (page.49) 1642 0 R (page.5) 1293 0 R (page.50) 1648 0 R (page.51) 1659 0 R (page.52) 1663 0 R (page.53) 1667 0 R (page.54) 1671 0 R (page.55) 1677 0 R (page.56) 1681 0 R (page.57) 1687 0 R (page.58) 1692 0 R (page.59) 1697 0 R (page.6) 1305 0 R (page.60) 1703 0 R (page.61) 1710 0 R (page.62) 1720 0 R (page.63) 1724 0 R (page.64) 1728 0 R (page.65) 1732 0 R (page.66) 1742 0 R (page.67) 1749 0 R (page.68) 1757 0 R (page.69) 1762 0 R (page.7) 1311 0 R (page.70) 1766 0 R (page.71) 1770 0 R (page.72) 1776 0 R (page.73) 1785 0 R (page.74) 1790 0 R (page.75) 1798 0 R (page.76) 1803 0 R (page.77) 1810 0 R (page.78) 1815 0 R (page.79) 1823 0 R (page.8) 1319 0 R (page.80) 1830 0 R (page.81) 1834 0 R (page.82) 1838 0 R (page.83) 1842 0 R (page.84) 1848 0 R (page.85) 1854 0 R (page.86) 1858 0 R (page.87) 1863 0 R (page.88) 1867 0 R (page.89) 1872 0 R (page.9) 1328 0 R (page.90) 1877 0 R (page.91) 1890 0 R (page.92) 1898 0 R (page.93) 1903 0 R (page.94) 1907 0 R (page.95) 1911 0 R (page.96) 1915 0 R (page.97) 1920 0 R (page.98) 1928 0 R (page.99) 1932 0 R (page.i) 984 0 R (page.ii) 1039 0 R (page.iii) 1103 0 R (page.iv) 1166 0 R (page.v) 1228 0 R (pkcs11) 1496 0 R (proposed_standards) 1390 0 R (query_address) 1758 0 R (rfc5011.support) 1487 0 R (rfcs) 1271 0 R (rndc) 1598 0 R (root_delegation_only) 1939 0 R (rrset_ordering) 1324 0 R (sample_configuration) 1313 0 R (section*.10) 2308 0 R (section*.100) 2633 0 R (section*.101) 2638 0 R (section*.102) 2639 0 R (section*.103) 2640 0 R (section*.104) 2642 0 R (section*.105) 2643 0 R (section*.106) 2644 0 R (section*.107) 2645 0 R (section*.108) 2654 0 R (section*.109) 2655 0 R (section*.11) 2318 0 R (section*.110) 2656 0 R (section*.111) 2662 0 R (section*.112) 2663 0 R (section*.113) 2664 0 R (section*.114) 2665 0 R (section*.115) 2675 0 R (section*.116) 2676 0 R (section*.117) 2677 0 R (section*.118) 2682 0 R (section*.119) 2683 0 R (section*.12) 2338 0 R (section*.120) 2685 0 R (section*.121) 2686 0 R (section*.122) 2687 0 R (section*.123) 2688 0 R (section*.124) 2689 0 R (section*.125) 2691 0 R (section*.126) 2696 0 R (section*.127) 2697 0 R (section*.128) 2702 0 R (section*.129) 2707 0 R (section*.13) 2350 0 R (section*.130) 2713 0 R (section*.131) 2714 0 R (section*.132) 2715 0 R (section*.133) 2716 0 R (section*.134) 2721 0 R (section*.135) 2722 0 R (section*.136) 2723 0 R (section*.137) 2724 0 R (section*.138) 2737 0 R (section*.139) 2738 0 R (section*.14) 2376 0 R (section*.140) 2743 0 R (section*.141) 2745 0 R (section*.142) 2746 0 R (section*.143) 2747 0 R (section*.144) 2753 0 R (section*.145) 2754 0 R (section*.146) 2759 0 R (section*.147) 2760 0 R (section*.148) 2762 0 R (section*.149) 2763 0 R (section*.15) 2426 0 R (section*.150) 2764 0 R (section*.151) 2765 0 R (section*.152) 2770 0 R (section*.153) 2771 0 R (section*.154) 2772 0 R (section*.155) 2774 0 R (section*.156) 2775 0 R (section*.157) 2780 0 R (section*.158) 2781 0 R (section*.159) 2782 0 R (section*.16) 2427 0 R (section*.160) 2783 0 R (section*.161) 2789 0 R (section*.162) 2790 0 R (section*.163) 2791 0 R (section*.164) 2792 0 R (section*.165) 2793 0 R (section*.166) 2795 0 R (section*.167) 2796 0 R (section*.168) 2797 0 R (section*.169) 2798 0 R (section*.17) 2428 0 R (section*.170) 2803 0 R (section*.171) 2804 0 R (section*.172) 2806 0 R (section*.173) 2807 0 R (section*.174) 2808 0 R (section*.175) 2809 0 R (section*.176) 2810 0 R (section*.177) 2811 0 R (section*.178) 2818 0 R (section*.179) 2819 0 R (section*.18) 2433 0 R (section*.180) 2820 0 R (section*.181) 2821 0 R (section*.182) 2822 0 R (section*.183) 2823 0 R (section*.19) 2434 0 R (section*.2) 2174 0 R (section*.20) 2440 0 R (section*.21) 2453 0 R (section*.22) 2454 0 R (section*.23) 2455 0 R (section*.24) 2456 0 R (section*.25) 2457 0 R (section*.26) 2463 0 R (section*.27) 2464 0 R (section*.28) 2465 0 R (section*.29) 2470 0 R (section*.3) 2181 0 R (section*.30) 2471 0 R (section*.31) 2472 0 R (section*.32) 2474 0 R (section*.33) 2475 0 R (section*.34) 2476 0 R (section*.35) 2482 0 R (section*.36) 2483 0 R (section*.37) 2484 0 R (section*.38) 2486 0 R (section*.39) 2487 0 R (section*.4) 2189 0 R (section*.40) 2488 0 R (section*.41) 2493 0 R (section*.42) 2494 0 R (section*.43) 2495 0 R (section*.44) 2501 0 R (section*.45) 2502 0 R (section*.46) 2503 0 R (section*.47) 2504 0 R (section*.48) 2509 0 R (section*.49) 2510 0 R (section*.5) 2214 0 R (section*.50) 2511 0 R (section*.51) 2512 0 R (section*.52) 2513 0 R (section*.53) 2515 0 R (section*.54) 2516 0 R (section*.55) 2521 0 R (section*.56) 2522 0 R (section*.57) 2527 0 R (section*.58) 2528 0 R (section*.59) 2534 0 R (section*.6) 2226 0 R (section*.60) 2535 0 R (section*.61) 2536 0 R (section*.62) 2537 0 R (section*.63) 2538 0 R (section*.64) 2539 0 R (section*.65) 2548 0 R (section*.66) 2553 0 R (section*.67) 2554 0 R (section*.68) 2559 0 R (section*.69) 2560 0 R (section*.7) 2240 0 R (section*.70) 2562 0 R (section*.71) 2563 0 R (section*.72) 2564 0 R (section*.73) 2565 0 R (section*.74) 2570 0 R (section*.75) 2571 0 R (section*.76) 2572 0 R (section*.77) 2573 0 R (section*.78) 2574 0 R (section*.79) 2575 0 R (section*.8) 2278 0 R (section*.80) 2581 0 R (section*.81) 2582 0 R (section*.82) 2587 0 R (section*.83) 2588 0 R (section*.84) 2590 0 R (section*.85) 2591 0 R (section*.86) 2592 0 R (section*.87) 2593 0 R (section*.88) 2610 0 R (section*.89) 2611 0 R (section*.9) 2296 0 R (section*.90) 2617 0 R (section*.91) 2619 0 R (section*.92) 2620 0 R (section*.93) 2621 0 R (section*.94) 2622 0 R (section*.95) 2627 0 R (section*.96) 2628 0 R (section*.97) 2630 0 R (section*.98) 2631 0 R (section*.99) 2632 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.10) 274 0 R (section.4.11) 286 0 R (section.4.12) 338 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 354 0 R (section.5.2) 358 0 R (section.6.1) 366 0 R (section.6.2) 394 0 R (section.6.3) 622 0 R (section.6.4) 678 0 R (section.7.1) 714 0 R (section.7.2) 718 0 R (section.7.3) 730 0 R (section.8.1) 738 0 R (section.8.2) 746 0 R (section.8.3) 750 0 R (section.A.1) 758 0 R (section.A.2) 766 0 R (section.A.3) 774 0 R (section.A.4) 790 0 R (section.B.1) 850 0 R (section.B.10) 886 0 R (section.B.11) 890 0 R (section.B.12) 894 0 R (section.B.13) 898 0 R (section.B.14) 902 0 R (section.B.15) 906 0 R (section.B.16) 910 0 R (section.B.17) 914 0 R (section.B.18) 918 0 R (section.B.19) 922 0 R (section.B.2) 854 0 R (section.B.20) 926 0 R (section.B.21) 930 0 R (section.B.22) 934 0 R (section.B.23) 938 0 R (section.B.24) 942 0 R (section.B.3) 858 0 R (section.B.4) 862 0 R (section.B.5) 866 0 R (section.B.6) 870 0 R (section.B.7) 874 0 R (section.B.8) 878 0 R (section.B.9) 882 0 R (server_resource_limits) 1779 0 R (server_statement_definition_and_usage) 1716 0 R (server_statement_grammar) 1868 0 R (statistics) 2079 0 R (statistics_counters) 2088 0 R (statschannels) 1879 0 R (statsfile) 1683 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.10.1) 278 0 R (subsection.4.10.2) 282 0 R (subsection.4.11.1) 290 0 R (subsection.4.11.2) 306 0 R (subsection.4.11.3) 322 0 R (subsection.4.11.4) 326 0 R (subsection.4.11.5) 330 0 R (subsection.4.11.6) 334 0 R (subsection.4.12.1) 342 0 R (subsection.4.12.2) 346 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.10) 258 0 R (subsection.4.9.11) 262 0 R (subsection.4.9.12) 266 0 R (subsection.4.9.13) 270 0 R (subsection.4.9.2) 226 0 R (subsection.4.9.3) 230 0 R (subsection.4.9.4) 234 0 R (subsection.4.9.5) 238 0 R (subsection.4.9.6) 242 0 R (subsection.4.9.7) 246 0 R (subsection.4.9.8) 250 0 R (subsection.4.9.9) 254 0 R (subsection.6.1.1) 370 0 R (subsection.6.1.2) 382 0 R (subsection.6.2.1) 398 0 R (subsection.6.2.10) 434 0 R (subsection.6.2.11) 450 0 R (subsection.6.2.12) 454 0 R (subsection.6.2.13) 458 0 R (subsection.6.2.14) 462 0 R (subsection.6.2.15) 466 0 R (subsection.6.2.16) 470 0 R (subsection.6.2.17) 558 0 R (subsection.6.2.18) 562 0 R (subsection.6.2.19) 566 0 R (subsection.6.2.2) 402 0 R (subsection.6.2.20) 570 0 R (subsection.6.2.21) 574 0 R (subsection.6.2.22) 578 0 R (subsection.6.2.23) 582 0 R (subsection.6.2.24) 586 0 R (subsection.6.2.25) 590 0 R (subsection.6.2.26) 594 0 R (subsection.6.2.27) 598 0 R (subsection.6.2.28) 602 0 R (subsection.6.2.3) 406 0 R (subsection.6.2.4) 410 0 R (subsection.6.2.5) 414 0 R (subsection.6.2.6) 418 0 R (subsection.6.2.7) 422 0 R (subsection.6.2.8) 426 0 R (subsection.6.2.9) 430 0 R (subsection.6.3.1) 626 0 R (subsection.6.3.2) 638 0 R (subsection.6.3.3) 642 0 R (subsection.6.3.4) 646 0 R (subsection.6.3.5) 650 0 R (subsection.6.3.6) 670 0 R (subsection.6.3.7) 674 0 R (subsection.6.4.1) 686 0 R (subsection.7.2.1) 722 0 R (subsection.7.2.2) 726 0 R (subsection.8.1.1) 742 0 R (subsection.A.1.1) 762 0 R (subsection.A.2.1) 770 0 R (subsection.A.3.1) 778 0 R (subsection.A.3.2) 782 0 R (subsection.A.3.3) 786 0 R (subsection.A.4.1) 794 0 R (subsection.A.4.2) 798 0 R (subsection.A.4.3) 802 0 R (subsection.A.4.4) 806 0 R (subsection.A.4.5) 810 0 R (subsection.A.4.6) 814 0 R (subsection.A.4.7) 842 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.11.1.1) 294 0 R (subsubsection.4.11.1.2) 298 0 R (subsubsection.4.11.1.3) 302 0 R (subsubsection.4.11.2.1) 310 0 R (subsubsection.4.11.2.2) 314 0 R (subsubsection.4.11.2.3) 318 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 374 0 R (subsubsection.6.1.1.2) 378 0 R (subsubsection.6.1.2.1) 386 0 R (subsubsection.6.1.2.2) 390 0 R (subsubsection.6.2.10.1) 438 0 R (subsubsection.6.2.10.2) 442 0 R (subsubsection.6.2.10.3) 446 0 R (subsubsection.6.2.16.1) 474 0 R (subsubsection.6.2.16.10) 510 0 R (subsubsection.6.2.16.11) 514 0 R (subsubsection.6.2.16.12) 518 0 R (subsubsection.6.2.16.13) 522 0 R (subsubsection.6.2.16.14) 526 0 R (subsubsection.6.2.16.15) 530 0 R (subsubsection.6.2.16.16) 534 0 R (subsubsection.6.2.16.17) 538 0 R (subsubsection.6.2.16.18) 542 0 R (subsubsection.6.2.16.19) 546 0 R (subsubsection.6.2.16.2) 478 0 R (subsubsection.6.2.16.20) 550 0 R (subsubsection.6.2.16.21) 554 0 R (subsubsection.6.2.16.3) 482 0 R (subsubsection.6.2.16.4) 486 0 R (subsubsection.6.2.16.5) 490 0 R (subsubsection.6.2.16.6) 494 0 R (subsubsection.6.2.16.7) 498 0 R (subsubsection.6.2.16.8) 502 0 R (subsubsection.6.2.16.9) 506 0 R (subsubsection.6.2.28.1) 606 0 R (subsubsection.6.2.28.2) 610 0 R (subsubsection.6.2.28.3) 614 0 R (subsubsection.6.2.28.4) 618 0 R (subsubsection.6.3.1.1) 630 0 R (subsubsection.6.3.1.2) 634 0 R (subsubsection.6.3.5.1) 654 0 R (subsubsection.6.3.5.2) 658 0 R (subsubsection.6.3.5.3) 662 0 R (subsubsection.6.3.5.4) 666 0 R (subsubsection.6.4.0.1) 682 0 R (subsubsection.6.4.1.1) 690 0 R (subsubsection.6.4.1.2) 694 0 R (subsubsection.6.4.1.3) 698 0 R (subsubsection.6.4.1.4) 702 0 R (subsubsection.6.4.1.5) 706 0 R (subsubsection.A.4.6.1) 818 0 R (subsubsection.A.4.6.2) 822 0 R (subsubsection.A.4.6.3) 826 0 R (subsubsection.A.4.6.4) 830 0 R (subsubsection.A.4.6.5) 834 0 R (subsubsection.A.4.6.6) 838 0 R (table.1.1) 1255 0 R (table.1.2) 1263 0 R (table.3.1) 1322 0 R (table.3.2) 1349 0 R (table.6.1) 1559 0 R (table.6.10) 2019 0 R (table.6.11) 2025 0 R (table.6.12) 2031 0 R (table.6.13) 2039 0 R (table.6.14) 2041 0 R (table.6.15) 2048 0 R (table.6.16) 2051 0 R (table.6.17) 2054 0 R (table.6.18) 2070 0 R (table.6.19) 2081 0 R (table.6.2) 1581 0 R (table.6.20) 2091 0 R (table.6.21) 2099 0 R (table.6.22) 2102 0 R (table.6.23) 2110 0 R (table.6.3) 1589 0 R (table.6.4) 1628 0 R (table.6.5) 1644 0 R (table.6.6) 1705 0 R (table.6.7) 1805 0 R (table.6.8) 1924 0 R (table.6.9) 2005 0 R (the_category_phrase) 1622 0 R (the_sortlist_statement) 1792 0 R (topology) 1791 0 R (trusted-keys) 1891 0 R (tsig) 1405 0 R (tuning) 1806 0 R (types_of_resource_records_and_when_to_use_them) 1270 0 R (view_statement_grammar) 1826 0 R (zone_statement_grammar) 1738 0 R (zone_transfers) 1376 0 R (zonefile_format) 1819 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj 2851 0 obj << /Kids [2850 0 R] >> endobj 2852 0 obj << /Dests 2851 0 R >> endobj 2853 0 obj << /Type /Catalog /Pages 2848 0 R /Outlines 2849 0 R /Names 2852 0 R /PageMode /UseOutlines /OpenAction 945 0 R >> endobj 2854 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() /CreationDate (D:20140117011504Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 2855 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n 0000349948 00000 n 0001233140 00000 n 0000000054 00000 n 0000000086 00000 n 0000350075 00000 n 0001233068 00000 n 0000000133 00000 n 0000000173 00000 n 0000350203 00000 n 0001232982 00000 n 0000000221 00000 n 0000000273 00000 n 0000350331 00000 n 0001232896 00000 n 0000000321 00000 n 0000000377 00000 n 0000354617 00000 n 0001232786 00000 n 0000000425 00000 n 0000000478 00000 n 0000354744 00000 n 0001232712 00000 n 0000000531 00000 n 0000000572 00000 n 0000354872 00000 n 0001232625 00000 n 0000000625 00000 n 0000000674 00000 n 0000354999 00000 n 0001232538 00000 n 0000000727 00000 n 0000000757 00000 n 0000359296 00000 n 0001232414 00000 n 0000000810 00000 n 0000000861 00000 n 0000359424 00000 n 0001232340 00000 n 0000000919 00000 n 0000000964 00000 n 0000359552 00000 n 0001232253 00000 n 0000001022 00000 n 0000001062 00000 n 0000359680 00000 n 0001232179 00000 n 0000001120 00000 n 0000001162 00000 n 0000362665 00000 n 0001232055 00000 n 0000001215 00000 n 0000001260 00000 n 0000362793 00000 n 0001231994 00000 n 0000001318 00000 n 0000001355 00000 n 0000362921 00000 n 0001231920 00000 n 0000001408 00000 n 0000001463 00000 n 0000365868 00000 n 0001231795 00000 n 0000001509 00000 n 0000001556 00000 n 0000365996 00000 n 0001231721 00000 n 0000001604 00000 n 0000001648 00000 n 0000366124 00000 n 0001231634 00000 n 0000001696 00000 n 0000001735 00000 n 0000366252 00000 n 0001231547 00000 n 0000001783 00000 n 0000001825 00000 n 0000366379 00000 n 0001231460 00000 n 0000001873 00000 n 0000001936 00000 n 0000367456 00000 n 0001231386 00000 n 0000001984 00000 n 0000002034 00000 n 0000369115 00000 n 0001231258 00000 n 0000002080 00000 n 0000002126 00000 n 0000369242 00000 n 0001231145 00000 n 0000002174 00000 n 0000002218 00000 n 0000369370 00000 n 0001231069 00000 n 0000002271 00000 n 0000002323 00000 n 0000369498 00000 n 0001230992 00000 n 0000002377 00000 n 0000002436 00000 n 0000371947 00000 n 0001230901 00000 n 0000002485 00000 n 0000002523 00000 n 0000375285 00000 n 0001230784 00000 n 0000002572 00000 n 0000002618 00000 n 0000375413 00000 n 0001230666 00000 n 0000002672 00000 n 0000002739 00000 n 0000375541 00000 n 0001230587 00000 n 0000002798 00000 n 0000002842 00000 n 0000375670 00000 n 0001230508 00000 n 0000002901 00000 n 0000002949 00000 n 0000382656 00000 n 0001230429 00000 n 0000003003 00000 n 0000003036 00000 n 0000388281 00000 n 0001230296 00000 n 0000003083 00000 n 0000003126 00000 n 0000388410 00000 n 0001230217 00000 n 0000003175 00000 n 0000003205 00000 n 0000388539 00000 n 0001230085 00000 n 0000003254 00000 n 0000003292 00000 n 0000393048 00000 n 0001230020 00000 n 0000003346 00000 n 0000003388 00000 n 0000393177 00000 n 0001229927 00000 n 0000003437 00000 n 0000003496 00000 n 0000393306 00000 n 0001229795 00000 n 0000003545 00000 n 0000003578 00000 n 0000397225 00000 n 0001229730 00000 n 0000003632 00000 n 0000003681 00000 n 0000400239 00000 n 0001229598 00000 n 0000003730 00000 n 0000003758 00000 n 0000403019 00000 n 0001229480 00000 n 0000003812 00000 n 0000003881 00000 n 0000403148 00000 n 0001229401 00000 n 0000003940 00000 n 0000003988 00000 n 0000403276 00000 n 0001229322 00000 n 0000004047 00000 n 0000004092 00000 n 0000403405 00000 n 0001229229 00000 n 0000004146 00000 n 0000004214 00000 n 0000403534 00000 n 0001229136 00000 n 0000004268 00000 n 0000004338 00000 n 0000407203 00000 n 0001229043 00000 n 0000004392 00000 n 0000004455 00000 n 0000407332 00000 n 0001228950 00000 n 0000004509 00000 n 0000004564 00000 n 0000407460 00000 n 0001228871 00000 n 0000004618 00000 n 0000004650 00000 n 0000407588 00000 n 0001228778 00000 n 0000004699 00000 n 0000004727 00000 n 0000411357 00000 n 0001228685 00000 n 0000004776 00000 n 0000004808 00000 n 0000411486 00000 n 0001228553 00000 n 0000004857 00000 n 0000004887 00000 n 0000411615 00000 n 0001228474 00000 n 0000004941 00000 n 0000004982 00000 n 0000415413 00000 n 0001228381 00000 n 0000005036 00000 n 0000005078 00000 n 0000415542 00000 n 0001228302 00000 n 0000005132 00000 n 0000005177 00000 n 0000420866 00000 n 0001228169 00000 n 0000005226 00000 n 0000005294 00000 n 0000420995 00000 n 0001228090 00000 n 0000005348 00000 n 0000005408 00000 n 0000421124 00000 n 0001227997 00000 n 0000005462 00000 n 0000005513 00000 n 0000425392 00000 n 0001227904 00000 n 0000005567 00000 n 0000005621 00000 n 0000428374 00000 n 0001227811 00000 n 0000005675 00000 n 0000005721 00000 n 0000428503 00000 n 0001227718 00000 n 0000005775 00000 n 0000005817 00000 n 0000428632 00000 n 0001227625 00000 n 0000005871 00000 n 0000005922 00000 n 0000428761 00000 n 0001227532 00000 n 0000005976 00000 n 0000006025 00000 n 0000431520 00000 n 0001227439 00000 n 0000006079 00000 n 0000006136 00000 n 0000431649 00000 n 0001227346 00000 n 0000006190 00000 n 0000006245 00000 n 0000431778 00000 n 0001227253 00000 n 0000006300 00000 n 0000006356 00000 n 0000431906 00000 n 0001227160 00000 n 0000006411 00000 n 0000006472 00000 n 0000432034 00000 n 0001227067 00000 n 0000006527 00000 n 0000006573 00000 n 0000432163 00000 n 0001226988 00000 n 0000006628 00000 n 0000006671 00000 n 0000436027 00000 n 0001226856 00000 n 0000006721 00000 n 0000006777 00000 n 0000436156 00000 n 0001226777 00000 n 0000006832 00000 n 0000006878 00000 n 0000436285 00000 n 0001226698 00000 n 0000006933 00000 n 0000006980 00000 n 0000439687 00000 n 0001226566 00000 n 0000007030 00000 n 0000007087 00000 n 0000439816 00000 n 0001226448 00000 n 0000007142 00000 n 0000007182 00000 n 0000442484 00000 n 0001226369 00000 n 0000007242 00000 n 0000007315 00000 n 0000442613 00000 n 0001226276 00000 n 0000007375 00000 n 0000007448 00000 n 0000445330 00000 n 0001226197 00000 n 0000007508 00000 n 0000007565 00000 n 0000447722 00000 n 0001226065 00000 n 0000007620 00000 n 0000007678 00000 n 0000447851 00000 n 0001225986 00000 n 0000007738 00000 n 0000007815 00000 n 0000447980 00000 n 0001225893 00000 n 0000007875 00000 n 0000007952 00000 n 0000448109 00000 n 0001225814 00000 n 0000008012 00000 n 0000008071 00000 n 0000448238 00000 n 0001225721 00000 n 0000008126 00000 n 0000008170 00000 n 0000450869 00000 n 0001225628 00000 n 0000008225 00000 n 0000008265 00000 n 0000453677 00000 n 0001225535 00000 n 0000008320 00000 n 0000008388 00000 n 0000453806 00000 n 0001225456 00000 n 0000008443 00000 n 0000008514 00000 n 0000457867 00000 n 0001225338 00000 n 0000008564 00000 n 0000008611 00000 n 0000457996 00000 n 0001225259 00000 n 0000008666 00000 n 0000008727 00000 n 0000458125 00000 n 0001225180 00000 n 0000008782 00000 n 0000008852 00000 n 0000460610 00000 n 0001225047 00000 n 0000008899 00000 n 0000008952 00000 n 0000460739 00000 n 0001224968 00000 n 0000009001 00000 n 0000009057 00000 n 0000460868 00000 n 0001224889 00000 n 0000009106 00000 n 0000009155 00000 n 0000465138 00000 n 0001224756 00000 n 0000009202 00000 n 0000009254 00000 n 0000465267 00000 n 0001224638 00000 n 0000009303 00000 n 0000009354 00000 n 0000473691 00000 n 0001224520 00000 n 0000009408 00000 n 0000009453 00000 n 0000473820 00000 n 0001224441 00000 n 0000009512 00000 n 0000009546 00000 n 0000473949 00000 n 0001224362 00000 n 0000009605 00000 n 0000009653 00000 n 0000474078 00000 n 0001224244 00000 n 0000009707 00000 n 0000009747 00000 n 0000476611 00000 n 0001224165 00000 n 0000009806 00000 n 0000009840 00000 n 0000476740 00000 n 0001224086 00000 n 0000009899 00000 n 0000009947 00000 n 0000476869 00000 n 0001223953 00000 n 0000009996 00000 n 0000010046 00000 n 0000480110 00000 n 0001223874 00000 n 0000010100 00000 n 0000010147 00000 n 0000480238 00000 n 0001223781 00000 n 0000010201 00000 n 0000010261 00000 n 0000485595 00000 n 0001223688 00000 n 0000010315 00000 n 0000010367 00000 n 0000485724 00000 n 0001223595 00000 n 0000010421 00000 n 0000010486 00000 n 0000489194 00000 n 0001223502 00000 n 0000010540 00000 n 0000010591 00000 n 0000489323 00000 n 0001223409 00000 n 0000010645 00000 n 0000010709 00000 n 0000489452 00000 n 0001223316 00000 n 0000010763 00000 n 0000010810 00000 n 0000489581 00000 n 0001223223 00000 n 0000010864 00000 n 0000010924 00000 n 0000489709 00000 n 0001223130 00000 n 0000010978 00000 n 0000011029 00000 n 0000493408 00000 n 0001222998 00000 n 0000011084 00000 n 0000011149 00000 n 0000493537 00000 n 0001222919 00000 n 0000011209 00000 n 0000011256 00000 n 0000500377 00000 n 0001222826 00000 n 0000011316 00000 n 0000011364 00000 n 0000507238 00000 n 0001222747 00000 n 0000011424 00000 n 0000011478 00000 n 0000513667 00000 n 0001222654 00000 n 0000011533 00000 n 0000011583 00000 n 0000513796 00000 n 0001222561 00000 n 0000011638 00000 n 0000011701 00000 n 0000513925 00000 n 0001222468 00000 n 0000011756 00000 n 0000011808 00000 n 0000514054 00000 n 0001222375 00000 n 0000011863 00000 n 0000011928 00000 n 0000514183 00000 n 0001222282 00000 n 0000011983 00000 n 0000012035 00000 n 0000520931 00000 n 0001222149 00000 n 0000012090 00000 n 0000012155 00000 n 0000541866 00000 n 0001222070 00000 n 0000012215 00000 n 0000012259 00000 n 0000567381 00000 n 0001221977 00000 n 0000012319 00000 n 0000012358 00000 n 0000567509 00000 n 0001221884 00000 n 0000012418 00000 n 0000012465 00000 n 0000570958 00000 n 0001221791 00000 n 0000012525 00000 n 0000012568 00000 n 0000575288 00000 n 0001221698 00000 n 0000012628 00000 n 0000012667 00000 n 0000579035 00000 n 0001221605 00000 n 0000012727 00000 n 0000012769 00000 n 0000581953 00000 n 0001221512 00000 n 0000012829 00000 n 0000012872 00000 n 0000589425 00000 n 0001221419 00000 n 0000012932 00000 n 0000012975 00000 n 0000593613 00000 n 0001221326 00000 n 0000013035 00000 n 0000013096 00000 n 0000593741 00000 n 0001221233 00000 n 0000013157 00000 n 0000013209 00000 n 0000597768 00000 n 0001221140 00000 n 0000013270 00000 n 0000013323 00000 n 0000601352 00000 n 0001221047 00000 n 0000013384 00000 n 0000013422 00000 n 0000601480 00000 n 0001220954 00000 n 0000013483 00000 n 0000013535 00000 n 0000604708 00000 n 0001220861 00000 n 0000013596 00000 n 0000013640 00000 n 0000608315 00000 n 0001220768 00000 n 0000013701 00000 n 0000013737 00000 n 0000616760 00000 n 0001220675 00000 n 0000013798 00000 n 0000013861 00000 n 0000620505 00000 n 0001220582 00000 n 0000013922 00000 n 0000013972 00000 n 0000627454 00000 n 0001220489 00000 n 0000014033 00000 n 0000014089 00000 n 0000632152 00000 n 0001220396 00000 n 0000014150 00000 n 0000014197 00000 n 0000636382 00000 n 0001220303 00000 n 0000014258 00000 n 0000014326 00000 n 0000643421 00000 n 0001220224 00000 n 0000014387 00000 n 0000014439 00000 n 0000652184 00000 n 0001220131 00000 n 0000014494 00000 n 0000014545 00000 n 0000656910 00000 n 0001220038 00000 n 0000014600 00000 n 0000014664 00000 n 0000662275 00000 n 0001219945 00000 n 0000014719 00000 n 0000014783 00000 n 0000662404 00000 n 0001219852 00000 n 0000014838 00000 n 0000014915 00000 n 0000666004 00000 n 0001219759 00000 n 0000014970 00000 n 0000015027 00000 n 0000666133 00000 n 0001219666 00000 n 0000015082 00000 n 0000015152 00000 n 0000666262 00000 n 0001219573 00000 n 0000015207 00000 n 0000015264 00000 n 0000666391 00000 n 0001219480 00000 n 0000015319 00000 n 0000015389 00000 n 0000670697 00000 n 0001219387 00000 n 0000015444 00000 n 0000015493 00000 n 0000670826 00000 n 0001219294 00000 n 0000015548 00000 n 0000015610 00000 n 0000673452 00000 n 0001219201 00000 n 0000015665 00000 n 0000015714 00000 n 0000681437 00000 n 0001219083 00000 n 0000015769 00000 n 0000015831 00000 n 0000681566 00000 n 0001219004 00000 n 0000015891 00000 n 0000015930 00000 n 0000688820 00000 n 0001218911 00000 n 0000015990 00000 n 0000016024 00000 n 0000688948 00000 n 0001218818 00000 n 0000016084 00000 n 0000016125 00000 n 0000710733 00000 n 0001218739 00000 n 0000016185 00000 n 0000016237 00000 n 0000721255 00000 n 0001218607 00000 n 0000016286 00000 n 0000016319 00000 n 0000721384 00000 n 0001218489 00000 n 0000016373 00000 n 0000016445 00000 n 0000721513 00000 n 0001218410 00000 n 0000016504 00000 n 0000016548 00000 n 0000732115 00000 n 0001218331 00000 n 0000016607 00000 n 0000016660 00000 n 0000732504 00000 n 0001218238 00000 n 0000016714 00000 n 0000016764 00000 n 0000736346 00000 n 0001218145 00000 n 0000016818 00000 n 0000016856 00000 n 0000736605 00000 n 0001218052 00000 n 0000016910 00000 n 0000016959 00000 n 0000739380 00000 n 0001217920 00000 n 0000017013 00000 n 0000017065 00000 n 0000739505 00000 n 0001217841 00000 n 0000017124 00000 n 0000017169 00000 n 0000739634 00000 n 0001217748 00000 n 0000017228 00000 n 0000017280 00000 n 0000739763 00000 n 0001217655 00000 n 0000017339 00000 n 0000017392 00000 n 0000742206 00000 n 0001217576 00000 n 0000017451 00000 n 0000017500 00000 n 0000742335 00000 n 0001217483 00000 n 0000017554 00000 n 0000017634 00000 n 0000746657 00000 n 0001217404 00000 n 0000017688 00000 n 0000017737 00000 n 0000750163 00000 n 0001217286 00000 n 0000017786 00000 n 0000017826 00000 n 0000750422 00000 n 0001217207 00000 n 0000017885 00000 n 0000017932 00000 n 0000753851 00000 n 0001217089 00000 n 0000017986 00000 n 0000018031 00000 n 0000753980 00000 n 0001217010 00000 n 0000018090 00000 n 0000018149 00000 n 0000757319 00000 n 0001216917 00000 n 0000018208 00000 n 0000018272 00000 n 0000757578 00000 n 0001216824 00000 n 0000018331 00000 n 0000018387 00000 n 0000761762 00000 n 0001216731 00000 n 0000018446 00000 n 0000018504 00000 n 0000763934 00000 n 0001216652 00000 n 0000018563 00000 n 0000018625 00000 n 0000765719 00000 n 0001216519 00000 n 0000018672 00000 n 0000018724 00000 n 0000765847 00000 n 0001216440 00000 n 0000018773 00000 n 0000018817 00000 n 0000769646 00000 n 0001216308 00000 n 0000018866 00000 n 0000018907 00000 n 0000769775 00000 n 0001216229 00000 n 0000018961 00000 n 0000019009 00000 n 0000769904 00000 n 0001216150 00000 n 0000019063 00000 n 0000019114 00000 n 0000770032 00000 n 0001216071 00000 n 0000019163 00000 n 0000019210 00000 n 0000774292 00000 n 0001215938 00000 n 0000019257 00000 n 0000019294 00000 n 0000774421 00000 n 0001215820 00000 n 0000019343 00000 n 0000019382 00000 n 0000774550 00000 n 0001215755 00000 n 0000019436 00000 n 0000019514 00000 n 0000774679 00000 n 0001215662 00000 n 0000019563 00000 n 0000019630 00000 n 0000774808 00000 n 0001215583 00000 n 0000019679 00000 n 0000019724 00000 n 0000778249 00000 n 0001215450 00000 n 0000019772 00000 n 0000019804 00000 n 0000778378 00000 n 0001215332 00000 n 0000019853 00000 n 0000019892 00000 n 0000778507 00000 n 0001215267 00000 n 0000019946 00000 n 0000020007 00000 n 0000782189 00000 n 0001215135 00000 n 0000020056 00000 n 0000020113 00000 n 0000782318 00000 n 0001215070 00000 n 0000020167 00000 n 0000020216 00000 n 0000782447 00000 n 0001214938 00000 n 0000020265 00000 n 0000020327 00000 n 0000782576 00000 n 0001214859 00000 n 0000020381 00000 n 0000020436 00000 n 0000807418 00000 n 0001214766 00000 n 0000020490 00000 n 0000020531 00000 n 0000807547 00000 n 0001214687 00000 n 0000020585 00000 n 0000020637 00000 n 0000807936 00000 n 0001214569 00000 n 0000020686 00000 n 0000020736 00000 n 0000810757 00000 n 0001214490 00000 n 0000020790 00000 n 0000020828 00000 n 0000810886 00000 n 0001214397 00000 n 0000020882 00000 n 0000020919 00000 n 0000811015 00000 n 0001214304 00000 n 0000020973 00000 n 0000021011 00000 n 0000811144 00000 n 0001214211 00000 n 0000021065 00000 n 0000021117 00000 n 0000814380 00000 n 0001214118 00000 n 0000021171 00000 n 0000021214 00000 n 0000814508 00000 n 0001213986 00000 n 0000021268 00000 n 0000021313 00000 n 0000814636 00000 n 0001213907 00000 n 0000021372 00000 n 0000021438 00000 n 0000817622 00000 n 0001213814 00000 n 0000021497 00000 n 0000021585 00000 n 0000817751 00000 n 0001213721 00000 n 0000021644 00000 n 0000021719 00000 n 0000817880 00000 n 0001213628 00000 n 0000021778 00000 n 0000021863 00000 n 0000820788 00000 n 0001213535 00000 n 0000021922 00000 n 0000022003 00000 n 0000823249 00000 n 0001213456 00000 n 0000022062 00000 n 0000022146 00000 n 0000823378 00000 n 0001213377 00000 n 0000022200 00000 n 0000022244 00000 n 0000826274 00000 n 0001213257 00000 n 0000022292 00000 n 0000022326 00000 n 0000826403 00000 n 0001213178 00000 n 0000022375 00000 n 0000022402 00000 n 0000848974 00000 n 0001213085 00000 n 0000022451 00000 n 0000022479 00000 n 0000852607 00000 n 0001212992 00000 n 0000022528 00000 n 0000022566 00000 n 0000855811 00000 n 0001212899 00000 n 0000022615 00000 n 0000022654 00000 n 0000862214 00000 n 0001212806 00000 n 0000022703 00000 n 0000022743 00000 n 0000864940 00000 n 0001212713 00000 n 0000022792 00000 n 0000022835 00000 n 0000875077 00000 n 0001212620 00000 n 0000022884 00000 n 0000022921 00000 n 0000888727 00000 n 0001212527 00000 n 0000022970 00000 n 0000023007 00000 n 0000892108 00000 n 0001212434 00000 n 0000023056 00000 n 0000023094 00000 n 0000898633 00000 n 0001212341 00000 n 0000023144 00000 n 0000023184 00000 n 0000916435 00000 n 0001212248 00000 n 0000023234 00000 n 0000023272 00000 n 0000919577 00000 n 0001212155 00000 n 0000023322 00000 n 0000023362 00000 n 0000922492 00000 n 0001212062 00000 n 0000023412 00000 n 0000023452 00000 n 0000932500 00000 n 0001211969 00000 n 0000023502 00000 n 0000023532 00000 n 0000940973 00000 n 0001211876 00000 n 0000023582 00000 n 0000023625 00000 n 0000941427 00000 n 0001211783 00000 n 0000023675 00000 n 0000023708 00000 n 0000955679 00000 n 0001211690 00000 n 0000023758 00000 n 0000023787 00000 n 0000974104 00000 n 0001211597 00000 n 0000023837 00000 n 0000023871 00000 n 0000979694 00000 n 0001211504 00000 n 0000023921 00000 n 0000023958 00000 n 0000982902 00000 n 0001211411 00000 n 0000024008 00000 n 0000024045 00000 n 0000988586 00000 n 0001211318 00000 n 0000024095 00000 n 0000024128 00000 n 0000989040 00000 n 0001211225 00000 n 0000024178 00000 n 0000024212 00000 n 0000991752 00000 n 0001211132 00000 n 0000024262 00000 n 0000024301 00000 n 0000993865 00000 n 0001211053 00000 n 0000024351 00000 n 0000024385 00000 n 0000024758 00000 n 0000024880 00000 n 0000289681 00000 n 0000024438 00000 n 0000289555 00000 n 0000289618 00000 n 0001205007 00000 n 0001178865 00000 n 0001204833 00000 n 0001206053 00000 n 0000026189 00000 n 0000026382 00000 n 0000026462 00000 n 0000026499 00000 n 0000026580 00000 n 0000026704 00000 n 0000026963 00000 n 0000027322 00000 n 0000027354 00000 n 0000027448 00000 n 0000028481 00000 n 0000039617 00000 n 0000105207 00000 n 0000170797 00000 n 0000236387 00000 n 0000291121 00000 n 0000290936 00000 n 0000289781 00000 n 0000291058 00000 n 0001177629 00000 n 0001151010 00000 n 0001177455 00000 n 0001150325 00000 n 0001148180 00000 n 0001150161 00000 n 0000302898 00000 n 0000294171 00000 n 0000291206 00000 n 0000302772 00000 n 0000302835 00000 n 0000294741 00000 n 0000294895 00000 n 0000295052 00000 n 0000295209 00000 n 0000295366 00000 n 0000295523 00000 n 0000295685 00000 n 0000295847 00000 n 0000296008 00000 n 0000296170 00000 n 0000296337 00000 n 0000296504 00000 n 0000296669 00000 n 0000296831 00000 n 0000296997 00000 n 0000297160 00000 n 0000297315 00000 n 0000297473 00000 n 0000297631 00000 n 0000297788 00000 n 0000297945 00000 n 0000298103 00000 n 0000298259 00000 n 0000298417 00000 n 0000298580 00000 n 0000298743 00000 n 0000298901 00000 n 0000299057 00000 n 0000299219 00000 n 0000299387 00000 n 0000299555 00000 n 0000299718 00000 n 0000299874 00000 n 0000300032 00000 n 0000300190 00000 n 0000300353 00000 n 0000300511 00000 n 0000300669 00000 n 0000300832 00000 n 0000300990 00000 n 0000301153 00000 n 0000301321 00000 n 0000301489 00000 n 0000301652 00000 n 0000301815 00000 n 0000301978 00000 n 0000302141 00000 n 0000302304 00000 n 0000302460 00000 n 0000302616 00000 n 0000316405 00000 n 0000306338 00000 n 0000302983 00000 n 0000316340 00000 n 0001147592 00000 n 0001130171 00000 n 0001147406 00000 n 0000306988 00000 n 0000307152 00000 n 0000307316 00000 n 0000307479 00000 n 0000307638 00000 n 0000307802 00000 n 0000307966 00000 n 0000308130 00000 n 0000308294 00000 n 0000308458 00000 n 0000308622 00000 n 0000308786 00000 n 0000308950 00000 n 0000309114 00000 n 0000309279 00000 n 0000309444 00000 n 0000309609 00000 n 0000309774 00000 n 0000309934 00000 n 0000310099 00000 n 0000310263 00000 n 0000310423 00000 n 0000310588 00000 n 0000310757 00000 n 0000310927 00000 n 0000311097 00000 n 0000311262 00000 n 0000311431 00000 n 0000311601 00000 n 0000311771 00000 n 0000311935 00000 n 0000312100 00000 n 0000312265 00000 n 0000312430 00000 n 0000312589 00000 n 0000312754 00000 n 0000312919 00000 n 0000313076 00000 n 0000313235 00000 n 0000313394 00000 n 0000313550 00000 n 0000313709 00000 n 0000313873 00000 n 0000314042 00000 n 0000314211 00000 n 0000314375 00000 n 0000314544 00000 n 0000314713 00000 n 0000314872 00000 n 0000315036 00000 n 0000315200 00000 n 0000315364 00000 n 0000315528 00000 n 0000315691 00000 n 0000315855 00000 n 0000316017 00000 n 0000316178 00000 n 0000330524 00000 n 0000319967 00000 n 0000316505 00000 n 0000330459 00000 n 0000320635 00000 n 0000320799 00000 n 0000320968 00000 n 0000321137 00000 n 0000321305 00000 n 0000321469 00000 n 0000321633 00000 n 0000321797 00000 n 0000321961 00000 n 0000322125 00000 n 0000322289 00000 n 0000322458 00000 n 0000322627 00000 n 0000322795 00000 n 0000322964 00000 n 0000323133 00000 n 0000323302 00000 n 0000323471 00000 n 0000323640 00000 n 0000323808 00000 n 0000323978 00000 n 0000324148 00000 n 0000324318 00000 n 0000324488 00000 n 0000324658 00000 n 0000324828 00000 n 0000324998 00000 n 0000325168 00000 n 0000325337 00000 n 0000325507 00000 n 0000325676 00000 n 0000325846 00000 n 0000326010 00000 n 0000326174 00000 n 0000326338 00000 n 0000326502 00000 n 0000326666 00000 n 0000326830 00000 n 0000326994 00000 n 0000327157 00000 n 0000327321 00000 n 0000327485 00000 n 0000327649 00000 n 0000327813 00000 n 0000327982 00000 n 0000328150 00000 n 0000328319 00000 n 0000328488 00000 n 0000328645 00000 n 0000328808 00000 n 0000328975 00000 n 0000329143 00000 n 0000329306 00000 n 0000329469 00000 n 0000329632 00000 n 0000329795 00000 n 0000329963 00000 n 0000330129 00000 n 0000330294 00000 n 0000343771 00000 n 0000334192 00000 n 0000330624 00000 n 0000343706 00000 n 0000334824 00000 n 0000334987 00000 n 0000335150 00000 n 0000335308 00000 n 0000335476 00000 n 0000335639 00000 n 0000335807 00000 n 0000335975 00000 n 0000336142 00000 n 0001129280 00000 n 0001107946 00000 n 0001129104 00000 n 0000336309 00000 n 0000336477 00000 n 0000336633 00000 n 0000336791 00000 n 0000336949 00000 n 0000337112 00000 n 0000337275 00000 n 0000337433 00000 n 0000337589 00000 n 0000337747 00000 n 0000337910 00000 n 0000338068 00000 n 0000338226 00000 n 0000338383 00000 n 0000338541 00000 n 0000338703 00000 n 0000338860 00000 n 0000339023 00000 n 0000339181 00000 n 0000339344 00000 n 0000339507 00000 n 0000339670 00000 n 0000339828 00000 n 0000339991 00000 n 0000340154 00000 n 0000340317 00000 n 0000340480 00000 n 0000340643 00000 n 0000340806 00000 n 0000340974 00000 n 0000341141 00000 n 0000341308 00000 n 0000341476 00000 n 0000341644 00000 n 0000341812 00000 n 0000341974 00000 n 0000342131 00000 n 0000342289 00000 n 0000342447 00000 n 0000342605 00000 n 0000342763 00000 n 0000342921 00000 n 0000343079 00000 n 0000343237 00000 n 0000343393 00000 n 0000343549 00000 n 0000347466 00000 n 0000344914 00000 n 0000343885 00000 n 0000347401 00000 n 0000345178 00000 n 0000345337 00000 n 0000345496 00000 n 0000345654 00000 n 0000345813 00000 n 0000345972 00000 n 0000346131 00000 n 0001106967 00000 n 0001086840 00000 n 0001106792 00000 n 0000346290 00000 n 0000346449 00000 n 0000346607 00000 n 0000346766 00000 n 0000346924 00000 n 0000347083 00000 n 0000347242 00000 n 0001206174 00000 n 0000350589 00000 n 0000349822 00000 n 0000347567 00000 n 0000350010 00000 n 0000350138 00000 n 0000350266 00000 n 0000350394 00000 n 0000350459 00000 n 0000350524 00000 n 0001085998 00000 n 0001067298 00000 n 0001085823 00000 n 0000355126 00000 n 0000353985 00000 n 0000350717 00000 n 0000354487 00000 n 0000354552 00000 n 0000354679 00000 n 0000354807 00000 n 0000354935 00000 n 0000354141 00000 n 0000354335 00000 n 0000355061 00000 n 0000721448 00000 n 0000782640 00000 n 0000359808 00000 n 0000358750 00000 n 0000355254 00000 n 0000359231 00000 n 0000359359 00000 n 0000358906 00000 n 0000359069 00000 n 0000359487 00000 n 0000359615 00000 n 0000359743 00000 n 0000375605 00000 n 0000363049 00000 n 0000362474 00000 n 0000359936 00000 n 0000362600 00000 n 0000362728 00000 n 0000362856 00000 n 0000362984 00000 n 0000366507 00000 n 0000365341 00000 n 0000363163 00000 n 0000365803 00000 n 0000365931 00000 n 0000366059 00000 n 0000366187 00000 n 0000366315 00000 n 0000365497 00000 n 0000365650 00000 n 0000366442 00000 n 0000627518 00000 n 0000367584 00000 n 0000367265 00000 n 0000366593 00000 n 0000367391 00000 n 0000367519 00000 n 0001206299 00000 n 0000369627 00000 n 0000368924 00000 n 0000367684 00000 n 0000369050 00000 n 0000369178 00000 n 0000369305 00000 n 0000369433 00000 n 0000369562 00000 n 0000372206 00000 n 0000371576 00000 n 0000369727 00000 n 0000371882 00000 n 0000372011 00000 n 0000372076 00000 n 0000372141 00000 n 0000371723 00000 n 0000604772 00000 n 0000375799 00000 n 0000375094 00000 n 0000372320 00000 n 0000375220 00000 n 0000375349 00000 n 0000375476 00000 n 0001066576 00000 n 0001053199 00000 n 0001066397 00000 n 0000375734 00000 n 0000380671 00000 n 0000380110 00000 n 0000375927 00000 n 0000380606 00000 n 0000380266 00000 n 0000380420 00000 n 0000955743 00000 n 0000485787 00000 n 0000382913 00000 n 0000382465 00000 n 0000380826 00000 n 0000382591 00000 n 0000382719 00000 n 0000382784 00000 n 0000382849 00000 n 0000383382 00000 n 0000383191 00000 n 0000383041 00000 n 0000383317 00000 n 0001206424 00000 n 0000386078 00000 n 0000388668 00000 n 0000385913 00000 n 0000383424 00000 n 0000388216 00000 n 0000388345 00000 n 0000388474 00000 n 0000387721 00000 n 0000387883 00000 n 0001052293 00000 n 0001042273 00000 n 0001052119 00000 n 0001041709 00000 n 0001032622 00000 n 0001041534 00000 n 0000388603 00000 n 0000388045 00000 n 0000387550 00000 n 0000387608 00000 n 0000387698 00000 n 0000541930 00000 n 0000582017 00000 n 0000710797 00000 n 0000393435 00000 n 0000392499 00000 n 0000388839 00000 n 0000392983 00000 n 0000393112 00000 n 0001032021 00000 n 0001019599 00000 n 0001031842 00000 n 0000393241 00000 n 0000392655 00000 n 0000392821 00000 n 0000393370 00000 n 0000786671 00000 n 0000397354 00000 n 0000396845 00000 n 0000393591 00000 n 0000397160 00000 n 0000397289 00000 n 0000396992 00000 n 0000398502 00000 n 0000398311 00000 n 0000397495 00000 n 0000398437 00000 n 0000400368 00000 n 0000400048 00000 n 0000398603 00000 n 0000400174 00000 n 0000400303 00000 n 0000403663 00000 n 0000402828 00000 n 0000400482 00000 n 0000402954 00000 n 0000403083 00000 n 0000403212 00000 n 0000403340 00000 n 0000403469 00000 n 0000403598 00000 n 0001206549 00000 n 0000407717 00000 n 0000406821 00000 n 0000403805 00000 n 0000407138 00000 n 0000407267 00000 n 0000407395 00000 n 0000406968 00000 n 0000407523 00000 n 0000407652 00000 n 0000411744 00000 n 0000411166 00000 n 0000407858 00000 n 0000411292 00000 n 0000411421 00000 n 0000411550 00000 n 0000411679 00000 n 0000415671 00000 n 0000415222 00000 n 0000411886 00000 n 0000415348 00000 n 0000415477 00000 n 0000415606 00000 n 0000417984 00000 n 0000417793 00000 n 0000415799 00000 n 0000417919 00000 n 0000421253 00000 n 0000420675 00000 n 0000418128 00000 n 0000420801 00000 n 0001019324 00000 n 0001015966 00000 n 0001019145 00000 n 0000420930 00000 n 0000421059 00000 n 0000421188 00000 n 0000425521 00000 n 0000424842 00000 n 0000421424 00000 n 0000425327 00000 n 0000425456 00000 n 0001015611 00000 n 0001013613 00000 n 0001015446 00000 n 0000424998 00000 n 0000425162 00000 n 0001206674 00000 n 0000875141 00000 n 0000892172 00000 n 0000428887 00000 n 0000428183 00000 n 0000425649 00000 n 0000428309 00000 n 0000428438 00000 n 0000428567 00000 n 0000428696 00000 n 0000428823 00000 n 0000432292 00000 n 0000431329 00000 n 0000429001 00000 n 0000431455 00000 n 0000431584 00000 n 0000431713 00000 n 0000431841 00000 n 0000431970 00000 n 0000432098 00000 n 0000432227 00000 n 0000436414 00000 n 0000435655 00000 n 0000432420 00000 n 0000435962 00000 n 0000436091 00000 n 0000436220 00000 n 0000435802 00000 n 0000436349 00000 n 0000666455 00000 n 0000439945 00000 n 0000439496 00000 n 0000436528 00000 n 0000439622 00000 n 0000439751 00000 n 0000439880 00000 n 0000442741 00000 n 0000442293 00000 n 0000440115 00000 n 0000442419 00000 n 0000442548 00000 n 0000442676 00000 n 0000445459 00000 n 0000445139 00000 n 0000442898 00000 n 0000445265 00000 n 0000445394 00000 n 0001206799 00000 n 0000448367 00000 n 0000447531 00000 n 0000445573 00000 n 0000447657 00000 n 0000447786 00000 n 0000447915 00000 n 0000448044 00000 n 0000448173 00000 n 0000448302 00000 n 0000450998 00000 n 0000450678 00000 n 0000448481 00000 n 0000450804 00000 n 0000450933 00000 n 0000456715 00000 n 0000453935 00000 n 0000453486 00000 n 0000451112 00000 n 0000453612 00000 n 0000453741 00000 n 0000453870 00000 n 0000458254 00000 n 0000456568 00000 n 0000454063 00000 n 0000457802 00000 n 0000457931 00000 n 0000457641 00000 n 0000458060 00000 n 0000458189 00000 n 0000782382 00000 n 0000460997 00000 n 0000460419 00000 n 0000458425 00000 n 0000460545 00000 n 0000460674 00000 n 0000460803 00000 n 0000460932 00000 n 0000461438 00000 n 0000461247 00000 n 0000461097 00000 n 0000461373 00000 n 0001206924 00000 n 0000465525 00000 n 0000464759 00000 n 0000461480 00000 n 0000465073 00000 n 0000465202 00000 n 0000465330 00000 n 0000465395 00000 n 0000465460 00000 n 0000464906 00000 n 0000473755 00000 n 0000470220 00000 n 0000470029 00000 n 0000465625 00000 n 0000470155 00000 n 0000474207 00000 n 0000473500 00000 n 0000470362 00000 n 0000473626 00000 n 0000473884 00000 n 0000474013 00000 n 0000474142 00000 n 0000477126 00000 n 0000476420 00000 n 0000474348 00000 n 0000476546 00000 n 0000476675 00000 n 0000476804 00000 n 0000476933 00000 n 0000476998 00000 n 0000477062 00000 n 0000480495 00000 n 0000479919 00000 n 0000477283 00000 n 0000480045 00000 n 0000480173 00000 n 0000480302 00000 n 0000480366 00000 n 0000480430 00000 n 0000485852 00000 n 0000485064 00000 n 0000480609 00000 n 0000485530 00000 n 0000485659 00000 n 0000485220 00000 n 0000485371 00000 n 0001207049 00000 n 0000994592 00000 n 0000489838 00000 n 0000488438 00000 n 0000485993 00000 n 0000489129 00000 n 0000489258 00000 n 0000489387 00000 n 0000489516 00000 n 0000489645 00000 n 0000488603 00000 n 0000488755 00000 n 0000488942 00000 n 0000489773 00000 n 0000493666 00000 n 0000493217 00000 n 0000489966 00000 n 0000493343 00000 n 0000493472 00000 n 0000493601 00000 n 0000497913 00000 n 0000497535 00000 n 0000493794 00000 n 0000497848 00000 n 0000497682 00000 n 0000500441 00000 n 0000500633 00000 n 0000500186 00000 n 0000498027 00000 n 0000500312 00000 n 0000500506 00000 n 0000500570 00000 n 0000503937 00000 n 0000503746 00000 n 0000500747 00000 n 0000503872 00000 n 0000507367 00000 n 0000507047 00000 n 0000504051 00000 n 0000507173 00000 n 0000507302 00000 n 0001207174 00000 n 0000510891 00000 n 0000510570 00000 n 0000507495 00000 n 0000510696 00000 n 0000510761 00000 n 0000510826 00000 n 0000514312 00000 n 0000513142 00000 n 0000510992 00000 n 0000513602 00000 n 0000513731 00000 n 0000513860 00000 n 0000513298 00000 n 0000513451 00000 n 0000513989 00000 n 0000514118 00000 n 0000514247 00000 n 0000515847 00000 n 0000515656 00000 n 0000514426 00000 n 0000515782 00000 n 0000517350 00000 n 0000517159 00000 n 0000515948 00000 n 0000517285 00000 n 0000518861 00000 n 0000518670 00000 n 0000517451 00000 n 0000518796 00000 n 0000521060 00000 n 0000520740 00000 n 0000518962 00000 n 0000520866 00000 n 0000520995 00000 n 0001207299 00000 n 0000524632 00000 n 0000524441 00000 n 0000521174 00000 n 0000524567 00000 n 0000528882 00000 n 0000528513 00000 n 0000524774 00000 n 0000528817 00000 n 0000528660 00000 n 0000750486 00000 n 0000532831 00000 n 0000532449 00000 n 0000529010 00000 n 0000532766 00000 n 0000532596 00000 n 0000537440 00000 n 0000537044 00000 n 0000532959 00000 n 0000537375 00000 n 0000537191 00000 n 0000541995 00000 n 0000541319 00000 n 0000537582 00000 n 0000541801 00000 n 0000541475 00000 n 0000541644 00000 n 0000545818 00000 n 0000545498 00000 n 0000542123 00000 n 0000545624 00000 n 0000545689 00000 n 0000545753 00000 n 0001207424 00000 n 0000550885 00000 n 0000549757 00000 n 0000545946 00000 n 0000550820 00000 n 0000549940 00000 n 0000550094 00000 n 0000550279 00000 n 0000550453 00000 n 0000550638 00000 n 0000656973 00000 n 0000555149 00000 n 0000554958 00000 n 0000551069 00000 n 0000555084 00000 n 0000559362 00000 n 0000559171 00000 n 0000555277 00000 n 0000559297 00000 n 0000563007 00000 n 0000562816 00000 n 0000559476 00000 n 0000562942 00000 n 0000567638 00000 n 0000566651 00000 n 0000563121 00000 n 0000567316 00000 n 0000566816 00000 n 0000566981 00000 n 0000567444 00000 n 0000567147 00000 n 0000567573 00000 n 0000673516 00000 n 0000571087 00000 n 0000570579 00000 n 0000567752 00000 n 0000570893 00000 n 0000571022 00000 n 0000570726 00000 n 0001207549 00000 n 0000575417 00000 n 0000574726 00000 n 0000571244 00000 n 0000575223 00000 n 0000574882 00000 n 0000575052 00000 n 0000575352 00000 n 0000770096 00000 n 0000579164 00000 n 0000578844 00000 n 0000575545 00000 n 0000578970 00000 n 0000579099 00000 n 0000582082 00000 n 0000581762 00000 n 0000579278 00000 n 0000581888 00000 n 0000586113 00000 n 0000585922 00000 n 0000582253 00000 n 0000586048 00000 n 0000589553 00000 n 0000589055 00000 n 0000586227 00000 n 0000589360 00000 n 0000589489 00000 n 0000589202 00000 n 0000593870 00000 n 0000593064 00000 n 0000589710 00000 n 0000593548 00000 n 0000593677 00000 n 0000593220 00000 n 0000593805 00000 n 0000593394 00000 n 0001207674 00000 n 0000597895 00000 n 0000597577 00000 n 0000593984 00000 n 0000597703 00000 n 0000597830 00000 n 0000601609 00000 n 0000600817 00000 n 0000598023 00000 n 0000601287 00000 n 0000601416 00000 n 0000601544 00000 n 0000600973 00000 n 0000601134 00000 n 0000604837 00000 n 0000604329 00000 n 0000601780 00000 n 0000604643 00000 n 0000604476 00000 n 0000608443 00000 n 0000607994 00000 n 0000604951 00000 n 0000608120 00000 n 0000608185 00000 n 0000608250 00000 n 0000608378 00000 n 0000612443 00000 n 0000612070 00000 n 0000608628 00000 n 0000612378 00000 n 0000612217 00000 n 0000616887 00000 n 0000616385 00000 n 0000612614 00000 n 0000616695 00000 n 0000616532 00000 n 0000616824 00000 n 0001207799 00000 n 0000746721 00000 n 0000620634 00000 n 0000620124 00000 n 0000617015 00000 n 0000620440 00000 n 0000620271 00000 n 0000620569 00000 n 0000670761 00000 n 0000622375 00000 n 0000622184 00000 n 0000620775 00000 n 0000622310 00000 n 0000624120 00000 n 0000623929 00000 n 0000622475 00000 n 0000624055 00000 n 0000627583 00000 n 0000627263 00000 n 0000624220 00000 n 0000627389 00000 n 0000632281 00000 n 0000631735 00000 n 0000627753 00000 n 0000632087 00000 n 0000632216 00000 n 0000631882 00000 n 0000636511 00000 n 0000636191 00000 n 0000632409 00000 n 0000636317 00000 n 0000636446 00000 n 0001207924 00000 n 0000640643 00000 n 0000640452 00000 n 0000636652 00000 n 0000640578 00000 n 0000643549 00000 n 0000643230 00000 n 0000640770 00000 n 0000643356 00000 n 0000643485 00000 n 0000648262 00000 n 0000648071 00000 n 0000643677 00000 n 0000648197 00000 n 0000652313 00000 n 0000651993 00000 n 0000648376 00000 n 0000652119 00000 n 0000652248 00000 n 0000657038 00000 n 0000656547 00000 n 0000652441 00000 n 0000656845 00000 n 0000656694 00000 n 0000662533 00000 n 0000660971 00000 n 0000657152 00000 n 0000662210 00000 n 0000661163 00000 n 0000662339 00000 n 0000662468 00000 n 0000661323 00000 n 0000661498 00000 n 0000661676 00000 n 0000661856 00000 n 0000662032 00000 n 0001208049 00000 n 0000666519 00000 n 0000665638 00000 n 0000662661 00000 n 0000665939 00000 n 0000666068 00000 n 0000666197 00000 n 0000665785 00000 n 0000666326 00000 n 0000670953 00000 n 0000670506 00000 n 0000666633 00000 n 0000670632 00000 n 0000670890 00000 n 0000673581 00000 n 0000673261 00000 n 0000671095 00000 n 0000673387 00000 n 0000675208 00000 n 0000675017 00000 n 0000673695 00000 n 0000675143 00000 n 0000676793 00000 n 0000676602 00000 n 0000675309 00000 n 0000676728 00000 n 0000678173 00000 n 0000677982 00000 n 0000676894 00000 n 0000678108 00000 n 0001208174 00000 n 0000681825 00000 n 0000681246 00000 n 0000678274 00000 n 0000681372 00000 n 0000681501 00000 n 0000681630 00000 n 0000681695 00000 n 0000681760 00000 n 0000684713 00000 n 0000684522 00000 n 0000681939 00000 n 0000684648 00000 n 0000689077 00000 n 0000687932 00000 n 0000684827 00000 n 0000688755 00000 n 0000688106 00000 n 0000688883 00000 n 0000689012 00000 n 0000688274 00000 n 0000688434 00000 n 0000688595 00000 n 0000994559 00000 n 0000695084 00000 n 0000692484 00000 n 0000689205 00000 n 0000695019 00000 n 0000692748 00000 n 0000692910 00000 n 0000693072 00000 n 0000693243 00000 n 0000693405 00000 n 0000693568 00000 n 0000693730 00000 n 0000693893 00000 n 0000694055 00000 n 0000694218 00000 n 0000694380 00000 n 0000694543 00000 n 0000694697 00000 n 0000694860 00000 n 0000700317 00000 n 0000698396 00000 n 0000695212 00000 n 0000700252 00000 n 0000698624 00000 n 0000698787 00000 n 0000698954 00000 n 0000699124 00000 n 0000699286 00000 n 0000699448 00000 n 0000699610 00000 n 0000699772 00000 n 0000699935 00000 n 0000700089 00000 n 0000705530 00000 n 0000703324 00000 n 0000700445 00000 n 0000705465 00000 n 0000703570 00000 n 0000703723 00000 n 0000703877 00000 n 0000704027 00000 n 0000704181 00000 n 0000704343 00000 n 0000704505 00000 n 0000704667 00000 n 0000704829 00000 n 0000704990 00000 n 0000705152 00000 n 0000705313 00000 n 0001208299 00000 n 0000710861 00000 n 0000709343 00000 n 0000705644 00000 n 0000710668 00000 n 0000709544 00000 n 0000709707 00000 n 0000709858 00000 n 0000710023 00000 n 0000710189 00000 n 0000710351 00000 n 0000710505 00000 n 0000714800 00000 n 0000714479 00000 n 0000711003 00000 n 0000714605 00000 n 0000714670 00000 n 0000714735 00000 n 0000717577 00000 n 0000717386 00000 n 0000714942 00000 n 0000717512 00000 n 0000721772 00000 n 0000720703 00000 n 0000717735 00000 n 0000721190 00000 n 0000721319 00000 n 0000721577 00000 n 0000720859 00000 n 0000721029 00000 n 0000721642 00000 n 0000721707 00000 n 0000725224 00000 n 0000724904 00000 n 0000721900 00000 n 0000725030 00000 n 0000725095 00000 n 0000725159 00000 n 0000728709 00000 n 0000728388 00000 n 0000725325 00000 n 0000728514 00000 n 0000728579 00000 n 0000728644 00000 n 0001208424 00000 n 0000732633 00000 n 0000731924 00000 n 0000728824 00000 n 0000732050 00000 n 0000732179 00000 n 0000732244 00000 n 0000732309 00000 n 0000732374 00000 n 0000732439 00000 n 0000732568 00000 n 0000736862 00000 n 0000736025 00000 n 0000732747 00000 n 0000736151 00000 n 0000736216 00000 n 0000736281 00000 n 0000736410 00000 n 0000736475 00000 n 0000736540 00000 n 0000736669 00000 n 0000736734 00000 n 0000736798 00000 n 0000739891 00000 n 0000739189 00000 n 0000736990 00000 n 0000739315 00000 n 0000739442 00000 n 0000739569 00000 n 0000739698 00000 n 0000739826 00000 n 0000742592 00000 n 0000742015 00000 n 0000740090 00000 n 0000742141 00000 n 0000742270 00000 n 0000742399 00000 n 0000742464 00000 n 0000742528 00000 n 0000746786 00000 n 0000746466 00000 n 0000742777 00000 n 0000746592 00000 n 0000750551 00000 n 0000749791 00000 n 0000746913 00000 n 0000750098 00000 n 0000750227 00000 n 0000750292 00000 n 0000750357 00000 n 0000749938 00000 n 0001208549 00000 n 0000754239 00000 n 0000753660 00000 n 0000750665 00000 n 0000753786 00000 n 0000753915 00000 n 0000754044 00000 n 0000754109 00000 n 0000754174 00000 n 0000757836 00000 n 0000756942 00000 n 0000754353 00000 n 0000757254 00000 n 0000757089 00000 n 0000757383 00000 n 0000757448 00000 n 0000757513 00000 n 0000757642 00000 n 0000757707 00000 n 0000757772 00000 n 0000994526 00000 n 0000762020 00000 n 0000761571 00000 n 0000757950 00000 n 0000761697 00000 n 0000761826 00000 n 0000761891 00000 n 0000761956 00000 n 0000764063 00000 n 0000763743 00000 n 0000762148 00000 n 0000763869 00000 n 0001013332 00000 n 0001006048 00000 n 0001013152 00000 n 0000763998 00000 n 0000765975 00000 n 0000765528 00000 n 0000764205 00000 n 0000765654 00000 n 0000765783 00000 n 0000765910 00000 n 0000770161 00000 n 0000769455 00000 n 0000766089 00000 n 0000769581 00000 n 0001005727 00000 n 0000996514 00000 n 0001005541 00000 n 0000769710 00000 n 0000769839 00000 n 0000769967 00000 n 0001208674 00000 n 0000771194 00000 n 0000771003 00000 n 0000770388 00000 n 0000771129 00000 n 0000771622 00000 n 0000771431 00000 n 0000771281 00000 n 0000771557 00000 n 0000774936 00000 n 0000773710 00000 n 0000771664 00000 n 0000774227 00000 n 0000774356 00000 n 0000774485 00000 n 0000774614 00000 n 0000774743 00000 n 0000774872 00000 n 0000773866 00000 n 0000774038 00000 n 0000775391 00000 n 0000775200 00000 n 0000775050 00000 n 0000775326 00000 n 0000778636 00000 n 0000778058 00000 n 0000775433 00000 n 0000778184 00000 n 0000778313 00000 n 0000778442 00000 n 0000778571 00000 n 0000782833 00000 n 0000781614 00000 n 0000778722 00000 n 0000782124 00000 n 0000782253 00000 n 0000782511 00000 n 0000781770 00000 n 0000781949 00000 n 0000782705 00000 n 0000782769 00000 n 0001208799 00000 n 0000789723 00000 n 0000785895 00000 n 0000782989 00000 n 0000786021 00000 n 0000786086 00000 n 0000786151 00000 n 0000786216 00000 n 0000786281 00000 n 0000786346 00000 n 0000786411 00000 n 0000786476 00000 n 0000786541 00000 n 0000786606 00000 n 0000786736 00000 n 0000786801 00000 n 0000786866 00000 n 0000786931 00000 n 0000786996 00000 n 0000787061 00000 n 0000787126 00000 n 0000787191 00000 n 0000787256 00000 n 0000787321 00000 n 0000787386 00000 n 0000787451 00000 n 0000787516 00000 n 0000787581 00000 n 0000787646 00000 n 0000787711 00000 n 0000787776 00000 n 0000787841 00000 n 0000787906 00000 n 0000787971 00000 n 0000788036 00000 n 0000788101 00000 n 0000788166 00000 n 0000788231 00000 n 0000788295 00000 n 0000788360 00000 n 0000788425 00000 n 0000788490 00000 n 0000788555 00000 n 0000788620 00000 n 0000788685 00000 n 0000788750 00000 n 0000788815 00000 n 0000788880 00000 n 0000788945 00000 n 0000789010 00000 n 0000789075 00000 n 0000789140 00000 n 0000789205 00000 n 0000789270 00000 n 0000789335 00000 n 0000789400 00000 n 0000789465 00000 n 0000789530 00000 n 0000789595 00000 n 0000789659 00000 n 0000796371 00000 n 0000792807 00000 n 0000789837 00000 n 0000792933 00000 n 0000792998 00000 n 0000793063 00000 n 0000793128 00000 n 0000793193 00000 n 0000793258 00000 n 0000793323 00000 n 0000793388 00000 n 0000793453 00000 n 0000793518 00000 n 0000793583 00000 n 0000793648 00000 n 0000793712 00000 n 0000793777 00000 n 0000793842 00000 n 0000793907 00000 n 0000793972 00000 n 0000794037 00000 n 0000794102 00000 n 0000794167 00000 n 0000794232 00000 n 0000794297 00000 n 0000794362 00000 n 0000794427 00000 n 0000794491 00000 n 0000794556 00000 n 0000794621 00000 n 0000794686 00000 n 0000794751 00000 n 0000794816 00000 n 0000794881 00000 n 0000794946 00000 n 0000795011 00000 n 0000795076 00000 n 0000795141 00000 n 0000795206 00000 n 0000795271 00000 n 0000795336 00000 n 0000795401 00000 n 0000795466 00000 n 0000795530 00000 n 0000795594 00000 n 0000795658 00000 n 0000795723 00000 n 0000795788 00000 n 0000795853 00000 n 0000795918 00000 n 0000795983 00000 n 0000796048 00000 n 0000796113 00000 n 0000796178 00000 n 0000796243 00000 n 0000796307 00000 n 0000802546 00000 n 0000799108 00000 n 0000796485 00000 n 0000799234 00000 n 0000799299 00000 n 0000799364 00000 n 0000799429 00000 n 0000799494 00000 n 0000799559 00000 n 0000799624 00000 n 0000799689 00000 n 0000799754 00000 n 0000799819 00000 n 0000799884 00000 n 0000799949 00000 n 0000800014 00000 n 0000800079 00000 n 0000800144 00000 n 0000800209 00000 n 0000800274 00000 n 0000800339 00000 n 0000800404 00000 n 0000800469 00000 n 0000800534 00000 n 0000800599 00000 n 0000800664 00000 n 0000800729 00000 n 0000800794 00000 n 0000800859 00000 n 0000800924 00000 n 0000800989 00000 n 0000801054 00000 n 0000801119 00000 n 0000801184 00000 n 0000801249 00000 n 0000801314 00000 n 0000801379 00000 n 0000801443 00000 n 0000801508 00000 n 0000801573 00000 n 0000801638 00000 n 0000801703 00000 n 0000801768 00000 n 0000801833 00000 n 0000801898 00000 n 0000801963 00000 n 0000802028 00000 n 0000802093 00000 n 0000802158 00000 n 0000802223 00000 n 0000802288 00000 n 0000802353 00000 n 0000802418 00000 n 0000802482 00000 n 0000808065 00000 n 0000805669 00000 n 0000802660 00000 n 0000805795 00000 n 0000805860 00000 n 0000805925 00000 n 0000805990 00000 n 0000806055 00000 n 0000806120 00000 n 0000806185 00000 n 0000806250 00000 n 0000806315 00000 n 0000806380 00000 n 0000806445 00000 n 0000806510 00000 n 0000806575 00000 n 0000806639 00000 n 0000806704 00000 n 0000806769 00000 n 0000806834 00000 n 0000806899 00000 n 0000806964 00000 n 0000807029 00000 n 0000807094 00000 n 0000807159 00000 n 0000807224 00000 n 0000807289 00000 n 0000807354 00000 n 0000807482 00000 n 0000807611 00000 n 0000807676 00000 n 0000807741 00000 n 0000807806 00000 n 0000807871 00000 n 0000808000 00000 n 0000811273 00000 n 0000810566 00000 n 0000808192 00000 n 0000810692 00000 n 0000810821 00000 n 0000810950 00000 n 0000811079 00000 n 0000811208 00000 n 0000814765 00000 n 0000814008 00000 n 0000811400 00000 n 0000814315 00000 n 0000814444 00000 n 0000814155 00000 n 0000814572 00000 n 0000814700 00000 n 0001208924 00000 n 0000818009 00000 n 0000817431 00000 n 0000814892 00000 n 0000817557 00000 n 0000817686 00000 n 0000817815 00000 n 0000817944 00000 n 0000820917 00000 n 0000820597 00000 n 0000818123 00000 n 0000820723 00000 n 0000820852 00000 n 0000823507 00000 n 0000823058 00000 n 0000821087 00000 n 0000823184 00000 n 0000823313 00000 n 0000823442 00000 n 0000823948 00000 n 0000823757 00000 n 0000823607 00000 n 0000823883 00000 n 0000826727 00000 n 0000826083 00000 n 0000823990 00000 n 0000826209 00000 n 0000826338 00000 n 0000826467 00000 n 0000826532 00000 n 0000826597 00000 n 0000826662 00000 n 0000831061 00000 n 0000830740 00000 n 0000826841 00000 n 0000830866 00000 n 0000830931 00000 n 0000830996 00000 n 0001209049 00000 n 0000834824 00000 n 0000834568 00000 n 0000831217 00000 n 0000834694 00000 n 0000834759 00000 n 0000838115 00000 n 0000837924 00000 n 0000834966 00000 n 0000838050 00000 n 0000841634 00000 n 0000841443 00000 n 0000838243 00000 n 0000841569 00000 n 0000845099 00000 n 0000844584 00000 n 0000841776 00000 n 0000844710 00000 n 0000844775 00000 n 0000844840 00000 n 0000844905 00000 n 0000844970 00000 n 0000845035 00000 n 0000849298 00000 n 0000848783 00000 n 0000845255 00000 n 0000848909 00000 n 0000849038 00000 n 0000849103 00000 n 0000849168 00000 n 0000849233 00000 n 0000852930 00000 n 0000852221 00000 n 0000849426 00000 n 0000852347 00000 n 0000852412 00000 n 0000852477 00000 n 0000852542 00000 n 0000852671 00000 n 0000852736 00000 n 0000852801 00000 n 0000852866 00000 n 0001209174 00000 n 0000856135 00000 n 0000855427 00000 n 0000853072 00000 n 0000855553 00000 n 0000855618 00000 n 0000855681 00000 n 0000855746 00000 n 0000855875 00000 n 0000855940 00000 n 0000856005 00000 n 0000856070 00000 n 0000859425 00000 n 0000859040 00000 n 0000856277 00000 n 0000859166 00000 n 0000859231 00000 n 0000859296 00000 n 0000859361 00000 n 0000862602 00000 n 0000862023 00000 n 0000859553 00000 n 0000862149 00000 n 0000862278 00000 n 0000862343 00000 n 0000862408 00000 n 0000862473 00000 n 0000862537 00000 n 0000865199 00000 n 0000864424 00000 n 0000862758 00000 n 0000864550 00000 n 0000864615 00000 n 0000864680 00000 n 0000864745 00000 n 0000864810 00000 n 0000864875 00000 n 0000865004 00000 n 0000865069 00000 n 0000865134 00000 n 0000868695 00000 n 0000868374 00000 n 0000865369 00000 n 0000868500 00000 n 0000868565 00000 n 0000868630 00000 n 0000872250 00000 n 0000871931 00000 n 0000868823 00000 n 0000872057 00000 n 0000872122 00000 n 0000872187 00000 n 0001209299 00000 n 0000875466 00000 n 0000874756 00000 n 0000872378 00000 n 0000874882 00000 n 0000874947 00000 n 0000875012 00000 n 0000875206 00000 n 0000875271 00000 n 0000875336 00000 n 0000875401 00000 n 0000879229 00000 n 0000879038 00000 n 0000875635 00000 n 0000879164 00000 n 0000882939 00000 n 0000882683 00000 n 0000879357 00000 n 0000882809 00000 n 0000882874 00000 n 0000886454 00000 n 0000886133 00000 n 0000883067 00000 n 0000886259 00000 n 0000886324 00000 n 0000886389 00000 n 0000889116 00000 n 0000888406 00000 n 0000886609 00000 n 0000888532 00000 n 0000888597 00000 n 0000888662 00000 n 0000888791 00000 n 0000888856 00000 n 0000888921 00000 n 0000888986 00000 n 0000889051 00000 n 0000892497 00000 n 0000891787 00000 n 0000889286 00000 n 0000891913 00000 n 0000891978 00000 n 0000892043 00000 n 0000892237 00000 n 0000892302 00000 n 0000892367 00000 n 0000892432 00000 n 0001209424 00000 n 0000895878 00000 n 0000895557 00000 n 0000892653 00000 n 0000895683 00000 n 0000895748 00000 n 0000895813 00000 n 0000899021 00000 n 0000898312 00000 n 0000895992 00000 n 0000898438 00000 n 0000898503 00000 n 0000898568 00000 n 0000898697 00000 n 0000898761 00000 n 0000898826 00000 n 0000898891 00000 n 0000898956 00000 n 0000903034 00000 n 0000902843 00000 n 0000899177 00000 n 0000902969 00000 n 0000906921 00000 n 0000906730 00000 n 0000903162 00000 n 0000906856 00000 n 0000910447 00000 n 0000910256 00000 n 0000907049 00000 n 0000910382 00000 n 0000913639 00000 n 0000913319 00000 n 0000910575 00000 n 0000913445 00000 n 0000913510 00000 n 0000913575 00000 n 0001209549 00000 n 0000916823 00000 n 0000916179 00000 n 0000913809 00000 n 0000916305 00000 n 0000916370 00000 n 0000916499 00000 n 0000916564 00000 n 0000916629 00000 n 0000916694 00000 n 0000916759 00000 n 0000919965 00000 n 0000919256 00000 n 0000916965 00000 n 0000919382 00000 n 0000919447 00000 n 0000919512 00000 n 0000919641 00000 n 0000919706 00000 n 0000919771 00000 n 0000919836 00000 n 0000919901 00000 n 0000922878 00000 n 0000922106 00000 n 0000920121 00000 n 0000922232 00000 n 0000922297 00000 n 0000922362 00000 n 0000922427 00000 n 0000922556 00000 n 0000922621 00000 n 0000922684 00000 n 0000922749 00000 n 0000922814 00000 n 0000926235 00000 n 0000926044 00000 n 0000923020 00000 n 0000926170 00000 n 0000929379 00000 n 0000928994 00000 n 0000926349 00000 n 0000929120 00000 n 0000929185 00000 n 0000929250 00000 n 0000929315 00000 n 0000932889 00000 n 0000932309 00000 n 0000929521 00000 n 0000932435 00000 n 0000932564 00000 n 0000932629 00000 n 0000932694 00000 n 0000932759 00000 n 0000932824 00000 n 0001209674 00000 n 0000935845 00000 n 0000935654 00000 n 0000933031 00000 n 0000935780 00000 n 0000938913 00000 n 0000938528 00000 n 0000936058 00000 n 0000938654 00000 n 0000938719 00000 n 0000938784 00000 n 0000938849 00000 n 0000941620 00000 n 0000940652 00000 n 0000939154 00000 n 0000940778 00000 n 0000940843 00000 n 0000940908 00000 n 0000941037 00000 n 0000941102 00000 n 0000941167 00000 n 0000941232 00000 n 0000941297 00000 n 0000941362 00000 n 0000941491 00000 n 0000941556 00000 n 0000946126 00000 n 0000945805 00000 n 0000941762 00000 n 0000945931 00000 n 0000945996 00000 n 0000946061 00000 n 0000949876 00000 n 0000949620 00000 n 0000946254 00000 n 0000949746 00000 n 0000949811 00000 n 0000953293 00000 n 0000953037 00000 n 0000950004 00000 n 0000953163 00000 n 0000953228 00000 n 0001209799 00000 n 0000955872 00000 n 0000955294 00000 n 0000953421 00000 n 0000955420 00000 n 0000955485 00000 n 0000955550 00000 n 0000955614 00000 n 0000955808 00000 n 0000959715 00000 n 0000959264 00000 n 0000956027 00000 n 0000959390 00000 n 0000959455 00000 n 0000959520 00000 n 0000959585 00000 n 0000959650 00000 n 0000963219 00000 n 0000963028 00000 n 0000959871 00000 n 0000963154 00000 n 0000966745 00000 n 0000966554 00000 n 0000963361 00000 n 0000966680 00000 n 0000970638 00000 n 0000970319 00000 n 0000966914 00000 n 0000970445 00000 n 0000970510 00000 n 0000970575 00000 n 0000974428 00000 n 0000973848 00000 n 0000970808 00000 n 0000973974 00000 n 0000974039 00000 n 0000974168 00000 n 0000974233 00000 n 0000974298 00000 n 0000974363 00000 n 0001209924 00000 n 0000976675 00000 n 0000976354 00000 n 0000974570 00000 n 0000976480 00000 n 0000976545 00000 n 0000976610 00000 n 0000980081 00000 n 0000979373 00000 n 0000976817 00000 n 0000979499 00000 n 0000979564 00000 n 0000979629 00000 n 0000979758 00000 n 0000979823 00000 n 0000979887 00000 n 0000979952 00000 n 0000980016 00000 n 0000983160 00000 n 0000982517 00000 n 0000980237 00000 n 0000982643 00000 n 0000982708 00000 n 0000982773 00000 n 0000982837 00000 n 0000982966 00000 n 0000983031 00000 n 0000983096 00000 n 0000986882 00000 n 0000986432 00000 n 0000983330 00000 n 0000986558 00000 n 0000986623 00000 n 0000986688 00000 n 0000986753 00000 n 0000986818 00000 n 0000989427 00000 n 0000988395 00000 n 0000987038 00000 n 0000988521 00000 n 0000988650 00000 n 0000988715 00000 n 0000988780 00000 n 0000988845 00000 n 0000988910 00000 n 0000988975 00000 n 0000989103 00000 n 0000989168 00000 n 0000989233 00000 n 0000989298 00000 n 0000989363 00000 n 0000992270 00000 n 0000991431 00000 n 0000989583 00000 n 0000991557 00000 n 0000991622 00000 n 0000991687 00000 n 0000991816 00000 n 0000991881 00000 n 0000991946 00000 n 0000992011 00000 n 0000992076 00000 n 0000992141 00000 n 0000992206 00000 n 0001210049 00000 n 0000994384 00000 n 0000993674 00000 n 0000992412 00000 n 0000993800 00000 n 0000993929 00000 n 0000993994 00000 n 0000994059 00000 n 0000994124 00000 n 0000994189 00000 n 0000994254 00000 n 0000994319 00000 n 0000994625 00000 n 0001005969 00000 n 0001013558 00000 n 0001015858 00000 n 0001015827 00000 n 0001019544 00000 n 0001032341 00000 n 0001042008 00000 n 0001052743 00000 n 0001066987 00000 n 0001086493 00000 n 0001107559 00000 n 0001129709 00000 n 0001147965 00000 n 0001150812 00000 n 0001150582 00000 n 0001178230 00000 n 0001205559 00000 n 0001210138 00000 n 0001210263 00000 n 0001210389 00000 n 0001210515 00000 n 0001210641 00000 n 0001210767 00000 n 0001210866 00000 n 0001210976 00000 n 0001233250 00000 n 0001258333 00000 n 0001258374 00000 n 0001258414 00000 n 0001258548 00000 n trailer << /Size 2855 /Root 2853 0 R /Info 2854 0 R /ID [ ] >> startxref 1258806 %%EOF bind9-9.9.5.dfsg/doc/arm/man.host.html0000644000470500017500000003011012271526120016770 0ustar lamontlamont host

    Name

    host — DNS lookup utility

    Synopsis

    host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]

    DESCRIPTION

    host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. When no arguments or options are given, host prints a short summary of its command line arguments and options.

    name is the domain name that is to be looked up. It can also be a dotted-decimal IPv4 address or a colon-delimited IPv6 address, in which case host will by default perform a reverse lookup for that address. server is an optional argument which is either the name or IP address of the name server that host should query instead of the server or servers listed in /etc/resolv.conf.

    The -a (all) option is equivalent to setting the -v option and asking host to make a query of type ANY.

    When the -C option is used, host will attempt to display the SOA records for zone name from all the listed authoritative name servers for that zone. The list of name servers is defined by the NS records that are found for the zone.

    The -c option instructs to make a DNS query of class class. This can be used to lookup Hesiod or Chaosnet class resource records. The default class is IN (Internet).

    Verbose output is generated by host when the -d or -v option is used. The two options are equivalent. They have been provided for backwards compatibility. In previous versions, the -d option switched on debugging traces and -v enabled verbose output.

    List mode is selected by the -l option. This makes host perform a zone transfer for zone name. Transfer the zone printing out the NS, PTR and address records (A/AAAA). If combined with -a all records will be printed.

    The -i option specifies that reverse lookups of IPv6 addresses should use the IP6.INT domain as defined in RFC1886. The default is to use IP6.ARPA.

    The -N option sets the number of dots that have to be in name for it to be considered absolute. The default value is that defined using the ndots statement in /etc/resolv.conf, or 1 if no ndots statement is present. Names with fewer dots are interpreted as relative names and will be searched for in the domains listed in the search or domain directive in /etc/resolv.conf.

    The number of UDP retries for a lookup can be changed with the -R option. number indicates how many times host will repeat a query that does not get answered. The default number of retries is 1. If number is negative or zero, the number of retries will default to 1.

    Non-recursive queries can be made via the -r option. Setting this option clears the RD — recursion desired — bit in the query which host makes. This should mean that the name server receiving the query will not attempt to resolve name. The -r option enables host to mimic the behavior of a name server by making non-recursive queries and expecting to receive answers to those queries that are usually referrals to other name servers.

    By default, host uses UDP when making queries. The -T option makes it use a TCP connection when querying the name server. TCP will be automatically selected for queries that require it, such as zone transfer (AXFR) requests.

    The -4 option forces host to only use IPv4 query transport. The -6 option forces host to only use IPv6 query transport.

    The -t option is used to select the query type. type can be any recognized query type: CNAME, NS, SOA, SIG, KEY, AXFR, etc. When no query type is specified, host automatically selects an appropriate query type. By default, it looks for A, AAAA, and MX records, but if the -C option was given, queries will be made for SOA records, and if name is a dotted-decimal IPv4 address or colon-delimited IPv6 address, host will query for PTR records. If a query type of IXFR is chosen the starting serial number can be specified by appending an equal followed by the starting serial number (e.g. -t IXFR=12345678).

    The time to wait for a reply can be controlled through the -W and -w options. The -W option makes host wait for wait seconds. If wait is less than one, the wait interval is set to one second. When the -w option is used, host will effectively wait forever for a reply. The time to wait for a response will be set to the number of seconds given by the hardware's maximum value for an integer quantity.

    The -s option tells host not to send the query to the next nameserver if any server responds with a SERVFAIL response, which is the reverse of normal stub resolver behavior.

    The -m can be used to set the memory usage debugging flags record, usage and trace.

    IDN SUPPORT

    If host has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. host appropriately converts character encoding of domain name before sending a request to DNS server or displaying a reply from the server. If you'd like to turn off the IDN support for some reason, defines the IDN_DISABLE environment variable. The IDN support is disabled if the variable is set when host runs.

    FILES

    /etc/resolv.conf

    SEE ALSO

    dig(1), named(8).

    bind9-9.9.5.dfsg/doc/arm/man.named-journalprint.html0000644000470500017500000001102712271526120021632 0ustar lamontlamont named-journalprint

    Name

    named-journalprint — print zone journal in human-readable form

    Synopsis

    named-journalprint {journal}

    DESCRIPTION

    named-journalprint prints the contents of a zone journal file in a human-readable form.

    Journal files are automatically created by named when changes are made to dynamic zones (e.g., by nsupdate). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension .jnl to the name of the corresponding zone file.

    named-journalprint converts the contents of a given journal file into a human-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master-file format.

    SEE ALSO

    named(8), nsupdate(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.html0000644000470500017500000006137512271526120016262 0ustar lamontlamont BIND 9 Administrator Reference Manual

    BIND 9 Administrator Reference Manual


    Table of Contents

    1. Introduction
    Scope of Document
    Organization of This Document
    Conventions Used in This Document
    The Domain Name System (DNS)
    DNS Fundamentals
    Domains and Domain Names
    Zones
    Authoritative Name Servers
    Caching Name Servers
    Name Servers in Multiple Roles
    2. BIND Resource Requirements
    Hardware requirements
    CPU Requirements
    Memory Requirements
    Name Server Intensive Environment Issues
    Supported Operating Systems
    3. Name Server Configuration
    Sample Configurations
    A Caching-only Name Server
    An Authoritative-only Name Server
    Load Balancing
    Name Server Operations
    Tools for Use With the Name Server Daemon
    Signals
    4. Advanced DNS Features
    Notify
    Dynamic Update
    The journal file
    Incremental Zone Transfers (IXFR)
    Split DNS
    Example split DNS setup
    TSIG
    Generate Shared Keys for Each Pair of Hosts
    Copying the Shared Secret to Both Machines
    Informing the Servers of the Key's Existence
    Instructing the Server to Use the Key
    TSIG Key Based Access Control
    Errors
    TKEY
    SIG(0)
    DNSSEC
    Generating Keys
    Signing the Zone
    Configuring Servers
    DNSSEC, Dynamic Zones, and Automatic Signing
    Converting from insecure to secure
    Dynamic DNS update method
    Fully automatic zone signing
    Private-type records
    DNSKEY rollovers
    Dynamic DNS update method
    Automatic key rollovers
    NSEC3PARAM rollovers via UPDATE
    Converting from NSEC to NSEC3
    Converting from NSEC3 to NSEC
    Converting from secure to insecure
    Periodic re-signing
    NSEC3 and OPTOUT
    Dynamic Trust Anchor Management
    Validating Resolver
    Authoritative Server
    PKCS #11 (Cryptoki) support
    Prerequisites
    Building BIND 9 with PKCS#11
    PKCS #11 Tools
    Using the HSM
    Specifying the engine on the command line
    Running named with automatic zone re-signing
    IPv6 Support in BIND 9
    Address Lookups Using AAAA Records
    Address to Name Lookups Using Nibble Format
    5. The BIND 9 Lightweight Resolver
    The Lightweight Resolver Library
    Running a Resolver Daemon
    6. BIND 9 Configuration Reference
    Configuration File Elements
    Address Match Lists
    Comment Syntax
    Configuration File Grammar
    acl Statement Grammar
    acl Statement Definition and Usage
    controls Statement Grammar
    controls Statement Definition and Usage
    include Statement Grammar
    include Statement Definition and Usage
    key Statement Grammar
    key Statement Definition and Usage
    logging Statement Grammar
    logging Statement Definition and Usage
    lwres Statement Grammar
    lwres Statement Definition and Usage
    masters Statement Grammar
    masters Statement Definition and Usage
    options Statement Grammar
    options Statement Definition and Usage
    server Statement Grammar
    server Statement Definition and Usage
    statistics-channels Statement Grammar
    statistics-channels Statement Definition and Usage
    trusted-keys Statement Grammar
    trusted-keys Statement Definition and Usage
    managed-keys Statement Grammar
    managed-keys Statement Definition and Usage
    view Statement Grammar
    view Statement Definition and Usage
    zone Statement Grammar
    zone Statement Definition and Usage
    Zone File
    Types of Resource Records and When to Use Them
    Discussion of MX Records
    Setting TTLs
    Inverse Mapping in IPv4
    Other Zone File Directives
    BIND Master File Extension: the $GENERATE Directive
    Additional File Formats
    BIND9 Statistics
    Statistics Counters
    7. BIND 9 Security Considerations
    Access Control Lists
    Chroot and Setuid
    The chroot Environment
    Using the setuid Function
    Dynamic Update Security
    8. Troubleshooting
    Common Problems
    It's not working; how can I figure out what's wrong?
    Incrementing and Changing the Serial Number
    Where Can I Get Help?
    A. Appendices
    Acknowledgments
    A Brief History of the DNS and BIND
    General DNS Reference Information
    IPv6 addresses (AAAA)
    Bibliography (and Suggested Reading)
    Request for Comments (RFCs)
    Internet Drafts
    Other Documents About BIND
    BIND 9 DNS Library Support
    Prerequisite
    Compilation
    Installation
    Known Defects/Restrictions
    The dns.conf File
    Sample Applications
    Library References
    I. Manual pages
    dig — DNS lookup utility
    host — DNS lookup utility
    dnssec-checkds — A DNSSEC delegation consistency checking tool.
    dnssec-coverage — checks future DNSKEY coverage for a zone
    dnssec-dsfromkey — DNSSEC DS RR generation tool
    dnssec-keyfromlabel — DNSSEC key generation tool
    dnssec-keygen — DNSSEC key generation tool
    dnssec-revoke — Set the REVOKED bit on a DNSSEC key
    dnssec-settime — Set the key timing metadata for a DNSSEC key
    dnssec-signzone — DNSSEC zone signing tool
    dnssec-verify — DNSSEC zone verification tool
    named-checkconf — named configuration file syntax checking tool
    named-checkzone — zone file validity checking or converting tool
    named — Internet domain name server
    named-journalprint — print zone journal in human-readable form
    nsupdate — Dynamic DNS update utility
    rndc — name server control utility
    rndc.conf — rndc configuration file
    rndc-confgen — rndc key generation tool
    ddns-confgen — ddns key generation tool
    arpaname — translate IP addresses to the corresponding ARPA names
    genrandom — generate a file containing random data
    isc-hmac-fixup — fixes HMAC keys generated by older versions of BIND
    nsec3hash — generate NSEC3 hash
    bind9-9.9.5.dfsg/doc/arm/man.dnssec-keyfromlabel.html0000644000470500017500000003612512271526120021760 0ustar lamontlamont dnssec-keyfromlabel

    Name

    dnssec-keyfromlabel — DNSSEC key generation tool

    Synopsis

    dnssec-keyfromlabel {-l label} [-3] [-a algorithm] [-A date/offset] [-c class] [-D date/offset] [-E engine] [-f flag] [-G] [-I date/offset] [-k] [-K directory] [-L ttl] [-n nametype] [-P date/offset] [-p protocol] [-R date/offset] [-t type] [-v level] [-y] {name}

    DESCRIPTION

    dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034.

    The name of the key is specified on the command line. This must match the name of the zone for which the key is being generated.

    OPTIONS

    -a algorithm

    Selects the cryptographic algorithm. The value of algorithm must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256 or ECDSAP384SHA384. These values are case insensitive.

    If no algorithm is specified, then RSASHA1 will be used by default, unless the -3 option is specified, in which case NSEC3RSASHA1 will be used instead. (If -3 is used and an algorithm is specified, that algorithm will be checked for compatibility with NSEC3.)

    Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended.

    Note 2: DH automatically sets the -k flag.

    -3

    Use an NSEC3-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default.

    -E engine

    Specifies the name of the crypto hardware (OpenSSL engine). When compiled with PKCS#11 support it defaults to "pkcs11".

    -l label

    Specifies the label of the key pair in the crypto hardware. The label may be preceded by an optional OpenSSL engine name, separated by a colon, as in "pkcs11:keylabel".

    -n nametype

    Specifies the owner type of the key. The value of nametype must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive.

    -C

    Compatibility mode: generates an old-style key, without any metadata. By default, dnssec-keyfromlabel will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the -C option suppresses them.

    -c class

    Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.

    -f flag

    Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.

    -G

    Generate a key, but do not publish it or sign with it. This option is incompatible with -P and -A.

    -h

    Prints a short summary of the options and arguments to dnssec-keyfromlabel.

    -K directory

    Sets the directory in which the key files are to be written.

    -k

    Generate KEY records rather than DNSKEY records.

    -L ttl

    Sets the default TTL to use for this key when it is converted into a DNSKEY RR. If the key is imported into a zone, this is the TTL that will be used for it, unless there was already a DNSKEY RRset in place, in which case the existing TTL would take precedence. Setting the default TTL to 0 or none removes it.

    -p protocol

    Sets the protocol value for the key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.

    -t type

    Indicates the use of the key. type must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF. AUTH refers to the ability to authenticate data, and CONF the ability to encrypt data.

    -v level

    Sets the debugging level.

    -y

    Allows DNSSEC key files to be generated even if the key ID would collide with that of an existing key, in the event of either key being revoked. (This is only safe to use if you are sure you won't be using RFC 5011 trust anchor maintenance with either of the keys involved.)

    TIMING OPTIONS

    Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24-hour days, ignoring leap years), months (defined as 30 24-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.

    -P date/offset

    Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the -G option has not been used, the default is "now".

    -A date/offset

    Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the -G option has not been used, the default is "now".

    -R date/offset

    Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.

    -I date/offset

    Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.

    -D date/offset

    Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)

    GENERATED KEY FILES

    When dnssec-keyfromlabel completes successfully, it prints a string of the form Knnnn.+aaa+iiiii to the standard output. This is an identification string for the key files it has generated.

    • nnnn is the key name.

    • aaa is the numeric representation of the algorithm.

    • iiiii is the key identifier (or footprint).

    dnssec-keyfromlabel creates two files, with names based on the printed string. Knnnn.+aaa+iiiii.key contains the public key, and Knnnn.+aaa+iiiii.private contains the private key.

    The .key file contains a DNS KEY record that can be inserted into a zone file (directly or with a $INCLUDE statement).

    The .private file contains algorithm-specific fields. For obvious security reasons, this file does not have general read permission.

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch04.html0000644000470500017500000027551512271526120017022 0ustar lamontlamont Chapter 4. Advanced DNS Features

    Chapter 4. Advanced DNS Features

    Notify

    DNS NOTIFY is a mechanism that allows master servers to notify their slave servers of changes to a zone's data. In response to a NOTIFY from a master server, the slave will check to see that its version of the zone is the current version and, if not, initiate a zone transfer.

    For more information about DNS NOTIFY, see the description of the notify option in the section called “Boolean Options” and the description of the zone option also-notify in the section called “Zone Transfers”. The NOTIFY protocol is specified in RFC 1996.

    Note

    As a slave zone can also be a master to other slaves, named, by default, sends NOTIFY messages for every zone it loads. Specifying notify master-only; will cause named to only send NOTIFY for master zones that it loads.

    Dynamic Update

    Dynamic Update is a method for adding, replacing or deleting records in a master server by sending it a special form of DNS messages. The format and meaning of these messages is specified in RFC 2136.

    Dynamic update is enabled by including an allow-update or an update-policy clause in the zone statement.

    If the zone's update-policy is set to local, updates to the zone will be permitted for the key local-ddns, which will be generated by named at startup. See the section called “Dynamic Update Policies” for more details.

    Dynamic updates using Kerberos signed requests can be made using the TKEY/GSS protocol by setting either the tkey-gssapi-keytab option, or alternatively by setting both the tkey-gssapi-credential and tkey-domain options. Once enabled, Kerberos signed requests will be matched against the update policies for the zone, using the Kerberos principal as the signer for the request.

    Updating of secure zones (zones using DNSSEC) follows RFC 3007: RRSIG, NSEC and NSEC3 records affected by updates are automatically regenerated by the server using an online zone key. Update authorization is based on transaction signatures and an explicit server policy.

    The journal file

    All changes made to a zone using dynamic update are stored in the zone's journal file. This file is automatically created by the server when the first dynamic update takes place. The name of the journal file is formed by appending the extension .jnl to the name of the corresponding zone file unless specifically overridden. The journal file is in a binary format and should not be edited manually.

    The server will also occasionally write ("dump") the complete contents of the updated zone to its zone file. This is not done immediately after each dynamic update, because that would be too slow when a large zone is updated frequently. Instead, the dump is delayed by up to 15 minutes, allowing additional updates to take place. During the dump process, transient files will be created with the extensions .jnw and .jbk; under ordinary circumstances, these will be removed when the dump is complete, and can be safely ignored.

    When a server is restarted after a shutdown or crash, it will replay the journal file to incorporate into the zone any updates that took place after the last zone dump.

    Changes that result from incoming incremental zone transfers are also journalled in a similar way.

    The zone files of dynamic zones cannot normally be edited by hand because they are not guaranteed to contain the most recent dynamic changes — those are only in the journal file. The only way to ensure that the zone file of a dynamic zone is up to date is to run rndc stop.

    If you have to make changes to a dynamic zone manually, the following procedure will work: Disable dynamic updates to the zone using rndc freeze zone. This will also remove the zone's .jnl file and update the master file. Edit the zone file. Run rndc thaw zone to reload the changed zone and re-enable dynamic updates.

    Incremental Zone Transfers (IXFR)

    The incremental zone transfer (IXFR) protocol is a way for slave servers to transfer only changed data, instead of having to transfer the entire zone. The IXFR protocol is specified in RFC 1995. See Proposed Standards.

    When acting as a master, BIND 9 supports IXFR for those zones where the necessary change history information is available. These include master zones maintained by dynamic update and slave zones whose data was obtained by IXFR. For manually maintained master zones, and for slave zones obtained by performing a full zone transfer (AXFR), IXFR is supported only if the option ixfr-from-differences is set to yes.

    When acting as a slave, BIND 9 will attempt to use IXFR unless it is explicitly disabled. For more information about disabling IXFR, see the description of the request-ixfr clause of the server statement.

    Split DNS

    Setting up different views, or visibility, of the DNS space to internal and external resolvers is usually referred to as a Split DNS setup. There are several reasons an organization would want to set up its DNS this way.

    One common reason for setting up a DNS system this way is to hide "internal" DNS information from "external" clients on the Internet. There is some debate as to whether or not this is actually useful. Internal DNS information leaks out in many ways (via email headers, for example) and most savvy "attackers" can find the information they need using other means. However, since listing addresses of internal servers that external clients cannot possibly reach can result in connection delays and other annoyances, an organization may choose to use a Split DNS to present a consistent view of itself to the outside world.

    Another common reason for setting up a Split DNS system is to allow internal networks that are behind filters or in RFC 1918 space (reserved IP space, as documented in RFC 1918) to resolve DNS on the Internet. Split DNS can also be used to allow mail from outside back in to the internal network.

    Example split DNS setup

    Let's say a company named Example, Inc. (example.com) has several corporate sites that have an internal network with reserved Internet Protocol (IP) space and an external demilitarized zone (DMZ), or "outside" section of a network, that is available to the public.

    Example, Inc. wants its internal clients to be able to resolve external hostnames and to exchange mail with people on the outside. The company also wants its internal resolvers to have access to certain internal-only zones that are not available at all outside of the internal network.

    In order to accomplish this, the company will set up two sets of name servers. One set will be on the inside network (in the reserved IP space) and the other set will be on bastion hosts, which are "proxy" hosts that can talk to both sides of its network, in the DMZ.

    The internal servers will be configured to forward all queries, except queries for site1.internal, site2.internal, site1.example.com, and site2.example.com, to the servers in the DMZ. These internal servers will have complete sets of information for site1.example.com, site2.example.com, site1.internal, and site2.internal.

    To protect the site1.internal and site2.internal domains, the internal name servers must be configured to disallow all queries to these domains from any external hosts, including the bastion hosts.

    The external servers, which are on the bastion hosts, will be configured to serve the "public" version of the site1 and site2.example.com zones. This could include things such as the host records for public servers (www.example.com and ftp.example.com), and mail exchange (MX) records (a.mx.example.com and b.mx.example.com).

    In addition, the public site1 and site2.example.com zones should have special MX records that contain wildcard (`*') records pointing to the bastion hosts. This is needed because external mail servers do not have any other way of looking up how to deliver mail to those internal hosts. With the wildcard records, the mail will be delivered to the bastion host, which can then forward it on to internal hosts.

    Here's an example of a wildcard MX record:

    *   IN MX 10 external1.example.com.

    Now that they accept mail on behalf of anything in the internal network, the bastion hosts will need to know how to deliver mail to internal hosts. In order for this to work properly, the resolvers on the bastion hosts will need to be configured to point to the internal name servers for DNS resolution.

    Queries for internal hostnames will be answered by the internal servers, and queries for external hostnames will be forwarded back out to the DNS servers on the bastion hosts.

    In order for all this to work properly, internal clients will need to be configured to query only the internal name servers for DNS queries. This could also be enforced via selective filtering on the network.

    If everything has been set properly, Example, Inc.'s internal clients will now be able to:

    • Look up any hostnames in the site1 and site2.example.com zones.
    • Look up any hostnames in the site1.internal and site2.internal domains.
    • Look up any hostnames on the Internet.
    • Exchange mail with both internal and external people.

    Hosts on the Internet will be able to:

    • Look up any hostnames in the site1 and site2.example.com zones.
    • Exchange mail with anyone in the site1 and site2.example.com zones.

    Here is an example configuration for the setup we just described above. Note that this is only configuration information; for information on how to configure your zone files, see the section called “Sample Configurations”.

    Internal DNS server config:

    
    acl internals { 172.16.72.0/24; 192.168.1.0/24; };
    
    acl externals { bastion-ips-go-here; };
    
    options {
        ...
        ...
        forward only;
        // forward to external servers
        forwarders {
            bastion-ips-go-here;
        };
        // sample allow-transfer (no one)
        allow-transfer { none; };
        // restrict query access
        allow-query { internals; externals; };
        // restrict recursion
        allow-recursion { internals; };
        ...
        ...
    };
    
    // sample master zone
    zone "site1.example.com" {
      type master;
      file "m/site1.example.com";
      // do normal iterative resolution (do not forward)
      forwarders { };
      allow-query { internals; externals; };
      allow-transfer { internals; };
    };
    
    // sample slave zone
    zone "site2.example.com" {
      type slave;
      file "s/site2.example.com";
      masters { 172.16.72.3; };
      forwarders { };
      allow-query { internals; externals; };
      allow-transfer { internals; };
    };
    
    zone "site1.internal" {
      type master;
      file "m/site1.internal";
      forwarders { };
      allow-query { internals; };
      allow-transfer { internals; }
    };
    
    zone "site2.internal" {
      type slave;
      file "s/site2.internal";
      masters { 172.16.72.3; };
      forwarders { };
      allow-query { internals };
      allow-transfer { internals; }
    };
    

    External (bastion host) DNS server config:

    acl internals { 172.16.72.0/24; 192.168.1.0/24; };
    
    acl externals { bastion-ips-go-here; };
    
    options {
      ...
      ...
      // sample allow-transfer (no one)
      allow-transfer { none; };
      // default query access
      allow-query { any; };
      // restrict cache access
      allow-query-cache { internals; externals; };
      // restrict recursion
      allow-recursion { internals; externals; };
      ...
      ...
    };
    
    // sample slave zone
    zone "site1.example.com" {
      type master;
      file "m/site1.foo.com";
      allow-transfer { internals; externals; };
    };
    
    zone "site2.example.com" {
      type slave;
      file "s/site2.foo.com";
      masters { another_bastion_host_maybe; };
      allow-transfer { internals; externals; }
    };
    

    In the resolv.conf (or equivalent) on the bastion host(s):

    search ...
    nameserver 172.16.72.2
    nameserver 172.16.72.3
    nameserver 172.16.72.4
    

    TSIG

    This is a short guide to setting up Transaction SIGnatures (TSIG) based transaction security in BIND. It describes changes to the configuration file as well as what changes are required for different features, including the process of creating transaction keys and using transaction signatures with BIND.

    BIND primarily supports TSIG for server to server communication. This includes zone transfer, notify, and recursive query messages. Resolvers based on newer versions of BIND 8 have limited support for TSIG.

    TSIG can also be useful for dynamic update. A primary server for a dynamic zone should control access to the dynamic update service, but IP-based access control is insufficient. The cryptographic access control provided by TSIG is far superior. The nsupdate program supports TSIG via the -k and -y command line options or inline by use of the key.

    Generate Shared Keys for Each Pair of Hosts

    A shared secret is generated to be shared between host1 and host2. An arbitrary key name is chosen: "host1-host2.". The key name must be the same on both hosts.

    Automatic Generation

    The following command will generate a 128-bit (16 byte) HMAC-SHA256 key as described above. Longer keys are better, but shorter keys are easier to read. Note that the maximum key length is the digest length, here 256 bits.

    dnssec-keygen -a hmac-sha256 -b 128 -n HOST host1-host2.

    The key is in the file Khost1-host2.+163+00000.private. Nothing directly uses this file, but the base-64 encoded string following "Key:" can be extracted from the file and used as a shared secret:

    Key: La/E5CjG9O+os1jq0a2jdA==

    The string "La/E5CjG9O+os1jq0a2jdA==" can be used as the shared secret.

    Manual Generation

    The shared secret is simply a random sequence of bits, encoded in base-64. Most ASCII strings are valid base-64 strings (assuming the length is a multiple of 4 and only valid characters are used), so the shared secret can be manually generated.

    Also, a known string can be run through mmencode or a similar program to generate base-64 encoded data.

    Copying the Shared Secret to Both Machines

    This is beyond the scope of DNS. A secure transport mechanism should be used. This could be secure FTP, ssh, telephone, etc.

    Informing the Servers of the Key's Existence

    Imagine host1 and host 2 are both servers. The following is added to each server's named.conf file:

    key host1-host2. {
      algorithm hmac-sha256;
      secret "La/E5CjG9O+os1jq0a2jdA==";
    };
    

    The secret is the one generated above. Since this is a secret, it is recommended that either named.conf be non-world readable, or the key directive be added to a non-world readable file that is included by named.conf.

    At this point, the key is recognized. This means that if the server receives a message signed by this key, it can verify the signature. If the signature is successfully verified, the response is signed by the same key.

    Instructing the Server to Use the Key

    Since keys are shared between two hosts only, the server must be told when keys are to be used. The following is added to the named.conf file for host1, if the IP address of host2 is 10.1.2.3:

    server 10.1.2.3 {
      keys { host1-host2. ;};
    };
    

    Multiple keys may be present, but only the first is used. This directive does not contain any secrets, so it may be in a world-readable file.

    If host1 sends a message that is a request to that address, the message will be signed with the specified key. host1 will expect any responses to signed messages to be signed with the same key.

    A similar statement must be present in host2's configuration file (with host1's address) for host2 to sign request messages to host1.

    TSIG Key Based Access Control

    BIND allows IP addresses and ranges to be specified in ACL definitions and allow-{ query | transfer | update } directives. This has been extended to allow TSIG keys also. The above key would be denoted key host1-host2.

    An example of an allow-update directive would be:

    allow-update { key host1-host2. ;};
    

    This allows dynamic updates to succeed only if the request was signed by a key named "host1-host2.".

    See the section called “Dynamic Update Policies” for a discussion of the more flexible update-policy statement.

    Errors

    The processing of TSIG signed messages can result in several errors. If a signed message is sent to a non-TSIG aware server, a FORMERR (format error) will be returned, since the server will not understand the record. This is a result of misconfiguration, since the server must be explicitly configured to send a TSIG signed message to a specific server.

    If a TSIG aware server receives a message signed by an unknown key, the response will be unsigned with the TSIG extended error code set to BADKEY. If a TSIG aware server receives a message with a signature that does not validate, the response will be unsigned with the TSIG extended error code set to BADSIG. If a TSIG aware server receives a message with a time outside of the allowed range, the response will be signed with the TSIG extended error code set to BADTIME, and the time values will be adjusted so that the response can be successfully verified. In any of these cases, the message's rcode (response code) is set to NOTAUTH (not authenticated).

    TKEY

    TKEY is a mechanism for automatically generating a shared secret between two hosts. There are several "modes" of TKEY that specify how the key is generated or assigned. BIND 9 implements only one of these modes, the Diffie-Hellman key exchange. Both hosts are required to have a Diffie-Hellman KEY record (although this record is not required to be present in a zone). The TKEY process must use signed messages, signed either by TSIG or SIG(0). The result of TKEY is a shared secret that can be used to sign messages with TSIG. TKEY can also be used to delete shared secrets that it had previously generated.

    The TKEY process is initiated by a client or server by sending a signed TKEY query (including any appropriate KEYs) to a TKEY-aware server. The server response, if it indicates success, will contain a TKEY record and any appropriate keys. After this exchange, both participants have enough information to determine the shared secret; the exact process depends on the TKEY mode. When using the Diffie-Hellman TKEY mode, Diffie-Hellman keys are exchanged, and the shared secret is derived by both participants.

    SIG(0)

    BIND 9 partially supports DNSSEC SIG(0) transaction signatures as specified in RFC 2535 and RFC 2931. SIG(0) uses public/private keys to authenticate messages. Access control is performed in the same manner as TSIG keys; privileges can be granted or denied based on the key name.

    When a SIG(0) signed message is received, it will only be verified if the key is known and trusted by the server; the server will not attempt to locate and/or validate the key.

    SIG(0) signing of multiple-message TCP streams is not supported.

    The only tool shipped with BIND 9 that generates SIG(0) signed messages is nsupdate.

    DNSSEC

    Cryptographic authentication of DNS information is possible through the DNS Security (DNSSEC-bis) extensions, defined in RFC 4033, RFC 4034, and RFC 4035. This section describes the creation and use of DNSSEC signed zones.

    In order to set up a DNSSEC secure zone, there are a series of steps which must be followed. BIND 9 ships with several tools that are used in this process, which are explained in more detail below. In all cases, the -h option prints a full list of parameters. Note that the DNSSEC tools require the keyset files to be in the working directory or the directory specified by the -d option, and that the tools shipped with BIND 9.2.x and earlier are not compatible with the current ones.

    There must also be communication with the administrators of the parent and/or child zone to transmit keys. A zone's security status must be indicated by the parent zone for a DNSSEC capable resolver to trust its data. This is done through the presence or absence of a DS record at the delegation point.

    For other servers to trust data in this zone, they must either be statically configured with this zone's zone key or the zone key of another zone above this one in the DNS tree.

    Generating Keys

    The dnssec-keygen program is used to generate keys.

    A secure zone must contain one or more zone keys. The zone keys will sign all other records in the zone, as well as the zone keys of any secure delegated zones. Zone keys must have the same name as the zone, a name type of ZONE, and must be usable for authentication. It is recommended that zone keys use a cryptographic algorithm designated as "mandatory to implement" by the IETF; currently the only one is RSASHA1.

    The following command will generate a 768-bit RSASHA1 key for the child.example zone:

    dnssec-keygen -a RSASHA1 -b 768 -n ZONE child.example.

    Two output files will be produced: Kchild.example.+005+12345.key and Kchild.example.+005+12345.private (where 12345 is an example of a key tag). The key filenames contain the key name (child.example.), algorithm (3 is DSA, 1 is RSAMD5, 5 is RSASHA1, etc.), and the key tag (12345 in this case). The private key (in the .private file) is used to generate signatures, and the public key (in the .key file) is used for signature verification.

    To generate another key with the same properties (but with a different key tag), repeat the above command.

    The dnssec-keyfromlabel program is used to get a key pair from a crypto hardware and build the key files. Its usage is similar to dnssec-keygen.

    The public keys should be inserted into the zone file by including the .key files using $INCLUDE statements.

    Signing the Zone

    The dnssec-signzone program is used to sign a zone.

    Any keyset files corresponding to secure subzones should be present. The zone signer will generate NSEC, NSEC3 and RRSIG records for the zone, as well as DS for the child zones if '-g' is specified. If '-g' is not specified, then DS RRsets for the secure child zones need to be added manually.

    The following command signs the zone, assuming it is in a file called zone.child.example. By default, all zone keys which have an available private key are used to generate signatures.

    dnssec-signzone -o child.example zone.child.example

    One output file is produced: zone.child.example.signed. This file should be referenced by named.conf as the input file for the zone.

    dnssec-signzone will also produce a keyset and dsset files and optionally a dlvset file. These are used to provide the parent zone administrators with the DNSKEYs (or their corresponding DS records) that are the secure entry point to the zone.

    Configuring Servers

    To enable named to respond appropriately to DNS requests from DNSSEC aware clients, dnssec-enable must be set to yes. (This is the default setting.)

    To enable named to validate answers from other servers, the dnssec-enable option must be set to yes, and the dnssec-validation options must be set to yes or auto.

    If dnssec-validation is set to auto, then a default trust anchor for the DNS root zone will be used. If it is set to yes, however, then at least one trust anchor must be configured with a trusted-keys or managed-keys statement in named.conf, or DNSSEC validation will not occur. The default setting is yes.

    trusted-keys are copies of DNSKEY RRs for zones that are used to form the first link in the cryptographic chain of trust. All keys listed in trusted-keys (and corresponding zones) are deemed to exist and only the listed keys will be used to validated the DNSKEY RRset that they are from.

    managed-keys are trusted keys which are automatically kept up to date via RFC 5011 trust anchor maintenance.

    trusted-keys and managed-keys are described in more detail later in this document.

    Unlike BIND 8, BIND 9 does not verify signatures on load, so zone keys for authoritative zones do not need to be specified in the configuration file.

    After DNSSEC gets established, a typical DNSSEC configuration will look something like the following. It has one or more public keys for the root. This allows answers from outside the organization to be validated. It will also have several keys for parts of the namespace the organization controls. These are here to ensure that named is immune to compromises in the DNSSEC components of the security of parent zones.

    managed-keys {
            /* Root Key */
            "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS
                                     JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh
                                     aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy
                                     4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg
                                     hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp
                                     5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke
                                     g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq
                                     66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ
                                     97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ
                                     dgxbcDTClU0CRBdiieyLMNzXG3";
    };
    
    trusted-keys {
            /* Key for our organization's forward zone */
            example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6
                                  5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z
                                  GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb
                                  4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL
                                  kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O
                                  g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S
                                  TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq
                                  FxmAVZP20igTixin/1LcrgX/KMEGd/biuv
                                  F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm
                                  /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o
                                  1OTQ09A0=";
    
            /* Key for our reverse zone. */
            2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc
                                           xOdNax071L18QqZnQQQAVVr+i
                                           LhGTnNGp3HoWQLUIzKrJVZ3zg
                                           gy3WwNT6kZo6c0tszYqbtvchm
                                           gQC8CzKojM/W16i6MG/eafGU3
                                           siaOdS0yOI6BgPsw+YZdzlYMa
                                           IJGf4M4dyoKIhzdZyQ2bYQrjy
                                           Q4LB0lC7aOnsMyYKHHYeRvPxj
                                           IQXmdqgOJGq+vsevG06zW+1xg
                                           YJh9rCIfnm1GX/KMgxLPG2vXT
                                           D/RnLX+D3T3UL7HJYHJhAZD5L
                                           59VvjSPsZJHeDCUyWYrvPZesZ
                                           DIRvhDD52SKvbheeTJUm6Ehkz
                                           ytNN2SN96QRk8j/iI8ib";
    };
    
    options {
            ...
            dnssec-enable yes;
            dnssec-validation yes;
    };
    

    Note

    None of the keys listed in this example are valid. In particular, the root key is not valid.

    When DNSSEC validation is enabled and properly configured, the resolver will reject any answers from signed, secure zones which fail to validate, and will return SERVFAIL to the client.

    Responses may fail to validate for any of several reasons, including missing, expired, or invalid signatures, a key which does not match the DS RRset in the parent zone, or an insecure response from a zone which, according to its parent, should have been secure.

    Note

    When the validator receives a response from an unsigned zone that has a signed parent, it must confirm with the parent that the zone was intentionally left unsigned. It does this by verifying, via signed and validated NSEC/NSEC3 records, that the parent zone contains no DS records for the child.

    If the validator can prove that the zone is insecure, then the response is accepted. However, if it cannot, then it must assume an insecure response to be a forgery; it rejects the response and logs an error.

    The logged error reads "insecurity proof failed" and "got insecure response; parent indicates it should be secure". (Prior to BIND 9.7, the logged error was "not insecure". This referred to the zone, not the response.)

    DNSSEC, Dynamic Zones, and Automatic Signing

    As of BIND 9.7.0 it is possible to change a dynamic zone from insecure to signed and back again. A secure zone can use either NSEC or NSEC3 chains.

    Converting from insecure to secure

    Changing a zone from insecure to secure can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option.

    For either method, you need to configure named so that it can see the K* files which contain the public and private parts of the keys that will be used to sign the zone. These files will have been generated by dnssec-keygen. You can do this by placing them in the key-directory, as specified in named.conf:

            zone example.net {
                    type master;
                    update-policy local;
                    file "dynamic/example.net/example.net";
                    key-directory "dynamic/example.net";
            };
    

    If one KSK and one ZSK DNSKEY key have been generated, this configuration will cause all records in the zone to be signed with the ZSK, and the DNSKEY RRset to be signed with the KSK as well. An NSEC chain will be generated as part of the initial signing process.

    Dynamic DNS update method

    To insert the keys via dynamic update:

            % nsupdate
            > ttl 3600
            > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
            > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
            > send
    

    While the update request will complete almost immediately, the zone will not be completely signed until named has had time to walk the zone and generate the NSEC and RRSIG records. The NSEC record at the apex will be added last, to signal that there is a complete NSEC chain.

    If you wish to sign using NSEC3 instead of NSEC, you should add an NSEC3PARAM record to the initial update request. If you wish the NSEC3 chain to have the OPTOUT bit set, set it in the flags field of the NSEC3PARAM record.

            % nsupdate
            > ttl 3600
            > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
            > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
            > update add example.net NSEC3PARAM 1 1 100 1234567890
            > send
    

    Again, this update request will complete almost immediately; however, the record won't show up until named has had a chance to build/remove the relevant chain. A private type record will be created to record the state of the operation (see below for more details), and will be removed once the operation completes.

    While the initial signing and NSEC/NSEC3 chain generation is happening, other updates are possible as well.

    Fully automatic zone signing

    To enable automatic signing, add the auto-dnssec option to the zone statement in named.conf. auto-dnssec has two possible arguments: allow or maintain.

    With auto-dnssec allow, named can search the key directory for keys matching the zone, insert them into the zone, and use them to sign the zone. It will do so only when it receives an rndc sign <zonename>.

    auto-dnssec maintain includes the above functionality, but will also automatically adjust the zone's DNSKEY records on schedule according to the keys' timing metadata. (See dnssec-keygen(8) and dnssec-settime(8) for more information.)

    named will periodically search the key directory for keys matching the zone, and if the keys' metadata indicates that any change should be made the zone, such as adding, removing, or revoking a key, then that action will be carried out. By default, the key directory is checked for changes every 60 minutes; this period can be adjusted with the dnssec-loadkeys-interval, up to a maximum of 24 hours. The rndc loadkeys forces named to check for key updates immediately.

    If keys are present in the key directory the first time the zone is loaded, the zone will be signed immediately, without waiting for an rndc sign or rndc loadkeys command. (Those commands can still be used when there are unscheduled key changes, however.)

    If you wish the zone to be signed using NSEC3 instead of NSEC, submit an NSEC3PARAM record via dynamic update prior to the scheduled publication and activation of the keys. If you wish the NSEC3 chain to have the OPTOUT bit set, set it in the flags field of the NSEC3PARAM record. The NSEC3PARAM record will not appear in the zone immediately, but it will be stored for later reference. When the zone is signed and the NSEC3 chain is completed, the NSEC3PARAM record will appear in the zone.

    Using the auto-dnssec option requires the zone to be configured to allow dynamic updates, by adding an allow-update or update-policy statement to the zone configuration. If this has not been done, the configuration will fail.

    Private-type records

    The state of the signing process is signaled by private-type records (with a default type value of 65534). When signing is complete, these records will have a nonzero value for the final octet (for those records which have a nonzero initial octet).

    The private type record format: If the first octet is non-zero then the record indicates that the zone needs to be signed with the key matching the record, or that all signatures that match the record should be removed.



      algorithm (octet 1)
      key id in network order (octet 2 and 3)
      removal flag (octet 4)
      complete flag (octet 5)

    Only records flagged as "complete" can be removed via dynamic update. Attempts to remove other private type records will be silently ignored.

    If the first octet is zero (this is a reserved algorithm number that should never appear in a DNSKEY record) then the record indicates changes to the NSEC3 chains are in progress. The rest of the record contains an NSEC3PARAM record. The flag field tells what operation to perform based on the flag bits.



      0x01 OPTOUT
      0x80 CREATE
      0x40 REMOVE
      0x20 NONSEC

    DNSKEY rollovers

    As with insecure-to-secure conversions, rolling DNSSEC keys can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option.

    Dynamic DNS update method

    To perform key rollovers via dynamic update, you need to add the K* files for the new keys so that named can find them. You can then add the new DNSKEY RRs via dynamic update. named will then cause the zone to be signed with the new keys. When the signing is complete the private type records will be updated so that the last octet is non zero.

    If this is for a KSK you need to inform the parent and any trust anchor repositories of the new KSK.

    You should then wait for the maximum TTL in the zone before removing the old DNSKEY. If it is a KSK that is being updated, you also need to wait for the DS RRset in the parent to be updated and its TTL to expire. This ensures that all clients will be able to verify at least one signature when you remove the old DNSKEY.

    The old DNSKEY can be removed via UPDATE. Take care to specify the correct key. named will clean out any signatures generated by the old key after the update completes.

    Automatic key rollovers

    When a new key reaches its activation date (as set by dnssec-keygen or dnssec-settime), if the auto-dnssec zone option is set to maintain, named will automatically carry out the key rollover. If the key's algorithm has not previously been used to sign the zone, then the zone will be fully signed as quickly as possible. However, if the new key is replacing an existing key of the same algorithm, then the zone will be re-signed incrementally, with signatures from the old key being replaced with signatures from the new key as their signature validity periods expire. By default, this rollover completes in 30 days, after which it will be safe to remove the old key from the DNSKEY RRset.

    NSEC3PARAM rollovers via UPDATE

    Add the new NSEC3PARAM record via dynamic update. When the new NSEC3 chain has been generated, the NSEC3PARAM flag field will be zero. At this point you can remove the old NSEC3PARAM record. The old chain will be removed after the update request completes.

    Converting from NSEC to NSEC3

    To do this, you just need to add an NSEC3PARAM record. When the conversion is complete, the NSEC chain will have been removed and the NSEC3PARAM record will have a zero flag field. The NSEC3 chain will be generated before the NSEC chain is destroyed.

    Converting from NSEC3 to NSEC

    To do this, use nsupdate to remove all NSEC3PARAM records with a zero flag field. The NSEC chain will be generated before the NSEC3 chain is removed.

    Converting from secure to insecure

    To convert a signed zone to unsigned using dynamic DNS, delete all the DNSKEY records from the zone apex using nsupdate. All signatures, NSEC or NSEC3 chains, and associated NSEC3PARAM records will be removed automatically. This will take place after the update request completes.

    This requires the dnssec-secure-to-insecure option to be set to yes in named.conf.

    In addition, if the auto-dnssec maintain zone statement is used, it should be removed or changed to allow instead (or it will re-sign).

    Periodic re-signing

    In any secure zone which supports dynamic updates, named will periodically re-sign RRsets which have not been re-signed as a result of some update action. The signature lifetimes will be adjusted so as to spread the re-sign load over time rather than all at once.

    NSEC3 and OPTOUT

    named only supports creating new NSEC3 chains where all the NSEC3 records in the zone have the same OPTOUT state. named supports UPDATES to zones where the NSEC3 records in the chain have mixed OPTOUT state. named does not support changing the OPTOUT state of an individual NSEC3 record, the entire chain needs to be changed if the OPTOUT state of an individual NSEC3 needs to be changed.

    Dynamic Trust Anchor Management

    BIND 9.7.0 introduces support for RFC 5011, dynamic trust anchor management. Using this feature allows named to keep track of changes to critical DNSSEC keys without any need for the operator to make changes to configuration files.

    Validating Resolver

    To configure a validating resolver to use RFC 5011 to maintain a trust anchor, configure the trust anchor using a managed-keys statement. Information about this can be found in the section called “managed-keys Statement Definition and Usage”.

    Authoritative Server

    To set up an authoritative zone for RFC 5011 trust anchor maintenance, generate two (or more) key signing keys (KSKs) for the zone. Sign the zone with one of them; this is the "active" KSK. All KSK's which do not sign the zone are "stand-by" keys.

    Any validating resolver which is configured to use the active KSK as an RFC 5011-managed trust anchor will take note of the stand-by KSKs in the zone's DNSKEY RRset, and store them for future reference. The resolver will recheck the zone periodically, and after 30 days, if the new key is still there, then the key will be accepted by the resolver as a valid trust anchor for the zone. Any time after this 30-day acceptance timer has completed, the active KSK can be revoked, and the zone can be "rolled over" to the newly accepted key.

    The easiest way to place a stand-by key in a zone is to use the "smart signing" features of dnssec-keygen and dnssec-signzone. If a key with a publication date in the past, but an activation date which is unset or in the future, " dnssec-signzone -S" will include the DNSKEY record in the zone, but will not sign with it:

    $ dnssec-keygen -K keys -f KSK -P now -A now+2y example.net
    $ dnssec-signzone -S -K keys example.net
    

    To revoke a key, the new command dnssec-revoke has been added. This adds the REVOKED bit to the key flags and re-generates the K*.key and K*.private files.

    After revoking the active key, the zone must be signed with both the revoked KSK and the new active KSK. (Smart signing takes care of this automatically.)

    Once a key has been revoked and used to sign the DNSKEY RRset in which it appears, that key will never again be accepted as a valid trust anchor by the resolver. However, validation can proceed using the new active key (which had been accepted by the resolver when it was a stand-by key).

    See RFC 5011 for more details on key rollover scenarios.

    When a key has been revoked, its key ID changes, increasing by 128, and wrapping around at 65535. So, for example, the key "Kexample.com.+005+10000" becomes "Kexample.com.+005+10128".

    If two keys have ID's exactly 128 apart, and one is revoked, then the two key ID's will collide, causing several problems. To prevent this, dnssec-keygen will not generate a new key if another key is present which may collide. This checking will only occur if the new keys are written to the same directory which holds all other keys in use for that zone.

    Older versions of BIND 9 did not have this precaution. Exercise caution if using key revocation on keys that were generated by previous releases, or if using keys stored in multiple directories or on multiple machines.

    It is expected that a future release of BIND 9 will address this problem in a different way, by storing revoked keys with their original unrevoked key ID's.

    PKCS #11 (Cryptoki) support

    PKCS #11 (Public Key Cryptography Standard #11) defines a platform- independent API for the control of hardware security modules (HSMs) and other cryptographic support devices.

    BIND 9 is known to work with two HSMs: The Sun SCA 6000 cryptographic acceleration board, tested under Solaris x86, and the AEP Keyper network-attached key storage device, tested with Debian Linux, Solaris x86 and Windows Server 2003.

    Prerequisites

    See the HSM vendor documentation for information about installing, initializing, testing and troubleshooting the HSM.

    BIND 9 uses OpenSSL for cryptography, but stock OpenSSL does not yet fully support PKCS #11. However, a PKCS #11 engine for OpenSSL is available from the OpenSolaris project. It has been modified by ISC to work with with BIND 9, and to provide new features such as PIN management and key by reference.

    The patched OpenSSL depends on a "PKCS #11 provider". This is a shared library object, providing a low-level PKCS #11 interface to the HSM hardware. It is dynamically loaded by OpenSSL at runtime. The PKCS #11 provider comes from the HSM vendor, and is specific to the HSM to be controlled.

    There are two "flavors" of PKCS #11 support provided by the patched OpenSSL, one of which must be chosen at configuration time. The correct choice depends on the HSM hardware:

    • Use 'crypto-accelerator' with HSMs that have hardware cryptographic acceleration features, such as the SCA 6000 board. This causes OpenSSL to run all supported cryptographic operations in the HSM.

    • Use 'sign-only' with HSMs that are designed to function primarily as secure key storage devices, but lack hardware acceleration. These devices are highly secure, but are not necessarily any faster at cryptography than the system CPU — often, they are slower. It is therefore most efficient to use them only for those cryptographic functions that require access to the secured private key, such as zone signing, and to use the system CPU for all other computationally-intensive operations. The AEP Keyper is an example of such a device.

    The modified OpenSSL code is included in the BIND 9 release, in the form of a context diff against the latest verions of OpenSSL. OpenSSL 0.9.8, 1.0.0 and 1.0.1 are supported; there are separate diffs for each version. In the examples to follow, we use OpenSSL 0.9.8, but the same methods work with OpenSSL 1.0.0 and 1.0.1.

    Note

    The latest OpenSSL versions at the time of the BIND release are 0.9.8y, 1.0.0k and 1.0.1e. ISC will provide an updated patch as new versions of OpenSSL are released. The version number in the following examples is expected to change.

    Before building BIND 9 with PKCS #11 support, it will be necessary to build OpenSSL with this patch in place and inform it of the path to the HSM-specific PKCS #11 provider library.

    Obtain OpenSSL 0.9.8s:

    $ wget http://www.openssl.org/source/openssl-0.9.8s.tar.gz
    

    Extract the tarball:

    $ tar zxf openssl-0.9.8s.tar.gz
    

    Apply the patch from the BIND 9 release:

    $ patch -p1 -d openssl-0.9.8s \
                < bind9/bin/pkcs11/openssl-0.9.8s-patch
    

    Note

    (Note that the patch file may not be compatible with the "patch" utility on all operating systems. You may need to install GNU patch.)

    When building OpenSSL, place it in a non-standard location so that it does not interfere with OpenSSL libraries elsewhere on the system. In the following examples, we choose to install into "/opt/pkcs11/usr". We will use this location when we configure BIND 9.

    Building OpenSSL for the AEP Keyper on Linux

    The AEP Keyper is a highly secure key storage device, but does not provide hardware cryptographic acceleration. It can carry out cryptographic operations, but it is probably slower than your system's CPU. Therefore, we choose the 'sign-only' flavor when building OpenSSL.

    The Keyper-specific PKCS #11 provider library is delivered with the Keyper software. In this example, we place it /opt/pkcs11/usr/lib:

    $ cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so
    

    This library is only available for Linux as a 32-bit binary. If we are compiling on a 64-bit Linux system, it is necessary to force a 32-bit build, by specifying -m32 in the build options.

    Finally, the Keyper library requires threads, so we must specify -pthread.

    $ cd openssl-0.9.8s
    $ ./Configure linux-generic32 -m32 -pthread \
                --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
                --pk11-flavor=sign-only \
                --prefix=/opt/pkcs11/usr
    

    After configuring, run "make" and "make test". If "make test" fails with "pthread_atfork() not found", you forgot to add the -pthread above.

    Building OpenSSL for the SCA 6000 on Solaris

    The SCA-6000 PKCS #11 provider is installed as a system library, libpkcs11. It is a true crypto accelerator, up to 4 times faster than any CPU, so the flavor shall be 'crypto-accelerator'.

    In this example, we are building on Solaris x86 on an AMD64 system.

    $ cd openssl-0.9.8s
    $ ./Configure solaris64-x86_64-cc \
                --pk11-libname=/usr/lib/64/libpkcs11.so \
                --pk11-flavor=crypto-accelerator \
                --prefix=/opt/pkcs11/usr
    

    (For a 32-bit build, use "solaris-x86-cc" and /usr/lib/libpkcs11.so.)

    After configuring, run make and make test.

    Building OpenSSL for SoftHSM

    SoftHSM is a software library provided by the OpenDNSSEC project (http://www.opendnssec.org) which provides a PKCS#11 interface to a virtual HSM, implemented in the form of encrypted data on the local filesystem. It uses the Botan library for encryption and SQLite3 for data storage. Though less secure than a true HSM, it can provide more secure key storage than traditional key files, and can allow you to experiment with PKCS#11 when an HSM is not available.

    The SoftHSM cryptographic store must be installed and initialized before using it with OpenSSL, and the SOFTHSM_CONF environment variable must always point to the SoftHSM configuration file:

    $  cd softhsm-1.3.0 
    $  configure --prefix=/opt/pkcs11/usr 
    $  make 
    $  make install 
    $  export SOFTHSM_CONF=/opt/pkcs11/softhsm.conf 
    $  echo "0:/opt/pkcs11/softhsm.db" > $SOFTHSM_CONF 
    $  /opt/pkcs11/usr/bin/softhsm --init-token 0 --slot 0 --label softhsm 
    

    SoftHSM can perform all cryptographic operations, but since it only uses your system CPU, there is no need to use it for anything but signing. Therefore, we choose the 'sign-only' flavor when building OpenSSL.

    $ cd openssl-0.9.8s
    $ ./Configure linux-x86_64 -pthread \
                --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
                --pk11-flavor=sign-only \
                --prefix=/opt/pkcs11/usr
    

    After configuring, run "make" and "make test".

    Once you have built OpenSSL, run "apps/openssl engine pkcs11" to confirm that PKCS #11 support was compiled in correctly. The output should be one of the following lines, depending on the flavor selected:

            (pkcs11) PKCS #11 engine support (sign only)
    

    Or:

            (pkcs11) PKCS #11 engine support (crypto accelerator)
    

    Next, run "apps/openssl engine pkcs11 -t". This will attempt to initialize the PKCS #11 engine. If it is able to do so successfully, it will report “[ available ]”.

    If the output is correct, run "make install" which will install the modified OpenSSL suite to /opt/pkcs11/usr.

    Building BIND 9 with PKCS#11

    When building BIND 9, the location of the custom-built OpenSSL library must be specified via configure.

    Configuring BIND 9 for Linux with the AEP Keyper

    To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build.

    The PKCS #11 library for the AEP Keyper is currently only available as a 32-bit binary. If we are building on a 64-bit host, we must force a 32-bit build by adding "-m32" to the CC options on the "configure" command line.

    $ cd ../bind9
    $ ./configure CC="gcc -m32" --enable-threads \
               --with-openssl=/opt/pkcs11/usr \
               --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so
    

    Configuring BIND 9 for Solaris with the SCA 6000

    To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build.

    $ cd ../bind9
    $ ./configure CC="cc -xarch=amd64" --enable-threads \
                --with-openssl=/opt/pkcs11/usr \
                --with-pkcs11=/usr/lib/64/libpkcs11.so
    

    (For a 32-bit build, omit CC="cc -xarch=amd64".)

    If configure complains about OpenSSL not working, you may have a 32/64-bit architecture mismatch. Or, you may have incorrectly specified the path to OpenSSL (it should be the same as the --prefix argument to the OpenSSL Configure).

    Configuring BIND 9 for SoftHSM

    $ cd ../bind9
    $ ./configure --enable-threads \
               --with-openssl=/opt/pkcs11/usr \
               --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so
    

    After configuring, run "make", "make test" and "make install".

    (Note: If "make test" fails in the "pkcs11" system test, you may have forgotten to set the SOFTHSM_CONF environment variable.)

    PKCS #11 Tools

    BIND 9 includes a minimal set of tools to operate the HSM, including pkcs11-keygen to generate a new key pair within the HSM, pkcs11-list to list objects currently available, and pkcs11-destroy to remove objects.

    In UNIX/Linux builds, these tools are built only if BIND 9 is configured with the --with-pkcs11 option. (NOTE: If --with-pkcs11 is set to "yes", rather than to the path of the PKCS #11 provider, then the tools will be built but the provider will be left undefined. Use the -m option or the PKCS11_PROVIDER environment variable to specify the path to the provider.)

    Using the HSM

    First, we must set up the runtime environment so the OpenSSL and PKCS #11 libraries can be loaded:

    $ export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH}
    

    When operating an AEP Keyper, it is also necessary to specify the location of the "machine" file, which stores information about the Keyper for use by PKCS #11 provider library. If the machine file is in /opt/Keyper/PKCS11Provider/machine, use:

    $ export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider
    

    These environment variables must be set whenever running any tool that uses the HSM, including pkcs11-keygen, pkcs11-list, pkcs11-destroy, dnssec-keyfromlabel, dnssec-signzone, dnssec-keygen(which will use the HSM for random number generation), and named.

    We can now create and use keys in the HSM. In this case, we will create a 2048 bit key and give it the label "sample-ksk":

    $ pkcs11-keygen -b 2048 -l sample-ksk
    

    To confirm that the key exists:

    $ pkcs11-list
    Enter PIN:
    object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0]
    object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0]
    

    Before using this key to sign a zone, we must create a pair of BIND 9 key files. The "dnssec-keyfromlabel" utility does this. In this case, we will be using the HSM key "sample-ksk" as the key-signing key for "example.net":

    $ dnssec-keyfromlabel -l sample-ksk -f KSK example.net
    

    The resulting K*.key and K*.private files can now be used to sign the zone. Unlike normal K* files, which contain both public and private key data, these files will contain only the public key data, plus an identifier for the private key which remains stored within the HSM. The HSM handles signing with the private key.

    If you wish to generate a second key in the HSM for use as a zone-signing key, follow the same procedure above, using a different keylabel, a smaller key size, and omitting "-f KSK" from the dnssec-keyfromlabel arguments:

    $ pkcs11-keygen -b 1024 -l sample-zsk
    $ dnssec-keyfromlabel -l sample-zsk example.net
    

    Alternatively, you may prefer to generate a conventional on-disk key, using dnssec-keygen:

    $ dnssec-keygen example.net
    

    This provides less security than an HSM key, but since HSMs can be slow or cumbersome to use for security reasons, it may be more efficient to reserve HSM keys for use in the less frequent key-signing operation. The zone-signing key can be rolled more frequently, if you wish, to compensate for a reduction in key security.

    Now you can sign the zone. (Note: If not using the -S option to dnssec-signzone, it will be necessary to add the contents of both K*.key files to the zone master file before signing it.)

    $ dnssec-signzone -S example.net
    Enter PIN:
    Verifying the zone using the following algorithms:
    NSEC3RSASHA1.
    Zone signing complete:
    Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by
    example.net.signed
    

    Specifying the engine on the command line

    The OpenSSL engine can be specified in named and all of the BIND dnssec-* tools by using the "-E <engine>" command line option. If BIND 9 is built with the --with-pkcs11 option, this option defaults to "pkcs11". Specifying the engine will generally not be necessary unless for some reason you wish to use a different OpenSSL engine.

    If you wish to disable use of the "pkcs11" engine — for troubleshooting purposes, or because the HSM is unavailable — set the engine to the empty string. For example:

    $ dnssec-signzone -E '' -S example.net
    

    This causes dnssec-signzone to run as if it were compiled without the --with-pkcs11 option.

    Running named with automatic zone re-signing

    If you want named to dynamically re-sign zones using HSM keys, and/or to to sign new records inserted via nsupdate, then named must have access to the HSM PIN. This can be accomplished by placing the PIN into the openssl.cnf file (in the above examples, /opt/pkcs11/usr/ssl/openssl.cnf).

    The location of the openssl.cnf file can be overridden by setting the OPENSSL_CONF environment variable before running named.

    Sample openssl.cnf:

            openssl_conf = openssl_def
            [ openssl_def ]
            engines = engine_section
            [ engine_section ]
            pkcs11 = pkcs11_section
            [ pkcs11_section ]
            PIN = <PLACE PIN HERE>
    

    This will also allow the dnssec-* tools to access the HSM without PIN entry. (The pkcs11-* tools access the HSM directly, not via OpenSSL, so a PIN will still be required to use them.)

    Warning

    Placing the HSM's PIN in a text file in this manner may reduce the security advantage of using an HSM. Be sure this is what you want to do before configuring OpenSSL in this way.

    IPv6 Support in BIND 9

    BIND 9 fully supports all currently defined forms of IPv6 name to address and address to name lookups. It will also use IPv6 addresses to make queries when running on an IPv6 capable system.

    For forward lookups, BIND 9 supports only AAAA records. RFC 3363 deprecated the use of A6 records, and client-side support for A6 records was accordingly removed from BIND 9. However, authoritative BIND 9 name servers still load zone files containing A6 records correctly, answer queries for A6 records, and accept zone transfer for a zone containing A6 records.

    For IPv6 reverse lookups, BIND 9 supports the traditional "nibble" format used in the ip6.arpa domain, as well as the older, deprecated ip6.int domain. Older versions of BIND 9 supported the "binary label" (also known as "bitstring") format, but support of binary labels has been completely removed per RFC 3363. Many applications in BIND 9 do not understand the binary label format at all any more, and will return an error if given. In particular, an authoritative BIND 9 name server will not load a zone file containing binary labels.

    For an overview of the format and structure of IPv6 addresses, see the section called “IPv6 addresses (AAAA)”.

    Address Lookups Using AAAA Records

    The IPv6 AAAA record is a parallel to the IPv4 A record, and, unlike the deprecated A6 record, specifies the entire IPv6 address in a single record. For example,

    $ORIGIN example.com.
    host            3600    IN      AAAA    2001:db8::1
    

    Use of IPv4-in-IPv6 mapped addresses is not recommended. If a host has an IPv4 address, use an A record, not a AAAA, with ::ffff:192.168.42.1 as the address.

    Address to Name Lookups Using Nibble Format

    When looking up an address in nibble format, the address components are simply reversed, just as in IPv4, and ip6.arpa. is appended to the resulting name. For example, the following would provide reverse name lookup for a host with address 2001:db8::1.

    $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
    1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0  14400   IN    PTR    (
                                        host.example.com. )
    
    bind9-9.9.5.dfsg/doc/arm/man.dnssec-dsfromkey.html0000644000470500017500000002275312271526120021311 0ustar lamontlamont dnssec-dsfromkey

    Name

    dnssec-dsfromkey — DNSSEC DS RR generation tool

    Synopsis

    dnssec-dsfromkey [-v level] [-1] [-2] [-a alg] [-l domain] [-T TTL] {keyfile}

    dnssec-dsfromkey {-s} [-1] [-2] [-a alg] [-K directory] [-l domain] [-s] [-c class] [-T TTL] [-f file] [-A] [-v level] {dnsname}

    DESCRIPTION

    dnssec-dsfromkey outputs the Delegation Signer (DS) resource record (RR), as defined in RFC 3658 and RFC 4509, for the given key(s).

    OPTIONS

    -1

    Use SHA-1 as the digest algorithm (the default is to use both SHA-1 and SHA-256).

    -2

    Use SHA-256 as the digest algorithm.

    -a algorithm

    Select the digest algorithm. The value of algorithm must be one of SHA-1 (SHA1), SHA-256 (SHA256), GOST or SHA-384 (SHA384). These values are case insensitive.

    -T TTL

    Specifies the TTL of the DS records.

    -K directory

    Look for key files (or, in keyset mode, keyset- files) in directory.

    -f file

    Zone file mode: in place of the keyfile name, the argument is the DNS domain name of a zone master file, which can be read from file. If the zone name is the same as file, then it may be omitted.

    If file is set to "-", then the zone data is read from the standard input. This makes it possible to use the output of the dig command as input, as in:

    dig dnskey example.com | dnssec-dsfromkey -f - example.com

    -A

    Include ZSK's when generating DS records. Without this option, only keys which have the KSK flag set will be converted to DS records and printed. Useful only in zone file mode.

    -l domain

    Generate a DLV set instead of a DS set. The specified domain is appended to the name for each record in the set. The DNSSEC Lookaside Validation (DLV) RR is described in RFC 4431.

    -s

    Keyset mode: in place of the keyfile name, the argument is the DNS domain name of a keyset file.

    -c class

    Specifies the DNS class (default is IN). Useful only in keyset or zone file mode.

    -v level

    Sets the debugging level.

    EXAMPLE

    To build the SHA-256 DS RR from the Kexample.com.+003+26160 keyfile name, the following command would be issued:

    dnssec-dsfromkey -2 Kexample.com.+003+26160

    The command would print something like:

    example.com. IN DS 26160 5 2 3A1EADA7A74B8D0BA86726B0C227AA85AB8BBD2B2004F41A868A54F0 C5EA0B94

    FILES

    The keyfile can be designed by the key identification Knnnn.+aaa+iiiii or the full file name Knnnn.+aaa+iiiii.key as generated by dnssec-keygen(8).

    The keyset file name is built from the directory, the string keyset- and the dnsname.

    CAVEAT

    A keyfile error can give a "file not found" even if the file exists.

    SEE ALSO

    dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 3658, RFC 4431. RFC 4509.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/README-SGML0000644000470500017500000002720312271526120016004 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. The BIND v9 ARM master document is now kept in DocBook XML format. Version: $Id: README-SGML,v 1.17 2004/03/05 05:04:43 marka Exp $ The entire ARM is in the single file: Bv9ARM-book.xml All of the other documents - HTML, PDF, etc - are generated from this master source. This file attempts to describe what tools are necessary for the maintenance of this document as well as the generation of the alternate formats of this document. This file will also spend a very little time describing the XML and SGML headers so you can understand a bit what you may need to do to be able to work with this document in any fashion other than simply editing it. We will spend almost no time on the actual tags and how to write an XML DocBook compliant document. If you are at all familiar with SGML or HTML it will be very evident. You only need to know what the tags are and how to use them. You can find a good resource either for this either online or in printed form: DocBook: The Definitive Guide By Norman Walsh and Leonard Muellner ISBN: 156592-580-7 1st Edition, October 1999 Copyright (C) 1999 by O'Reilly & Associates, Inc. All rights reserved. The book is available online in HTML format: http://docbook.org/ and buried in: http://www.nwalsh.com/docbook/defguide/index.html A lot of useful stuff is at NWalsh's site in general. You may also want to look at: http://www.xml.com/ The BIND v9 ARM is based on the XML 4.0 DocBook DTD. Every XML and SGML document begins with a prefix that tells where to find the file that describes the meaning and structure of the tags used in the rest of the document. For our XML DocBook 4.0 based document this prefix looks like this: This "DOCTYPE" statement has three parts, of which we are only using two: o The highest level term that represents this document (in this case it is "book" o The identifier that tells us which DTD to use. This identifier has two parts, the "Formal Public Identifier" (or FPI) and the system identifier. In SGML you can have either a FPI or a SYSTEM identifier but you have to have at least one of them. In XML you have to have a SYSTEM identifier. FP & SYSTEM identifiers - These are names/lookups for the actual DTD. The FPI is a globally unique name that should, on a properly configured system, tell you exactly what DTD to use. The SYSTEM identifier gives an absolute location for the DTD. In XML these are supposed to be properly formatted URL's. SGML has these things called "catalogs" that are files that map FPI's in to actual files. A "catalog" can also be used to remap a SYSTEM identifier so you can say something like: "http://www.oasis.org/foo" is actually "/usr/local/share/xml/foo.dtd" When you use various SGML/XML tools they need to be configured to look at the same "catalog" files so that as you move from tool to tool they all refer to the same DTD for the same document. We will be spending most of our configuration time making sure our tools use the same "catalog" files and that we have the same DTD's installed on our machines. XML's requirement of the SYSTEM identifier over the FPI will probably lead to more problems as it does not guarantee that everyone is using the same DTD. I did my initial work with the "sgmltools" the XML 4.0 DocBook DTD and "jade" or "openjade." You can get the 4.0 XML DocBook DTD from: http://www.docbook.org/xml/4.0/ (download the .zip file.) NOTE: We will eventually be changing the SYSTEM identifier to the recommended value of: http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd NOTE: Under FreeBSD this is the package: /usr/ports/textproc/docbook-xml NetBSD instructions are coming soon. With packages listed below installed under FreeBSD the "catalog" file that all the tools refer to at least one is in: /usr/local/share/sgml/catalog In order for our SYSTEM identifier for the XML DocBook dtd to be found I create a new catalog file at the top of the XML directory created on FreeBSD: /usr/local/share/xml/catalog This file has one line: SYSTEM "http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd" "/usr/local/share/xml/dtd/docbook/docbookx.dtd" Then in the main "catalog" I have it include this XML catalog: CATALOG "/usr/local/share/xml/catalog" On your systems you need to replace "/usr/local/share" with your prefix root (probably /usr/pkg under NetBSD.) NOTE: The URL used above is supposed to the be the proper one for this XML DocBook DTD... but there is nothing at that URL so you really do need the "SYSTEM" identifier mapping in your catalog (or make the SYSTEM identifier in your document refer to the real location of the file on your local system.) HOW TO VALIDATE A DOCUMENT: I use the sgmltools "nsgmls" document validator. Since we are using XML we need to use the XML declarations, which are installed as part of the modular DSSL style sheets: nsgmls -sv /usr/local/share/sgml/docbook/dsssl/modular/dtds/decls/xml.dcl \ Bv9ARM-book.xml A convenient shell script "validate.sh" is now generated by configure to invoke the above command with the correct system-dependent paths. The SGML tools can be found at: ftp://ftp.us.sgmltools.org/pub/SGMLtools/v2.0/source/ \ ftp://ftp.nllgg.nl/pub/SGMLtools/v2.0/source/ FreeBSD package for these is: /usr/ports/textproc/sgmltools HOW TO RENDER A DOCUMENT AS HTML or TeX: o Generate html doc with: openjade -v -d ./nominum-docbook-html.dsl \ -t sgml \ /usr/local/share/sgml/docbook/dsssl/modular/dtds/decls/xml.dcl \ Bv9ARM-book.xml A convenient shell script "genhtml.sh" is now generated by configure to invoke the above command with the correct system-dependent paths. On NetBSD there is no port for "openjade" however "jade" does still work. However you need to specify the "catalog" file to use for style sheets on the command line AND you need to have a default "catalog" mapping where to find various DTDs. It seems that "jade" installed out of the box on NetBSD does not use a globally defined "catalog" file for mapping PUBLIC identifiers in to SYSTEM identifiers. So you need to have a "catalog" file in your current working directory that has in it this: (these are probably more entries than you need!) CATALOG "/usr/pkg/share/sgml/iso8879/catalog" CATALOG "/usr/pkg/share/sgml/docbook/2.4.1/catalog" CATALOG "/usr/pkg/share/sgml/docbook/3.0/catalog" CATALOG "/usr/pkg/share/sgml/docbook/3.1/catalog" CATALOG "/usr/pkg/share/sgml/jade/catalog" CATALOG "/usr/local/share/xml/catalog" (These would all be "/usr/local" on FreeBSD) So the command for jade on NetBSD will look like this: jade -v -c /usr/pkg/share/sgml/catalog -t sgml \ -d ./nominum-docbook-html.dsl \ /usr/pkg/share/sgml/docbook/dsssl/modular/dtds/decls/xml.dcl \ ./Bv9ARM-book.xml Furthermore, since the style sheet subset we define has in it a hard coded path to the style sheet is based, it is actually generated by configure from a .in file so that it will contain the correct system-dependent path: where on FreeBSD the second line reads: On NetBSD it needs to read: NOTE: This is usually solved by having this style sheet modification be installed in a system directory and have it reference the style sheet it is based on via a relative path. o Generate TeX documentation: openjade -d ./nominum-docbook-print.dsl -t tex -v \ /usr/local/share/sgml/docbook/dsssl/modular/dtds/decls/xml.dcl \ Bv9ARM-book.xml If you have "jade" installed instead of "openjade" then use that as the command. There is little difference, openjade has some bug fixes and is in more active development. To convert the resulting TeX file in to a DVI file you need to do: tex "&jadetex" Bv9ARM-book.tex You can also directly generate the pdf file via: pdftex "&pdfjadetex" Bv9ARM-book.tex The scripts "genpdf.sh" and "gendvi." have been added to simply generating the PDF and DVI output. These substitute the correct paths of NetBSD & FreeBSD. You still need to have TeX, jadeTeX, and pdfTeX installed and configured properly for these to work. You will need to up both the "pool_size" and "hash_extra" variables in your texmf.cnf file and regenerate them. See below. You can see that I am using a DSSSL style sheet for DocBook. Actually two different ones - one for rendering html, and one for 'print' media. NOTE: For HTML we are using a Nominum DSSSL style instead of the default one (all it does is change the chunking to the chapter level and makes the files end with ".html" instead of ".htm" so far.) If you want to use the plain jane DSSSL style sheet replace the: -d ./nominum-docbook-html.dsl with -d /usr/local/share/sgml/docbook/dsssl/modular/html/docbook.dsl This style sheet will attempt to reference the one above. I am currently working on fixing these up so that it works the same on our various systems. The main trick is knowing which DTD's and DSSSL stylesheets you have installed, installing the right ones, and configuring a CATALOG that refers to them in the same way. We will probably end up putting our CATALOG's in the same place and then we should be able to generate and validate our documents with a minimal number of command line arguments. When running these commands you will get a lot of messages about a bunch of general entities not being defined and having no default entity. You can ignore those for now. Also with the style sheets we have and jade as it is you will get messages about "xref to title" being unsupported. You can ignore these for now as well. === Getting the various tools installed on FreeBSD (NetBSD coming soon..) o On freebsd you need to install the following packages: o print/teTeX o textproc/openjade o textproc/docbook o textproc/docbook-xml o textproc/dsssl-docbook-modular o textproc/dtd-catalogs o on freebsd you need to make some entities visible to the docbook xml dtd by making a symlink (can probably be done with a catalog too) ln -s /usr/local/share/xml/entity /usr/local/share/xml/dtd/docbook/ent o you may need to edit /usr/local/share/sgml/catalog and add the line: CATALOG "/usr/local/share/sgml/openjade/catalog" o add "hugelatex," Enlarge pool sizes, install the jadetex TeX driver file. cd /usr/local/share/texmf/web2c/ sudo cp texmf.cnf texmf.cnf.bak o edit the lines in texmf.cnf with these keys to these values: main_memory = 1100000 hash_extra = 15000 pool_size = 500000 string_vacancies = 45000 max_strings = 55000 pool_free = 47500 nest_size = 500 param_size = 1500 save_size = 5000 stack_size = 1500 sudo tex -ini -progname=hugelatex -fmt=hugelatex latex.ltx sudo texconfig init sudo texhash o For the jadetex macros you will need I recommend you get a more current version than what is packaged with openjade or jade. Checkout http://www.tug.org/applications/jadetex/ Unzip the file you get from there (should be jadetex-2.20 or newer.) In the directory you unzip: sudo make install sudo texhash NOTE: In the most uptodate "ports" for FreeBSD, jadetext is 2.20+ so on this platform you should be set as of 2001.01.08. bind9-9.9.5.dfsg/doc/arm/man.nsupdate.html0000644000470500017500000006547612271526120017665 0ustar lamontlamont nsupdate

    Name

    nsupdate — Dynamic DNS update utility

    Synopsis

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

    DESCRIPTION

    nsupdate is used to submit Dynamic DNS Update requests as defined in RFC 2136 to a name server. This allows resource records to be added or removed from a zone without manually editing the zone file. A single update request can contain requests to add or remove more than one resource record.

    Zones that are under dynamic control via nsupdate or a DHCP server should not be edited by hand. Manual edits could conflict with dynamic updates and cause data to be lost.

    The resource records that are dynamically added or removed with nsupdate have to be in the same zone. Requests are sent to the zone's master server. This is identified by the MNAME field of the zone's SOA record.

    The -d option makes nsupdate operate in debug mode. This provides tracing information about the update requests that are made and the replies received from the name server.

    The -D option makes nsupdate report additional debugging information to -d.

    The -L option with an integer argument of zero or higher sets the logging debug level. If zero, logging is disabled.

    Transaction signatures can be used to authenticate the Dynamic DNS updates. These use the TSIG resource record type described in RFC 2845 or the SIG(0) record described in RFC 2535 and RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on a shared secret that should only be known to nsupdate and the name server. Currently, the only supported encryption algorithm for TSIG is HMAC-MD5, which is defined in RFC 2104. Once other algorithms are defined for TSIG, applications will need to ensure they select the appropriate algorithm as well as the key when authenticating each other. For instance, suitable key and server statements would be added to /etc/named.conf so that the name server can associate the appropriate secret key and algorithm with the IP address of the client application that will be using TSIG authentication. SIG(0) uses public key cryptography. To use a SIG(0) key, the public key must be stored in a KEY record in a zone served by the name server. nsupdate does not read /etc/named.conf.

    GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode is switched on with the -g flag. A non-standards-compliant variant of GSS-TSIG used by Windows 2000 can be switched on with the -o flag.

    nsupdate uses the -y or -k option to provide the shared secret needed to generate a TSIG record for authenticating Dynamic DNS update requests, default type HMAC-MD5. These options are mutually exclusive.

    When the -y option is used, a signature is generated from [hmac:]keyname:secret. keyname is the name of the key, and secret is the base64 encoded shared secret. Use of the -y option is discouraged because the shared secret is supplied as a command line argument in clear text. This may be visible in the output from ps(1) or in a history file maintained by the user's shell.

    With the -k option, nsupdate reads the shared secret from the file keyfile. Keyfiles may be in two formats: a single file containing a named.conf-format key statement, which may be generated automatically by ddns-confgen, or a pair of files whose names are of the format K{name}.+157.+{random}.key and K{name}.+157.+{random}.private, which can be generated by dnssec-keygen. The -k may also be used to specify a SIG(0) key used to authenticate Dynamic DNS update requests. In this case, the key specified is not an HMAC-MD5 key.

    nsupdate can be run in a local-host only mode using the -l flag. This sets the server address to localhost (disabling the server so that the server address cannot be overridden). Connections to the local server will use a TSIG key found in /var/run/named/session.key, which is automatically generated by named if any local master zone has set update-policy to local. The location of this key file can be overridden with the -k option.

    By default, nsupdate uses UDP to send update requests to the name server unless they are too large to fit in a UDP request in which case TCP will be used. The -v option makes nsupdate use a TCP connection. This may be preferable when a batch of update requests is made.

    The -p sets the default port number to use for connections to a name server. The default is 53.

    The -t option sets the maximum time an update request can take before it is aborted. The default is 300 seconds. Zero can be used to disable the timeout.

    The -u option sets the UDP retry interval. The default is 3 seconds. If zero, the interval will be computed from the timeout interval and number of UDP retries.

    The -r option sets the number of UDP retries. The default is 3. If zero, only one update request will be made.

    The -R randomdev option specifies a source of randomness. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used. This option may be specified multiple times.

    INPUT FORMAT

    nsupdate reads input from filename or standard input. Each command is supplied on exactly one line of input. Some commands are for administrative purposes. The others are either update instructions or prerequisite checks on the contents of the zone. These checks set conditions that some name or set of resource records (RRset) either exists or is absent from the zone. These conditions must be met if the entire update request is to succeed. Updates will be rejected if the tests for the prerequisite conditions fail.

    Every update request consists of zero or more prerequisites and zero or more updates. This allows a suitably authenticated update request to proceed if some specified resource records are present or missing from the zone. A blank input line (or the send command) causes the accumulated commands to be sent as one Dynamic DNS update request to the name server.

    The command formats and their meaning are as follows:

    server {servername} [port]

    Sends all dynamic update requests to the name server servername. When no server statement is provided, nsupdate will send updates to the master server of the correct zone. The MNAME field of that zone's SOA record will identify the master server for that zone. port is the port number on servername where the dynamic update requests get sent. If no port number is specified, the default DNS port number of 53 is used.

    local {address} [port]

    Sends all dynamic update requests using the local address. When no local statement is provided, nsupdate will send updates using an address and port chosen by the system. port can additionally be used to make requests come from a specific port. If no port number is specified, the system will assign one.

    zone {zonename}

    Specifies that all updates are to be made to the zone zonename. If no zone statement is provided, nsupdate will attempt determine the correct zone to update based on the rest of the input.

    class {classname}

    Specify the default class. If no class is specified, the default class is IN.

    ttl {seconds}

    Specify the default time to live for records to be added. The value none will clear the default ttl.

    key {name} {secret}

    Specifies that all updates are to be TSIG-signed using the keyname keysecret pair. The key command overrides any key specified on the command line via -y or -k.

    gsstsig

    Use GSS-TSIG to sign the updated. This is equivalent to specifying -g on the commandline.

    oldgsstsig

    Use the Windows 2000 version of GSS-TSIG to sign the updated. This is equivalent to specifying -o on the commandline.

    realm {[realm_name]}

    When using GSS-TSIG use realm_name rather than the default realm in krb5.conf. If no realm is specified the saved realm is cleared.

    [prereq] nxdomain {domain-name}

    Requires that no resource record of any type exists with name domain-name.

    [prereq] yxdomain {domain-name}

    Requires that domain-name exists (has as at least one resource record, of any type).

    [prereq] nxrrset {domain-name} [class] {type}

    Requires that no resource record exists of the specified type, class and domain-name. If class is omitted, IN (internet) is assumed.

    [prereq] yxrrset {domain-name} [class] {type}

    This requires that a resource record of the specified type, class and domain-name must exist. If class is omitted, IN (internet) is assumed.

    [prereq] yxrrset {domain-name} [class] {type} {data...}

    The data from each set of prerequisites of this form sharing a common type, class, and domain-name are combined to form a set of RRs. This set of RRs must exactly match the set of RRs existing in the zone at the given type, class, and domain-name. The data are written in the standard text representation of the resource record's RDATA.

    [update] del[ete] {domain-name} [ttl] [class] [type [data...]]

    Deletes any resource records named domain-name. If type and data is provided, only matching resource records will be removed. The internet class is assumed if class is not supplied. The ttl is ignored, and is only allowed for compatibility.

    [update] add {domain-name} {ttl} [class] {type} {data...}

    Adds a new resource record with the specified ttl, class and data.

    show

    Displays the current message, containing all of the prerequisites and updates specified since the last send.

    send

    Sends the current message. This is equivalent to entering a blank line.

    answer

    Displays the answer.

    debug

    Turn on debugging.

    Lines beginning with a semicolon are comments and are ignored.

    EXAMPLES

    The examples below show how nsupdate could be used to insert and delete resource records from the example.com zone. Notice that the input in each example contains a trailing blank line so that a group of commands are sent as one dynamic update request to the master name server for example.com.

    # nsupdate
    > update delete oldhost.example.com A
    > update add newhost.example.com 86400 A 172.16.1.1
    > send
    

    Any A records for oldhost.example.com are deleted. And an A record for newhost.example.com with IP address 172.16.1.1 is added. The newly-added record has a 1 day TTL (86400 seconds).

    # nsupdate
    > prereq nxdomain nickname.example.com
    > update add nickname.example.com 86400 CNAME somehost.example.com
    > send
    

    The prerequisite condition gets the name server to check that there are no resource records of any type for nickname.example.com. If there are, the update request fails. If this name does not exist, a CNAME for it is added. This ensures that when the CNAME is added, it cannot conflict with the long-standing rule in RFC 1034 that a name must not exist as any other record type if it exists as a CNAME. (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have RRSIG, DNSKEY and NSEC records.)

    FILES

    /etc/resolv.conf

    used to identify default name server

    /var/run/named/session.key

    sets the default TSIG key for use in local-only mode

    K{name}.+157.+{random}.key

    base-64 encoding of HMAC-MD5 key created by dnssec-keygen(8).

    K{name}.+157.+{random}.private

    base-64 encoding of HMAC-MD5 key created by dnssec-keygen(8).

    SEE ALSO

    RFC 2136, RFC 3007, RFC 2104, RFC 2845, RFC 1034, RFC 2535, RFC 2931, named(8), ddns-confgen(8), dnssec-keygen(8).

    BUGS

    The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library for its cryptographic operations, and may change in future releases.

    bind9-9.9.5.dfsg/doc/arm/latex-fixup.pl0000644000470500017500000000402112271526120017160 0ustar lamontlamont#!/usr/bin/perl -w # # Copyright (C) 2005, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: latex-fixup.pl,v 1.5 2007/06/19 23:47:13 tbox Exp $ # Sadly, the final stages of generating a presentable PDF file always # seem to require some manual tweaking. Doesn't seem to matter what # typesetting tool one uses, sane forms of automation only go so far, # at least with present technology. # # This script is intended to be a collection of tweaks. The theory is # that, while we can't avoid the need for tweaking, we can at least # write the silly things down in a form that a program might be able # to execute. Undoubtedly everythig in here will break, eventually, # at which point it will need to be updated, but since the alternative # is to do the final editing by hand every time, this approach seems # the lesser of two evils. while (<>) { # Fix a db2latex oops. LaTeX2e does not like having tables with # duplicate names. Perhaps the dblatex project will fix this # someday, but we can get by with just deleting the offending # LaTeX commands for now. s/\\addtocounter\{table\}\{-1\}//g; # Line break in the middle of quoting one period looks weird. s/{\\texttt{{\.\\dbz{}}}}/\\mbox{{\\texttt{{\.\\dbz{}}}}}/; # Add any further tweaking here. # Write out whatever we have now. print; } bind9-9.9.5.dfsg/doc/arm/man.genrandom.html0000644000470500017500000001066712271526120020004 0ustar lamontlamont genrandom

    Name

    genrandom — generate a file containing random data

    Synopsis

    genrandom [-n number] {size} {filename}

    DESCRIPTION

    genrandom generates a file or a set of files containing a specified quantity of pseudo-random data, which can be used as a source of entropy for other commands on systems with no random device.

    ARGUMENTS

    -n number

    In place of generating one file, generates number (from 2 to 9) files, appending number to the name.

    size

    The size of the file, in kilobytes, to generate.

    filename

    The file name into which random data should be written.

    SEE ALSO

    rand(3), arc4random(3)

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.dnssec-settime.html0000644000470500017500000003124412271526120020753 0ustar lamontlamont dnssec-settime

    Name

    dnssec-settime — Set the key timing metadata for a DNSSEC key

    Synopsis

    dnssec-settime [-f] [-K directory] [-L ttl] [-P date/offset] [-A date/offset] [-R date/offset] [-I date/offset] [-D date/offset] [-h] [-v level] [-E engine] {keyfile}

    DESCRIPTION

    dnssec-settime reads a DNSSEC private key file and sets the key timing metadata as specified by the -P, -A, -R, -I, and -D options. The metadata can then be used by dnssec-signzone or other signing software to determine when a key is to be published, whether it should be used for signing a zone, etc.

    If none of these options is set on the command line, then dnssec-settime simply prints the key timing metadata already stored in the key.

    When key metadata fields are changed, both files of a key pair (Knnnn.+aaa+iiiii.key and Knnnn.+aaa+iiiii.private) are regenerated. Metadata fields are stored in the private file. A human-readable description of the metadata is also placed in comments in the key file. The private file's permissions are always set to be inaccessible to anyone other than the owner (mode 0600).

    OPTIONS

    -f

    Force an update of an old-format key with no metadata fields. Without this option, dnssec-settime will fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be set to the present time. If no other values are specified, then the key's publication and activation dates will also be set to the present time.

    -K directory

    Sets the directory in which the key files are to reside.

    -L ttl

    Sets the default TTL to use for this key when it is converted into a DNSKEY RR. If the key is imported into a zone, this is the TTL that will be used for it, unless there was already a DNSKEY RRset in place, in which case the existing TTL would take precedence. Setting the default TTL to 0 or none removes it.

    -h

    Emit usage message and exit.

    -v level

    Sets the debugging level.

    -E engine

    Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.

    TIMING OPTIONS

    Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24-hour days, ignoring leap years), months (defined as 30 24-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds. To unset a date, use 'none'.

    -P date/offset

    Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it.

    -A date/offset

    Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it.

    -R date/offset

    Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.

    -I date/offset

    Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.

    -D date/offset

    Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)

    -S predecessor key

    Select a key for which the key being modified will be an explicit successor. The name, algorithm, size, and type of the predecessor key must exactly match those of the key being modified. The activation date of the successor key will be set to the inactivation date of the predecessor. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.

    -i interval

    Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.

    If the key is being set to be an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.

    As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.

    PRINTING OPTIONS

    dnssec-settime can also be used to print the timing metadata associated with a key.

    -u

    Print times in UNIX epoch format.

    -p C/P/A/R/I/D/all

    Print a specific metadata value or set of metadata values. The -p option may be followed by one or more of the following letters to indicate which value or values to print: C for the creation date, P for the publication date, A for the activation date, R for the revocation date, I for the inactivation date, or D for the deletion date. To print all of the metadata, use -p all.

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.arpaname.html0000644000470500017500000000667712271526120017624 0ustar lamontlamont arpaname

    Name

    arpaname — translate IP addresses to the corresponding ARPA names

    Synopsis

    arpaname {ipaddress ...}

    DESCRIPTION

    arpaname translates IP addresses (IPv4 and IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.

    SEE ALSO

    BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM-book.xml0000644000470500017500000244661212271526120017051 0ustar lamontlamont]> BIND 9 Administrator Reference Manual 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 Internet Systems Consortium, Inc. ("ISC") 2000 2001 2002 2003 Internet Software Consortium. Introduction The Internet Domain Name System (DNS) consists of the syntax to specify the names of entities in the Internet in a hierarchical manner, the rules used for delegating authority over names, and the system implementation that actually maps names to Internet addresses. DNS data is maintained in a group of distributed hierarchical databases. Scope of Document The Berkeley Internet Name Domain (BIND) implements a domain name server for a number of operating systems. This document provides basic information about the installation and care of the Internet Systems Consortium (ISC) BIND version 9 software package for system administrators. This version of the manual corresponds to BIND version 9.9. Organization of This Document In this document, Chapter 1 introduces the basic DNS and BIND concepts. Chapter 2 describes resource requirements for running BIND in various environments. Information in Chapter 3 is task-oriented in its presentation and is organized functionally, to aid in the process of installing the BIND 9 software. The task-oriented section is followed by Chapter 4, which contains more advanced concepts that the system administrator may need for implementing certain options. Chapter 5 describes the BIND 9 lightweight resolver. The contents of Chapter 6 are organized as in a reference manual to aid in the ongoing maintenance of the software. Chapter 7 addresses security considerations, and Chapter 8 contains troubleshooting help. The main body of the document is followed by several appendices which contain useful reference information, such as a bibliography and historic information related to BIND and the Domain Name System. Conventions Used in This Document In this document, we use the following general typographic conventions: To describe: We use the style: a pathname, filename, URL, hostname, mailing list name, or new term or concept Fixed width literal user input Fixed Width Bold program output Fixed Width The following conventions are used in descriptions of the BIND configuration file: To describe: We use the style: keywords Fixed Width variables Fixed Width Optional input Text is enclosed in square brackets The Domain Name System (<acronym>DNS</acronym>) The purpose of this document is to explain the installation and upkeep of the BIND (Berkeley Internet Name Domain) software package, and we begin by reviewing the fundamentals of the Domain Name System (DNS) as they relate to BIND. DNS Fundamentals The Domain Name System (DNS) is a hierarchical, distributed database. It stores information for mapping Internet host names to IP addresses and vice versa, mail routing information, and other data used by Internet applications. Clients look up information in the DNS by calling a resolver library, which sends queries to one or more name servers and interprets the responses. The BIND 9 software distribution contains a name server, named, and a resolver library, liblwres. The older libbind resolver library is also available from ISC as a separate download. Domains and Domain Names The data stored in the DNS is identified by domain names that are organized as a tree according to organizational or administrative boundaries. Each node of the tree, called a domain, is given a label. The domain name of the node is the concatenation of all the labels on the path from the node to the root node. This is represented in written form as a string of labels listed from right to left and separated by dots. A label need only be unique within its parent domain. For example, a domain name for a host at the company Example, Inc. could be ourhost.example.com, where com is the top level domain to which ourhost.example.com belongs, example is a subdomain of com, and ourhost is the name of the host. For administrative purposes, the name space is partitioned into areas called zones, each starting at a node and extending down to the leaf nodes or to nodes where other zones start. The data for each zone is stored in a name server, which answers queries about the zone using the DNS protocol. The data associated with each domain name is stored in the form of resource records (RRs). Some of the supported resource record types are described in . For more detailed information about the design of the DNS and the DNS protocol, please refer to the standards documents listed in . Zones To properly operate a name server, it is important to understand the difference between a zone and a domain. As stated previously, a zone is a point of delegation in the DNS tree. A zone consists of those contiguous parts of the domain tree for which a name server has complete information and over which it has authority. It contains all domain names from a certain point downward in the domain tree except those which are delegated to other zones. A delegation point is marked by one or more NS records in the parent zone, which should be matched by equivalent NS records at the root of the delegated zone. For instance, consider the example.com domain which includes names such as host.aaa.example.com and host.bbb.example.com even though the example.com zone includes only delegations for the aaa.example.com and bbb.example.com zones. A zone can map exactly to a single domain, but could also include only part of a domain, the rest of which could be delegated to other name servers. Every name in the DNS tree is a domain, even if it is terminal, that is, has no subdomains. Every subdomain is a domain and every domain except the root is also a subdomain. The terminology is not intuitive and we suggest that you read RFCs 1033, 1034 and 1035 to gain a complete understanding of this difficult and subtle topic. Though BIND is called a "domain name server", it deals primarily in terms of zones. The master and slave declarations in the named.conf file specify zones, not domains. When you ask some other site if it is willing to be a slave server for your domain, you are actually asking for slave service for some collection of zones. Authoritative Name Servers Each zone is served by at least one authoritative name server, which contains the complete data for the zone. To make the DNS tolerant of server and network failures, most zones have two or more authoritative servers, on different networks. Responses from authoritative servers have the "authoritative answer" (AA) bit set in the response packets. This makes them easy to identify when debugging DNS configurations using tools like dig (). The Primary Master The authoritative server where the master copy of the zone data is maintained is called the primary master server, or simply the primary. Typically it loads the zone contents from some local file edited by humans or perhaps generated mechanically from some other local file which is edited by humans. This file is called the zone file or master file. In some cases, however, the master file may not be edited by humans at all, but may instead be the result of dynamic update operations. Slave Servers The other authoritative servers, the slave servers (also known as secondary servers) load the zone contents from another server using a replication process known as a zone transfer. Typically the data are transferred directly from the primary master, but it is also possible to transfer it from another slave. In other words, a slave server may itself act as a master to a subordinate slave server. Stealth Servers Usually all of the zone's authoritative servers are listed in NS records in the parent zone. These NS records constitute a delegation of the zone from the parent. The authoritative servers are also listed in the zone file itself, at the top level or apex of the zone. You can list servers in the zone's top-level NS records that are not in the parent's NS delegation, but you cannot list servers in the parent's delegation that are not present at the zone's top level. A stealth server is a server that is authoritative for a zone but is not listed in that zone's NS records. Stealth servers can be used for keeping a local copy of a zone to speed up access to the zone's records or to make sure that the zone is available even if all the "official" servers for the zone are inaccessible. A configuration where the primary master server itself is a stealth server is often referred to as a "hidden primary" configuration. One use for this configuration is when the primary master is behind a firewall and therefore unable to communicate directly with the outside world. Caching Name Servers The resolver libraries provided by most operating systems are stub resolvers, meaning that they are not capable of performing the full DNS resolution process by themselves by talking directly to the authoritative servers. Instead, they rely on a local name server to perform the resolution on their behalf. Such a server is called a recursive name server; it performs recursive lookups for local clients. To improve performance, recursive servers cache the results of the lookups they perform. Since the processes of recursion and caching are intimately connected, the terms recursive server and caching server are often used synonymously. The length of time for which a record may be retained in the cache of a caching name server is controlled by the Time To Live (TTL) field associated with each resource record. Forwarding Even a caching name server does not necessarily perform the complete recursive lookup itself. Instead, it can forward some or all of the queries that it cannot satisfy from its cache to another caching name server, commonly referred to as a forwarder. There may be one or more forwarders, and they are queried in turn until the list is exhausted or an answer is found. Forwarders are typically used when you do not wish all the servers at a given site to interact directly with the rest of the Internet servers. A typical scenario would involve a number of internal DNS servers and an Internet firewall. Servers unable to pass packets through the firewall would forward to the server that can do it, and that server would query the Internet DNS servers on the internal server's behalf. Name Servers in Multiple Roles The BIND name server can simultaneously act as a master for some zones, a slave for other zones, and as a caching (recursive) server for a set of local clients. However, since the functions of authoritative name service and caching/recursive name service are logically separate, it is often advantageous to run them on separate server machines. A server that only provides authoritative name service (an authoritative-only server) can run with recursion disabled, improving reliability and security. A server that is not authoritative for any zones and only provides recursive service to local clients (a caching-only server) does not need to be reachable from the Internet at large and can be placed inside a firewall. <acronym>BIND</acronym> Resource Requirements Hardware requirements DNS hardware requirements have traditionally been quite modest. For many installations, servers that have been pensioned off from active duty have performed admirably as DNS servers. The DNSSEC features of BIND 9 may prove to be quite CPU intensive however, so organizations that make heavy use of these features may wish to consider larger systems for these applications. BIND 9 is fully multithreaded, allowing full utilization of multiprocessor systems for installations that need it. CPU Requirements CPU requirements for BIND 9 range from i486-class machines for serving of static zones without caching, to enterprise-class machines if you intend to process many dynamic updates and DNSSEC signed zones, serving many thousands of queries per second. Memory Requirements The memory of the server has to be large enough to fit the cache and zones loaded off disk. The max-cache-size option can be used to limit the amount of memory used by the cache, at the expense of reducing cache hit rates and causing more DNS traffic. Additionally, if additional section caching () is enabled, the max-acache-size option can be used to limit the amount of memory used by the mechanism. It is still good practice to have enough memory to load all zone and cache data into memory — unfortunately, the best way to determine this for a given installation is to watch the name server in operation. After a few weeks the server process should reach a relatively stable size where entries are expiring from the cache as fast as they are being inserted. Name Server Intensive Environment Issues For name server intensive environments, there are two alternative configurations that may be used. The first is where clients and any second-level internal name servers query a main name server, which has enough memory to build a large cache. This approach minimizes the bandwidth used by external name lookups. The second alternative is to set up second-level internal name servers to make queries independently. In this configuration, none of the individual machines needs to have as much memory or CPU power as in the first alternative, but this has the disadvantage of making many more external queries, as none of the name servers share their cached data. Supported Operating Systems ISC BIND 9 compiles and runs on a large number of Unix-like operating systems and on Microsoft Windows Server 2003 and 2008, and Windows XP and Vista. For an up-to-date list of supported systems, see the README file in the top level directory of the BIND 9 source distribution. Name Server Configuration In this chapter we provide some suggested configurations along with guidelines for their use. We suggest reasonable values for certain option settings. Sample Configurations A Caching-only Name Server The following sample configuration is appropriate for a caching-only name server for use by clients internal to a corporation. All queries from outside clients are refused using the allow-query option. Alternatively, the same effect could be achieved using suitable firewall rules. // Two corporate subnets we wish to allow queries from. acl corpnets { 192.168.4.0/24; 192.168.7.0/24; }; options { // Working directory directory "/etc/namedb"; allow-query { corpnets; }; }; // Provide a reverse mapping for the loopback // address 127.0.0.1 zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; notify no; }; An Authoritative-only Name Server This sample configuration is for an authoritative-only server that is the master server for "example.com" and a slave for the subdomain "eng.example.com". options { // Working directory directory "/etc/namedb"; // Do not allow access to cache allow-query-cache { none; }; // This is the default allow-query { any; }; // Do not provide recursive service recursion no; }; // Provide a reverse mapping for the loopback // address 127.0.0.1 zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; notify no; }; // We are the master server for example.com zone "example.com" { type master; file "example.com.db"; // IP addresses of slave servers allowed to // transfer example.com allow-transfer { 192.168.4.14; 192.168.5.53; }; }; // We are a slave server for eng.example.com zone "eng.example.com" { type slave; file "eng.example.com.bk"; // IP address of eng.example.com master server masters { 192.168.4.12; }; }; Load Balancing A primitive form of load balancing can be achieved in the DNS by using multiple records (such as multiple A records) for one name. For example, if you have three WWW servers with network addresses of 10.0.0.1, 10.0.0.2 and 10.0.0.3, a set of records such as the following means that clients will connect to each machine one third of the time: Name TTL CLASS TYPE Resource Record (RR) Data www 600 IN A 10.0.0.1 600 IN A 10.0.0.2 600 IN A 10.0.0.3 When a resolver queries for these records, BIND will rotate them and respond to the query with the records in a different order. In the example above, clients will randomly receive records in the order 1, 2, 3; 2, 3, 1; and 3, 1, 2. Most clients will use the first record returned and discard the rest. For more detail on ordering responses, check the rrset-order sub-statement in the options statement, see . Name Server Operations Tools for Use With the Name Server Daemon This section describes several indispensable diagnostic, administrative and monitoring tools available to the system administrator for controlling and debugging the name server daemon. Diagnostic Tools The dig, host, and nslookup programs are all command line tools for manually querying name servers. They differ in style and output format. dig The domain information groper (dig) is the most versatile and complete of these lookup tools. It has two modes: simple interactive mode for a single query, and batch mode which executes a query for each in a list of several query lines. All query options are accessible from the command line. dig @server domain query-type query-class +query-option -dig-option %comment The usual simple use of dig will take the form dig @server domain query-type query-class For more information and a list of available commands and options, see the dig man page. host The host utility emphasizes simplicity and ease of use. By default, it converts between host names and Internet addresses, but its functionality can be extended with the use of options. host -aCdlnrsTwv -c class -N ndots -t type -W timeout -R retries -m flag -4 -6 hostname server For more information and a list of available commands and options, see the host man page. nslookup nslookup has two modes: interactive and non-interactive. Interactive mode allows the user to query name servers for information about various hosts and domains or to print a list of hosts in a domain. Non-interactive mode is used to print just the name and requested information for a host or domain. nslookup -option host-to-find - server Interactive mode is entered when no arguments are given (the default name server will be used) or when the first argument is a hyphen (`-') and the second argument is the host name or Internet address of a name server. Non-interactive mode is used when the name or Internet address of the host to be looked up is given as the first argument. The optional second argument specifies the host name or address of a name server. Due to its arcane user interface and frequently inconsistent behavior, we do not recommend the use of nslookup. Use dig instead. Administrative Tools Administrative tools play an integral part in the management of a server. named-checkconf The named-checkconf program checks the syntax of a named.conf file. named-checkconf -jvz -t directory filename named-checkzone The named-checkzone program checks a master file for syntax and consistency. named-checkzone -djqvD -c class -o output -t directory -w directory -k (ignore|warn|fail) -n (ignore|warn|fail) -W (ignore|warn) zone filename named-compilezone Similar to named-checkzone, but it always dumps the zone content to a specified file (typically in a different format). rndc The remote name daemon control (rndc) program allows the system administrator to control the operation of a name server. Since BIND 9.2, rndc supports all the commands of the BIND 8 ndc utility except ndc start and ndc restart, which were also not supported in ndc's channel mode. If you run rndc without any options it will display a usage message as follows: rndc -c config -s server -p port -y key command command See for details of the available rndc commands. rndc requires a configuration file, since all communication with the server is authenticated with digital signatures that rely on a shared secret, and there is no way to provide that secret other than with a configuration file. The default location for the rndc configuration file is /etc/rndc.conf, but an alternate location can be specified with the option. If the configuration file is not found, rndc will also look in /etc/rndc.key (or whatever sysconfdir was defined when the BIND build was configured). The rndc.key file is generated by running rndc-confgen -a as described in . The format of the configuration file is similar to that of named.conf, but limited to only four statements, the options, key, server and include statements. These statements are what associate the secret keys to the servers with which they are meant to be shared. The order of statements is not significant. The options statement has three clauses: default-server, default-key, and default-port. default-server takes a host name or address argument and represents the server that will be contacted if no option is provided on the command line. default-key takes the name of a key as its argument, as defined by a key statement. default-port specifies the port to which rndc should connect if no port is given on the command line or in a server statement. The key statement defines a key to be used by rndc when authenticating with named. Its syntax is identical to the key statement in named.conf. The keyword key is followed by a key name, which must be a valid domain name, though it need not actually be hierarchical; thus, a string like "rndc_key" is a valid name. The key statement has two clauses: algorithm and secret. While the configuration parser will accept any string as the argument to algorithm, currently only the string "hmac-md5" has any meaning. The secret is a base-64 encoded string as specified in RFC 3548. The server statement associates a key defined using the key statement with a server. The keyword server is followed by a host name or address. The server statement has two clauses: key and port. The key clause specifies the name of the key to be used when communicating with this server, and the port clause can be used to specify the port rndc should connect to on the server. A sample minimal configuration file is as follows: key rndc_key { algorithm "hmac-md5"; secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K"; }; options { default-server 127.0.0.1; default-key rndc_key; }; This file, if installed as /etc/rndc.conf, would allow the command: $ rndc reload to connect to 127.0.0.1 port 953 and cause the name server to reload, if a name server on the local machine were running with following controls statements: controls { inet 127.0.0.1 allow { localhost; } keys { rndc_key; }; }; and it had an identical key statement for rndc_key. Running the rndc-confgen program will conveniently create a rndc.conf file for you, and also display the corresponding controls statement that you need to add to named.conf. Alternatively, you can run rndc-confgen -a to set up a rndc.key file and not modify named.conf at all. Signals Certain UNIX signals cause the name server to take specific actions, as described in the following table. These signals can be sent using the kill command. SIGHUP Causes the server to read named.conf and reload the database. SIGTERM Causes the server to clean up and exit. SIGINT Causes the server to clean up and exit. Advanced DNS Features Notify DNS NOTIFY is a mechanism that allows master servers to notify their slave servers of changes to a zone's data. In response to a NOTIFY from a master server, the slave will check to see that its version of the zone is the current version and, if not, initiate a zone transfer. For more information about DNS NOTIFY, see the description of the notify option in and the description of the zone option also-notify in . The NOTIFY protocol is specified in RFC 1996. As a slave zone can also be a master to other slaves, named, by default, sends NOTIFY messages for every zone it loads. Specifying notify master-only; will cause named to only send NOTIFY for master zones that it loads. Dynamic Update Dynamic Update is a method for adding, replacing or deleting records in a master server by sending it a special form of DNS messages. The format and meaning of these messages is specified in RFC 2136. Dynamic update is enabled by including an allow-update or an update-policy clause in the zone statement. If the zone's update-policy is set to local, updates to the zone will be permitted for the key local-ddns, which will be generated by named at startup. See for more details. Dynamic updates using Kerberos signed requests can be made using the TKEY/GSS protocol by setting either the tkey-gssapi-keytab option, or alternatively by setting both the tkey-gssapi-credential and tkey-domain options. Once enabled, Kerberos signed requests will be matched against the update policies for the zone, using the Kerberos principal as the signer for the request. Updating of secure zones (zones using DNSSEC) follows RFC 3007: RRSIG, NSEC and NSEC3 records affected by updates are automatically regenerated by the server using an online zone key. Update authorization is based on transaction signatures and an explicit server policy. The journal file All changes made to a zone using dynamic update are stored in the zone's journal file. This file is automatically created by the server when the first dynamic update takes place. The name of the journal file is formed by appending the extension .jnl to the name of the corresponding zone file unless specifically overridden. The journal file is in a binary format and should not be edited manually. The server will also occasionally write ("dump") the complete contents of the updated zone to its zone file. This is not done immediately after each dynamic update, because that would be too slow when a large zone is updated frequently. Instead, the dump is delayed by up to 15 minutes, allowing additional updates to take place. During the dump process, transient files will be created with the extensions .jnw and .jbk; under ordinary circumstances, these will be removed when the dump is complete, and can be safely ignored. When a server is restarted after a shutdown or crash, it will replay the journal file to incorporate into the zone any updates that took place after the last zone dump. Changes that result from incoming incremental zone transfers are also journalled in a similar way. The zone files of dynamic zones cannot normally be edited by hand because they are not guaranteed to contain the most recent dynamic changes — those are only in the journal file. The only way to ensure that the zone file of a dynamic zone is up to date is to run rndc stop. If you have to make changes to a dynamic zone manually, the following procedure will work: Disable dynamic updates to the zone using rndc freeze zone. This will also remove the zone's .jnl file and update the master file. Edit the zone file. Run rndc thaw zone to reload the changed zone and re-enable dynamic updates. Incremental Zone Transfers (IXFR) The incremental zone transfer (IXFR) protocol is a way for slave servers to transfer only changed data, instead of having to transfer the entire zone. The IXFR protocol is specified in RFC 1995. See . When acting as a master, BIND 9 supports IXFR for those zones where the necessary change history information is available. These include master zones maintained by dynamic update and slave zones whose data was obtained by IXFR. For manually maintained master zones, and for slave zones obtained by performing a full zone transfer (AXFR), IXFR is supported only if the option ixfr-from-differences is set to yes. When acting as a slave, BIND 9 will attempt to use IXFR unless it is explicitly disabled. For more information about disabling IXFR, see the description of the request-ixfr clause of the server statement. Split DNS Setting up different views, or visibility, of the DNS space to internal and external resolvers is usually referred to as a Split DNS setup. There are several reasons an organization would want to set up its DNS this way. One common reason for setting up a DNS system this way is to hide "internal" DNS information from "external" clients on the Internet. There is some debate as to whether or not this is actually useful. Internal DNS information leaks out in many ways (via email headers, for example) and most savvy "attackers" can find the information they need using other means. However, since listing addresses of internal servers that external clients cannot possibly reach can result in connection delays and other annoyances, an organization may choose to use a Split DNS to present a consistent view of itself to the outside world. Another common reason for setting up a Split DNS system is to allow internal networks that are behind filters or in RFC 1918 space (reserved IP space, as documented in RFC 1918) to resolve DNS on the Internet. Split DNS can also be used to allow mail from outside back in to the internal network. Example split DNS setup Let's say a company named Example, Inc. (example.com) has several corporate sites that have an internal network with reserved Internet Protocol (IP) space and an external demilitarized zone (DMZ), or "outside" section of a network, that is available to the public. Example, Inc. wants its internal clients to be able to resolve external hostnames and to exchange mail with people on the outside. The company also wants its internal resolvers to have access to certain internal-only zones that are not available at all outside of the internal network. In order to accomplish this, the company will set up two sets of name servers. One set will be on the inside network (in the reserved IP space) and the other set will be on bastion hosts, which are "proxy" hosts that can talk to both sides of its network, in the DMZ. The internal servers will be configured to forward all queries, except queries for site1.internal, site2.internal, site1.example.com, and site2.example.com, to the servers in the DMZ. These internal servers will have complete sets of information for site1.example.com, site2.example.com, site1.internal, and site2.internal. To protect the site1.internal and site2.internal domains, the internal name servers must be configured to disallow all queries to these domains from any external hosts, including the bastion hosts. The external servers, which are on the bastion hosts, will be configured to serve the "public" version of the site1 and site2.example.com zones. This could include things such as the host records for public servers (www.example.com and ftp.example.com), and mail exchange (MX) records (a.mx.example.com and b.mx.example.com). In addition, the public site1 and site2.example.com zones should have special MX records that contain wildcard (`*') records pointing to the bastion hosts. This is needed because external mail servers do not have any other way of looking up how to deliver mail to those internal hosts. With the wildcard records, the mail will be delivered to the bastion host, which can then forward it on to internal hosts. Here's an example of a wildcard MX record: * IN MX 10 external1.example.com. Now that they accept mail on behalf of anything in the internal network, the bastion hosts will need to know how to deliver mail to internal hosts. In order for this to work properly, the resolvers on the bastion hosts will need to be configured to point to the internal name servers for DNS resolution. Queries for internal hostnames will be answered by the internal servers, and queries for external hostnames will be forwarded back out to the DNS servers on the bastion hosts. In order for all this to work properly, internal clients will need to be configured to query only the internal name servers for DNS queries. This could also be enforced via selective filtering on the network. If everything has been set properly, Example, Inc.'s internal clients will now be able to: Look up any hostnames in the site1 and site2.example.com zones. Look up any hostnames in the site1.internal and site2.internal domains. Look up any hostnames on the Internet. Exchange mail with both internal and external people. Hosts on the Internet will be able to: Look up any hostnames in the site1 and site2.example.com zones. Exchange mail with anyone in the site1 and site2.example.com zones. Here is an example configuration for the setup we just described above. Note that this is only configuration information; for information on how to configure your zone files, see . Internal DNS server config: acl internals { 172.16.72.0/24; 192.168.1.0/24; }; acl externals { bastion-ips-go-here; }; options { ... ... forward only; // forward to external servers forwarders { bastion-ips-go-here; }; // sample allow-transfer (no one) allow-transfer { none; }; // restrict query access allow-query { internals; externals; }; // restrict recursion allow-recursion { internals; }; ... ... }; // sample master zone zone "site1.example.com" { type master; file "m/site1.example.com"; // do normal iterative resolution (do not forward) forwarders { }; allow-query { internals; externals; }; allow-transfer { internals; }; }; // sample slave zone zone "site2.example.com" { type slave; file "s/site2.example.com"; masters { 172.16.72.3; }; forwarders { }; allow-query { internals; externals; }; allow-transfer { internals; }; }; zone "site1.internal" { type master; file "m/site1.internal"; forwarders { }; allow-query { internals; }; allow-transfer { internals; } }; zone "site2.internal" { type slave; file "s/site2.internal"; masters { 172.16.72.3; }; forwarders { }; allow-query { internals }; allow-transfer { internals; } }; External (bastion host) DNS server config: acl internals { 172.16.72.0/24; 192.168.1.0/24; }; acl externals { bastion-ips-go-here; }; options { ... ... // sample allow-transfer (no one) allow-transfer { none; }; // default query access allow-query { any; }; // restrict cache access allow-query-cache { internals; externals; }; // restrict recursion allow-recursion { internals; externals; }; ... ... }; // sample slave zone zone "site1.example.com" { type master; file "m/site1.foo.com"; allow-transfer { internals; externals; }; }; zone "site2.example.com" { type slave; file "s/site2.foo.com"; masters { another_bastion_host_maybe; }; allow-transfer { internals; externals; } }; In the resolv.conf (or equivalent) on the bastion host(s): search ... nameserver 172.16.72.2 nameserver 172.16.72.3 nameserver 172.16.72.4 TSIG This is a short guide to setting up Transaction SIGnatures (TSIG) based transaction security in BIND. It describes changes to the configuration file as well as what changes are required for different features, including the process of creating transaction keys and using transaction signatures with BIND. BIND primarily supports TSIG for server to server communication. This includes zone transfer, notify, and recursive query messages. Resolvers based on newer versions of BIND 8 have limited support for TSIG. TSIG can also be useful for dynamic update. A primary server for a dynamic zone should control access to the dynamic update service, but IP-based access control is insufficient. The cryptographic access control provided by TSIG is far superior. The nsupdate program supports TSIG via the and command line options or inline by use of the key. Generate Shared Keys for Each Pair of Hosts A shared secret is generated to be shared between host1 and host2. An arbitrary key name is chosen: "host1-host2.". The key name must be the same on both hosts. Automatic Generation The following command will generate a 128-bit (16 byte) HMAC-SHA256 key as described above. Longer keys are better, but shorter keys are easier to read. Note that the maximum key length is the digest length, here 256 bits. dnssec-keygen -a hmac-sha256 -b 128 -n HOST host1-host2. The key is in the file Khost1-host2.+163+00000.private. Nothing directly uses this file, but the base-64 encoded string following "Key:" can be extracted from the file and used as a shared secret: Key: La/E5CjG9O+os1jq0a2jdA== The string "La/E5CjG9O+os1jq0a2jdA==" can be used as the shared secret. Manual Generation The shared secret is simply a random sequence of bits, encoded in base-64. Most ASCII strings are valid base-64 strings (assuming the length is a multiple of 4 and only valid characters are used), so the shared secret can be manually generated. Also, a known string can be run through mmencode or a similar program to generate base-64 encoded data. Copying the Shared Secret to Both Machines This is beyond the scope of DNS. A secure transport mechanism should be used. This could be secure FTP, ssh, telephone, etc. Informing the Servers of the Key's Existence Imagine host1 and host 2 are both servers. The following is added to each server's named.conf file: key host1-host2. { algorithm hmac-sha256; secret "La/E5CjG9O+os1jq0a2jdA=="; }; The secret is the one generated above. Since this is a secret, it is recommended that either named.conf be non-world readable, or the key directive be added to a non-world readable file that is included by named.conf. At this point, the key is recognized. This means that if the server receives a message signed by this key, it can verify the signature. If the signature is successfully verified, the response is signed by the same key. Instructing the Server to Use the Key Since keys are shared between two hosts only, the server must be told when keys are to be used. The following is added to the named.conf file for host1, if the IP address of host2 is 10.1.2.3: server 10.1.2.3 { keys { host1-host2. ;}; }; Multiple keys may be present, but only the first is used. This directive does not contain any secrets, so it may be in a world-readable file. If host1 sends a message that is a request to that address, the message will be signed with the specified key. host1 will expect any responses to signed messages to be signed with the same key. A similar statement must be present in host2's configuration file (with host1's address) for host2 to sign request messages to host1. TSIG Key Based Access Control BIND allows IP addresses and ranges to be specified in ACL definitions and allow-{ query | transfer | update } directives. This has been extended to allow TSIG keys also. The above key would be denoted key host1-host2. An example of an allow-update directive would be: allow-update { key host1-host2. ;}; This allows dynamic updates to succeed only if the request was signed by a key named "host1-host2.". See for a discussion of the more flexible update-policy statement. Errors The processing of TSIG signed messages can result in several errors. If a signed message is sent to a non-TSIG aware server, a FORMERR (format error) will be returned, since the server will not understand the record. This is a result of misconfiguration, since the server must be explicitly configured to send a TSIG signed message to a specific server. If a TSIG aware server receives a message signed by an unknown key, the response will be unsigned with the TSIG extended error code set to BADKEY. If a TSIG aware server receives a message with a signature that does not validate, the response will be unsigned with the TSIG extended error code set to BADSIG. If a TSIG aware server receives a message with a time outside of the allowed range, the response will be signed with the TSIG extended error code set to BADTIME, and the time values will be adjusted so that the response can be successfully verified. In any of these cases, the message's rcode (response code) is set to NOTAUTH (not authenticated). TKEY TKEY is a mechanism for automatically generating a shared secret between two hosts. There are several "modes" of TKEY that specify how the key is generated or assigned. BIND 9 implements only one of these modes, the Diffie-Hellman key exchange. Both hosts are required to have a Diffie-Hellman KEY record (although this record is not required to be present in a zone). The TKEY process must use signed messages, signed either by TSIG or SIG(0). The result of TKEY is a shared secret that can be used to sign messages with TSIG. TKEY can also be used to delete shared secrets that it had previously generated. The TKEY process is initiated by a client or server by sending a signed TKEY query (including any appropriate KEYs) to a TKEY-aware server. The server response, if it indicates success, will contain a TKEY record and any appropriate keys. After this exchange, both participants have enough information to determine the shared secret; the exact process depends on the TKEY mode. When using the Diffie-Hellman TKEY mode, Diffie-Hellman keys are exchanged, and the shared secret is derived by both participants. SIG(0) BIND 9 partially supports DNSSEC SIG(0) transaction signatures as specified in RFC 2535 and RFC 2931. SIG(0) uses public/private keys to authenticate messages. Access control is performed in the same manner as TSIG keys; privileges can be granted or denied based on the key name. When a SIG(0) signed message is received, it will only be verified if the key is known and trusted by the server; the server will not attempt to locate and/or validate the key. SIG(0) signing of multiple-message TCP streams is not supported. The only tool shipped with BIND 9 that generates SIG(0) signed messages is nsupdate. DNSSEC Cryptographic authentication of DNS information is possible through the DNS Security (DNSSEC-bis) extensions, defined in RFC 4033, RFC 4034, and RFC 4035. This section describes the creation and use of DNSSEC signed zones. In order to set up a DNSSEC secure zone, there are a series of steps which must be followed. BIND 9 ships with several tools that are used in this process, which are explained in more detail below. In all cases, the option prints a full list of parameters. Note that the DNSSEC tools require the keyset files to be in the working directory or the directory specified by the option, and that the tools shipped with BIND 9.2.x and earlier are not compatible with the current ones. There must also be communication with the administrators of the parent and/or child zone to transmit keys. A zone's security status must be indicated by the parent zone for a DNSSEC capable resolver to trust its data. This is done through the presence or absence of a DS record at the delegation point. For other servers to trust data in this zone, they must either be statically configured with this zone's zone key or the zone key of another zone above this one in the DNS tree. Generating Keys The dnssec-keygen program is used to generate keys. A secure zone must contain one or more zone keys. The zone keys will sign all other records in the zone, as well as the zone keys of any secure delegated zones. Zone keys must have the same name as the zone, a name type of ZONE, and must be usable for authentication. It is recommended that zone keys use a cryptographic algorithm designated as "mandatory to implement" by the IETF; currently the only one is RSASHA1. The following command will generate a 768-bit RSASHA1 key for the child.example zone: dnssec-keygen -a RSASHA1 -b 768 -n ZONE child.example. Two output files will be produced: Kchild.example.+005+12345.key and Kchild.example.+005+12345.private (where 12345 is an example of a key tag). The key filenames contain the key name (child.example.), algorithm (3 is DSA, 1 is RSAMD5, 5 is RSASHA1, etc.), and the key tag (12345 in this case). The private key (in the .private file) is used to generate signatures, and the public key (in the .key file) is used for signature verification. To generate another key with the same properties (but with a different key tag), repeat the above command. The dnssec-keyfromlabel program is used to get a key pair from a crypto hardware and build the key files. Its usage is similar to dnssec-keygen. The public keys should be inserted into the zone file by including the .key files using $INCLUDE statements. Signing the Zone The dnssec-signzone program is used to sign a zone. Any keyset files corresponding to secure subzones should be present. The zone signer will generate NSEC, NSEC3 and RRSIG records for the zone, as well as DS for the child zones if '-g' is specified. If '-g' is not specified, then DS RRsets for the secure child zones need to be added manually. The following command signs the zone, assuming it is in a file called zone.child.example. By default, all zone keys which have an available private key are used to generate signatures. dnssec-signzone -o child.example zone.child.example One output file is produced: zone.child.example.signed. This file should be referenced by named.conf as the input file for the zone. dnssec-signzone will also produce a keyset and dsset files and optionally a dlvset file. These are used to provide the parent zone administrators with the DNSKEYs (or their corresponding DS records) that are the secure entry point to the zone. Configuring Servers To enable named to respond appropriately to DNS requests from DNSSEC aware clients, dnssec-enable must be set to yes. (This is the default setting.) To enable named to validate answers from other servers, the dnssec-enable option must be set to yes, and the dnssec-validation options must be set to yes or auto. If dnssec-validation is set to auto, then a default trust anchor for the DNS root zone will be used. If it is set to yes, however, then at least one trust anchor must be configured with a trusted-keys or managed-keys statement in named.conf, or DNSSEC validation will not occur. The default setting is yes. trusted-keys are copies of DNSKEY RRs for zones that are used to form the first link in the cryptographic chain of trust. All keys listed in trusted-keys (and corresponding zones) are deemed to exist and only the listed keys will be used to validated the DNSKEY RRset that they are from. managed-keys are trusted keys which are automatically kept up to date via RFC 5011 trust anchor maintenance. trusted-keys and managed-keys are described in more detail later in this document. Unlike BIND 8, BIND 9 does not verify signatures on load, so zone keys for authoritative zones do not need to be specified in the configuration file. After DNSSEC gets established, a typical DNSSEC configuration will look something like the following. It has one or more public keys for the root. This allows answers from outside the organization to be validated. It will also have several keys for parts of the namespace the organization controls. These are here to ensure that named is immune to compromises in the DNSSEC components of the security of parent zones. managed-keys { /* Root Key */ "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy 4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp 5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq 66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ 97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ dgxbcDTClU0CRBdiieyLMNzXG3"; }; trusted-keys { /* Key for our organization's forward zone */ example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6 5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb 4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq FxmAVZP20igTixin/1LcrgX/KMEGd/biuv F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o 1OTQ09A0="; /* Key for our reverse zone. */ 2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc xOdNax071L18QqZnQQQAVVr+i LhGTnNGp3HoWQLUIzKrJVZ3zg gy3WwNT6kZo6c0tszYqbtvchm gQC8CzKojM/W16i6MG/eafGU3 siaOdS0yOI6BgPsw+YZdzlYMa IJGf4M4dyoKIhzdZyQ2bYQrjy Q4LB0lC7aOnsMyYKHHYeRvPxj IQXmdqgOJGq+vsevG06zW+1xg YJh9rCIfnm1GX/KMgxLPG2vXT D/RnLX+D3T3UL7HJYHJhAZD5L 59VvjSPsZJHeDCUyWYrvPZesZ DIRvhDD52SKvbheeTJUm6Ehkz ytNN2SN96QRk8j/iI8ib"; }; options { ... dnssec-enable yes; dnssec-validation yes; }; None of the keys listed in this example are valid. In particular, the root key is not valid. When DNSSEC validation is enabled and properly configured, the resolver will reject any answers from signed, secure zones which fail to validate, and will return SERVFAIL to the client. Responses may fail to validate for any of several reasons, including missing, expired, or invalid signatures, a key which does not match the DS RRset in the parent zone, or an insecure response from a zone which, according to its parent, should have been secure. When the validator receives a response from an unsigned zone that has a signed parent, it must confirm with the parent that the zone was intentionally left unsigned. It does this by verifying, via signed and validated NSEC/NSEC3 records, that the parent zone contains no DS records for the child. If the validator can prove that the zone is insecure, then the response is accepted. However, if it cannot, then it must assume an insecure response to be a forgery; it rejects the response and logs an error. The logged error reads "insecurity proof failed" and "got insecure response; parent indicates it should be secure". (Prior to BIND 9.7, the logged error was "not insecure". This referred to the zone, not the response.) IPv6 Support in <acronym>BIND</acronym> 9 BIND 9 fully supports all currently defined forms of IPv6 name to address and address to name lookups. It will also use IPv6 addresses to make queries when running on an IPv6 capable system. For forward lookups, BIND 9 supports only AAAA records. RFC 3363 deprecated the use of A6 records, and client-side support for A6 records was accordingly removed from BIND 9. However, authoritative BIND 9 name servers still load zone files containing A6 records correctly, answer queries for A6 records, and accept zone transfer for a zone containing A6 records. For IPv6 reverse lookups, BIND 9 supports the traditional "nibble" format used in the ip6.arpa domain, as well as the older, deprecated ip6.int domain. Older versions of BIND 9 supported the "binary label" (also known as "bitstring") format, but support of binary labels has been completely removed per RFC 3363. Many applications in BIND 9 do not understand the binary label format at all any more, and will return an error if given. In particular, an authoritative BIND 9 name server will not load a zone file containing binary labels. For an overview of the format and structure of IPv6 addresses, see . Address Lookups Using AAAA Records The IPv6 AAAA record is a parallel to the IPv4 A record, and, unlike the deprecated A6 record, specifies the entire IPv6 address in a single record. For example, $ORIGIN example.com. host 3600 IN AAAA 2001:db8::1 Use of IPv4-in-IPv6 mapped addresses is not recommended. If a host has an IPv4 address, use an A record, not a AAAA, with ::ffff:192.168.42.1 as the address. Address to Name Lookups Using Nibble Format When looking up an address in nibble format, the address components are simply reversed, just as in IPv4, and ip6.arpa. is appended to the resulting name. For example, the following would provide reverse name lookup for a host with address 2001:db8::1. $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR ( host.example.com. ) The <acronym>BIND</acronym> 9 Lightweight Resolver The Lightweight Resolver Library Traditionally applications have been linked with a stub resolver library that sends recursive DNS queries to a local caching name server. IPv6 once introduced new complexity into the resolution process, such as following A6 chains and DNAME records, and simultaneous lookup of IPv4 and IPv6 addresses. Though most of the complexity was then removed, these are hard or impossible to implement in a traditional stub resolver. BIND 9 therefore can also provide resolution services to local clients using a combination of a lightweight resolver library and a resolver daemon process running on the local host. These communicate using a simple UDP-based protocol, the "lightweight resolver protocol" that is distinct from and simpler than the full DNS protocol. Running a Resolver Daemon To use the lightweight resolver interface, the system must run the resolver daemon lwresd or a local name server configured with a lwres statement. By default, applications using the lightweight resolver library will make UDP requests to the IPv4 loopback address (127.0.0.1) on port 921. The address can be overridden by lwserver lines in /etc/resolv.conf. The daemon currently only looks in the DNS, but in the future it may use other sources such as /etc/hosts, NIS, etc. The lwresd daemon is essentially a caching-only name server that responds to requests using the lightweight resolver protocol rather than the DNS protocol. Because it needs to run on each host, it is designed to require no or minimal configuration. Unless configured otherwise, it uses the name servers listed on nameserver lines in /etc/resolv.conf as forwarders, but is also capable of doing the resolution autonomously if none are specified. The lwresd daemon may also be configured with a named.conf style configuration file, in /etc/lwresd.conf by default. A name server may also be configured to act as a lightweight resolver daemon using the lwres statement in named.conf. <acronym>BIND</acronym> 9 Configuration Reference BIND 9 configuration is broadly similar to BIND 8; however, there are a few new areas of configuration, such as views. BIND 8 configuration files should work with few alterations in BIND 9, although more complex configurations should be reviewed to check if they can be more efficiently implemented using the new features found in BIND 9. BIND 4 configuration files can be converted to the new format using the shell script contrib/named-bootconf/named-bootconf.sh. Configuration File Elements Following is a list of elements used throughout the BIND configuration file documentation: acl_name The name of an address_match_list as defined by the acl statement. address_match_list A list of one or more ip_addr, ip_prefix, key_id, or acl_name elements, see . masters_list A named list of one or more ip_addr with optional key_id and/or ip_port. A masters_list may include other masters_lists. domain_name A quoted string which will be used as a DNS name, for example "my.test.domain". namelist A list of one or more domain_name elements. dotted_decimal One to four integers valued 0 through 255 separated by dots (`.'), such as 123, 45.67 or 89.123.45.67. ip4_addr An IPv4 address with exactly four elements in dotted_decimal notation. ip6_addr An IPv6 address, such as 2001:db8::1234. IPv6 scoped addresses that have ambiguity on their scope zones must be disambiguated by an appropriate zone ID with the percent character (`%') as delimiter. It is strongly recommended to use string zone names rather than numeric identifiers, in order to be robust against system configuration changes. However, since there is no standard mapping for such names and identifier values, currently only interface names as link identifiers are supported, assuming one-to-one mapping between interfaces and links. For example, a link-local address fe80::1 on the link attached to the interface ne0 can be specified as fe80::1%ne0. Note that on most systems link-local addresses always have the ambiguity, and need to be disambiguated. ip_addr An ip4_addr or ip6_addr. ip_port An IP port number. The number is limited to 0 through 65535, with values below 1024 typically restricted to use by processes running as root. In some cases, an asterisk (`*') character can be used as a placeholder to select a random high-numbered port. ip_prefix An IP network specified as an ip_addr, followed by a slash (`/') and then the number of bits in the netmask. Trailing zeros in a ip_addr may omitted. For example, 127/8 is the network 127.0.0.0 with netmask 255.0.0.0 and 1.2.3.0/28 is network 1.2.3.0 with netmask 255.255.255.240. When specifying a prefix involving a IPv6 scoped address the scope may be omitted. In that case the prefix will match packets from any scope. key_id A domain_name representing the name of a shared key, to be used for transaction security. key_list A list of one or more key_ids, separated by semicolons and ending with a semicolon. number A non-negative 32-bit integer (i.e., a number between 0 and 4294967295, inclusive). Its acceptable value might further be limited by the context in which it is used. path_name A quoted string which will be used as a pathname, such as zones/master/my.test.domain. port_list A list of an ip_port or a port range. A port range is specified in the form of range followed by two ip_ports, port_low and port_high, which represents port numbers from port_low through port_high, inclusive. port_low must not be larger than port_high. For example, range 1024 65535 represents ports from 1024 through 65535. In either case an asterisk (`*') character is not allowed as a valid ip_port. size_spec A 64-bit unsigned integer, or the keywords unlimited or default. Integers may take values 0 <= value <= 18446744073709551615, though certain parameters may use a more limited range within these extremes. In most cases, setting a value to 0 does not literally mean zero; it means "undefined" or "as big as psosible", depending on the context. See the expalantions of particular parameters that use size_spec for details on how they interpret its use. Numeric values can optionally be followed by a scaling factor: K or k for kilobytes, M or m for megabytes, and G or g for gigabytes, which scale by 1024, 1024*1024, and 1024*1024*1024 respectively. unlimited generally means "as big as possible", though in certain contexts, (including ), it may mean the largest possible 32-bit unsigned integer (0xffffffff); this distinction can be important when dealing with larger quantities. unlimited is usually the best way to safely set a very large number. default uses the limit that was in force when the server was started. yes_or_no Either yes or no. The words true and false are also accepted, as are the numbers 1 and 0. dialup_option One of yes, no, notify, notify-passive, refresh or passive. When used in a zone, notify-passive, refresh, and passive are restricted to slave and stub zones. Address Match Lists Syntax address_match_list = address_match_list_element ; address_match_list_element; ... address_match_list_element = ! (ip_address /length | key key_id | acl_name | { address_match_list } ) Definition and Usage Address match lists are primarily used to determine access control for various server operations. They are also used in the listen-on and sortlist statements. The elements which constitute an address match list can be any of the following: an IP address (IPv4 or IPv6) an IP prefix (in `/' notation) a key ID, as defined by the key statement the name of an address match list defined with the acl statement a nested address match list enclosed in braces Elements can be negated with a leading exclamation mark (`!'), and the match list names "any", "none", "localhost", and "localnets" are predefined. More information on those names can be found in the description of the acl statement. The addition of the key clause made the name of this syntactic element something of a misnomer, since security keys can be used to validate access without regard to a host or network address. Nonetheless, the term "address match list" is still used throughout the documentation. When a given IP address or prefix is compared to an address match list, the comparison takes place in approximately O(1) time. However, key comparisons require that the list of keys be traversed until a matching key is found, and therefore may be somewhat slower. The interpretation of a match depends on whether the list is being used for access control, defining listen-on ports, or in a sortlist, and whether the element was negated. When used as an access control list, a non-negated match allows access and a negated match denies access. If there is no match, access is denied. The clauses allow-notify, allow-recursion, allow-recursion-on, allow-query, allow-query-on, allow-query-cache, allow-query-cache-on, allow-transfer, allow-update, allow-update-forwarding, and blackhole all use address match lists. Similarly, the listen-on option will cause the server to refuse queries on any of the machine's addresses which do not match the list. Order of insertion is significant. If more than one element in an ACL is found to match a given IP address or prefix, preference will be given to the one that came first in the ACL definition. Because of this first-match behavior, an element that defines a subset of another element in the list should come before the broader element, regardless of whether either is negated. For example, in 1.2.3/24; ! 1.2.3.13; the 1.2.3.13 element is completely useless because the algorithm will match any lookup for 1.2.3.13 to the 1.2.3/24 element. Using ! 1.2.3.13; 1.2.3/24 fixes that problem by having 1.2.3.13 blocked by the negation, but all other 1.2.3.* hosts fall through. Comment Syntax The BIND 9 comment syntax allows for comments to appear anywhere that whitespace may appear in a BIND configuration file. To appeal to programmers of all kinds, they can be written in the C, C++, or shell/perl style. Syntax /* This is a BIND comment as in C */ // This is a BIND comment as in C++ # This is a BIND comment as in common UNIX shells # and perl Definition and Usage Comments may appear anywhere that whitespace may appear in a BIND configuration file. C-style comments start with the two characters /* (slash, star) and end with */ (star, slash). Because they are completely delimited with these characters, they can be used to comment only a portion of a line or to span multiple lines. C-style comments cannot be nested. For example, the following is not valid because the entire comment ends with the first */: /* This is the start of a comment. This is still part of the comment. /* This is an incorrect attempt at nesting a comment. */ This is no longer in any comment. */ C++-style comments start with the two characters // (slash, slash) and continue to the end of the physical line. They cannot be continued across multiple physical lines; to have one logical comment span multiple lines, each line must use the // pair. For example: // This is the start of a comment. The next line // is a new comment, even though it is logically // part of the previous comment. Shell-style (or perl-style, if you prefer) comments start with the character # (number sign) and continue to the end of the physical line, as in C++ comments. For example: # This is the start of a comment. The next line # is a new comment, even though it is logically # part of the previous comment. You cannot use the semicolon (`;') character to start a comment such as you would in a zone file. The semicolon indicates the end of a configuration statement. Configuration File Grammar A BIND 9 configuration consists of statements and comments. Statements end with a semicolon. Statements and comments are the only elements that can appear without enclosing braces. Many statements contain a block of sub-statements, which are also terminated with a semicolon. The following statements are supported: acl defines a named IP address matching list, for access control and other uses. controls declares control channels to be used by the rndc utility. include includes a file. key specifies key information for use in authentication and authorization using TSIG. logging specifies what the server logs, and where the log messages are sent. lwres configures named to also act as a light-weight resolver daemon (lwresd). masters defines a named masters list for inclusion in stub and slave zones' masters or also-notify lists. options controls global server configuration options and sets defaults for other statements. server sets certain configuration options on a per-server basis. statistics-channels declares communication channels to get access to named statistics. trusted-keys defines trusted DNSSEC keys. managed-keys lists DNSSEC keys to be kept up to date using RFC 5011 trust anchor maintenance. view defines a view. zone defines a zone. The logging and options statements may only occur once per configuration. <command>acl</command> Statement Grammar acl acl-name { address_match_list }; <command>acl</command> Statement Definition and Usage The acl statement assigns a symbolic name to an address match list. It gets its name from a primary use of address match lists: Access Control Lists (ACLs). Note that an address match list's name must be defined with acl before it can be used elsewhere; no forward references are allowed. The following ACLs are built-in: any Matches all hosts. none Matches no hosts. localhost Matches the IPv4 and IPv6 addresses of all network interfaces on the system. localnets Matches any host on an IPv4 or IPv6 network for which the system has an interface. Some systems do not provide a way to determine the prefix lengths of local IPv6 addresses. In such a case, localnets only matches the local IPv6 addresses, just like localhost. <command>controls</command> Statement Grammar controls { [ inet ( ip_addr | * ) [ port ip_port ] allow { address_match_list } keys { key_list }; ] [ inet ...; ] [ unix path perm number owner number group number keys { key_list }; ] [ unix ...; ] }; <command>controls</command> Statement Definition and Usage The controls statement declares control channels to be used by system administrators to control the operation of the name server. These control channels are used by the rndc utility to send commands to and retrieve non-DNS results from a name server. An inet control channel is a TCP socket listening at the specified ip_port on the specified ip_addr, which can be an IPv4 or IPv6 address. An ip_addr of * (asterisk) is interpreted as the IPv4 wildcard address; connections will be accepted on any of the system's IPv4 addresses. To listen on the IPv6 wildcard address, use an ip_addr of ::. If you will only use rndc on the local host, using the loopback address (127.0.0.1 or ::1) is recommended for maximum security. If no port is specified, port 953 is used. The asterisk "*" cannot be used for ip_port. The ability to issue commands over the control channel is restricted by the allow and keys clauses. Connections to the control channel are permitted based on the address_match_list. This is for simple IP address based filtering only; any key_id elements of the address_match_list are ignored. A unix control channel is a UNIX domain socket listening at the specified path in the file system. Access to the socket is specified by the perm, owner and group clauses. Note on some platforms (SunOS and Solaris) the permissions (perm) are applied to the parent directory as the permissions on the socket itself are ignored. The primary authorization mechanism of the command channel is the key_list, which contains a list of key_ids. Each key_id in the key_list is authorized to execute commands over the control channel. See in ) for information about configuring keys in rndc. If no controls statement is present, named will set up a default control channel listening on the loopback address 127.0.0.1 and its IPv6 counterpart ::1. In this case, and also when the controls statement is present but does not have a keys clause, named will attempt to load the command channel key from the file rndc.key in /etc (or whatever sysconfdir was specified as when BIND was built). To create a rndc.key file, run rndc-confgen -a. The rndc.key feature was created to ease the transition of systems from BIND 8, which did not have digital signatures on its command channel messages and thus did not have a keys clause. It makes it possible to use an existing BIND 8 configuration file in BIND 9 unchanged, and still have rndc work the same way ndc worked in BIND 8, simply by executing the command rndc-confgen -a after BIND 9 is installed. Since the rndc.key feature is only intended to allow the backward-compatible usage of BIND 8 configuration files, this feature does not have a high degree of configurability. You cannot easily change the key name or the size of the secret, so you should make a rndc.conf with your own key if you wish to change those things. The rndc.key file also has its permissions set such that only the owner of the file (the user that named is running as) can access it. If you desire greater flexibility in allowing other users to access rndc commands, then you need to create a rndc.conf file and make it group readable by a group that contains the users who should have access. To disable the command channel, use an empty controls statement: controls { };. <command>include</command> Statement Grammar include filename; <command>include</command> Statement Definition and Usage The include statement inserts the specified file at the point where the include statement is encountered. The include statement facilitates the administration of configuration files by permitting the reading or writing of some things but not others. For example, the statement could include private keys that are readable only by the name server. <command>key</command> Statement Grammar key key_id { algorithm string; secret string; }; <command>key</command> Statement Definition and Usage The key statement defines a shared secret key for use with TSIG (see ) or the command channel (see ). The key statement can occur at the top level of the configuration file or inside a view statement. Keys defined in top-level key statements can be used in all views. Keys intended for use in a controls statement (see ) must be defined at the top level. The key_id, also known as the key name, is a domain name uniquely identifying the key. It can be used in a server statement to cause requests sent to that server to be signed with this key, or in address match lists to verify that incoming requests have been signed with a key matching this name, algorithm, and secret. The algorithm_id is a string that specifies a security/authentication algorithm. Named supports hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512 TSIG authentication. Truncated hashes are supported by appending the minimum number of required bits preceded by a dash, e.g. hmac-sha1-80. The secret_string is the secret to be used by the algorithm, and is treated as a base-64 encoded string. <command>logging</command> Statement Grammar logging { [ channel channel_name { ( file path_name [ versions ( number | unlimited ) ] [ size size_spec ] | syslog syslog_facility | stderr | null ); [ severity ( | | | | | [ level ] | ); ] [ print-category or ; ] [ print-severity or ; ] [ print-time or ; ] }; ] [ category category_name { channel_name ; [ channel_name ; ... ] }; ] ... }; <command>logging</command> Statement Definition and Usage The logging statement configures a wide variety of logging options for the name server. Its channel phrase associates output methods, format options and severity levels with a name that can then be used with the category phrase to select how various classes of messages are logged. Only one logging statement is used to define as many channels and categories as are wanted. If there is no logging statement, the logging configuration will be: logging { category default { default_syslog; default_debug; }; category unmatched { null; }; }; In BIND 9, the logging configuration is only established when the entire configuration file has been parsed. In BIND 8, it was established as soon as the logging statement was parsed. When the server is starting up, all logging messages regarding syntax errors in the configuration file go to the default channels, or to standard error if the "" option was specified. The <command>channel</command> Phrase All log output goes to one or more channels; you can make as many of them as you want. Every channel definition must include a destination clause that says whether messages selected for the channel go to a file, to a particular syslog facility, to the standard error stream, or are discarded. It can optionally also limit the message severity level that will be accepted by the channel (the default is info), and whether to include a named-generated time stamp, the category name and/or severity level (the default is not to include any). The null destination clause causes all messages sent to the channel to be discarded; in that case, other options for the channel are meaningless. The file destination clause directs the channel to a disk file. It can include limitations both on how large the file is allowed to become, and how many versions of the file will be saved each time the file is opened. If you use the versions log file option, then named will retain that many backup versions of the file by renaming them when opening. For example, if you choose to keep three old versions of the file lamers.log, then just before it is opened lamers.log.1 is renamed to lamers.log.2, lamers.log.0 is renamed to lamers.log.1, and lamers.log is renamed to lamers.log.0. You can say versions unlimited to not limit the number of versions. If a size option is associated with the log file, then renaming is only done when the file being opened exceeds the indicated size. No backup versions are kept by default; any existing log file is simply appended. The size option for files is used to limit log growth. If the file ever exceeds the size, then named will stop writing to the file unless it has a versions option associated with it. If backup versions are kept, the files are rolled as described above and a new one begun. If there is no versions option, no more data will be written to the log until some out-of-band mechanism removes or truncates the log to less than the maximum size. The default behavior is not to limit the size of the file. Example usage of the size and versions options: channel an_example_channel { file "example.log" versions 3 size 20m; print-time yes; print-category yes; }; The syslog destination clause directs the channel to the system log. Its argument is a syslog facility as described in the syslog man page. Known facilities are kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0, local1, local2, local3, local4, local5, local6 and local7, however not all facilities are supported on all operating systems. How syslog will handle messages sent to this facility is described in the syslog.conf man page. If you have a system which uses a very old version of syslog that only uses two arguments to the openlog() function, then this clause is silently ignored. On Windows machines syslog messages are directed to the EventViewer. The severity clause works like syslog's "priorities", except that they can also be used if you are writing straight to a file rather than using syslog. Messages which are not at least of the severity level given will not be selected for the channel; messages of higher severity levels will be accepted. If you are using syslog, then the syslog.conf priorities will also determine what eventually passes through. For example, defining a channel facility and severity as daemon and debug but only logging daemon.warning via syslog.conf will cause messages of severity info and notice to be dropped. If the situation were reversed, with named writing messages of only warning or higher, then syslogd would print all messages it received from the channel. The stderr destination clause directs the channel to the server's standard error stream. This is intended for use when the server is running as a foreground process, for example when debugging a configuration. The server can supply extensive debugging information when it is in debugging mode. If the server's global debug level is greater than zero, then debugging mode will be active. The global debug level is set either by starting the named server with the flag followed by a positive integer, or by running rndc trace. The global debug level can be set to zero, and debugging mode turned off, by running rndc notrace. All debugging messages in the server have a debug level, and higher debug levels give more detailed output. Channels that specify a specific debug severity, for example: channel specific_debug_level { file "foo"; severity debug 3; }; will get debugging output of level 3 or less any time the server is in debugging mode, regardless of the global debugging level. Channels with dynamic severity use the server's global debug level to determine what messages to print. If print-time has been turned on, then the date and time will be logged. print-time may be specified for a syslog channel, but is usually pointless since syslog also logs the date and time. If print-category is requested, then the category of the message will be logged as well. Finally, if print-severity is on, then the severity level of the message will be logged. The print- options may be used in any combination, and will always be printed in the following order: time, category, severity. Here is an example where all three print- options are on: 28-Feb-2000 15:05:32.863 general: notice: running There are four predefined channels that are used for named's default logging as follows. How they are used is described in . channel default_syslog { // send to syslog's daemon facility syslog daemon; // only send priority info and higher severity info; channel default_debug { // write to named.run in the working directory // Note: stderr is used instead of "named.run" if // the server is started with the '-f' option. file "named.run"; // log at the server's current debug level severity dynamic; }; channel default_stderr { // writes to stderr stderr; // only send priority info and higher severity info; }; channel null { // toss anything sent to this channel null; }; The default_debug channel has the special property that it only produces output when the server's debug level is nonzero. It normally writes to a file called named.run in the server's working directory. For security reasons, when the "" command line option is used, the named.run file is created only after named has changed to the new UID, and any debug output generated while named is starting up and still running as root is discarded. If you need to capture this output, you must run the server with the "" option and redirect standard error to a file. Once a channel is defined, it cannot be redefined. Thus you cannot alter the built-in channels directly, but you can modify the default logging by pointing categories at channels you have defined. The <command>category</command> Phrase There are many categories, so you can send the logs you want to see wherever you want, without seeing logs you don't want. If you don't specify a list of channels for a category, then log messages in that category will be sent to the default category instead. If you don't specify a default category, the following "default default" is used: category default { default_syslog; default_debug; }; As an example, let's say you want to log security events to a file, but you also want keep the default logging behavior. You'd specify the following: channel my_security_channel { file "my_security_file"; severity info; }; category security { my_security_channel; default_syslog; default_debug; }; To discard all messages in a category, specify the null channel: category xfer-out { null; }; category notify { null; }; Following are the available categories and brief descriptions of the types of log information they contain. More categories may be added in future BIND releases. default The default category defines the logging options for those categories where no specific configuration has been defined. general The catch-all. Many things still aren't classified into categories, and they all end up here. database Messages relating to the databases used internally by the name server to store zone and cache data. security Approval and denial of requests. config Configuration file parsing and processing. resolver DNS resolution, such as the recursive lookups performed on behalf of clients by a caching name server. xfer-in Zone transfers the server is receiving. xfer-out Zone transfers the server is sending. notify The NOTIFY protocol. client Processing of client requests. unmatched Messages that named was unable to determine the class of or for which there was no matching view. A one line summary is also logged to the client category. This category is best sent to a file or stderr, by default it is sent to the null channel. network Network operations. update Dynamic updates. update-security Approval and denial of update requests. queries Specify where queries should be logged to. At startup, specifying the category queries will also enable query logging unless querylog option has been specified. The query log entry reports the client's IP address and port number, and the query name, class and type. Next it reports whether the Recursion Desired flag was set (+ if set, - if not set), if the query was signed (S), EDNS was in use (E), if TCP was used (T), if DO (DNSSEC Ok) was set (D), or if CD (Checking Disabled) was set (C). After this the destination address the query was sent to is reported. client 127.0.0.1#62536 (www.example.com): query: www.example.com IN AAAA +SE client ::1#62537 (www.example.net): query: www.example.net IN AAAA -SE (The first part of this log message, showing the client address/port number and query name, is repeated in all subsequent log messages related to the same query.) query-errors Information about queries that resulted in some failure. dispatch Dispatching of incoming packets to the server modules where they are to be processed. dnssec DNSSEC and TSIG protocol processing. lame-servers Lame servers. These are misconfigurations in remote servers, discovered by BIND 9 when trying to query those servers during resolution. delegation-only Delegation only. Logs queries that have been forced to NXDOMAIN as the result of a delegation-only zone or a delegation-only in a hint or stub zone declaration. edns-disabled Log queries that have been forced to use plain DNS due to timeouts. This is often due to the remote servers not being RFC 1034 compliant (not always returning FORMERR or similar to EDNS queries and other extensions to the DNS when they are not understood). In other words, this is targeted at servers that fail to respond to DNS queries that they don't understand. Note: the log message can also be due to packet loss. Before reporting servers for non-RFC 1034 compliance they should be re-tested to determine the nature of the non-compliance. This testing should prevent or reduce the number of false-positive reports. Note: eventually named will have to stop treating such timeouts as due to RFC 1034 non compliance and start treating it as plain packet loss. Falsely classifying packet loss as due to RFC 1034 non compliance impacts on DNSSEC validation which requires EDNS for the DNSSEC records to be returned. RPZ Information about errors in response policy zone files, rewritten responses, and at the highest debug levels, mere rewriting attempts. rate-limit (Only available when BIND 9 is configured with the --enable-rrl option at compile time.) The start, periodic, and final notices of the rate limiting of a stream of responses are logged at info severity in this category. These messages include a hash value of the domain name of the response and the name itself, except when there is insufficient memory to record the name for the final notice The final notice is normally delayed until about one minute after rate limit stops. A lack of memory can hurry the final notice, in which case it starts with an asterisk (*). Various internal events are logged at debug 1 level and higher. Rate limiting of individual requests is logged in the query-errors category. The <command>query-errors</command> Category The query-errors category is specifically intended for debugging purposes: To identify why and how specific queries result in responses which indicate an error. Messages of this category are therefore only logged with debug levels. At the debug levels of 1 or higher, each response with the rcode of SERVFAIL is logged as follows: client 127.0.0.1#61502: query failed (SERVFAIL) for www.example.com/IN/AAAA at query.c:3880 This means an error resulting in SERVFAIL was detected at line 3880 of source file query.c. Log messages of this level will particularly help identify the cause of SERVFAIL for an authoritative server. At the debug levels of 2 or higher, detailed context information of recursive resolutions that resulted in SERVFAIL is logged. The log message will look like as follows: fetch completed at resolver.c:2970 for www.example.com/A in 30.000183: timed out/success [domain:example.com, referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0, badresp:1,adberr:0,findfail:0,valfail:0] The first part before the colon shows that a recursive resolution for AAAA records of www.example.com completed in 30.000183 seconds and the final result that led to the SERVFAIL was determined at line 2970 of source file resolver.c. The following part shows the detected final result and the latest result of DNSSEC validation. The latter is always success when no validation attempt is made. In this example, this query resulted in SERVFAIL probably because all name servers are down or unreachable, leading to a timeout in 30 seconds. DNSSEC validation was probably not attempted. The last part enclosed in square brackets shows statistics information collected for this particular resolution attempt. The domain field shows the deepest zone that the resolver reached; it is the zone where the error was finally detected. The meaning of the other fields is summarized in the following table. referral The number of referrals the resolver received throughout the resolution process. In the above example this is 2, which are most likely com and example.com. restart The number of cycles that the resolver tried remote servers at the domain zone. In each cycle the resolver sends one query (possibly resending it, depending on the response) to each known name server of the domain zone. qrysent The number of queries the resolver sent at the domain zone. timeout The number of timeouts since the resolver received the last response. lame The number of lame servers the resolver detected at the domain zone. A server is detected to be lame either by an invalid response or as a result of lookup in BIND9's address database (ADB), where lame servers are cached. neterr The number of erroneous results that the resolver encountered in sending queries at the domain zone. One common case is the remote server is unreachable and the resolver receives an ICMP unreachable error message. badresp The number of unexpected responses (other than lame) to queries sent by the resolver at the domain zone. adberr Failures in finding remote server addresses of the domain zone in the ADB. One common case of this is that the remote server's name does not have any address records. findfail Failures of resolving remote server addresses. This is a total number of failures throughout the resolution process. valfail Failures of DNSSEC validation. Validation failures are counted throughout the resolution process (not limited to the domain zone), but should only happen in domain. At the debug levels of 3 or higher, the same messages as those at the debug 1 level are logged for other errors than SERVFAIL. Note that negative responses such as NXDOMAIN are not regarded as errors here. At the debug levels of 4 or higher, the same messages as those at the debug 2 level are logged for other errors than SERVFAIL. Unlike the above case of level 3, messages are logged for negative responses. This is because any unexpected results can be difficult to debug in the recursion case. <command>lwres</command> Statement Grammar This is the grammar of the lwres statement in the named.conf file: lwres { listen-on { ip_addr port ip_port ; ip_addr port ip_port ; ... }; view view_name; search { domain_name ; domain_name ; ... }; ndots number; }; <command>lwres</command> Statement Definition and Usage The lwres statement configures the name server to also act as a lightweight resolver server. (See .) There may be multiple lwres statements configuring lightweight resolver servers with different properties. The listen-on statement specifies a list of addresses (and ports) that this instance of a lightweight resolver daemon should accept requests on. If no port is specified, port 921 is used. If this statement is omitted, requests will be accepted on 127.0.0.1, port 921. The view statement binds this instance of a lightweight resolver daemon to a view in the DNS namespace, so that the response will be constructed in the same manner as a normal DNS query matching this view. If this statement is omitted, the default view is used, and if there is no default view, an error is triggered. The search statement is equivalent to the search statement in /etc/resolv.conf. It provides a list of domains which are appended to relative names in queries. The ndots statement is equivalent to the ndots statement in /etc/resolv.conf. It indicates the minimum number of dots in a relative domain name that should result in an exact match lookup before search path elements are appended. <command>masters</command> Statement Grammar masters name port ip_port { ( masters_list | ip_addr port ip_port key key ) ; ... }; <command>masters</command> Statement Definition and Usage masters lists allow for a common set of masters to be easily used by multiple stub and slave zones in their masters or also-notify lists. <command>options</command> Statement Grammar This is the grammar of the options statement in the named.conf file: options { attach-cache cache_name; version version_string; hostname hostname_string; server-id server_id_string; directory path_name; key-directory path_name; managed-keys-directory path_name; named-xfer path_name; tkey-gssapi-keytab path_name; tkey-gssapi-credential principal; tkey-domain domainname; tkey-dhkey key_name key_tag; cache-file path_name; dump-file path_name; bindkeys-file path_name; secroots-file path_name; session-keyfile path_name; session-keyname key_name; session-keyalg algorithm_id; memstatistics yes_or_no; memstatistics-file path_name; pid-file path_name; recursing-file path_name; statistics-file path_name; zone-statistics full | terse | none; auth-nxdomain yes_or_no; deallocate-on-exit yes_or_no; dialup dialup_option; fake-iquery yes_or_no; fetch-glue yes_or_no; flush-zones-on-shutdown yes_or_no; has-old-clients yes_or_no; host-statistics yes_or_no; host-statistics-max number; minimal-responses yes_or_no; multiple-cnames yes_or_no; notify yes_or_no | explicit | master-only; recursion yes_or_no; request-nsid yes_or_no; rfc2308-type1 yes_or_no; use-id-pool yes_or_no; maintain-ixfr-base yes_or_no; ixfr-from-differences (yes_or_no | master | slave); dnssec-enable yes_or_no; dnssec-validation (yes_or_no | auto); dnssec-lookaside ( auto | no | domain trust-anchor domain ); dnssec-must-be-secure domain yes_or_no; dnssec-accept-expired yes_or_no; forward ( only | first ); forwarders { ip_addr port ip_port ; ... }; dual-stack-servers port ip_port { ( domain_name port ip_port | ip_addr port ip_port ) ; ... }; check-names ( master | slave | response ) ( warn | fail | ignore ); check-dup-records ( warn | fail | ignore ); check-mx ( warn | fail | ignore ); check-wildcard yes_or_no; check-integrity yes_or_no; check-mx-cname ( warn | fail | ignore ); check-srv-cname ( warn | fail | ignore ); check-sibling yes_or_no; check-spf ( warn | fail | ignore ); allow-new-zones { yes_or_no }; allow-notify { address_match_list }; allow-query { address_match_list }; allow-query-on { address_match_list }; allow-query-cache { address_match_list }; allow-query-cache-on { address_match_list }; allow-transfer { address_match_list }; allow-recursion { address_match_list }; allow-recursion-on { address_match_list }; allow-update { address_match_list }; allow-update-forwarding { address_match_list }; update-check-ksk yes_or_no; dnssec-update-mode ( maintain | no-resign ); dnssec-dnskey-kskonly yes_or_no; dnssec-loadkeys-interval number; dnssec-secure-to-insecure yes_or_no ; try-tcp-refresh yes_or_no; allow-v6-synthesis { address_match_list }; blackhole { address_match_list }; use-v4-udp-ports { port_list }; avoid-v4-udp-ports { port_list }; use-v6-udp-ports { port_list }; avoid-v6-udp-ports { port_list }; listen-on port ip_port { address_match_list }; listen-on-v6 port ip_port { address_match_list }; query-source ( ( ip4_addr | * ) port ( ip_port | * ) | address ( ip4_addr | * ) port ( ip_port | * ) ) ; query-source-v6 ( ( ip6_addr | * ) port ( ip_port | * ) | address ( ip6_addr | * ) port ( ip_port | * ) ) ; use-queryport-pool yes_or_no; queryport-pool-ports number; queryport-pool-updateinterval number; max-transfer-time-in number; max-transfer-time-out number; max-transfer-idle-in number; max-transfer-idle-out number; tcp-clients number; reserved-sockets number; recursive-clients number; serial-query-rate number; serial-queries number; tcp-listen-queue number; transfer-format ( one-answer | many-answers ); transfers-in number; transfers-out number; transfers-per-ns number; transfer-source (ip4_addr | *) port ip_port ; transfer-source-v6 (ip6_addr | *) port ip_port ; alt-transfer-source (ip4_addr | *) port ip_port ; alt-transfer-source-v6 (ip6_addr | *) port ip_port ; use-alt-transfer-source yes_or_no; notify-delay seconds ; notify-source (ip4_addr | *) port ip_port ; notify-source-v6 (ip6_addr | *) port ip_port ; notify-to-soa yes_or_no ; also-notify { ip_addr port ip_port key keyname ; ip_addr port ip_port key keyname ; ... }; max-ixfr-log-size number; max-journal-size size_spec; coresize size_spec ; datasize size_spec ; files size_spec ; stacksize size_spec ; cleaning-interval number; heartbeat-interval number; interface-interval number; statistics-interval number; topology { address_match_list }; sortlist { address_match_list }; rrset-order { order_spec ; order_spec ; ... }; lame-ttl number; max-ncache-ttl number; max-cache-ttl number; sig-validity-interval number number ; sig-signing-nodes number ; sig-signing-signatures number ; sig-signing-type number ; min-roots number; use-ixfr yes_or_no ; provide-ixfr yes_or_no; request-ixfr yes_or_no; treat-cr-as-space yes_or_no ; min-refresh-time number ; max-refresh-time number ; min-retry-time number ; max-retry-time number ; port ip_port; additional-from-auth yes_or_no ; additional-from-cache yes_or_no ; random-device path_name ; max-cache-size size_spec ; match-mapped-addresses yes_or_no; filter-aaaa-on-v4 ( yes_or_no | break-dnssec ); filter-aaaa { address_match_list }; dns64 ipv6-prefix { clients { address_match_list }; mapped { address_match_list }; exclude { address_match_list }; suffix IPv6-address; recursive-only yes_or_no; break-dnssec yes_or_no; }; ; dns64-server name dns64-contact name preferred-glue ( A | AAAA | NONE ); edns-udp-size number; max-udp-size number; max-rsa-exponent-size number; root-delegation-only exclude { namelist } ; querylog yes_or_no ; disable-algorithms domain { algorithm; algorithm; }; acache-enable yes_or_no ; acache-cleaning-interval number; max-acache-size size_spec ; clients-per-query number ; max-clients-per-query number ; masterfile-format (text|raw) ; empty-server name ; empty-contact name ; empty-zones-enable yes_or_no ; disable-empty-zone zone_name ; zero-no-soa-ttl yes_or_no ; zero-no-soa-ttl-cache yes_or_no ; resolver-query-timeout number ; deny-answer-addresses { address_match_list } except-from { namelist } ; deny-answer-aliases { namelist } except-from { namelist } ; rate-limit { responses-per-second number ; referrals-per-second number ; nodata-per-second number ; nxdomains-per-second number ; errors-per-second number ; all-per-second number ; window number ; log-only yes_or_no ; qps-scale number ; ipv4-prefix-length number ; ipv6-prefix-length number ; slip number ; exempt-clients { address_match_list } ; max-table-size number ; min-table-size number ; } ; response-policy { zone_name policy given | disabled | passthru | nxdomain | nodata | cname domain recursive-only yes_or_no max-policy-ttl number ; } recursive-only yes_or_no max-policy-ttl number break-dnssec yes_or_no min-ns-dots number ; }; <command>options</command> Statement Definition and Usage The options statement sets up global options to be used by BIND. This statement may appear only once in a configuration file. If there is no options statement, an options block with each option set to its default will be used. attach-cache Allows multiple views to share a single cache database. Each view has its own cache database by default, but if multiple views have the same operational policy for name resolution and caching, those views can share a single cache to save memory and possibly improve resolution efficiency by using this option. The attach-cache option may also be specified in view statements, in which case it overrides the global attach-cache option. The cache_name specifies the cache to be shared. When the named server configures views which are supposed to share a cache, it creates a cache with the specified name for the first view of these sharing views. The rest of the views will simply refer to the already created cache. One common configuration to share a cache would be to allow all views to share a single cache. This can be done by specifying the attach-cache as a global option with an arbitrary name. Another possible operation is to allow a subset of all views to share a cache while the others to retain their own caches. For example, if there are three views A, B, and C, and only A and B should share a cache, specify the attach-cache option as a view A (or B)'s option, referring to the other view name: view "A" { // this view has its own cache ... }; view "B" { // this view refers to A's cache attach-cache "A"; }; view "C" { // this view has its own cache ... }; Views that share a cache must have the same policy on configurable parameters that may affect caching. The current implementation requires the following configurable options be consistent among these views: check-names, cleaning-interval, dnssec-accept-expired, dnssec-validation, max-cache-ttl, max-ncache-ttl, max-cache-size, and zero-no-soa-ttl. Note that there may be other parameters that may cause confusion if they are inconsistent for different views that share a single cache. For example, if these views define different sets of forwarders that can return different answers for the same question, sharing the answer does not make sense or could even be harmful. It is administrator's responsibility to ensure configuration differences in different views do not cause disruption with a shared cache. directory The working directory of the server. Any non-absolute pathnames in the configuration file will be taken as relative to this directory. The default location for most server output files (e.g. named.run) is this directory. If a directory is not specified, the working directory defaults to `.', the directory from which the server was started. The directory specified should be an absolute path. key-directory When performing dynamic update of secure zones, the directory where the public and private DNSSEC key files should be found, if different than the current working directory. (Note that this option has no effect on the paths for files containing non-DNSSEC keys such as bind.keys, rndc.key or session.key.) managed-keys-directory Specifies the directory in which to store the files that track managed DNSSEC keys. By default, this is the working directory. If named is not configured to use views, then managed keys for the server will be tracked in a single file called managed-keys.bind. Otherwise, managed keys will be tracked in separate files, one file per view; each file name will be the SHA256 hash of the view name, followed by the extension .mkeys. named-xfer This option is obsolete. It was used in BIND 8 to specify the pathname to the named-xfer program. In BIND 9, no separate named-xfer program is needed; its functionality is built into the name server. tkey-gssapi-keytab The KRB5 keytab file to use for GSS-TSIG updates. If this option is set and tkey-gssapi-credential is not set, then updates will be allowed with any key matching a principal in the specified keytab. tkey-gssapi-credential The security credential with which the server should authenticate keys requested by the GSS-TSIG protocol. Currently only Kerberos 5 authentication is available and the credential is a Kerberos principal which the server can acquire through the default system key file, normally /etc/krb5.keytab. The location keytab file can be overridden using the tkey-gssapi-keytab option. Normally this principal is of the form "DNS/server.domain". To use GSS-TSIG, tkey-domain must also be set if a specific keytab is not set with tkey-gssapi-keytab. tkey-domain The domain appended to the names of all shared keys generated with TKEY. When a client requests a TKEY exchange, it may or may not specify the desired name for the key. If present, the name of the shared key will be client specified part + tkey-domain. Otherwise, the name of the shared key will be random hex digits + tkey-domain. In most cases, the domainname should be the server's domain name, or an otherwise non-existent subdomain like "_tkey.domainname". If you are using GSS-TSIG, this variable must be defined, unless you specify a specific keytab using tkey-gssapi-keytab. tkey-dhkey The Diffie-Hellman key used by the server to generate shared keys with clients using the Diffie-Hellman mode of TKEY. The server must be able to load the public and private keys from files in the working directory. In most cases, the keyname should be the server's host name. cache-file This is for testing only. Do not use. dump-file The pathname of the file the server dumps the database to when instructed to do so with rndc dumpdb. If not specified, the default is named_dump.db. memstatistics-file The pathname of the file the server writes memory usage statistics to on exit. If not specified, the default is named.memstats. pid-file The pathname of the file the server writes its process ID in. If not specified, the default is /var/run/named/named.pid. The PID file is used by programs that want to send signals to the running name server. Specifying pid-file none disables the use of a PID file — no file will be written and any existing one will be removed. Note that none is a keyword, not a filename, and therefore is not enclosed in double quotes. recursing-file The pathname of the file the server dumps the queries that are currently recursing when instructed to do so with rndc recursing. If not specified, the default is named.recursing. statistics-file The pathname of the file the server appends statistics to when instructed to do so using rndc stats. If not specified, the default is named.stats in the server's current directory. The format of the file is described in . bindkeys-file The pathname of a file to override the built-in trusted keys provided by named. See the discussion of dnssec-lookaside and dnssec-validation for details. If not specified, the default is /etc/bind.keys. secroots-file The pathname of the file the server dumps security roots to when instructed to do so with rndc secroots. If not specified, the default is named.secroots. session-keyfile The pathname of the file into which to write a TSIG session key generated by named for use by nsupdate -l. If not specified, the default is /var/run/named/session.key. (See , and in particular the discussion of the update-policy statement's local option for more information about this feature.) session-keyname The key name to use for the TSIG session key. If not specified, the default is "local-ddns". session-keyalg The algorithm to use for the TSIG session key. Valid values are hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384, hmac-sha512 and hmac-md5. If not specified, the default is hmac-sha256. port The UDP/TCP port number the server uses for receiving and sending DNS protocol traffic. The default is 53. This option is mainly intended for server testing; a server using a port other than 53 will not be able to communicate with the global DNS. random-device The source of entropy to be used by the server. Entropy is primarily needed for DNSSEC operations, such as TKEY transactions and dynamic update of signed zones. This options specifies the device (or file) from which to read entropy. If this is a file, operations requiring entropy will fail when the file has been exhausted. If not specified, the default value is /dev/random (or equivalent) when present, and none otherwise. The random-device option takes effect during the initial configuration load at server startup time and is ignored on subsequent reloads. preferred-glue If specified, the listed type (A or AAAA) will be emitted before other glue in the additional section of a query response. The default is not to prefer any type (NONE). root-delegation-only Turn on enforcement of delegation-only in TLDs (top level domains) and root zones with an optional exclude list. DS queries are expected to be made to and be answered by delegation only zones. Such queries and responses are treated as an exception to delegation-only processing and are not converted to NXDOMAIN responses provided a CNAME is not discovered at the query name. If a delegation only zone server also serves a child zone it is not always possible to determine whether an answer comes from the delegation only zone or the child zone. SOA NS and DNSKEY records are apex only records and a matching response that contains these records or DS is treated as coming from a child zone. RRSIG records are also examined to see if they are signed by a child zone or not. The authority section is also examined to see if there is evidence that the answer is from the child zone. Answers that are determined to be from a child zone are not converted to NXDOMAIN responses. Despite all these checks there is still a possibility of false negatives when a child zone is being served. Similarly false positives can arise from empty nodes (no records at the name) in the delegation only zone when the query type is not ANY. Note some TLDs are not delegation only (e.g. "DE", "LV", "US" and "MUSEUM"). This list is not exhaustive. options { root-delegation-only exclude { "de"; "lv"; "us"; "museum"; }; }; disable-algorithms Disable the specified DNSSEC algorithms at and below the specified name. Multiple disable-algorithms statements are allowed. Only the most specific will be applied. dnssec-lookaside When set, dnssec-lookaside provides the validator with an alternate method to validate DNSKEY records at the top of a zone. When a DNSKEY is at or below a domain specified by the deepest dnssec-lookaside, and the normal DNSSEC validation has left the key untrusted, the trust-anchor will be appended to the key name and a DLV record will be looked up to see if it can validate the key. If the DLV record validates a DNSKEY (similarly to the way a DS record does) the DNSKEY RRset is deemed to be trusted. If dnssec-lookaside is set to auto, then built-in default values for the DLV domain and trust anchor will be used, along with a built-in key for validation. If dnssec-lookaside is set to no, then dnssec-lookaside is not used. The default DLV key is stored in the file bind.keys; named will load that key at startup if dnssec-lookaside is set to auto. A copy of the file is installed along with BIND 9, and is current as of the release date. If the DLV key expires, a new copy of bind.keys can be downloaded from https://www.isc.org/solutions/dlv/. (To prevent problems if bind.keys is not found, the current key is also compiled in to named. Relying on this is not recommended, however, as it requires named to be recompiled with a new key when the DLV key expires.) NOTE: named only loads certain specific keys from bind.keys: those for the DLV zone and for the DNS root zone. The file cannot be used to store keys for other zones. dnssec-must-be-secure Specify hierarchies which must be or may not be secure (signed and validated). If yes, then named will only accept answers if they are secure. If no, then normal DNSSEC validation applies allowing for insecure answers to be accepted. The specified domain must be under a trusted-keys or managed-keys statement, or dnssec-lookaside must be active. dns64 This directive instructs named to return mapped IPv4 addresses to AAAA queries when there are no AAAA records. It is intended to be used in conjunction with a NAT64. Each dns64 defines one DNS64 prefix. Multiple DNS64 prefixes can be defined. Compatible IPv6 prefixes have lengths of 32, 40, 48, 56, 64 and 96 as per RFC 6052. Additionally a reverse IP6.ARPA zone will be created for the prefix to provide a mapping from the IP6.ARPA names to the corresponding IN-ADDR.ARPA names using synthesized CNAMEs. dns64-server and dns64-contact can be used to specify the name of the server and contact for the zones. These are settable at the view / options level. These are not settable on a per-prefix basis. Each dns64 supports an optional clients ACL that determines which clients are affected by this directive. If not defined, it defaults to any;. Each dns64 supports an optional mapped ACL that selects which IPv4 addresses are to be mapped in the corresponding A RRset. If not defined it defaults to any;. Normally, DNS64 won't apply to a domain name that owns one or more AAAA records; these records will simply be returned. The optional exclude ACL allows specification of a list of IPv6 addresses that will be ignored if they appear in a domain name's AAAA records, and DNS64 will be applied to any A records the domain name owns. If not defined, exclude defaults to none. A optional suffix can also be defined to set the bits trailing the mapped IPv4 address bits. By default these bits are set to ::. The bits matching the prefix and mapped IPv4 address must be zero. If recursive-only is set to yes the DNS64 synthesis will only happen for recursive queries. The default is no. If break-dnssec is set to yes the DNS64 synthesis will happen even if the result, if validated, would cause a DNSSEC validation failure. If this option is set to no (the default), the DO is set on the incoming query, and there are RRSIGs on the applicable records, then synthesis will not happen. acl rfc1918 { 10/8; 192.168/16; 172.16/12; }; dns64 64:FF9B::/96 { clients { any; }; mapped { !rfc1918; any; }; exclude { 64:FF9B::/96; ::ffff:0000:0000/96; }; suffix ::; }; dnssec-update-mode If this option is set to its default value of maintain in a zone of type master which is DNSSEC-signed and configured to allow dynamic updates (see ), and if named has access to the private signing key(s) for the zone, then named will automatically sign all new or changed records and maintain signatures for the zone by regenerating RRSIG records whenever they approach their expiration date. If the option is changed to no-resign, then named will sign all new or changed records, but scheduled maintenance of signatures is disabled. With either of these settings, named will reject updates to a DNSSEC-signed zone when the signing keys are inactive or unavailable to named. (A planned third option, external, will disable all automatic signing and allow DNSSEC data to be submitted into a zone via dynamic update; this is not yet implemented.) zone-statistics If full, the server will collect statistical data on all zones (unless specifically turned off on a per-zone basis by specifying zone-statistics terse or zone-statistics none in the zone statement). The default is terse, providing minimal statistics on zones (including name and current serial number, but not query type counters). These statistics may be accessed via the statistics-channel or using rndc stats, which will dump them to the file listed in the statistics-file. See also . For backward compatibility with earlier versions of BIND 9, the zone-statistics option can also accept yes or no, which have the same effect as full and terse, respectively. Boolean Options allow-new-zones If yes, then zones can be added at runtime via rndc addzone or deleted via rndc delzone. The default is no. auth-nxdomain If yes, then the AA bit is always set on NXDOMAIN responses, even if the server is not actually authoritative. The default is no; this is a change from BIND 8. If you are using very old DNS software, you may need to set it to yes. deallocate-on-exit This option was used in BIND 8 to enable checking for memory leaks on exit. BIND 9 ignores the option and always performs the checks. memstatistics Write memory statistics to the file specified by memstatistics-file at exit. The default is no unless '-m record' is specified on the command line in which case it is yes. dialup If yes, then the server treats all zones as if they are doing zone transfers across a dial-on-demand dialup link, which can be brought up by traffic originating from this server. This has different effects according to zone type and concentrates the zone maintenance so that it all happens in a short interval, once every heartbeat-interval and hopefully during the one call. It also suppresses some of the normal zone maintenance traffic. The default is no. The dialup option may also be specified in the view and zone statements, in which case it overrides the global dialup option. If the zone is a master zone, then the server will send out a NOTIFY request to all the slaves (default). This should trigger the zone serial number check in the slave (providing it supports NOTIFY) allowing the slave to verify the zone while the connection is active. The set of servers to which NOTIFY is sent can be controlled by notify and also-notify. If the zone is a slave or stub zone, then the server will suppress the regular "zone up to date" (refresh) queries and only perform them when the heartbeat-interval expires in addition to sending NOTIFY requests. Finer control can be achieved by using notify which only sends NOTIFY messages, notify-passive which sends NOTIFY messages and suppresses the normal refresh queries, refresh which suppresses normal refresh processing and sends refresh queries when the heartbeat-interval expires, and passive which just disables normal refresh processing. dialup mode normal refresh heart-beat refresh heart-beat notify no (default) yes no no yes no yes yes notify yes no yes refresh no yes no passive no no no notify-passive no no yes Note that normal NOTIFY processing is not affected by dialup. fake-iquery In BIND 8, this option enabled simulating the obsolete DNS query type IQUERY. BIND 9 never does IQUERY simulation. fetch-glue This option is obsolete. In BIND 8, fetch-glue yes caused the server to attempt to fetch glue resource records it didn't have when constructing the additional data section of a response. This is now considered a bad idea and BIND 9 never does it. flush-zones-on-shutdown When the nameserver exits due receiving SIGTERM, flush or do not flush any pending zone writes. The default is flush-zones-on-shutdown no. has-old-clients This option was incorrectly implemented in BIND 8, and is ignored by BIND 9. To achieve the intended effect of has-old-clients yes, specify the two separate options auth-nxdomain yes and rfc2308-type1 no instead. host-statistics In BIND 8, this enables keeping of statistics for every host that the name server interacts with. Not implemented in BIND 9. maintain-ixfr-base This option is obsolete. It was used in BIND 8 to determine whether a transaction log was kept for Incremental Zone Transfer. BIND 9 maintains a transaction log whenever possible. If you need to disable outgoing incremental zone transfers, use provide-ixfr no. minimal-responses If yes, then when generating responses the server will only add records to the authority and additional data sections when they are required (e.g. delegations, negative responses). This may improve the performance of the server. The default is no. multiple-cnames This option was used in BIND 8 to allow a domain name to have multiple CNAME records in violation of the DNS standards. BIND 9.2 onwards always strictly enforces the CNAME rules both in master files and dynamic updates. notify If yes (the default), DNS NOTIFY messages are sent when a zone the server is authoritative for changes, see . The messages are sent to the servers listed in the zone's NS records (except the master server identified in the SOA MNAME field), and to any servers listed in the also-notify option. If master-only, notifies are only sent for master zones. If explicit, notifies are sent only to servers explicitly listed using also-notify. If no, no notifies are sent. The notify option may also be specified in the zone statement, in which case it overrides the options notify statement. It would only be necessary to turn off this option if it caused slaves to crash. notify-to-soa If yes do not check the nameservers in the NS RRset against the SOA MNAME. Normally a NOTIFY message is not sent to the SOA MNAME (SOA ORIGIN) as it is supposed to contain the name of the ultimate master. Sometimes, however, a slave is listed as the SOA MNAME in hidden master configurations and in that case you would want the ultimate master to still send NOTIFY messages to all the nameservers listed in the NS RRset. recursion If yes, and a DNS query requests recursion, then the server will attempt to do all the work required to answer the query. If recursion is off and the server does not already know the answer, it will return a referral response. The default is yes. Note that setting recursion no does not prevent clients from getting data from the server's cache; it only prevents new data from being cached as an effect of client queries. Caching may still occur as an effect the server's internal operation, such as NOTIFY address lookups. See also fetch-glue above. request-nsid If yes, then an empty EDNS(0) NSID (Name Server Identifier) option is sent with all queries to authoritative name servers during iterative resolution. If the authoritative server returns an NSID option in its response, then its contents are logged in the resolver category at level info. The default is no. rfc2308-type1 Setting this to yes will cause the server to send NS records along with the SOA record for negative answers. The default is no. Not yet implemented in BIND 9. use-id-pool This option is obsolete. BIND 9 always allocates query IDs from a pool. use-ixfr This option is obsolete. If you need to disable IXFR to a particular server or servers, see the information on the provide-ixfr option in . See also . provide-ixfr See the description of provide-ixfr in . request-ixfr See the description of request-ixfr in . treat-cr-as-space This option was used in BIND 8 to make the server treat carriage return ("\r") characters the same way as a space or tab character, to facilitate loading of zone files on a UNIX system that were generated on an NT or DOS machine. In BIND 9, both UNIX "\n" and NT/DOS "\r\n" newlines are always accepted, and the option is ignored. additional-from-auth additional-from-cache These options control the behavior of an authoritative server when answering queries which have additional data, or when following CNAME and DNAME chains. When both of these options are set to yes (the default) and a query is being answered from authoritative data (a zone configured into the server), the additional data section of the reply will be filled in using data from other authoritative zones and from the cache. In some situations this is undesirable, such as when there is concern over the correctness of the cache, or in servers where slave zones may be added and modified by untrusted third parties. Also, avoiding the search for this additional data will speed up server operations at the possible expense of additional queries to resolve what would otherwise be provided in the additional section. For example, if a query asks for an MX record for host foo.example.com, and the record found is "MX 10 mail.example.net", normally the address records (A and AAAA) for mail.example.net will be provided as well, if known, even though they are not in the example.com zone. Setting these options to no disables this behavior and makes the server only search for additional data in the zone it answers from. These options are intended for use in authoritative-only servers, or in authoritative-only views. Attempts to set them to no without also specifying recursion no will cause the server to ignore the options and log a warning message. Specifying additional-from-cache no actually disables the use of the cache not only for additional data lookups but also when looking up the answer. This is usually the desired behavior in an authoritative-only server where the correctness of the cached data is an issue. When a name server is non-recursively queried for a name that is not below the apex of any served zone, it normally answers with an "upwards referral" to the root servers or the servers of some other known parent of the query name. Since the data in an upwards referral comes from the cache, the server will not be able to provide upwards referrals when additional-from-cache no has been specified. Instead, it will respond to such queries with REFUSED. This should not cause any problems since upwards referrals are not required for the resolution process. match-mapped-addresses If yes, then an IPv4-mapped IPv6 address will match any address match list entries that match the corresponding IPv4 address. This option was introduced to work around a kernel quirk in some operating systems that causes IPv4 TCP connections, such as zone transfers, to be accepted on an IPv6 socket using mapped addresses. This caused address match lists designed for IPv4 to fail to match. However, named now solves this problem internally. The use of this option is discouraged. filter-aaaa-on-v4 This option is only available when BIND 9 is compiled with the --enable-filter-aaaa option on the "configure" command line. It is intended to help the transition from IPv4 to IPv6 by not giving IPv6 addresses to DNS clients unless they have connections to the IPv6 Internet. This is not recommended unless absolutely necessary. The default is no. The filter-aaaa-on-v4 option may also be specified in view statements to override the global filter-aaaa-on-v4 option. If yes, the DNS client is at an IPv4 address, in filter-aaaa, and if the response does not include DNSSEC signatures, then all AAAA records are deleted from the response. This filtering applies to all responses and not only authoritative responses. If break-dnssec, then AAAA records are deleted even when dnssec is enabled. As suggested by the name, this makes the response not verify, because the DNSSEC protocol is designed detect deletions. This mechanism can erroneously cause other servers to not give AAAA records to their clients. A recursing server with both IPv6 and IPv4 network connections that queries an authoritative server using this mechanism via IPv4 will be denied AAAA records even if its client is using IPv6. This mechanism is applied to authoritative as well as non-authoritative records. A client using IPv4 that is not allowed recursion can erroneously be given AAAA records because the server is not allowed to check for A records. Some AAAA records are given to IPv4 clients in glue records. IPv4 clients that are servers can then erroneously answer requests for AAAA records received via IPv4. ixfr-from-differences When yes and the server loads a new version of a master zone from its zone file or receives a new version of a slave file via zone transfer, it will compare the new version to the previous one and calculate a set of differences. The differences are then logged in the zone's journal file such that the changes can be transmitted to downstream slaves as an incremental zone transfer. By allowing incremental zone transfers to be used for non-dynamic zones, this option saves bandwidth at the expense of increased CPU and memory consumption at the master. In particular, if the new version of a zone is completely different from the previous one, the set of differences will be of a size comparable to the combined size of the old and new zone version, and the server will need to temporarily allocate memory to hold this complete difference set. ixfr-from-differences also accepts master and slave at the view and options levels which causes ixfr-from-differences to be enabled for all master or slave zones respectively. It is off by default. multi-master This should be set when you have multiple masters for a zone and the addresses refer to different machines. If yes, named will not log when the serial number on the master is less than what named currently has. The default is no. dnssec-enable Enable DNSSEC support in named. Unless set to yes, named behaves as if it does not support DNSSEC. The default is yes. dnssec-validation Enable DNSSEC validation in named. Note dnssec-enable also needs to be set to yes to be effective. If set to no, DNSSEC validation is disabled. If set to auto, DNSSEC validation is enabled, and a default trust-anchor for the DNS root zone is used. If set to yes, DNSSEC validation is enabled, but a trust anchor must be manually configured using a trusted-keys or managed-keys statement. The default is yes. dnssec-accept-expired Accept expired signatures when verifying DNSSEC signatures. The default is no. Setting this option to yes leaves named vulnerable to replay attacks. querylog Specify whether query logging should be started when named starts. If querylog is not specified, then the query logging is determined by the presence of the logging category queries. check-names This option is used to restrict the character set and syntax of certain domain names in master files and/or DNS responses received from the network. The default varies according to usage area. For master zones the default is fail. For slave zones the default is warn. For answers received from the network (response) the default is ignore. The rules for legal hostnames and mail domains are derived from RFC 952 and RFC 821 as modified by RFC 1123. check-names applies to the owner names of A, AAAA and MX records. It also applies to the domain names in the RDATA of NS, SOA, MX, and SRV records. It also applies to the RDATA of PTR records where the owner name indicated that it is a reverse lookup of a hostname (the owner name ends in IN-ADDR.ARPA, IP6.ARPA, or IP6.INT). check-dup-records Check master zones for records that are treated as different by DNSSEC but are semantically equal in plain DNS. The default is to warn. Other possible values are fail and ignore. check-mx Check whether the MX record appears to refer to a IP address. The default is to warn. Other possible values are fail and ignore. check-wildcard This option is used to check for non-terminal wildcards. The use of non-terminal wildcards is almost always as a result of a failure to understand the wildcard matching algorithm (RFC 1034). This option affects master zones. The default (yes) is to check for non-terminal wildcards and issue a warning. check-integrity Perform post load zone integrity checks on master zones. This checks that MX and SRV records refer to address (A or AAAA) records and that glue address records exist for delegated zones. For MX and SRV records only in-zone hostnames are checked (for out-of-zone hostnames use named-checkzone). For NS records only names below top of zone are checked (for out-of-zone names and glue consistency checks use named-checkzone). The default is yes. Check that the two forms of Sender Policy Framework records (TXT records starting with "v=spf1" and SPF) either both exist or both don't exist. Warnings are emitted it they don't and be suppressed with check-spf. check-mx-cname If check-integrity is set then fail, warn or ignore MX records that refer to CNAMES. The default is to warn. check-srv-cname If check-integrity is set then fail, warn or ignore SRV records that refer to CNAMES. The default is to warn. check-sibling When performing integrity checks, also check that sibling glue exists. The default is yes. check-spf When performing integrity checks, check that the two forms of Sender Policy Framwork records (TXT records starting with "v=spf1" and SPF) both exist or both don't exist and issue a warning if not met. The default is warn. zero-no-soa-ttl When returning authoritative negative responses to SOA queries set the TTL of the SOA record returned in the authority section to zero. The default is yes. zero-no-soa-ttl-cache When caching a negative response to a SOA query set the TTL to zero. The default is no. update-check-ksk When set to the default value of yes, check the KSK bit in each key to determine how the key should be used when generating RRSIGs for a secure zone. Ordinarily, zone-signing keys (that is, keys without the KSK bit set) are used to sign the entire zone, while key-signing keys (keys with the KSK bit set) are only used to sign the DNSKEY RRset at the zone apex. However, if this option is set to no, then the KSK bit is ignored; KSKs are treated as if they were ZSKs and are used to sign the entire zone. This is similar to the dnssec-signzone -z command line option. When this option is set to yes, there must be at least two active keys for every algorithm represented in the DNSKEY RRset: at least one KSK and one ZSK per algorithm. If there is any algorithm for which this requirement is not met, this option will be ignored for that algorithm. dnssec-dnskey-kskonly When this option and update-check-ksk are both set to yes, only key-signing keys (that is, keys with the KSK bit set) will be used to sign the DNSKEY RRset at the zone apex. Zone-signing keys (keys without the KSK bit set) will be used to sign the remainder of the zone, but not the DNSKEY RRset. This is similar to the dnssec-signzone -x command line option. The default is no. If update-check-ksk is set to no, this option is ignored. dnssec-loadkeys-interval When a zone is configured with auto-dnssec maintain; its key repository must be checked periodically to see if any new keys have been added or any existing keys' timing metadata has been updated (see and ). The dnssec-loadkeys-interval option sets the frequency of automatic repository checks, in minutes. The default is 60 (1 hour), the minimum is 1 (1 minute), and the maximum is 1440 (24 hours); any higher value is silently reduced. try-tcp-refresh Try to refresh the zone using TCP if UDP queries fail. For BIND 8 compatibility, the default is yes. dnssec-secure-to-insecure Allow a dynamic zone to transition from secure to insecure (i.e., signed to unsigned) by deleting all of the DNSKEY records. The default is no. If set to yes, and if the DNSKEY RRset at the zone apex is deleted, all RRSIG and NSEC records will be removed from the zone as well. If the zone uses NSEC3, then it is also necessary to delete the NSEC3PARAM RRset from the zone apex; this will cause the removal of all corresponding NSEC3 records. (It is expected that this requirement will be eliminated in a future release.) Note that if a zone has been configured with auto-dnssec maintain and the private keys remain accessible in the key repository, then the zone will be automatically signed again the next time named is started. Forwarding The forwarding facility can be used to create a large site-wide cache on a few servers, reducing traffic over links to external name servers. It can also be used to allow queries by servers that do not have direct access to the Internet, but wish to look up exterior names anyway. Forwarding occurs only on those queries for which the server is not authoritative and does not have the answer in its cache. forward This option is only meaningful if the forwarders list is not empty. A value of first, the default, causes the server to query the forwarders first — and if that doesn't answer the question, the server will then look for the answer itself. If only is specified, the server will only query the forwarders. forwarders Specifies the IP addresses to be used for forwarding. The default is the empty list (no forwarding). Forwarding can also be configured on a per-domain basis, allowing for the global forwarding options to be overridden in a variety of ways. You can set particular domains to use different forwarders, or have a different forward only/first behavior, or not forward at all, see . Dual-stack Servers Dual-stack servers are used as servers of last resort to work around problems in reachability due the lack of support for either IPv4 or IPv6 on the host machine. dual-stack-servers Specifies host names or addresses of machines with access to both IPv4 and IPv6 transports. If a hostname is used, the server must be able to resolve the name using only the transport it has. If the machine is dual stacked, then the dual-stack-servers have no effect unless access to a transport has been disabled on the command line (e.g. named -4). Access Control Access to the server can be restricted based on the IP address of the requesting system. See for details on how to specify IP address lists. allow-notify Specifies which hosts are allowed to notify this server, a slave, of zone changes in addition to the zone masters. allow-notify may also be specified in the zone statement, in which case it overrides the options allow-notify statement. It is only meaningful for a slave zone. If not specified, the default is to process notify messages only from a zone's master. allow-query Specifies which hosts are allowed to ask ordinary DNS questions. allow-query may also be specified in the zone statement, in which case it overrides the options allow-query statement. If not specified, the default is to allow queries from all hosts. allow-query-cache is now used to specify access to the cache. allow-query-on Specifies which local addresses can accept ordinary DNS questions. This makes it possible, for instance, to allow queries on internal-facing interfaces but disallow them on external-facing ones, without necessarily knowing the internal network's addresses. Note that allow-query-on is only checked for queries that are permitted by allow-query. A query must be allowed by both ACLs, or it will be refused. allow-query-on may also be specified in the zone statement, in which case it overrides the options allow-query-on statement. If not specified, the default is to allow queries on all addresses. allow-query-cache is used to specify access to the cache. allow-query-cache Specifies which hosts are allowed to get answers from the cache. If allow-query-cache is not set then allow-recursion is used if set, otherwise allow-query is used if set unless recursion no; is set in which case none; is used, otherwise the default (localnets; localhost;) is used. allow-query-cache-on Specifies which local addresses can give answers from the cache. If not specified, the default is to allow cache queries on any address, localnets and localhost. allow-recursion Specifies which hosts are allowed to make recursive queries through this server. If allow-recursion is not set then allow-query-cache is used if set, otherwise allow-query is used if set, otherwise the default (localnets; localhost;) is used. allow-recursion-on Specifies which local addresses can accept recursive queries. If not specified, the default is to allow recursive queries on all addresses. allow-update Specifies which hosts are allowed to submit Dynamic DNS updates for master zones. The default is to deny updates from all hosts. Note that allowing updates based on the requestor's IP address is insecure; see for details. allow-update-forwarding Specifies which hosts are allowed to submit Dynamic DNS updates to slave zones to be forwarded to the master. The default is { none; }, which means that no update forwarding will be performed. To enable update forwarding, specify allow-update-forwarding { any; };. Specifying values other than { none; } or { any; } is usually counterproductive, since the responsibility for update access control should rest with the master server, not the slaves. Note that enabling the update forwarding feature on a slave server may expose master servers relying on insecure IP address based access control to attacks; see for more details. allow-v6-synthesis This option was introduced for the smooth transition from AAAA to A6 and from "nibble labels" to binary labels. However, since both A6 and binary labels were then deprecated, this option was also deprecated. It is now ignored with some warning messages. allow-transfer Specifies which hosts are allowed to receive zone transfers from the server. allow-transfer may also be specified in the zone statement, in which case it overrides the options allow-transfer statement. If not specified, the default is to allow transfers to all hosts. blackhole Specifies a list of addresses that the server will not accept queries from or use to resolve a query. Queries from these addresses will not be responded to. The default is none. filter-aaaa Specifies a list of addresses to which filter-aaaa-on-v4 is applies. The default is any. resolver-query-timeout The amount of time the resolver will spend attempting to resolve a recursive query before failing. The default and minimum is 10 and the maximum is 30. Setting it to 0 will result in the default being used. Interfaces The interfaces and ports that the server will answer queries from may be specified using the listen-on option. listen-on takes an optional port and an address_match_list. The server will listen on all interfaces allowed by the address match list. If a port is not specified, port 53 will be used. Multiple listen-on statements are allowed. For example, listen-on { 5.6.7.8; }; listen-on port 1234 { !1.2.3.4; 1.2/16; }; will enable the name server on port 53 for the IP address 5.6.7.8, and on port 1234 of an address on the machine in net 1.2 that is not 1.2.3.4. If no listen-on is specified, the server will listen on port 53 on all IPv4 interfaces. The listen-on-v6 option is used to specify the interfaces and the ports on which the server will listen for incoming queries sent using IPv6. When { any; } is specified as the address_match_list for the listen-on-v6 option, the server does not bind a separate socket to each IPv6 interface address as it does for IPv4 if the operating system has enough API support for IPv6 (specifically if it conforms to RFC 3493 and RFC 3542). Instead, it listens on the IPv6 wildcard address. If the system only has incomplete API support for IPv6, however, the behavior is the same as that for IPv4. A list of particular IPv6 addresses can also be specified, in which case the server listens on a separate socket for each specified address, regardless of whether the desired API is supported by the system. Multiple listen-on-v6 options can be used. For example, listen-on-v6 { any; }; listen-on-v6 port 1234 { !2001:db8::/32; any; }; will enable the name server on port 53 for any IPv6 addresses (with a single wildcard socket), and on port 1234 of IPv6 addresses that is not in the prefix 2001:db8::/32 (with separate sockets for each matched address.) To make the server not listen on any IPv6 address, use listen-on-v6 { none; }; If no listen-on-v6 option is specified, the server will not listen on any IPv6 address unless -6 is specified when named is invoked. If -6 is specified then named will listen on port 53 on all IPv6 interfaces by default. Query Address If the server doesn't know the answer to a question, it will query other name servers. query-source specifies the address and port used for such queries. For queries sent over IPv6, there is a separate query-source-v6 option. If address is * (asterisk) or is omitted, a wildcard IP address (INADDR_ANY) will be used. If port is * or is omitted, a random port number from a pre-configured range is picked up and will be used for each query. The port range(s) is that specified in the use-v4-udp-ports (for IPv4) and use-v6-udp-ports (for IPv6) options, excluding the ranges specified in the avoid-v4-udp-ports and avoid-v6-udp-ports options, respectively. The defaults of the query-source and query-source-v6 options are: query-source address * port *; query-source-v6 address * port *; If use-v4-udp-ports or use-v6-udp-ports is unspecified, named will check if the operating system provides a programming interface to retrieve the system's default range for ephemeral ports. If such an interface is available, named will use the corresponding system default range; otherwise, it will use its own defaults: use-v4-udp-ports { range 1024 65535; }; use-v6-udp-ports { range 1024 65535; }; Note: make sure the ranges be sufficiently large for security. A desirable size depends on various parameters, but we generally recommend it contain at least 16384 ports (14 bits of entropy). Note also that the system's default range when used may be too small for this purpose, and that the range may even be changed while named is running; the new range will automatically be applied when named is reloaded. It is encouraged to configure use-v4-udp-ports and use-v6-udp-ports explicitly so that the ranges are sufficiently large and are reasonably independent from the ranges used by other applications. Note: the operational configuration where named runs may prohibit the use of some ports. For example, UNIX systems will not allow named running without a root privilege to use ports less than 1024. If such ports are included in the specified (or detected) set of query ports, the corresponding query attempts will fail, resulting in resolution failures or delay. It is therefore important to configure the set of ports that can be safely used in the expected operational environment. The defaults of the avoid-v4-udp-ports and avoid-v6-udp-ports options are: avoid-v4-udp-ports {}; avoid-v6-udp-ports {}; Note: BIND 9.5.0 introduced the use-queryport-pool option to support a pool of such random ports, but this option is now obsolete because reusing the same ports in the pool may not be sufficiently secure. For the same reason, it is generally strongly discouraged to specify a particular port for the query-source or query-source-v6 options; it implicitly disables the use of randomized port numbers. use-queryport-pool This option is obsolete. queryport-pool-ports This option is obsolete. queryport-pool-updateinterval This option is obsolete. The address specified in the query-source option is used for both UDP and TCP queries, but the port applies only to UDP queries. TCP queries always use a random unprivileged port. Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets. See also transfer-source and notify-source. Zone Transfers BIND has mechanisms in place to facilitate zone transfers and set limits on the amount of load that transfers place on the system. The following options apply to zone transfers. also-notify Defines a global list of IP addresses of name servers that are also sent NOTIFY messages whenever a fresh copy of the zone is loaded, in addition to the servers listed in the zone's NS records. This helps to ensure that copies of the zones will quickly converge on stealth servers. Optionally, a port may be specified with each also-notify address to send the notify messages to a port other than the default of 53. An optional TSIG key can also be specified with each address to cause the notify messages to be signed; this can be useful when sending notifies to multiple views. In place of explicit addresses, one or more named masters lists can be used. If an also-notify list is given in a zone statement, it will override the options also-notify statement. When a zone notify statement is set to no, the IP addresses in the global also-notify list will not be sent NOTIFY messages for that zone. The default is the empty list (no global notification list). max-transfer-time-in Inbound zone transfers running longer than this many minutes will be terminated. The default is 120 minutes (2 hours). The maximum value is 28 days (40320 minutes). max-transfer-idle-in Inbound zone transfers making no progress in this many minutes will be terminated. The default is 60 minutes (1 hour). The maximum value is 28 days (40320 minutes). max-transfer-time-out Outbound zone transfers running longer than this many minutes will be terminated. The default is 120 minutes (2 hours). The maximum value is 28 days (40320 minutes). max-transfer-idle-out Outbound zone transfers making no progress in this many minutes will be terminated. The default is 60 minutes (1 hour). The maximum value is 28 days (40320 minutes). serial-query-rate Slave servers will periodically query master servers to find out if zone serial numbers have changed. Each such query uses a minute amount of the slave server's network bandwidth. To limit the amount of bandwidth used, BIND 9 limits the rate at which queries are sent. The value of the serial-query-rate option, an integer, is the maximum number of queries sent per second. The default is 20. In addition to controlling the rate SOA refresh queries are issued at serial-query-rate also controls the rate at which NOTIFY messages are sent from both master and slave zones. serial-queries In BIND 8, the serial-queries option set the maximum number of concurrent serial number queries allowed to be outstanding at any given time. BIND 9 does not limit the number of outstanding serial queries and ignores the serial-queries option. Instead, it limits the rate at which the queries are sent as defined using the serial-query-rate option. transfer-format Zone transfers can be sent using two different formats, one-answer and many-answers. The transfer-format option is used on the master server to determine which format it sends. one-answer uses one DNS message per resource record transferred. many-answers packs as many resource records as possible into a message. many-answers is more efficient, but is only supported by relatively new slave servers, such as BIND 9, BIND 8.x and BIND 4.9.5 onwards. The many-answers format is also supported by recent Microsoft Windows nameservers. The default is many-answers. transfer-format may be overridden on a per-server basis by using the server statement. transfers-in The maximum number of inbound zone transfers that can be running concurrently. The default value is 10. Increasing transfers-in may speed up the convergence of slave zones, but it also may increase the load on the local system. transfers-out The maximum number of outbound zone transfers that can be running concurrently. Zone transfer requests in excess of the limit will be refused. The default value is 10. transfers-per-ns The maximum number of inbound zone transfers that can be concurrently transferring from a given remote name server. The default value is 2. Increasing transfers-per-ns may speed up the convergence of slave zones, but it also may increase the load on the remote name server. transfers-per-ns may be overridden on a per-server basis by using the transfers phrase of the server statement. transfer-source transfer-source determines which local address will be bound to IPv4 TCP connections used to fetch zones transferred inbound by the server. It also determines the source IPv4 address, and optionally the UDP port, used for the refresh queries and forwarded dynamic updates. If not set, it defaults to a system controlled value which will usually be the address of the interface "closest to" the remote end. This address must appear in the remote end's allow-transfer option for the zone being transferred, if one is specified. This statement sets the transfer-source for all zones, but can be overridden on a per-view or per-zone basis by including a transfer-source statement within the view or zone block in the configuration file. Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets. transfer-source-v6 The same as transfer-source, except zone transfers are performed using IPv6. alt-transfer-source An alternate transfer source if the one listed in transfer-source fails and use-alt-transfer-source is set. If you do not wish the alternate transfer source to be used, you should set use-alt-transfer-source appropriately and you should not depend upon getting an answer back to the first refresh query. alt-transfer-source-v6 An alternate transfer source if the one listed in transfer-source-v6 fails and use-alt-transfer-source is set. use-alt-transfer-source Use the alternate transfer sources or not. If views are specified this defaults to no otherwise it defaults to yes (for BIND 8 compatibility). notify-source notify-source determines which local source address, and optionally UDP port, will be used to send NOTIFY messages. This address must appear in the slave server's masters zone clause or in an allow-notify clause. This statement sets the notify-source for all zones, but can be overridden on a per-zone or per-view basis by including a notify-source statement within the zone or view block in the configuration file. Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets. notify-source-v6 Like notify-source, but applies to notify messages sent to IPv6 addresses. UDP Port Lists use-v4-udp-ports, avoid-v4-udp-ports, use-v6-udp-ports, and avoid-v6-udp-ports specify a list of IPv4 and IPv6 UDP ports that will be used or not used as source ports for UDP messages. See about how the available ports are determined. For example, with the following configuration use-v6-udp-ports { range 32768 65535; }; avoid-v6-udp-ports { 40000; range 50000 60000; }; UDP ports of IPv6 messages sent from named will be in one of the following ranges: 32768 to 39999, 40001 to 49999, and 60001 to 65535. avoid-v4-udp-ports and avoid-v6-udp-ports can be used to prevent named from choosing as its random source port a port that is blocked by your firewall or a port that is used by other applications; if a query went out with a source port blocked by a firewall, the answer would not get by the firewall and the name server would have to query again. Note: the desired range can also be represented only with use-v4-udp-ports and use-v6-udp-ports, and the avoid- options are redundant in that sense; they are provided for backward compatibility and to possibly simplify the port specification. Operating System Resource Limits The server's usage of many system resources can be limited. Scaled values are allowed when specifying resource limits. For example, 1G can be used instead of 1073741824 to specify a limit of one gigabyte. unlimited requests unlimited use, or the maximum available amount. default uses the limit that was in force when the server was started. See the description of size_spec in . The following options set operating system resource limits for the name server process. Some operating systems don't support some or any of the limits. On such systems, a warning will be issued if the unsupported limit is used. coresize The maximum size of a core dump. The default is default. datasize The maximum amount of data memory the server may use. The default is default. This is a hard limit on server memory usage. If the server attempts to allocate memory in excess of this limit, the allocation will fail, which may in turn leave the server unable to perform DNS service. Therefore, this option is rarely useful as a way of limiting the amount of memory used by the server, but it can be used to raise an operating system data size limit that is too small by default. If you wish to limit the amount of memory used by the server, use the max-cache-size and recursive-clients options instead. files The maximum number of files the server may have open concurrently. The default is unlimited. stacksize The maximum amount of stack memory the server may use. The default is default. Server Resource Limits The following options set limits on the server's resource consumption that are enforced internally by the server rather than the operating system. max-ixfr-log-size This option is obsolete; it is accepted and ignored for BIND 8 compatibility. The option max-journal-size performs a similar function in BIND 9. max-journal-size Sets a maximum size for each journal file (see ). When the journal file approaches the specified size, some of the oldest transactions in the journal will be automatically removed. The largest permitted value is 2 gigabytes. The default is unlimited, which also means 2 gigabytes. This may also be set on a per-zone basis. host-statistics-max In BIND 8, specifies the maximum number of host statistics entries to be kept. Not implemented in BIND 9. recursive-clients The maximum number of simultaneous recursive lookups the server will perform on behalf of clients. The default is 1000. Because each recursing client uses a fair bit of memory, on the order of 20 kilobytes, the value of the recursive-clients option may have to be decreased on hosts with limited memory. tcp-clients The maximum number of simultaneous client TCP connections that the server will accept. The default is 100. reserved-sockets The number of file descriptors reserved for TCP, stdio, etc. This needs to be big enough to cover the number of interfaces named listens on, tcp-clients as well as to provide room for outgoing TCP queries and incoming zone transfers. The default is 512. The minimum value is 128 and the maximum value is 128 less than maxsockets (-S). This option may be removed in the future. This option has little effect on Windows. max-cache-size The maximum amount of memory to use for the server's cache, in bytes. When the amount of data in the cache reaches this limit, the server will cause records to expire prematurely based on an LRU based strategy so that the limit is not exceeded. A value of 0 is special, meaning that records are purged from the cache only when their TTLs expire. Another special keyword unlimited means the maximum value of 32-bit unsigned integers (0xffffffff), which may not have the same effect as 0 on machines that support more than 32 bits of memory space. Any positive values less than 2MB will be ignored reset to 2MB. In a server with multiple views, the limit applies separately to the cache of each view. The default is 0. tcp-listen-queue The listen queue depth. The default and minimum is 10. If the kernel supports the accept filter "dataready" this also controls how many TCP connections that will be queued in kernel space waiting for some data before being passed to accept. Nonzero values less than 10 will be silently raised. A value of 0 may also be used; on most platforms this sets the listen queue length to a system-defined default value. Periodic Task Intervals cleaning-interval This interval is effectively obsolete. Previously, the server would remove expired resource records from the cache every cleaning-interval minutes. BIND 9 now manages cache memory in a more sophisticated manner and does not rely on the periodic cleaning any more. Specifying this option therefore has no effect on the server's behavior. heartbeat-interval The server will perform zone maintenance tasks for all zones marked as dialup whenever this interval expires. The default is 60 minutes. Reasonable values are up to 1 day (1440 minutes). The maximum value is 28 days (40320 minutes). If set to 0, no zone maintenance for these zones will occur. interface-interval The server will scan the network interface list every interface-interval minutes. The default is 60 minutes. The maximum value is 28 days (40320 minutes). If set to 0, interface scanning will only occur when the configuration file is loaded. After the scan, the server will begin listening for queries on any newly discovered interfaces (provided they are allowed by the listen-on configuration), and will stop listening on interfaces that have gone away. statistics-interval Name server statistics will be logged every statistics-interval minutes. The default is 60. The maximum value is 28 days (40320 minutes). If set to 0, no statistics will be logged. Not yet implemented in BIND 9. Topology All other things being equal, when the server chooses a name server to query from a list of name servers, it prefers the one that is topologically closest to itself. The topology statement takes an address_match_list and interprets it in a special way. Each top-level list element is assigned a distance. Non-negated elements get a distance based on their position in the list, where the closer the match is to the start of the list, the shorter the distance is between it and the server. A negated match will be assigned the maximum distance from the server. If there is no match, the address will get a distance which is further than any non-negated list element, and closer than any negated element. For example, topology { 10/8; !1.2.3/24; { 1.2/16; 3/8; }; }; will prefer servers on network 10 the most, followed by hosts on network 1.2.0.0 (netmask 255.255.0.0) and network 3, with the exception of hosts on network 1.2.3 (netmask 255.255.255.0), which is preferred least of all. The default topology is topology { localhost; localnets; }; The topology option is not implemented in BIND 9. The <command>sortlist</command> Statement The response to a DNS query may consist of multiple resource records (RRs) forming a resource records set (RRset). The name server will normally return the RRs within the RRset in an indeterminate order (but see the rrset-order statement in ). The client resolver code should rearrange the RRs as appropriate, that is, using any addresses on the local net in preference to other addresses. However, not all resolvers can do this or are correctly configured. When a client is using a local server, the sorting can be performed in the server, based on the client's address. This only requires configuring the name servers, not all the clients. The sortlist statement (see below) takes an address_match_list and interprets it even more specifically than the topology statement does (). Each top level statement in the sortlist must itself be an explicit address_match_list with one or two elements. The first element (which may be an IP address, an IP prefix, an ACL name or a nested address_match_list) of each top level list is checked against the source address of the query until a match is found. Once the source address of the query has been matched, if the top level statement contains only one element, the actual primitive element that matched the source address is used to select the address in the response to move to the beginning of the response. If the statement is a list of two elements, then the second element is treated the same as the address_match_list in a topology statement. Each top level element is assigned a distance and the address in the response with the minimum distance is moved to the beginning of the response. In the following example, any queries received from any of the addresses of the host itself will get responses preferring addresses on any of the locally connected networks. Next most preferred are addresses on the 192.168.1/24 network, and after that either the 192.168.2/24 or 192.168.3/24 network with no preference shown between these two networks. Queries received from a host on the 192.168.1/24 network will prefer other addresses on that network to the 192.168.2/24 and 192.168.3/24 networks. Queries received from a host on the 192.168.4/24 or the 192.168.5/24 network will only prefer other addresses on their directly connected networks. sortlist { // IF the local host // THEN first fit on the following nets { localhost; { localnets; 192.168.1/24; { 192.168.2/24; 192.168.3/24; }; }; }; // IF on class C 192.168.1 THEN use .1, or .2 or .3 { 192.168.1/24; { 192.168.1/24; { 192.168.2/24; 192.168.3/24; }; }; }; // IF on class C 192.168.2 THEN use .2, or .1 or .3 { 192.168.2/24; { 192.168.2/24; { 192.168.1/24; 192.168.3/24; }; }; }; // IF on class C 192.168.3 THEN use .3, or .1 or .2 { 192.168.3/24; { 192.168.3/24; { 192.168.1/24; 192.168.2/24; }; }; }; // IF .4 or .5 THEN prefer that net { { 192.168.4/24; 192.168.5/24; }; }; }; The following example will give reasonable behavior for the local host and hosts on directly connected networks. It is similar to the behavior of the address sort in BIND 4.9.x. Responses sent to queries from the local host will favor any of the directly connected networks. Responses sent to queries from any other hosts on a directly connected network will prefer addresses on that same network. Responses to other queries will not be sorted. sortlist { { localhost; localnets; }; { localnets; }; }; RRset Ordering When multiple records are returned in an answer it may be useful to configure the order of the records placed into the response. The rrset-order statement permits configuration of the ordering of the records in a multiple record response. See also the sortlist statement, . An order_spec is defined as follows: class class_name type type_name name "domain_name" order ordering If no class is specified, the default is ANY. If no type is specified, the default is ANY. If no name is specified, the default is "*" (asterisk). The legal values for ordering are: fixed Records are returned in the order they are defined in the zone file. random Records are returned in some random order. cyclic Records are returned in a cyclic round-robin order. If BIND is configured with the "--enable-fixed-rrset" option at compile time, then the initial ordering of the RRset will match the one specified in the zone file. For example: rrset-order { class IN type A name "host.example.com" order random; order cyclic; }; will cause any responses for type A records in class IN that have "host.example.com" as a suffix, to always be returned in random order. All other records are returned in cyclic order. If multiple rrset-order statements appear, they are not combined — the last one applies. By default, all records are returned in random order. In this release of BIND 9, the rrset-order statement does not support "fixed" ordering by default. Fixed ordering can be enabled at compile time by specifying "--enable-fixed-rrset" on the "configure" command line. Tuning lame-ttl Sets the number of seconds to cache a lame server indication. 0 disables caching. (This is NOT recommended.) The default is 600 (10 minutes) and the maximum value is 1800 (30 minutes). Lame-ttl also controls the amount of time DNSSEC validation failures are cached. There is a minimum of 30 seconds applied to bad cache entries if the lame-ttl is set to less than 30 seconds. max-ncache-ttl To reduce network traffic and increase performance, the server stores negative answers. max-ncache-ttl is used to set a maximum retention time for these answers in the server in seconds. The default max-ncache-ttl is 10800 seconds (3 hours). max-ncache-ttl cannot exceed 7 days and will be silently truncated to 7 days if set to a greater value. max-cache-ttl Sets the maximum time for which the server will cache ordinary (positive) answers. The default is one week (7 days). A value of zero may cause all queries to return SERVFAIL, because of lost caches of intermediate RRsets (such as NS and glue AAAA/A records) in the resolution process. min-roots The minimum number of root servers that is required for a request for the root servers to be accepted. The default is 2. Not implemented in BIND 9. sig-validity-interval Specifies the number of days into the future when DNSSEC signatures automatically generated as a result of dynamic updates () will expire. There is an optional second field which specifies how long before expiry that the signatures will be regenerated. If not specified, the signatures will be regenerated at 1/4 of base interval. The second field is specified in days if the base interval is greater than 7 days otherwise it is specified in hours. The default base interval is 30 days giving a re-signing interval of 7 1/2 days. The maximum values are 10 years (3660 days). The signature inception time is unconditionally set to one hour before the current time to allow for a limited amount of clock skew. The sig-validity-interval should be, at least, several multiples of the SOA expire interval to allow for reasonable interaction between the various timer and expiry dates. sig-signing-nodes Specify the maximum number of nodes to be examined in each quantum when signing a zone with a new DNSKEY. The default is 100. sig-signing-signatures Specify a threshold number of signatures that will terminate processing a quantum when signing a zone with a new DNSKEY. The default is 10. sig-signing-type Specify a private RDATA type to be used when generating key signing records. The default is 65534. It is expected that this parameter may be removed in a future version once there is a standard type. These records can be removed from the zone once named has completed signing the zone with the matching key using nsupdate or rndc signing -clear. rndc signing -clear is the only supported way to remove these records from inline-signing zones. min-refresh-time max-refresh-time min-retry-time max-retry-time These options control the server's behavior on refreshing a zone (querying for SOA changes) or retrying failed transfers. Usually the SOA values for the zone are used, but these values are set by the master, giving slave server administrators little control over their contents. These options allow the administrator to set a minimum and maximum refresh and retry time either per-zone, per-view, or globally. These options are valid for slave and stub zones, and clamp the SOA refresh and retry times to the specified values. The following defaults apply. min-refresh-time 300 seconds, max-refresh-time 2419200 seconds (4 weeks), min-retry-time 500 seconds, and max-retry-time 1209600 seconds (2 weeks). edns-udp-size Sets the advertised EDNS UDP buffer size in bytes to control the size of packets received. Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting edns-udp-size to a non-default value is to get UDP answers to pass through broken firewalls that block fragmented packets and/or block UDP packets that are greater than 512 bytes. named will fallback to using 512 bytes if it get a series of timeout at the initial value. 512 bytes is not being offered to encourage sites to fix their firewalls. Small EDNS UDP sizes will result in the excessive use of TCP. max-udp-size Sets the maximum EDNS UDP message size named will send in bytes. Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting max-udp-size to a non-default value is to get UDP answers to pass through broken firewalls that block fragmented packets and/or block UDP packets that are greater than 512 bytes. This is independent of the advertised receive buffer (edns-udp-size). Setting this to a low value will encourage additional TCP traffic to the nameserver. masterfile-format Specifies the file format of zone files (see ). The default value is text, which is the standard textual representation, except for slave zones, in which the default value is raw. Files in other formats than text are typically expected to be generated by the named-compilezone tool, or dumped by named. Note that when a zone file in a different format than text is loaded, named may omit some of the checks which would be performed for a file in the text format. In particular, check-names checks do not apply for the raw format. This means a zone file in the raw format must be generated with the same check level as that specified in the named configuration file. This statement sets the masterfile-format for all zones, but can be overridden on a per-zone or per-view basis by including a masterfile-format statement within the zone or view block in the configuration file. clients-per-query max-clients-per-query These set the initial value (minimum) and maximum number of recursive simultaneous clients for any given query (<qname,qtype,qclass>) that the server will accept before dropping additional clients. named will attempt to self tune this value and changes will be logged. The default values are 10 and 100. This value should reflect how many queries come in for a given name in the time it takes to resolve that name. If the number of queries exceed this value, named will assume that it is dealing with a non-responsive zone and will drop additional queries. If it gets a response after dropping queries, it will raise the estimate. The estimate will then be lowered in 20 minutes if it has remained unchanged. If clients-per-query is set to zero, then there is no limit on the number of clients per query and no queries will be dropped. If max-clients-per-query is set to zero, then there is no upper bound other than imposed by recursive-clients. notify-delay The delay, in seconds, between sending sets of notify messages for a zone. The default is five (5) seconds. The overall rate that NOTIFY messages are sent for all zones is controlled by serial-query-rate. max-rsa-exponent-size The maximum RSA exponent size, in bits, that will be accepted when validating. Valid values are 35 to 4096 bits. The default zero (0) is also accepted and is equivalent to 4096. Built-in server information zones The server provides some helpful diagnostic information through a number of built-in zones under the pseudo-top-level-domain bind in the CHAOS class. These zones are part of a built-in view (see ) of class CHAOS which is separate from the default view of class IN. Most global configuration options (allow-query, etc) will apply to this view, but some are locally overridden: notify, recursion and allow-new-zones are always set to no. If you need to disable these zones, use the options below, or hide the built-in CHAOS view by defining an explicit view of class CHAOS that matches all clients. version The version the server should report via a query of the name version.bind with type TXT, class CHAOS. The default is the real version number of this server. Specifying version none disables processing of the queries. hostname The hostname the server should report via a query of the name hostname.bind with type TXT, class CHAOS. This defaults to the hostname of the machine hosting the name server as found by the gethostname() function. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying hostname none; disables processing of the queries. server-id The ID the server should report when receiving a Name Server Identifier (NSID) query, or a query of the name ID.SERVER with type TXT, class CHAOS. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying server-id none; disables processing of the queries. Specifying server-id hostname; will cause named to use the hostname as found by the gethostname() function. The default server-id is none. Built-in Empty Zones Named has some built-in empty zones (SOA and NS records only). These are for zones that should normally be answered locally and which queries should not be sent to the Internet's root servers. The official servers which cover these namespaces return NXDOMAIN responses to these queries. In particular, these cover the reverse namespaces for addresses from RFC 1918, RFC 4193, RFC 5737 and RFC 6598. They also include the reverse namespace for IPv6 local address (locally assigned), IPv6 link local addresses, the IPv6 loopback address and the IPv6 unknown address. Named will attempt to determine if a built-in zone already exists or is active (covered by a forward-only forwarding declaration) and will not create an empty zone in that case. The current list of empty zones is: 10.IN-ADDR.ARPA 16.172.IN-ADDR.ARPA 17.172.IN-ADDR.ARPA 18.172.IN-ADDR.ARPA 19.172.IN-ADDR.ARPA 20.172.IN-ADDR.ARPA 21.172.IN-ADDR.ARPA 22.172.IN-ADDR.ARPA 23.172.IN-ADDR.ARPA 24.172.IN-ADDR.ARPA 25.172.IN-ADDR.ARPA 26.172.IN-ADDR.ARPA 27.172.IN-ADDR.ARPA 28.172.IN-ADDR.ARPA 29.172.IN-ADDR.ARPA 30.172.IN-ADDR.ARPA 31.172.IN-ADDR.ARPA 168.192.IN-ADDR.ARPA 64.100.IN-ADDR.ARPA 65.100.IN-ADDR.ARPA 66.100.IN-ADDR.ARPA 67.100.IN-ADDR.ARPA 68.100.IN-ADDR.ARPA 69.100.IN-ADDR.ARPA 70.100.IN-ADDR.ARPA 71.100.IN-ADDR.ARPA 72.100.IN-ADDR.ARPA 73.100.IN-ADDR.ARPA 74.100.IN-ADDR.ARPA 75.100.IN-ADDR.ARPA 76.100.IN-ADDR.ARPA 77.100.IN-ADDR.ARPA 78.100.IN-ADDR.ARPA 79.100.IN-ADDR.ARPA 80.100.IN-ADDR.ARPA 81.100.IN-ADDR.ARPA 82.100.IN-ADDR.ARPA 83.100.IN-ADDR.ARPA 84.100.IN-ADDR.ARPA 85.100.IN-ADDR.ARPA 86.100.IN-ADDR.ARPA 87.100.IN-ADDR.ARPA 88.100.IN-ADDR.ARPA 89.100.IN-ADDR.ARPA 90.100.IN-ADDR.ARPA 91.100.IN-ADDR.ARPA 92.100.IN-ADDR.ARPA 93.100.IN-ADDR.ARPA 94.100.IN-ADDR.ARPA 95.100.IN-ADDR.ARPA 96.100.IN-ADDR.ARPA 97.100.IN-ADDR.ARPA 98.100.IN-ADDR.ARPA 99.100.IN-ADDR.ARPA 100.100.IN-ADDR.ARPA 101.100.IN-ADDR.ARPA 102.100.IN-ADDR.ARPA 103.100.IN-ADDR.ARPA 104.100.IN-ADDR.ARPA 105.100.IN-ADDR.ARPA 106.100.IN-ADDR.ARPA 107.100.IN-ADDR.ARPA 108.100.IN-ADDR.ARPA 109.100.IN-ADDR.ARPA 110.100.IN-ADDR.ARPA 111.100.IN-ADDR.ARPA 112.100.IN-ADDR.ARPA 113.100.IN-ADDR.ARPA 114.100.IN-ADDR.ARPA 115.100.IN-ADDR.ARPA 116.100.IN-ADDR.ARPA 117.100.IN-ADDR.ARPA 118.100.IN-ADDR.ARPA 119.100.IN-ADDR.ARPA 120.100.IN-ADDR.ARPA 121.100.IN-ADDR.ARPA 122.100.IN-ADDR.ARPA 123.100.IN-ADDR.ARPA 124.100.IN-ADDR.ARPA 125.100.IN-ADDR.ARPA 126.100.IN-ADDR.ARPA 127.100.IN-ADDR.ARPA 0.IN-ADDR.ARPA 127.IN-ADDR.ARPA 254.169.IN-ADDR.ARPA 2.0.192.IN-ADDR.ARPA 100.51.198.IN-ADDR.ARPA 113.0.203.IN-ADDR.ARPA 255.255.255.255.IN-ADDR.ARPA 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA 8.B.D.0.1.0.0.2.IP6.ARPA D.F.IP6.ARPA 8.E.F.IP6.ARPA 9.E.F.IP6.ARPA A.E.F.IP6.ARPA B.E.F.IP6.ARPA Empty zones are settable at the view level and only apply to views of class IN. Disabled empty zones are only inherited from options if there are no disabled empty zones specified at the view level. To override the options list of disabled zones, you can disable the root zone at the view level, for example: disable-empty-zone "."; If you are using the address ranges covered here, you should already have reverse zones covering the addresses you use. In practice this appears to not be the case with many queries being made to the infrastructure servers for names in these spaces. So many in fact that sacrificial servers were needed to be deployed to channel the query load away from the infrastructure servers. The real parent servers for these zones should disable all empty zone under the parent zone they serve. For the real root servers, this is all built-in empty zones. This will enable them to return referrals to deeper in the tree. empty-server Specify what server name will appear in the returned SOA record for empty zones. If none is specified, then the zone's name will be used. empty-contact Specify what contact name will appear in the returned SOA record for empty zones. If none is specified, then "." will be used. empty-zones-enable Enable or disable all empty zones. By default, they are enabled. disable-empty-zone Disable individual empty zones. By default, none are disabled. This option can be specified multiple times. Additional Section Caching The additional section cache, also called acache, is an internal cache to improve the response performance of BIND 9. When additional section caching is enabled, BIND 9 will cache an internal short-cut to the additional section content for each answer RR. Note that acache is an internal caching mechanism of BIND 9, and is not related to the DNS caching server function. Additional section caching does not change the response content (except the RRsets ordering of the additional section, see below), but can improve the response performance significantly. It is particularly effective when BIND 9 acts as an authoritative server for a zone that has many delegations with many glue RRs. In order to obtain the maximum performance improvement from additional section caching, setting additional-from-cache to no is recommended, since the current implementation of acache does not short-cut of additional section information from the DNS cache data. One obvious disadvantage of acache is that it requires much more memory for the internal cached data. Thus, if the response performance does not matter and memory consumption is much more critical, the acache mechanism can be disabled by setting acache-enable to no. It is also possible to specify the upper limit of memory consumption for acache by using max-acache-size. Additional section caching also has a minor effect on the RRset ordering in the additional section. Without acache, cyclic order is effective for the additional section as well as the answer and authority sections. However, additional section caching fixes the ordering when it first caches an RRset for the additional section, and the same ordering will be kept in succeeding responses, regardless of the setting of rrset-order. The effect of this should be minor, however, since an RRset in the additional section typically only contains a small number of RRs (and in many cases it only contains a single RR), in which case the ordering does not matter much. The following is a summary of options related to acache. acache-enable If yes, additional section caching is enabled. The default value is no. acache-cleaning-interval The server will remove stale cache entries, based on an LRU based algorithm, every acache-cleaning-interval minutes. The default is 60 minutes. If set to 0, no periodic cleaning will occur. max-acache-size The maximum amount of memory in bytes to use for the server's acache. When the amount of data in the acache reaches this limit, the server will clean more aggressively so that the limit is not exceeded. In a server with multiple views, the limit applies separately to the acache of each view. The default is 16M. Content Filtering BIND 9 provides the ability to filter out DNS responses from external DNS servers containing certain types of data in the answer section. Specifically, it can reject address (A or AAAA) records if the corresponding IPv4 or IPv6 addresses match the given address_match_list of the deny-answer-addresses option. It can also reject CNAME or DNAME records if the "alias" name (i.e., the CNAME alias or the substituted query name due to DNAME) matches the given namelist of the deny-answer-aliases option, where "match" means the alias name is a subdomain of one of the name_list elements. If the optional namelist is specified with except-from, records whose query name matches the list will be accepted regardless of the filter setting. Likewise, if the alias name is a subdomain of the corresponding zone, the deny-answer-aliases filter will not apply; for example, even if "example.com" is specified for deny-answer-aliases, www.example.com. CNAME xxx.example.com. returned by an "example.com" server will be accepted. In the address_match_list of the deny-answer-addresses option, only ip_addr and ip_prefix are meaningful; any key_id will be silently ignored. If a response message is rejected due to the filtering, the entire message is discarded without being cached, and a SERVFAIL error will be returned to the client. This filtering is intended to prevent "DNS rebinding attacks," in which an attacker, in response to a query for a domain name the attacker controls, returns an IP address within your own network or an alias name within your own domain. A naive web browser or script could then serve as an unintended proxy, allowing the attacker to get access to an internal node of your local network that couldn't be externally accessed otherwise. See the paper available at http://portal.acm.org/citation.cfm?id=1315245.1315298 for more details about the attacks. For example, if you own a domain named "example.net" and your internal network uses an IPv4 prefix 192.0.2.0/24, you might specify the following rules: deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; }; deny-answer-aliases { "example.net"; }; If an external attacker lets a web browser in your local network look up an IPv4 address of "attacker.example.com", the attacker's DNS server would return a response like this: attacker.example.com. A 192.0.2.1 in the answer section. Since the rdata of this record (the IPv4 address) matches the specified prefix 192.0.2.0/24, this response will be ignored. On the other hand, if the browser looks up a legitimate internal web server "www.example.net" and the following response is returned to the BIND 9 server www.example.net. A 192.0.2.2 it will be accepted since the owner name "www.example.net" matches the except-from element, "example.net". Note that this is not really an attack on the DNS per se. In fact, there is nothing wrong for an "external" name to be mapped to your "internal" IP address or domain name from the DNS point of view. It might actually be provided for a legitimate purpose, such as for debugging. As long as the mapping is provided by the correct owner, it is not possible or does not make sense to detect whether the intent of the mapping is legitimate or not within the DNS. The "rebinding" attack must primarily be protected at the application that uses the DNS. For a large site, however, it may be difficult to protect all possible applications at once. This filtering feature is provided only to help such an operational environment; it is generally discouraged to turn it on unless you are very sure you have no other choice and the attack is a real threat for your applications. Care should be particularly taken if you want to use this option for addresses within 127.0.0.0/8. These addresses are obviously "internal", but many applications conventionally rely on a DNS mapping from some name to such an address. Filtering out DNS records containing this address spuriously can break such applications. Response Policy Zone (RPZ) Rewriting BIND 9 includes a limited mechanism to modify DNS responses for requests analogous to email anti-spam DNS blacklists. Responses can be changed to deny the existence of domains(NXDOMAIN), deny the existence of IP addresses for domains (NODATA), or contain other IP addresses or data. Response policy zones are named in the response-policy option for the view or among the global options if there is no response-policy option for the view. RPZs are ordinary DNS zones containing RRsets that can be queried normally if allowed. It is usually best to restrict those queries with something like allow-query { localhost; };. Four policy triggers are encoded in RPZ records, QNAME, IP, NSIP, and NSDNAME. QNAME RPZ records triggered by query names of requests and targets of CNAME records resolved to generate the response. The owner name of a QNAME RPZ record is the query name relativized to the RPZ. The second kind of RPZ trigger is an IP address in an A and AAAA record in the ANSWER section of a response. IP address triggers are encoded in records that have owner names that are subdomains of rpz-ip relativized to the RPZ origin name and encode an IP address or address block. IPv4 trigger addresses are represented as prefixlength.B4.B3.B2.B1.rpz-ip. The prefix length must be between 1 and 32. All four bytes, B4, B3, B2, and B1, must be present. B4 is the decimal value of the least significant byte of the IPv4 address as in IN-ADDR.ARPA. IPv6 addresses are encoded in a format similar to the standard IPv6 text representation, prefixlength.W8.W7.W6.W5.W4.W3.W2.W1.rpz-ip. Each of W8,...,W1 is a one to four digit hexadecimal number representing 16 bits of the IPv6 address as in the standard text representation of IPv6 addresses, but reversed as in IN-ADDR.ARPA. All 8 words must be present except when consecutive zero words are replaced with .zz. analogous to double colons (::) in standard IPv6 text encodings. The prefix length must be between 1 and 128. NSDNAME triggers match names of authoritative servers for the query name, a parent of the query name, a CNAME for query name, or a parent of a CNAME. They are encoded as subdomains of rpz-nsdomain relativized to the RPZ origin name. NSIP triggers match IP addresses in A and AAAA RRsets for domains that can be checked against NSDNAME policy records. NSIP triggers are encoded like IP triggers except as subdomains of rpz-nsip. NSDNAME and NSIP triggers are checked only for names with at least min-ns-dots dots. The default value of min-ns-dots is 1 to exclude top level domains. The query response is checked against all RPZs, so two or more policy records can be triggered by a response. Because DNS responses can be rewritten according to at most one policy record, a single record encoding an action (other than DISABLED actions) must be chosen. Triggers or the records that encode them are chosen in the following order: Choose the triggered record in the zone that appears first in the response-policy option. Prefer QNAME to IP to NSDNAME to NSIP triggers in a single zone. Among NSDNAME triggers, prefer the trigger that matches the smallest name under the DNSSEC ordering. Among IP or NSIP triggers, prefer the trigger with the longest prefix. Among triggers with the same prefex length, prefer the IP or NSIP trigger that matches the smallest IP address. When the processing of a response is restarted to resolve DNAME or CNAME records and a policy record set has not been triggered, all RPZs are again consulted for the DNAME or CNAME names and addresses. RPZ record sets are sets of any types of DNS record except DNAME or DNSSEC that encode actions or responses to queries. The NXDOMAIN response is encoded by a CNAME whose target is the root domain (.) A CNAME whose target is the wildcard top-level domain (*.) specifies the NODATA action, which rewrites the response to NODATA or ANCOUNT=1. The Local Data action is represented by a set ordinary DNS records that are used to answer queries. Queries for record types not the set are answered with NODATA. A special form of local data is a CNAME whose target is a wildcard such as *.example.com. It is used as if were an ordinary CNAME after the astrisk (*) has been replaced with the query name. The purpose for this special form is query logging in the walled garden's authority DNS server. The PASSTHRU policy is specified by a CNAME whose target is rpz-passthru. It causes the response to not be rewritten and is most often used to "poke holes" in policies for CIDR blocks. (A CNAME whose target is the variable part of its owner name is an obsolete specification of the PASSTHRU policy.) The actions specified in an RPZ can be overridden with a policy clause in the response-policy option. An organization using an RPZ provided by another organization might use this mechanism to redirect domains to its own walled garden. GIVEN says "do not override but perform the action specified in the zone." DISABLED causes policy records to do nothing but log what they might have done. The response to the DNS query will be written according to any triggered policy records that are not disabled. Disabled policy zones should appear first, because they will often not be logged if a higher precedence trigger is found first. PASSTHRU causes all policy records to act as if they were CNAME records with targets the variable part of their owner name. They protect the response from being changed. NXDOMAIN causes all RPZ records to specify NXDOMAIN policies. NODATA overrides with the NODATA policy CNAME domain causes all RPZ policy records to act as if they were "cname domain" records. By default, the actions encoded in an RPZ are applied only to queries that ask for recursion (RD=1). That default can be changed for a single RPZ or all RPZs in a view with a recursive-only no clause. This feature is useful for serving the same zone files both inside and outside an RFC 1918 cloud and using RPZ to delete answers that would otherwise contain RFC 1918 values on the externally visible name server or view. Also by default, RPZ actions are applied only to DNS requests that either do not request DNSSEC metadata (DO=0) or when no DNSSEC records are available for request name in the original zone (not the response policy zone). This default can be changed for all RPZs in a view with a break-dnssec yes clause. In that case, RPZ actions are applied regardless of DNSSEC. The name of the clause option reflects the fact that results rewritten by RPZ actions cannot verify. The TTL of a record modified by RPZ policies is set from the TTL of the relevant record in policy zone. It is then limited to a maximum value. The max-policy-ttl clause changes that maximum from its default of 5. For example, you might use this option statement response-policy { zone "badlist"; }; and this zone statement zone "badlist" {type master; file "master/badlist"; allow-query {none;}; }; with this zone file $TTL 1H @ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h) NS LOCALHOST. ; QNAME policy records. There are no periods (.) after the owner names. nxdomain.domain.com CNAME . ; NXDOMAIN policy nodata.domain.com CNAME *. ; NODATA policy bad.domain.com A 10.0.0.1 ; redirect to a walled garden AAAA 2001:2::1 ; do not rewrite (PASSTHRU) OK.DOMAIN.COM ok.domain.com CNAME rpz-passthru. bzone.domain.com CNAME garden.example.com. ; redirect x.bzone.domain.com to x.bzone.domain.com.garden.example.com *.bzone.domain.com CNAME *.garden.example.com. ; IP policy records that rewrite all answers for 127/8 except 127.0.0.1 8.0.0.0.127.rpz-ip CNAME . 32.1.0.0.127.rpz-ip CNAME rpz-passthru. ; NSDNAME and NSIP policy records ns.domain.com.rpz-nsdname CNAME . 48.zz.2.2001.rpz-nsip CNAME . RPZ can affect server performance. Each configured response policy zone requires the server to perform one to four additional database lookups before a query can be answered. For example, a DNS server with four policy zones, each with all four kinds of response triggers, QNAME, IP, NSIP, and NSDNAME, requires a total of 17 times as many database lookups as a similar DNS server with no response policy zones. A BIND9 server with adequate memory and one response policy zone with QNAME and IP triggers might achieve a maximum queries-per-second rate about 20% lower. A server with four response policy zones with QNAME and IP triggers might have a maximum QPS rate about 50% lower. Responses rewritten by RPZ are counted in the RPZRewrites statistics. Response Rate Limiting This feature is only available when BIND 9 is compiled with the --enable-rrl option on the "configure" command line. Excessive almost identical UDP responses can be controlled by configuring a rate-limit clause in an options or view statement. This mechanism keeps authoritative BIND 9 from being used in amplifying reflection denial of service (DoS) attacks. Short truncated (TC=1) responses can be sent to provide rate-limited responses to legitimate clients within a range of forged, attacked IP addresses. Legitimate clients react to dropped or truncated response by retrying with UDP or with TCP respectively. This mechanism is intended for authoritative DNS servers. It can be used on recursive servers but can slow applications such as SMTP servers (mail receivers) and HTTP clients (web browsers) that repeatedly request the same domains. When possible, closing "open" recursive servers is better. Response rate limiting uses a "credit" or "token bucket" scheme. Each combination of identical response and client has a conceptual account that earns a specified number of credits every second. A prospective response debits its account by one. Responses are dropped or truncated while the account is negative. Responses are tracked within a rolling window of time which defaults to 15 seconds, but can be configured with the window option to any value from 1 to 3600 seconds (1 hour). The account cannot become more positive than the per-second limit or more negative than window times the per-second limit. When the specified number of credits for a class of responses is set to 0, those responses are not rate limited. The notions of "identical response" and "DNS client" for rate limiting are not simplistic. All responses to an address block are counted as if to a single client. The prefix lengths of addresses blocks are specified with ipv4-prefix-length (default 24) and ipv6-prefix-length (default 56). All non-empty responses for a valid domain name (qname) and record type (qtype) are identical and have a limit specified with responses-per-second (default 0 or no limit). All empty (NODATA) responses for a valid domain, regardless of query type, are identical. Responses in the NODATA class are limited by nodata-per-second (default responses-per-second). Requests for any and all undefined subdomains of a given valid domain result in NXDOMAIN errors, and are identical regardless of query type. They are limited by nxdomain-per-second (default responses-per-second). This controls some attacks using random names, but can be relaxed or turned off (set to 0) on servers that expect many legitimate NXDOMAIN responses, such as from anti-spam blacklists. Referrals or delegations to the server of a given domain are identical and are limited by referrals-per-second (default responses-per-second). Responses generated from local wildcards are counted and limited as if they were for the parent domain name. This controls flooding using random.wild.example.com. All requests that result in DNS errors other than NXDOMAIN, such as SERVFAIL and FORMERR, are identical regardless of requested name (qname) or record type (qtype). This controls attacks using invalid requests or distant, broken authoritative servers. By default the limit on errors is the same as the responses-per-second value, but it can be set separately with errors-per-second. Many attacks using DNS involve UDP requests with forged source addresses. Rate limiting prevents the use of BIND 9 to flood a network with responses to requests with forged source addresses, but could let a third party block responses to legitimate requests. There is a mechanism that can answer some legitimate requests from a client whose address is being forged in a flood. Setting slip to 2 (its default) causes every other UDP request to be answered with a small truncated (TC=1) response. The small size and reduced frequency, and so lack of amplification, of "slipped" responses make them unattractive for reflection DoS attacks. slip must be between 0 and 10. A value of 0 does not "slip": no truncated responses are sent due to rate limiting, all responses are dropped. A value of 1 causes every response to slip; values between 2 and 10 cause every n'th response to slip. Some error responses including REFUSED and SERVFAIL cannot be replaced with truncated responses and are instead leaked at the slip rate. (NOTE: Dropped responses from an authoritative server may reduce the difficulty of a third party successfully forging a response to a recursive resolver. The best security against forged responses is for authoritative operators to sign their zones using DNSSEC and for resolver operators to validate the responses. When this is not an option, operators who are more concerned with response integrity than with flood mitigation may consider setting slip to 1, causing all rate-limited responses to be truncated rather than dropped. This reduces the effectiveness of rate-limiting against reflection attacks.) When the approximate query per second rate exceeds the qps-scale value, then the responses-per-second, errors-per-second, nxdomains-per-second and all-per-second values are reduced by the ratio of the current rate to the qps-scale value. This feature can tighten defenses during attacks. For example, with qps-scale 250; responses-per-second 20; and a total query rate of 1000 queries/second for all queries from all DNS clients including via TCP, then the effective responses/second limit changes to (250/1000)*20 or 5. Responses sent via TCP are not limited but are counted to compute the query per second rate. Communities of DNS clients can be given their own parameters or no rate limiting by putting rate-limit statements in view statements instead of the global option statement. A rate-limit statement in a view replaces, rather than supplementing, a rate-limit statement among the main options. DNS clients within a view can be exempted from rate limits with the exempt-clients clause. UDP responses of all kinds can be limited with the all-per-second phrase. This rate limiting is unlike the rate limiting provided by responses-per-second, errors-per-second, and nxdomains-per-second on a DNS server which are often invisible to the victim of a DNS reflection attack. Unless the forged requests of the attack are the same as the legitimate requests of the victim, the victim's requests are not affected. Responses affected by an all-per-second limit are always dropped; the slip value has no effect. An all-per-second limit should be at least 4 times as large as the other limits, because single DNS clients often send bursts of legitimate requests. For example, the receipt of a single mail message can prompt requests from an SMTP server for NS, PTR, A, and AAAA records as the incoming SMTP/TCP/IP connection is considered. The SMTP server can need additional NS, A, AAAA, MX, TXT, and SPF records as it considers the STMP Mail From command. Web browsers often repeatedly resolve the same names that are repeated in HTML <IMG> tags in a page. All-per-second is similar to the rate limiting offered by firewalls but often inferior. Attacks that justify ignoring the contents of DNS responses are likely to be attacks on the DNS server itself. They usually should be discarded before the DNS server spends resources making TCP connections or parsing DNS requests, but that rate limiting must be done before the DNS server sees the requests. The maximum size of the table used to track requests and rate limit responses is set with max-table-size. Each entry in the table is between 40 and 80 bytes. The table needs approximately as many entries as the number of requests received per second. The default is 20,000. To reduce the cold start of growing the table, min-table-size (default 500) can set the minimum table size. Enable rate-limit category logging to monitor expansions of the table and inform choices for the initial and maximum table size. Use log-only yes to test rate limiting parameters without actually dropping any requests. Responses dropped by rate limits are included in the RateDropped and QryDropped statistics. Responses that truncated by rate limits are included in RateSlipped and RespTruncated. <command>server</command> Statement Grammar server ip_addr[/prefixlen] { bogus yes_or_no ; provide-ixfr yes_or_no ; request-ixfr yes_or_no ; edns yes_or_no ; edns-udp-size number ; max-udp-size number ; transfers number ; transfer-format ( one-answer | many-answers ) ; ] keys { string ; string ; ... } ; transfer-source (ip4_addr | *) port ip_port ; transfer-source-v6 (ip6_addr | *) port ip_port ; notify-source (ip4_addr | *) port ip_port ; notify-source-v6 (ip6_addr | *) port ip_port ; query-source address ( ip_addr | * ) port ( ip_port | * ) ; query-source-v6 address ( ip_addr | * ) port ( ip_port | * ) ; use-queryport-pool yes_or_no; queryport-pool-ports number; queryport-pool-updateinterval number; }; <command>server</command> Statement Definition and Usage The server statement defines characteristics to be associated with a remote name server. If a prefix length is specified, then a range of servers is covered. Only the most specific server clause applies regardless of the order in named.conf. The server statement can occur at the top level of the configuration file or inside a view statement. If a view statement contains one or more server statements, only those apply to the view and any top-level ones are ignored. If a view contains no server statements, any top-level server statements are used as defaults. If you discover that a remote server is giving out bad data, marking it as bogus will prevent further queries to it. The default value of bogus is no. The provide-ixfr clause determines whether the local server, acting as master, will respond with an incremental zone transfer when the given remote server, a slave, requests it. If set to yes, incremental transfer will be provided whenever possible. If set to no, all transfers to the remote server will be non-incremental. If not set, the value of the provide-ixfr option in the view or global options block is used as a default. The request-ixfr clause determines whether the local server, acting as a slave, will request incremental zone transfers from the given remote server, a master. If not set, the value of the request-ixfr option in the view or global options block is used as a default. It may also be set in the zone block and, if set there, it will override the global or view setting for that zone. IXFR requests to servers that do not support IXFR will automatically fall back to AXFR. Therefore, there is no need to manually list which servers support IXFR and which ones do not; the global default of yes should always work. The purpose of the provide-ixfr and request-ixfr clauses is to make it possible to disable the use of IXFR even when both master and slave claim to support it, for example if one of the servers is buggy and crashes or corrupts data when IXFR is used. The edns clause determines whether the local server will attempt to use EDNS when communicating with the remote server. The default is yes. The edns-udp-size option sets the EDNS UDP size that is advertised by named when querying the remote server. Valid values are 512 to 4096 bytes (values outside this range will be silently adjusted). This option is useful when you wish to advertises a different value to this server than the value you advertise globally, for example, when there is a firewall at the remote site that is blocking large replies. The max-udp-size option sets the maximum EDNS UDP message size named will send. Valid values are 512 to 4096 bytes (values outside this range will be silently adjusted). This option is useful when you know that there is a firewall that is blocking large replies from named. The server supports two zone transfer methods. The first, one-answer, uses one DNS message per resource record transferred. many-answers packs as many resource records as possible into a message. many-answers is more efficient, but is only known to be understood by BIND 9, BIND 8.x, and patched versions of BIND 4.9.5. You can specify which method to use for a server with the transfer-format option. If transfer-format is not specified, the transfer-format specified by the options statement will be used. transfers is used to limit the number of concurrent inbound zone transfers from the specified server. If no transfers clause is specified, the limit is set according to the transfers-per-ns option. The keys clause identifies a key_id defined by the key statement, to be used for transaction security (TSIG, ) when talking to the remote server. When a request is sent to the remote server, a request signature will be generated using the key specified here and appended to the message. A request originating from the remote server is not required to be signed by this key. Although the grammar of the keys clause allows for multiple keys, only a single key per server is currently supported. The transfer-source and transfer-source-v6 clauses specify the IPv4 and IPv6 source address to be used for zone transfer with the remote server, respectively. For an IPv4 remote server, only transfer-source can be specified. Similarly, for an IPv6 remote server, only transfer-source-v6 can be specified. For more details, see the description of transfer-source and transfer-source-v6 in . The notify-source and notify-source-v6 clauses specify the IPv4 and IPv6 source address to be used for notify messages sent to remote servers, respectively. For an IPv4 remote server, only notify-source can be specified. Similarly, for an IPv6 remote server, only notify-source-v6 can be specified. The query-source and query-source-v6 clauses specify the IPv4 and IPv6 source address to be used for queries sent to remote servers, respectively. For an IPv4 remote server, only query-source can be specified. Similarly, for an IPv6 remote server, only query-source-v6 can be specified. <command>statistics-channels</command> Statement Grammar statistics-channels { [ inet ( ip_addr | * ) [ port ip_port ] [ allow { address_match_list } ]; ] [ inet ...; ] }; <command>statistics-channels</command> Statement Definition and Usage The statistics-channels statement declares communication channels to be used by system administrators to get access to statistics information of the name server. This statement intends to be flexible to support multiple communication protocols in the future, but currently only HTTP access is supported. It requires that BIND 9 be compiled with libxml2; the statistics-channels statement is still accepted even if it is built without the library, but any HTTP access will fail with an error. An inet control channel is a TCP socket listening at the specified ip_port on the specified ip_addr, which can be an IPv4 or IPv6 address. An ip_addr of * (asterisk) is interpreted as the IPv4 wildcard address; connections will be accepted on any of the system's IPv4 addresses. To listen on the IPv6 wildcard address, use an ip_addr of ::. If no port is specified, port 80 is used for HTTP channels. The asterisk "*" cannot be used for ip_port. The attempt of opening a statistics channel is restricted by the optional allow clause. Connections to the statistics channel are permitted based on the address_match_list. If no allow clause is present, named accepts connection attempts from any address; since the statistics may contain sensitive internal information, it is highly recommended to restrict the source of connection requests appropriately. If no statistics-channels statement is present, named will not open any communication channels. If the statistics channel is configured to listen on 127.0.0.1 port 8888, then the statistics are accessible in XML format at http://127.0.0.1:8888/ or http://127.0.0.1:8888/xml. A CSS file is included which can format the XML statistics into tables when viewed with a stylesheet-capable browser. When BIND 9 is configured with --enable-newstats, a new XML schema is used (version 3) which adds additional zone statistics and uses a flatter tree for more efficient parsing. The stylesheet included uses the Google Charts API to render data into into charts and graphs when using a javascript-capable browser. Applications that depend on a particular XML schema can request http://127.0.0.1:8888/xml/v2 for version 2 of the statistics XML schema or http://127.0.0.1:8888/xml/v3 for version 3. If the requested schema is supported by the server, then it will respond; if not, it will return a "page not found" error. <command>trusted-keys</command> Statement Grammar trusted-keys { string number number number string ; string number number number string ; ... }; <command>trusted-keys</command> Statement Definition and Usage The trusted-keys statement defines DNSSEC security roots. DNSSEC is described in . A security root is defined when the public key for a non-authoritative zone is known, but cannot be securely obtained through DNS, either because it is the DNS root zone or because its parent zone is unsigned. Once a key has been configured as a trusted key, it is treated as if it had been validated and proven secure. The resolver attempts DNSSEC validation on all DNS data in subdomains of a security root. All keys (and corresponding zones) listed in trusted-keys are deemed to exist regardless of what parent zones say. Similarly for all keys listed in trusted-keys only those keys are used to validate the DNSKEY RRset. The parent's DS RRset will not be used. The trusted-keys statement can contain multiple key entries, each consisting of the key's domain name, flags, protocol, algorithm, and the Base-64 representation of the key data. Spaces, tabs, newlines and carriage returns are ignored in the key data, so the configuration may be split up into multiple lines. trusted-keys may be set at the top level of named.conf or within a view. If it is set in both places, they are additive: keys defined at the top level are inherited by all views, but keys defined in a view are only used within that view. <command>managed-keys</command> Statement Grammar managed-keys { name initial-key flags protocol algorithm key-data ; name initial-key flags protocol algorithm key-data ; ... }; <command>managed-keys</command> Statement Definition and Usage The managed-keys statement, like trusted-keys, defines DNSSEC security roots. The difference is that managed-keys can be kept up to date automatically, without intervention from the resolver operator. Suppose, for example, that a zone's key-signing key was compromised, and the zone owner had to revoke and replace the key. A resolver which had the old key in a trusted-keys statement would be unable to validate this zone any longer; it would reply with a SERVFAIL response code. This would continue until the resolver operator had updated the trusted-keys statement with the new key. If, however, the zone were listed in a managed-keys statement instead, then the zone owner could add a "stand-by" key to the zone in advance. named would store the stand-by key, and when the original key was revoked, named would be able to transition smoothly to the new key. It would also recognize that the old key had been revoked, and cease using that key to validate answers, minimizing the damage that the compromised key could do. A managed-keys statement contains a list of the keys to be managed, along with information about how the keys are to be initialized for the first time. The only initialization method currently supported (as of BIND 9.7.0) is initial-key. This means the managed-keys statement must contain a copy of the initializing key. (Future releases may allow keys to be initialized by other methods, eliminating this requirement.) Consequently, a managed-keys statement appears similar to a trusted-keys, differing in the presence of the second field, containing the keyword initial-key. The difference is, whereas the keys listed in a trusted-keys continue to be trusted until they are removed from named.conf, an initializing key listed in a managed-keys statement is only trusted once: for as long as it takes to load the managed key database and start the RFC 5011 key maintenance process. The first time named runs with a managed key configured in named.conf, it fetches the DNSKEY RRset directly from the zone apex, and validates it using the key specified in the managed-keys statement. If the DNSKEY RRset is validly signed, then it is used as the basis for a new managed keys database. From that point on, whenever named runs, it sees the managed-keys statement, checks to make sure RFC 5011 key maintenance has already been initialized for the specified domain, and if so, it simply moves on. The key specified in the managed-keys is not used to validate answers; it has been superseded by the key or keys stored in the managed keys database. The next time named runs after a name has been removed from the managed-keys statement, the corresponding zone will be removed from the managed keys database, and RFC 5011 key maintenance will no longer be used for that domain. named only maintains a single managed keys database; consequently, unlike trusted-keys, managed-keys may only be set at the top level of named.conf, not within a view. In the current implementation, the managed keys database is stored as a master-format zone file called managed-keys.bind. When the key database is changed, the zone is updated. As with any other dynamic zone, changes will be written into a journal file, managed-keys.bind.jnl. They are committed to the master file as soon as possible afterward; in the case of the managed key database, this will usually occur within 30 seconds. So, whenever named is using automatic key maintenance, those two files can be expected to exist in the working directory. (For this reason among others, the working directory should be always be writable by named.) If the dnssec-validation option is set to auto, named will automatically initialize a managed key for the root zone. Similarly, if the dnssec-lookaside option is set to auto, named will automatically initialize a managed key for the zone dlv.isc.org. In both cases, the key that is used to initialize the key maintenance process is built into named, and can be overridden from bindkeys-file. <command>view</command> Statement Grammar view view_name class { match-clients { address_match_list }; match-destinations { address_match_list }; match-recursive-only yes_or_no ; view_option; ... zone_statement; ... }; <command>view</command> Statement Definition and Usage The view statement is a powerful feature of BIND 9 that lets a name server answer a DNS query differently depending on who is asking. It is particularly useful for implementing split DNS setups without having to run multiple servers. Each view statement defines a view of the DNS namespace that will be seen by a subset of clients. A client matches a view if its source IP address matches the address_match_list of the view's match-clients clause and its destination IP address matches the address_match_list of the view's match-destinations clause. If not specified, both match-clients and match-destinations default to matching all addresses. In addition to checking IP addresses match-clients and match-destinations can also take keys which provide an mechanism for the client to select the view. A view can also be specified as match-recursive-only, which means that only recursive requests from matching clients will match that view. The order of the view statements is significant — a client request will be resolved in the context of the first view that it matches. Zones defined within a view statement will only be accessible to clients that match the view. By defining a zone of the same name in multiple views, different zone data can be given to different clients, for example, "internal" and "external" clients in a split DNS setup. Many of the options given in the options statement can also be used within a view statement, and then apply only when resolving queries with that view. When no view-specific value is given, the value in the options statement is used as a default. Also, zone options can have default values specified in the view statement; these view-specific defaults take precedence over those in the options statement. Views are class specific. If no class is given, class IN is assumed. Note that all non-IN views must contain a hint zone, since only the IN class has compiled-in default hints. If there are no view statements in the config file, a default view that matches any client is automatically created in class IN. Any zone statements specified on the top level of the configuration file are considered to be part of this default view, and the options statement will apply to the default view. If any explicit view statements are present, all zone statements must occur inside view statements. Here is an example of a typical split DNS setup implemented using view statements: view "internal" { // This should match our internal networks. match-clients { 10.0.0.0/8; }; // Provide recursive service to internal // clients only. recursion yes; // Provide a complete view of the example.com // zone including addresses of internal hosts. zone "example.com" { type master; file "example-internal.db"; }; }; view "external" { // Match all clients not matched by the // previous view. match-clients { any; }; // Refuse recursive service to external clients. recursion no; // Provide a restricted view of the example.com // zone containing only publicly accessible hosts. zone "example.com" { type master; file "example-external.db"; }; }; <command>zone</command> Statement Grammar zone zone_name class { type master; allow-query { address_match_list }; allow-query-on { address_match_list }; allow-transfer { address_match_list }; allow-update { address_match_list }; update-check-ksk yes_or_no; dnssec-dnskey-kskonly yes_or_no; dnssec-loadkeys-interval number; update-policy local | { update_policy_rule ... }; also-notify { ip_addr port ip_port ; ip_addr port ip_port ; ... }; check-names (warn|fail|ignore) ; check-mx (warn|fail|ignore) ; check-wildcard yes_or_no; check-spf ( warn | fail | ignore ); check-integrity yes_or_no ; dialup dialup_option ; file string ; masterfile-format (text|raw) ; journal string ; max-journal-size size_spec; forward (only|first) ; forwarders { ip_addr port ip_port ; ... }; ixfr-base string ; ixfr-from-differences yes_or_no; ixfr-tmp-file string ; request-ixfr yes_or_no ; maintain-ixfr-base yes_or_no ; max-ixfr-log-size number ; max-transfer-idle-out number ; max-transfer-time-out number ; notify yes_or_no | explicit | master-only ; notify-delay seconds ; notify-to-soa yes_or_no; pubkey number number number string ; notify-source (ip4_addr | *) port ip_port ; notify-source-v6 (ip6_addr | *) port ip_port ; zone-statistics full | terse | none; sig-validity-interval number number ; sig-signing-nodes number ; sig-signing-signatures number ; sig-signing-type number ; database string ; min-refresh-time number ; max-refresh-time number ; min-retry-time number ; max-retry-time number ; key-directory path_name; auto-dnssec allow|maintain|off; inline-signing yes_or_no; zero-no-soa-ttl yes_or_no ; serial-update-method increment|unixtime; }; zone zone_name class { type slave; allow-notify { address_match_list }; allow-query { address_match_list }; allow-query-on { address_match_list }; allow-transfer { address_match_list }; allow-update-forwarding { address_match_list }; dnssec-update-mode ( maintain | no-resign ); update-check-ksk yes_or_no; dnssec-dnskey-kskonly yes_or_no; dnssec-loadkeys-interval number; dnssec-secure-to-insecure yes_or_no ; try-tcp-refresh yes_or_no; also-notify port ip_port { ( masters_list | ip_addr port ip_port key key ) ; ... }; check-names (warn|fail|ignore) ; dialup dialup_option ; file string ; masterfile-format (text|raw) ; journal string ; max-journal-size size_spec; forward (only|first) ; forwarders { ip_addr port ip_port ; ... }; ixfr-base string ; ixfr-from-differences yes_or_no; ixfr-tmp-file string ; maintain-ixfr-base yes_or_no ; masters port ip_port { ( masters_list | ip_addr port ip_port key key ) ; ... }; max-ixfr-log-size number ; max-transfer-idle-in number ; max-transfer-idle-out number ; max-transfer-time-in number ; max-transfer-time-out number ; notify yes_or_no | explicit | master-only ; notify-delay seconds ; notify-to-soa yes_or_no; pubkey number number number string ; transfer-source (ip4_addr | *) port ip_port ; transfer-source-v6 (ip6_addr | *) port ip_port ; alt-transfer-source (ip4_addr | *) port ip_port ; alt-transfer-source-v6 (ip6_addr | *) port ip_port ; use-alt-transfer-source yes_or_no; notify-source (ip4_addr | *) port ip_port ; notify-source-v6 (ip6_addr | *) port ip_port ; zone-statistics full | terse | none; sig-validity-interval number number ; sig-signing-nodes number ; sig-signing-signatures number ; sig-signing-type number ; database string ; min-refresh-time number ; max-refresh-time number ; min-retry-time number ; max-retry-time number ; key-directory path_name; auto-dnssec allow|maintain|off; inline-signing yes_or_no; multi-master yes_or_no ; zero-no-soa-ttl yes_or_no ; }; zone zone_name class { type hint; file string ; delegation-only yes_or_no ; check-names (warn|fail|ignore) ; // Not Implemented. }; zone zone_name class { type stub; allow-query { address_match_list }; allow-query-on { address_match_list }; check-names (warn|fail|ignore) ; dialup dialup_option ; delegation-only yes_or_no ; file string ; masterfile-format (text|raw) ; forward (only|first) ; forwarders { ip_addr port ip_port ; ... }; masters port ip_port { ( masters_list | ip_addr port ip_port key key ) ; ... }; max-transfer-idle-in number ; max-transfer-time-in number ; pubkey number number number string ; transfer-source (ip4_addr | *) port ip_port ; transfer-source-v6 (ip6_addr | *) port ip_port ; alt-transfer-source (ip4_addr | *) port ip_port ; alt-transfer-source-v6 (ip6_addr | *) port ip_port ; use-alt-transfer-source yes_or_no; zone-statistics yes_or_no ; database string ; min-refresh-time number ; max-refresh-time number ; min-retry-time number ; max-retry-time number ; multi-master yes_or_no ; }; zone zone_name class { type static-stub; allow-query { address_match_list }; server-addresses { ip_addr ; ... }; server-names { namelist }; zone-statistics yes_or_no ; }; zone zone_name class { type forward; forward (only|first) ; forwarders { ip_addr port ip_port ; ... }; delegation-only yes_or_no ; }; zone "." class { type redirect; file string ; masterfile-format (text|raw) ; allow-query { address_match_list }; }; zone zone_name class { type delegation-only; }; <command>zone</command> Statement Definition and Usage Zone Types master The server has a master copy of the data for the zone and will be able to provide authoritative answers for it. slave A slave zone is a replica of a master zone. The masters list specifies one or more IP addresses of master servers that the slave contacts to update its copy of the zone. Masters list elements can also be names of other masters lists. By default, transfers are made from port 53 on the servers; this can be changed for all servers by specifying a port number before the list of IP addresses, or on a per-server basis after the IP address. Authentication to the master can also be done with per-server TSIG keys. If a file is specified, then the replica will be written to this file whenever the zone is changed, and reloaded from this file on a server restart. Use of a file is recommended, since it often speeds server startup and eliminates a needless waste of bandwidth. Note that for large numbers (in the tens or hundreds of thousands) of zones per server, it is best to use a two-level naming scheme for zone filenames. For example, a slave server for the zone example.com might place the zone contents into a file called ex/example.com where ex/ is just the first two letters of the zone name. (Most operating systems behave very slowly if you put 100000 files into a single directory.) stub A stub zone is similar to a slave zone, except that it replicates only the NS records of a master zone instead of the entire zone. Stub zones are not a standard part of the DNS; they are a feature specific to the BIND implementation. Stub zones can be used to eliminate the need for glue NS record in a parent zone at the expense of maintaining a stub zone entry and a set of name server addresses in named.conf. This usage is not recommended for new configurations, and BIND 9 supports it only in a limited way. In BIND 4/8, zone transfers of a parent zone included the NS records from stub children of that zone. This meant that, in some cases, users could get away with configuring child stubs only in the master server for the parent zone. BIND 9 never mixes together zone data from different zones in this way. Therefore, if a BIND 9 master serving a parent zone has child stub zones configured, all the slave servers for the parent zone also need to have the same child stub zones configured. Stub zones can also be used as a way of forcing the resolution of a given domain to use a particular set of authoritative servers. For example, the caching name servers on a private network using RFC1918 addressing may be configured with stub zones for 10.in-addr.arpa to use a set of internal name servers as the authoritative servers for that domain. static-stub A static-stub zone is similar to a stub zone with the following exceptions: the zone data is statically configured, rather than transferred from a master server; when recursion is necessary for a query that matches a static-stub zone, the locally configured data (nameserver names and glue addresses) is always used even if different authoritative information is cached. Zone data is configured via the server-addresses and server-names zone options. The zone data is maintained in the form of NS and (if necessary) glue A or AAAA RRs internally, which can be seen by dumping zone databases by rndc dumpdb -all. The configured RRs are considered local configuration parameters rather than public data. Non recursive queries (i.e., those with the RD bit off) to a static-stub zone are therefore prohibited and will be responded with REFUSED. Since the data is statically configured, no zone maintenance action takes place for a static-stub zone. For example, there is no periodic refresh attempt, and an incoming notify message will be rejected with an rcode of NOTAUTH. Each static-stub zone is configured with internally generated NS and (if necessary) glue A or AAAA RRs forward A "forward zone" is a way to configure forwarding on a per-domain basis. A zone statement of type forward can contain a forward and/or forwarders statement, which will apply to queries within the domain given by the zone name. If no forwarders statement is present or an empty list for forwarders is given, then no forwarding will be done for the domain, canceling the effects of any forwarders in the options statement. Thus if you want to use this type of zone to change the behavior of the global forward option (that is, "forward first" to, then "forward only", or vice versa, but want to use the same servers as set globally) you need to re-specify the global forwarders. hint The initial set of root name servers is specified using a "hint zone". When the server starts up, it uses the root hints to find a root name server and get the most recent list of root name servers. If no hint zone is specified for class IN, the server uses a compiled-in default set of root servers hints. Classes other than IN have no built-in defaults hints. redirect Redirect zones are used to provide answers to queries when normal resolution would result in NXDOMAIN being returned. Only one redirect zone is supported per view. allow-query can be used to restrict which clients see these answers. If the client has requested DNSSEC records (DO=1) and the NXDOMAIN response is signed then no substitution will occur. To redirect all NXDOMAIN responses to 100.100.100.2 and 2001:ffff:ffff::100.100.100.2, one would configure a type redirect zone named ".", with the zone file containing wildcard records that point to the desired addresses: "*. IN A 100.100.100.2" and "*. IN AAAA 2001:ffff:ffff::100.100.100.2". To redirect all Spanish names (under .ES) one would use similar entries but with the names "*.ES." instead of "*.". To redirect all commercial Spanish names (under COM.ES) one would use wildcard entries called "*.COM.ES.". Note that the redirect zone supports all possible types; it is not limited to A and AAAA records. Because redirect zones are not referenced directly by name, they are not kept in the zone lookup table with normal master and slave zones. Consequently, it is not currently possible to use rndc reload zonename to reload a redirect zone. However, when using rndc reload without specifying a zone name, redirect zones will be reloaded along with other zones. delegation-only This is used to enforce the delegation-only status of infrastructure zones (e.g. COM, NET, ORG). Any answer that is received without an explicit or implicit delegation in the authority section will be treated as NXDOMAIN. This does not apply to the zone apex. This should not be applied to leaf zones. delegation-only has no effect on answers received from forwarders. See caveats in . Class The zone's name may optionally be followed by a class. If a class is not specified, class IN (for Internet), is assumed. This is correct for the vast majority of cases. The hesiod class is named for an information service from MIT's Project Athena. It is used to share information about various systems databases, such as users, groups, printers and so on. The keyword HS is a synonym for hesiod. Another MIT development is Chaosnet, a LAN protocol created in the mid-1970s. Zone data for it can be specified with the CHAOS class. Zone Options allow-notify See the description of allow-notify in . allow-query See the description of allow-query in . allow-query-on See the description of allow-query-on in . allow-transfer See the description of allow-transfer in . allow-update See the description of allow-update in . update-policy Specifies a "Simple Secure Update" policy. See . allow-update-forwarding See the description of allow-update-forwarding in . also-notify Only meaningful if notify is active for this zone. The set of machines that will receive a DNS NOTIFY message for this zone is made up of all the listed name servers (other than the primary master) for the zone plus any IP addresses specified with also-notify. A port may be specified with each also-notify address to send the notify messages to a port other than the default of 53. A TSIG key may also be specified to cause the NOTIFY to be signed by the given key. also-notify is not meaningful for stub zones. The default is the empty list. check-names This option is used to restrict the character set and syntax of certain domain names in master files and/or DNS responses received from the network. The default varies according to zone type. For master zones the default is fail. For slave zones the default is warn. It is not implemented for hint zones. check-mx See the description of check-mx in . check-spf See the description of check-spf in . check-wildcard See the description of check-wildcard in . check-integrity See the description of check-integrity in . check-sibling See the description of check-sibling in . zero-no-soa-ttl See the description of zero-no-soa-ttl in . update-check-ksk See the description of update-check-ksk in . dnssec-update-mode See the description of dnssec-update-mode in . dnssec-dnskey-kskonly See the description of dnssec-dnskey-kskonly in . try-tcp-refresh See the description of try-tcp-refresh in . database Specify the type of database to be used for storing the zone data. The string following the database keyword is interpreted as a list of whitespace-delimited words. The first word identifies the database type, and any subsequent words are passed as arguments to the database to be interpreted in a way specific to the database type. The default is "rbt", BIND 9's native in-memory red-black-tree database. This database does not take arguments. Other values are possible if additional database drivers have been linked into the server. Some sample drivers are included with the distribution but none are linked in by default. dialup See the description of dialup in . delegation-only The flag only applies to hint and stub zones. If set to yes, then the zone will also be treated as if it is also a delegation-only type zone. See caveats in . forward Only meaningful if the zone has a forwarders list. The only value causes the lookup to fail after trying the forwarders and getting no answer, while first would allow a normal lookup to be tried. forwarders Used to override the list of global forwarders. If it is not specified in a zone of type forward, no forwarding is done for the zone and the global options are not used. ixfr-base Was used in BIND 8 to specify the name of the transaction log (journal) file for dynamic update and IXFR. BIND 9 ignores the option and constructs the name of the journal file by appending ".jnl" to the name of the zone file. ixfr-tmp-file Was an undocumented option in BIND 8. Ignored in BIND 9. journal Allow the default journal's filename to be overridden. The default is the zone's filename with ".jnl" appended. This is applicable to master and slave zones. max-journal-size See the description of max-journal-size in . max-transfer-time-in See the description of max-transfer-time-in in . max-transfer-idle-in See the description of max-transfer-idle-in in . max-transfer-time-out See the description of max-transfer-time-out in . max-transfer-idle-out See the description of max-transfer-idle-out in . notify See the description of notify in . notify-delay See the description of notify-delay in . notify-to-soa See the description of notify-to-soa in . pubkey In BIND 8, this option was intended for specifying a public zone key for verification of signatures in DNSSEC signed zones when they are loaded from disk. BIND 9 does not verify signatures on load and ignores the option. zone-statistics If yes, the server will keep statistical information for this zone, which can be dumped to the statistics-file defined in the server options. server-addresses Only meaningful for static-stub zones. This is a list of IP addresses to which queries should be sent in recursive resolution for the zone. A non empty list for this option will internally configure the apex NS RR with associated glue A or AAAA RRs. For example, if "example.com" is configured as a static-stub zone with 192.0.2.1 and 2001:db8::1234 in a server-addresses option, the following RRs will be internally configured. example.com. NS example.com. example.com. A 192.0.2.1 example.com. AAAA 2001:db8::1234 These records are internally used to resolve names under the static-stub zone. For instance, if the server receives a query for "www.example.com" with the RD bit on, the server will initiate recursive resolution and send queries to 192.0.2.1 and/or 2001:db8::1234. server-names Only meaningful for static-stub zones. This is a list of domain names of nameservers that act as authoritative servers of the static-stub zone. These names will be resolved to IP addresses when named needs to send queries to these servers. To make this supplemental resolution successful, these names must not be a subdomain of the origin name of static-stub zone. That is, when "example.net" is the origin of a static-stub zone, "ns.example" and "master.example.com" can be specified in the server-names option, but "ns.example.net" cannot, and will be rejected by the configuration parser. A non empty list for this option will internally configure the apex NS RR with the specified names. For example, if "example.com" is configured as a static-stub zone with "ns1.example.net" and "ns2.example.net" in a server-names option, the following RRs will be internally configured. example.com. NS ns1.example.net. example.com. NS ns2.example.net. These records are internally used to resolve names under the static-stub zone. For instance, if the server receives a query for "www.example.com" with the RD bit on, the server initiate recursive resolution, resolve "ns1.example.net" and/or "ns2.example.net" to IP addresses, and then send queries to (one or more of) these addresses. sig-validity-interval See the description of sig-validity-interval in . sig-signing-nodes See the description of sig-signing-nodes in . sig-signing-signatures See the description of sig-signing-signatures in . sig-signing-type See the description of sig-signing-type in . transfer-source See the description of transfer-source in . transfer-source-v6 See the description of transfer-source-v6 in . alt-transfer-source See the description of alt-transfer-source in . alt-transfer-source-v6 See the description of alt-transfer-source-v6 in . use-alt-transfer-source See the description of use-alt-transfer-source in . notify-source See the description of notify-source in . notify-source-v6 See the description of notify-source-v6 in . min-refresh-time max-refresh-time min-retry-time max-retry-time See the description in . ixfr-from-differences See the description of ixfr-from-differences in . (Note that the ixfr-from-differences master and slave choices are not available at the zone level.) key-directory See the description of key-directory in . auto-dnssec Zones configured for dynamic DNS may also use this option to allow varying levels of automatic DNSSEC key management. There are three possible settings: auto-dnssec allow; permits keys to be updated and the zone fully re-signed whenever the user issues the command rndc sign zonename. auto-dnssec maintain; includes the above, but also automatically adjusts the zone's DNSSEC keys on schedule, according to the keys' timing metadata (see and ). The command rndc sign zonename causes named to load keys from the key repository and sign the zone with all keys that are active. rndc loadkeys zonename causes named to load keys from the key repository and schedule key maintenance events to occur in the future, but it does not sign the full zone immediately. Note: once keys have been loaded for a zone the first time, the repository will be searched for changes periodically, regardless of whether rndc loadkeys is used. The recheck interval is defined by dnssec-loadkeys-interval.) The default setting is auto-dnssec off. serial-update-method Zones configured for dynamic DNS may use this option to set the update method that will be used for the zone serial number in the SOA record. With the default setting of serial-update-method increment;, the SOA serial number will be incremented by one each time the zone is updated. When set to serial-update-method unixtime;, the SOA serial number will be set to the number of seconds since the UNIX epoch, unless the serial number is already greater than or equal to that value, in which case it is simply incremented by one. inline-signing If yes, this enables "bump in the wire" signing of a zone, where a unsigned zone is transferred in or loaded from disk and a signed version of the zone is served, with possibly, a different serial number. This behaviour is disabled by default. multi-master See the description of multi-master in . masterfile-format See the description of masterfile-format in . dnssec-secure-to-insecure See the description of dnssec-secure-to-insecure in . Dynamic Update Policies BIND 9 supports two alternative methods of granting clients the right to perform dynamic updates to a zone, configured by the allow-update and update-policy option, respectively. The allow-update clause works the same way as in previous versions of BIND. It grants given clients the permission to update any record of any name in the zone. The update-policy clause allows more fine-grained control over what updates are allowed. A set of rules is specified, where each rule either grants or denies permissions for one or more names to be updated by one or more identities. If the dynamic update request message is signed (that is, it includes either a TSIG or SIG(0) record), the identity of the signer can be determined. Rules are specified in the update-policy zone option, and are only meaningful for master zones. When the update-policy statement is present, it is a configuration error for the allow-update statement to be present. The update-policy statement only examines the signer of a message; the source address is not relevant. There is a pre-defined update-policy rule which can be switched on with the command update-policy local;. Switching on this rule in a zone causes named to generate a TSIG session key and place it in a file, and to allow that key to update the zone. (By default, the file is /var/run/named/session.key, the key name is "local-ddns" and the key algorithm is HMAC-SHA256, but these values are configurable with the session-keyfile, session-keyname and session-keyalg options, respectively). A client running on the local system, and with appropriate permissions, may read that file and use the key to sign update requests. The zone's update policy will be set to allow that key to change any record within the zone. Assuming the key name is "local-ddns", this policy is equivalent to: update-policy { grant local-ddns zonesub any; }; The command nsupdate -l sends update requests to localhost, and signs them using the session key. Other rule definitions look like this: ( grant | deny ) identity nametype name types Each rule grants or denies privileges. Once a message has successfully matched a rule, the operation is immediately granted or denied and no further rules are examined. A rule is matched when the signer matches the identity field, the name matches the name field in accordance with the nametype field, and the type matches the types specified in the type field. No signer is required for tcp-self or 6to4-self however the standard reverse mapping / prefix conversion must match the identity field. The identity field specifies a name or a wildcard name. Normally, this is the name of the TSIG or SIG(0) key used to sign the update request. When a TKEY exchange has been used to create a shared secret, the identity of the shared secret is the same as the identity of the key used to authenticate the TKEY exchange. TKEY is also the negotiation method used by GSS-TSIG, which establishes an identity that is the Kerberos principal of the client, such as "user@host.domain". When the identity field specifies a wildcard name, it is subject to DNS wildcard expansion, so the rule will apply to multiple identities. The identity field must contain a fully-qualified domain name. For nametypes krb5-self, ms-self, krb5-subdomain, and ms-subdomain the identity field specifies the Windows or Kerberos realm of the machine belongs to. The nametype field has 13 values: name, subdomain, wildcard, self, selfsub, selfwild, krb5-self, ms-self, krb5-subdomain, ms-subdomain, tcp-self, 6to4-self, zonesub, and external. name Exact-match semantics. This rule matches when the name being updated is identical to the contents of the name field. subdomain This rule matches when the name being updated is a subdomain of, or identical to, the contents of the name field. zonesub This rule is similar to subdomain, except that it matches when the name being updated is a subdomain of the zone in which the update-policy statement appears. This obviates the need to type the zone name twice, and enables the use of a standard update-policy statement in multiple zones without modification. When this rule is used, the name field is omitted. wildcard The name field is subject to DNS wildcard expansion, and this rule matches when the name being updated name is a valid expansion of the wildcard. self This rule matches when the name being updated matches the contents of the identity field. The name field is ignored, but should be the same as the identity field. The self nametype is most useful when allowing using one key per name to update, where the key has the same name as the name to be updated. The identity would be specified as * (an asterisk) in this case. selfsub This rule is similar to self except that subdomains of self can also be updated. selfwild This rule is similar to self except that only subdomains of self can be updated. ms-self This rule takes a Windows machine principal (machine$@REALM) for machine in REALM and and converts it machine.realm allowing the machine to update machine.realm. The REALM to be matched is specified in the identity field. ms-subdomain This rule takes a Windows machine principal (machine$@REALM) for machine in REALM and converts it to machine.realm allowing the machine to update subdomains of machine.realm. The REALM to be matched is specified in the identity field. krb5-self This rule takes a Kerberos machine principal (host/machine@REALM) for machine in REALM and and converts it machine.realm allowing the machine to update machine.realm. The REALM to be matched is specified in the identity field. krb5-subdomain This rule takes a Kerberos machine principal (host/machine@REALM) for machine in REALM and converts it to machine.realm allowing the machine to update subdomains of machine.realm. The REALM to be matched is specified in the identity field. tcp-self Allow updates that have been sent via TCP and for which the standard mapping from the initiating IP address into the IN-ADDR.ARPA and IP6.ARPA namespaces match the name to be updated. It is theoretically possible to spoof these TCP sessions. 6to4-self Allow the 6to4 prefix to be update by any TCP connection from the 6to4 network or from the corresponding IPv4 address. This is intended to allow NS or DNAME RRsets to be added to the reverse tree. It is theoretically possible to spoof these TCP sessions. external This rule allows named to defer the decision of whether to allow a given update to an external daemon. The method of communicating with the daemon is specified in the identity field, the format of which is "local:path", where path is the location of a UNIX-domain socket. (Currently, "local" is the only supported mechanism.) Requests to the external daemon are sent over the UNIX-domain socket as datagrams with the following format: Protocol version number (4 bytes, network byte order, currently 1) Request length (4 bytes, network byte order) Signer (null-terminated string) Name (null-terminated string) TCP source address (null-terminated string) Rdata type (null-terminated string) Key (null-terminated string) TKEY token length (4 bytes, network byte order) TKEY token (remainder of packet) The daemon replies with a four-byte value in network byte order, containing either 0 or 1; 0 indicates that the specified update is not permitted, and 1 indicates that it is. In all cases, the name field must specify a fully-qualified domain name. If no types are explicitly specified, this rule matches all types except RRSIG, NS, SOA, NSEC and NSEC3. Types may be specified by name, including "ANY" (ANY matches all types except NSEC and NSEC3, which can never be updated). Note that when an attempt is made to delete all records associated with a name, the rules are checked for each existing record type. Zone File Types of Resource Records and When to Use Them This section, largely borrowed from RFC 1034, describes the concept of a Resource Record (RR) and explains when each is used. Since the publication of RFC 1034, several new RRs have been identified and implemented in the DNS. These are also included. Resource Records A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource information associated with a particular name is composed of separate RRs. The order of RRs in a set is not significant and need not be preserved by name servers, resolvers, or other parts of the DNS. However, sorting of multiple RRs is permitted for optimization purposes, for example, to specify that a particular nearby server be tried first. See and . The components of a Resource Record are: owner name The domain name where the RR is found. type An encoded 16-bit value that specifies the type of the resource record. TTL The time-to-live of the RR. This field is a 32-bit integer in units of seconds, and is primarily used by resolvers when they cache RRs. The TTL describes how long a RR can be cached before it should be discarded. class An encoded 16-bit value that identifies a protocol family or instance of a protocol. RDATA The resource data. The format of the data is type (and sometimes class) specific. The following are types of valid RRs: A A host address. In the IN class, this is a 32-bit IP address. Described in RFC 1035. AAAA IPv6 address. Described in RFC 1886. A6 IPv6 address. This can be a partial address (a suffix) and an indirection to the name where the rest of the address (the prefix) can be found. Experimental. Described in RFC 2874. AFSDB Location of AFS database servers. Experimental. Described in RFC 1183. APL Address prefix list. Experimental. Described in RFC 3123. CERT Holds a digital certificate. Described in RFC 2538. CNAME Identifies the canonical name of an alias. Described in RFC 1035. DHCID Is used for identifying which DHCP client is associated with this name. Described in RFC 4701. DNAME Replaces the domain name specified with another name to be looked up, effectively aliasing an entire subtree of the domain name space rather than a single record as in the case of the CNAME RR. Described in RFC 2672. DNSKEY Stores a public key associated with a signed DNS zone. Described in RFC 4034. DS Stores the hash of a public key associated with a signed DNS zone. Described in RFC 4034. GPOS Specifies the global position. Superseded by LOC. HINFO Identifies the CPU and OS used by a host. Described in RFC 1035. IPSECKEY Provides a method for storing IPsec keying material in DNS. Described in RFC 4025. ISDN Representation of ISDN addresses. Experimental. Described in RFC 1183. KEY Stores a public key associated with a DNS name. Used in original DNSSEC; replaced by DNSKEY in DNSSECbis, but still used with SIG(0). Described in RFCs 2535 and 2931. KX Identifies a key exchanger for this DNS name. Described in RFC 2230. LOC For storing GPS info. Described in RFC 1876. Experimental. MX Identifies a mail exchange for the domain with a 16-bit preference value (lower is better) followed by the host name of the mail exchange. Described in RFC 974, RFC 1035. NAPTR Name authority pointer. Described in RFC 2915. NSAP A network service access point. Described in RFC 1706. NS The authoritative name server for the domain. Described in RFC 1035. NSEC Used in DNSSECbis to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. Described in RFC 4034. NSEC3 Used in DNSSECbis to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. NSEC3 differs from NSEC in that it prevents zone enumeration but is more computationally expensive on both the server and the client than NSEC. Described in RFC 5155. NSEC3PARAM Used in DNSSECbis to tell the authoritative server which NSEC3 chains are available to use. Described in RFC 5155. NXT Used in DNSSEC to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. Used in original DNSSEC; replaced by NSEC in DNSSECbis. Described in RFC 2535. PTR A pointer to another part of the domain name space. Described in RFC 1035. PX Provides mappings between RFC 822 and X.400 addresses. Described in RFC 2163. RP Information on persons responsible for the domain. Experimental. Described in RFC 1183. RRSIG Contains DNSSECbis signature data. Described in RFC 4034. RT Route-through binding for hosts that do not have their own direct wide area network addresses. Experimental. Described in RFC 1183. SIG Contains DNSSEC signature data. Used in original DNSSEC; replaced by RRSIG in DNSSECbis, but still used for SIG(0). Described in RFCs 2535 and 2931. SOA Identifies the start of a zone of authority. Described in RFC 1035. SPF Contains the Sender Policy Framework information for a given email domain. Described in RFC 4408. SRV Information about well known network services (replaces WKS). Described in RFC 2782. SSHFP Provides a way to securely publish a secure shell key's fingerprint. Described in RFC 4255. TXT Text records. Described in RFC 1035. WKS Information about which well known network services, such as SMTP, that a domain supports. Historical. X25 Representation of X.25 network addresses. Experimental. Described in RFC 1183. The following classes of resource records are currently valid in the DNS: IN The Internet. CH Chaosnet, a LAN protocol created at MIT in the mid-1970s. Rarely used for its historical purpose, but reused for BIND's built-in server information zones, e.g., version.bind. HS Hesiod, an information service developed by MIT's Project Athena. It is used to share information about various systems databases, such as users, groups, printers and so on. The owner name is often implicit, rather than forming an integral part of the RR. For example, many name servers internally form tree or hash structures for the name space, and chain RRs off nodes. The remaining RR parts are the fixed header (type, class, TTL) which is consistent for all RRs, and a variable part (RDATA) that fits the needs of the resource being described. The meaning of the TTL field is a time limit on how long an RR can be kept in a cache. This limit does not apply to authoritative data in zones; it is also timed out, but by the refreshing policies for the zone. The TTL is assigned by the administrator for the zone where the data originates. While short TTLs can be used to minimize caching, and a zero TTL prohibits caching, the realities of Internet performance suggest that these times should be on the order of days for the typical host. If a change can be anticipated, the TTL can be reduced prior to the change to minimize inconsistency during the change, and then increased back to its former value following the change. The data in the RDATA section of RRs is carried as a combination of binary strings and domain names. The domain names are frequently used as "pointers" to other data in the DNS. Textual expression of RRs RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form when stored in a name server or resolver. In the examples provided in RFC 1034, a style similar to that used in master files was employed in order to show the contents of RRs. In this format, most RRs are shown on a single line, although continuation lines are possible using parentheses. The start of the line gives the owner of the RR. If a line begins with a blank, then the owner is assumed to be the same as that of the previous RR. Blank lines are often included for readability. Following the owner, we list the TTL, type, and class of the RR. Class and type use the mnemonics defined above, and TTL is an integer before the type field. In order to avoid ambiguity in parsing, type and class mnemonics are disjoint, TTLs are integers, and the type mnemonic is always last. The IN class and TTL values are often omitted from examples in the interests of clarity. The resource data or RDATA section of the RR are given using knowledge of the typical representation for the data. For example, we might show the RRs carried in a message as: ISI.EDU. MX 10 VENERA.ISI.EDU. MX 10 VAXA.ISI.EDU VENERA.ISI.EDU A 128.9.0.32 A 10.1.0.52 VAXA.ISI.EDU A 10.2.0.27 A 128.9.0.33 The MX RRs have an RDATA section which consists of a 16-bit number followed by a domain name. The address RRs use a standard IP address format to contain a 32-bit internet address. The above example shows six RRs, with two RRs at each of three domain names. Similarly we might see: XX.LCS.MIT.EDU. IN A 10.0.0.44 CH A MIT.EDU. 2420 This example shows two addresses for XX.LCS.MIT.EDU, each of a different class. Discussion of MX Records As described above, domain servers store information as a series of resource records, each of which contains a particular piece of information about a given domain name (which is usually, but not always, a host). The simplest way to think of a RR is as a typed pair of data, a domain name matched with a relevant datum, and stored with some additional type information to help systems determine when the RR is relevant. MX records are used to control delivery of email. The data specified in the record is a priority and a domain name. The priority controls the order in which email delivery is attempted, with the lowest number first. If two priorities are the same, a server is chosen randomly. If no servers at a given priority are responding, the mail transport agent will fall back to the next largest priority. Priority numbers do not have any absolute meaning — they are relevant only respective to other MX records for that domain name. The domain name given is the machine to which the mail will be delivered. It must have an associated address record (A or AAAA) — CNAME is not sufficient. For a given domain, if there is both a CNAME record and an MX record, the MX record is in error, and will be ignored. Instead, the mail will be delivered to the server specified in the MX record pointed to by the CNAME. For example: example.com. IN MX 10 mail.example.com. IN MX 10 mail2.example.com. IN MX 20 mail.backup.org. mail.example.com. IN A 10.0.0.1 mail2.example.com. IN A 10.0.0.2 Mail delivery will be attempted to mail.example.com and mail2.example.com (in any order), and if neither of those succeed, delivery to mail.backup.org will be attempted. Setting TTLs The time-to-live of the RR field is a 32-bit integer represented in units of seconds, and is primarily used by resolvers when they cache RRs. The TTL describes how long a RR can be cached before it should be discarded. The following three types of TTL are currently used in a zone file. SOA The last field in the SOA is the negative caching TTL. This controls how long other servers will cache no-such-domain (NXDOMAIN) responses from you. The maximum time for negative caching is 3 hours (3h). $TTL The $TTL directive at the top of the zone file (before the SOA) gives a default TTL for every RR without a specific TTL set. RR TTLs Each RR can have a TTL as the second field in the RR, which will control how long other servers can cache the it. All of these TTLs default to units of seconds, though units can be explicitly specified, for example, 1h30m. Inverse Mapping in IPv4 Reverse name resolution (that is, translation from IP address to name) is achieved by means of the in-addr.arpa domain and PTR records. Entries in the in-addr.arpa domain are made in least-to-most significant order, read left to right. This is the opposite order to the way IP addresses are usually written. Thus, a machine with an IP address of 10.1.2.3 would have a corresponding in-addr.arpa name of 3.2.1.10.in-addr.arpa. This name should have a PTR resource record whose data field is the name of the machine or, optionally, multiple PTR records if the machine has more than one name. For example, in the example.com domain: $ORIGIN 2.1.10.in-addr.arpa 3 IN PTR foo.example.com. The $ORIGIN lines in the examples are for providing context to the examples only — they do not necessarily appear in the actual usage. They are only used here to indicate that the example is relative to the listed origin. Other Zone File Directives The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format itself is class independent all records in a Master File must be of the same class. Master File Directives include $ORIGIN, $INCLUDE, and $TTL. The <command>@</command> (at-sign) When used in the label (or name) field, the asperand or at-sign (@) symbol represents the current origin. At the start of the zone file, it is the <zone_name> (followed by trailing dot). The <command>$ORIGIN</command> Directive Syntax: $ORIGIN domain-name comment $ORIGIN sets the domain name that will be appended to any unqualified records. When a zone is first read in there is an implicit $ORIGIN <zone_name>. (followed by trailing dot). The current $ORIGIN is appended to the domain specified in the $ORIGIN argument if it is not absolute. $ORIGIN example.com. WWW CNAME MAIN-SERVER is equivalent to WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM. The <command>$INCLUDE</command> Directive Syntax: $INCLUDE filename origin comment Read and process the file filename as if it were included into the file at this point. If origin is specified the file is processed with $ORIGIN set to that value, otherwise the current $ORIGIN is used. The origin and the current domain name revert to the values they had prior to the $INCLUDE once the file has been read. RFC 1035 specifies that the current origin should be restored after an $INCLUDE, but it is silent on whether the current domain name should also be restored. BIND 9 restores both of them. This could be construed as a deviation from RFC 1035, a feature, or both. The <command>$TTL</command> Directive Syntax: $TTL default-ttl comment Set the default Time To Live (TTL) for subsequent records with undefined TTLs. Valid TTLs are of the range 0-2147483647 seconds. $TTL is defined in RFC 2308. <acronym>BIND</acronym> Master File Extension: the <command>$GENERATE</command> Directive Syntax: $GENERATE range lhs ttl class type rhs comment $GENERATE is used to create a series of resource records that only differ from each other by an iterator. $GENERATE can be used to easily generate the sets of records required to support sub /24 reverse delegations described in RFC 2317: Classless IN-ADDR.ARPA delegation. $ORIGIN 0.0.192.IN-ADDR.ARPA. $GENERATE 1-2 @ NS SERVER$.EXAMPLE. $GENERATE 1-127 $ CNAME $.0 is equivalent to 0.0.0.192.IN-ADDR.ARPA. NS SERVER1.EXAMPLE. 0.0.0.192.IN-ADDR.ARPA. NS SERVER2.EXAMPLE. 1.0.0.192.IN-ADDR.ARPA. CNAME 1.0.0.0.192.IN-ADDR.ARPA. 2.0.0.192.IN-ADDR.ARPA. CNAME 2.0.0.0.192.IN-ADDR.ARPA. ... 127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA. Generate a set of A and MX records. Note the MX's right hand side is a quoted string. The quotes will be stripped when the right hand side is processed. $ORIGIN EXAMPLE. $GENERATE 1-127 HOST-$ A 1.2.3.$ $GENERATE 1-127 HOST-$ MX "0 ." is equivalent to HOST-1.EXAMPLE. A 1.2.3.1 HOST-1.EXAMPLE. MX 0 . HOST-2.EXAMPLE. A 1.2.3.2 HOST-2.EXAMPLE. MX 0 . HOST-3.EXAMPLE. A 1.2.3.3 HOST-3.EXAMPLE. MX 0 . ... HOST-127.EXAMPLE. A 1.2.3.127 HOST-127.EXAMPLE. MX 0 . range This can be one of two forms: start-stop or start-stop/step. If the first form is used, then step is set to 1. All of start, stop and step must be positive. lhs This describes the owner name of the resource records to be created. Any single $ (dollar sign) symbols within the lhs string are replaced by the iterator value. To get a $ in the output, you need to escape the $ using a backslash \, e.g. \$. The $ may optionally be followed by modifiers which change the offset from the iterator, field width and base. Modifiers are introduced by a { (left brace) immediately following the $ as ${offset[,width[,base]]}. For example, ${-20,3,d} subtracts 20 from the current value, prints the result as a decimal in a zero-padded field of width 3. Available output forms are decimal (d), octal (o), hexadecimal (x or X for uppercase) and nibble (n or N\ for uppercase). The default modifier is ${0,0,d}. If the lhs is not absolute, the current $ORIGIN is appended to the name. In nibble mode the value will be treated as if it was a reversed hexadecimal string with each hexadecimal digit as a separate label. The width field includes the label separator. For compatibility with earlier versions, $$ is still recognized as indicating a literal $ in the output. ttl Specifies the time-to-live of the generated records. If not specified this will be inherited using the normal TTL inheritance rules. class and ttl can be entered in either order. class Specifies the class of the generated records. This must match the zone class if it is specified. class and ttl can be entered in either order. type Any valid type. rhs rhs, optionally, quoted string. The $GENERATE directive is a BIND extension and not part of the standard zone file format. BIND 8 does not support the optional TTL and CLASS fields. Additional File Formats In addition to the standard textual format, BIND 9 supports the ability to read or dump to zone files in other formats. The raw format is currently available as an additional format. It is a binary format representing BIND 9's internal data structure directly, thereby remarkably improving the loading time. For a primary server, a zone file in the raw format is expected to be generated from a textual zone file by the named-compilezone command. For a secondary server or for a dynamic zone, it is automatically generated (if this format is specified by the masterfile-format option) when named dumps the zone contents after zone transfer or when applying prior updates. If a zone file in a binary format needs manual modification, it first must be converted to a textual form by the named-compilezone command. All necessary modification should go to the text file, which should then be converted to the binary form by the named-compilezone command again. Although the raw format uses the network byte order and avoids architecture-dependent data alignment so that it is as much portable as possible, it is primarily expected to be used inside the same single system. In order to export a zone file in the raw format or make a portable backup of the file, it is recommended to convert the file to the standard textual representation. BIND9 Statistics BIND 9 maintains lots of statistics information and provides several interfaces for users to get access to the statistics. The available statistics include all statistics counters that were available in BIND 8 and are meaningful in BIND 9, and other information that is considered useful. The statistics information is categorized into the following sections. Incoming Requests The number of incoming DNS requests for each OPCODE. Incoming Queries The number of incoming queries for each RR type. Outgoing Queries The number of outgoing queries for each RR type sent from the internal resolver. Maintained per view. Name Server Statistics Statistics counters about incoming request processing. Zone Maintenance Statistics Statistics counters regarding zone maintenance operations such as zone transfers. Resolver Statistics Statistics counters about name resolution performed in the internal resolver. Maintained per view. Cache DB RRsets The number of RRsets per RR type and nonexistent names stored in the cache database. If the exclamation mark (!) is printed for a RR type, it means that particular type of RRset is known to be nonexistent (this is also known as "NXRRSET"). Maintained per view. Socket I/O Statistics Statistics counters about network related events. A subset of Name Server Statistics is collected and shown per zone for which the server has the authority when zone-statistics is set to yes. These statistics counters are shown with their zone and view names. In some cases the view names are omitted for the default view. There are currently two user interfaces to get access to the statistics. One is in the plain text format dumped to the file specified by the statistics-file configuration option. The other is remotely accessible via a statistics channel when the statistics-channels statement is specified in the configuration file (see .) The Statistics File The text format statistics dump begins with a line, like: +++ Statistics Dump +++ (973798949) The number in parentheses is a standard Unix-style timestamp, measured as seconds since January 1, 1970. Following that line is a set of statistics information, which is categorized as described above. Each section begins with a line, like: ++ Name Server Statistics ++ Each section consists of lines, each containing the statistics counter value followed by its textual description. See below for available counters. For brevity, counters that have a value of 0 are not shown in the statistics file. The statistics dump ends with the line where the number is identical to the number in the beginning line; for example: --- Statistics Dump --- (973798949) Statistics Counters The following tables summarize statistics counters that BIND 9 provides. For each row of the tables, the leftmost column is the abbreviated symbol name of that counter. These symbols are shown in the statistics information accessed via an HTTP statistics channel. The rightmost column gives the description of the counter, which is also shown in the statistics file (but, in this document, possibly with slight modification for better readability). Additional notes may also be provided in this column. When a middle column exists between these two columns, it gives the corresponding counter name of the BIND 8 statistics, if applicable. Name Server Statistics Counters Symbol BIND8 Symbol Description Requestv4 RQ IPv4 requests received. Note: this also counts non query requests. Requestv6 RQ IPv6 requests received. Note: this also counts non query requests. ReqEdns0 Requests with EDNS(0) received. ReqBadEDNSVer Requests with unsupported EDNS version received. ReqTSIG Requests with TSIG received. ReqSIG0 Requests with SIG(0) received. ReqBadSIG Requests with invalid (TSIG or SIG(0)) signature. ReqTCP RTCP TCP requests received. AuthQryRej RUQ Authoritative (non recursive) queries rejected. RecQryRej RURQ Recursive queries rejected. XfrRej RUXFR Zone transfer requests rejected. UpdateRej RUUpd Dynamic update requests rejected. Response SAns Responses sent. RespTruncated Truncated responses sent. RespEDNS0 Responses with EDNS(0) sent. RespTSIG Responses with TSIG sent. RespSIG0 Responses with SIG(0) sent. QrySuccess Queries resulted in a successful answer. This means the query which returns a NOERROR response with at least one answer RR. This corresponds to the success counter of previous versions of BIND 9. QryAuthAns Queries resulted in authoritative answer. QryNoauthAns SNaAns Queries resulted in non authoritative answer. QryReferral Queries resulted in referral answer. This corresponds to the referral counter of previous versions of BIND 9. QryNxrrset Queries resulted in NOERROR responses with no data. This corresponds to the nxrrset counter of previous versions of BIND 9. QrySERVFAIL SFail Queries resulted in SERVFAIL. QryFORMERR SFErr Queries resulted in FORMERR. QryNXDOMAIN SNXD Queries resulted in NXDOMAIN. This corresponds to the nxdomain counter of previous versions of BIND 9. QryRecursion RFwdQ Queries which caused the server to perform recursion in order to find the final answer. This corresponds to the recursion counter of previous versions of BIND 9. QryDuplicate RDupQ Queries which the server attempted to recurse but discovered an existing query with the same IP address, port, query ID, name, type and class already being processed. This corresponds to the duplicate counter of previous versions of BIND 9. QryDropped Recursive queries for which the server discovered an excessive number of existing recursive queries for the same name, type and class and were subsequently dropped. This is the number of dropped queries due to the reason explained with the clients-per-query and max-clients-per-query options (see the description about .) This corresponds to the dropped counter of previous versions of BIND 9. QryFailure Other query failures. This corresponds to the failure counter of previous versions of BIND 9. Note: this counter is provided mainly for backward compatibility with the previous versions. Normally a more fine-grained counters such as AuthQryRej and RecQryRej that would also fall into this counter are provided, and so this counter would not be of much interest in practice. XfrReqDone Requested zone transfers completed. UpdateReqFwd Update requests forwarded. UpdateRespFwd Update responses forwarded. UpdateFwdFail Dynamic update forward failed. UpdateDone Dynamic updates completed. UpdateFail Dynamic updates failed. UpdateBadPrereq Dynamic updates rejected due to prerequisite failure. RPZRewrites Response policy zone rewrites. RateDropped Responses dropped by rate limits. RateSlipped Responses truncated by rate limits. Zone Maintenance Statistics Counters Symbol Description NotifyOutv4 IPv4 notifies sent. NotifyOutv6 IPv6 notifies sent. NotifyInv4 IPv4 notifies received. NotifyInv6 IPv6 notifies received. NotifyRej Incoming notifies rejected. SOAOutv4 IPv4 SOA queries sent. SOAOutv6 IPv6 SOA queries sent. AXFRReqv4 IPv4 AXFR requested. AXFRReqv6 IPv6 AXFR requested. IXFRReqv4 IPv4 IXFR requested. IXFRReqv6 IPv6 IXFR requested. XfrSuccess Zone transfer requests succeeded. XfrFail Zone transfer requests failed. Resolver Statistics Counters Symbol BIND8 Symbol Description Queryv4 SFwdQ IPv4 queries sent. Queryv6 SFwdQ IPv6 queries sent. Responsev4 RR IPv4 responses received. Responsev6 RR IPv6 responses received. NXDOMAIN RNXD NXDOMAIN received. SERVFAIL RFail SERVFAIL received. FORMERR RFErr FORMERR received. OtherError RErr Other errors received. EDNS0Fail EDNS(0) query failures. Mismatch RDupR Mismatch responses received. The DNS ID, response's source address, and/or the response's source port does not match what was expected. (The port must be 53 or as defined by the port option.) This may be an indication of a cache poisoning attempt. Truncated Truncated responses received. Lame RLame Lame delegations received. Retry SDupQ Query retries performed. QueryAbort Queries aborted due to quota control. QuerySockFail Failures in opening query sockets. One common reason for such failures is a failure of opening a new socket due to a limitation on file descriptors. QueryTimeout Query timeouts. GlueFetchv4 SSysQ IPv4 NS address fetches invoked. GlueFetchv6 SSysQ IPv6 NS address fetches invoked. GlueFetchv4Fail IPv4 NS address fetch failed. GlueFetchv6Fail IPv6 NS address fetch failed. ValAttempt DNSSEC validation attempted. ValOk DNSSEC validation succeeded. ValNegOk DNSSEC validation on negative information succeeded. ValFail DNSSEC validation failed. QryRTTnn Frequency table on round trip times (RTTs) of queries. Each nn specifies the corresponding frequency. In the sequence of nn_1, nn_2, ..., nn_m, the value of nn_i is the number of queries whose RTTs are between nn_(i-1) (inclusive) and nn_i (exclusive) milliseconds. For the sake of convenience we define nn_0 to be 0. The last entry should be represented as nn_m+, which means the number of queries whose RTTs are equal to or over nn_m milliseconds. Socket I/O Statistics Counters Socket I/O statistics counters are defined per socket types, which are UDP4 (UDP/IPv4), UDP6 (UDP/IPv6), TCP4 (TCP/IPv4), TCP6 (TCP/IPv6), Unix (Unix Domain), and FDwatch (sockets opened outside the socket module). In the following table <TYPE> represents a socket type. Not all counters are available for all socket types; exceptions are noted in the description field. Symbol Description <TYPE>Open Sockets opened successfully. This counter is not applicable to the FDwatch type. <TYPE>OpenFail Failures of opening sockets. This counter is not applicable to the FDwatch type. <TYPE>Close Sockets closed. <TYPE>BindFail Failures of binding sockets. <TYPE>ConnFail Failures of connecting sockets. <TYPE>Conn Connections established successfully. <TYPE>AcceptFail Failures of accepting incoming connection requests. This counter is not applicable to the UDP and FDwatch types. <TYPE>Accept Incoming connections successfully accepted. This counter is not applicable to the UDP and FDwatch types. <TYPE>SendErr Errors in socket send operations. This counter corresponds to SErr counter of BIND 8. <TYPE>RecvErr Errors in socket receive operations. This includes errors of send operations on a connected UDP socket notified by an ICMP error message. Compatibility with <emphasis>BIND</emphasis> 8 Counters Most statistics counters that were available in BIND 8 are also supported in BIND 9 as shown in the above tables. Here are notes about other counters that do not appear in these tables. RFwdR,SFwdR These counters are not supported because BIND 9 does not adopt the notion of forwarding as BIND 8 did. RAXFR This counter is accessible in the Incoming Queries section. RIQ This counter is accessible in the Incoming Requests section. ROpts This counter is not supported because BIND 9 does not care about IP options in the first place. <acronym>BIND</acronym> 9 Security Considerations Access Control Lists Access Control Lists (ACLs) are address match lists that you can set up and nickname for future use in allow-notify, allow-query, allow-query-on, allow-recursion, allow-recursion-on, blackhole, allow-transfer, etc. Using ACLs allows you to have finer control over who can access your name server, without cluttering up your config files with huge lists of IP addresses. It is a good idea to use ACLs, and to control access to your server. Limiting access to your server by outside parties can help prevent spoofing and denial of service (DoS) attacks against your server. Here is an example of how to properly apply ACLs: // Set up an ACL named "bogusnets" that will block // RFC1918 space and some reserved space, which is // commonly used in spoofing attacks. acl bogusnets { 0.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; }; // Set up an ACL called our-nets. Replace this with the // real IP numbers. acl our-nets { x.x.x.x/24; x.x.x.x/21; }; options { ... ... allow-query { our-nets; }; allow-recursion { our-nets; }; ... blackhole { bogusnets; }; ... }; zone "example.com" { type master; file "m/example.com"; allow-query { any; }; }; This allows recursive queries of the server from the outside unless recursion has been previously disabled. <command>Chroot</command> and <command>Setuid</command> On UNIX servers, it is possible to run BIND in a chrooted environment (using the chroot() function) by specifying the "" option for named. This can help improve system security by placing BIND in a "sandbox", which will limit the damage done if a server is compromised. Another useful feature in the UNIX version of BIND is the ability to run the daemon as an unprivileged user ( user ). We suggest running as an unprivileged user when using the chroot feature. Here is an example command line to load BIND in a chroot sandbox, /var/named, and to run named setuid to user 202: /usr/local/sbin/named -u 202 -t /var/named The <command>chroot</command> Environment In order for a chroot environment to work properly in a particular directory (for example, /var/named), you will need to set up an environment that includes everything BIND needs to run. From BIND's point of view, /var/named is the root of the filesystem. You will need to adjust the values of options like like directory and pid-file to account for this. Unlike with earlier versions of BIND, you typically will not need to compile named statically nor install shared libraries under the new root. However, depending on your operating system, you may need to set up things like /dev/zero, /dev/random, /dev/log, and /etc/localtime. Using the <command>setuid</command> Function Prior to running the named daemon, use the touch utility (to change file access and modification times) or the chown utility (to set the user id and/or group id) on files to which you want BIND to write. Note that if the named daemon is running as an unprivileged user, it will not be able to bind to new restricted ports if the server is reloaded. Dynamic Update Security Access to the dynamic update facility should be strictly limited. In earlier versions of BIND, the only way to do this was based on the IP address of the host requesting the update, by listing an IP address or network prefix in the allow-update zone option. This method is insecure since the source address of the update UDP packet is easily forged. Also note that if the IP addresses allowed by the allow-update option include the address of a slave server which performs forwarding of dynamic updates, the master can be trivially attacked by sending the update to the slave, which will forward it to the master with its own source IP address causing the master to approve it without question. For these reasons, we strongly recommend that updates be cryptographically authenticated by means of transaction signatures (TSIG). That is, the allow-update option should list only TSIG key names, not IP addresses or network prefixes. Alternatively, the new update-policy option can be used. Some sites choose to keep all dynamically-updated DNS data in a subdomain and delegate that subdomain to a separate zone. This way, the top-level zone containing critical data such as the IP addresses of public web and mail servers need not allow dynamic update at all. Troubleshooting Common Problems It's not working; how can I figure out what's wrong? The best solution to solving installation and configuration issues is to take preventative measures by setting up logging files beforehand. The log files provide a source of hints and information that can be used to figure out what went wrong and how to fix the problem. Incrementing and Changing the Serial Number Zone serial numbers are just numbers — they aren't date related. A lot of people set them to a number that represents a date, usually of the form YYYYMMDDRR. Occasionally they will make a mistake and set them to a "date in the future" then try to correct them by setting them to the "current date". This causes problems because serial numbers are used to indicate that a zone has been updated. If the serial number on the slave server is lower than the serial number on the master, the slave server will attempt to update its copy of the zone. Setting the serial number to a lower number on the master server than the slave server means that the slave will not perform updates to its copy of the zone. The solution to this is to add 2147483647 (2^31-1) to the number, reload the zone and make sure all slaves have updated to the new zone serial number, then reset the number to what you want it to be, and reload the zone again. Where Can I Get Help? The Internet Systems Consortium (ISC) offers a wide range of support and service agreements for BIND and DHCP servers. Four levels of premium support are available and each level includes support for all ISC programs, significant discounts on products and training, and a recognized priority on bug fixes and non-funded feature requests. In addition, ISC offers a standard support agreement package which includes services ranging from bug fix announcements to remote support. It also includes training in BIND and DHCP. To discuss arrangements for support, contact info@isc.org or visit the ISC web page at http://www.isc.org/services/support/ to read more. Appendices Acknowledgments A Brief History of the <acronym>DNS</acronym> and <acronym>BIND</acronym> Although the "official" beginning of the Domain Name System occurred in 1984 with the publication of RFC 920, the core of the new system was described in 1983 in RFCs 882 and 883. From 1984 to 1987, the ARPAnet (the precursor to today's Internet) became a testbed of experimentation for developing the new naming/addressing scheme in a rapidly expanding, operational network environment. New RFCs were written and published in 1987 that modified the original documents to incorporate improvements based on the working model. RFC 1034, "Domain Names-Concepts and Facilities", and RFC 1035, "Domain Names-Implementation and Specification" were published and became the standards upon which all DNS implementations are built. The first working domain name server, called "Jeeves", was written in 1983-84 by Paul Mockapetris for operation on DEC Tops-20 machines located at the University of Southern California's Information Sciences Institute (USC-ISI) and SRI International's Network Information Center (SRI-NIC). A DNS server for Unix machines, the Berkeley Internet Name Domain (BIND) package, was written soon after by a group of graduate students at the University of California at Berkeley under a grant from the US Defense Advanced Research Projects Administration (DARPA). Versions of BIND through 4.8.3 were maintained by the Computer Systems Research Group (CSRG) at UC Berkeley. Douglas Terry, Mark Painter, David Riggle and Songnian Zhou made up the initial BIND project team. After that, additional work on the software package was done by Ralph Campbell. Kevin Dunlap, a Digital Equipment Corporation employee on loan to the CSRG, worked on BIND for 2 years, from 1985 to 1987. Many other people also contributed to BIND development during that time: Doug Kingston, Craig Partridge, Smoot Carl-Mitchell, Mike Muuss, Jim Bloom and Mike Schwartz. BIND maintenance was subsequently handled by Mike Karels and Øivind Kure. BIND versions 4.9 and 4.9.1 were released by Digital Equipment Corporation (now Compaq Computer Corporation). Paul Vixie, then a DEC employee, became BIND's primary caretaker. He was assisted by Phil Almquist, Robert Elz, Alan Barrett, Paul Albitz, Bryan Beecher, Andrew Partan, Andy Cherenson, Tom Limoncelli, Berthold Paffrath, Fuat Baran, Anant Kumar, Art Harkin, Win Treese, Don Lewis, Christophe Wolfhugel, and others. In 1994, BIND version 4.9.2 was sponsored by Vixie Enterprises. Paul Vixie became BIND's principal architect/programmer. BIND versions from 4.9.3 onward have been developed and maintained by the Internet Systems Consortium and its predecessor, the Internet Software Consortium, with support being provided by ISC's sponsors. As co-architects/programmers, Bob Halley and Paul Vixie released the first production-ready version of BIND version 8 in May 1997. BIND version 9 was released in September 2000 and is a major rewrite of nearly all aspects of the underlying BIND architecture. BIND versions 4 and 8 are officially deprecated. No additional development is done on BIND version 4 or BIND version 8. BIND development work is made possible today by the sponsorship of several corporations, and by the tireless work efforts of numerous individuals. General <acronym>DNS</acronym> Reference Information IPv6 addresses (AAAA) IPv6 addresses are 128-bit identifiers for interfaces and sets of interfaces which were introduced in the DNS to facilitate scalable Internet routing. There are three types of addresses: Unicast, an identifier for a single interface; Anycast, an identifier for a set of interfaces; and Multicast, an identifier for a set of interfaces. Here we describe the global Unicast address scheme. For more information, see RFC 3587, "Global Unicast Address Format." IPv6 unicast addresses consist of a global routing prefix, a subnet identifier, and an interface identifier. The global routing prefix is provided by the upstream provider or ISP, and (roughly) corresponds to the IPv4 network section of the address range. The subnet identifier is for local subnetting, much the same as subnetting an IPv4 /16 network into /24 subnets. The interface identifier is the address of an individual interface on a given network; in IPv6, addresses belong to interfaces rather than to machines. The subnetting capability of IPv6 is much more flexible than that of IPv4: subnetting can be carried out on bit boundaries, in much the same way as Classless InterDomain Routing (CIDR), and the DNS PTR representation ("nibble" format) makes setting up reverse zones easier. The Interface Identifier must be unique on the local link, and is usually generated automatically by the IPv6 implementation, although it is usually possible to override the default setting if necessary. A typical IPv6 address might look like: 2001:db8:201:9:a00:20ff:fe81:2b32 IPv6 address specifications often contain long strings of zeros, so the architects have included a shorthand for specifying them. The double colon (`::') indicates the longest possible string of zeros that can fit, and can be used only once in an address. Bibliography (and Suggested Reading) Request for Comments (RFCs) Specification documents for the Internet protocol suite, including the DNS, are published as part of the Request for Comments (RFCs) series of technical notes. The standards themselves are defined by the Internet Engineering Task Force (IETF) and the Internet Engineering Steering Group (IESG). RFCs can be obtained online via FTP at: ftp://www.isi.edu/in-notes/RFCxxxx.txt (where xxxx is the number of the RFC). RFCs are also available via the Web at: http://www.ietf.org/rfc/. Standards RFC974 Partridge C. Mail Routing and the Domain System January 1986 RFC1034 Mockapetris P.V. Domain Names — Concepts and Facilities November 1987 RFC1035 Mockapetris P. V. Domain Names — Implementation and Specification November 1987 Proposed Standards RFC2181 Elz R., R. Bush Clarifications to the <acronym>DNS</acronym> Specification July 1997 RFC2308 Andrews M. Negative Caching of <acronym>DNS</acronym> Queries March 1998 RFC1995 Ohta M. Incremental Zone Transfer in <acronym>DNS</acronym> August 1996 RFC1996 Vixie P. A Mechanism for Prompt Notification of Zone Changes August 1996 RFC2136 Vixie P. S. Thomson Y. Rekhter J. Bound Dynamic Updates in the Domain Name System April 1997 RFC2671 P. Vixie Extension Mechanisms for DNS (EDNS0) August 1997 RFC2672 M. Crawford Non-Terminal DNS Name Redirection August 1999 RFC2845 Vixie P. O. Gudmundsson D. Eastlake 3rd B. Wellington Secret Key Transaction Authentication for <acronym>DNS</acronym> (TSIG) May 2000 RFC2930 D. Eastlake 3rd Secret Key Establishment for DNS (TKEY RR) September 2000 RFC2931 D. Eastlake 3rd DNS Request and Transaction Signatures (SIG(0)s) September 2000 RFC3007 B. Wellington Secure Domain Name System (DNS) Dynamic Update November 2000 RFC3645 S. Kwan P. Garg J. Gilroy L. Esibov J. Westhead R. Hall Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG) October 2003 <acronym>DNS</acronym> Security Proposed Standards RFC3225 D. Conrad Indicating Resolver Support of DNSSEC December 2001 RFC3833 D. Atkins R. Austein Threat Analysis of the Domain Name System (DNS) August 2004 RFC4033 R. Arends R. Austein M. Larson D. Massey S. Rose DNS Security Introduction and Requirements March 2005 RFC4034 R. Arends R. Austein M. Larson D. Massey S. Rose Resource Records for the DNS Security Extensions March 2005 RFC4035 R. Arends R. Austein M. Larson D. Massey S. Rose Protocol Modifications for the DNS Security Extensions March 2005 Other Important RFCs About <acronym>DNS</acronym> Implementation RFC1535 Gavron E. A Security Problem and Proposed Correction With Widely Deployed <acronym>DNS</acronym> Software. October 1993 RFC1536 Kumar A. J. Postel C. Neuman P. Danzig S. Miller Common <acronym>DNS</acronym> Implementation Errors and Suggested Fixes October 1993 RFC1982 Elz R. R. Bush Serial Number Arithmetic August 1996 RFC4074 Morishita Y. T. Jinmei Common Misbehaviour Against <acronym>DNS</acronym> Queries for IPv6 Addresses May 2005 Resource Record Types RFC1183 Everhart C.F. L. A. Mamakos R. Ullmann P. Mockapetris New <acronym>DNS</acronym> RR Definitions October 1990 RFC1706 Manning B. R. Colella <acronym>DNS</acronym> NSAP Resource Records October 1994 RFC2168 Daniel R. M. Mealling Resolution of Uniform Resource Identifiers using the Domain Name System June 1997 RFC1876 Davis C. P. Vixie T. Goodwin I. Dickinson A Means for Expressing Location Information in the Domain Name System January 1996 RFC2052 Gulbrandsen A. P. Vixie A <acronym>DNS</acronym> RR for Specifying the Location of Services. October 1996 RFC2163 Allocchio A. Using the Internet <acronym>DNS</acronym> to Distribute MIXER Conformant Global Address Mapping January 1998 RFC2230 Atkinson R. Key Exchange Delegation Record for the <acronym>DNS</acronym> October 1997 RFC2536 Eastlake D. 3rd DSA KEYs and SIGs in the Domain Name System (DNS) March 1999 RFC2537 Eastlake D. 3rd RSA/MD5 KEYs and SIGs in the Domain Name System (DNS) March 1999 RFC2538 Eastlake D. 3rd Gudmundsson O. Storing Certificates in the Domain Name System (DNS) March 1999 RFC2539 Eastlake D. 3rd Storage of Diffie-Hellman Keys in the Domain Name System (DNS) March 1999 RFC2540 Eastlake D. 3rd Detached Domain Name System (DNS) Information March 1999 RFC2782 Gulbrandsen A. Vixie P. Esibov L. A DNS RR for specifying the location of services (DNS SRV) February 2000 RFC2915 Mealling M. Daniel R. The Naming Authority Pointer (NAPTR) DNS Resource Record September 2000 RFC3110 Eastlake D. 3rd RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS) May 2001 RFC3123 Koch P. A DNS RR Type for Lists of Address Prefixes (APL RR) June 2001 RFC3596 Thomson S. C. Huitema V. Ksinant M. Souissi <acronym>DNS</acronym> Extensions to support IP version 6 October 2003 RFC3597 Gustafsson A. Handling of Unknown DNS Resource Record (RR) Types September 2003 <acronym>DNS</acronym> and the Internet RFC1101 Mockapetris P. V. <acronym>DNS</acronym> Encoding of Network Names and Other Types April 1989 RFC1123 Braden R. Requirements for Internet Hosts - Application and Support October 1989 RFC1591 Postel J. Domain Name System Structure and Delegation March 1994 RFC2317 Eidnes H. G. de Groot P. Vixie Classless IN-ADDR.ARPA Delegation March 1998 RFC2826 Internet Architecture Board IAB Technical Comment on the Unique DNS Root May 2000 RFC2929 Eastlake D. 3rd Brunner-Williams E. Manning B. Domain Name System (DNS) IANA Considerations September 2000 <acronym>DNS</acronym> Operations RFC1033 Lottor M. Domain administrators operations guide. November 1987 RFC1537 Beertema P. Common <acronym>DNS</acronym> Data File Configuration Errors October 1993 RFC1912 Barr D. Common <acronym>DNS</acronym> Operational and Configuration Errors February 1996 RFC2010 Manning B. P. Vixie Operational Criteria for Root Name Servers. October 1996 RFC2219 Hamilton M. R. Wright Use of <acronym>DNS</acronym> Aliases for Network Services. October 1997 Internationalized Domain Names RFC2825 IAB Daigle R. A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols May 2000 RFC3490 Faltstrom P. Hoffman P. Costello A. Internationalizing Domain Names in Applications (IDNA) March 2003 RFC3491 Hoffman P. Blanchet M. Nameprep: A Stringprep Profile for Internationalized Domain Names March 2003 RFC3492 Costello A. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) March 2003 Other <acronym>DNS</acronym>-related RFCs Note: the following list of RFCs, although DNS-related, are not concerned with implementing software. RFC1464 Rosenbaum R. Using the Domain Name System To Store Arbitrary String Attributes May 1993 RFC1713 Romao A. Tools for <acronym>DNS</acronym> Debugging November 1994 RFC1794 Brisco T. <acronym>DNS</acronym> Support for Load Balancing April 1995 RFC2240 Vaughan O. A Legal Basis for Domain Name Allocation November 1997 RFC2345 Klensin J. T. Wolf G. Oglesby Domain Names and Company Name Retrieval May 1998 RFC2352 Vaughan O. A Convention For Using Legal Names as Domain Names May 1998 RFC3071 Klensin J. Reflections on the DNS, RFC 1591, and Categories of Domains February 2001 RFC3258 Hardie T. Distributing Authoritative Name Servers via Shared Unicast Addresses April 2002 RFC3901 Durand A. J. Ihren DNS IPv6 Transport Operational Guidelines September 2004 Obsolete and Unimplemented Experimental RFC RFC1712 Farrell C. M. Schulze S. Pleitner D. Baldoni <acronym>DNS</acronym> Encoding of Geographical Location November 1994 RFC2673 Crawford M. Binary Labels in the Domain Name System August 1999 RFC2874 Crawford M. Huitema C. DNS Extensions to Support IPv6 Address Aggregation and Renumbering July 2000 Obsoleted DNS Security RFCs Most of these have been consolidated into RFC4033, RFC4034 and RFC4035 which collectively describe DNSSECbis. RFC2065 Eastlake 3rd D. C. Kaufman Domain Name System Security Extensions January 1997 RFC2137 Eastlake 3rd D. Secure Domain Name System Dynamic Update April 1997 RFC2535 Eastlake 3rd D. Domain Name System Security Extensions March 1999 RFC3008 Wellington B. Domain Name System Security (DNSSEC) Signing Authority November 2000 RFC3090 Lewis E. DNS Security Extension Clarification on Zone Status March 2001 RFC3445 Massey D. Rose S. Limiting the Scope of the KEY Resource Record (RR) December 2002 RFC3655 Wellington B. Gudmundsson O. Redefinition of DNS Authenticated Data (AD) bit November 2003 RFC3658 Gudmundsson O. Delegation Signer (DS) Resource Record (RR) December 2003 RFC3755 Weiler S. Legacy Resolver Compatibility for Delegation Signer (DS) May 2004 RFC3757 Kolkman O. Schlyter J. Lewis E. Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag April 2004 RFC3845 Schlyter J. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format August 2004 Internet Drafts Internet Drafts (IDs) are rough-draft working documents of the Internet Engineering Task Force. They are, in essence, RFCs in the preliminary stages of development. Implementors are cautioned not to regard IDs as archival, and they should not be quoted or cited in any formal documents unless accompanied by the disclaimer that they are "works in progress." IDs have a lifespan of six months after which they are deleted unless updated by their authors. Other Documents About <acronym>BIND</acronym> Albitz Paul Cricket Liu <acronym>DNS</acronym> and <acronym>BIND</acronym> 1998 Sebastopol, CA: O'Reilly and Associates Manual pages bind9-9.9.5.dfsg/doc/arm/man.dnssec-verify.html0000644000470500017500000001563512271526120020613 0ustar lamontlamont dnssec-verify

    Name

    dnssec-verify — DNSSEC zone verification tool

    Synopsis

    dnssec-verify [-c class] [-E engine] [-I input-format] [-o origin] [-v level] [-x] [-z] {zonefile}

    DESCRIPTION

    dnssec-verify verifies that a zone is fully signed for each algorithm found in the DNSKEY RRset for the zone, and that the NSEC / NSEC3 chains are complete.

    OPTIONS

    -c class

    Specifies the DNS class of the zone.

    -I input-format

    The format of the input zone file. Possible formats are "text" (default) and "raw". This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non-text format containing updates can be verified independently. The use of this option does not make much sense for non-dynamic zones.

    -o origin

    The zone origin. If not specified, the name of the zone file is assumed to be the origin.

    -v level

    Sets the debugging level.

    -x

    Only verify that the DNSKEY RRset is signed with key-signing keys. Without this flag, it is assumed that the DNSKEY RRset will be signed by all active keys. When this flag is set, it will not be an error if the DNSKEY RRset is not signed by zone-signing keys. This corresponds to the -x option in dnssec-signzone.

    -z

    Ignore the KSK flag on the keys when determining whether the zone if correctly signed. Without this flag it is assumed that there will be a non-revoked, self-signed DNSKEY with the KSK flag set for each algorithm and that RRsets other than DNSKEY RRset will be signed with a different DNSKEY without the KSK flag set.

    With this flag set, we only require that for each algorithm, there will be at least one non-revoked, self-signed DNSKEY, regardless of the KSK flag state, and that other RRsets will be signed by a non-revoked key for the same algorithm that includes the self-signed key; the same key may be used for both purposes. This corresponds to the -z option in dnssec-signzone.

    zonefile

    The file containing the zone to be signed.

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.named-checkconf.html0000644000470500017500000001572512271526120021037 0ustar lamontlamont named-checkconf

    Name

    named-checkconf — named configuration file syntax checking tool

    Synopsis

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

    DESCRIPTION

    named-checkconf checks the syntax, but not the semantics, of a named configuration file. The file is parsed and checked for syntax errors, along with all files included by it. If no file is specified, /etc/named.conf is read by default.

    Note: files that named reads in separate parser contexts, such as rndc.key and bind.keys, are not automatically read by named-checkconf. Configuration errors in these files may cause named to fail to run, even if named-checkconf was successful. named-checkconf can be run on these files explicitly, however.

    OPTIONS

    -h

    Print the usage summary and exit.

    -t directory

    Chroot to directory so that include directives in the configuration file are processed as if run by a similarly chrooted named.

    -v

    Print the version of the named-checkconf program and exit.

    -p

    Print out the named.conf and included files in canonical form if no errors were detected.

    -x

    When printing the configuration files in canonical form, obscure shared secrets by replacing them with strings of question marks ('?'). This allows the contents of named.conf and related files to be shared — for example, when submitting bug reports — without compromising private data. This option cannot be used without -p.

    -z

    Perform a test load of all master zones found in named.conf.

    -j

    When loading a zonefile read the journal if it exists.

    filename

    The name of the configuration file to be checked. If not specified, it defaults to /etc/named.conf.

    RETURN VALUES

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

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch02.html0000644000470500017500000001672112271526120017010 0ustar lamontlamont Chapter 2. BIND Resource Requirements

    Chapter 2. BIND Resource Requirements

    Hardware requirements

    DNS hardware requirements have traditionally been quite modest. For many installations, servers that have been pensioned off from active duty have performed admirably as DNS servers.

    The DNSSEC features of BIND 9 may prove to be quite CPU intensive however, so organizations that make heavy use of these features may wish to consider larger systems for these applications. BIND 9 is fully multithreaded, allowing full utilization of multiprocessor systems for installations that need it.

    CPU Requirements

    CPU requirements for BIND 9 range from i486-class machines for serving of static zones without caching, to enterprise-class machines if you intend to process many dynamic updates and DNSSEC signed zones, serving many thousands of queries per second.

    Memory Requirements

    The memory of the server has to be large enough to fit the cache and zones loaded off disk. The max-cache-size option can be used to limit the amount of memory used by the cache, at the expense of reducing cache hit rates and causing more DNS traffic. Additionally, if additional section caching (the section called “Additional Section Caching”) is enabled, the max-acache-size option can be used to limit the amount of memory used by the mechanism. It is still good practice to have enough memory to load all zone and cache data into memory — unfortunately, the best way to determine this for a given installation is to watch the name server in operation. After a few weeks the server process should reach a relatively stable size where entries are expiring from the cache as fast as they are being inserted.

    Name Server Intensive Environment Issues

    For name server intensive environments, there are two alternative configurations that may be used. The first is where clients and any second-level internal name servers query a main name server, which has enough memory to build a large cache. This approach minimizes the bandwidth used by external name lookups. The second alternative is to set up second-level internal name servers to make queries independently. In this configuration, none of the individual machines needs to have as much memory or CPU power as in the first alternative, but this has the disadvantage of making many more external queries, as none of the name servers share their cached data.

    Supported Operating Systems

    ISC BIND 9 compiles and runs on a large number of Unix-like operating systems and on Microsoft Windows Server 2003 and 2008, and Windows XP and Vista. For an up-to-date list of supported systems, see the README file in the top level directory of the BIND 9 source distribution.

    bind9-9.9.5.dfsg/doc/arm/man.named.html0000644000470500017500000003737412271526120017122 0ustar lamontlamont named

    Name

    named — Internet domain name server

    Synopsis

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

    DESCRIPTION

    named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more information on the DNS, see RFCs 1033, 1034, and 1035.

    When invoked without arguments, named will read the default configuration file /etc/named.conf, read any initial data, and listen for queries.

    OPTIONS

    -4

    Use IPv4 only even if the host machine is capable of IPv6. -4 and -6 are mutually exclusive.

    -6

    Use IPv6 only even if the host machine is capable of IPv4. -4 and -6 are mutually exclusive.

    -c config-file

    Use config-file as the configuration file instead of the default, /etc/named.conf. To ensure that reloading the configuration file continues to work after the server has changed its working directory due to to a possible directory option in the configuration file, config-file should be an absolute pathname.

    -d debug-level

    Set the daemon's debug level to debug-level. Debugging traces from named become more verbose as the debug level increases.

    -E engine-name

    Use a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance re-signing with private keys from a secure key store. When compiled with PKCS#11 support engine-name defaults to pkcs11, the empty name resets it to no engine.

    -f

    Run the server in the foreground (i.e. do not daemonize).

    -g

    Run the server in the foreground and force all logging to stderr.

    -m flag

    Turn on memory usage debugging flags. Possible flags are usage, trace, record, size, and mctx. These correspond to the ISC_MEM_DEBUGXXXX flags described in <isc/mem.h>.

    -n #cpus

    Create #cpus worker threads to take advantage of multiple CPUs. If not specified, named will try to determine the number of CPUs present and create one thread per CPU. If it is unable to determine the number of CPUs, a single worker thread will be created.

    -p port

    Listen for queries on port port. If not specified, the default is port 53.

    -s

    Write memory usage statistics to stdout on exit.

    Note

    This option is mainly of interest to BIND 9 developers and may be removed or changed in a future release.

    -S #max-socks

    Allow named to use up to #max-socks sockets.

    Warning

    This option should be unnecessary for the vast majority of users. The use of this option could even be harmful because the specified value may exceed the limitation of the underlying system API. It is therefore set only when the default configuration causes exhaustion of file descriptors and the operational environment is known to support the specified number of sockets. Note also that the actual maximum number is normally a little fewer than the specified value because named reserves some file descriptors for its internal use.

    -t directory

    Chroot to directory after processing the command line arguments, but before reading the configuration file.

    Warning

    This option should be used in conjunction with the -u option, as chrooting a process running as root doesn't enhance security on most systems; the way chroot(2) is defined allows a process with root privileges to escape a chroot jail.

    -U #listeners

    Use #listeners worker threads to listen for incoming UDP packets on each address. If not specified, named will use the number of detected CPUs. If -n has been set to a higher value than the number of CPUs, then -U may be increased as high as that value, but no higher.

    -u user

    Setuid to user after completing privileged operations, such as creating sockets that listen on privileged ports.

    Note

    On Linux, named uses the kernel's capability mechanism to drop all root privileges except the ability to bind(2) to a privileged port and set process resource limits. Unfortunately, this means that the -u option only works when named is run on kernel 2.2.18 or later, or kernel 2.3.99-pre3 or later, since previous kernels did not allow privileges to be retained after setuid(2).

    -v

    Report the version number and exit.

    -V

    Report the version number and build options, and exit.

    -x cache-file

    Load data from cache-file into the cache of the default view.

    Warning

    This option must not be used. It is only of interest to BIND 9 developers and may be removed or changed in a future release.

    SIGNALS

    In routine operation, signals should not be used to control the nameserver; rndc should be used instead.

    SIGHUP

    Force a reload of the server.

    SIGINT, SIGTERM

    Shut down the server.

    The result of sending any other signals to the server is undefined.

    CONFIGURATION

    The named configuration file is too complex to describe in detail here. A complete description is provided in the BIND 9 Administrator Reference Manual.

    named inherits the umask (file creation mode mask) from the parent process. If files created by named, such as journal files, need to have custom permissions, the umask should be set explicitly in the script used to start the named process.

    FILES

    /etc/named.conf

    The default configuration file.

    /var/run/named/named.pid

    The default process-id file.

    SEE ALSO

    RFC 1033, RFC 1034, RFC 1035, named-checkconf(8), named-checkzone(8), rndc(8), lwresd(8), named.conf(5), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.dnssec-keygen.html0000644000470500017500000005353212271526120020567 0ustar lamontlamont dnssec-keygen

    Name

    dnssec-keygen — DNSSEC key generation tool

    Synopsis

    dnssec-keygen [-a algorithm] [-b keysize] [-n nametype] [-3] [-A date/offset] [-C] [-c class] [-D date/offset] [-E engine] [-f flag] [-G] [-g generator] [-h] [-I date/offset] [-i interval] [-K directory] [-L ttl] [-k] [-P date/offset] [-p protocol] [-q] [-R date/offset] [-r randomdev] [-S key] [-s strength] [-t type] [-v level] [-z] {name}

    DESCRIPTION

    dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY (Transaction Key) as defined in RFC 2930.

    The name of the key is specified on the command line. For DNSSEC keys, this must match the name of the zone for which the key is being generated.

    OPTIONS

    -a algorithm

    Selects the cryptographic algorithm. For DNSSEC keys, the value of algorithm must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256 or ECDSAP384SHA384. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are case insensitive.

    If no algorithm is specified, then RSASHA1 will be used by default, unless the -3 option is specified, in which case NSEC3RSASHA1 will be used instead. (If -3 is used and an algorithm is specified, that algorithm will be checked for compatibility with NSEC3.)

    Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is mandatory.

    Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512 automatically set the -T KEY option.

    -b keysize

    Specifies the number of bits in the key. The choice of key size depends on the algorithm used. RSA keys must be between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits. Elliptic curve algorithms don't need this parameter.

    The key size does not need to be specified if using a default algorithm. The default key size is 1024 bits for zone signing keys (ZSK's) and 2048 bits for key signing keys (KSK's, generated with -f KSK). However, if an algorithm is explicitly specified with the -a, then there is no default key size, and the -b must be used.

    -n nametype

    Specifies the owner type of the key. The value of nametype must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive. Defaults to ZONE for DNSKEY generation.

    -3

    Use an NSEC3-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default. Note that RSASHA256, RSASHA512, ECCGOST, ECDSAP256SHA256 and ECDSAP384SHA384 algorithms are NSEC3-capable.

    -C

    Compatibility mode: generates an old-style key, without any metadata. By default, dnssec-keygen will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the -C option suppresses them.

    -c class

    Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.

    -E engine

    Uses a crypto hardware (OpenSSL engine) for random number and, when supported, key generation. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.

    -f flag

    Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.

    -G

    Generate a key, but do not publish it or sign with it. This option is incompatible with -P and -A.

    -g generator

    If generating a Diffie Hellman key, use this generator. Allowed values are 2 and 5. If no generator is specified, a known prime from RFC 2539 will be used if possible; otherwise the default is 2.

    -h

    Prints a short summary of the options and arguments to dnssec-keygen.

    -K directory

    Sets the directory in which the key files are to be written.

    -k

    Deprecated in favor of -T KEY.

    -L ttl

    Sets the default TTL to use for this key when it is converted into a DNSKEY RR. If the key is imported into a zone, this is the TTL that will be used for it, unless there was already a DNSKEY RRset in place, in which case the existing TTL would take precedence. Setting the default TTL to 0 or none removes it.

    -p protocol

    Sets the protocol value for the generated key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.

    -q

    Quiet mode: Suppresses unnecessary output, including progress indication. Without this option, when dnssec-keygen is run interactively to generate an RSA or DSA key pair, it will print a string of symbols to stderr indicating the progress of the key generation. A '.' indicates that a random number has been found which passed an initial sieve test; '+' means a number has passed a single round of the Miller-Rabin primality test; a space means that the number has passed all the tests and is a satisfactory key.

    -r randomdev

    Specifies the source of randomness. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -S key

    Create a new key which is an explicit successor to an existing key. The name, algorithm, size, and type of the key will be set to match the existing key. The activation date of the new key will be set to the inactivation date of the existing one. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.

    -s strength

    Specifies the strength value of the key. The strength is a number between 0 and 15, and currently has no defined purpose in DNSSEC.

    -T rrtype

    Specifies the resource record type to use for the key. rrtype must be either DNSKEY or KEY. The default is DNSKEY when using a DNSSEC algorithm, but it can be overridden to KEY for use with SIG(0).

    Using any TSIG algorithm (HMAC-* or DH) forces this option to KEY.

    -t type

    Indicates the use of the key. type must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF. AUTH refers to the ability to authenticate data, and CONF the ability to encrypt data.

    -v level

    Sets the debugging level.

    TIMING OPTIONS

    Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24-hour days, ignoring leap years), months (defined as 30 24-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.

    -P date/offset

    Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the -G option has not been used, the default is "now".

    -A date/offset

    Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the -G option has not been used, the default is "now".

    -R date/offset

    Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.

    -I date/offset

    Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.

    -D date/offset

    Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)

    -i interval

    Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.

    If the key is being created as an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.

    As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.

    GENERATED KEYS

    When dnssec-keygen completes successfully, it prints a string of the form Knnnn.+aaa+iiiii to the standard output. This is an identification string for the key it has generated.

    • nnnn is the key name.

    • aaa is the numeric representation of the algorithm.

    • iiiii is the key identifier (or footprint).

    dnssec-keygen creates two files, with names based on the printed string. Knnnn.+aaa+iiiii.key contains the public key, and Knnnn.+aaa+iiiii.private contains the private key.

    The .key file contains a DNS KEY record that can be inserted into a zone file (directly or with a $INCLUDE statement).

    The .private file contains algorithm-specific fields. For obvious security reasons, this file does not have general read permission.

    Both .key and .private files are generated for symmetric encryption algorithms such as HMAC-MD5, even though the public and private key are equivalent.

    EXAMPLE

    To generate a 768-bit DSA key for the domain example.com, the following command would be issued:

    dnssec-keygen -a DSA -b 768 -n ZONE example.com

    The command would print a string of the form:

    Kexample.com.+003+26160

    In this example, dnssec-keygen creates the files Kexample.com.+003+26160.key and Kexample.com.+003+26160.private.

    SEE ALSO

    dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, RFC 2845, RFC 4034.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.named-checkzone.html0000644000470500017500000004454612271526120021070 0ustar lamontlamont named-checkzone

    Name

    named-checkzone, named-compilezone — zone file validity checking or converting tool

    Synopsis

    named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-M mode] [-n mode] [-L serial] [-o filename] [-r mode] [-s style] [-S mode] [-t directory] [-T mode] [-w directory] [-D] [-W mode] {zonename} {filename}

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

    DESCRIPTION

    named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a zone. This makes named-checkzone useful for checking zone files before configuring them into a name server.

    named-compilezone is similar to named-checkzone, but it always dumps the zone contents to a specified file in a specified format. Additionally, it applies stricter check levels by default, since the dump output will be used as an actual zone file loaded by named. When manually specified otherwise, the check levels must at least be as strict as those specified in the named configuration file.

    OPTIONS

    -d

    Enable debugging.

    -h

    Print the usage summary and exit.

    -q

    Quiet mode - exit code only.

    -v

    Print the version of the named-checkzone program and exit.

    -j

    When loading the zone file read the journal if it exists.

    -c class

    Specify the class of the zone. If not specified, "IN" is assumed.

    -i mode

    Perform post-load zone integrity checks. Possible modes are "full" (default), "full-sibling", "local", "local-sibling" and "none".

    Mode "full" checks that MX records refer to A or AAAA record (both in-zone and out-of-zone hostnames). Mode "local" only checks MX records which refer to in-zone hostnames.

    Mode "full" checks that SRV records refer to A or AAAA record (both in-zone and out-of-zone hostnames). Mode "local" only checks SRV records which refer to in-zone hostnames.

    Mode "full" checks that delegation NS records refer to A or AAAA record (both in-zone and out-of-zone hostnames). It also checks that glue address records in the zone match those advertised by the child. Mode "local" only checks NS records which refer to in-zone hostnames or that some required glue exists, that is when the nameserver is in a child zone.

    Mode "full-sibling" and "local-sibling" disable sibling glue checks but are otherwise the same as "full" and "local" respectively.

    Mode "none" disables the checks.

    -f format

    Specify the format of the zone file. Possible formats are "text" (default) and "raw".

    -F format

    Specify the format of the output file specified. For named-checkzone, this does not cause any effects unless it dumps the zone contents.

    Possible formats are "text" (default) and "raw" or "raw=N", which store the zone in a binary format for rapid loading by named. "raw=N" specifies the format version of the raw zone file: if N is 0, the raw file can be read by any version of named; if N is 1, the file can be read by release 9.9.0 or higher. The default is 1.

    -k mode

    Perform "check-names" checks with the specified failure mode. Possible modes are "fail" (default for named-compilezone), "warn" (default for named-checkzone) and "ignore".

    -L serial

    When compiling a zone to 'raw' format, set the "source serial" value in the header to the specified serial number. (This is expected to be used primarily for testing purposes.)

    -m mode

    Specify whether MX records should be checked to see if they are addresses. Possible modes are "fail", "warn" (default) and "ignore".

    -M mode

    Check if a MX record refers to a CNAME. Possible modes are "fail", "warn" (default) and "ignore".

    -n mode

    Specify whether NS records should be checked to see if they are addresses. Possible modes are "fail" (default for named-compilezone), "warn" (default for named-checkzone) and "ignore".

    -o filename

    Write zone output to filename. If filename is - then write to standard out. This is mandatory for named-compilezone.

    -r mode

    Check for records that are treated as different by DNSSEC but are semantically equal in plain DNS. Possible modes are "fail", "warn" (default) and "ignore".

    -s style

    Specify the style of the dumped zone file. Possible styles are "full" (default) and "relative". The full format is most suitable for processing automatically by a separate script. On the other hand, the relative format is more human-readable and is thus suitable for editing by hand. For named-checkzone this does not cause any effects unless it dumps the zone contents. It also does not have any meaning if the output format is not text.

    -S mode

    Check if a SRV record refers to a CNAME. Possible modes are "fail", "warn" (default) and "ignore".

    -t directory

    Chroot to directory so that include directives in the configuration file are processed as if run by a similarly chrooted named.

    -T mode

    Check if Sender Policy Framework records (TXT and SPF) both exist or both don't exist. A warning is issued if they don't match. Possible modes are "warn" (default), "ignore".

    -w directory

    chdir to directory so that relative filenames in master file $INCLUDE directives work. This is similar to the directory clause in named.conf.

    -D

    Dump zone file in canonical format. This is always enabled for named-compilezone.

    -W mode

    Specify whether to check for non-terminal wildcards. Non-terminal wildcards are almost always the result of a failure to understand the wildcard matching algorithm (RFC 1034). Possible modes are "warn" (default) and "ignore".

    zonename

    The domain name of the zone being checked.

    filename

    The name of the zone file.

    RETURN VALUES

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

    SEE ALSO

    named(8), named-checkconf(8), RFC 1035, BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Makefile.in0000644000470500017500000000506212271526120016430 0ustar lamontlamont# Copyright (C) 2004-2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001, 2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.22 2009/02/12 23:47:56 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_RULES@ @BIND9_VERSION@ MANOBJS = Bv9ARM.html PDFOBJS = Bv9ARM.pdf doc man:: ${MANOBJS} ${PDFOBJS} clean:: rm -f Bv9ARM.aux Bv9ARM.brf Bv9ARM.glo Bv9ARM.idx Bv9ARM.toc rm -f Bv9ARM.log Bv9ARM.out Bv9ARM.tex Bv9ARM.tex.tmp docclean manclean maintainer-clean:: clean rm -f *.html ${PDFOBJS} docclean manclean maintainer-clean distclean:: rm -f releaseinfo.xml Bv9ARM.html: Bv9ARM-book.xml releaseinfo.xml expand Bv9ARM-book.xml | \ ${XSLTPROC} --stringparam root.filename Bv9ARM \ ${top_srcdir}/doc/xsl/isc-docbook-chunk.xsl - Bv9ARM-all.html: Bv9ARM-book.xml releaseinfo.xml expand Bv9ARM-book.xml | \ ${XSLTPROC} -o Bv9ARM-all.html ../xsl/isc-docbook-html.xsl - Bv9ARM.tex: Bv9ARM-book.xml releaseinfo.xml expand Bv9ARM-book.xml | \ ${XSLTPROC} ${top_srcdir}/doc/xsl/pre-latex.xsl - | \ ${XSLTPROC} ${top_srcdir}/doc/xsl/isc-docbook-latex.xsl - | \ @PERL@ latex-fixup.pl >$@.tmp if test -s $@.tmp; then mv $@.tmp $@; else rm -f $@.tmp; exit 1; fi Bv9ARM.dvi: Bv9ARM.tex releaseinfo.xml rm -f Bv9ARM-book.aux Bv9ARM-book.dvi Bv9ARM-book.log ${LATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) ${LATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) ${LATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) Bv9ARM.pdf: Bv9ARM.tex releaseinfo.xml rm -f Bv9ARM-book.aux Bv9ARM-book.pdf Bv9ARM-book.log ${PDFLATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) ${PDFLATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) ${PDFLATEX} '\batchmode\input Bv9ARM.tex' || (rm -f $@ ; exit 1) releaseinfo.xml: echo >$@ 'BIND Version ${VERSION}' bind9-9.9.5.dfsg/doc/arm/isc-logo.pdf0000644000470500017500000106236712271526120016606 0ustar lamontlamont%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[16 0 R 38 0 R 60 0 R 82 0 R]>>/Type/Catalog>> endobj 93 0 obj <>stream application/pdf ISC_logo_only_RGB Adobe Illustrator CS3 2010-03-03T12:03:19-08:00 2010-04-12T11:34:01-07:00 2010-04-12T11:34:01-07:00 256 100 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAZAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AimFDsVdirsVdirsVbAJN BuT0GKvQfLn5R3ctkNY81Xa6Boy0YmYhZ3B3oqt9ivblv/knFKZP5/8Ay98sAweUNBS+uk2/St+C SSP2lDVkofbh8sVSPUvzn/MG9Y8dQWzjP+6raKNQPkzB3/4bFCXRfmb5+ikMi65dFiakMwdf+BYE YqyCx/O7X3i+qeYbG012xf8AvY5oljc/LiPT/wCExSipPJ3kXzpE0/ky6/RmsBS8mh3horUFT6TE t+BI9lxV5xqel6jpd9LY6hbvbXcJpJDIKEeB9wexGxxQhcVdirsVdirsVdirsVTGx8ueYL+0kvLL Tbm5tIq+pPFE7oKdfiUEbd8VS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUXpel6hqt9FYaf A9zdznjHEgqT4n2A6knpir1SOx8pfldbJcaj6etec3UNDaqaxW1RUMa/Z/1iOR/ZAFTil5x5l82a 95kvTd6tctMwr6UI+GKMHsidB+s98UJPirsVdirsVXwzTQTJNBI0U0bBo5EJVlYbgqRuCMVepaPr +k/mJp6eXvM7pbeY4146RrfEAyN2ilpTc+HRu1G6qXnWu6FqehapPpmpReldQGjDqrA7qynurDoc UJfirsVdirsVdirLfy98nwa9fT3epyG38v6Un1jU7mtPhAJEakd2oenb3piqeXv53a/DqsQ0GKKw 8v2hVLfTBFHR4kP7bcSylh/IRT36lSln5raRY2+uW2s6anDTPMFsmoQKBQK8g/eLt7kMfnihhOKu xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVNfLnmbWPLl+1/pMwguWiaFmKq44PQnZgR1UHFUvurq5u riS5uZWmuJmLyyyEszMepJOKqWKuxV2KuxV2KuxVtHZGDoSrqQVYGhBHQg4q9ZtZI/zO8pNaTU/x pokfK3lJAN3AOzE9+x8Gof2jil5O6PG7RyKUdCVdGFCCNiCDihbirsVdiq+KKSaVIolLyyMFRFFS WY0AA98VelfmFLH5U8qab5Fs2Au5VW916RD9qVt1jJ8Kj7lXxxS8yxQ9H8xx/XvyZ8s35+KXT7ue zY9wsjOw/CNMUvOMUOxVP/LvkXzX5hIOl6fJLATQ3L/u4R4/vHopp4DfFWbw/krpumosvmrzJbWJ pU20FGcj/JaQqfujOWY8M5/SCXHz6vFh+uQj8VddP/IvTvhMV/rBH7RZ1/UbUZmQ7MzHnQdTl9pN JHkZS9w/XTjrv5RoCkflN2RvtF3+IfI82P45cOyJ/wA4OIfavF0hL7FrN+SN+SkmkXums23rROzA e9PVk/4hkJdlZRyILdj9qNMTuJR+A/Whrn8n9J1WJ5/JmvRX5UcvqN1SOYL/AKwC7/60aj3zBy4J 4/qFO502uw5x+7kJff8ALm851XSNT0m9ex1K2ktLqP7UUgoadiOxB7EbZU5SDxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2Kpl5d12+0HWbXVrJqT2rhuJ6OvRkb2Zag4qzX82tCsLhbHzroq/wC4rXFD XAA/u7mh5cqdC1DX/KVsUvOMUOxV2KvQfyZ0O2ufME+u39F03y/CbuZzuPUoTH/wIVn+YGKsQ8x6 1ca5rt9q1xtJeStJx68V6In+xUBcVS3FU2PmjWD5aHlz1V/RYn+s+nxHLnTpy6074qr+VfJXmHzR dehpVsWjUgTXT/DDHX+d/H2FT7Yq9Jh8uflt5GFdVYeY9eXrbAAwxt4MhJQf7Op/yczNPocmXflH vdRr+28Gm2J4p9w/T3Jbrv5qeaNSBhtZBpdmBxSC1+Fgo2AMn2v+BoM3OHs7FDmOI+f6nkNZ7Qan NsDwR8v18/uYg8jyOzyMXdjVmY1JJ7knM8CnSEkmytwodirsVVIJ57eZJoJGimjPJJEJVlPiCNxk SARRZQmYmwaIeg6Vrmk+erJPLfmwKNRoRpWsKAsgkOwVj4n7m/1qHNHruz+EccOXUPa9i9vHIRiz fV0l3+R8/v8Afz4vmoerdirsVXxQyzSLFCjSSuaIiAsxPgAMVZRpf5WeftSAaDR5okO/O5424p40 lKMfoGKsih/IPzSEEl/f2FlGevOR2Ydz0QL0/wArG0r/APlTGmJ8M/nDTYpB1SqH9cq/qxVo/kxp z0W384abLJ/LVRt9EjYqpTfkL5t4GSyvLC+j7elK4J/4JOP/AA2Nqx7VPyw8+aYC1xo07oNy9uBc Cg7/ALkuQPnihjEkckTtHIpR1NGRgQQfcHFVuKuxV2KuxV6j+U97b67o2r+QtRf93exNcaYzf7rm TdqfIhXp7N44peaXlpcWV3PZ3KGO4tpGimjPVXQlWH0EYoUcVdir1XUx/hT8mbOyH7vUvNEvrzdm 9Cgbr4cBGCP8o4peVYodir0fyV+VsU9kPMPm6b9GaCgDxxMeEs4O491Vu1Pibt45OEJTNRFlqz54 YomczwxCa+YvzJke0Gj+WIBo+ixDgnpAJK4+a/YB703Pc5vtL2bGG895fY8N2n7RZMtxxeiHf1P6 mDEkmp3J6nNm827CrsVdirsVdirsVbVmVgykhgagjYgjAoNMbzi32JOPLnlHzD5jufQ0izefiaSz fZiT/XdqKPl1xVnf/Kv/ACB5UUSedNZ+uagBU6RYE1r4MRR9+xPDFKyX85LHSka38neXrXTIjUfW ZlDysOxYJx3/ANZ2xVi2qfmX561NibjWbhFP+67dvq608KRcK/Tihjk0887mSaRpZD1dyWP3nFVP FXYqqQzzwOJIZGikHR0JU/eMVZDpf5k+etMI+razcso6JO31haeAEwen0YqyeP8AOO31ONbfzf5f s9WiAp9YjX05l9xy5b/6pXFK8eTPy1807+VdYbSdRf7GlajXiSeio5q33M/yxVh3mbyP5m8tS8dV s2jhJol0nxwt8pBtX2ND7YoSHFXYqj9B1i50bWrLVLc/vbOVZQOnIA/Ep9mWoOKs3/OvSLdNbs/M Vj8Wn6/bpcI46eoqrX/gkZG+dcUvOcUJp5W0V9b8xadpS1pdzpHIR1EdayN/sUBOKsu/O/WUvfOJ 06CgtdIhS2jRfshyOb0+XIL/ALHFLz3FD1byZ5I0ny7pkfmzzmnxN8WlaQw+N2G6u6Hv4Kdh1bwy 7BglllUXD12ux6aHHM+4dSlHmvzfq3mS+NxevwgQn6vaIf3cY9vFvFj+rbOm02mjijQ5975x2h2l k1U+KfLoOg/HekeZLgOxV2KuxV2KuxV2KuxV2Ksq0f8ALXRtB0+PXPzAufqkLb22jRms8xG9H47/ AOxXp3YdM4p9jQPmX83NVu7b9FeXIV0DREHGOG2ASZl/ynWnGvgv0k4qwFmZmLMSWJqSdyScUNYq 7FXYq7FXYq7FXYq7FXYqzTyv+avmPRozZXhXWdHccJbC9/eDh0Ko7civyNV9sVT248leUPOlvJf+ R5xY6qql7jy/ckLXufSJJoK+5X/VxS821DT77TryWzvoHtrqE8ZIZAVYH5H8MUIfFXqdiT5m/JW7 tT8d/wCV5/Wi8fq5q258Ajv/AMCMUvLMUPTvyK0+BNZ1PzDdClroto7l/BpAan6I0fFLzrU7+bUN Rur+f++u5nnk7/FIxY/rxQ9G/Lrylp2l6b/jfzOlLKE10ixYDlcS78X4nqKj4P8Agug3tw4ZZJcM XF1mshp8ZnPl957kp8zeZNR8w6pJf3rddoYQfgijrsi/xPfOp0+COKPCHzPXa6epyGc/gO4dyU5e 4bsVdiqvHY3sqGSO3kdAKl1RiAPmBkTMDqzjimRYB+SiyspKsCGGxB2OFgRTWFXYqrQ2d3OCYIJJ QOpRGb9QyJkBzLOOKUuQJUmVkYqwKsOoIocNsCK5tYVSrWtc1XWr+S/1S5e5upOrudgOyqBsqjwG cU+xIHFXYq7FXYq7FXYq7FXYq7FXYq7FXYqrWl3dWdzHdWsrwXMLBopo2KurDuCNxir1DS/M3l78 wbOLQ/NpSy19Bw03XUAXmeySjYb+HQ9uJ6qWA+afKuseWdUfTtTi4SD4opV3jlStA6N3H4jvihl/ 5G6jEnme50W4+K01q1kgePszopcf8JzH04pYHq+nS6bqt5p0397ZzSQOfExsVr+GKHpenf7gPyKv bv7Nz5huTDGx68OXplf+AhkP04pY1+WnkyPzDq0lzqB9LQdMX19SmOwKipEdf8qhr7V70wgEmhzY TmIxMpGgE187+bJPMGpgwr6OlWg9LTrUCgWMbcio2DNT6BQds6jR6UYY1/Eeb5n2t2lLVZb/AIB9 I/T7yh/JKq3m7R1YAqbuIEHcfaGT1f8AdS9zV2WL1OP+sH0Xd2lp9Um/cx/3bfsjwPtnKxkbG76d kxx4TsOT5aVWZgqgliaADcknOyfIgLe/+Svy50fQ7GGa7t0udWZQ000gDiNiPsRg1A49K9T+Gczq 9dPISAai+j9l9i4sEAZASydSenkEwv8A8wfJ1hftYXWpIl1G3GRAkjqrdKM6KyCnep2yqGiyyjxC Ozk5e2NLjnwSmOL4/fVIrXfLOheYbMxX0CTB1/c3KgeolRsySDf+ByGHUTxG4lu1ehw6mFTAPcev wL5z1zSZ9I1e702c8pLWRo+Y2DAfZb/ZLQ51WHIJwEh1fMNVpzhyyxnnEvVvyy/LnTk02DWtXgW5 ubpRJawSjkkcZ+yxU7MzD4t+gp3zS9oa6XEYQNAc3sewuxYDGMuUcUpbgHkB+1mOsecvKugzJaah epbS8QVgVHche1ViVuPtXMHFpcuQXEW7vU9p6fTnhnIRPdRP3BW1HR/L/mbTFNzFHd21xGGguFA5 qGFQ0b9VO+RhlyYZbbEM82mwarH6gJRI2P6i+efNGgzaDrt1pcrc/Qb93J05xsOSN/wJ3986jT5h kgJDq+aa/SHT5pYz0+7owfORfV3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXqnlDzJp3nTSF8l +a5ALwCmh6s28iyAbRsxpU7UFT8Q2+1TFLEILXUvJfnm0XUE9KfTbqKSQj7LxBgSynurpXFCb/nZ pYsfP13IopHfxRXSeHxLwY/S8ZOKp/8AmtaXMGm+TvJdkhe6SBWeBerTOFiQ/S4kxSv84S23ljy/ aeR9McF0C3Gt3CberO4DcD7dD8gvvm67L03+UPw/W8b7Tdo/5CJ85foH6fkwTN28cnnkf/lMNG/5 i4v+JDMbV/3UvcXP7K/xrH/XD6QvP95J/wDjG3/ETnKR5h9RyfSfc+YdDeJNb095iBEtzC0hboFE gJr9GdfmB4DXcXybSEDLAnlxD731HnHPrj5j8z6RqGk65d2l+jLMJGdXNaSIzEiRSeobOv0+WM4A xfJ9fpp4c0oz538/Nn+gfnJY6dotlYXFhNNLawpC0quoDcBxB336DNZm7LlOZkCNy9Jo/aWGLFGE okmIr5MJ806vF5l81TX9vE0C3rQosbEMwKosXbb9nNjp8XhYuE71boNfqRqtQZxFcVfcA+kIYY4Y UhjHGONQiKOyqKAZyZNm31GMREADkHzR5vvpL7zRqty7cudzIqnr8CMUQfQqjOt00OHHEeT5X2ll OTUTkf5x/UPsel/l9+YXlbS/KlnYapf+jdwGQGMxTPRWkZl+JEYdG8c1Ot0WSeUyiNj7nqux+2dP i00YZJ1IX0l3+QYb+aOuaLrXmKK90mf6xB9VSOWTg6fvFd6ikiqfslcz+z8M8eOpCjbou3tXiz5x PEbHCO8b2e/4PLM5l9IdirsVdirsVdirsVdirsVTLSfLev6w/HS9PuLzsWijZlH+s1OI+k4qzHTv yK89XSh7lbbT06t9YmBIHyiEv4nFKOP5P+W7PbVvOthbOOsK+mWr7cpVP/C4qtfyJ+U0QPqec+XH Y8EVt+m3ENX6MVW/4B/K2ZVFv51WN23BljUClO4Jjp9JxVa35KveAny95k03ViASEVwjED2jM4+8 4qxTXvI/m/y43q6jp80EcZBW7j+OIGux9SMsq+1SDihnkxX8y/IrXFAfOHl5P3lPtXMHXt1LUNP8 sduWKUV5jsP8Rn8ttRoHN6Ira9Y9/SMbP+qTFU/1D6tD508w+db9Q9v5fij0/Skbo9y0YZ/+Babj 9JPbLcGE5JiI6uJrtUNPilkPQfb0eR3l3cXl3Nd3LmS4ndpJXPdmNSc66MREADkHyrJklORlLck2 o5Jgnnkf/lMNG/5i4v8AiQzG1f8AdS9xc/sr/Gsf9cPpC8/3kn/4xt/xE5ykeYfUcn0n3PlPO0fH 3tv5dfmXZahawaTq0oh1OICOKeQ0ScDZfiPSTxB6/hnPa7QGJMo/T9z3vYvbkMkRjymsg2v+d+37 2Z635e0fXLX6tqdstwgrwY7OhPdHHxLmvw554zcTTvNVo8Wojw5I3+j3PHvOn5T3+jRyX+lu17py VaRCP30SjuQNnUdyPu75vdJ2lHJ6ZbS+x4ntT2engBnj9UPtH6/xswvSP+OtZf8AGeL/AImM2GX6 T7nRab+8j/WH3vqbONfXXyzq/wDx1r3/AIzy/wDEznZYvpHufItT/eS/rH70JljS7FWOZxT7E7FX Yq7FXYq7FVyI8jrHGpd3IVEUVJJ2AAGKs70X8odbmtf0j5guIfLulihM14QJSD4RkrQ+zkH2xVMh rf5QeV/h0vTZfM1+m31q8+GCvsrLx6/8V/7LFKX6r+dvna8T0bKSDSrYDisVpEKhew5ScyP9jTFD DtR13WtTYtqN/cXhO/7+V5PuDE4qgcVdirsVbVmVgykhgagjYgjFWX+XfzW846KRGbw6hY/Zks72 syFehUM3xrt4Gntir0byU3lnWtYi8yeUE/RWtW+2saAWAimt5DSQxfZXbZlIovIDkFrXFL0ODyrZ QHT1iNIdOvZ762joKL9YSYMg9g9wSPCgwK80/OHUobaS28vWh/dq8l/e+81w7OAflyY/IjN72Th2 Mz7g8V7U6y5Rwjpuf0fjzeaZuXkXYqnnkf8A5TDRv+YuL/iQzG1f91L3Fz+yv8ax/wBcPpC8/wB5 J/8AjG3/ABE5ykeYfUcn0n3Plmzs7q9uo7W1jM1xMeMUS9WPgM7KUhEWeT5FixSySEYi5FOZPIXn GKNpJNJnVEBZ2IFAAKk9cxxrMR/iDnS7I1QFnHJN/J/5pa1ojx218zX+mCimNzWWNf8Aitz4fynb 5ZRquzoZNx6ZOb2b2/lwERn68f2j3H9H3PdLK8tr6zhvLZxJbXCLJE47qwqM5ycDEkHmH0HFljkg JR3jIW8E85aRa6J+YDQwAJaGeG4jQdFWQhmUDwDVp7Z0ulynJgs86IfOu09NHBraj9PED830FnMP pL5b1uNo9av42+0lzMp+YkIzssRuA9wfI9UKyzH9I/enflv8uvMHmHTjf2DQCASNF+9dlbkoBOwV vHMbProYpcMrtz9F2Lm1MOOHDV1uf2ILzR5R1Xy1cQQaiYi9wheP0mLCgNN6hcs0+pjlBMejRr+z smlkBOt+5gOcm+puxV2KuxV2Ksp8nfl3rfmblcpxsdIhqbnVLj4YVC7txrTmR37DuRirJJfOPk3y YptfJloupasAVm1+8XkAeh9FdvwoP9bFLA9b8w63rl2brVryS7m34mQ/CoPZEFFUeyjFCXYq7FXY q7FXYq7FXYq7FUbo2saho2p2+pafKYbu2YPGw6HxVh3VhsR4Yq+tPLuvWut6BZ6zDRIbqISMCfsM NpFJ/wAhgR9GBSafOnmXV21jX77UidrmZmjr1EY+GMfQgAzsNPi4ICPcHyfXajxs0sn84/Z0+xLM ucV2Kp55H/5TDRv+YuL/AIkMxtX/AHUvcXP7K/xrH/XD6QvP95J/+Mbf8ROcpHmH1HJ9J9z5n8ra hHp3mTTL2U8YYLmNpW8E5AOf+BrnW6iHFjkB1D5VoMwxZ4TPISF+7q+mZY47i3eNviimQqSO6sKb ZyINF9WlESjXQvA7v8pvOkN+1tDZi4h5UjulkjCMtdmPJgy/IjOmj2lhMbJryfOcns9qoz4RGx32 Ke3eW9KfSdBsdNdxJJawqkjjoWpVqe1emc7nycczLvL32i05w4Y4zziHhf5n6pBqHnO9kt2DRQcL cOO7RLR/ueozpOz8ZjhF9d3z7t3OMmqkY8ht8v2vcvLGtQ61oNnqMbBjNGvrAfsygUkU/Js5zUYj jmYvoGg1Qz4YzHUb+/q8s8+flj5hm8xXV/pFt9btL6QzEK6KySPu4YOV6tUgjNzo+0MYxiMjRDyH a3YWeWeU8Q4ozN9NiefN6P5D8vz6D5ZtdPuSPrQ5SXAU1AeRieIP+SKDNVrMwyZDIcnqOydGdPp4 wl9XM/F5P+cOqxXvm4wRMGWwhS3cjcepVnbf25gH5Zuuy8Zjis9TbxvtJqBk1ND+AV8ef6U7/wCs d/8Al2/6fM5x9Ed/1jv/AMu3/T5irv8ArHf/AJdv+nzFXf8AWO//AC7f9PmKtj/oXev/AB7f9PeK s18yf4F/wzb/AKX9P/Dnweh6Hq/VqU/d/wC83w8f5a7YFYT/ANY7/wDLt/0+YVd/1jv/AMu3/T5i rv8ArHf/AJdv+nzFXf8AWO//AC7f9PmKu/6x3/5dv+nzFXf9Y7/8u3/T5irv+sd/+Xb/AKfMVd/1 jv8A8u3/AE+Yq7/rHf8A5dv+nzFXf9Y7/wDLt/0+Yq7/AKx3/wCXb/p8xVnflr/B3+Fn/QXH/D9J uXD1eNN/Vpz+Px6YY3Yrm15eHgPF9Nb+5in/ACA3/ij/AKes2v8Ahnn9jy/+tH9H/ZO/5Ab/AMUf 9PWP+Gef2L/rR/R/2Tv+QG/8Uf8AT1j/AIZ5/Yv+tH9H/ZIzRv8AlT/6VtP0Z6P6Q9VfqnH6xX1K /DTl8PXxyGX81wnivh68m/TfyZ4kfDrjvb6ubP5fT9J/U/u+J5/Km+awc3pJVW/J5p/yA3/ij/p6 zbf4Z5/Y8p/rR/R/2T0HR/qH6Ltv0fX6j6Y+rcudfT/Z/vPipTpXtmsy8XEeLm9LpuDw48H0Vtz5 fHdGZW3qV16X1Wb1uXpcG9Thy5caGvHh8Vafy7+GGN2KYZK4TfKvxy3ebn/lR1d/Qr/0dZtv8M8/ seX/ANaP6P8AsmV+TP8AB/1a4/wxT6tzHr8PW9P1KdvV25U609q9swtV4tjxOfwdx2Z+V4T+X+m9 /qq/iyLMV2bj0xV5rcf8qU9eT6x6Xr829bn9b5c6/FyrvWvXNtH85W3L4PLT/kmzxVfX63//2Q== uuid:9EF2320A284E11DFACBCF5F943788E24 uuid:6e7acc0d-a5db-48fe-a148-3d0ba888c54f uuid:dd936053-2ab1-11de-bf43-000d93c1f82e 1 False False 51.000000 66.000000 Picas Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 39 37 37 Yellow RGB PROCESS 255 242 45 Lime RGB PROCESS 189 213 118 Night Blue RGB PROCESS 31 113 184 ISC logo blue PROCESS 100.000000 RGB 0 168 204 PANTONE 425 U PROCESS 100.000000 RGB 94 96 98 Document Adobe PDF library 8.00 endstream endobj 2 0 obj <> endobj 16 0 obj <> endobj 38 0 obj <> endobj 60 0 obj <> endobj 82 0 obj <> endobj 83 0 obj [/View/Design] endobj 84 0 obj <>>> endobj 61 0 obj [/View/Design] endobj 62 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 81 0 obj [82 0 R] endobj 5 0 obj <>/ArtBox[247.087 367.565 365.086 412.583]/MediaBox[0.0 0.0 612.0 792.0]/Thumb 92 0 R/TrimBox[0.0 0.0 612.0 792.0]/Resources<>/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20100412113400-07'00')>> endobj 88 0 obj <>stream H‰tUIŽ$7 ¼ç+ôb‹‹¶«Û†OcàƒP°}©`ÜÿÁLU7Ð6 ÈT¤$.Aëå·×òòåµ–Ÿ~~-Ç£–±¬tµrãâŸ??Ê÷ãåõ÷Zîo¥ŠÏgçsF)owlÿŠí¿ßŽEKÅO‹õ!ÝZq¼[oQîßî|;ÂÅ`¸–ÇáK¦GQ—¹ð²²$h¿ûñ×ñõƒ=¯KZôUà_*Oƒ·!ˬè‰Ï7ŸÒ*WYL¢›D‡m‰æ°zá[“˜Šnâ>?|°%6Kø ›Øiê?ÃÒš)0*¾ßƒ2!} j´rS…[2 1Z“ÞGA¨u£r•~îωãÞeTä²އ¦1'ïÇIŒ‚HGGŠ`´kf ò¸—wa±FÚFBA[c)L‡4SzZŠÓ¼ÄÓSF¬äDZÊІ9ù¸> Hº¡ J‚xi†þOá@½-M†xôÉ‚î³_¨OC8³Ä:JXl 0$‡(•vàª~FC¬žm†¢Ëj£4QzÐŒT³«´$Ù‚±³ ¬‘î5Þ[š¸FÚ3föòùˆÏAk€¥ûl0,¥·'XIo Ïy*æ#Až‡?+E#;™J¹–ºp”UQ–§Â< F ‘åReBC[¬ÐWçz %A2×¹NôØV𑿠BqÕ•l9uš× ^D5 ™]ÀS—÷ã‚H¯X4¾¢oÆØ ŒÉÆÞõcUÑrΣe©úx"E]æ†`¦Øº:AcÁѶÓ}¸oüxbˆ Òétž^‚fO„€PÈúÄÙt“ÍÚ16 Ì‹<{a˜ïºõ4ÖØ(®)tAtR÷´[bvL·>³o [Õ³ü˜“ÓÓ–²\AYŸ`IõÌõ„ˆ‰sz£“$Œ‰ýÁ˜˜IO !=§ ¨Œø†vGc £I#/'~<1‚ÀÔRPy±´ýl1½Ͷw1 чd }¡þa#fßËþÚF¯ÞƒÇY}ïAô Ë9b :žÎÞF" ‹>64”~0IGD˜Ë ذ$ÙtMâ¯%Z½Gð¾¥Úñ§aÑÌ‘ I¼ ý—/øýzü+À0hu endstream endobj 92 0 obj <>stream 8;Z][]*Z8,$q8Pq<-a,+atR/Xlf;Og>R'7AkC?`UH+a:[!:Wd2gY.%C?Yr]87.+,n j3C.,APLcVQ0Wa_MIB(XjL_"klFg6$$NL0W09-&5e4ja+~> endstream endobj 85 0 obj <> endobj 86 0 obj [/ICCBased 87 0 R] endobj 87 0 obj <>stream H‰b``2ptqre``ÈÍ+) rwRˆˆŒR`?ÏÀÆÀ̉ÉÅŽ> v^~^*øvD_Ö™…)p%•é?@l”’ZœÌÀÀhdg——ÅçÙ"IÙ`ö»($ÈÈ>dó¥CØW@ì$û ˆ]ôý¤>Ìfâ›aË€Ø%© {œó *‹2Ó3J ---Sò“R‚+‹KRs‹<ó’ó‹ ò‹KRS€j!îAˆBPˆi5Zh’èo‚Öç@pø2ŠAˆ!@riQ”ÉÈdL˜0cŽƒÿR–?1“^†: üSbj† ú ûæÀÆOý endstream endobj 90 0 obj [/Indexed/DeviceRGB 255 91 0 R] endobj 91 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.ai) %%CreationDate: 4/12/10 11:34 AM %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0.658824 0.8 (ISC logo blue) %%+ 0.372549 0.376471 0.384314 (PANTONE 425 U) %%+ 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 33.1201 594 786.96 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 3 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 0 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -381 793 0.92 1268 743 26 0 0 117 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 75 0 obj <>stream %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %AI7_Thumbnail: 128 52 8 %%BeginData: 10932 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1F52285252A8FD04FFFD05A8FFFFFFA87DFD4F52285252522852 %525228525252285252522852525228525252285252522852277DA8FFFFA8 %7D7D525227FD04527DA8FFFFA85252275252522852525228525252285252 %522852525228525252285252522852525228525252285252522852525228 %52525228525252285252522852525228525252285252522852525228FD21 %52A8FFFF7D7D525227FD0752275252A8FFFF7DFD215227FD2A522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227527DFFFFA85252 %27522E5227522E5227522E5227522752A8FF7D5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E522752277D7D7D275227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %2E5227FD1A52277DA8FFA87D2EFD11522E527DFFA853FD1D52A8FFFFFF7D %28FD285228525252285252522852525228525252285252522852277DFFFF %7D522752525228525252285252522852525228525252275252FFA8522752 %285252522852525228525252285252522852525228525252277DFFA852A8 %FF5227525252285252522852525228525252285252522852525228525252 %285252522852525228FD1852277DFFFFFD1B52FFA8FD1A527DFFA8275252 %FF7DFD265227522E5227522E5227522E5227522E5227522E522752277DFF %FF525227522E5227522E5227522E5227522E5227522E5227522E52275252 %FFA852275227522E5227522E5227522E5227522E5227522E522752A8A827 %522E527DA9275227522E5227522E5227522E5227522E5227522E52275227 %5227522E5227522E5227522EFD17527DFFA8FD1E527DFFA8FD17527DFFFD %0452287DFFFD155228FD075228FD08522852525228525252285252522852 %5252285252522852527D2752525228525252285252522852525228525252 %2852525228525252285252527DFF7D522852525228525252285252522852 %525228FD0452FF7D5228FD0452FF52522852525228525252285252522752 %2752527DA1A8A8FFCACFA8CAA17D5252275228FD3C52A8FFFD145228A8FF %53FD0652FFA82EFD0C527D7DCAFD04FFAFAF85AF85AFAFFFFFFFA87DFD05 %522E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522752A8 %FF275227522E5227522E5227522E5227522E522752FFA827522E5227522E %FF7D522E5227522E522752275252A8FFFFAFAF603CFD041413FD04143C60 %AFFFFF535227FD3A52277DFFA827FD11527DFFFD0852A8FFFD0952A8CFFF %FFAF3C3D1414141A141A141A141A141A14141461AFFFA8FD045228525252 %285252522852525228525252285252522852525228525252285252522852 %5252285252522852525228525252285252522852525227A8FF5227525252 %2852525228525252285252522EFFA85227525252285228A87D5252522852 %27527DFFFFAF603CFD07141A1414141A1414141AFD041460FFA8FD3D52FF %A8FD10527DFF7DFD0F527DFFFFA9611414141A141A141A141A141A141A14 %1A141A141A141A14143CFFA827522E5227522E5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522E527DFF525227522E5227522E5227522E522752 %A8FF27522E5227522E5227522852275252A8FFFF3C1413FD191436FFFD3C %5259FFA828FD0E52FF7DFD0D527DFFFF8B1414141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141460285252522852525228525252 %285252522852525228525252275227522752275227525252285252522852 %52522852525228525252285252522852525227A8FF7D2752525228525252 %2852525227A8FF52275252522852525228522752A8FFA93CFD05141A1414 %141A1414141A1414141A1414141A1414141A1414141A1414FD1552285252 %7D527D597D527DFD065227FD1852FFA8FD0D52FFFFFD0A52277DFFFF601A %141A141A141A141A141A141A141A141A141A141A141A141A141A141A141A %141A142E5227522E5227522E5227522E5227522752527D7DA8A8FD09FFA8 %FFA8A87D532852275227522E5227522E5227522E5227522E5227522E527D %FF525227522E5227522E52275252FF7D522E5227522E522752277DFFFF36 %FD2314FD0E527D7DFD07FFA8A87DA87DA87DFD04A8FD05FFA87DFD15527D %FFA827FD0A52A8FF7DFD0952A8FFAF1414141A141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141A141A141A145252285252522852 %525227527DA8FFFFFFA87D7D52522752275227522752275227522752527D %A8FFFFFFA87E52522752525228525252285252522852525227A8FF522752 %5252285252522752FFA8275252522852525227A8FF85FD05141A1414141A %1414141A1414141A1414141A1414141A1414141A1414141A1414141AFD07 %52275253A8FFFFFFA8FD045227FD0F522EFD04527D7DFFFFFFA87DFD1052 %7DFF7DFD0A52FF7DFD0852A8FF8B1414141A141A141A141A141A141A141A %141A141A141A141A141A141A141A141A141A141A141A1427522E52275227 %7DA8FFFFA85252275227522E5227522E5227522E5227522E5227522E5227 %522E52275227527DFFFFFF7D52275227522E5227522E5227522752A8A827 %5227522E52275227A8FF5227522752525227A8FF6113FD2714FD0652A8FF %FF7D7D28FD22527DA8FFFF7DFD0C5227A8FF7DFD0852A8FFFD06522EA8FF %61141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A141A141A14285227527DFFFF7D52522752285252522852 %525228525252285252522852525228525252285252522852525228522752 %52FFFFA8525228522852525228FD0452FF7D5228525252285252FF7D5252 %52285227A8FF611414141A1414141A1414141A1414141A1414141A141414 %1A1414141A1414141A1414141A1414141A141452277DFFFFA87D28FD2952 %287DFFFF7EFD0B52A8FFFD065227A8FF7D2752525227A8FF8B141A141A14 %1A141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A1428A8FFFF525227522E5227522E5227522E5227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %7DFFA87D275227522E522752277EFF52275227522852A8FF52522752277D %FF8BFD121413FD0F1413FD0914FFFFA8FD3352FFFFA8FD0952FF7DFD0652 %FFA8FD04527DFFAF141A141A141A141A141A141A141A141A141A14613C3C %141A141A141A141A141A141A143D3C3C141A141A141A14FF7D2752525228 %525252285252522852525228525252285252522852525228525252285252 %522852525228525252285252522852525227A8FFA8FD045228525252A8A8 %27522852277DFF7D27522752A8FFFD051461A9AF848B1414141A141436AF %AFFFFFFFAFAF36FD04141A14141461A9FFAFFFAFAF601A1414141A7D2EFD %3552277DFFFFFD0752A8FFFD05527DFFFD04527DFF3C14141A141484FFFF %FFAF1A141A141A85FD09FF841A141A141A14AFFD08FF841A141A1427522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522E5227522E5227522E5227522E5227522E5227522E52277DA8FF52522E %5227527DFF52522E5227FFA852275252FF60FD061485FFFFFFAFFD041460 %FD0BFF36FD0414AFFD0AFF60141414FD3A5253FFFF7DFD04527DFFA85252 %527DFFA8285252FFAF1A141A141A141A84FFFFFFAF3D141A14FD05FF603D %60FD04FFAF141A1461FD04FFA96136AFFD04FF141A142852525228525252 %285252522852525228525252285252522852525228525252285252522852 %52522852525228525252285252522852525228522752A8FF5252285252FF %A8FD0452FF7D5227A8FF3C141AFD051485FFFFFFAF14141460FD04FF3614 %141460FFFFFFA91A141484FFFFFFA91A141414FD04FF611414FD3D52A8FF %FD0452A8FF525228A8FF7D277DFF8B141A141A141A141A85FFFFFFAF1A14 %1A60FD04FF3C141A1461FD04FF141A14FD04FF8B141A141AAFFFFFFF601A %142E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FF5252277DFF7D2752A8FF2752A8FFFD08141385FFFFFFAF1414 %1361FD04FF36FD04148584856014133CFD04FF60FD0414FD04FF851314FD %3D52287DFFFF525252FF7D5252FFA8527DFF3C1A141A141A141A141A85FF %FFFFAF1A141A60FD04FFAF141A141A141A141A141A3CFD04FF61141A141A %3C616061361A145252285252522852525228525252285252522852525228 %525252285252522852525228525252285252522852525228525252275252 %522752525228525252277DFF7E2752FFA82753FF7E27FFA914141A141414 %1A1414148BFFFFFFAF1414143CAFFD04FFAFFD091461FD04FF3614141AFD %07141AFD2B522852285227FD075227FD075227A8FF7D27FFA8527DFF7D7D %FF3D141A141A141A141A141484FFFFFFA91A141A1485FD06FF603C141A14 %1A14143CFD04FF61141A141A141A141A141A1427522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E522752275227 %FD04527D7DA8A8FFA8FFA8FFA8A87D7D52522752275227FFA8527DFF277D %FF52A8AF13FD0A1485FFFFFFAFFD0414138BFD06FFA860FD05143CFD04FF %36FD0B14FD2852A8A8FD07FFA8FFA8FFA8FD06FFA87D5227527DFF7D7DFF %7DA8FF7DFF3C1A141A141A141A141A141A84FFFFFFAF3D141A141A148BFD %07FF8B141A141A3CFD04FF61141A141A141A141A141A1428525252285252 %522852525228525252285252522852525228525252285252522752275252 %A8A8FFFFFFA8A87D7DFD065227FD04527D7DA8FFFFA87D2752A8FF52FF7D %A8A8CAA914141A1414141A1414141A1485FFFFFFAFFD071460A8FD06FF8B %1414143CFD04FF36FD04141A1414141A1414FD2252A8FD04FF7D7D525228 %5227FD0B52275252527DFFFFFF5253FFA8A8A8FFA8FF61141A141A141A14 %1A141A141A85FFFFFFAF1A141A141A141A141A60FD06FF85141A3CFD04FF %61141A141A141A141A141A142E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522752277DA8FFFFA859522752275227522E522752 %2E5227522E5227522E5227522752277DA8FF7DA8FFFFA8FFFFAFFD0C1413 %85FFFFFFAFFD061413FD0414AFFD04FFA9141360FD04FF36FD051413FD05 %14FD1D527DFFFFFF7D7DFD1E52A8FFA8FD05FF601A141A141A141A141A14 %1A141A85FFFFFFAF1A141A143D363D141A141A14FD05FF3C1A3CFD04FF61 %141A141A60AF85AF601A1452522852525228525252285252522852525228 %52525228525252277DFFFFA87D2E52275252522852525228525252285252 %52285252522852525228525252285228527DFD06FF3C141A1414141A1414 %141A1414148BFFFFFFAF141414AFFFFFAF8BFD04143CFD04FF3C143CFD04 %FF60FD04148BFFFFFFAF1414FD1752285259FFFFA9525227FD2352A8FD04 %FFAF141A141A141A141A141A141A141484FFFFFFA91A141484FFFFFFA91A %141A1461FD04FF3C1414FD04FF8B141A141AA9FFFFFF85141427522E5227 %522E5227522E5227522E5227522E52275227527DFFA87D27522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FFFFFF60FD0E1485FFFFFFAF14141485FD04FFFD041436FD04FF %3C141484FFFFFFA8FD0414FD04FF611414FD16527DFFFF7D5228FD275227 %A8FFFFFF3D141A141A141A141A141A141A141A84FFFFFFAF3D141460FD04 %FFAF363C3CFD05FF141A1461FD04FF853C148BFD04FF3C1A142752275227 %52275227522752275227522752275227A8FFA82852275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %52275252FFFFAFFD0F1485FFFFFFAFFD0414A8FD05FFAFFD05FF36FD0414 %AFFD0AFF841414147D527D527D527D527D527D527D527D527D527D52A8FF %FF527D527D527D527D527D527D527D527D527D527D527D527D527D527D52 %7D527D527D527D527D527D527D527D527DA8FF853C363D3C3C363D3C3C36 %3D3C3C363D85FFFFFFAF3D363D3685FD0AFFAF3C363D3C3C60FD0AFF6136 %3D3CFD16FFA8FD49FFAFFD11FFAFFD09FFAFFFFFFF %%EndData endstream endobj 76 0 obj <>stream %AI12_CompressedDataxœì½ëŽ]Iv&öçÒ?tM*î—¶1@æÉLY%5º[ @±¨ÇE²Áª’Ü~zÇZëûVìs2Y]7Æ@ç“™+÷‰;"ÖýöÿÓ¯ûâöËÿüöE~nNñçOo_óñÓ¯nzó×_}õí×ß|Ð/~óË›¸îZ7Ýþõø7þÃÛO_¿ûøáWú§—iýñQ>ý‹»Oï^¸ùÍÛw_þòæ¿\àß½ûæ«·ëýÛó_}üýÇ/>~øê_üæ¯î^¾~÷K>xtÿú›u[ù˘þ2†›•ËÍí߬î>~ûáËw~÷ñÿþÕM*ý&7ù×nJÌëÏÿû»ß¼ýúúž—a´)7¾¬­–õC]:×GÒË:äc÷ß|ûþí‡o~ýéã›·_}þøÕÇO_ÿêæüÇ5û¿yýûõ—×7ÿçÛ¯¾úøï7w_½~óÖË×/ß}õv½çû×ßÜLY‘Û¿Žé‹»oß}õåß~ûþŸß®(¹8¡#þý×k¨5ªü,àþÅ_¿_ß¾ýæ›5Ûõ~õZWL¯ˆÿÃM°~÷úÓïß~³ŽÂǯ¾ýFæøÓÚšW¯ÿøV¶7Úþîo?üîã?èü^ä×lòZÀ™nbj㦗|“š='ö›^ñȨŌd C÷µÐ¿^{ûwŸÞýþ݇_abý‹¿úôî˽ß=Ý û¦o°vwÿ›üg“\ïûÍ7o?`ÒëœÿæpnÂË¿ùízâÇ/ÏßË‚-¨²¶÷Ã:Kë°ØßügýËúø·°Ùëï_¬½ùõ§wdÌÓßê_Æ¿þêÛõ§¿úôñÛ?üõ‡ùxú…„_¿þæ_&¼ýðå× ± f¿ÞØ'ôÕ»{k°…ÛøåwŽ÷»O¯ß¬ÇÞüÝ?ÿ··o¾Y`ÿôÛoß}óöOôÛ7²LŸnî>}ûõ¿Þüîãǯ|~—òi¬P¹ÿŒgüZ?ðáï>ØJ?}n¸~ÒÂŒÿáž²îþüÖÿGýüú«¯ÞýþÓë?üë»7Ï=à™¿û“ìo?àa Ç?½ÝŸ×_ùÿ÷8–|ÿÏ¿z÷õû}_¿þôÍ»7_½ýí¿þæíû?=ÚýÛYœí°l }øðoo¿úø‡Ã$òú×7ÿåõ§?|×вMÿòî× CŸ÷2~|ÿaÚ7¿ý××x«Óýæ_õÎß~cüÕë¯?Ý(܇ò³Îï¢g—$É`>hýbÆ#é{ñâ;hb¿¹ûpøó_}zýå»Em—@ó÷>¼~ÿöË›ßôËÓSТñõæîËÓ?þ·Sˆëú¿N?ç`ÿ øƒ_øôŸ×JÝ=ÜÝßïîînïæ]¿kwõ®Üå»xnnïoïnooçºúm»-·ù6݆ù8æyÞMù³Í%–Ì4à ãq<œÆyÜc´±ä¿‘Öúc¿_×¹ßõ¹®Ñ{¯ë*=õØc{lëºowm=§Ö×ÕZYW>µÜR -ÔÇú°®óºÖ$ëm]£ËµŠÜ¹®¼®¸®PCy\×úÎëº/ë•Ê­^£ŒÓv=¸èg ¿®È+?îËVê׃^ûçõÿ9œ£~—+žÓº"þOç¼.þl¿Ë=ñä€xñgûý;þœ×ñ¹t=ìç“þÚüª×5”¿w\ã ¤ŸÐþÄËÿtxÌŵV*¬µº¯ëj¸tçﮉë×^g\üzðëQ®ÓýãCÀq%¿²_Wõ«®î×8= ¿æáº=\w×ù꺿¼NëÛ羟¿ôT­cÞןëØß­õ»_ó|ìa!EêyÒº0A¾ÆBšÛ…<çµ”ýq„±–²Ð >äkŽÛÓ¾³®ôÃx\Hj¦™ŠÖuµ…|‚œsáôÂ÷…Æ÷úÞ·a]q¡w^W¹]صq=ñvœnÇÂùº»=¯K6M–çñ.¬+®+­+¯KÐLPs½È¢$ýnÍäNŸ²hËí}ïÎ'Ûñ 4"ê?û¡+Upâ>ïëáp=/¡‡+^\I®“ý·®|u•«ëú«=¹”˜ì?¿Æ³×üìu{}ž€îþÔµVªÜüÅwŸ„ .ЬÿùÕ}QQûn×¢“úWÆw»Òºì{2È ?$ÿ³\—|ý@ôß…«®¹éñYï++q»Níý"#1Æ¥ÁǶØÏŒ·ëÀÝÇÇõ>)åu$Zê mn×ɾ_æ1ÇœrYG£ç±ä.ß/ž°Ö*–¼Î‡°“¹¿œÌG=kIM[»-[v^tèq­w\œ¬¬Ó"ø.ؾp˜^ËO É ÅÁ½‹"öBjÅhÁfÁdÃbÁ`ÅÞ…·IqVðu(š.Ô<)NVÅÆ©x´ÓÕ¸ e‚ˆ‚ÓB >’b ½À± j›7 >]ü!‘X Ù^ô[ä½Òwà¾Ò}ãB«„?§¨z)bŸÖ·µÌë{º_[s¿6íü¸®‡5ÊYÿõ^w~ •ZK~E–·¸cV²BC†õ¸”dž«â"-¡pE½‚]NÏùåì`/.X.rrŸ~±äd[\n_ÑVšÜË‹‹\ˆ_\.¶]ó°äã„uçÚcýít PÕ È3mïuÄ[¡ëí²G²?ÁwæNWßV^ä’,òËI×û(iŽƒ¬™TÚ|Tyó ‰s¨ÄY!sFH÷*wÞÎyZ<¬CôÌ +¢ ŸëµDú¼U鳫üYT*>@½…ÚTÍ"ƒžU|Tô¬BèT!´ãyÂéÿôÕŸ¿NW€ñ=®ù]×ɼý^×ÝŸºNJÍž\G梤ÿQH¦aÃ:“ OùýApv}?ëÿü~qa}¿Õÿù]þ¿=­ÿ¦^ßåêz5¥ÒòÝø7t|—ÿ“þŸÖe_‹êŸô?ü‚ïÁ0ÖpGÙÀ½^g|?‹HsñýNä"û~Â/óp-þjRÜP9NdÙù´(}­E鈠•Ð aàSu–¶¸CÎ"ˆj-Šð÷¦­œt/eã»k)‹é‹ ‹~Ò(z…r£…‹/­gªø"_²£ÿºê´˜Ù­H‚‹±õõHÑu„ÕÅõ;‰’ÝàÈâÛrËc-mõNºD²4\ ‘1 a×Q¢Ý>¬OÉ& Ù{e±e1Xa¯÷‹µ¦5í¾^㼤÷°^±(FÜ)/>ºä¨“2ÑGe Â>§2ÏÇ5»¼0¸/l^‰¢¢:IQ=c¨úpsQv¤Â3XÔf]Æ$„±=ÚQTf'ÏHÊþ2ÝzШúÉÕ©£*uT¤¶ ¥üáBsÚ:“ëJ'W” ¹^tÔ„Žz«5`ƒFŒ=.VyZßT ×˸ê"Àz:TÍ ¢AUÄ—¡¶Ó5¨m¨®ñDÛ8觃²AE㬢Žé®WP/®S»µ ÂÖœ|g±ã{?¸ÍuZn€->ž‹® ~òÕ¦Fj:¨¬Æ%£üé|òtÉ(:Ÿ<]2Êçù¤Ò=±ÓDØiîÕJsIï²RºpRÓÌýb(b”™JãZ©Gæ²6árÄQ’%úîº\Y]š“K¶,Ûj±wn°*#阩jè»g}o¨­?­Ö×Uò~Öíþ’b~’÷“·ëJ½“Ú“î•^ÏEîÚ"æi1¬Ç…Šg!̧¥Ì·E—…"›aju3Ñb»^¢ÅÜEÉ%ØgŒÎø¢p“.*ÌÕñãi¡gRšŸ•úw1(G¼Ð¾¨BPÖ!êNU†Ò•6‹zVrô¨³‘ç”Óz/JB&{Ü)ÙvUж0%êÈ:¬ དྷ†Åh©F'ÕŽL?\ƒàª¥\ £y7^({O!û ¢Á»¾ùgQ8Ò— ùÚ`P-\¹ÌP/»šLżw%3AÍü¬aét°,=oW:Z•& JÛœdÆ$3%©!é;Ò£Û ìGf:£U"A¾M-GÅǪ̂B£iÉâl–Ò÷¡”žWóëhÙBlö+®h×Ih龄Ãà:š]sº=ûuw¸ö×<)ë²køÕWóktŽbyöKeµ“ýw«8lZÙÖ2 ?§`•˧Šå…Ry©RÊ£2y¾ÒÛ·"9\w‡y:*ð_²Qˆ5ÁõøGˆ>6¾}5xÕáO`jxÞ âŸNâÎO¥‡*>üŽ  qçK¤FX }HHÇ¢=£å›tSÃÍB)à·§¿øâÇp÷õ)¼\îLIn+5Ì¡?Ì,Ì`±€)Ÿ”iŽuëút®/ëÂÌ›Ú_."[|?ÃP6#Þ’ü¤³"?­7H]~X:Özó1ì¥j}Ùâ8Lè§Ž¤ó‰ˆ˜)²ŒÙ¢G^.z²Æ”ˆ›ÅbzVˆ¼¾}¼”—³äÃL~Â:YL_^þ +YbÔ•N±¶¹·Ý6y¾~º§ñÓ†Y3¹»w_(}šßÏ͹Ü3žNÞÄõ:;í+ªaÖd…9aªv†ÅS¤„½¹ªN=TF¸SýÁÔùOÌ :`=«)Ô$„´T̪ÒÁbK ¹…|ðÙ ©×`Û˜'• xXq6fRãa& ‡‘‹T2 y¹ù8xZ_ËjN©ànÆßné59ÃGµX2»à /ÃÀBJ?øQÌ“"¾”³òAõ¨œ„ÊÇJÄŸ"y„ÿ…JÁ5ª²?8Â?‹ò'˜Ý.ð^•ƒò âŸá1ÔOja*°HÀÉiÀý’,„ (ð˜ ó‚ì&[˜m iOÐ`Bª@Ù–Ò-iæg•C`pj>4Gj9¨Ä8P ÒŠM-(†Ñ RŒ†ëài5L½ƒsÜ(ÇÃõ ÿ59¡·¯]Ð¥%§i_·¢rçD„ÅܵÚ²éK„ÄÈk©½—äæHtêA=’Ÿ~^„H¯ÓMºüú,¦HÖ“ëô¹?\Ѹï}~øGþãü¡(nþxàèù€Þàé'øÑÁ½‰àõÎ~DpCnêÿÆßvŸ½Ä¦lÞ¼:‚Ï‚?øüÖV©¯ÂpRmáÈô“+¯‚àÅí„~Š«$pRQ€!ÝÑü(¢?ѯƒ/½!z?Û‡bè­2º£˜ ¨~ìñ á³;iíOO0þîB’ø,Ú‘ÿôy쿸ž¢ÿñ:Óg¨Âó×5­ø,Íxzýè¯Ó÷¸ç»‰ÑÕuúa·ÿ¨/Qüg4ý‡¯®t¸2²­—UcNhÃ4Œ¹…ó(²MK iFÕ¨©ÜžàK¤Ð’°Á ¡h´g>êL\1j6%ï4€ãAýMé´è˜‰)awj¾°¢¤.¨¢¡CqE¤’%XIµ”²ÈÔЀŽ[%N§ö 4)Ã9ÕS„øÐ†dµ,˜½3[¾ÒEîúš4øµ-*}™.R©s«†E ÒI ƒíjˆ;[ sií`u°¼òߦq´ÂšÖ‹|²t¹ ̨èdë•5v»^îá¨5÷‹e¾ØëX‚m³‹éœÔ({ðÀ 5†6ÙÄ(… gKS7”ÝÝ!XL«‹Òxš˜²“?.S?>Ÿöñá8§gãq¾#"ç³9É9ýð˜œË¬š‹œ%…œ•cbÏs‚ÍOH9]ç|gôæhp«E&?"ê‹‚Ô¥:¶¶8u¨¶HuªÚI§f“Óé«£he= W6Ý-^Ù¤Ï'7$¬+Ë¢s->÷ZÄšˆÓ}"bDÂë"oÐräî5G.)ù3Ï’xŒÕø w’ÀH’9©Ÿ­ìk)«(+uíî+ñ¸²L{Ö%¤Ë°^þÎcqåMí°®M¨k-n×v=ªõSÂ÷ïî4t_÷‡š3×Ѭë˜ÞÞß/|Jë0u¸"ç…æ]&z=>gŸÞ¶Mé¤|Ö´ ~£C%ˆô¯EýÄâ1DqD‡¼pr DpÞ>ãǾŽy9z¯Ý›¥Cþ©mØ>ÄkCjŽ*/?¨¤|§2ò¸¯ád1ö&[ bíˆ'+ëÀÊEþ*b˜!„*¼¬Ÿ‰Lû±C!Tn}Jo襪è…q%â.J¸ŸÄœUh¨ýdnùåÌ©gôS‡Ò%ó³ñd$Ùyð%‡Ië÷0ž‘)Ú0?IÂLϪ¥«@5¦׋ÿËáÿç‘/sŽãÖN.öÿLå>þ;9ÔŽ±ë;uúÚ…vAhM/âî,ÞFbm¢º°*œð[°dlM÷ ñM¢JšFµä¼“ vgOD¶Pº~‘‡4¹*á’aàâK‹þŽ'J–ü>+qȰªêšÚßî½c½‘iuÏ\«“:˜lu‹›õ%EuõÏtOWºCŠÒƒ¦&EMGZäKס9øá±Oý1@‡¡~ãિEéuÖŸà¥gÔŸ®‚dd«Ç²¥þ+žìdø®K4ÔwHv:Ý^ÖVx®¾B‡ƒo*»cºÓƒ:ú©NÙJ‚ÔCŽÓ­»ø‘Ô´š˜Ît«¢¥, =t"üUHÈŸÉi~šÕ¼…ÝËdò«ìæÓ“Lòí WðÎr~šçìÂðéVs‘î|‹ŸÊÆ[>Þaë’O»îñëÁ¾£Øw$;cٟij[¶×g¤lÞ×és Ò?V4>}.AúÇæ}ž‘"¡V¶ªÖµ”-ÂEd É“E☬‚2,‘[R¦¬|iŽŒ'X$YèÒ*I»¤½(ÅæƒmÒ‹1Å÷îôŒ}ò»-”´Q²FÑ…R¬”;û÷ÒFùy åµ}Ò¬“—RcûEèbvª–çv¼¿¾×-²$÷q“¾(M|âå°Ä î‡<·ÆõôO…Ÿ8ÎO“vò³ÒN~Ξ6žØÒ¶%m@cØV«~aÛö¬õ™ÓÁ÷Ü üËzÐ.xÂÁ(s–,ÿ>jT`ñx@Ú±¢ªp»ÜÉC '4Ú³‚FsAãž%FhEÚŸÕ~@ëØh=¨VäCÉ©ò˜(4UµbGm<ŸP¢ŒÖ‚¸Hâý-³¸œz] jñ‹£„ºäÓ“†F•œ¦Ê¥¬°¤%T8?€tG¤:Zšã@ÆÀ.ó˜]ó™Èp ëé¨ùè1>Xµ¢‰®íµ?V©"Í »²ãI ª4§^K¨VÒqÞÞ]H§ÛŠúŒ õôœUØ›ÉÀ.éGáí(¾™ðv¯ÇúNú<Ä~µ£Íe„Ó…ÙÅÌ-óÊÜâ5ž-úËí-´¹œ=¿x½íÉ /r=ý"†¦'cÜ£×éPÙð TÄô3SÛ¢J⦑V•4QãÃÍ4Ñ¥|Ý/\L<ÉÀ³ª ª€žÔ¥©(ð (M8ëùoRZhDºE ìŒê×g}ñ®Eä´àµÅ¼ÑšÔÁàÅ…¬8…ß5Y!8)QüíNO¸ðè’ÒI#ÉîÁ‰ÇZ1)íË`~WÇc£<ý)’ñCm”§?M4~Í8}ÆÓit¸¸?wðÙ+¯Óůé³WþŽë¢.äéâ×Ï”>d/?½úåu:ürñe¨ËÔÏva[¸NüüEŠž-ýLìïS¦H3±O‡8 gk}ÏRE^¬èô¹jE—:&j,UH%‡£Rè¥C hî6-I¡9_–uÌ‚?ÛV %ÁEYg& íѱ”I…ÞÆj4ôUçŽøŸa,Ó?ùfï14úÑôFT}yY8 ö)ü¾Æíá§[”°åO˽Ã_Ë!˜Éª¥Ûu¾ª:bÚ1£ä{—˜cæ«eÏ;Fõhù´Îvyft‘wtâ¶Òoû<ýÎÛ,o¾eé{N‰ùœ se9„]ËŽÂö1Mš³öb“nÊx™^Üíaëðq€«ì©]Ì©-Å.¸,yƒ¬³‹©-õ$¸Î½×êUŸZSãªË¨#& 0(ib€ÒÒ~·(Kåö{ §Ö)øÌâ軵ürެØ/Skx·^TwXÎbÑwkée·‘×½i}LqÑêØ rê6µ®¶ùT¥-¼Ç=Ù»­;cŠèÆî«ëw{þR.pÎê|9„è½y‰ro],*é’¯{×7àBC  ÚëÐ.í¯CÅQ–Db0‡X1×Å>}Õ*lrH ¸¨`³‡åVuj[o30­lÇ àNpËeØÂˆ^ôðŵÍæP梛6±µœe(–¶N€í¢¦K¸¶q¸á%ÄÕU*îØ€¹ØYXÀŽ+>ØÇ×ó?–2_ŠH‘u)pEÇ`4<ËëãK9®×Iâ´ólÄ©é6–øRƒc”-ñÆ&µZ©¸SOÍ ¬ ÉÍ(Ã\dXï­ë a¢äEkŸ ™k8ÀÏèkm\Áf³Ï¯—Õ#[ãËÑBpýŽIëUÜ«dÛ€aá#&[r0V›ª,A:Öµ ™¤¸ RØÖFñ“fPè…ÒK}Õȵ£c¾5“G,U‰@é÷kw®åà|×A)DÛßmás·©­U’LAVç•Mü¡ÀѺâ˜ë8>?ãÀÙœL• ÖjÄÚ¤hÇSÌZi«Cטä–×ì|ù_°uY´Y]ˆåüéJñ߀,Û œpj…vÌÁ{׸Èz9Œz=Jcà((e6` a0 †áÎ%ƒ'”Îñ(Á÷æEÏm ȼî\hË—mmPÖYÁ«’ˆÕa|d È7‹*‡ZÁfKî.Äâid±q£ IJ¥ý4Ü»”%°tRºEÖù¨EÜZæÄ²„±aÏÊœå… à›ùêýó ã)SôEÛ^a^yg³CÓªu˜6 ¥XƒL,°‹QÎ/ª„Úaer0¼i퀻z>m€…-±b”cpa´5ãÛM$*ŠE¥vÿ|nv<6D£tM>5°Üäû­;I[41úÖt—ÖR-@LÍ Ý¦lLä©p²™{»±H#ÉXöZã`â}[Ç¿¶+ª±n•Ÿ% ]wæH¤M¹iÛ:½=R¬­ãÞ’¤ñZøù'É ñý[SFfó>˜ÍÏÕâcrI2NÐbÖ΂›œ¼‰šðÝW· —±-‹,˜@×¢Ï4›’ž`¾Ä  ‚‹IR §¡fÅä³,uŠ¿M[ü³u 9áÖÐ+¥Ìj„¨K3u ´BÿùñY(à-"ãÖ%6w|èÞ—8•:&u%ËšŒŸuo4å¢ ®:;ˆ²b$ÒÙƒnû%p  (À*£lPe5ê ÃdhYZÁœWÐaÕ»—ˆ%ªÅ‚Ån0S6=Å4¢U·­=±ÙÁJ-n‘Íó& •e-C¢IQ-Q4@ÄAëáóâ+ܽƥ|‹t•ÕtD‘?£rž<FEy $ô&/:01˜PÕL>®”ÖY޳¸â•,‡à#(BÒi°l±–²írô#dJ•8^=?È+7õ®Í‡¤69qµÉšj!6|—a)ÈG“ÉL^âC„¤ç¦%W!Gcü¯ž}f±HGWÖé~–÷´ª)Ya‹†b1’£¤÷ÂB&‚V´„ïqkܬ”FÀMÌ<ÔT¤`0ÿÁÓ `g­¤Œ.YnÑ&6¥‰JbÔê´BØžbˆ:%BÄä‡`ª%À!'MçÐ??D†×[)A>y¾ÌëïOóæ¿¼ùÇÿrñ“úÑ>|yáEû“εvå\û¡î5’ÜbœD—GÔßjdàWàEŽÖYÉͽi6ÈgÀ‡AÄÏöŸ¾=Å›{¸Ûè@ËÌIÌô­¹µv¤GVÆ÷TëhdÞ6Êf€vß—Ø`¯‡«@‹«C‹K¾€•þ¶ntÎØ±œ63ÁÖ]B—^ÇlعÉb¢ï0'µ>’0B¢Ø7ÌôŸÅPk Zÿ²8Œ(Æ- f”…ª5<ñ`3OË¢u9As)‘žƒƒ®VëÑ›;¾ÌBQª0n3-²ˆ°C`v³QY2n˼w˜y¹“UmT[Á"Z5' ÜÞ>ŸÜ~8ܾQ’æú`YMöY° ÄY¨-´õ >O Å}£â^‰¤B`Åš¢ ˜ëÀ] o4¶NÓ ë<`º¥.%hšý—Âõºó%Vh`-bíÅC\‡äzØ)QúÛÅ.©bFUÂÜEËëÅ?Mñm±«’(<Õ9#ùvnµPÊRñÞ¨¸#%MZ)÷ã¢/ÌŠ r1§ì8yg¥…£OÌi^À:ÜE+Õ’L®Ï÷HËK˰ØW1Ñh® ~®R i7÷òˆW¬PÖFe/àþа§Å–éþ‚îÂöVçÁ½™+Íå¥ÐrTaê¦ÙH¬Y4÷ ¸Ð>C_ŠqZ³MŽÀ€w’“ö†Ÿ‡ƒ¶92`ë¦ü\ LÚÁmQ]T›7°=ÓrµÀ•r IK@è}Æåàïc" ˆYuàÞ¬¬Kï…‹K€û?ܽ„ßh9†M¦õØ@5[¥IU:»»¢ÔGu z³¦èK¦Ç’a’Á¶‹F Tœª3ü”BokI¸ª’œj °œ\êéà)Eb°ºKð° +w¥ûäRå·7Ð9Lß`¦®¶sl‹úŠÓo‹è:ͶPœ¼Åÿõ’.ïÍz»¸ç:´‚¹D.÷³ôu¨52*,­ÑöËfÐg…T3]/[úæœià -Åê‘„A!5HwtS*˜†˜¸hg¨‰ö¹4a&(î!°aÅÙ®|JÃÇ& ÈlZâ½My‰ ‚KW D- Œ$®‹­†¨Ðj;öBMÐëņŰe«%înU8›ØÓDó{C¤jqŽƒþ[³ø ,Lc‹Eµ# pë‹ÂáUÛQðbꘕóø.f²l³Šb¼}ƒ¢ú`Ú\?eó.àÒ³³Í8f3h6ªÊ0n-¡Æ )81¨jg™& ;}î TIšþHs·XqQiQÕs¨òu5¿XáÒÞ±É ºv{3¼ "ò†Ùn‘g ‘NF«Xîqë€8°øK•ô[û|ÍÔçRx:ÛmÄB £–Î8 ofrKjjrqçb– °‘>x]˜mÅæl³ÓX!;ÅDþm-S°Úœy¯ðØy¯ [|^À¥)Àš#&¿d;³fGʽê`&&(ÁWA{ŠšÁdÅȦ‚¦âÁ0.ÅÌElBe ªû¿Õé5ÈÙÁÅ‚¯les Q’F]X¯³~]ÂvAì™.s¦ÕœSÏe ûaK™“Fsa H¤t4lÆ»PÖÆPlÇAº+Usf3Ê‹1¹õú\²™SgŸ$¿7’x`I\3’óÒs-c*0*¤ÁØ<ámµaý"\±Â›Rƽêô3`œan©‘¨‘Úî­î7Sÿ¾G‡@Lzªíˆ>ù_üåí§oîß½ùæÝǯ?ýñæW ô‹’îˈ¿¼ùËß~óé݇ßßüâîîöÍ›oßÿæã7¯åÞ_Þü/ëÎÿuý[úØ=4ü ®D6Ä ö.QØ3ྪÆe §k¤aJÕ-CiEºØ xSD„HÍ‘DÁ}.¢D5=þq¬õ& ÊW˜æ:˜»Êdjwù?× ý§¿‡•rIŠÓPåï÷´ªGFHF¨%þ½B:Rª¬¾dJÀ÷QGÁKÈ  Ôã€{iÅà4§N4 ¡ H´2#ž %x´DìàøZƒµÛêäT-j"¸€§› EÍÁßC,™øs…œñydÈ`½‘T—xðì&üŒ;<ĆcDP¼Ùîwš¦C)¸Áb¹Èà¹pÂæÜÔ"›Lw–òÛý¨Qåro þ#”K̈hÂá ݘ&;õHo°—Ô\ ( ÒO€R‚Çmv4 äã¥ÊGÒ0r=ß@%£;Á’n$“=\tTŠŒ®Ï¸˜NœÍ\c°l$TýÙŒA%;j>øNP7—øî‰­‚ñ‹)¼gH—Û·%±Ïê00¸@D옊§PàqÔÐXÚUÔŠo¤Y2jÉ™Ÿ°¬±Û Ë4™ ê”Î[¡=ËÌà°;.´Öˆ³ÀcœBÒTĦ\Šä]Cé 9(–)P‚š€'•Oáw\ç8æ\±1Áý§Ƴj+o W¹Á,C”„‡EÚça8Ö³gëš-ïˬ†âqîØ[&'Ìà =±ÑceZ3SC1%è ‚xÔl``Q`àk‰Æ­Ê  lÓ³N™ÝRQyX$’Мfbw‡ü¨Ž¾µuL²“°Â7ôÿA?ï4SàÎÆSª~á=L™0ÜÊ ™Ý)$×€¤Àañ;ÿÐLC®pêT$‰YYC¼ÌUÖt-¿æþRš#vF1A²ŸÅƒ'Œˆ¡³ÎDìÀᛪ^_'÷-Þ|­VËþYBúsQé£k9XuÙí^ÿ}yj?—úgIðLtÎKŒˆERúê*û)uÔ.Ó;ŸÂö§?`R?S~g¤¦náÜ”¼£ßÔY«ÑÝXÍMl΢f¦ÈlpØ?p ¦ #›GÀ@ÛÒ}9j,>Jm€âAñKèlF7ÅñˆSÉÄ3ËÜÙ+€ÝS¢$h'Ó‡–#ãndÄ@h¬owpžŒà¦ÙPóäÜß|ï¨8÷:“ãÄŠ“¨Ý\|\5¸Ù¸6%ø» ½m-Dp÷`«f;•Õ™óê9ùò"¨Phc7Ç©…#~áÈAc—¥" >/vz(Sé¼W=Pp/Â|Ü<‹BN-2@gø8 À7¢sè?=`f‰Â ãû"‰âÒyÓ@äò•ëµP¢_Œ;xDÆè×Hkq©‘; ÅCLÈ9s+’ÅVég„oÜ!¨óµ›;l4 œ~È:¬D†&`Eqˆ¹KÖ”€8L4³jeðu¾:‚=mpiÀs$!j²ŽNÍØ)ÚËáO¾c‡Šï¬£»Ÿ/VßÈâo«©Lbн<59I t!`¯Í˜{¤QNˆ)`§«¼z«€'íø*`½¸æA"Lm Ø:±i¤Hà(Æù±ôG7ŒÊûÂðVÚ@:ólyDSÇ wˆ-”úS\q 9-ZK6¦1?aM™ xy¸÷¡¿ZÄ÷o'~5MA1Ï”áºú<:>ïaÔ ¼ÞF ¾K~j‘Œ÷`Ù ½.ÆËŠ{¥h H¶#&~FHà N}=þQsj¢fDõ ³’q\¦UöE.‰{ Ö̉1qOHÕ_¹7O4,8 ]àí¦7ì“PÔäñG`’;Á¢Ä,è³ÉŒÐ*Ñâ‘í1%vѡ̽›æÝ7àú‰‘YPpžînœæ0ÓKŽ¢î›B[Jˆª£1‚!_ökܘ3š<Òº[_"¦jÁ½}0ŒÊ⟙O”„ïd„,­…ÄaÕ£Wèò¡°úƒ¤VeÏ™¶fЩû•I`WãòêæC g™¬°¢ùb‰#3¾XŒ¼K¦»{v’¨„»Œ}‚ bí&0Íg€ñôqj-AµnàÅ‹á…G"w‡¨eXÇM͈LŠh‹fÀ˜'SÜse0B2kÀFfhžÅ¸­™O&ÀÂÍÖOõÕÝÌhÖ-ÕÁt1î1y0"$a¸·g5ŸÖT¡„x¯îŠÜ0ƒÁP÷ä¸ f¡I$€ð4M4ÄÒi ”:Éä¼L÷_¡õ£»–-}“ÝÒÕQ·©­{be°4…ãÄ4 ž>™r©ÃAŒnÈ .AR=±uîøâC¶+cÔ-AëA…­dÂ̟e­å,ÙÊ'àÂ(µ&‘«¯¼'MdÕ!"%¾^Çͳãž÷Á•Õú'žÇär±$ØFËä49¤yárØM“š‡Ò.UúŽ€g$q†µ{;DéÒásÄ绨{ÉÓ­*S5nȦ€¸Û§óÚÞýÊÉ–Ÿe2ŽÐ’Ü,Z‘ó4¤5ÉPhF±§#©‘^+Ätõ\’Ö€Šé‚T!pñÕ\l2¡:•#’‚¶/}Hb>+gLà˜8Ãû@ÒUîæzy†Ö`^éUÑüȨÌ}z%*ugå™Vð<™}/ â¶n Ñ” +£%ûõSDëôå–‘ä¢>J¼Scîýp(Êb iÓåß@‚ÑQ–ÚB³eTwƒŽl96ƒbв8µM*—¬¦Rè¨N–[¢©J\@vÔœ³É`àƒT V°3[eU2Ÿ/jkñZ3þ¤Tà±PÚ „W”ºJ¾þE2~h″Q²¯àX(æñÐ$÷x´4ŒÌ*'šÓp#Î`vqbdF·Ë²$$–åCF‘j(—Û½cÁ@ì ÄS¢&Žô;Ú6aMŠÓ±‡è´Ï_ûÃ}E=Yfe Ñt:naú¾€+Ëõt¿5uf•ùiOàD=IÏÐWå m'Ya•÷26}à!¡µ?«ïlÏaú±´œè8}sx.93 ³E…0:PI:ciRáÛ3As¾-©NJ+&ƒÇj$ÞÁ¨\Y=DœI¬J'þ¶XLc~q]üY÷Pó¢Y^¨!<å‹ ±Þ!DϦ2øyY6áQÁj0[¬±d“wJqÒ¼ÇÝYÌwh$„´J\£!¿¤ê™}úÃ3 ¾êíà]ºoĨ€êg¦§ÃIå$¡ ³Û´¦ ‹-füϬd§.rKÁ˜\òV½Ó ’öº›Z›%SÐe-ϸÈ®fD«FæfŸ‘!–N**…¸v¬²QX'ºÊ¦¯6Õh*PC€Á+ÎôºKŸA¦ð¶\ÁO&Ó h#×3@ d‘¬sãë2b0mé3QÐ,?Çž„¬R¸‹Á¼PJLLC`òBºé° ,l­§¾A߆ Dºm\BD˜ø:…eMɾ¸QhæÜÑPSÚ½–ðÓÞ§ÛÍy¦§Àë¬Ëë1ð°²*ò¤^2gÚéL° qçfqÑTº²0·ˆ+*°Km•@ bù©›l ¨ªì­à¢ŠR…ªrt"XÖ$ËýqR‡q§Ñ]é]2Ùx7³ñÛd†Øá 4äŸ_j]m2ýE56¥§”s'zÀ %ù½^ä(ºL-4Öꬪ%Ѥ;¥ÇÅÕ>”+|B¤…ˆ#ç§M·†€&¼–ê¨,ô)å=c½ @MæHXñ—¾V‡fѤ]ïÔé=Á~éTíTH*A¥[;àÀÄrmÙKÀ‰h.k©Ø=„àZéÉ G«m•Tæ×Õtëq¿&CæªmmZòt\>0€SˆB‹Æ²Ž Kꆑ•Ep‚ÚiÌ;QοÓ0 s?LÅ­ØÉªf¿'º€Y-/jŠú ¶ûdy"‰;™N}~þq¬þ<¼"Z«§0@psót‘¬3.3Ë` Ðz0Îø|IŒ.ˆÓÌ«:@ã Hµ}:½%Ìš–>øžà8 ®¾öÙ3-Õ˜ `¼³y5‚:`ãZ\©Gâ©ÕÏmÞ³ÃZÖnfó»Éñ|O°S@ù¤$xŒùÒG'ÀƬÝ]‹Rð3}K€ªûé¨ût\Ìfõ=‹E•7Ã8w^ŠÔÇn¬;ÄØãîÅþ£ùóóã²âRñäx±Ñ!'…/5‡-óú¾Ð œåç%SË'ãž}ñ›.Uv¸ø´HFãFâÄ©› ÌLú"0—~ÀDZUí:x1äÕã‰èm©Ï 6•÷Ó‘0€1fæÁ+êxæ(QÌmóêùÇaC⎡8Öìp CnóØ ARºqæ<ÉFE$›^ëÕL€gŸÏîÍ«YJò{Bû*0Ú?ÃÿÔžÕ>‰£j Ä\à`,òP«U€µDµ2÷sàΩ † Õ=ß k¤(ºxå½ÊéôÓ¤õ÷©«wÕ@ê¿47ÈÃʤEÜãé öÔ®FæÔضDÔíΑ· Ý[”¢G¯M ³áÔXWmzêJu'Ú£:B Ó¡™…ÌÖu!¾Ïè…UÊj>±ÉbÉÕr &dÌ­J2…È€ðáv×xlQã[>Üÿ$ÞÛñÝ„waör?œs½:õX_U|‰-9: ¯–½`st—†ÞÍ”¸:vB :NFAh4dßtõ¸ƒ¨à]L´jE©*f`­MQa«íÌlå ÛÑXûtÜÍ’ ô-gá™Å2 J~ZW]GV`nO£2¦LÂÚhIÒ‚ò½ƒi`…RIN½x]ªN;ƒ;›·Ì¸ºuƒ^L€3‹h £r¥¨®ï<\4ìØS½…ØCJš¾œ1@u¹À*@Ôs™~6ŸÎà¸h4 ÄÇ#ØQì¨AÆœ<÷ÊO>~¸×²•Ÿ<žRfd f ¸b€ €'y,Ía5zå¯iÞ°À½©3k7—Ù·ÆäŸ¿z'‘µ cXïŸ{“ DŽ ·4ö&@”ÔÄeÆ+¥¾ô̰ÜXX,X%7k€`U‚Xž‘Àƒ-Å dÊàÁ£8åÞÆjtïÉ Ãã Ycèɧçcüð ›WjÊÁ(ÃDK§2¢`²ØÀbñÌzˆŸzovìòÕ\6ð eMÛî4IÝZñ\¼Ø*2(òe§S4GC"±YZæ™döö`”¬`ç§Y²=€1è}WžNŒö4%*Öh@­Z`T¤c5 S¤IÒK$0{Ó%wõH7*ˆ¤Í,²/¬´Çõqß‹Ôm¯\™Nw—Ü[Y—‡Â ŒŠzjÍûÒ¼vl5ÆpÜjQ¶Œ©îX@´Þ’ò»õU{é-ÿPA³3ÎKŸ?½ßTÝœ\nn7M…±À:ÑêgYS}cÊð6Õ’½_qÔH^5–ˆîà'{ pËÃãWv¾4¼qâwÚÎA’­EÜAÛÆœîBX}~z€Î~²®Î†Ÿ,GÍ·–‚‘Ä\ú ÐÛ÷DúèlˆíÕÉÒ-Qê¹Ãi3KÞÐQR4KÓ¡n+ ”02™‚6%ѯÕ`î=Ó±mÝ c”ÄŠï:@ç¨W3Ø© aööÎL`Øq7Êm@¸Ù4½aÐOGé[ºx„mœ¿Ó•‘`õíÛ=r«ï\•xÈÐØÁO¦»;c2¨Z|À{‚'‘•1¡Ò«cT •n™°/V)`L¥_œ6lzFÉC;kv§'+•ÀêÅð²Mb»Ùá8-ÚHž¾Â>×ÔªüX'—BÄ8EvscÝÏS,Ŀɽ=‘ºÑöQ]á2³/:…”ff.:üR_MYšÓ°_Küæè.þvvÊRI/'‚ ï…éB@|lŽmÞ,f—к݌‚áa^âÇ÷é+ðÝ$áƒC¨á⽃É>X‚' ª¢.Ýç§F;xó(ã«Q7ìb—zm EŽ¥Š7ãá Ñ·+[äƒÑð 'y"ïÎtØû›Zy@ý~bc·ÇSÏZ‘©¾±Cè!¥>Ov1#;êé°Hõ%Ç ¦¯f~yP‡7<Û÷Âo¥;ŒêUûç~1vô“Öf·¶Ý,±zSÚ¡Ï‘¸};Idýˆì½ÿ$“l0öàù`7Êäýå<Ô³¢,íq:ÏgàÞD¹ÞqÜWÖ¸¦UIýîäcý¢»ézDOõ2‰Íñ½ï¤÷nr-£ai)¦0x2\%Z¾|™#Ñ®,q7¼á«rʳvv]§‘££á<©±»±«íhÃîþ¢~°’tmûˆ ¨SÑ€L›o&‘VÍx?Þº ”œë``YPi¯ûL¿Ôú Àb/¡îedw8¶ ?ÕYóvh±H8™ù#qY^î²$)géâ5o„YK]:4DÜýPBb£š„Àš+"ËÍÈ÷Í¥$ÈŒ²âN¿‡õÂÀÁÊ!‘_B¥`ÆlÖÌÍ5’7D„mE5½ÂF5ù`á î¾Ùë+eP,&²3°kG–Ãô]?š-Ó’·+`b¢C®êV’"¹×Â$cE4­ƒV*ò—Q<=i<~’ÒXY;x5„±Û»%‡pzGÚ4ÙÁgKŽ‹ŠseŸÄ€2†4yMfÐÛ®f8Ø)Ÿi­·{awÛâh(óklù2;;¿[ °ûuÓ+@du6½Éë.w=ºç3 ó6tHs êÁ¢­yº'„åc]éydk¸×YkkH©ÒÈSÛRÛý•Š+¿”gpÙ #åã|›J©¹HÑUÞ^̉u7ÑÎp`K¥f´â!˜êÝdœñ-×HÅÃêL+2ƒÆþp;éSŠN’µ2Yuœme„Rv¾í_©‡$‡éq–RMÊ‚À^ª ¡Ðr¥ì¥:IÖ™¢$Ê$+©H•8Y(ŽÓ³~Tˆ$c–rN HÍÂF^<¼¬.ª-ezE4¨ÒÖ?©ý´íÍ`÷€îVë™]Šì^§Þ–úI’‡erÑߎÔ Ô·4^ƒ°¾vs³°TnJ ‡‹kVo'ÚŒŸÚçŤCF#âL¨’¹¦@ 25B§/õ…v$dóÁî‘;“ÕMµ3[‹˜`áck–{uF¡ýÜi)°\«¾H0È]熓.ªOžäîZŠ\a4ltTS õ¬~lœ(w+Ãy0Ù /{›ßmXRðÞn³3*.q"aè§Íùiª»ÍjTp÷èÕT)ný<…ˆzWZˆ"“%u齌,èV„Ѐ##?m ›‹ ìË AÌ ~‡Ìú†æŸVnà8wµÔH¡y {PÁ[mSJö `d«r»¬~¦¦àgª2´JíÅ<¬C$åÕ`'ÞÙ| &&1á½}ÿÓ~—tT™uâ²UfÚ6)+4«Mð 4wKæhýJíA“Í:U@åÍŒü¯°ÙYÎLÛ H½}=ÜÏÃ.U_fÿ{º·ˆ>00ÜÞl_«öÑ‚Z¼Ÿ2{¯9|Q4La½1ÿÆT!\Q*ZöÈ k‚®oÅŒÛÞjGF¡#YƒÕŒÃ+‘• h1Ó{¬~äÎÆ¨YJaÑIqk` +ÏdÃ&v?>´ •j4ìec©}`E€ò`ÿRº]‹‡w×Ajöài£0m×™ðÂì1A•¥Ü¥ †×@SK†}žD“…Ѭ K ÜñâbÖt)›©âÀt(#²×Ú—¢,’½ Ⱦ9ÅÄ ŽÛ§o„rÊÃ&‘.ð]ÃnqT÷¬¨S Èà v(Ë n„œ'-vEŒÊs„ó¹Ek›7`…RigJ ÷‹]Y÷6h7ŠªùC6ª=˜ö¨Ôܲ·˜ÇšhŒ{ãÐöÎRŠO Ô½{‘ És¸“á-*€Ÿ¥]¤{cˬ"íc#œwƒ)Òx/ë#BÖ+@0¾ƒˆÓ‹€©né1Y ¼ ªaX‚Øèê•Ò¼™¥Ê–ÌcC+²ÚAT͇<4-ŒëÕËþ %l;¡iRëÖ¡ÈÜUˆü@ÛèKDò€æzHÉëÂN˜º36€ä&€™F6ƒS¹ä12ª%÷h‰Bׯ‚‰ö°DU,†M1»iL/&ñ:Œ^Ÿž­AíÞ“2p6Û ´Éî%=›Pî…o×ñu4°0 ñVê»O{Cg`¹ ÔÕd÷‹;Msª1¦êŦ×3Œfí´vU¸ [ÖèV{Ïîôü$gÆbÁƒ¯XîŽ ÒV ˜<‘½{0$?Ь1##dÝhÕ_.5rZ»K@‰!Ìöi–¯ŒÐBÔ®’±U“Õ\Cñ¢xÓó óG4>¬Ó0C'ƒØÜ3`)9r{[`éÂì ½¶GóÖfjŒuߤЄz:Ù (G7ÔªiÔ%ÔÊ–ŒÍ³%9‚4^\½ˆ¡2úk»T²¾e/¬†ˆb ¹°Hó Ïð“:0‘½›rꬶA6w½áÞã6–]‰ ú˜"e¦~ØèQ«'äª#JçA²7`EÓÔW†Yz'—‰V_z.' ¤ èY¦o2PÍS•Öt²-†ÛÎÀvUH^¨‘—¨݉'áìmz½š‚$ßf–Y¨Ä"÷Îz…;­YûÀyv¨Ø{«#Wæ;…¢ÍéM…3ÑicƒM™™ÔÕ!½G÷ŒL‹V}ÎÝMç< ³p´)„)Å8×\¸”#5˜ÊUÝ ½›B¯ÓP|Z¼Ã@1z&Ù."+½ô˜iyýlm—ÇÍ>ì¥t4¼±ûcŃv¾Pÿ#,£©Wt+ñ‰Fç÷Òï|XÕä !¥)`Þiƒ¬Ý /Žröíh{þ´€êe$Ö åP×oÔ«9\ dŸ¯ëg¥èíÈ×][¨Ü˜èù´®ß MÅ›{, Í:¾µj¬1ų=øy´î®UL,΋Â>á¢éÕÜ/@~, ‚ “½òg•FÖ` ÖFñÑ %]>v½ÍŠ®RÓ‹ÅuéøQËNÕÄ–¬‡¾³»3#úíŒÝP>"Û:p{>¨Å‚èÙ¦Öoéf‡BŽlõ4Ùp2_ïçWY©Ó{:f½@b2ÝÅš*c:ÛÁkF$ãN£³U`HD7«XÁ[zƒzn—6%¸`JÃÅr,cÔ½¹™M½¨]b"¶™´Üo‰S@ÄGÚºL¬z)z‚'å³c¸sõéìÂ*%ˆbæ!`á‰êÌØD¢€2Á(Ð+€©ŽE à ‰¥¶ܽ&tÅ\ƒwžê»sÀ´°;’nëz1µvX™^¼¸E‹ lŸt7J¢ÑdÛ´ŽÆž*<fâ’ÂÒØavÐ@¬¼{ŸÑ®sÒMàk`áÂþ²ìy6MSâ2ŽAÒи^×¶`P§¨Å VÇr%ž%¯÷²FT…Vn™îëWáö ›+LÔ F©lM`â^Fž¼W)¸óàj.ÇHê]⪢ëP÷:îšânI‰ý¬ÑYN𞹕=;‘›JeXa¬-CÞ¹÷1vkHtÒ©”‡$oƒjÇDFÓ•5ÿ Të¸Ñ|¦ö" Ä–‘q³×¢Ø*ÇeŽ8úã齬2!·ê³ÜÕ¤¡Ÿg{ˆzQŽÝE›öžç†yÐ6{Co‹å>ÜÍ+Ùàèí1Læl‘:\÷’tr/”PCt–nÏ“Çë¢.é"£Çbˆ´<ÔÁóšSbso—‚6V—ŽI^“6£k^‡7PùÑ`´¨.7ò]d­êƒ2v'Î>? é `µ§¸q¯Û‘Ö:–;;æGˆ,ò°î¤–·lJz’g“ (ý+€GbdoH3Ü3ÐÎÅÖ.ö8î謊K:%s b§¶.@°b¡S[k xŽÓˆ>€s€àåè>Çk›®™o¬§ÄoõúTAã! \»Ñf£y;˜L"\nöª>Àžå B%‰^€L–F€èÈd¿‹»×|Zí—e}Ûäî:†5·äoñBš !íPÏ‚ØvÎi Ì+€7:OvžÛUƒÖ¸7ƒd¡י€ …DfÓTôÊ1FŽ$‰ å˜Ûæ `ïƒÚ¼_-LufU'Z5Qzœ·v§*àaUȬ Óp2-zûúÛ®wv1éâÅЃw9`%¿¯Þh±Uî‹^h¢xÀĶ´‚{f¢£ª× úP[" û6´ãµã8>¹wºv•&þ×+½ülËÞf%Âó¦@Š•{w'íé vço­6‰ä¦a9á&&KÞG£Òͺ6M5Zja›HD/±‡Ôf—ZÚÞû IdáPB²íðŒ°ë‰ˆ»œµ%ô±/žOž8$µùyö/Üâw‹‡vÞ»ÒK£eŽ7jËÓeÄîè¬È«DêÔ~©jÈÂnýAM² •tN[pÖ°.!µ£^âK Y´Tv¨¶#ÆÂ.€žÝR¼Mzvh0‡Ÿ®ƒP©‡—µ6»”ÝÝØ//9éñgåBO¢ããú`jít µTo¸´º2IJN©¼1¿£•ÃÃ6ñ±ÊS ƒLP7ñéÖ_¢®w Ûù—0r'¥Í(ú£RCÌ&ÅhJáX–\‚í&(6VuÓ¹AzlRm2ÎÌû„[_p“½ˆŽ]è¤=¤e˜µ`ø¸ 7µè%Âd•MVî<ö ¯æËݤ4 ÷Ýö…)¼Vþ’[°l¬!Ù`Ö©ÏîE[ñ:!^(ÚÀU%£–@%Ä»LµàmŸ¶2[YáÔöqØFáá¨l]׺Ú/&*J/`A+ÁnE¡_X³ÌByPmDêo1Ï’ « mkP¨Yêó¶9èˆ ­Ùõ‚q®î2]ñÁà° §ž|xpj>Д‰"æ5»1¢¡«zó©O6 ü®)òJSÐϰ«v…cµ´±BÌ™”±€iº7mø2ÀL$`‡¥IÜvd¬0¡˜:KéMÀ®|³à™TDê´ 0É¿VO èâcPêLð½ÂF&­‰i’uÁ”IƒY.q&{Âï–^Ò÷!éa—Ói–’l¯•š:j{²°’GyŸñˆrŽ2êIäB£naÿ|ÎÎÛ²wcÕ ^ŠaŸ/Žc`«güûÒakÑc˜*ÛÁZ)ÓLÚÀºÌZ‘(¯JÕÖÀä›­I7±@˜¡ÚpÔ-ÑÅÀÊ3ù°·æe ‚Å—ñó,?<_» åÁýùÏ®x:¥hj÷êTÑ‹x Ð}@)S «;ût«uçÆMvöÉÒâ8@J¬§@7E°Z1×VdcUfj¤C%üÚÜ_´«bÈ)vqÅLžV1ò“Õ)#ª–Ãèûc¿§µÅÞºËF×êùÉÜj8óƒC¤;¼ã-ŽäyÀõÂI™¼âY¡Ïk—›°‹à,Ý&@Y6âIy5’N†—$¯A^³—šÙAB¥½—êùá;,A-! ô^ˆé¾l z yìôÁN¬5YÖj1tð·•*ÀVÄÜÜKHâa-² #l÷=ÔBköùè}r¢å„à^äÝhò Ã{Ô7êÏßüzÀÓ-“BË.|,oéܪ"pÐY@æë-ÂR!1ÆX©’³µL-‡B$4Öⱥіӹe¢PW§zÉ#IÐÞ|³Rö¥‘Ô4oRV*-[m€ÎZŒ5ó 5yÍ¡p<Ëâŵ­¾`™@–ñÔFǵ^ËõÚl™ŘI"K[Xo Â1.s*áÈíýùn›b×ïÀlÞÃÀ¶Ì»4†ÚZxØ”B Ò㌤ ÚåÓVk‹ÔÃm(³ÑWNÙQì¢ò$¶˜GÆ/E&­Õ¥lpW²%:QÉÞ-c µÕÔ¾W€—ëQ °T¸‘M­Ð¢t¾1;@Áìü=-wÒ€}qé“óª¦AÐ~\ŠÌaSxðbTåEÊîp<[KfÛ¼âJa}}‰è&§À‰YÀ½zUÈlÝmÂèh[÷°ÓÌ(åçöë6«Wm¯;õ'µ3*©%Xqiˆ‰=šœJ?lXòbˆR'£Ôz jì^Ó“ùŸ^ÌÂÍH`d_™Áb”f‚¡³‹åú •C:é7«#É»fRžè û5Ñ+™=XHÖÊyPA“yW ÛHÎv‰ÜŠ|E°ÃÑ‹z`îsN^^ZV%0ä-{ÛYw¢¢æöc¶™R"óÚdº—Ϭ»¤Ët† ¢!• ÜçM¼T/˜qñõèµÏ¬öUª+Á³1 •‚Dòšê"i°–IÀƒÀ0 œ½p†R°,aŽË¦¯ÁKÓ—âu‘‚™ ˆVgòn­ìqÃÞHÙì]‚ǃÊ}™r€b?ž'­š<`@FÞ…ÍX -v8ãÀb?Ý4EAÇ*ì~Î(ߦh#ª#Á±ÒIÏXO‚FYÆ—Œêð—RNÉJ§±–6nòv•Û³W"êh˜Ï,;% ßEçëþÝpôþ—pŒj°¶ÏÆ­»>Q¤ÄC Kʤ%zœ¨™öùè}v  a¢Ó…ƒZžädB;r€èQ8t7–tt B¹(¬ë`,Àé”ÈÊ“r\R-Æsæ©é ÜæK v0÷WR@)® /"@3ÛuÊn½öõó3H¨©lqzÎ\“MÇÀ`£ÉÖnÀVÒÁ‡¨p~>x©IîwôVÑBb È,æx¨[=f6¾t©x—E‚1ï‚ÍÊà9–›-ÁKm ¡ûdy Þ{ 윦ίèE°=øqûòô¶ÉìQ¯žÛ{Õ›ƒ‰ýÑK{åéô/z§³L×+˜çQ˜sù&Oöt *çÏ‚YB¤±Èg èlÁ‚c0ÑRíˆcF|pÑ/OöO Áœ¤&š‡¶r’‡§ý Ïy0YV0o Á5’“íæap‹ È’B×ù޵–Ï'ªõ‡JµÝ­œú”¥u¾µ<ÜŠÌÈnÀm{dlc‚¤  7ôÏæ~teÃÉôù z;®Žf:© çö¸¯‰,ÇŒjB<_aדe‰'™­WÈ„`d•ý”©§Ë¾l ‘»ª…è†(Ùòìä.äÁnU*# îv>„¢ê! qj·XÉ»˜+Z«©!Ñì„¶XÛÁܼM»€‡Wx• ìW3 0™Lé`/!­d‚)NdëYaÁêɵ®ˆu=T¦§*6ØÐ¬œêv˜£í.OJ´ diãù!P1söÔ¸hiiüüŽ7Wg°½Xö±Á;_çÂaa—÷_w2X9œ‹}L!𢺓Tš¤lŠœÝv´/ådnÃ[—wÍèrKž¬„ \`,qžƒ'8FºLÓÀâÁ¦™vÚ¡Ônð{Scle¤4<3š•§Ý*!# 0G÷ÓîdFh<øÓ8Ȫ]S?Ôw.à®i—Ä ‡0ÀÔ<º$š÷Ý€»Ât€©5Ip?Å©êBôÍŒØ8ÆØþÔÝå%ìûÁ ˆb÷Z‚ÃA&Ë}Þv‚ž†§Þ¸Â‘¤¨’?¼ìõ÷ìˆÝã\·…žÖ5tD à‹,töTŠr mt: 9A(3,4®˜† †®‰'X>ïù†¬%/¹P‡=¥\Љ?©{4s231_ŸòFbYâÿž¦ø´¸@ïMÉR ü `Ò†dÖTOæ ©£ô@A‰­ì*~j^^ ܘZõb(Ñ Nè½)PÆôßÕÓNƒ sIr# e 7,pÙ¢—+UoR¹{I0’k!6>Ë’ ²{;µ^홋;=§JëÄòùÃE<æ7¤íÊŽÕÝlÈGæç϶ uPz+˜%”ªkJö°pUrJœªWNò*@çh“ c*f`7l"3÷–QóBÅÝ@»BÞ3t-™ ÈŽ5ÌIÊFšŠ»È2ö‰mïD]U;t!Êìô¨ùåæªMù'µk̦ì§h÷K›oE¯Ó|xƒc´f*^‹ã@LŠåûÚÙ€vgt•¨õÝs‡âp<ø…S9UØ9^Ç%£×(¸Ï5â–oÅl—üKå óRN—lä^ Þy˜GMmX:jøu2Sñ’òÁ Ø*FjÃMHö,2¦a¥ä…¢“égÚ>øðåxY¤Cªýƒ¡%—Ò!²>%/t›¬tæ}ø²Æ”â¶SÚm4â¸F8¼˜ÃÉ»r§xÈv¼Ó¦ $“®ñJ³ O)¦)ÀÊ$KöÚNÁ ¥CöL ¥œX­;ÅCÏ×äóiÝn—wú_­Pˆ™[¼Înœ^Ú)[ÑE@À°{d7·i™ÏøG4ós]^ Ü 6g˜ŠÞÛL€ =l,Y7« ØœpÛêÕêP–.Uwî«i¼ø¸Ùk1åÛªB…®F&ÂL,ÝS£SsÊw,+ššËsÜ&Œ(¯4<«UEùà•>ëf¥“‡—"óži‹yWþr?–®#‹$2“\¸W<ÈtfvÃ#2êìR@ _Ë}7,žÂܬ£s-5S>TZGOM>(oÅ'kš#çÈË”…Ž·ÚaæÝ„|¾@òè”,Xªï– ÙS#†Yî‰ »š¹–NO\+æ>¥èR?TëOÑ#ø/Žì±,¨¯kp¦&•·{ŠQ²è‡Ú×­’æBtf@¤èJN7!'EOËØíÅŠhZ¥—SbñÐ9L&³<¤Æèì†f¬2¦'„`v‰Øå¥UNð"¬-³Ò¡žÇ§EÆ0ÊûÆ]v [A Pã]¿®8giÝrÛñ°VHK§DNËä’±«šÊ{yUS¬¬|¼²÷3Ú =mÇ㵋·c,WS4‰©bô.¢¨äç;€Ñ:?­°€½Ð5€çbðQÙMViœÞôI%>öM§e&%/ï;ô ]cmÈøÙеnjìýµíK§g§ïÁ‘Þ#%vw–Bhž€‘Ò¡ ãte®&GYr¦ÀèazïD³^6E9Ø»›g´¼H^|KÛú–-H3¸oºñRˆFaÛ¹îæìløV=dPð­ñ>‚Ûä6ö¨ÙEf¬¬và‰áIkœM,"¨“É–7p j Ö¸[$¬°•B.­²8.oo ¥Ó°„ gVž"ï½zæìÙÕÍ&ÅkQî&õ2Ô ™Û”'†SkŽf¿]EFLö¹:WßìÆ×[&¾N7Öm )‘k`®ˆäÞïݪŠÅ Ð° „Çp’uV@KØñ¦¥cÛç+]œ1ìæT•!»q +%š"Bl€F #^ľuÚ¼âÎ×cr6”(®÷ȪŠe×& àɨrZݦ+ªP g$ -¼9x·÷d$oÝ%Ї+žö:ÔHބ˶Ț71+Q!pT–ׇiUL§·¿Ð€{.xš™Qø4*ÏC,±Ü."øÔc›MÏÃJì#|ix~[bt¿ì‚è„ÌdH>‡ÉRS5±£ƒœz&ªDºå"Rë ˆ˜[9t^þRòGY"BÖžÞi Ì«“zo¸ H(éÑ’´x¿¦$ï¡v}Zɵ Ôµ*3 ³ù¡Vz:H&¡Ò¤ü<;¦O3àÚÊ”ƒ…J;²ã";atãyÚo’û°- žìÍâ:öêUµàúN±,½cë¡*YªælÞX³GÆeã™»e±ú‹¹`ÂX+ÀF]Ksä ÈF¾ÃòDÎ`·Ý¬ipöU¨×­@*¬ã eIº§³!ßÕ]‘b$sr§;1%3Õ·<û³Ð[SøuJÌïb®ç±Ö“,ZÙnj­ƒRô¢k·6¼çìÍϵESç¢VO!ôŽÊA23±*üϽ2[@©ôqWwP ê"ÔYÒ%ÐÒ7mûˆ‹7˜ÃN%bËë-°áR<ÄVj™ ’?è Íkc‹¾é ¼åA^ÔÖÈ9‚±P jP‡É°{´ÄøïLò³c2dgуTûû&ž98ºžkð ð nÂè—æÞFU 4oC½5®†µË–ÕùЕ™‘sLTÂsínNé»pOf¶æ‰5- ÂÉ:0™ÑN²0‘ëæ ”1xú|KŒUÝ&²$‚vi’j™a=zd+6äN"½!ÿ/oo»kÉ’‡=Á}‡þ#€4Ü£ÊïLéÙömÈA™„!ƒ&)ÑÀã!½½w¬±²Nï¬KÁº4ô¬©“»*++s}DÄ‚ìDÕfp:“—YrEŠ.“ûûT2q™ðÿc‹êáŽÙ©DU“ª6(é ÓëÊd,q{ÔºZ5q¥Ž¤RT#½p¹Z¨ÓvÒî?u9Œ\b;šzˆÛâ¨!o3"Ïe=xcf8áÉ·…PïØ_(“ˆ¥ÃK1æØÚCK®z¡;\kT_ )tŽ…¥!ö+•¢@íG¸…sèãæ*‹ÆÐû-å+$S瘝놭éãVPÇOüXl±8Çï´—lU¬ûñiÉÝï4Sm8íß&ÇïS¢A“jžIˆ9±º¥Y®» œ/_Ã![4%?œ²éëï_~+/VFž¨Ù‹OoÆpbúp]s·¾~-©Ø'!é¾n~«¶³ÏMx‹Øy7YÞyž±›VtGdºQýäú]·n)æ¶ÔïáÜÖÕóŠn =ïã îp.­»cÙVUôn„d5t£Õѧ÷U¢¡ŽW”øûþ.VD±ÍI;ºI7/3Ôðj%œ@¤EÈæ±}ð =YL ɶ…´¯Û= Ò2R”ÔØ”X¯E.~» ˆA¯˜ôޏ ÌaUK ©ŠÁÈžJÍé¿ß8€€Ž-Ñ‘B m/iœz¯†Žõ2ÕÂ{ëP¼wh–YÀÌÝ5Ítˆ£ñeŽŸû©ƒ­õÞõÖ>Kmsÿ¹E`õíš÷® tc’±³ ¡®åqe¬¥ÛŸ÷uyÛÝ~ÅâR[÷Ý–ºF3ž£'Žïpqvg— Þ6§T=šM›“¿•Ô¼Ky p©ÉT¾$pÈ¢“®áa%Œµ¢YìÌ›ÕÕl¾ßû3[ksÝWÏê,¯ìP¿ä(bÿêW€ë­Ý ¤­záµê´Ñ7í®ôOË"Õ±ߎΎ߈"¢]þÅŽ8v‹Eu©¶€§jn‰tz»,2övn›8Õ½výÑ”5*¯h‘WXl2a3˜ú·ó¸ßo+{Þš9WêCfÚäÛÌèÙÔÍÃô\›öÉí$CÑ­ëRvv4éU…´X~YОߌ‚~‹MÈÄú= Á?Ý<ûx÷=B¹|Èe¨ÚÓ¶®fM¼Gâ~DQËnÉHô$€î%Ë8³¯¯ˆ¯­Õyº’ú~cºã{Éô‘?hï•Õ.ý¿ !I3–è·Ö]ÄAÄŒ’fÄ0ãy¥a`:}9Íð²€sú ²BEQöµèïv!$"Ù´¿î(>l|nJ[hÍ—ƒ¢ƒHEé±ìÖæ[êPu”q—E¬Á̺?N¦¹ƒùYæá±RÄŒü|fha`êþÏßÅ=ýôoß6êâCÓ`õß™£‘¹’v0’ ·[»‚¼R…OܳþÅTÞŒ1”ÆYgÚýào ’¾‰:ë§4ލÊÅ»‹ªZYäÝh±{jÛ’­AÓ™€H,‡¤¹Y¸Ç ž¾i +š¡wÏÄ©â}x–Zx‚$t êFïS{;¸K ™Ü橇šõY5ßidËD#Yþ]¹uº£2¿’)wb^Fô¦¼ ¨#&5E#Ý ÿFÆú­Wòn„K#³œ¢I‡Z¦ZõHAµí˜>5Á(¬Z§âÂõðf8ý/#¯ÚÍØ@1ä–=K !à|:'ÞÌTà¦FÞw¯mÊ’ßiLÑõVÏÒ(Èáý›} .5,Ãñ ß~‘Y¿+êÍ5Îu)”­‘ŒöªúóÍ ê¸C{tXJ»ë%ÈóeÓZZ0/ÀZÌrk%?XŠðGöyÇ´”`Š ×-Uy^tÙá©B7æ•"l[‚9Œèݼ± 9^û[.º¶Ï%4'…ðSL( ¯Îh€x iת†oH " æSøƒg`%šxm‚¯Æ×ðƒÊ «I»¤[¦âöcWWóz±ùpå^Åó†UYä’Í •tk/×Õ®Ô¤h_ƒqãƒU§Y-N n+:Ú[ÞHˆåØo’¦%…ÖHúGI!>׃½y›d®´%“I ×Õϼ’‚·ÕC¢ ;´g™‚ëp]Z¢j]†Y(ê+-‹².ÚMJwÀ¯™Sî6)´Ðv)÷î±[}æ8rp¼d‘W‡EÄ3­WÂÍ[ô5ófXVÀW¬ú¹5¯OñãHqOÑ" ßWÕI`Œ}‹®²êD yò lFÆû C®Öá>‘š…Êl¡žß¶ð‚Ü*½­ÂÚ_¸»ó;äê·Œ”±jl–’›·¤‡“ºùÝËd*óרlJ˱Îïbx ˜ ÑS)ïdüÐ7³EöA Ö>¸Ú™CZk„Ï1|)i\ŨsWßêTûš!ÿ1cO™[êi3ûçÍ+¬óþ­®Û·/N=ôÍ–2oæ¬~ã|ˉÞTÌwUU¬b®@:¨˜‚kWçµÛª†_W×#l,R4xÄ¥\+à‡x¬# õŒ+ίÏ»Áýµ÷ÌÕqÚs;ƒÛBw­Gau·îð…¤ò«Dx¹Kè—`Œ æî¶ ³ƒÒ?evëÐù˜nJ`#ø+Ò-µ‡£ºnÁ™/å¦ê!ñ°á[öSj^zЬbé}'Üën…·ס6Ÿ`¿øòâ·¬ìF&‘…Ðl5v€_ž€ùñ˧I¼¶Â;VÇÐM…¼Ì ºÃt”‹n`—ÅvO“›jׯÔûÁôz=Y ÜŽW+QÐ!$-f;ëÔ–› )°KP ÛÄôªëÕ=#vRqÌ{€ µ¡Sêê‚LHk©gÝŒƒØ­,PdžÖ9B2â¥`Õ»²šÒé΋¼´göMúhD»sÇmg¢Šs×£ÙÞ!³üÍqׯJ-B¹y Ø&Ĥ¥¦Š[AèáCľ,œÝXå<Œ(Cˆ+Ò¸!µVnPÄØÔ€ƒÑ[‘ή›I0‚PKèñL©h×%šÞŒH¯ˆÀ¦póÉÑ*˨ÓqxíÔ?‘=ºÇ•~­ê$=ZçÕ0¼~÷’¶–™ê¤fNS™*º '†¿ðÂMÈí·zÅfݽo/­Jê†Lœun‰|w©1Àvù/ ^yi”«J©-Ñ>7+¹¬àvwwil2Š×] øÆŸÊ!…³ÄdÀ}ðWVHÄ p\ù¹± Œj•‡£Í»lñ’î΃wúÃ`y@B=Šáe§üAˆl‚ÃJý¤Ý’í7èló²”tžfÔeä4àa»x¾bîÖÝž½9;RoFÒCÍ×¹0®£(±­²5TØïiÑAº¦ ÏÔßm-ËœÁñDËø%ÕßI|4GpSoMÐjfû/N(OP·]­S€vIÞV?˜ÂÌ"Rõm‘%t±[!ìǺEô ÍÁ¡¹Ù ‘̼¢7´¯²òj/xk+zºÇçTo!’¢mˆ1öj©±Ó}åêÜmývRý¿Á˜oÊÿŸ¸ßZ4£—$3yÑU$½ÖBöµ›è‰ÍÁºûöÒh”HN‹n˜¸–)u4X ñÈÅc½ÁÒp¿#®vhHp‰ÕKÏ¥ŽHõÆ»«õFG÷B>‚*—ÕÉnÌÜéª;šò¡«7J ¦¸ò+ýLê×Ê NRRI*K¿sÅù\]?ÊHK·zõœ!ÚX¼/¥ÜV·ï¸B6¦úö§Ð@$ÙŪî}víöÝ‹·Õµ®âé[*[;ùr 8þêaZÚ9šv¤œµ:›I¨â2rÈZVi ÍÆ÷ÐU1m´™Þ4ïxŸ4y .™æk»…K»Eæ¶"ü†›Üßú—¨‚}72fAÆ/À¯-ä(Ûï‚Ó–Kån#r„ y?ʯ:s¬Q¸†•èW¿µG kíêÑòKޱ!›­ Q.C „ÑÕ¢»rë·ªÒî/tkŸÒ\XЯUmD¢µ \ß‹hh‘Ű.$ˆ¶žŸhhþ1·3¥T®½ä h;Â#4e—>B¤³ß$ÚQ ?UúŽ€¨r‡Âµì1oØ å »¨šþ$­Ã ‰ žòHV‚šÃ9Ó1@–÷ó…TÅTNTKkÆËfË psŸõáÍ jÂ)'Eî-àþy€îk7*‡¼7mF?ê~“ h+dn+nE“êí:µÇ8ëö Ó›é!+ cÔ7ÅІQéêMi+ÒÕÝo0`Âñ\ò‘Êΰ i}¯[\c¹»@rô»²‡FSr ¦„žVܤÆ-߬Ï/#1Ûþtc;µ#² æCüÿ 4¬h9­9NLWU¼sk¯#…‘h{[³óÞm—õS·n#Zzà‚HáÆ2 xÕïïeУ|J¶E‚Oc¶8ïjتŠgJî· ˆ`ë¦ÞĸwÒ©ŸjCô]’3%¿2]‘WP†œ¹`ìÔrH]iÑÏ*T8ì´Õ5 =a%uq'Ô读—Ì-L™m¹£Õ–ŸS=M~:Ön¥ÛÞoM@Œññ!sH ¤[ôg‰V£[v-véî´ØË[”›1ÔYÍøí|[@uü¥Ê'D –Ð6ög4K]«Þ5˜ê”˥ƒP±`ªÞâ0˜kĬÐ@…ârú8«ïw@/"­[ÿIwÖ eÒź‰BWj1¿}Ž%o ¥Ù£]ôB¶\øÛ¯}»H—BF<òÛ˜áJŒ€¨Cü#iߊ {[3Ðç7 ®ÙT.+Í(¹"-’¥’•²¾½Õtf¦é¢¡Õrt t1h“*JªM¦„›y«œ§пá8 ÿ±­ TFš‚ý†jпŒÈ§W$) žša)"-O-ȼS³æ(|?Í’w*—«ÂH¥|ÅÜÃ%AÿZ#AžŽ©ü÷­ª—ÇVn¼ÉQg/~ºA¯Èéx5G&î†CŸýnæ¯Ëáà0¦[7 –NÃröQô/êÀe Ÿš¯!sî—Êñ£¨S•¨FÉ–’àî¨RlÛ[BÂÔî.qšS °{ä½ßØ÷¸cÇû¹¬tKqÇâö]¡¤gjÓ‹;Ÿ}6n¼è |ªñ7Þè"³wš» èlÆi£&ï7¦;Cr)C?µ«£tXƒ¯¥qud%ßÇààH ÝâÔtì’»v:«ùLßσèÖW€—.ÿ môgóOƒì‰a'p#¥#&7µ{%@°B$›ñ}½Pô‰MŸ<-”>7W0 "KúR‹Ì ²[ïaí§aù)Õ|kºaÜšGÖ¬!X +‘µ²n檯–Öù~[9£•Äreíe0³Øj"“ƒ§OøÔîS–RzéÞ|ô<À âÏnÝù~š‚ÏD™ð¤[ƒ9‚Úèqs—B³ò7§I…©uI„`С°¶×Ký$~ºòÎR‹·;S«‹¾»[½%ù£&rE޹FEÂp7Õ9}ýú­½ü‘µÙ§aÝ¢»Ý)DÑüe…‚÷,ë#˜èWdÊ"„!úy¾; [•ÀgC.MH@²v&ë ¼%àskè!ãi­íEÌûŠ€3ÚCý4µ=¡4Ók#Lm5ö:˜-†@V—½ˆA‘¶Þ&6Z(J½òÞ)7±û€w^epwÑÈÎÄÊ­™ø7›‚5¿²á ÄæûèÑÞFþ Yug0ÒÚî`sëy|±«¡w«Ô‹BìfV^å",Ä[G³ÓéáÙôfÄÑQööÐDD´'Ê¡¶c­ç¿Ÿùït±mͼ}â`Ï'õÜv¯eêK˜1+W©n¼Öñ ý7ýyd wPk M”âûïÿˆ72CUÕz#‘¿ Õ‹ " !ŠMh7(®¬¢·e/Yò«Æô>þüN·Þ\_h9)ݪ8úÖ+¹Š~ym>!ŒÑ[twük÷®S’ìAÖ¢FÃjéó~º5P4¥ãºÁM)6”fðwZÕ»¶yÅüûqˆïñ6˜>DzBJZoƒ(À­BÕR°Â¯ÝýõЬüòhö[ÜEUð’Ùwô¨.íV ØŠtrtt‰Ô™‰U¿UUQƒ‘÷Ø“öÓÀš5ï{çzt±)¥Á¨lo:&âe§ E·¤vµ)š4 0]!|z°¿gnHÀ”áË¥œºònÖj›Æ€PhóÇâ7H ÀǪïâítgåöÄBhÏPR•nÓw^½·žB)'kN+·©ìöìÞ Þ5tB¦%d€StýiêNæB)´P¦Ô¿z`ßow—ÜA²½kè9únV:oýapµaÃ`6¥L™ËZÜÌ›Ežœõ–…AúéǾÅ]ìãÓ.ùøõŸk銫ƒ¦–ê3§ïãêõµ ñDZ|Ð,Pàp„ªå/Žèë†\d„¦Ç£À{ë€?ö¹Šs¼ÍE&YÛÚ&‘&RŸ+–x»Ç,škæÍ™9*äïƒè}#UYßÎ:c³$¾Áx€N2t2Y©'Øûìê9Žóý<¶~4ZQ'Jç둤w™?Ó“pE¦#0hó&z!òMS¥3âüÚ&¡Šð›™¶R"n Åjpï·Ëç‹Ho]U¸E½bk{çnÚX·Ë’‹ùg{+Ñ æ¥DOŒ•ñ>½Œ%zwm­ß1ɱ.­KoiLòà-ÇÀ*™ 1yp6R]Æ’¾¡õ…ÔcLv3õ¼Œ“mƼußRc˜1ƒÓx9ÈW:±U)Æ Ž1ˆnôŠžOFŽI°ˆ=›ŒÁ•½….›×wÌ)¶¬¨&n&JÎÌÓ}<Ù‚x»wª…¦ßT çd%_q‡ß× ­dV×çˆý}7KŸã¶ï¤hy3‡ dì®§0v¦ ¢3±­ã“µñš#šl]¡¢2Ç-*‡·uk¸,J Ì32TÂÑMm#戺®õ˜×=Ô¨äÆ-Ÿ믳12°MRʰ°võ¤Íb¶PسáºQJf ¦:Ý07õÖ9¹1ѼIÍEÈõÖnëüÌ ®J.°¤qÓTŸ¨îîá,·~Á¢ä³H² ·È ˜ó§†ÃßµB‹özAß&*ë¨æœ3 ûº5 Á7Ò¢p`f 4-d ƒ3S€Ø¡&}:û`Q!ÆèV/⊚y QÜÖˆž}yïŠ (~¯}¦F«^­û±Øa(:zýúnïçà‡¶Ë¦´®’\8ÆÄ\H#JÆwÝD»Víø„±QÓýÇNâ¿çfáÔR?·2oía­¶ÜAiï9ùš‘=¯Þ‡ÕT ¹Ðé”X‡,ŸŠ~;¦„ø=¤}Ër¼ðËØûŒL‹ö†ÑÙ‰Ã7HI¬Â<µù³ì=:™ÛžËaŒîÏ‘~{¿[¹|Ív¨ÔO!g|ˆlt®@™¹òt²??Ū:Õ¸ØÔ†Ð~‹ Ç·Ûú·«ky£-ݯº£RÊ7‰P8Ë!Óü>Èö·v¥ñbäÿJ¥b:)ž~¢°.Ô¶x=þȹnRéMµÍµ Š%Œ¹ˆœ±§ÎðBBðn¬².êwÛþ3G ³Õ˜ÝL"íºÂM^â‡ÀVu»Ì¡Á\H;ñ9S¾dUGÖ1hwŒÀ*Tó–ðîȬz¯ªf…¸«H¹ÍÌ~ (û%®†EõÕµÛz\ž¤ð¿Ïžÿ­hìq]AN]ùSOc‰,c‘N5j7´èwŽë {=CìG\m¨¾¼–‚)µ ÝÎe²Óœ°Ýw]·7<çÔm ¾$îŒ}JlþJÁ:»¸v3˜+«§Šw›TkUao®`Ä\Î*:~|–‘"œîÃÕ€ÜÜNà»ÌC@,#Ü}…½Ûái\n–MŸ¶+7x¬Q^¡FnÃÛxǺÝÇùöÔ?ì¶XðƒØ“€†™åÐÔ,ÐøûÍi_„AÛÀòAó¢‡û”ù €!$sÝ;oœž: -ê4….mÖÒ±´£^ÖwB,u 7o™?FŸ+ا–íÔ—8†»÷ÓƒL®tÆ*5Z¹¢¡µ ÍCöë†jzdþÓ0]úZûu»9ðÌI–9Dq”Õ‚GzpN7í·Ñ™Tóû[t™^fgEÜ’\«³S§ÇüX;)îf¬ò˜Þ‡Ý-ÂÊusyV»ùÜWt: ãf |OvwãeT®+”§ßî[ÜÇOó¬ûpª¥-*ÖÀ8U(\ÆÓ>¾ÿÓƒ^ëß3:"O&y§˜†r»'ËöavRŠi÷ªÙ*ƈ‚ŒAø¿‡ÖOõÜ3¡Y¹_³Þà"-•fè9ÝÚ) ~z™¥«íªi 2†°T†7AXǸ¿ß<$Š*¼þ♚%ZŸ£:«§f$™€ì–-æ1›èÊÓd“£—±F+œ¾–ŒW¨Ko#˜©Ïœ£ðÚFeVÇ“7P£¥‚Ýiã¥×à!U¥©áOå´ªZX&SÄh1À.F°]–›úmJ¿þj¨*”ö.‹yQ½ó.ž›B¾wöP‚NÒGÖ†M©²¥ÿdsmèâ{©þ^÷_<ÌwÍåRBùü}heTÕ ûjÑöì“PC3 i¶”"EPÓ5i´bQL-×g±„ƒ²PÝïûítg+ŠÛˆëöê[R[Fºy3”E˜–ªVk°áç *Û{~§y·±f÷$Z–Ù úýÆâŽyéüøõßJ¡'ºí\Ëß´—OCÞ&fm ! ažbÈHöy®[·H+Ð=<Í<ÜGÈ®™±uê»ÿûh÷'þÚb±2G.U褗QéIbä×™]YÞ×÷p¨OÇǸœ½ßÜÑ®–ZðRJ¢7:nfc&ÑÍWàOhÆ}´ñ0*-ívè_Ô JN[ur8 ‰F©hn$µjjŠß®~c6jèY6ét?ö­}Y·ÆÖfÈ?äyÅòñ@äeÜJTò[Cn1òÉa¸f¾iÀ%•Y‰éyÌ´Š0sž‰¿ÿå¯~Y_þìÏ¿üõÿùð¯ñÿËüÿóþö/ÿøÿÏúßÿ§?ýÝÿàÆ¿ü»ÿøødþ³¿úÃ~ÿñwû¥ÿù/×—¿xý÷¯ÿË/ÿøúÏõ%}¹ì?ý__ÿã}ýãÿ~™þË—úåûòýûëËßâÚûË×1_.„vÈGY3Åפ¾œJ¿¾°~ÿlÙãáx0ǰ{û7¿@†-žÍ-€kYööÚÝ­Å8@¼ýßÛïZ5µáØÈâƒf;;Ülªâcvéµ|Ìhé#7Ö:yåë-\5³æ}€ÞùSž•µZH©˜±e÷#Ìl*Íf;rcf4wüøX ÿâ?üË¿øãŸþ§øñ§øÏøýÿë—õ2ý™E˯3õÏ¿üËÿãOü‡?üÇ/ö—ù?~üãÇ¿ýÏú=.ýó/ÿãëÂýú¯=„uÇë|¶â˜)3¿>¨I3vj·-=œ‰Ú˜í65<¡ÝŒ×àæ qy3îÇHÀ-Ð×ÊŸÍ£0ÿû׋»´¼â[Ò ?Ýÿo87ÐñÒ )£sjò펽øhÆòòy©Äf´Rª]½ÙÍû–½šæ£B5•ƤQ?ßÀoúÞ-™â«Q€Þû¸ôŽ=t#Pž~i¿M~Íø|ÀžüÙh«×ßð¨ï¶Ó[70(?¨Ì+'øön3ÄãóÄâÚ«ë%ä®›ù£|"ƒýžžþÿ™5WÔÌ£jb­¹°Ùæ^å8.̶ ªoOÓ0 êóüʟכ¨ý3?ŠÖÃöuÈöåø ,3eV Fi̶æååe7šdÆÒ]Ý2 ž.4óËês§íø­^ý‹ª[¡Ñ 3›–µ™=Ñù26Mä¼öþÞ¼ _G‡¶ò®1‰B†–1}Ôµ8*ö³Üi,ÞMÎÆµ¯ÅÌÆß·»2mV³µÂ¿Ï øâÑú[keú ˜ŠÏšÚµt>ä×FÃiíR¾Ìóå¦äB3ÒÖnä–ãJ•ÆŒ8Îg¥¹@†™÷ï¿üq\×j¶<—“{ý,B…Íl6éqú°À.µ80.¾-ÈDTMÀç5ô›-O8sèûŸ)zà/'÷f¤°Üf-Ñ^6¥^Oþ7v)r]{»57ã˜ýóg6ÄAéÍY‡:ò­q\«N›ÑT¡Ìøúv' DT3Ö~éE€æàôàò»‘³KX¸ô´jXf×fîw(D¦ÁÇ­p»ÍØ/ÞVöøÃ¯$SÃÌ.5‹h,Ú©V-õËq¾ÓwiËÐç|\3¿ücί1RÝhê¼nœqsO×Vá´»Æyá›™1=Ãw×ÝìÔ åj°t¹ÅmùVq÷w§ó©4€¾ª—¹ ’çã `Œ«Óü†[9”‹.Žmû€ïåX O——–j*Å1lsCê Pe_’Ž`usi‹ÇëÕf¬=ÇôŽNcïZ§µ¶=·}üòn\1€7O{‹ë…»ñÊÜI‘è¡—j2º¶#KíFÍ™qµÊg¼íe®^.áµ¾k%kľôcW§1·¢ÛÊ\!nnaž+®SŸðµ+v¡<ý0y™_næ fÝÁ+äÝ–µï`ÄÂ¥Xßm×.ä$9®®k‡{W˜ÞÓ¯ÕÏ_¥òÍ8êŇK;Hßuþùz5mmèÒâÆÖ:ðB Ç+ Ö*ôÆâf^S¼Ž;]íö?Âö»\¯ò“5ã¥Y5Yû}ߌwÐb²LÓUϵÆOËðy\± ×ÔÑSº/Ãz[Çlƒè÷¥õÂÝÁײbðËØ‘ñÒpÉŸJÝoŸ n´2%àKé¾íSì08¦Äû„TMåÓ»*‡;¿‹€f¶Æßn¶Öâf4­7ZÔŒVq§[or<ù6.M®¼ÅÎ4æ5nžq À#ßxÙ0M×(äM­&cÓÁf‚ÿ9Ö³fv\œ-´€*ôLZÖæœÑßîê0šnÝkÞÙ…éC¹±m¯©ë²•5ùc³šÓ£‘öüÇP±ÿw¼v¡žÎî›KFbêÒö6=dȆ³«o?–üŠ}Tù¨3®ŒSq[ÈјqÉm9¯‹náë-VN͎ǺÙtés±%ûã—‡Kc>ÿþá^Oõ8šYti÷K3V´Û¥nÜN ûßg?­ÌldL:"Å3 'ó Ia´f~³7eðJÝÉI©1€áìigµ8)“æ/!!ÐÕZµÅRܘ·.6£‰:ùwQÂÃê£(‘C”¡qcƒ.^öB½ç‡FU¨ò õ•Ç(SOÀ­fžÓ7\ëN½ø[׎ xºa²(Ämfže“Z7š¸†åù\žsciʺ&×9€KŒ›‘;«Í ³.K;+òKKn–+¾Ó,7Çš¬úÄ^ÃÁØco³Åuij.å¸mʼժlÚôÈFœ.?~y¼öaÔ‡;8Þíñ¹Žs@8²¿råó»#¾¸%íÍh§â7æþ˜,ÇÃËèþûŠÔ$šõ•í—íÇ.æ$ª‘w°D‘šðÕ²šƒéaÀÒݼ1ï‡lFùöD¥ºQ…åŠñ@îör¡0Ÿ˜+R}‘žJ¤ÿÖK P›.³ðÖYÇÏ3¤{ù°)ñ§®Ö{L¢!ùd—&¼e#FyÍì¿ãµå’S#7a§{ á=~m¾wæl)Ç6Mƒ8¦kx€{íl@ cìÂWsÐSFåo~³lMª.TÍØ‹™MÛØŠRùŠ@»²Ü8£v†ì} O險#çè¨W+0SŠ“ÍcT ½+V”ucNáÇôØ„z„¿Íôü†…ðùßQ­wˆ,U™#ØŸÝ àÛõÞUéŽ?}0Ûßÿw„òwšô:àä½¶1ÿů;³ºí Ä%ÀðÒÃswXÞËpèCÖai”&ˆ“Y–àFñ¤q¦$¿=2XY>€Õð6/#€#–¾l&D=i¤‹cÉLŠB¯›—Ò(¾#bsó]»»‘•igï‡næîsÛLøÕov)“)/`dˆÁÚISå[`ÅöëFÔÎËXp¢ØùÚ†«›À˜TÙ‚q9 àeFn7:"îe*Žêy)êíÆî[ ´}™T.&u…©îð †åMÏv$Óªnd]ÂŒ‚Ĺ¹/à^‡ÙÜsï×¾'@,þîé–ÕF‚ióº=§ªoú2fö†u!°UÑáÿd€Î¾×wÔšýú^\v`¾Œme7fW‚2co—z.óß{Qô9LËV‹µõjˆIb™ï‹h´M3³Ð‹kýÈhRÍÇèvRÀÆL$îjLNa™Óo :-ί}…øØé;RŠVוæÄ½Œ&áo´0»Ô&F c™±òT»ä•iðX‚Ùdoì,Ìt#×5Zyr Uk×Ýh.‹x­NΖ#ª}€Ë\!ëËl–ýT¶Xåõfû{z2=»Î¹?‚ Ø çagϵÌu}kï3æ C9ÄÌ®`ÆRÌèÉO|7Ú*±Å9–æšíCK!ËÃH#§x‚zùŽc †z<±ƒÍüŠñ4ßLæAEÙ«»fôäT”‘]ÒV­6só(w0’o“=UÌÈ"Êm?@7< 6wcð¬, @îØS;¾\ýëî¡ iæî1xƒ&(ÊFCF™Õ7=ñ2šË¥¬žiæº8[¨ªh€Ò|+Gת+#³ ëšÙÙ{fdÙÛQÖâ罦m:ø©2[ `ŸoÛÆbóÆä¸jq/·¢‚00µ™þiÛ°½¸Å¼nʼnüJ3Û}Ûëzy¬×N«°CÁ×^—ùæ¾4W|‰À®W®îáÉ<ÿ±Äí4¾45O¼2µ^öø)‡q=ÑoÓÕ–öcG¢Àh3çF•ãÑ„gMîòËÃP3N_[‹¼\7:È >öBrÃÜ:øÉi\ø<Ë·óå¿A‡Àiè¡S«>DëÚéçßáò7äFC4šñ¹ÄDÐ[„2fÌûÞ¸‘Ît»Pìôóø·‚R]È—–õ²“—û&ŒYûy8NoZq<º-mo¦Z|ZÑÒ Å¶uœ_NíõA=Æ€“`Å_ð{3.—Ž.)£qTAÝÏâWP.En¼Šî?ÅÇQ~á¡.CÇl‰Eásl:r*^Þ‡Ìјû‘}+šÀ¸ªÁ2™>@õ—äOÖŒˆ†ÄKw«‰)'IIïðöÉ-ôdè(š±hX&ÛÝÒ”n«ˆ.Ðk»œK+îÎv7ÆmM{L+VÑPš«åtX¯aóu¬Wx[Éw¸ì±¦æ€„ú<;`óuù)SˆŽ´—àu¨—Í^²Vaòƒ—.ÿèÑa5é-2EƒeЧ{°Ù»Wÿ cÊ„2$ y¤æáj/cbg`3Úêñ+Ëv͇'-ð[ÖÍÔŒÚJŠbÄ‘Ûm²K“c›[üV!åÆ>p5ÜWy‹->#–_Ñ $ƨÂ2Ä?V~½x„.˃Ì£G5ü‡G.oßéÇ/ŸôáÓØ$ŽÊqëyئ¶´Ãæ÷°Q7Õãö{ÞªÛúù8ŸOÇÊé:ŸU‡cíx>–ǃõx?×Ç£ýÁ 8: 'ßâÁ ypXŽÎÍÁ zp™’Êt07yW×U¹4-UîïÕ0¬fôT¾­‹®1™>„±Å_·ª“° غBg˜ëä¡Ô3Ï ö½ðkKSðyÜ¥;úqï8'ΔÃéópR=œj‡óïá¬<ž«Çøá´~8Ùß}€áè[½ƒÃòó6›ñ Lì³ø‡'°ÍŽk½v:ü#¢̾„Ô<÷Ù·—üñËã‚8.‡evZ‘§¥{ZãçáüÕ<Ä$‡øå!ÒyˆŠÔ1ÖzŒËŽ1Ü1Ú;F†Ç(òo#Óc {Œv#ãc}Œ·±ù1Ž?FüçäÀCáqxÈN3ÇœÇc~ä˜K9f]Žš)ô)²9ù¬å¤/3½Ú.•ý;ÙÂö÷RuvsóÖ¤…}¶ þvé%š1ÅßÏeïé,ÔaL¾›‘àâÞ\ñËÿžb6ž¢òtÿhYX„¾·´ðóí Ù¸ðF[ñL.]k¿×«ø cè@Û5Óу×Yê…± }Þk8øJÏõ|Þ\`*j²§~TÀEð«Èke™ÐKéÏ2„µïÉ‘8f¾ é0°JŠ•Aà­,ÿŽð„W¦±©Ò5::P.ºF3;V3OcfŸ¡—± ÔáŒðz¤Õq[FN4㨞•Í*¹¼æ x™N£^AŸ:ÕpÿÎU€‘°,<¿ãR€œ86l€yݶûûî¨:O&Zäö2Ž`5ô짪mæ€ËôÎ'P^ÿeä¹Ú5'óâÎ4nÆãµC¦©Ïs6›­´nâ^8€â™a“¿¾Uý˜sÆø«•¡š:µ:–®0µ›Ù¹Ýžº–/õÐê Ü`/s€­ðn¸âPR ÿ6ŒË1ÓîOáüç%g¾‹«û2&X¼¤*¸€dñ+-ÇîðÉ};ÎþÝO^ƒû9ë@@é $l6 ¶üïÙ “ïK„{?åpWË'Öøúvx÷Ë‹7>Hԅ׺΢­9£É•˜Ã"tð“ƒÇ$ÅÂ̓?†å­yÉ,ͽ¼¯ò…™>S,z!>¥&¿¯¹âè¸v’ÚDU—¾Žç$Çûßgò'ðb|ã„‚Œbkˆƒ5…Y“ŸíB¢àÒNP6J¼Òâ!E¦ów’.Ò<61câ繆ŸÓU=|–«ìÚvɇá'Ô§/dÒÌ47ó‡,ó¦ˆm/שë-vQ‹ã±Ž(djD¯s 2¸SS¾Q4¨ð÷Ì_2,•Šñ„~âR±Œ‚ÐÕ>A*^³©º ~Øã2d@‰¸YsœüPœ2Œ'XÜ ÚÒ›"hâx.à+×OâÝØi]sÈž¨ïñóÿR8" :k·Æ®èâMB¤\z«ÌgO%"†ùˆûIõ÷VœóÅ)¸}qȬiFÈwÃËñ•6©ˆÊ Ïl †ZmU ƒÛù“xxøbì A¿/2'àEXÞÅ¿ƒDÊÛbFÝÀ%NŽØ[å•MIë³P™¨-gÈ7ÕTÓFWL½¼—!øJÚÇ_ ð_6ÕRß\R ôñП€Ý°ÈYˆû)Ç h<ø÷Âäd¤àg:/îå01¢¸æ»GA§jf6&ç6¦¿î.¤êVÂÈP½¿´i{£$3dc¬oÝ\š‹Î`œ]›+1€ý&G¬XùYhý<=µÉùwâÓÞ´†îÆà¨†Çñ†È³xî„`|È·ùwŒØ(éQ©;ñÕÐò“9Šá‰¯˜žzàk¯m¤{ÉU*‚‹% "œ>¯p§ãHõÍCAdãiL–‚‰È†ãNǸñµ×v‰§5ʘ¯ÍqC³…ÖwÝJÂ¥º±™G ‚ÞvÛ‘‘"u!êœhõ>Ü MÝŠÛÃj­8ælÅì¹(ɲœ_%ñ™«>Dfã§ØúÜ´|Å‚ý±¬N€ïÛâq¨–†v­rˆË]e7*Ó¶\Ýd-ÀÓN"àž<³V´^›îÖa•Ö“ÝãÀ{þŒTIMµ¢öè»Ì+JMKÉV#‚x2‘MÒ:Ä sµ‰¶ñËVUý§‘k¼ÉFG7¯XÃý;ÏËåª%óšOÞA©·Å¥Q-É Ñ3`H®üû2nDœÖ¨:u²(c¼C ù=zÍKs0Ör‘7ÈÁ3v/UH0–á!uà᡽.ï8Áy£yŒ|KX&)IãD¼­Õù…O—@ˆ]Šî yzƒ>lÕn@|hÿ<`[ÊLf•ö`¾’ÒR.&2ã­ž‚LÝ—“ˆ<`«],#˜Ëƒ¢.vAOãøä‹±½™š½—F^T¢/¶]G^Ô%%l3n‹©¾+X6¯¯Í¡Ô ÕIº‰½Ëw 4Ð8ç€ö¼‹:8dìöæ-Q#‹–ÐiUg”×[ñŇ ®õ’¾ yçùü1´4§¯iþ³XRp:†Ür&=Eö*y¦ÀÙA¯~Dۜҫ牾´¹¸ Mùa–Èûïs$ ıi3R°×ï”`ï¸"4ïŠj°˜ù £…¤û#JË9Yn,}pýï¨u'-²ö—eåó$ ,‘þÖÀ>ñ—BUÄ™^…Û˜XfÞìž_« óû•³Êˆê}"íXãwšÀ¢CÞl¾‹![ì/Fv7³5}1³5>t£º“ß$ k±äQ"·KëÓÅÐé¾Uü½•¶1Õ Œë³Ò´‡!^:Ç¥d–õ­Ô5PÝHœÊÚ>i³»x..†Ð®[ÉEŸP55`¡Àq§t9ÑùSn¤B3]Iˆ`N®@LÏìûST~˜=ÉW—<Ͻ®jwÙ ßîƒ&†JLWd>(kUãnSµRsµ‹Rt5‹j°îÐù& ÈÚn)¡cî‘F©J.Ü:çðj—~ŒôE|##k€×tje³èw«±`’ï85¸Ÿm„c|ƒWl¹'=à<™ÓU‡90vy‹/ŒS)Y;¿}€îÛ;)=ûîØŒ¡çÆÇ㌌?B# ÔCÉŒµë%x ­Ïü½–%u%[[~ÿ·jîŠs´`ÃRΩîàvÞVabh…vÒ`zöÀ¯$ܺ‘G«è~n ½Å‘—| ×CêyÆÑ6|½´­€Ø4‹ ¾hÙIR²Ú¾^¼ÐýÊ$  ~q厕'¶õþÔÔ¨ó®ÈEàÀÛšÎ=újqüê…`¥‹ ïIDm#¨¹–`Ðl1Õ #12˜«Ù4Ù5°|ÅS‘¡à\Uæ3We-®Ôù8Ý.MÊ[ˆß^Ò­4¡ó–+)ïÖZ!“ “)bK—+JÝKõP­€äwµ3<†Ep#Ÿ5# +TÛ[^QÕ_~€É–0“r  ’Yòš&¡Fî ¹Ü‘êWò:+Å6†ÎÒy¹+˜›èê8é#4ÍU‰?Ë'»/‰´] Ú¿¡Œ˜DzQqÝ)ÇžI°=7K_ÀêþRg¤¯KË*Ê5ÆžÚòV§xÉt¦g• ÔW8ØÔX¤£©@‹+(ÿiÈ÷3ãã— :0Öežµ÷§åŽcQ "Ù¤bÞNÞ”aãrú–AŽ8tM˜¨ŸÁ؇0Šs9³”hfU_!”îâóè-[­BaÙ$€ì(”¹(~²yLÂW›Š¸¢0b+þÁT;©ë0×.-¥žÃÈóдÁµiÝ”U¬«.ŸÌÚµú‰âîÇuczá%œB´¦­:¤Bh•†‹1ù•{Rø4 7³´³‚?½Nrh§˜BÍzÍéïI»òã°.ÕkÈm[Ÿ¬'„©ý]ŠÖ.ªQVwÅü©\àÌ%WÙÞ—êMËpx”íFb à 'î¯ öEp~åpºwxqc"jª‡¦€ gÂÔ<äò?OQNµåhKY¨%&?MS¯óB“õŠÝRà k½è¸Â%k¶öŒ÷[ɰNR“f!^ =3ÙÃ&_÷v„þ÷=2!=ɫ߽òÔ:í¶,ndü=€y«),ƬJ˜­©ÀŠ[-U*{õµƒ9–Éo_Ø*n¨˜fj<©ýo‹J=f¦TÊ*WYÈ-±%`M_®¥IíTJ,’´ÀÍ/N_V.S2êÖc>ÔÌ! g2ÜnœÒ„#H¶@»¢fÌreì¶wõá B³¢~Øï?ûbðÅ&-¿ðõ&¡5ô Rfm*³å„›= #óÌv³÷„¸•½6ÿûOXFÓ`w”ã2T”m]̦¼Ž¾jÿûÐmLY;tBuè./{XÖP/+JÎÀiÌ•8³ÂuöBK7ÆrYTÓê®7b\BM9{6F–ábuˆ¢¡<&© #ô>1,™­… ³ÍHÕe`X‰b2é–L «r5Öc:J”O€Xëâµôñ >"`mK{µ wsiÜ/™Û˜ÄVg—ÐLšPHî¹É7VXäõÝ;6Õc&WöømpÈX–%6Ë[½ÓÚÉN"ÎІèò$a¼jj3´]èÍÌZ nÖk-v-O¶»0i‡x¤­ùü¶Æ (X\ƒM ¨AÄÉ£VÀd%§K0®±°ì‰eášÄ—±|Ê_/%‡0)b¯.⼂¸!1ø©E! €³´g$‡Kº‘•ôµiߪ×h©Ào€úw/³èÁHdMŒN"SYdÑlà?2¼^ù¶ ÷OfY¥çºˆtF*•Ób«Ý X‰uiR!5Ž”çÐOש3  DW.Äìñ 4Ju©z'ý1QY'h+¹x›ú„}îÞ]vhÑWCB'wã‚ðŒÍ—Qu~¹í“ƒ×Rã KDŒšw`ä'Ît£²®}gU4¦™gU‘!yiÒ¨›tŸã$©¡Ó²’æœåËãÓ˜žtó Ê´$²´ éÌlAö$ŒÐöjjd˜äâ±.Fõ 1ÉG¥ð¥Ý|€ê‰M7»ãh„BšªJ`†õf6µZ‡ÿû®K i_äm#?"Ô²©pPÍï¶%kÒ–ëÅ2ØÈd‡G)píW cÓ ¦éky~ Fëú¡!œst£•› ®%—ªÌÔ®!xã ×Ïͩܤê\§z¸È99œçƒ×û`4ÇÀ¨Ùt‡×÷!Ä2IÁZó.ÒÏ$Á#¡ðH=<`~æ^üwˆs´êS+ÉÚ6úA³À‡ ¤ø¡:– Ek¯íÀ(hÁ¸6p^hîÉMÚ1ÔIrðÒ ÍàÜ6ƒò[¦µoÀ÷Ö$è‚ûÀ¨²VwR‡ÿôtåo/õ{ [WwÚŠç‰ä+h`Í+ȾOÞ2ÌW嵪a5¢ddeÂŒrWQs¡áNæßWlSa ®WÀv)ƒ·e˜÷Ýfák€‹D1D›Ð¢îÙzmôô+q[^½‡±y½×úƒ‘þ¶ýMà¼IÉÚ¸¾<¥Èb(0ìíf‚ vÄ€c* YÒÈ@ÑŸHƒ­6Ñ™pøAê2ÎÙJu¾Öú©B âìdö Çž†0W(x¦@WÐsÝ}G‘} ‰òcPæH‚e0<&¤d„÷Ø©ÛâÐ W#çß’‰à ü-œëzíS.îâ ¸þR¶¡ýé~Ã$Re ,d°v/"Ù„ë% Cò`ðG zåFò’QÇ^‹Æ+ký¦Œdä ŒûùÓz׌ÄíNOTùUiÒ>·§‡Ã;®bQ½¯­îƒ¿çt/_þ[Ú«–îè ì¾vîw¨_‹™“ܬLo‰å®¦x/ÓzÙëï™»~ÅK†cEá3Pˆ÷ŸÊ8ô[ÎÊ|ݤkkf´Àf$–Þ¶ðÓA°5Íì˜ô÷“óeí±òåË‘é!Ëiæ xõZ~3_Wx¦T¹8YÛW²þv…wÀj]KÜ(?‘¯ ¸¸ºáõ«|Dä Onf,œÄY•ÖöìtOÂùšÄÛ=ƒôÕBñáiRœA›¦àÇ7nt¼¯ž¤ðw@: Ò!ž‚ÆBÞh÷¢,!Ìž$©AT m¤(zŠU¤Ì#òNÒUO‡´~ ¾ ¶B5¿£qñ[Ë•hsˆT¡ãuúR8‹@à/©À¬Ç’d^ÐGàá‡ÎbÛs³É[E:¯¹*v¾EÖ9[7°ÈêFË(OÇŒTm4—¢[öÓø‡r‡^E0³Cb€à÷Ê Œ걦³®½L1Ï]¢W¹÷‘(kŸ´†F @š¹NØ(aüÁܩ䟋X0‚m‘E„+Š[†‰‹ÎRE´ŒKTÐUädàXD¸ªëݚѼE 9òÜï€âè|“‹F«]x¢šÅ@“ýM;MJÑH;ýÛ”UhæVEbxÅ ¼ò&uˆ¾ü_œÑÆÆà£W ûR\·vr’o|š‚ªºaß=6‹¢3ÎÑêó¨±fB“NB´ÀIº+¸´ X4 2…/%jÛó.>Ö˜†˜²ïæA0…7kŠÞ·(ŒM<-+ׯ lQ[*hëOl³é”Y„(+³Ç"—îu‰†Š9d`®Ñ´ª3>¢†áÒ¯˜,¢ Êóê@3¹Ë±qž¡Zj}Žåjɳgœ½.ÕøL±sðöÝ|.²`J›³ ùÚ–ipãºä•ÎYBQÖkp´i‚´„K±‰Pq4ì“BpQúÍÉ lI®J“r™@¼V”jÉÓù>õ8ðõË ’8x*—éƒèÑÓÚ%E½/ùÊ&aLÏËa¤>ÀŒ}ë"× URFUÂÞ¹‘uÜiÊ·~ô¾Çïü‘`‡$z]œµ1ÊfàYCÏß6NÔ>섯údLe á‹Mõ…Þ]pýÚ²ýl*ÖCC9'W`tùNÄ?XUfÙk°ØÌªô¼¬½uÈWH©‚PR³º9]ÙÅ]ºVÃ^6<)ÕcKçsfž½f[•¶qkƒûó,Û#1swìE7(ÂPÖ¹8&× ÍxmÚS}sƒþ‹©çÐX…ö(:Mæ}'*Åó¸Œ6ÉkP£ð\ÒÏW°ÃõÑ«O¹Í©ª›Z?`GÜC“Æ&o~‰ÊÁpmnP óÂègMXQ H‚5¹&‹¢+Ùc@« éTjëÕMøHHæÂ9%F²^xÇŒô¹Q-ÙÛ˜6¹A ¢´P¦'ΦIJ×CÒ1Îeq½ðèM¥™¡'#©ÈÈ{K¬&ád!D!Ð1u©öær‰à uàпÍK$óâ;0 7渴›.ŒØCrÔRѱ€JÀy…ŸÙãx‚쇃Õ6®ñˆ¸4Rp‰LÃð”ÆÏ]õJ uþîi.-µÚlŠ…ñj—§mc§Âq!LÉ7‘ ,´åXsxT¤ Õæå`¦Õž”àÉ®›Z¯h¤JõWƒ§1ß:B·rÖ¢lë`2Ô^#{loVÄ~ƒÆ¿ÇKí•Q[J'ϯû ·†^­U¥¾òÅ4bè •ç¤[jXTGô¨(l‚mÐGž/#«ÈgÐGj#'WµÑzÚäàEÿ1&ãF ¬zµTC‹¢,…Á'Ù7îŠ}ÄðžK¡ ãò0Îâ•Ê·X§è¦–—q¨-P¡5 ´Ôv“Žƒ°ÂIøMüU£Q.àYt‰×‰t*°\î¹øßïC‡©]Ù¼Y®Ÿ¥UèáNòÙòãßÿºKtE„#ôyÃ%nÿNõ­07Y@ù¶ÏÇ,'À^|#Áüûgl^\*å ¨y ]} šÄEç7 Ί1“&§dó?-Ë´èK°êk_“Îe%È›g¡Ãؾ¾äé‚`@ï—#‹``O þ¦ƒ{³e13Φ7#ˆÝÆÕùiå=@ÆæÐ?yLç+Òvdèð®£gÖ(÷©!ˆñ¯3ø,bt7q Wùm: …h&û@ÎJUêQuáQ¤ç…¢»f`—¬Áß’ÿŒö2#"N‚ì¬?ìRÄ@Ûa˜PE²¼%é±uXóEÜÛÐ_•l™@ÞÿöŸ[W˜ËÝÌtÐÆaÙ^EqêbÎubwÆ&• ücÍj܆ê/©Ë«þn¤ŽQ˜dZ»Š‹‰¯­á3¸(™T?Ià½è’c=gcн‡À3";Òá]¼)©-·@€o*hnñá›y§˜I:BY~(_ˆÏC¥ŸY£vëûóP]@@a3fŽ*'wÆ~e xmc0;s«W±3̺hË.gwE! ÈÛýçJf(ŽËOßÀÖu…™ðD~ðOÅlGÓ¨¡;§ãf¤w$ŸIkbȃriò‰`3*ç#©Mîr¿½\ß„I=,A xæÝ8z'2ß#ïïÈ<² OÌÃ#KñÌg|à>y’GFåûòÈÔrp|ݳ÷|ä xÅä#_ùÈl~`AŸÓGnõûÈÙ>²»ÏLð#küÌ/?SѬõ~û‰ dÍŸøõg*þ™µÿÀï?juúJGÕ‚£¾ÁQ ᨛpTXxTc8+7œ4ŽzG툳ÈÄYŽâ¨\qиxÐÃ8jgU69ÞÄ;Ž*OŠ Gõ‘M’ƒ~ÉQéä,ŠrÔO9è¬<(²Õ[N2/Š0ïÚ1G™'=š£vÍQåæA稞sÔÙyÐäyÐï9*ýUNB'¡¡GM¢ƒ~ÑQéèQé$ tPZzPe:*8½+==hBõ£ŽJSªTG«£ÖÕƒ.ÖQC먶õ Ìuñ:ª}=(ƒUÄzcÚd:fGųu´£’ÚQsíAŸí¨åvT}{Tˆ;¨ÉtçÎug5»£îÝ£FÞQOï ¼÷ Ò÷ èwÐþ{Ð (ÇUfOr´gåÚ£ÊíY÷A;÷¨³{Tä}Pï-BÐ šç§hm%/•=À­q–ÅÃ@Ê“æå. î€i;’@~ÃÒ¾Cu«P¸EPÝItXàñeXº®y-å×òÅ|Ìú:ͲûÎù ùÈ%9²N*ïT–ãåóÀ¤9snNìœ#çÈø9²ƒŽL¢#çèŸt¦28Oü¨#—êȺz`hÙ\GÞ×GìD';òÎ8j':Û‘÷öÀ‘{àÓ™w'–Þ‘Ñwæþ=ðO”Â#÷ð‘§xà4>±OLÉ3©òȾ<25#k¬N"šŠëÜû]qar‡xÆœä7öòÓù}¢OyÖGFö‘»ýÀó~à„Ùã'¢ù‘“~"¯?ðÜœø#{þidåŸéû'¦ÿ“*ÀQ?à¤5pÖ%8*<¨<(#4ôŽÚ G‡Ň£:ÄQGâAsâAŸâ dñ zñ¤qÔÒ8ën5:ŽjGå£JÈIOäA{ä¬SrT4yP?9 ¥UÔWŽJ-'I—õ—ƒNÌQOæA{æ¤SsT´yÒ¾9¨äõtµwŽ:=EŸgõŸƒPÐAQèQ}è TtÔ4zÐ?:j%U•˜P)ÑÓ*y c$WTÜŽ5ä;ÀE²7T¬°’ÏAñ¤Í‹ku| ÏeK†šwMî:l+ô¨Bõ XuÔ¶:ê`³”µŽ*\Š]Gm¯£؃fØQ]ì]‡ì¨XvÖ6;Ë =(¦µÕŽ:lOšmGu·“ÜQ5î¨/÷ E÷ [wT¸{PÃ;*ç5öôøÚ}G•¿EÀ“xàQeðA‘ðA½ð¨sxÒD<ê'ž•Ï¢Œ9œú©~˜Ó¨ýz‚FËO2‘þ×E=Õñ/‰W^£e½l÷³ž-ê—ï2™ŠšOê›g΃¦çQÿó¨ú *zT =I•>ªš¾  •RUUO¬ïJ­GM׳úëƒNìQSö¨?û Tû¤jû®€{ÔÊ}ÐÕ}Ðà=¨õ>(û>¨õ‚–>ªuŠÏšÆGýã£Pò£¦òQ~ù¨Ó|Òt>ê?•¢U¥_ŽNa¾?$Í+ŽØAAì Iry ˜É80r ¢XcŠÉà r[¹„™„· À ˆÑTÓÎï§Oá_ÿ'­žâèÝcu•WJ¤´Á8ÕGræ|)­ ¸xßš]01¬(¯6[WÕ­K­©nj k+2©$Ó0Jà¦nB¸­tj×ààSIÊ!¼Bý0š4Zµ?ÀļcÓ¸û‹ÉÉ–ªŒ7ÉKñpzˤmÊTi"ÀH‰wT&Ð;¦g `9[¤&Vâd­…Ñ&扙Ƭì¼ul5c¼×>ÚŒ;Ð!Ú¼H#3[¡t`ÆÉt×ÎNMÃM6.£’b”ÆJ—‡ÏVÒÚ¼a¾º|)9ÀQPfì}´ Uj‚˱¿|vÅP´»âlójíTt4=enÀT)Ã:GåÕláž»‹†LëXmJêgÙ¾¥/cËÀ..9ÁÛþš×u^LoF–ÞFí’-á{Á:w:‰I™ä¿E*)ʸ–p]JâI$k”#z îKxxYuS×f.êÚúÚ¨­uÉe5ѯ¬s¤ï¥W–[`V[”†ÍèàÕEDÑì ™nÅÒI^ü€¯èŠ!æËù©Y¾Éì„×åNº˜3ð‚3|T.Xü”ªÛpg­ÆifV¿Ìõu(Œdƒ'½® «ÆÉ–Ÿ‚åíoæò˜å«£ò ‹ÞžíÖc­sHHHMÑåàrê²Mf/Á²Ü?•)ûž#®—ûœ6€0Óe£O®]l2²# + e„KyEÊç¬*õ—ö‰´#‚í»”âÌ)3ƒŽLyxÛum¨\+¥\õP|¯/#Á¸r5%‡¶~PRSUƒš%Je)¤‘(ºb=S5Êõ¦"F]KY…”—åõ¾ZÎë5—|Yò€Ù7˜+Näœ#ù{mb™Õøøi„_®¼Ÿæ*§ˆg¶›šC¯Â*ˆÂ]çëw’ÐbAÄÐgñôƒÄ“—1×AɺTfd‡´½lY}u¤X“â›ÖDÚ±c2Õÿûªöµ¸û+éÒ׷ĉZÕé—1­Å9¹1‘‹¸Ô-`‘@1…‘\éé«'އ4÷v™ 0G}ÀÌ“¬gž:I¨Û—Ü´ü,ÍM—èÒçþ²í÷džӖ;÷BeöTyúV›Ìu(Oo>·¶¥„$ÀÕ[ge˜{¾¸‰0zœ{6Qun$2·±ÃŒ* eÕx׫ÅI’ÂÑBM„ïõÚ‘a–~j Þ÷•…8nI “4(Yåî*Ô6*8C'Lái a‰‘¹2Dæ¾RÔú’+iòsMJ.ä t¾äȘ]Á~iÄ‘¨ØdV?$©¤†ÊÖŒúx Q‚|Íðê’Z#&á4…L†E`5/7ö(d¢Dʼn…²k«ÍZöä’šI§M¹˜šoX×Bÿh­ƒ©šs}q̱ë•VfóåµC%ÜV'¡Z+Nùz-š®'šqÈ5©ÐÊ©ºD©·ÒlÕ]_@[ŠaØE…˜¤ì9ŽãvI¯–HÒzK1ÂLMC\K…•K®y øt]_×j]7K°Y\*Ï©B|„<¤,KõÇ®ú3èÇ4ªröi\Ê{6Ðýû¶½\ ¥äÛÌ–yê²ÝpJ.öM™ôg€ËË+Qç2ËåÿXùµb!F·\–©w¿ðl±šºðú¶­`õ*K ,½KnJð´g‘qT]6AËÊïDå䱬Hž®: ðÓï¿?^~¹6 œ×ªÄ®î¨ÉéáñÆ+4»ðȘ\õz‰`øó¡úC|D÷)·çË»Å^¥Cœ2j’U`Ê;õ;JɾÃ|µJo_6 °TÊ;æ­7=ļ«ñÕEün‰‰ƒ±;ö%ï¢nµ®Ü£„Ö¼“›úÑ#qä1ŒÂ#ñV}€0™N”ºýToB#ø>ø>ƒ?¿¡¯T½,¤jæìƒfIg5í̦»ÙD^²ÃÏ‹\ŒîQé§S£ˆâ¥•l0Ç|uêV6I¢š\«4É@]+a¥7yXÄ?ÞWºi'rØÁpíÎ,°8ð«Îë6‘~É íÞ Y ö82ËÅd’zµŸÀH(ëò4„•î]θÐ5GÕ 8ÊêÈ €e/ÊF) 9ºDÌÍq 5Æ¥‰ï~J¿h´(ów6ÜûƉAd*á?¬3Vã’vp ­ÆÈ7›¤°«6 Q<9‡ut³£†ö07–ô÷¯OI³åj»«,ÁAûßÞáaGFˆ‚oÅW¸¿è!õÇQö;7´«W)¥J@ JW¢ àZ Ñeõ3EÖ%Å ÁÜ ¤f;¼‰P6¶‡„êþ”ݧ¤š'éAo=£¨p«ìèÚꈎa «Â¥ªéP—^Ä­†Ô¦å^'ŸVHÿ¶E÷Š„ sxšè!ÍîN|“&Z|Ÿ(CÅLŒa·;m–ðuØØÅiè|N®œ’‡û{@æ/KÔ;z%¬æ‘|+æ$þ˜%û¿`;­ÉEn`  {€á×òÒ"± ØÈ¨À¶vIïpI/ËQ v[T?­Â:bVz(Ò)…YÁ'à¿¿ëBs ÚÆ¢êsK¿iªúïÒ«'}Ö³–ëI÷õ û ${T=ëÓ>hÙ>èÞrjºGåÝ£FïƒöïQ%øAQøM{ø¨Qü g|Ô>>ª$?(*?¨/ušOšÎGýç³RôƒªôƒõQ«zKZëoS¬à8‘±ÏJ"×»ãtØ¥zD?Ð?À:ýÙWú7x‰F’Z!Œ&²Iv¬ ”âat? ZdxáÏ)SÄ8UcºÏÜI1{ÉuP¯Íܼ" J²7Éhû·BhsyÁô¸À^º®É—¼< ]†¢XÚÊæ.¹vÅ”vöi°ªù} ó<—¾ÛÚ£ x”Òæµ¹Ê§•«-»i*ˆk3“1µl!‹•Ãx znY,7†¾³™½ZÐ\ªQÆ‹FÖsÍèŽP¥x² h"‚1‹32_>ît 83:ÍÅPX6RVµyû«+­ÖO»ž«,îEv¤ZÍ-…hfꬮ(W%`\Î?6cÈ+Xa×$ÇçÆÎ’åÿL©o7†ô$€êL4SwØTBÄ$H‰ê O¨zìRÝ8@#a\v­WÔsÙï.Ôcs¬ f¿ôº6ç*ñWî(V,PüWi¶|©¦ì!-emmõ ‰L,¡-ª©rñ×J8/n€x×\’Ź˜?¸2¨°ˆÚvI"1•_Åü³ ³9ÇvHݘ„ÓÚ1]è\¿}_ï©ä>+»ó‹É`xj<¢ùõn[ùüž_«É’É®0l[Cí&Oª%Î*| ¡Mš3 `¬RÎä®·T2Þ뺵+$³*¬k¿!3ég³ÕkéÀg•CN¢š!W·4»ÝÀ88@Ðák÷~;ß´Ê—®%áFBìnÀf¢Á–éÀ¨À4EiÜ£õæé£OOw@›N@M,sÓ&T\çÎ1}‰ªÊRft2ce[…o|ºu•Ð=ŸCx%øx].*¦d¼¿„¡\@-qLÈuìDz`Bô¿ì§‚M5ìÚËfœ £D­Š2™E u¢k Æ[±¢:Oã÷ø‡¼?Ç @þjÅqGÈb^ÂèÖ²µž§øÄ0.9V9ôÞëV™Í¡ÈS£zúxä݃£#ñàt”£+óàö]¤“3ut»ž´£+÷àö½9ˆGGòpä¥dÿTb êZTá'{0~>ÑÓêóa‰}üò¸ ÷§%þK|ºþ\{ì“âÎÑú¦F_$XŽXµW‹ótSZÍÀzøFÞ\ÿ÷ùã—Çþ¸=¼m%ß´•ðHË,CHû<)Çëâ›…cæF/5N”àÑ«UãñÏÙØÞÅ}VÒ4³gBÝ0mïI_6s3àYÉú.ÅiY ÈJànú2õ¹"ƒá ÈjX]þ}À¡÷5y©N ¶>r£Èê.ŸPnºWXqS”æ€Æ;Ù¨˜§öÕ|{Q}ÌZ:­ÅµE®$ß§ð7í¬5¿!΄áníÑåój × Hîˆá'°Ã×\Ä ?ñµ »E¢-G¿7ꘗ2bóšACåÐX8žØ(<,­#š¿ÏÀ ­ñ†•p´F|¨´xúÁ`]%`M Y+KX¡ ˜¡|¦5o-ü±ÎùZâYqÀ`<à5ÎÐŽwÈ-òßœó/j#U•ЪrlÖ;£ªZGyÏ ”}Þ QTB´Ör®Ùp„—uñc,x5Ñ/ åÝç® ’ƒeêdž'5ªFfzÞhd¿Rt8–'Ž…Œ2cÿvD}üòè¯=»ÃÎûk»ôq?ÿ¼÷ÿà9¦-mÚ”]…W>®ÝLÅ1†É{ê|Ó#CƒÕ$DŒ”C0Bð?uÊOäóÙýù”›åwÿƒæå˜‡ÚB¾Y:©›údœbR[Aµ·§·Ñ=8PHaw`š¢z1ÆèÂY"'˜Í4qßÄÔûV¸Ëå~W“‹áÈtëâ×nú)dyoŽÐ[Ðô>Ó`ˆhö,Ýî§üusŸ)KcãWC­ùtÆýÚyx<9O§ìNFdàk´›'Çf†_Õ îþ¦+Š p5#3i%àßïSðÏ"ªö~Ø}üò+ãñ}B6¾£ xÉ'h¥ÀØõÓßSe§†¦Œ”9qo÷K´»T]¬/× IV1€`'m }€Íoòýp­‘ìyðÞû·ŽÜ4»wú|?ôè~è4þЕü¡ƒù©Õù¹)ú¡ú±ÓúSSöCÿöc§÷Ç®ð‡òÇ^ó}é=ìÝîg,uJ›ù ¨EJ3Œ,É[½Ñ ‘¬ø;»ß, rÞÙÍ(@þ¾±ÓiJÏöºÌrY ׸RŒx†°¡ß-Ž\<Áž+/–,Wì`öº8¸&Y]âjŠÕž50¿ìj@¹ë’`û°„q_€µÅJŽÞ"ñ¶Ãrר.I¾ØÚâÆr9êTë(K˜›>ñFCY×.C^H©ÛßCÅZJúç!~¾-6Âu¦XeŸV´:…™Šõ0{Cü95‘¾¹ôqÿ´œv‹7ßþƒföÐ3søö<çad3Ð:µü H:bè¿Ba¾L'G|ý5tçzBŒÑ¥x5ê M=¿ÊxƒêN¸Ó嘋Äi0*Öiŵt>i[˜áQ Žf·e ðŠ^e®Ü™f ä»rÏPð#jü€/Ä¢"±‡˜í-¾;"¡»ÚZØF,(4©ä@ôQÚ'Ž´Bì믉¿…b’²GùÙìùEGÞQQÒò)‹ˆqv»À•… Ù7WmaY?XF·Ç¥ Iݸ³}©Û.™êx‰÷ Æñ-…úH Lãû$žfºÅ"¡dÜÍŠsÈ7Ѱ=šÀLíE–³ŒÜð`~“¨óaË–YÙíBÏ!ÄÝ@îë3˜î »û ×½Ì8]?MŒ—A2ý o!=6Ó̾;«) ídñ½OÝ)Ðg Á3)ðÂ=Њ£€;&ó`+A·„˜´Ìh¹GÚ¨ Kv‹$ùa;¥RLbß´VŠŸ¦–øwÐ=S€tT"3äxYÜõÞáôœ+D ›sŽ>h–{W¡e²R¯`ƒû^KÎQ¹RÜ&‹&QòÜŒëàp3›Ôc·ÁÛÎ1À¼9òb¾ÙºñÚ±ßáðœÃIôŠ-q÷A3ó&Õ˜¯&C.¿hz¸¯&X.ݱEöGôõ• ì“L )È0Ê_¥$§€KR+Ê¡GfHÕò+5–ÃpD¹ÿ} Ðåzc_]ÉÝ»ì™X˜o+èJ—‚ªŽæiŒþ; ¾YnÃM[¼S¸Bô¸«Rµ ]2˜¥mwû)èÓ'®ýIµd Q½ˆ¡'5U‡™µT ö¹ í,Ž€j~0þ®¶Äþ ßxÄÙ€^¯þác§¢ì¬Ã„MUÀò±‚><âúj"ÿl›lì “/P7†07<„iìǨ¶ÚÕ…£ÊÛ»µ}‚YzÑ ØíaÝahÞОs(Z­)î>`7XýÇS%cqpÎhÀÑvGs¼Aö¹ƒ:ô/£„kœØèSKo½:µÿWÐ-"}åµÚ¬yh “@§X¯%,ñ˜_:>,/{«×Öñ#>}é+f.9JèCsLG—íWõ–˜‰ „·ìeœÄ5d¹Slý»¥â5a3•÷–Æ4îj† aNj–9­›£"øòÚ.u’º¥Í¹,L†„ÂÞW¼Ókw͆ysø™ GjØ9‚f´]©$µùÃÌ ö°PjŸÌªéK»¼Ñ(\d!b|QO™µ±Ì E·[Àîßå¼ÇEeXE—­Õ,!Å5h{‘PµfZ«Ò‡ Åß%Ø‘)Öm«ZáV4®¶q½oV cKêF/pïÜqQOÇbš|IlÔcg¢`Õnfñ¾O°ëŸ!³´¶Xj«P½«?žñΉÃ}ÃìÚ]žñ½G$ð#jxx]ÓTÝ#Y3Ú±„êªá®‹¤1l£ü¶ï ˼;ø¸º¦ $ÁŽÄXwpýð¼”›Ó”*ÃCˈ6AÇyÞá»R²Þ:¹Œ8Vö5%£.Éü+ÂÛ·—pÊ!¿åÊ?hfn yõÎlýÐ^…D51Àðõæôµ©­ÅWS'JĦ´Ð;AîY4©Ì‚ LšJu÷¼sÀÜ–€· nñj€~K2¾å€-_|Ì,Ÿ²ÐÓÅ©½ @æ:¡¼¦¨‹÷±^ðT[8V!~®X¼¥±ï€%„bùl•Ÿ/$´QknÈkãÿzÍ%j ÐeBÒ› wѪ™WG)¬“lÖQbë(Æõ Üuùz;J‡TÆäÈŽÒe2gA´gñ´w¡µ“$Ûƒ|ÛYêí ÷ ÷ 4w”¤{¯;HÝEñôÎb{GY¾ ¿£ÜßQð,"xÈ>HÅ„¢‹GyÆ£”ãQöñ(ù &ù þQñ®¾X«K'ñTéhîkœ/ìxÅw`ˆ—áO ’3ÜäQøì(’v”S{^pWUÛFY‘˜Ï×3Üàë34ábx<0Sd‚‚B‘±ã %7"6Cµ›BýÔ¥Ö¾— È0²ªl%ïpÝvÅaì™ÃªY»mq‰×JÖ÷œsò!?oð ß>«x@Ë †¥¯2E©rß|K['ðŸ ð‡3Æ™ÎpkÚl)š¡m¸\Dï#mb$Uúq»7k’”½)®üÙtMÃ"cȼXº3ÎKB–ÚãH!eýX%C½õ‡-xÔÙ²{¤3’§ Ý8BÛ˜„‚¾\!œN?Þa2áo.bg³b³Ý¤Ü¯TÛbÒXÛ3ìl½løèPIo0y»H«Ër[‘"¸\~yØüN›äÆzÞz[ôq;O·…Gª™i•Îö)-hÒ€Mo7bŸÃÖ!lWSPøiñ¤¾Q¡êR”V´&”þûUt|Xt¨Ë!2'\É*X‹…•~] ?‹Õ\qÞ$8… ‘ >äD—&ÐRƒ>ÀsÔœ!§mŒK`Aƒ˜”ïpµ6 Ò ¸ ½”8.j™zI”_Îmt°H‰Ð±Ñ…%N–ºº¹?…À–„4ªÄVEÀl”XŽä¦qè6ˆõ*zæH#zÄiçwÛØ0ËôøÄ ÀNì´UÓ2•²·Ÿº!~¤í³EY“ôwÈÛ1tDpH˜¥|Ó;ê5õ°:±0[*B+-çuû}v¸7$éˆÓ«Aàs3iÂ&àDdß—©´½êwUçMF7V”ö©c.‘Â`¤<µ•ž.þ”Qc yjîÍøH¯_B\IÀ×¥Ò¶ 0z‰ì‡i"WS/±z¿h`hf®\Z‹Í¾úM;Iö)Á)éá!À9ð¾Îå"gì4¿$Ý6s×I–søáàÆìmZëØ2>ÉeŠ©I\^ÎK ÞGh¶›TH¸§PL™6ê&Á#íPŠ›¬ÆÏážC‘â¥c«RìÙR^Ô^ZW`Í–ÄŸ'w½á"`nñÃó²~Üe£Dž–«L5ú€ãàiTþž¸ÿÁóŒHíûµÑÆíôÿäà?„çxá[ãsÄrˆnÞm‡ªøÎð ?d®P^Í d¿eÇ2÷Ô‚æØ®æÔØæ¡ α_Ω¯Îc Vž+Á n´âº?ýˆ•ÔÖ›YHg3‡°á> Fô§˜çh7¤bº<‡ä‰Ä‚ãCé“'ötÏõ« uÖ®˜Ïú}ùMMèkPÊ !Ku·)ɸGÌà_ø€D|@-ŽG,ä#nr»˜b¤Yt8^T·l¼„ð9 #›ŠœÂbÔª–¬@jWr¸öç#¾ä MÜøú8о,¯¦]H=k[2å+è\EÒß8/ˆ'»ªz'˜+4h[ÔAûÈDÿ2íSÅó«‹‚kcz«ôkH¶Ã´xëÆÎE@1$S¥¨3¥ãvM¥¸pÿ[°@KÄ’a‚¶ÔPÞ·NoÎå±}IÂlõrâ>œM†•‡ÍtÍëÒÙlwt«ËŠŽpC;ï^†˜¯”né<´Å#"TŠm幈ۚí¥( ÅSq¡a¿Ö“¤èá—Ãï&ãeìYk%N‹×Ç'>®‰~V9¾jžæí†ÀAiF ö+4ò¥u‰@i«ž¦©ïÑXñRG ccÚ•¯  Hã’2¸Ij†o‰ùŠKG”ô ÅêõwœÌ·v‹ùNÓÕ!*¡¨•±EÚpD¦OŠÒã&u’†zQÕÝ,>õ€ßvZR$µÞÀa©"n_ á‹«Ü/H§ª.!8îcþ°˜7QþLEHT†u¥uݽý€ %î&3™ŠÚÔÔ áÍæ[>ÀN2TCÝÑV$²&d“u¡œRZ‰ZWŠž£ÖlÈ…6_7«¶† å»²¿‚“nòQaù]ù·‘4Ù‘Å–•¤92í¸z´¸­^áñºZaÂ\¹çuw9hôÊòÕCVµn<ö×^$£Â~Øk £—–¡qîÐOÐrȤDsn+KZøÔuµ®KbÞŽ=fD C Ïwm%å×ýV|Tù×ýÞ–0Ø uD nÂ%gVÅücu$C¼|(¯U‡æÛÇ”š€h €ä°ºaž¦=No¶ß-òBŒqlGë©GwT.†Ô­· ~êrðƒOnnËk¾æèQÝ ‹½´²Pñi÷Þ½Ê!üf(N¥ed(÷•½Abå–Þö8'Àh¶¿òhæÖn.BøŽñ–ÜUeAˆ«£RÝFM´Jâ¥þ>ÇûW¸Ðr´l¬—·Þó÷n_Í”ö4A—4ß’Pì«{P~>•ë-'r %·›3 ¯ÚmIn‹UÄÝØzäZ®µ5BI¹1D4.^U0“Àùê"£m·“th‹å¸uGâäíN¯³u™Ópñfð0LýTq‰ögè¤2È †*UÙ×Òrsr\Jºåü:ö¿Vó…çr€BI!°5=êðüT,ÓÍ4!æ,Гƒ£™2S GhsS•ÍKµ…N(T©7â]ï1@ >ëý—KsWœ%¿Úg—º[‰ÞhÒT…ï¢ùj·„ee`œ[Šƒ úÊ—¼G&‰MNÓñ¿Vé’ëÕ6tï)\–Øl–+ÒL&y 70ºQ¯ÿ—½w]Ž+¹ÎDŸ€ï€?Š°ç ¨÷Lwœe;‚÷ߨx 0LXO0ä" ’Æù +©ƒ”‰arÅ c”®±’Ú±–2LYI.qqž>1ç¨è°¤ÑWvºJèºqGÙø'xî£T0¤ùAµ…qfïãÃï©/¼ꆤ”_‹szg);é;‹d'éF¥øSÔè.Ó|Ë7ù9§Oa…8AgsI\VÆB.nAÀ¢Üˆ»ùWøý Uk˜Ôµ’6L¦•­¤ ­¤« Û†IpĹµÔºqÞ0eo˜Ü·’¨p)æ£uˆ¨À2²>ƒ”}¥DD$T{ùpÒ@]=+ö¨2;8ie¡´¬ZiŽbüî3b²}D¤ºdäöÁ±Ý¤Î¾¢VådóZ¥ NÐì&¡brè® ÈÉ/Þô߆]ÅÅÏ#<Õ­”uu²)œPÝ86s •i@gÇh ¶Z1)Ut`ݨ8ÍiÈ3œ8Q³ ã ^S^쥑áëOºCB‡„Q=¢‹yØèNƒ3–Ä) ‹)©ì¼XN\#‡ti/ª æHO.¢zð€Y(Xy£Ýñ&i'«öFÅà Üa®î0¯w˜¼’-¼›W<Ì@ç*¯ä53 ‡™ÒkYÕ£ ìa®öJ^÷nø0O|%§©ó­ÉLeà”Â)M‰^jÞ·…ÉIS%Û~&`¶‚†Œu§”N” äÄ™ïÂkB¥è2kvðè*– ¨7&øOè'‚üÁ2XzáÔ%èñ æf™9»$Ó=±ÈÕ$†Šì¡"5ÉݪZ•ÄZEœ2¢Âd Àši–…4áü=Ķâ!¯ñjšÕ0%k7yk=ÑKÂazj’Ô3à¡ 7a–­xœKÊG1(D¨z<Èh|‰Ì¬bW;Än¸I§ÅW8îí4U-¡ÆÌÎ7ÁÉ=¢ÜÄC1“D"óÌ2› .˜ iÁøzÁæ¶Àq§Í$nÀßĉ#Áþ}kîAîù:™î˜vwLÑ« g Jõ/î•ø^‰öXþˆS!—™ë¬ðþ`-‹Α üÑúiΫp…GzÀ9=d§^ÏŠePs-‡y™v"±¢qé‚ô`XõñÎ*±÷î`ïoT\ ê`kÍH®dϪÕCÐy”Áš„@Š{I$ÃúMS¦Iº³Åì”äÐ ´AõicIÔŠØ¢öiFi õÉ•1è=ÈùÙ`Õˆ#ç'Ä_DÁ|ð} ’¡éGÀû vy4V%)ª©v>ÊFyÃŒ„µì…•L‡ANÄJþÄ0×b˜•1ÈàØ¥UM€}°’µbeL0½´% 5pÂYÄù½„š+䛚ÎJÏ!ýç(t5E`˜N0Ê;¦(dC§·™.:/Ò÷Ôãøž$‰ABÅ0õb5M£ë":38™ ˃P§pç#ŽàÉ;ì³7*ŽÂ¾‘œ¡ø»,ÝNX­EÈ(×jõ?†­|…Ó“³Îälš©GB#ažRäÇVZ?U×6D*[i )Œc^ƒRA×›8i wLz@b! !LÆRW¡‘ÐižYÊÐèŸÀЦ¹3À§Zeõ\ŽAÞÇJ†È0›dÈ<äpï²ÏzDÏÁ†z£bP,„A™Sꑦ/©˜-,>ɵ¨oøªÀG«ÞÖŒ$¿%ár–ÍodZZpçDñ°MHš=~>¤n=_gyòÁ®àÀ˜ñ¸|‡>ĬÑí+Hø!j~ˆ¯_Áâ¯àö‡ÿ•l”ökV ²yð6 «h´Ôvx†oT-Gš© 'ñkœ31Øš,F¡7Mv{8Ié¡N`""Òpt ¨·Cd,¹äéü¤N/ů{óåû7 ÷vq;)Œžø˜èèF§Â"g,›©=%#duF9I OMïjò«sÆ“ÎF9°¥ºÈ Êÿ2ÍN÷ L/Sµ+m šhõ8à ¥©-`5U·S3œk097à–_FÑö]¦”@ì¼”…›]êÞß;ñŨ²)Î#çPpÖ@¯ŒJÌ~© 4%juÒ•s†ú‚Ôߥ«›s§8ó¥þÈ䌃ÐYЛPm4‚‰>Î\¨—U…3#z×ä ¬,‘ ZoºlKÃA]b yÙ˜ü$kOž4¨ ÁмÙ„W?ÁÕ,CÒªA™ÈêýæÍ{d’Qÿœ«Ð$ihòóe’u-pûb»½¡E”ÀXP3º ™O߀,³_XÝPØb2ªGÕ5ùûû²½VW#ØJé:PÍÂÃ5D:ØÆˆ‡3o•úœ!") Uƒéªœ¬ÎØ€ùÓ ò‹¹"„Šƒ1¦-WÛÍT¬TU»@ý£`ß™Õ~œUhFüå É&Ó8É7Üu¡Ù¢ò k'D¦çEÅ= ü“ÅÞ8°w.€= >LHŸfÀž3î’d5GgªãÉ8Ü(,?;•o .7„Ö Ax«€½¸o\… à…C â*hqpB!Wa“ˆåŒ9nAžc8è tt3RÇØÕ˜ë»žm‡Üøîê;¯ˆ‡`ã,y¼w£G ê!àz Í^q!ßCpø |:_§¯@Ù‡°÷@~L?Þ!úÀ×ù*6l"[œq9„JfN]L´ç+)dÃl³AVÚjþÚn®Û0+n%n˜k7ÌÊ[Éàfû óWr‡ù†ÃÌÄ•,Æ•ŒÇÌÈ•ÊQ¾å03s-‹s˜ñ9N ]É"ÝM8f¦®d±3^G©±+Y´£„ÛafîJï0ãw˜¼’G<Ì9d'¯d2¯d=ó£Ws©‡õj•mUpvbÕœ¦ÊþÞœ„ª§lèlêëœæGB,N35|’2C2OÅ@ÓlƒcÔ‹bîª0¡æ²(e0«uF∀«3Ú ÊK 啪ˆÄ ðœéª§ œ;S±d"^Ÿ£(É”Í+™ DBqŒ$õŽfp4ˤy »nT\Š”@¿s¤9`$lê&ìgŽ"5ô²Y‘.–ÏéôH prˆñ àB³>ÙÏʾ ð,§&¤šõ¼5„Á8]C4‚©â&ä¡ÍÔ2ój „d­Ò—°í½3îÿ4£Ý½3nÁd' ›rEWªÆÐ½•‹~µå½º^,I:jUŠˆ“Ì{X˜5?د'õY‡ç€Å;P¯L y@“à­´0ú%®=«šWÔoágžhÕevgo0ÅÞÂ…ÔI:lêW„â…¾/Ò»)÷eB´¾5©,3Š„7Ô‚Cl3YÅ+FËB³ÁøÏè] _©‚)Ðn4ÿ‚1ÜbjÐ&@µªqÆ“Øt¡x¨7²$$ÍïLÁ¨¶•·‡’@o`Д¢s Eô†«ˆçìB¨AFÂ"rÊLóÓ'as·G6ŽV6 K{h¹»1 h´´t®¨c`w£QF$ùЖ±áÈòTN´™ÀŸ+¾£ä<ÊоX-›äæL)Ì»U‡gÓժǡ< —Ã8¹¶+L×$ô ¨‘#Â,àpêAÊ0ˆ·†0Â;¤ÁÐC“ƪpÿê8¹´¥CÊ rÑjõ WŽ8Ù£ÈÝd—WÃZ”앃¦Ñ–½ÚíM.V9–ͬˆ Ö%}%uI‘I×€|ÓôšÝŒ¬ÑN º€×Q„TC×ÍÜ69¡ÀX²p0 •C‹ø@.È5€ê¤ X!%< , `ŒT7XX¸ZŸ¯’bþÔ¬‰,´’MiAÇ=W” J® (ñ´Ú½U|XÃ)øÉ.N)ÔÞåŸ2U­“Z$Ç!BJ*­S¨~ÐÁ8%á ÿACÄ€ŒÌÝì*lþѵ’¤CÜ%.»Qqµ|Ç \ÕX˜Oò7$ž1A,‚u0Š8 $X§+!Øá«ñÆalrÅ\‰x–Eþ¡²–q6=’ìÅøžÌûQ’þ0›%ó?Wd.9ÄXXJcup„Ù€áÖm5Î&Œ¬$äÕNñ˜æàEAõ'±²'Tg‰†Ir…ε®ç¤ô L4p×ÌÐd$Ö #, 7Q|ÎuÝænHˆ7 Ïû»y—äK}—pH¸N38¤$®ÇWéƒûÊvn­á&n×Á¾k,‡kŒˆ#îÄžÅËÜÖ–Çxc…¢cHç1¤þ‘„¬ŠŒÉG†4%;”&hik¦Â‘üÁ ™Ô-l/•& ‘ù¬›]íUfÏs8@Uºr¬¬@£³jç\ÕðÝdŽA ßÉÌŽf…ºfHs3$ÄY!Ïí¬Pò é{йë’QݶŒ´j@lîyήÁ»Ãu£Á׫Ôj…«jÈk5dÀ“ehµ†ü[+\]C^¯Ø [™ü3 \¼ŸLç±IV/â+Y ̽PW‚ÏØÒˆÀ[:É”}ÊUÃR­ÕXiSÀ’(FL†Å“€!!¶C’t%x›QA8Yf¹ Õ1ßuWˆ4í†È”2ÊÊ8ÆÚ)ÊvRLÜhÁ sÉØ€“¤t]ê ÐôkЇ–…Kz•llHL6¤0Ðíúvòðo4.3ÈÙf÷ &€nîRFܨøÑ)#†v`ØÙá°¬£Òß['(ý=$CЦ¬$zS üjô{e±§#BíéÃÊÏjÿ R¤‘¡Ý¤Ò0ÝLÈ$Ó´4x²RŬSÁéÊö…å¦YìÍñ°J´¶ÛZm°q±A½±•Úd+ŭÏVª£ SmG9¹ÃôÝb¹Ž\å•kÅØ•¥ée‰#Jz ç°ÈŸFqô,„×"|Ö²$ôdÉl—ßtb‚j§‘Ê–ŽÐá¬ÀŸaéXÙ±‚דÞgóo‘0£¸_©4wF’¥efÂrá~ñêÕͤ—Cå@©foyÙI0/ø}tÍ¢˜=½«÷#Õ\Hú\˜æ Ài¥¸¯L“)³Ð£j{Eq"®.À©Q,l%mH¿«4£esõð a³E\äVb±‚9Y8¡·ÊlÏ)øBEíêzÓUœ¬œ"—fƒvƧŠàH3 –·Œ¦Y$˜!$ÔÀõ@@ª¼á<¨6X-A^c ´ÑI$²Éª €©‚vwÀÄ0CN”çˆÅIVŒ=Î1¦^5 ‘!ÙȈ˜dHb²Bw2bF’¨¬Ð­ ©YVh\„/«„#nŠ!‰Åáŧ ÁÙYk œ®ËÁ ^Yí+;c¸‡†û-ۉŶÙ[}¾wµwÆ` öÛˆ™cëj¸Ñqj*v´ò"ti޼ Š[\£–ÑP +ÖÉ-UV‡õXWj·ë¼+ÂîT}¡îúh5ÔĬ\Wz.o vƒH•|Öú¤`<{ÉcÔ-)üFÆ‹^ðï¹]v.¢áµr»­Ü„Ã;så~ݽ‹‡·öÚ ?V†ZÃPÃj#C½e ãü¼ŠèîWFTg¸"†kg¸Î†·Ë¯TGVRÖ\—gÖjòûjå›÷.S& —Œæ]F”¨ìHªOm…:‚òR徑/L z Iºtõ(v/+éU­¡ªÓ g@¹Z6 (‚_äÄVä¾$=³¥ó±_Uɳ7 PP„¨ô‘‘DÞA®éhßÈ¥ŒL3Š)Þ5æèœø—ßî8ož­ÎÉpöVg: c ‰Q6¼è)£TÌÚD çteöw¾Ôž|ACN”1{Ê ÓÊ•eDß²ÊôòÁjñyú½ùQ‘ Cù½§+tМ™ä4-áIB…'®l©µí7ܨ£M=<ÖŽŠñ©2¬?¬$ÿ0YMä  ŠKÃÝV X"ˆ‰ Æù{3FÔ#Ž"3ÓÈ~*ÆÍ@¬F ÐYa52 ­p%­ð*Æ+_?UEóÑo jgî»qw/ܨXÓ¿i!DðdR·,£ÄEž2ÇHåv‰âo‘ÍìôsDAËfvøý¶É<7̼¦3l¹’ðP¬%UOH©æ$¢O¤éG“ñ“R‘À ÆÛù:óÔKÕˆÎjÌ|5\Oƒ•·Ê3ä•2Ь°Õ¨Ê‹[ iIÎ2x8žŒrtœ/ˆª%ND9õ ‡pöªXš1ÏRºßL·Ó ’_¬;•…r.Ã]Â^Dcr ¡!åaŬ̞.ù€ÓTŠªx*F8S)“]óAè8•÷ƒWSã)1zD‘ªGj\Ôºo:€Éê“Yÿ}2‹Ý@¸u’X¨ˆq£5€›ø2.ø‚ÅÂ=U‹U’UD³Œ¸šâ=U©Hiµjº0ðê%-ü ;Ĥ³Õ+a ‘N­S­Y )¯Vè±vwÖp®n×ÁΫ§ÅðdžA;çÕÏ{«ÐQðrä"hÝŠQ§µ È0BiàøFÑ‘óµHÊ(ä²JûCØ;$ö]%©…G4ÄCÊâ1¹ñ ²[D[ÙM&Bg³Íl"ä#»r]¥ºèA pïN“’¯ÎªD%ÍÊN¥¨=°Âê<2+¡Ç=M¢2GÁIÉdWWô0×'•U5ð½¡ïÕ „š­M¡Ed÷°5 ~™r>ÐÊÀF‹âhaÒx»V²–’åoÎnGŠ+AI´<¤Ýu< ÃžDìFìot’y’"Í“$ã™ìˆy™þ NeÐÀ%C)1k»lepTL;Ñe9%LôÂÝtÎ$\}cŠª¼ ÷š@©é}…3ZL1Ê&ú2ËU*D œ'ź3ìœ+oVgŠ‘P¨R•Îê“ÂÂ]2Ò*·È‰¬ya—C,òœ©‘JÖ5Ô(Íä’ÑìÍÅ *¬ýŸÿo:å—Î%¯õY'8ÆhH!ÚjNAgæsfåш0¶ ªÉl3=9eAJ ¶\žéó1…Ïù*ÛÏhH!4. =¬½E¸%30âæ’xí~ÉïWÊj p‹uO†um‚’Çä—<+š”1à<ãã]‘2”ÉŠˆ'ä¥;…z®U<GVQ_©¸>*Î>¬â¾SñŸܰ¼Çuû(¿ UW?¹{›¥àÇŒŸW£¤ÌŒlJõhÐý¯$bLè ¥€]HØÀ½3àa(ÖÀdÜ jëó `œ%Œ ’² ¶E[Òz‰}Sú¬ÚVÌP˜a)cŒˆgÎiÆñyU?\apÌ›À×L˜4Ìà0çÂѰ¬šV!2ëy9 ïÙ =F5—“4;Ð!: a’,'_.G¼Ê²V s˜KaW$Ôl\î+gÃüSpï3;¢‘sp‘ëˆEWçã CäLV%zm¦Vž¶ºÕƒOº‹*¼ìÏP>ý\ó®£m›ýF¥C²ô!­úÏNÁþ Pæ»TÉâtB Q%ZRï(9!dÖMñê—€A 'øEUÁ‘Å4ÍÅBžS’|7Ñ˸n¨T¦…ëÀèÑ…zDp¸.#/¸RÒx¢·šú2h0%YÖˆ Ütƒ²žhàÀ²ž |7Œ‚lÈWr\êö*"-Žñ× W bÖM¹±§™Þ-¡;¥{©•©õB¿"­U°x%¦•tŒD<*‹®4@|EóËÝà"·ÄTV¡Í»xË\­à-W*öjûns8°CdîaH ±RµhPáh¥ÒJݤa¥a5¦•ÊMÑæT¹19'Ô2ð_S€§¨¯Õ™£_Úˆ-+/ñEe˜á°Fàæ]ÈéN™³J¢Š§­Ze–o[)õ6, 7, ·RlnX˜nXÂn¥Üݰ4Þ°ˆÞªÃcàºQ¦*ž…6y"Ð<ʺIBå’iAYƒa¼²eHèB³Äª UøjC@š½­ø ^é@³ðä‹uXç>›É€¿Ñò ±ŠÓ¯LÞ$Ôt~vºD0(í™…m2 V§= À¨`ßÞëa¿•R?YÀ]|Ò úwXLiXtiXžÉðÈ#¯ñ®Ü”¬‹t û;Ä Å+èã!Ryˆi~1w>‚å$ýñ°¼÷<»WªŸ}³iFu 4¿çÑa£Û‘îåÿóÙtFÚøÙÄÿùÓOÏøÿ{õ,/ØüâWÿV¿ùç7¯~}÷îí÷¸¸¿¿º{#Â__ýùú͆øþóÍ›‹›«Wg,=Sñ?öFÕÿû§¿ö¦ÿLgnÙƒÿÑÿø?]ô׳xöÛ³ÿýÿMg¯èégG?}mJX­3 sšE/—"'1Ä—óïv%øÙîÆïéƒ72”èƒÓÿe˜Éþ#IÁäÄNbg…XNú‡ZNÚ ÐBôSõ â¦Àúªy‚ôˆ_ZxÙ¿Ú9§/«RCÁ=cîƒðƒÕK´ö¥Š'Iâ7j)„.T¾ÂªF‚´ËL«d–‰_ú…¾.¦„ú&¸Sî°$’Q«™e¡>IþÁu×:µ¿zÿq«‘j ëOÚWc$qš2ÚsYõVâ3»Y1 \Ö¸l@4{‡*7!/œ lÃs+Ñ>ЇUíSŽoA²×ÉafU|‹þPÓùu:=ôz¬<Åôä4éØ ¨ƒX“ö£iŽ!-ÓÂjk  >ôà…u-×0ÃHH® · =ß*Ò¼CM™ÝàO`ÙþœYŠšÑRžª-²­wa~H•ö oSÖ!['¢óH*eRlŠ Ê±|»v¤0ÿí‘ Òó®)â÷5Ƴa0=™ŒxúFÅJëHã‹–Ú/îÂ:;ÀßÓ1){Ä3ÑÆ? ¡¬Ž]Éy’ýÞ ¿=­õlÒ£R¶¥ªó\F¦¬q´rªQ™“AU,%’X&†#qÈaqˈy#e©hªaà æ…™-Á£ämE €w!©‹ÚÛ¬{(ØÕÙûZÁBU/ldâìãG†… d `Õ¡7º˜Äš6FbU’СWXQ4µa#¡E*¨‡Diñ€‚èù*–$vvß™|3@NH<_ßSSnˆ¥V bŽÞj›¢ }´!Da³Ñ­ «ú ©×´4:Þ‚œÚrbÌ_|kÑÌ+µ™ºÃXMNJÕ,žÅ²™°l *ŠÑ³ÉȶB´P«÷RQl·èYYU`Ђ²ÔyÛI§:“—’žïýÞ5œ/-x4Eótf¡ì¼î×°ëm‹ŽE‡ýÊåå³Í¦Õ0±À"ñA´eogµ·nl½NúÁtš¡êH8Cëâ)Ø«q‘±¹½–ïÂ~p§ÅþBТ¿lC4еì¶X"Ô­å†%±¢>hIøbÏ Dx^QÜ×}Ì'Bñ[ :à)B½R, S´èšðfB×É4ÂèìÙasÌÁ(ͤWYĤ1,]©±¤ÉãÊ3’ÞÔo`(g¾w,Qì(Áê|ê”­[àŽ%hXTMw®GKuQ*´b‹½Mˆ˜ÓZê[MYŒåA_qjRdÒGq¥( ŽüÕw”ÄH‰Öç-튵¨ù‹ôk¥ kÄu6™i^T6_÷òÂïµÆë¶Rί¥_¡zÐ$SÑW¡ ×$JÕŽ;ÚcÂíPQþˆýš²Ü‘~Ê Ìû ›Žhq•hMâT ‚oÁá¡ä‘ ³µ%±ÓêÒ2¢'­[ÝDJÖ@n#Œ ¡‰G€’HÞt‚ $Ö¬X®:[ôM¥àkiº U_wÂÉ„ßs¬‰Åw)Õ!ºRbã’è #öp £0?Û9B“% «¡þ­! MÓ³a¾“ܶrh%[íZyGÚ­ ˜ØyY‰Ÿ‹© ¨zŽ…N¬V¥%™­‚¨™@“£=HU˜ü¢³l0¼Tq_PIÐ/u,dÆö¶fý"íŒØ¾MMæu [ endstream endobj 77 0 obj <>stream ~òÐ~Œ<¤Ã‹$>“ÚÚ€rHG{Ö =‡ž.i¦©õˆÀ‘ØCël)â$Šfä¹¹ÕùÂc” Ð8=«Ù[Ôªº¢è’@£‹ÉªVH)¢l–’5PÅw°Ùú±¸Oæ*<¬oèlI8‹[†Ÿ0N¨"CˆûœÝòRÏø¥‹Í;·í&»çÊÂÖ™ƒÀ|Ëä CñÙì˙մ7]õàÓ¡—%3sƒä;ÑÕÓʦ=˘‰TM¨š*tè «Vh"Þs‡Y0Úð* ¢Œ«eg ”;W¤,Ä´©´ ¨!;]»xÂØ¢³¡Å¬ ƒ^™„Îëxh¶o¹(V$GU„@ss G ‡…14§ÇI$ϺԒ~ÃÉ}Hò¯Y¤^¯Œ»¹¬A`$í’.4™C9—èÙ ³Sɯ×'=‰ÇÏÎ ÄNuÔFH[èÕW´–$‘÷M¥#-üyê^c¡¤U­¿öbܯ—Úáhg±xÀŠ›ÉS¯wD4÷†ƒÍúžÓOU½q6áîuVÞh·˜JÊ¿€k ›yÕUì½­æ‚Òg'¸ò|ÍÄ€ã)Ùu”SзEEÃLzzi_'\r[¯Ÿ÷•&ÜcýbñÁ2s{} •¹à”çÕùr܈~—\)ʘW:—Ï^)‹Aö±ÀI`—â;ÊŽæ¢m³°y(ÞTÈm‚KÅlœ‚¬äüÕ4BAòÌqEÉ7¥6'÷;©0<GžaøEÕóGœqÞcµâfsÆvÊ6”nqH#〗vÌ™¢K>bɹ ¢ÅËâŽúÕSE Ž‘00& ã&kÀK«hŸ—”¥s­¦b¡1E2¹¥'oNs?öº·H§}©ÒÙ Ì'úìÍ´r²P<ÁL†LÎÞAÅ1ѯ·ô cgýäܤéb°Óšy ¼å‘°˜ÕmÕpæÚpwˆ°z(äSž0'“éÑ'äò£˜õ +[8 t§š_ °ûJ:@§.&µ˜Óˈ'±Ù¤ e'£bÎ%¾+í[eØÐÆÜ8Y|J_¦Ë¢@ã"#X-³Fmn^Æ66°tê8——é“(Äb€‡J:Nq U%£É¥ÓJÄ\Ÿ*l|¿8Ä4u…¶§&úÒ, ²0ïÚÙ— ʰˆO/Ê៧ 0bK˜’öÐAKg<—EÂMÉç…A™]x/6ô TœGÈ¥– Ö);\Ѓè1ê¨U'ÝsÄui³5gJ¹ê„¨¼¦Ê[æä<öM¯¦b´h l‡’X'€“r_ª0LˆgÛ‰šˆÌ¢,–¢œó³ÏBc4òìì\f×:ÚåÛºT‰©¼U3wŽº=¨]/µÉ Ò)êS“wkBç¡"ÏU-H¬gD0")â05·‘}Àl1‚°$¬Íf£k¥ Î=-¯Í½šÐ¨Ô¸ªÂ#´#á„PI¤áÎå©W¶s ´¡/P¡J¬ïeöƒé¶õ8øÈ! Œí´‹VäñÀç(/l̳!&Z=;Ùµ„*e5®6\€D|k' nµD,}H…¼» (8â£øµ¦=r`Rwm[ Hð숰jhÊPCéY‹3ƒŠ£EØP˜ÀFH ²&ñÃFµB×À¼»˜*‚aÜΰU×ÄΓ‰Õb~2¢7bRj@Ÿ ’R'ø^Í¡—%ªÌ~hY7ZG’€Óó$šÑKâ_¹Se‘(˜D0J1@Ø| yþ},9M ‹…ü« %ÜUÑC•÷”H‡ÖúfˆsE“¼ùâ쀔ŠG²¼µB¹ákŠˆ#sù[Xt¡ŸoìèàG1VÔû êH>ÜàŒÕ×™«‰€O@XåÚ;¼ñ{®Ê)ê%¹A_êÄÕù¢e ¸=‚UÙø¿¨8áì­¨âBb4^z1H;XY©]6“ÚU“ YWáBcg<Úl‡œªeqágP{—…ç¢RÝóÑÏ|DXmž$\Sÿ2Öá.‚AŸ.BbÝpÙ)(›ÈÁ3´¦XBÅ‚3»å^I²"+y Gœæ¤²ÍfËÎ) #¨€Ò¯JdñF¥s„©P\饊'ót§lªâvsÛÑaù³¥ƒÆ¡À°âñ 3 U;rðãqeSû³º¯*7 ЃZáNôÒðná¿ÕQ]6MÁéú¡Íav9dLBÙ´9:5è³û*ô²eå‰,¶ b5kŸ9æ*Â9Dƒpe†(`2.÷<—Bœ;th® ‹ÕûÅQ8ÓR}SH”°†³MÈõôRÛÄ0ˆ<}*;r&«€ÖÿÊØï­©0D öªƒÂKâ í*;áBFdœ²fv'3KtËvµ탧„܈(Õë©”‚ÙÊzQû¾ sÛ†…±8`ǪýL¿7°‘îH8ÃÒæòOô¬7­=Vp¬+kßéZ®˜i'1ÈyÇûbnÙÅOO¦jçy5••¼Ã¢oùªOFˆŒÜs@¼0¿¯æ/FßZ úšd¯R7š4Жˆ¯„rể=6"ÄâÖ¡â÷5"„â žÒÒÛÖÜÌö[:Âd¨* à±Ð`ŒÈ9¢zî‹`o‰4`É|{jKÇY¨X³ièÔñÂ4×`¼0ða}'5ž¥Ó IìVŒHë›ÍÄà%Â%\\ „Îvv²H³~¨âà·´°îü@ÛäVì¤Ùd›tÈ&}o1¸Š©®½½ šM Ämè@æõ váØæf3Õâét¨Î²iVZÏð…v€qMui•…$:­|U@¨¹­Ä9[”ê Ð*™"½,˜Yae©o$_Áj~Rb³‹A,”þ‘š´Ê9±1"êŸÅ Õ Qå—*–d¶_9×h'Í='ahˆä.hY FáJ uy©Ñ€èUp”qp( Ø N*Þî°AP´»n„âÉw‰´.ÃBAõ`€Ì`üÁéËšÇ%ɧS-RèºHhX+þÌ3lꈧùbÚtV·05Pq­môΕ %E8[CÅ9´ê º5çëQQù¹cØÁlåÅêö a ¯Á[¤@t“ùuY—“r²O`dÌQµ ëÂbdíVuÀúŒ:!5˜.í—{xŸ– ÌÇz¢RØE]-,|ú}ZfžGz6C«EfUB7û2 ú ¿`|ò2z©ÚI1o±YoÄúa˜$ãFAªzgíjÞ¶ 4¤>˜zÞæº¥…ãpjsÇz3t½30-A·ÈV}³‚«à}¶ †¯]= VBYqÞú(WMb rD£T"¡fÉD‹¯¯ #Ž2û*TCèw=>øV´k»‡Ò"£©# ãCÍãYœtsþÍ\c Tk뱤NÝ€^é±68VMáßÔwob[”[‹çöl*ƒgKY´«BóÏm*×Ãg/[·´óït³´š1ŒaÌ:3C¼°_˜DNÖË/ǨÍHµ F-¯ÞÏîbP¼ÄÓpÌJ˜@ÂÙZY½[íêp˜ <£ÀP§NPJòbS€­áBJa¾ŸAúµÕ®¾èî'`Ì+jº1…¼ƒZ׿ª%5ásš‘šI-ÀëÓhàf>@‹«IfBd w®ó Ó£Ë íÆš"¶\·Y#xzŸ‰ŽúàpqA ÍôŰWõ1B—Qȵtr¤ACyÄ~d!ùj*1éûMôü„W÷HàÓ3ˆÊ¨ÅX’æ`T”ÛL„s`ì²y² wè€mŸŒ—‘ÊÛš„­NœùÝâºTÜÜ vbJÅ<®Ý >üh'‘%rf‡MÅÔX­KsÎTúøó×%b%ÍŒrGIy‰ÇÌVŽq˜(8xj=ûºª&cîe¥VßÐ:*uénà ïX L”¬|ÙÀ°U²ìÖ0EZŠ;cn50N‰ãËz• Q¬.Cu’xR`oTv.®Þâ-±ÅÈ€á{–ßÓ‡]Êù”",–Äg?1 Y:í¥¼HÓžW²Bz’[äi ‚ˆŸš}ƒ[„xyL ˜-¿ø^^k=±O°üKce–F§ú¤uÜ"»!:"¡*ð¥#žav;¨œV°q’hW-° O"cÊ/"¨Þæ0d 7˜÷º Ö.h®Çm (,3 ³”^6ãm‹b*))<[\bAª k°('3ÈOK—cŽË+ TKæ‰(”Z™×  ´v´°ÔàÐàbAŠÉ•SÄbÒs]Y13*‹°AdµÜ”Ñ­,2L¤qT㉨)ül£Q®h'+ÆÊŒÅ,—š LI6ÒßžË\B~ÎM¬F-Ošö„>9gL(ñÓœæšcíò󰸹“>8»*`e³p#G //פ%ú¶e¯Ä¸0'g8qs:¼¼ùôef4!îŠl"æqAÿ“G¤•õòY½9ç£?-"‡·½«,»YÅšWÁŽè,Íka¨6Ãc•ý‚~Œîk-Y´ä1¢ Õ€m{h ϰü>ÚÊ2fïâ-ìäPÚ‚ØÙþ˜dÒW&ÜlÀ3hADØn.{`áãbÚY²œÐ2UÛYJ‚³Ú#Lp[Âæü g…y›Õ©Íܨ–÷kq¢A5ÑÎ4C†½#Ukà}6péqͲPZGZïìrÒíB¼Ç‘œÑíLmƒušÊTFÞ²€]„6>ƒ|”=‚Õù ý”SH`?çn%= ©ôŠ-Ý‚^Ê6-Ž^ªügöÀl 3­0ˆÕ`I…i‰­BF a|°E[#”ÕÌiU‹ÐÔ`PQ®'8!+–|Ê`£_Z¦ýÜ*8Ë4YJ*ÂPrVÈ‚ŒÐuÚ>%k?ÊnkyÒ|ò¹ÐfY¤à"XJö²žÆ3¦45¡^“0$ =;O ¬º .¯¥©¦T{"tÁ“±ƒîøYá „ÉèÉVw\óT'Ï™Á,þyZ’¦eRiØÅ¢X”Ä×'OÆKõ$pèV9że–Böe$ø2¶ÜGêW"–uWLwTÏ®eFa½„ØN…b¨_®‰Œ³ÆêcÎèwo®žÝ×ÍýØjý(·Û.ºN'x«òç­,ÞjøêD”‹inÜúÚ»Ææór0àïà kæx+ð8rñG\ÜMy#s@jZ‘¿T“²áæo ŒægÍÓTqi*/"Œ»=xa]ÓŠß8Ð5 0p¶$}ʼXÂÜk· w‰¦ð!ºà¥ŸÑ²/UÕZÐLós.ç.%uŠŽIå™ t3ÇK¶$ð¨¤B\ˆI£ñÑ”oªA£Ž“´(øPf/Šçœ+ÀàðJ ßáJiЊRµ^ ª‹¨6[z2?Í´hš ‘Íi5 òœËç&g&ß™¸«NXCœ(WKH|çsU¼’` "¸›‹áLãäD↩!]ó¥J]vn–ªLO/*9¡ŽØ™\*JZ…}I¿ÇÉ’+S´Ìh¶œ©…#5[BY\`Ô󌄎rØŠP WÕˆtÔ¬Ô™Ò­h~ÔlÜQ²&Ϲ,#ìHnBu×ÒØÒ@’Ê ô&õ&ä9Ï7JŒª;L “üÒL‰˜“þI¦_MºMÎÁú´t ÒSä}i`™•"`z2᪱Œ!#h’Ô«°íxÈɬ¯ Æø¹¢ß,~©â¤±Òøõ©lÓ°‹âø»ÂìÀº/Ÿ`2‡R±OÁëd5½)£ÕÙ¥E¶š±¨œJ£6gךŒEŒ.9- ¤ObËÙd¥íÃÄK•(”°>PŽwþ¢æliñ èž›C³ŠÈ W%€›Ùá‚‚‘sÙ×)ª’‘©.F„ðÇŒ„¢úÄ%Ðts±(c4e¬ áÊŽ‹AoTi˜u FÍ¿ÄÓ Ps«œIû £³‚x3rY»‰Š5*|, tOµE°%ø¹©6å3~½,ïQÕ²,¨¬Áà`\:àº\"³¶Î í Ê„ú¶8qÚ¡îjN›ŽÊÜÊ–6÷ŒJJè!˜ÀÉ•Þ44œ¤¸‰}”íŸÏ'C«Ýsú¬í´j4Q ­"ŒÉ.ÓdsSQS5Ÿ—*E„)Z$¥Ï€„É‚>¥H$_.î¼ød8/µ6·ë š»[ž—¦£ÔVùB¯íƒ˜±fî7ˆq( âšpÅPDÅí” 1™'§4”w¬KôÒÌ—²± »jqADaë${cÄu’(†ìaX¥$Íе™Ëe#í⡳åúì AuqªFØLƒÓÉK šÊnF8Õ"‘²;ôÕ.B „ˆ5ñ©RÙ“XÌÀéFY“»éÕ/´k+|¨$±:.˜Vuy<*€‰î|=›’åí×`_!I(]~,9³Ñ³Gç3r¼a3m*Œˆ²Ê’Ä×Ó/Î ↡ൟ+Šòÿ!ïúC~Ö;lH½»—ÜÌø©SšÚŒyS¶ÁhIú»§Ë|ìô›^wçFàØAX8™Í(ÑvçäÞwìPd¢Øìgt 9†IB"„ ‘XŒÝ޽ÜâçýµÆÀHøÍïnßüáîúÍýõ›?ŸŸ‹˜‰¹—ÿðìw?п¸Iþéë?þë¿\¿îÍ<û¥ýyöOÏ~ù§ß¾üÝí«+úó7×—÷×·o.î~zß?|uö»yý¦ÿÓyïÖÝõ·ïî¯ÞþãÙöË_ÝÝ]l=qùýõëWwWoèßýÙ/ÿíÍýüoô¿îúáŠþí¦_üãÙ/¿îͽùóæ?^¼~'ü´ò±Óýµ?q?Ž®ç{¸ç{„žÿêß¾ùÕ뾿øÆ=8‚ëWžùìcpÓóÿ×ëW÷ß?<}ì8ÇðýÕõŸ¿¿xxî³âöÛÿsuyÿëÛwo^õþýúvmÑÏCúŽ¡ÿ|s}ÿöáqm<üß÷ñœl÷ïî¾}p*î®Þ¾{½Ç×ÅsŸýëÒ(Þ½¾zsyõàXä7-æq¼¹ýúþúþrí4˜Gñ–ûë×W{,·?û˜üƒƒyóîæ÷—÷?î3–峟ÿ2íªîƒ£ùöâíÕ¿Ü]ýßw}9î¡l=¾ÏÙ±Òu÷ž®?xØ]ýÇC[hîó{æýO¯ë7kKp©ÐCŸ}A}}ûîîòê_ï.~øþúrì3ŽGÆjÇæ¾ßþpuwq{÷ðæ'm/¼¸½ùáöíõý>[áSt€•‰ßýËß\}wöÕÉ`:L[S<L'ƒéd0 ¦õQ|wwѵè׿»½~{2™ƒy\“éáü ™L»ïNÓ‘_'‹éd1}Ø^8YL‡®ˆsÿtm¦½ú~¼VÓ¯¯~¼zýõ÷¯nÿú¤ƒMñ °öÇÛNOǼøöõ»µsì ™rK³7âéÞÑkáoï_ýæêÇë êÉ>6ÅòéG»ªÿõâÝÛ·×o~½¾ÒŽQq½ýî»·W÷ïéôÚ{mò'¼/^í¡§¼z Ee®ï¡¦¼úÛ#nßßó>xB÷íW—¿·Öã'´k_“6A˜¶ËÛ×·wÿô×ï×ÍåñÓë=œgúØé$ú0mñáéï‹ïÝë‹»·oÞÞ_¼Ùcyíþâ{ëŸÿöÃ훫×ü‹Ï>®‡±oßÝ}wqyõõåÅ^›fã駤埻©ÿÏ“5÷Ó>?R{ÿÜï5õÿõpïÿëµ€?Ü^¿¹¹—üinW_ëyòRoÅ“FrìföÑúô÷ýG«‡ü={óeS¿¾¾ÿÃÅõª&ô„võþÛáhwô¥{XMøËšGaÑuz滾f=-»îŽÒªûKØ£ëá8»¾ÇžýËclÙ‹»ëûïo®î÷دwÙÓ±,?ÀM¾ÿ±ûHŸî·Ww¾¢¹ûÕ/jö?]Nx’õsìI?ZÓÃ]?R÷Ò¯þí›··¯}wuõ_GŽKâNX’ÿ˜‡=^Goèïá´;Öóá‹ø¸çç&ß]¼º~·Ç>ÂsŸ}¯®__ì‡~R6Ûooï~øþöõíŸÖOŽGóÿ²‚öÈ 8Öét Ž¡Ó1D{øaäñŸCO…¿OvÕ‘Dç?'²ó‘ö쓃G~»Çáôûõá1ï~Ýã¬9Ö {Êâ~ÿ`7‹ûa¸ãÊâ~x‡Ÿ²¸?㡵ÿÂ.ãE¸ìñNWÞ'èûÃÓþvOð8PãŸyÿþpdëÅ÷oÞ\½þúêõÕå^¶òî/>ÜëáXãk÷vKüæúí¯/.¯n®ÞÜÿö⇧tU} Ô­ÂÓñt:žÆÇÓI}zÂÇÓ >ާÓñ4<ž–aŽo~ÎXÿÓ9¥NU×O;dßRþ.wÈã>í¿ãò‡ë¿]½þÃ닟¾yÂécŸ·êÅç& ˜ÎÒÃ@1éã¿ïƒ[<ú”2wæ¾òÓ™KýOgý¿_õ¿ûÿÿUÿ‡³§¤s{œ!N„{‘)ÜÜ®R$<Bˆë7¯®¾»~³^‰q¹¦~¸º¸ÿÍ>{cñè#|•ÅÅ{Æò˜o ’‹Çó$(.Rþnø-ŽEoùvŸêªGÐÞkGk |ÈN–ü1mëKTŠþý»‡Ë÷ýöþÐhÏÑ&ïwNë_íØóü,åÔqc´Pvõí¾þ ãöh÷÷Ã~¼¿¬E´]§gޱëk»eÙu÷]xÿe Å´ìz8ήï±eÿò;öâîúþû›«û=ô‰¿¿;íé¸Ý?ì:a½SÄòï bÉó@1K?}µßœœ¢”§(å)J¹}Lœ¢”Ÿó«œ¢”G¥ü’ˆøOQʇ,Äcô›½³ó¥|tç)JyLÛúÕõwß½Ûƒçüèwö¾9ÚÍý´“Ó\½}w÷]W¿Þ“FxãéÏ>œŸ®^¿¾ýëƒcz}ýçïïû¿Ÿ_3äãÚ~þò÷üJá`ôPxqû¦›áoö8¾v~ð”ÜI²h¿úóÝÕÕ›¯úqrõU7?¯ÿ|ûÕ×·¯¯î¿º»zõÕíÝÅ›U÷òSò3Ê#žüL'?ÓÉÏtò3üLe îälúÜ·{}8vñ_×7ïî×j[-?üì‹+?<Š«×ýÿØÏѱxôѼ¿¹f½ø%íšÇHüFtô—ºsŸÐ²~ûÃÕe?´ï¾DøÓöWìQF_këq÷`í=®þÛ]-ùqÍ¿8Êq=%S·Å?ƒwééø.ÔS!¾ ud° ãä»8ù.N¾‹“ïâä»8ù.N¾‹­±œ|Çgä½~müÂÐ'×Ë`'׋ôák5O¾—SÎîgþ&GëI:¥ä?þæ~}}ÿ‡‹ëUWÖÚÙ{ÃØŽwW!ÄðO8¤ðcMÅßcÖ5®ŸRñOwÙ¾wÙ@-óaúÝÑ^h{k§»ìQº~¬wÙ‰Væt—Ù]ötÂû_ƒ'J™½:ðH/ÿ"(e¾þþâÕí_O0VÇ´Å'ótŽ™/#­ù‹H ~˜­é”üŒï¾{{uO¾»zµßÊ:úmò´!«—²{õpµD~滾v!-»þ·GÜÆ¿çýð÷¡{ÄÞÿ¢”ðcùŸ*’ò>ÁÉ::;èÜ¥_<¸÷¸ãÚ«ï{\A{„¾Ïöçæ3uqzøüõúÕ>¨2}ìó!ì1†ï¯öhÙs'OÀ‘o'OÀºÂð¹Á›'OÀi¡'OÀ±íút={týä 8žKñä 8Žïpò|‚œ<X¤÷û ,ŽÖ=YAãy¹|ØÇpôÊÝc8Úuyùsâ]>7gûÝÅåýÅëßÝ^ï‘À ¿zhhû³ç<}}¹æ‹ZÚ¡ôØ\¿Þ‡pbãáÏï½zIùæÝÍïûüqŸÁ,Ÿýü ÐçÓÁ|{ñöê_î®þﻫ7—{XC[?¥3{ŸÙøîîöfk‹Ÿz„Ïù0)üýí§Åí#tþDærd.'*”õor¢B9Q¡ìŒæK¢BÙç²ÿ»aBù$“ÿxw÷í»×}zŸžÛìÉó$ìcЫQø÷Lpòµý_DNµåA¯9†Úò¿‘y*-ÿÂ1Ǫ¤<|càcíeìþâЯ{ëŸÿöÃ훫×ü‹“Nù4tÊ'¦±œ–“Âò*,_ëùyÒXWcùBзV,ýHõ¯“Ã÷ñ7÷Þåê~gïíñ=Þ]ý…àÃV þ²I_tž9B“ð/k,»îŽsÖר|–]ÇÙõ=öì_cË^Ü]ßsµ½ýé.;ÝeŸD½;ÚûlïrºÊ¥ëÇz•íq ëU¶G×OWټʞŽõT…ë8¾Ã'¸üžÀìº<¡Oÿ /ÁRE¿ˆ±'²•B¡§bC?ÓXN•ÇuÿkÿéÛ÷àžÐIü·ÊÑÄîlÒÿŒþ2Ƀä¿ö8 ðÜgèÍEoêaî»kÍ€z}{÷Û÷ èwþ—•nõE¨a'â€cÚ ¿ÿ³?‘Ûãsó9=¬Cmþù)ÿóoerqÒÒÿ/‚õ#¦#‚íoíytj×ÿÊ®Љu´ÃíQLù¤Ò~ÞUõ§ï®îþåúî pø|Š›ãéÄ1ï/¾ÝcäGí¬÷g{¶y˜ÜÓµñðãÑï¼{sùïOèTøVÒór6}©ké_Oké³®%÷åK¿~,ˆ›”ûwoÞ~·úñ¬iê»ø—¿ ½éCÓ(ŽÖuðAêìÑI'ïÁãoqFPýêõëO°¹ŸŽEñçÜ —÷sáò>ÅË?¨âÈ/~õonúæŸß¼²Ê#$J$ùæw·oþЛ`Ò„sÿúêÏ×o–ÿðìw?hüO_ÿtóííëgÿð«»‹o¯ÞþßÞ¥gÓÙ¯úÿô×gïúÿ÷ûgÓóX¦TëÙô<Å45ú£ú|ëþŸþGœBóž$xÆû“;ûÓųñ§Ÿúÿñ?úÿ§‹þzÏ~{ö¿ÿ¿éì½ïߟ—ÚrIhg5OôWëM·©·ÛZ$q{^û Iæž×X³È|ˆ‘…á¹›B"a}îZˆg/´Y×R qz^Zig$ ÏK–úˆz[gÿ‹Ÿ-Ï»$ʳS^_VR©Ò¯§ª/«.ó“åy*>ðËZÿ™kÒ@~JáG{|LÒhÎÑi£!'OBÿ<Ç)Ÿ]jgcªýÙÔÚóÔGÆíOôÞ’°w ÏB÷<5ÏÂò<'µþ¥¦Êâú<†’´©æ&/SÑÎd_>ûލýgnò:‹.{þ Ô®wŽžwþ¹Ï)£±l ýóVMs2ÉòÜó¦¬FžnsªIúàK¡O[k{ýÄ Ï'—?¯“~Ü¢¼*ö/Î3Û_boÿülŸfêxOÏKi.ʼnÐ;ß´)x/=pSÃ$º>_HìúÇñü²>19†,3ëšö¶ôÎx¦–Š4Pûx¼+"î‹×‰08Yá¹—^íÎ6>CÀBr^–ߊ}(a!Vav…Áóƒð¨˜†)MÖ@àO6Åþ•æRÐîFŸæjñN¾dŸ™›þ!rJú²˜|ˆšúbLº>r’…Û§!FŒl sãB¬²}ÞKm ô)”…Û7-^£2¹}å³å|±°m /› ûiñìô<÷żÕj_Ôñ­”¾\Ë䤷­dy–6os;¾õÅôSßOÈæe•Æ©ïTþ”%ôö\‘‰ä㊄幫1Ë—H>‹°ÚÁæå,ã/Q’‚}M‰To5¶ /«Sÿ¾ü%J”êNu¼ÿJÆþëBWBÕ´2•)Ó3å7ïôÜÑGÝXå½³-V¿½#z³…îr÷ôô3Åmî³>]A‡µÜ“¹=/¾%Y¸Ag‹n£¤½ö#îl8Ý/ä;ä¾[ ò…síËõFÅE?{n—(‰|I",.V#Ï, ©+ürêÝuz;ôs^ûåSÒó¶¿2j¿ú”F¹rbß$úû>)èõTû²âwõëÉÉ•Så௘é+Ê ÒúYR¹ÝœíÀìG'OAnÒÒòp—Eлm×€×OÐåió¾èÒ©¾y³ô•Õu·y õ75~ùò¾êSÒÏ…¼}·å¾\¦¬—+okö£6áŠršì~(ÚIÿí]×´~C õ''ZXüÒBG9È>U¾ø$«©6™çeÛóºÅq©Ÿw9Hy—q]íÛºzU è¨îBߟ c’…SsÜkׇíŠÎZ6UƒöV_Û:Eýß_²´ß’¤Jpw[n¼÷\–#7ÉÒûUJÒ%’SÕ½çú-5á»…0ñ>£«MwN—ðϧ*+˜ÛäSþR§ËWyïUj¼Ž6Ël‰RûŠ‘Éî‰^¤¨L,¦S»NEoÒ–Hû )àÛOî1=À+µê÷>Ÿ=&Vad%´ K“˦³Ò©nÂK\WÙ…Ígûù‘ùôK¤¸Ê ²õ³µßŒzP.Å)öãƒwWøÛÒÓ™í:?spª1§,Óúù§"çZMW¢«§ªæàµ_©_"²:i+MŽç;Ñ·%¥/È>oX\YÕûI•ëì±6iÇW={GYŸâc•Nµ¸~&ÑûNö•§ ÅÅ Ú 0Ul»¸ZªÇœùô÷CaˆMVq?Tûm®çŸ8—:Uý¢Œò*OlƒÂºu«V_±7X ¡ù ¤îÉ*îçjÊQÄ—8ÝÒ ãÒ”Ö@ÿF ¡¬â~^7¿õ,Ùb¡N}'²°o.?éQšÓ4s}驾í³ç}’+'VìŸ5¦­9htqêÕûtóËZ?¡§Ü‚Ìkî?`¡7ÛÀË -]SEÛõýÑÌV—§«í©5(û‹–F?Q¸cýàî/Ô£Û{Ö(«ÍMï®ÐŠ,÷K_,·¤ÏöSB—¡­‰„xUŒ+rl4×7³«¶ŽÅöì÷II.aÅW1h»â½ÛÚdçæ–ƒ|^¨b’O#úL0°úÙλƒ÷'}Æ϶ż›_n‰û¬.¨éüÄG„êÁzHå¢g Ýc/ÔÂR€ì”*wJ_^¾D=äXñFsjz¤óªö¾]œ2: Ë–„A6Còy' ·/ÛܯqWµh»Òžy}÷‹Ê¡ýª<…]è •™íÍ&>wú‘ßµ¬¬‹#¾*û°Ô8ê°«ˆrv÷sÁ«¶ÑÜ)dR—õÙ~éð¼ô^EÖé›#u z™ìJ·=÷À÷å“E‹éŠeâÞ6OZlÑ=Îû² ­TìÆÉ9ÝL*©é·åc®õ{9÷³WÞÕWŠûïk ô û;ä÷$nYÅ1³MNÂn&ó°hû@æ3ëž]îŽØÏ_ôIU!I&€DYñ©Ñ _DÙ˜h#òûûÙÛ×½ª]…à¾Ò=“›ÖGYñ]¥í“ ÉÂ' ÐàõZïûŒ÷gf}ïÞT ²ë-Þˆ]8AåìŠSï-Y0¤.ø0qÉÉ2éÂ~$÷wŸÉ`»õéDXh'Ë'è#›ØÑÅêC¡ÏÕ;TE¨çtó¡kw¼ŒI3¡d5,Ù¬¾=MD¿¥—¾)ø@¤©ëÂþµHq‘#f‚ÑÍ“~'ñstXð* ežô9 Ö|Ç$î±¾83ß5höGmVÏ£Lª+,­+Èý^«2‹¾6§«»‰Ï,“!ƒ ¬V>!òâèk¢Ø‹Ð…¦B±ìXH'² ·}ÜäåÛôÓµŸ‰ABš¢n{¹*hÉ,|qAž`q•á’З Šó”2ΨÊ>Núnfé£î ã¶ó çJk¦l÷-O÷ ¨Û­o– SÙpiÄÄöH,ëó/TíÌbâ÷á–Xœê©ÉH÷m­¯²×±™ýè*6¯ú$‹Gßeu&™ 9Ï]ÄšW›OÄÝ~ÒïÅbU.ØIï÷r'±;%y]|'½€—ET\ˆw…Å„¢÷²0Ek >eiyƳ·wž×q_SÙë2O!µÑéMÕÖÄ]ÕŰpÉ_"›¹Ûää+úñt1^qýGº•Hér“Óκ  ÌŒ)ëBbŸªî)‹ Ü…jTõöÃ$ß›\¢ ÷f'Ý¥z#²ã³«ÛŒüßM_EŒ|¸àÉNéæaQm¸áþ!oƒ:šHóžøÛÐlê¸HoI—!íߪ⦈ƒÖ»ªZ>)éÓ”e`AmØ~$NoàI€:½|Q9æ<Úeñ” îw·ºYÕ·‹ˆûüp¡Ú-Þ÷BßUüq"œ~Üß î“~ÛéDJvÇH\¢I.jÏô²à+NEÆ7 Ò…4Ñ”D½C&ñV÷¹áWÈf¤ ýR§Læ¶ Å8ïSÛímµL]è«—{•Š´êĦéÍ'Þ¸…nVï`?$¹Ö’(/ÔýMŠœéͬµ:1rÈÑšÒÑ‹ ˳Nò2ÒôÄf@—†Cp8ŽèÃfL“S‹6d‰êWbã¼Èú¿c úiEžŠKÝaâc¥KL~_'ç è‘Èîjêrð¦vöïE%¥O]1±j€ˆ„!Éžgrz½-i$¶ìØoÄ÷Lêûži^b“SÖ“?n* !7àÉ1å­gû—u²b“yõ{Õ\?dz¾P/——«™¯ 1`&:ox‘gßÜD†¼¨ãý#»®£‹?HotqyñgMôe‚|Ή>¿ë¨#GÞ$^¼–dYûä­'¦¾4ÕŒæ;¥H‘oU¿`›¸º6¦ áiö-´ÍgKõ¦­ê‰ï$V¡=ð¸2¼è¢]ìžÃYÔ¿¡ìÇ~Ó¡@ڸ܃âÒsj2Í϶$³¢B¶5â©&š·—ºJŠ88I³˜ä´ *{ŒHˆ[X±¨¸f>Ç—Â~@xΆëHBR4¶RðqúÑw£Â¬ß¡k“!é8(À祆xhuõ™÷8DuXä'!iËj7&(Æ•Ðb²+y°¯³Á’©²|ÅFÓ7õoÐ&µòù–QI‘º_ŠºX©Y]Ü´Œ(H€û™ž•H ´:YÜ‘î[Z…#£$ ýž:ÃDymTµ=y:§‘£Iï|vȦ8ºH˜’s‘®÷¡,ãMQìB,Xº\‚S) ¼ä۵X÷ßúAÑÐM0515 '®gi¨ «Ú±RIÖ¬“ƒÔ† ú'ÞòŽVéH(ÑaºE\æK—ðAzPäcJv½ÑÒˆ|k÷õ÷6]Yµ$µÝµÑ**™Úˆ©Ê"hU¬ô˜h¹égÐC–Ü®ø†¯mÛ¥¾É¥¢C%³9ˆS©/ætNNÔ«Æš|“lBr׋“¥¯õ~/DyÒÉ^ a…ƒ"ɤj^êªJ%è^™è"a¿™k7ÕÃ÷DÂ>óò´  8«‘„õÁá짯6£Ã‘ÙïÃØt «úßçóy¬E÷…3–NgYÿAÌBy¿‡2LÎ~=mà$Ç íõ:ìnA½P]?³˜±“ÌòŽMýÙ1•û´Ïb·?à6P÷]²1 aCû„ Öi¡p˜úY’騽»zŒtw‚~É!{ …Ú÷¥‹›x#*b´ª\褴E‡H ]q/ÔI’Ä%C›Hϼ)ÀGÞWgÔÐùdåÄ!ˆ À+y1 ÅÞsr¡OÕ¼Þn³Ý)ä ì>ûÏg¿øæ—¿º»ß@>þâ›?ý¿ýý·wýÐN7ü⤉OÒ¹CfÅ~3yú ™tù˜Ù/¾ù®ÿ—béÜ]“~›ƒ@Lø4€Æ¤‰`cÖÀ^À1yú è^xxL>ÎùЄÏr¤‰›8 Ô„îD³&>І&ö£ÉÓÁÑÐÄ€4û¸» )ý¸‡Á¤¸‰ƒ€RÒ‰ƒiÒľØ4yú tš|˜CðiówÙ>ÝØ„}’¯røIZ8§& ‚T“öŪÉÓ Õð5>¯&_tÂG®ù&!9µEnæ(ÙþA<’»ŽüÿµxznÆÛÓu~Z1,;/|¡}z·¼{GH6ù‡ƒ°lÜÄah6ibÏ&òƒmÒĘ6LÝÇ£Ú¤…ƒpmÜÄaÈ6nâ l·pºMvÚAø6œø Üä ?ãfºìÇ£ÜL¥øxœ›]~tþƒu“8í&Ëå¼ÜG#Þì*Û ó&¯;õ†I;÷&Ÿô ä›,¬ƒ°o°3@¿‰åxþMšØSõ 7q Nš8'9 Ë ·ýކƒ±~N:q"Nš8'³|*N¾õA¸8nâ0d7q6Ž[8' „ã&CÈIa三ÃPrò9ÂÉɺ:)'Mì‹•“½°'ZM€—Ã@ÌIaæì ùxÔN²ÆÍ½°ÛúäÔÙÆÎÁ}zz×Âø9ó}<‚Mä"1Lò÷O†¡«Òg'úëªÝ,ÿÐïøªÿ 7$âd2© /²h´òƒÀuЀ×Á…rÀNôáC vШw@vf|<ÌŽ›íÄÐÝj'­ì ¶“§÷…ÛÉÓîæ Ür'ºƒíØ™/¼Ã>z‡øñà;™ÌƒàwXŸðÄësι@xâ¾:†·å ñä‚ã!¦q Oš8’‡»ôãAyˆ yø‡ ybsΓ&çI ô¤‰ƒ z¢¬ÒCÀô¤‰ƒ€zX@õlÙíÂõ þXÀž ð Èž4qhOZ8¶g³ó‘À½ycÀ{ò‡À÷¤…ƒ|bÿá+ü Ÿ4qŒOfâ ¶ÓGCùà”ùh0ÖÚp>iâ @Ÿ4q¤O8ÔgwÍÇÃú0ûlïŽÀ}åÇÃûp‹|<ÀÏ|*ñƒg缪Àüd¦ ç×ÎþáÏþô?û_ÿmö7)±Ì]Åä»7¯ÎÞ~ñÃÕÙ süý÷þÔWý¿ýÿýéÿéÿ‹Ÿu¸¸¿¿º{óûw÷¯¯ß\ýËíÝ×?Ü]ütu·xÞ^n,xÂ_7`´ûõëwWg¿½½ûáûÛ N;åaj;+ÛGÿù0¦º~<±AYsßt®IêJTÿ‹sßgòl ¤cfr*ËBFˆ˜Ô$ V$æ0,‰9>+BÇñ:fÑdHèÃ(hË‘ý€Ràz_¼OHäüágûÙQTÈqÞùIi ‘ÊZD졯°)†Å˶…Üê MÔ ¡hÇRž’y…íè~ëš±Ú¯q’’pJàÉìdñHs„3LtIЉB¸’_nB^"ñ,.)áY9JIÈ`-}RÀDŽînpLP»‚“éâdÉ‹]¼>몘|Ûò8Bû½\Ì$MUŒTríÊW$ìY˜Ú®0¶h#È 7g Ö#@:ü(+pŠUãi@7]s4‚OUA¡c¬›“BWD Xf&èºÕ'ë'Íne÷Œ«¼‰ÈT="!'gçÀêR$Ð/¯óZäa°hrô µJxÁ8¨À 2§Q«B¨Ñªø½…wdº®c[º—§-Ìð#Ž^©©ÆF³H‘XÖ*†Àz«¨áU¼¢*,ËèBF”œ³ï–3ˆÙ>kFF¸ÄÆîzV”ŠÊÄ]ÈÑÐmaLàe¡P› œÕM-*g&Îì@Y>‰6ÐäeYÀ®<\¶jD˜T'iâÔFž¶@+YLæËk³‘ÅMg‘dJŸÄdÛzK¾¦À—‹n!Vaõö¬bý åÓôJ•~UXøþñú²*¡vé,A\þˆg[ ³Z„ ý«ÍPˆŒæe-„JOéòˆxW×€ãb͈°[2ig!-żƒ6…½)±¦6…ÙÕE$tÂË£X_“6:k4 V‹—¬eûσ­¸a«QUØ 5U%²XÄuøB3§©èNHâ'H™W®¢²˜L~½”'Š!ºôЙØxû¬Ü3yZX$ÈrÎÿÉÉñPE³9çÀ?;ÔùêiI3õY-›7Ðy"çÇ?Nzlm°ººšä–‹HO§ƒSñ$+ˆÔE‰j2>²%õú4ô/©.äþ÷*V[Ƴ¶©ž O|§`@Ëï£%"Ü}"D©d’=ì¾!XÆü~/Ÿ]0|°MÈ÷í 0ƒ>(ö•¬ƒJ/”RFÔRo ù{m §9[¨ë8Eýà­-«vJ¤¢e°A&Á³˜p0üì$Ò.Œ’)(B—åMêø}ñl[¬^©Ùž#!ǧE¨¨üä©ÌÔ(wq÷™—xijˆÚ¤(©sFGLeÒ}Àê8+²6,.¢˜ÕÞQ§€þ½²‘T' $UYéYàÿÂÊ‘)v0ÑŒì(¾h¶Þ…NÂC”3¤†>A±›%™Óå ú ¾:ߨ+yÎ!uF1 –Œni`)NMð/‘ÂörsDss”½‰)Fk¤‚þ:6ÙêNÀÇï½Cf…lƒä—wœñéø¾JEšùOÁ¤܈6ªï¼™–ÜMŠ‘ ’£!ýçûŽ5Š–Õ‰EÈÀ¦:oø‚„‘ ‹zMÝYH½.WzÙÇPBá1SCÖMYÈZRn­I=#P`¥˜= 袨ˆA€"ŒMÐÍQRYÑ@hU“`Ùu'ɱÕÁ¸ÔsvVÂGhVó4s1€šÅˆÅ‡†œKr-MŒû#¸Ž¦ó8UŸ¸P™Àα ÙJ]Øœø›2âÀÔr>-ï_(‹œ¤'• U¡ª#TR„ܽCq­†êPQª@’[¥ŽýéBU;̓Qw£bÇÇ$‰q×î€?=[* $V§º¨ hÀ„A¼ ³ªhÿ»ÏÎB_ë®ÐP€¦O¾UºÝ)ûyTÿ,¼ÔÁÞųœ%]eΕÁŽ´(/‰¬nAóÏê¥wq!Þ~–Ñk"”Xƒ Ñ€‚ø7Ÿ…‹ÌBöØÀ÷AF¶èß©lµJ™¥^»Å§3 ’¾ðÛB,jÿÞºîšÚdÿöÓ²ÕíèâØœƒ™uŒj_u1bYø"t¤þ¹².ccÇúXÌžÉMá¼02eÊ»Y¶ýæ'ç™*ÐK–£×aÂ>SØÔlí“© ( ¶‰›xõ› °^óDbÃ,…ÿ£ëz$.Û%äIÞî}\ì¬Ë­æ çÙWï7¿•¹LwÚÍÏgçŒÄ<7Muk‹Ä‹g›Ïê×z­b¾d7>"%¸2G1–Oj<9˜²dÅN[Œ6ƒ7ûAHÈw†IÐèÈægˆf*/Ðh2¦ "“P 5ò±ôÓ³Í&¼dümö@£K÷ ¹ë»¾¬·™Ÿ£É„MêÚ‡Õ…ìø–¬õZvp@8.»e±ÙéBÅÖ”Æ}ö™xs¾&K–XLÌ$±*ÌF6˜b~–®V .ºáÖÆÙ|V7Ù¦P‡!†0|vØê°6fBñ;#È9íü|ÛïF2Ñù á\7¿¹CA<º)!ÃséÛŽMªðųå“¡­ÅΞc@‹õKÖ™×Ζ*Ä›#Úb:4ˆ´µY6_ö€Ë¥í6Àì7Û=Xç¾²ðÅæD»‹zS(éí&D³Øz»òp±ß±U¼¹üTøã³í>,ž…6·³0 öýrkYgÁînvÌ¢v³Ô„/¶z«í¾§UlR¥SÚ>¦l¸£5!Z]pn.ÛígtÍ[çã²yê“X³¸ÿaà5(bŒËVã\šfù,ÑwXªÓ,t‚Ì] ÃöE9E nîÆ Þå^ så‡Åõ î"y²”V·>âüd•ˆÛåæº8K(mgÎ&òXãæ#[~N.~î® ÖšhÇ U)ƪW\0>[ ÿÉâ: “xê*`(Ó>ì%.ô^é^ô",(©¥!ÜJÈ mM~ßW<; –jÑâÙY¯]UCð.¿Vq·§‹2Âq~ÖOp…‘Ð¥¤O²oíÎâ¢é¹Âtºf¡›kÛ,&Ì;0Bm §V!ìSè­¢„ã/›$cM¸ÕƒY¼è^¶!ÜŠüÉê°EC'€Ous)Îhœ…b0Í–¾‡v·…܃wžÅÔÌè¦pw°ó¦Ý|rb°ÂÅ`çVYŸ}Pd¥…!%t¾apÍî9ÏÜÁ„”£ ¾‚…‹Àõ$’ÅÐÿÊì"ˆ®ëì" —©p±{•Ì9©ÄWÅ­*³Œì>%7¼pĈ!`àDPQÝ™$öL<°áíg›øw)5«C1T&nÐ¥Tý…‡‘¨šú ·e샔·AFlø 9aBD2– ÚR,€þ’Ÿ;%t#qžÙCªç809.ážÝµ*ÜöâF„^H›Œ> þ@„!Ä´ð _>Û³ësè2¡ÆØ“Ü¡;°µô9z´0Ðsу !b1´«îåsÆ)0yéˆÎÀ@'…úŠ#:+ž‰EÈ9,ëBV¤…ª±Ø¥fÌB’±FÀ¾7ˆéÑ—Iu¬ —ÆF<`äj»ªfE,ÌÎxi×úßAøøû”K~ÞâóPb¢¸BÉ^ËE+=ĸXvâ¸]Š[±$Fñdn 9ì3 ÑÀðYøùç…ßwK“í !¯šT€¶OÙHéO ÀôÖœ{rÞ+b{ÃyŸ‘’L/Èg›Q‚¥ç?–=ùl[ŠHÑFà@Œ ™)$ö-èI”DÅ«ÒÈ€Q áVä@ìo £å .vÄ.Ÿm‹‹ËÂEèa)ôVø¡gÀ×D˜S^ Ñb"Þ²¼iEKHgÐXƒ$ë¢ùYM™_†T¼DÐ~Ò@E•€åòÙY¨´HÛB¾déÐø+Ix¹€‰’6¹?AÈpSH1Uç,RbG)Ò®Ìõ2‹Æ'–F–’)?[´‰’&œ¦Ž§,Z"¦P|sÂy’&I ÔÔè†ÜYï½qBIúm"B¾I1õ¡YÀi)æ ȶÈØ„Õa"à”2ï{bHFFÊ@K¡.·"VdÈhjñÝ¢˜¢¤’Ǧ‘α͘šE’1!n3R—B‚²Xtd ¶­yKêšé.ExJ/7?©)B’ÂÌø$Ò0/ž¬r_>Ûøèo ­YXgq7M¨‚–ÞXtD/¦ù«óú¤ô‚í]>Û«sg±J³˜Ó†B.uã̉ÃN÷mè ‡“D{·ˆ7…NÐЇ"1=4 擊²2„HiqØŽ…tñ¢|óFM,ҥР+Æf·TˆôX¬Þ8·S ¸§má¬xÍߋӃJÚÜ5”ªt=‘àœ”:¤cÊNXŠ-xº*ÄŠ„QS¿Tˆ$Ý€ÄjsHV¢¯„^Ò’eøVa°ßÎbÂn £¦,Z]B§c‘›R˜—}…t_øº%Ô¤}4 `w{DóA³ë…ØKHú³äØŒãIfS£”‹KmÀ[´8 J‰„’ÍÔ[Óf\š™ÐQu~”Ù~_j°¸ªK1 ÙâYõÉ“ Ó`´E›¢Íêµ¢hsÓÈ´yØH˜7ýŒÒ@|ž6<µ«–l¸„Ï9AE¨¤Hȸ«.eECG§¸ü…q_c™–Iå$Žª¸Rƪ BJé®à©f(7°ñ,ûŒ^ªXù»á5¡ÓH`0ŒO ‰?D¡kD»ó³ì_’v«òl,â@ƒ(úfÕt©ü×`è§eèN„ý±Í'Œf±ºw*“VM›>NuÌÁ½Ù€:bÆ=XL"Ñï´Ý)·(! wº%Ä$ªp{n-$L““„/-¦<Ä'œ3– 5sþ¡‚¯;_C œJ™{0‹5¾EBIëÝb\[ëŸÑü—‹¯0‡§H(é(sp†Ëbn³£ô¥J5‰Ì\ª‹ 2f ×KUùº@nˆy‡n m//…´Yä mîûo'Ä|¨ Hòñ2ͧŸ&š6ÇHÈ®äÍÈÀòY=·^.( ,ϲSBõÕ£QA•Y '¯&‹ÍÞú峿U_±êUÇÉ;s:ò‰¾ùì|#Ìg¼^Û7Ê$܉ˣŸ¹A¼+[Â* f›WŠðœ‡¼ÓÀâNb¥æK1BÔî4á1‰èžœäÞÞn`q[ç9Óú‹PÉY›› P-nkJý)°œŸÝÔðdžãò›Ê 24gY–tПm‹£:æ6„¦2ÍB¬½ØiÀ4©•VÀmC Ü,ŒJÞ¼PÄ’\J—ªŸ!{) øùÒ,Z¨³õQ gSíhžçKžx+”|à7ƒšã›Z2žuFÿº!dt2ØÒÿÏ·Œ‡Ö’Ûê– a¸ŸÑŒCa0`SÌüÛB‚CÂË0NÎ25³¥¥†ÒÖl/í'³ú!üqˆT»ì|ÃÞ\Xp”“ g6äl°.lH³äa.žoØ»jXÂŽ†xøìlÚng3ØR—&óº ^ÅòVSei´Ûšg26C¿âɸ<’mÛ0¿õÖ“ÉNÔ)B6a ßrE,œ!ó¨2²f•éžcL”³\8NŠp,n|/Ê£ `ž…ya½lˆSɻϚŸÈ68„Û~¢¡£)QdGæ“· )qªÔmOW¿ë¶¾6ìNŽÓo»àf¡1äÍž6ubwÎè…co½ ¡Þ:`6ý˜C`öˆ[¾‡Ðð1Š|Œ7ÓW@ì³{{àó^4 •Ff—ù¥zÂ5¹ÿâ~jËUu۳ߟ„;8üK& 0û”öP4 VÍ žÞ¦!¾.5JÑmÁt¶ÀAv= •êš³à%Q1•K Ÿ‚9ÑÑš•u [ò ]3Bo¹é$l 'å-Õ©m½ÌŠ,…;¹ b ó’câãe¤fbéÄlGÁæùZD¶6„slmn`C ßÓ0Gc78‡¹NáÓËo[2³3”Š¿v¤Â$Ío.$*Cš&i0Gb¡y KñùFÜt UrÐy)#ÙÔ\î…¢|ló¾9ß úZ\‡rê&¯RN•9_K”YIªÉà“FˆY„šß·ˆö”lœ8zlHúU([‹ QðInØ2šmÂÔ„¸õÅf[ýIŸåk“Å1&´;‡Î›rmП’ˆÑL{V8ÿcqÚ"6µ!tfî!Œã‹0û¤ÓÖñMjް+Bˆ8nãü_<«w…ƒ—L´±sÎÙbÐìÆ DªZÑ3Óž¿/ Ìwà†wà.~A0ý¡Ö&gôó™ËiH‚²&ú9ØOQBBL®$‚¨óÔÑߨXÃÑËIQ•PBUÁ¦BëÒ¦˜òuLN³HWàO¸=S\P ³š"¢]“†y˜jÙiÒ¹]¶„ªÙHN=9œ=:i5‘ePHƒ—Tá؆˜éy¥AÄl ñ*¾ØêAœò½XjàÍÝjŽ#†P¬péÌ¢ øFJ–"߈ójHÝ"€ß6±'­Í#ÈHáýÿI{wK’]Iô ò¶|€:ˆ§G„œƒ+•:9+u‹wý÷w‘4#¾2»0Z–•/†‡‡?è|©Gݹ¡;Ý,X©s`5Ù×kÕ]¤Aöƒ=Ðç&ËD½Aë4­¦M[ž&´îFe¶??f8©J3ÖÁGát5çLTó@b3;À~mV?ò_½S™îÜ{*#`ªè…ß“¥õÎsÎxz9®ÕÓþ|Þô¶ÜLísꙤ»òkuvÚ]:Ø®ªbÕ}Um Ô#Ⱦ¦ñ+o©Í«mŸÁ%7äà œyDx¢~Ü™£Bqó‹ìôù¦T5VxMeÅ#ÏŽÛàñüƒúš°ÝǶ̌Ï%@H/ˆ6ú¡š[=Ô'Ï4ŒY@G†ïd®Þ¹c)èÔ3è×Μ¿èþ™Œ^f£YÈÛ˜¬îÙ(òýGرœ=ú¨¬ìçžzôF¿ \3Ò¶PTã˜=8Á•¯N¸lÚô-èV¦bÝô>þù1Ã7xešTKªƒ@xT]ʤº.pA*Ï|¼Á ™¨WAñ¶WäUÆÄâÄ.p€Úh¦ßÁ¥é z¹Í  ¸ÅiÖ`¤4yÂ}Ní;ˆd…"ÊÎö›NƒAO}WNaÎF »½ˆ_‘°dóx?CU ŒXœF$ÏJ3V1gYí3òÔ4„aŠóø{­YÅ®4‹l¼i­*åMWD§D”Ì VäË빌½©(ÛÁƒŸÓï óåW ^ŽPwðïéÎÄ86YÙ= •7&D¢}âç^=«_XŽä½@Õ¾_í5EÏLO è¥kîÚïʪ%ÿß…›Å?ÈÄhs؈wℱ¨ª%¨íîäKKuwD¬ÐÉ=®ËßêYi”„•>¾DvI=äÝ~ôù1ÃYÃDÁäõÏJƒeKí·ÂÇ+MPÔņ!²ìRƈ~1è®BŸÔÓŒ5>¬ËõgêrçõV®¢¾†€=­“K˜W~Ì"x}v¦ÑÛ,€c¿kN9#NGði­[{Ô¤”ˆÊçoZ i¶jÊ5=â\3àÚ©àý”´XÑ'ÙSyŒÎ+ÁVȨÏ»õö p'ÓŽi[éXÖ=ðPùÂKcF©UãrÎWµZD®c÷àžP°øЭ¬Ÿ®M1¾ÊôX~„ÓP+ ì¶õ(€ó+´¶åÈìHóÎ\pP`níùüôlÐ/–¯ ó e‚J^„NæÖ–4÷ûú§á­‡eÛER ¤[œH2:‘r ´m:o{m´hA—o ú>úôT©ü´éÍ’vj+ zK¾„`¢ÔÑ¿/˜ª«€åx³úœØ’~áö’ÄsÛwÏ€ªû68{«àü#ú(€Ô<,cn[ -ø/U‚¹ê.(]D•±T;Tó³÷["IiC´ËÿñÑt'Â3HÃ~ýÞòõ&75UÝÚÿ¶‡WPUÝTòÄ àå<Ÿ~…hÊ£Øð­ôQò®]Áè'*)ó5¾>f8¯;¯Œ4mw]ùtÂì/èÚW,fxÇ»úü=vÐÑPøÛ›DOéš~4äéè—ÿÑ–Œ ûʇ‹ëB‚p ¦¹ÇMbpð7v|T35kXЮ H°Œd:Û [[‚bìVp£h-i$“!,Ke%'I–ˆ»¤•­`‰Ä*).ŸYsü?ËÈIC¡„‹ç²M áFôjÆQf ¿bnž3ªLù»é$¼‘iq)o$L/æ|\O³eXêk£Ø_XëñÐó0–“‘^N°¼suJ•¬¢f¾É(QaÒ¦Ò6,-áI`P+N,Û·ØËerÖÃReÈfôXjçã”ë`«µ–žÌ6 ø¶m½Bmœ§MVœeèR©¶¬éËima§Òäécþ…‡q> Î1Hû—,к;‹=¨ŽÉ âøR50ºI œ›¬ü¾üuTrç¦]°àóÀ…ªzçç_ýXõ²_¯©øÇô¸ElW9“²`™åÞÓú gì§AÐó¾t‹elf…ÃC0ßÕ*,ß)1e*„C}§àce…h*[' ‘¼+`£¬¥QQ.Ԡßpʉ[q€Mi¾®¥”Û)0@æ>Ã\úë;µZwÁŒòùgÐgoQU¨©øo—Œ_~!ªTs¹yèåIÚ~Öå à|yjmëîÃH§ÖÒow_½zua¹‰fG.Â#Ƀ Î{RÚt”AÌ»ªbö@o>y-åm†=@˜¦^r´-c¢šT¹}i[yÛ¶nñQùHœ.˯ ÷©šHþÚà¼f)Èø!5·,ïzÍ:3‚Wn/iÍgò|y+åD–(‚zæ–®òÌËñ;ôSÐãWÊ{íR¢áÉa¿õ¼×Wx¹l¾#ªˆý5V$o¾ìH0¼lÿpD~}Ìð@¡šºB©´”©æ`­«™¸BKǪŒ‚áूSM…T¾@–% I3ºEC‚€ßoð·"Ò™› iK5ÝO!5Z•Z·¥;&b¸þó1ãê±c•V!Ýš<ýÀ¶¥}ŠÔŸˆò5UùŽoþúè£Ð:V O°ÿ¼µe¾Gë­€F€³.ôššâòu¡ƒMWì"()޶ÔjéP·ÿ§E†»×*QøŸ°^6–Iéc=âB¯2y»P0_÷íÒóÖ) ~ü°s k$³:YP„l¤(WZ¶…ÂT|È \ˆ\ Ê.g@¦kìßœ’sÅ?‹ÐÙHfF&KüJºÆ!g[rÜdf„xµÍç’ªDÅG·¶®vüÌ„‰R<Hû®dQ¨-ØŒð19%tÜÊëFI =ê#u^Ø#Öcò QSÑ$½:޲lÉËÔΈU²d\À‘ö«‘E)Vkë+8H¨Ö,£R aBB%¤]£”C˜j<ÆÔ¶¨­Š‚ªé;Õ¬É%1v»u}™"î_¥â’ìŒ3ÊŒ©ÿX“Fš€õžåædÖ8øï·Þ¦Ü^áÛ×­” i[Ÿ\±XåÚz,V¹J‡P^AÁ ó¹òqì"þÌó øçšmëûý1·Î>Ôjh =ßÍÛÝáÜiêaé×G¡å»²Ê"ðˆDñ»¹Ë•F¯Bh¬jÑͲ6¥³Cåf ¥P›Zy»eûÓíÚ Ý“ŸµƒÏ¼×ÞÿM:ZÝÂ+Üi,,ã©ÇM±òáJ=Ÿ­-ñF®ðaÒVAÞß-^p£ëQ¦pŽ òúݤ:ÈÞVDzí`½—œÚÅ"Øz€ðM±¸Ô‘Ë+uô@á$ÌS0• «Àp(HðÁkÛêAáÙo¹R?µ-0Mt«ÓçÇܱl›yšbA(nÄÎùw…e¬™¸¤­(_6Æ=àšÞï®ú¨V˜TŒªk¾6º™½Y7ó..FÍN=Ks‹µ¥›??æ¶tÕŠ¦'R+¤ºLµ>w:;X¾Qlái¤€‚“¯4ãÊÕZ=?¥†_KqHr9V+c™-) `º™H#HË‹[̇Ú6‰Ä0]œ ³\[hÿ¥Ùàâ&÷P¬re‰²„Àä»…²îˆÐrÈïáá €ÞÆâ©ÿƒ¶$f(oˆðí•¥•!È¡øð•éL­h mQ ,~B‘ U‰òpIfÇH Q/!$åÞ¾ˆH¯úš~ÿz*˜j¤³2=‹~@Cå…Ô‹éwÿ¼£Jb Uf¥ô½_ íJþK¯7 MþÙ—¿å+Ý+/°œ+ùÉAc6Yû>! ªÖO`³U¹u¦•Ü…ª¥Îœûˆ_íx1Ïô²_óñB¸ h Î‚Ó ÙÛH¶™Va„Ûάj`Îί>àÅw##[„9òr $ýb1î%«%GÉb‚ˆÑâ3l üŒàWßÀ´mn**µÈ­HQm€lh[¤?`ƒ üÂÖcœë0Aäºóúß ÷D,°Æ¦(,@EÇ(ªz-q³~%[]ƒÇº¿·}@õV Y—瘷žoÛ ëSm=½EÕ"jïrèLÔâ%’\%UËcºÓ:¦¶[ñåUËMÊåa[fÝ6P\ƒÔiîÁÆZÂEûl±ÌzË=²{æì© ‰€ƒÅÝk I~ɯReö6"ã§·1z¼Aòõîcˆ‚ßís‘¿lúŠ/˜Z‡¼À¿ÚpIyòj›¬œ\#%‘ãKø—pûüú­Œ½-8¹>Uª€Õ?§Wè/!2’ê.EÄ:±z*œätd7Êš-ä5 ²1©ES¬bRáFA°æ}}ÌðŠhyXQuOëñt8)úꄃ´ZJ¹&}˜*HgˆôÕ–æWêBÒ»*Ÿ"iäȼ?OÎW–û%Lz:‘Ê/%ýc ³p†’àð@^z1 ²¶Ú/e$·iHBD!¯³Ì¡5\kZ:uA|ÃjŠ*7¿“ç²Q›²mQu6Qwþ ¶%@¤²å% ‹þþ HŠY”(¡€‚¿m‹š‚Ì*ž^7¾Ù]^Ô*©T£Ú²0¦70k˜v"Ú±­ðä¾N›wµ ^ÏOü>8¨ Í@Ùå¤ Od;À’<’' ÅVÛåœX-Û±XZ„e£xðž×wy$€”ò¥0Ï{oh‹ªbåcàŒ¤“ƒ³$ùgÍ8?‚xc‘§rè±Ó´Ã{€‘OþVsû=NÊÊ•q¾¯´4äKa»ò4©'Ò"[a»r%äR‡=ç5­õ±#[37‹O8—å‚îto+kìÄ×5LÞ‘%ܬeÞ¼-Á{Òæ°{ÝŠif êÍ•‡¶UH48ò*¥Ž^©$5p?—rÜ~mïÜ‚òŠê= I³@µ‹oÍ/1ýé.š¶ÃT*‹BêþîI¯ÜìɤÌÏ(=°¯mŸz€ÉÑ­—:g~)µ °”f¯Xg›ó³ÑTzæÃXÈ=oé¾j¯b¢ ›¦/Å5¯ù±ƒ4P[Ö=D¾M]9ÒÔjàkö>ÓàBó iä÷Ö{Hƒ¥·ÿÞ 2»vƒ¥¶Æ—‚êkÑ—ƒ—wØý^7Ìóânbfp}Û}´*ÑÀ¬dà"Vp]—2xRQȽ«BŽ;Ο“ De?áe–S à­˜Saÿè_XJØ’ÏŸîóT"èRQ`b²À¨€º¦¤‰•»ÿ`HéA®(så.oÝz©t™IUF¤çŽ#§¯;î ýp¡Ÿ{öñ$ùœ˜ð¨É$“×-bè@ËìAP)YǶ4"­»ÛŸŠ«³G‡b':'³#EpÔyoïA…Ç犩G‹Ä9¶½m{¸}Ú \=°WÀúƬ-ûÁlsæ>±ó‘Á賈Ùæs¤më9 ¿fÅ׃»äó *Çl.a“@I»ãA|*( à½j2ýè:@Žô )eóDè°ƒTÉäô`ãuP 4+Hö´& ŽE[¿wú!~s÷/K‡ Tܸ¡ÇƒÊ +l¶n–èÁ¾§Æ:˜W!k»Ýlû$K÷“R©ÚŸ+Âé{‘[ÎØ¨ÍÒ»pû+p}ÒܩуûN~@TÇ ’Œx…ô}±­KÝFþÞíIÑ4‡0bÆCš\ZÄãA—<ÿÜ.y_û¨/ n“W ùïzã{å&…;ƒOݪfW:¥‡‰Æ"[·ÉŒÏ³7ê<ØÑƒ'Lºfð´qͪ9®ƒp 'ìõ‡íYùmìÊî°~‡¨&9^Ó›½¥~·è, U剥cPe’ð¿úü& ÿšUËϱz.àåZp–ùy;h¬£´s+€í€_°:ĤPmk7Òx²ü4o¸Ç¶ßm¾°(êÝ_“jžŸOâ ÷u_?9,-´ë¶£*xÙ]óõ‰¿Ø­;ع rC²{”GaNÕVnÚËl¦S ‚œ[™­ -[-‘8Ób?—ÒK¯O5P©µj¦/¸‚9;†I¸nYÆG%%¸å¤’Ky(þ®Ç)纇—6£§¶}ªÆEõÀAŽ!‡Flc9Þ*àâêì  ë?‚Nœ––-^0æF(þ?n’ €ÓC ýa8×mn ¾Ñ‘.ºZ3«ù¬y$Ùëž”{Ã)mƒíÚh*—{˜3îî5clϤd=PÛx/³fÁ’鵘ýNµŽŒ<³Z¦çõb%¸Èò–ZÄ%¨Ò ¾÷;k¨„e½Jg» Ì6kCiNýg°l¬òq¥m}Ú2žçn²š•ðz›†e ®¯%æD“‰[Û¦…º@ÙÍëI(:Ïàü­Zô Â>ƒbýÿ¡-_¶I­¸.”ÛáÍ’^4QÉh‹€×i=ny/ZhãF’rŒ›ÃFXzø #öÚ{.¤ÃCX ;¡™Õ1³Záõ¦Þ®wR3Ø}"4ˆ*…®_`jèqP˜¤.ÆACìcŠÇ‚蔬«öÕ·Ãm ›ÛªÀkŠèÊ"n¼˜®:žÀØèµåÌd‚ó§¸M3 #Àf˜ 5£ˆì¥áÎq†9¶^èAÍÓ8ËÇ>E‹ÂöJçê.²hžuƒºðσ–û¶wÅí,Q‚̾"«oìtÝZÓJ“‰ØÇ>®•Ð@.PyW]Ìf$Cº+Âb¸žÐ. \WÚî. Áó”Ú%|™kLóœ¨xw_=SˆÛŸÏSùªRÖ{êòVÌÝéKÙà\µL·ÑN×ð†òôê|'L´1ZpuX,x¼[# ¨ ºKåy`ñæž$ãûÍNtNeéV3Y`öw˜yOÚ…e3‘nµ10’û{ÌZõÀ¡‹[·¸:N³Ñé8¶*â2r<¨Ub¬(ŒyG9@¬9õZf=’28˜Ça Ë35~o‡ýŽ3•£e7F÷l‚bÄ^!Ó7;þ>Hž½-ïvNh›ãÊè1¯§ú¿B‘¼rëµ+ÏÆt]…öß‘[ Þ”¼çW0cTâòÚÁµ›œH²~eœ(晫0dÂÍ`ôîR·Hþ¸:7:Àð×<3zMŽ!5«#H18gŒsƒª]ü^áäsÿ°”ËÌ6SM6ST;¤Òq¿éÒ™aàÍÄ䩊ӗ”œªâgy »dÐ “¹½¾«9cN!óå¶êÕYþž¿ OŒÃ¥îü}¤Š8†»oõñ0é³°ú%  ÍEõ°À­f¾àº—±¥ñÓÀýDÑZ&/”«U-‡šD‘4þ+mr\ˆ7©{^¦Ði©ÒŠ€ïõ)‘²3µ-P¤Â{Ø{ž>¹ª–²ƒ¶&€I|ía?€Ôv&S/1,6ù%vöy…‚Æt«FŸXñE™ÕGì?_Ö&€$åÞÒW¼gÏ»_Ù9µÃé,&&D&üù“õ\ GGfo ¸KQ ÷È\ð”±Äé‚(Oz”‘˲ ‡ö™ ¼»\”T\å9¿šAs  ³¸·Ë7v–™\Ó¾Q}ZDº¬ëYЄÁÖ•÷áû|-+<«¾»ÿù³Ö–UË1pÆÞ ró±¶k–á^ÓIE` ó¥ôà¼jlã½)¸Þßà ¯Æ;EF˜üI®‹'ÕI+|é©}ŽeíÂƒŽ“òÑÿÔ4XòýIiœG‰¡¹1Ÿß÷êw~ èžt&ÿù“òÕæÌ…'K#ûà.ÄÚ‡ˆÃÁé‘3ĵ‚ð<<5ïx.îôÇŸ+•!kz¤ÁwÇGi‹`q{™cðôŸáŒÊ9ÑxêÒXÓ¶hd,Y°‘×3Û9E2(t”éß-&#ý½ŸÈ¡0_ÇŠäa¾Á×ÈdËP猚A÷8e×âÖdm¯šþ;CAXpÉÖOUXWÅ¿/Ç g~5”k_vÖP’AŸž_pbÌÜèS::¦øÌÕC7éT\=Ãg‰Á,Dx&%¯[­©•-_o8ꦙY?¹·î'Û¦fY~Ö'H¶f·2๷߂ Çä»ñ£­Q %w†¸.›:³X—Û*—¯­gIJcq2”Wí%b»\ï÷ƒ–n㤀ãɰ¦t+g” ÌÔýz¯ @É ÆœÍžÝê0Ìiî7{n[n°œ6Äx•ëoCL÷‘W\}@]ú½µàªG§"»œ¿î»ª’§§òijkÏÊ®=uâúa½ÈãûƒäÊJS¨rÓCâ!Íü=Ïÿ+ýЭ³äx|Y)K¿ þçJ à fMC½W¹hò%¹ß "P–¼[¼Ùš§Ý9p+åÛpí$·þýÁÃ<ÕR7ö–:uyl×CcHH!îm×t¼Ó^ºGTå·cð)‡ðŽû¥)86³ <¤gÅŸ5M—07Äõðxä…)öŒˆk¬Ÿøî뙞µ·pç/Cä-Œ=Cžßœss¦ËxöÜ]<ŸÐA¿JÕ˜¸eÛ}/‡gAÏ®=£8höU—‚ö¸ßŒ pYòŠfÖ‡.3Z¶FTq«Pû7Sµc§1¨Õʹæµ\¬Ï³ÄÊëwë¼¥5öŠXÔ%œyÄ­~[~v¾ï•,wÒ3µïÕ_å*_¨˜yðÉЊîÓ+¹#VAt ׎uTPÙ<ï³DñÂ?'¸.t L‡d*âÝ!©ð}QµxIÂ¥X" 6Œ¬=rÜðVBkF¬«ªG‘²ùö|î5­¯8gô­–4|̽&á¥v;xÚ ˜Á D˜iœKÄFK¹*åÇë÷×z•¶ß:€žI>\àÂGƒŸçâ6q>ŒbH ³”…Gò†lcDJÕ“¦jm gþ®lg§æ : ŠâÃÎ##&.†œ°Ò¾¿|°³n/ým­ƒï>ÃL¸Uï5† dí¿ºº­VÝP'ï•v#Ö¤´a€íÐRƒòâÉÁ½ÀÅcF6jKzB¶ÙÕôåÛí’ËÁ ®ó÷*Õwœÿúß9{"¨ðˆyÍÍA÷V [æO8V¤4fdæ 3‰%?Þ÷^¹ÅÎáãðy¦}:Lüž °>$®¹Y×ìîO¤Ìެåmvÿ( màH÷“¿”ƒG97—L%)T|0S®°Ë«F™i¸ývŸ9·¡¢±·’0›ÙÉÌÇ` X$ VÂ@—0Ñõ¯€nž%¸]¬QWUd¯²:P*ò]ûKS[%:µM]öù®s* Vn7"U[žDUnìvÖF„¶‡nÄÚ—ÏY”p•“š``sŸú¯ ­$ÜzÎvæÒŸ–T°Ë,7BËödäá•+Yº¬¯‡J~mÔ=ìF›&Gƒ—º“£ø§H€,)oT@~:ðçf/Mzö){¢UÑõšÈ­­U+½qa£Š‘UÛ{à{Ö LøGðH[ 0CïåavKEýeVˆïTY#Þ#ßïƒm¯ÙVß‚îí¤Ô“—Œg#ÆâŒVñºUbžñÕ!@a:ªò¼ä\_Ø~¦¨é*HßTÛ›.³š<Á¿Õä%œ¼J×3ß,(L-^4¥$»€,/‘öΘº2þåQ®‡ Ÿ'Üa«r'Ð_ZKþ[,÷×ÇŒ^˜° rä‚ÿ?h‰Z¢vï¨ÊË?eØ®"äL¸óŽV½n2ˆâæ²·–^ð(+,;¹<ìÐ \g‰<¬|À¯¿iû­Ô¯äÎnŽcÍÒÚQ ]N3+cîÑý8¬Šá]@õ–Nû’ÊC–=€\á¥(©Dr‚Ÿ3̸½ª$mìˈخêÚM%‡I[ímö@qÍ $™t2v‘\®7eqùi>§©ŒÿýÑç=ZÿžZc2ýƺE ÙgKϹm~QXÐ ÷®ƒ„émݤj”5Zûa%Íäæ;í _È;j s8Ävöõ1ÃLíÈ£bãPI°@m£æØ6ßQîÝÂÛ`’w50Ï‹r£ÁyeÑà.™SYÈ krý¸Œ pGõ?Za”pή‡0ïî/Ýà‰X®e Ô/ kð¾×}dÏjÊ™@÷ ü•W—µ”›Î¡ †³ÆÃK²èf•ÃhmKx ™…‹÷a «æ|*˜9Ÿ zÎç×$àÊà $SÕ8ù$S#ìÜ–žÉñdÇ· &V\Éi`f`\©®…qÖ-Ľ+­ŸÎý¼º½ öy[!cÈF}!£ÈFh‹»†se¿Ô÷ÙFæÛCêQFüÄ f­wyÕ%S;‹x–‹ã+ߊnÞ0®•DÐ^̯º!rÏ@/£Bmö¾vì´ÄéZ”»5}ž3k°t·íp¦hA '+Êw'itT+ vÁ¾®r´Z1wdîo¬Áh¥ÎÏ ×!:{Þ|žkr [|Eìÿùsk•°/P…ÛŒ¼hÂÞnÀ®±&7×ûy?+VÛ‚$ 6® Nz×$9„¥4æÞ­jë7ªè¤ Gè[Óe@û^Fàë`†¥ Y.~ËÅ‘ñÜך |ƒ/enbq}M«s¤Áͦa„»˜·™ùz=ÝçžÓ;¯}Ú õ m·t$¾68ºX±Á}½írâ~.%e‹=Òá½¦ÍæBd[¬Ïs᩺!¹ó65cÌëy¨.„QÄ4@ÇtV“ ÑNU¾°¯x@¼vI­dhª•Â;É–á©LùA.°ånr•Ÿzãu_îßHaäfâ÷>‡ip4.PgêS&òª¤÷iàmfæÕãÆ/á±ö]ù’*ƒRò~'Ü·ÔÅxž3ŸÀøJË 30F.êËdN'ÏbÊ%Ùý(¶§;2žC&Ìôý*˜JŽ?Rv·CµÞ ‡êçÇ û±Ú_¶ŒÑj¤ 7òÒm1>KXL¬ªe¸Þ„HAºÕˆ'®$8«·æÞ]š$ØdÖtˆa‰`èí=}œÉ22Êìˆ(£hh;HŒá!–>†,’F«ÔÎL×·øÃÁÙ’÷]#ÎÀ*süÈà}KS;øø`êTÇ5^”{…eÞX0OĸGK²¦=RâÃÂ*Ï ½Kºp†$.1™h~Š RÌ`¼“ƒŠBHn¢¿ƒ“ÌJU"9H,ÜdâEL"Ôa£h`A’þ–%¯ìׂhn„#¿@®Ó 7>l)O|  ™Ë‘=jÀ;s7Ž\·-P".+åPb3áb $.shåùÀ†¹gôÁSŒ5» àe *Ëøaš•±Q a ^?3~ºÆ`rÚœFhÚÚ´°BVÝ¿Ç@Þ±5‰lük;çáJšƒ®Î‡3JÉ0{ùÐŽ×5ƒZÄn9j)M£w^ß i‚…ËÞ3Ùb-²šäæ1ÿä“ Iî;XAËÀfñI2'AǬ’` !¿{Ökâæé R‰)à= Ÿg©+a˜#êF4vùÊLb“AGîÃf¨R%Æz‹ÚÞ1z3‡ù–wàõµ…®{·>1‰éjß2èE´_›’€øg¾fRÛ —ˆÜEœ øvH¨Ÿq.á R˜‘úYk`™±¢©°žØð … ™ ®ÜŽÿ&½<‰ _;ç’®ï‹ Þ¦üÐ÷^”„’×0~?H޹‹Ã9Vë «+ ˆ¯ ›9ŒTøë£Ã#Ù5ë“zø4Vû,»SBÖöä`“AÀ¿+®Ìbm©G3yË€˜ÁÌ•¨‰Ñz m3Ù¢ÚyoÈ=Yà–­Á°¦¿KáÈY˜0 ›­ŠÅu ¼+gŒžŒüžFÒÁÊ£±bM™9£€÷'pŸ™m`°ÜY63õHMcñKì•èý°èSQ4@¦Ìœbˆ²:7ásaÊ“¹p4÷e¤/pÞIyFT]€g÷«“yS•Ìu‘¦¥¡næ‰ÉMÈ«ÈÄOÍZ†•)n!à@5UϾ#3Ï‘[¬­“¥ß1›ŒníB³ðÁ†ÊšÞ”oU(-ô*i¯Ò ¨¬¬Gµ½ I¾¸Â‰_3Øä' Û‚É–/z1lJJÀ-ó‹nFLìÂ8QZE–ÏМ¡Ÿ@f¡ª^Óà|˜‚·yd˜\{…CX/Dc[*lKÂÁPy)`~Ô·VZ>JÂÁÚL9™‹ËçjQ3s@Kµu¢Òp&7ÄR!¸yÍ2…ýº‚±Ú®‹,Å(éã˜8½ñNlmŸŒë¯ ²ã9**­Ð|¥ˆJ^E~I$H‚ÓJèmÝšMVÆ«"0Ýp&“E(îšm/¨Ä+aÔû‘ ÌM¾çŒÙ¹’?8ë¥j!2™ó{ DeÞ,kf;’K ¢ ³U²DÛ yì 9"Qãz}ûHd·0¸ód±›ã$Hƒe_Hîë/`húÁ µZÌ瘒ÃûÈçÖ ¼Á•]®DMÅ ÙˆšÊò m·xóf“’Ì,µ ;wW³™>g¦Ýï UÛ¨J‹PDƒéWËÁí*v<“ˆÑQ{š|X09w#[ÙRMjöüÁ0Ãöâ dæÒ)ÖÕT°±5Èäzç1Ê•£ì“ŠJtÙ?€ÂýøS%WNt5Þžü›Jý¨„´Kþà¢Q\¸A#£²(©Ù· ?ó$ àœÀ žïù?) ‚eܹðDE3Ãå'óhy‘=[âÂïÉ[åY_Ì ’lt]„xéÈÃ}ŽÌjBõz†¿Ú7ÌР¬›ã‹Ë}2ÕŽ,‹aL“êN.@÷tåòÅêa9Gf\"Já–Éå¤QÏ]ñ• ƒÊå/p…ÑIÞkÄeðkz×z_2nÎcbÝ¥æÜ2n¥/¾>:ÜòøxZ( £µ¤†õà¢«î½²Ì ¼&%9¹5ÅVîbäwµY¿î„ÕŸT Ò`msõÁÖk»»¶Š}.ÿÂ)Ùƒ ¨Ì(Ë#n©¼H’ pY÷ØÍ‚×JŠÜ™®ÕR$ü`Wô›ñµÒ,ƒCpžÞk(v”Ê"*¾¬ußêµ]¬·#~XMìÓ€«sMwLïÖ²nuH¢@¤mÇ< ŒïìX¯³3DLCxÏììŸ.F{c`褊2R½Ö Bm¼êψH6ÌD~öX´ñý¬}¾ØïR[à˜˜Vnc¢õ÷¼X×Ûª.q܈ÛpšõdÔ4‚wÏ|"dÛ …nã2¼UáOò´§Ï#ªNS;͈R´òTÕ%§;Ã"?K R]Å8îsOcp-´uªgövÜ{ 5½kV©³p×(ëJøW<|Øÿ|E_²(=³`³Æ<é@Dí&³]Á£62ÀÝÌ›W9~–Ý£¨,®l¥á(Ø »àÙ5[Nlü÷9g_0Z„?Èà×þñ`„úsÞk„QƶŲf¹› Œ÷R¤$'Ò LKB– ³²ý,uwXH F¦òKå¡UQ±Å•ÿ´zD7ŠýöY38Æ-„=(ãfiu|Ù°U*–%3Ñü^>–ÜõpfG÷qu©šjK¹Î ½å+ ›²Ç6x}D7-:Õ.Q\Ç×å‹À`V=Eg¡̳Ìèh“ùú;PêKx³ |" wÒ-Š>•Ðñ-˜àò8"|W>ÆÁ| {…ÚŸÁ»|ÝaÊå^ɼkÞmXóNO’€–ں̖¯h›7qš\W8]ÛnJð3äpÛ¹yaÚ ÝŽéÆ•o6P‹^¿Oò²<‘=Žè扌v¸VSç÷* V×ÖT•Lͮʀ¢Øe¿ó¼>“}$ËRö 3‚€2ç‘Ì­·^ ;Iq×b—%à×Ç gÁͬüª¥9³!Ëx²a1x}R±º17ö²àÖ4ØÊ)ß6PœÓQ Ö~NnÀÚrPœ4?¢_pí÷©—ÕÔÚ"Ó²ƒk|"neAã¥P×2à†jy­uqªðëc†Gm«óVyÈÙQãŠp ¦õðDð7%Kví¥kxÐò÷qÔ[¿˜V_Ÿk-6½Â,Ï#J¿D$MÐâ»Uþà×Ç 'cÎŒKKÛ¢zùß‚ïrŒXÁf·r X¯”c^¦VÆô„ÔäŠ-”Á Ò7êìb^”=©Qépuð›Ç`a ·tm’ΰU…gŒ›öç£(|>߃,´i-‘™ÁÙ?ýþȘmy¾]ñÇ=u`LÿÏé÷w­²öYY*»Eïv¸Òý áÇäxÁPÝÓ?oØrW¬U¡ÏÊXäAócÿ’P„ÜÌ>±xÌKl;(Fc±B1‰GYm†eÃöÍ›ùö#;Ö›î çÉiò‘ü&Cö† ª0ØM/ÑÛ—NøÈ[‚EêÄåÑä]ÛÂÂÊhÁ×ü#0Ùø^)5B}N›¢Énk?ë0Þ+ö-›#[• ã’M²,'YcKxÉÚÛÀã¤wÚBˆbhì@M¡èÓÅ~1Ì2œþ)ó“ÉêKÞ¦.#0Ôø0ìÀæc$9¼@÷Ç œðëœ_3ȵ±å:#:ãóݹsBÀ¡1 ñ DmS‹)”™g’»î,6.Uz¾¬;ãI ”Ìtéõè38;᤹¢{¦ÆÚ?âždúåuõ¼€¬³–‚jaÜ÷>º2kéÓ Á¬…æà¶RÀEû~œ2;) žýòboO2X±#3ÝÆfº¤ÞÍy„¯@=âºhËW†îÃ’0Š[J@Ë8äY9P›'ŽÅ‡ä¦gT7lGGæäùÉß#¯Ò¢F:hQs»? «Å‘°ð—õ1 ÞFfZ ÿ9#¾¸š×ªIÊX=Æšš$õ¸5c2mŸ EТíþÉ€k¤ÈðŽù¦J£dÆVûN»,GÏ'œ\Ü~q2þ¥Š³ 8> »,F:5Y–v­‹:¿­žW|-õ¿§"Kôæ €q]¶>Q‘eÀ¼µÜžê~¡~¨Í` yσòsð$™n’·C5?¡écwj193Ï H%héØ4ñÔŒcÛߘ²¸+š9˜dÕXñºWè³·Wð™~AÀ·Âx‰P%-ÅW™ÂršA¾‚MÁöÉíñ´OÖˆåòos!i*бąˆÛ ”ƒá€¼Ò³l •Õ Xù|=}‘^ȧ®x¸¼rãA¿ªÒ™íÖ^ÒÓÝ~Ë5a×”YžMÝ‹Žgž¹i·‹/B.‹"¡ëõâ‘¥óýºÀdîŽæ1˜1š%zc®tÞéj0ÿ]0³¸ë5.ôÖq¸éá=þ‚¯;I½éÝu0)5^šd˜çóÈÄîÁèë Ì«è—ïtÓFK~-õÝ68ùŽˆ¿ÕïX(ÍïhûZ„ÒØ,xxzq¯+_¤ìµù{„¬ØWâ‚=¶óêÉC“Z¬{NÍ· EeÔB:ÁÙÞ Ô‡ö#»‘Y2>%OÌ9F›BóÛÇp¬«œKE¬eŸ—YÅÜžxr+¨ŠÌÅ$!Å=d ]ól4q&Œ‡­ô(Ó‰TÄ^}ÔÃîÈdú¥ìGÚƒd¤°ˆ ËŠ¬Q Úapj,Œ”ØŒ¢YjA$FaµD”ÕÞ_Îé„PC‹A$­ð?­Áv’Ù¯žØÊ…jM»»€êj®¨-£(ŠYëÞ’ö¯FÀD½ôÕüx3ßKÀúÜ?û,°¾`\$Ã3l]Ÿ> w+3b/d- ôP{[îÑé30gáMõðÞ’3רÔÂz[u PdLû -¸Ï ·IdjXpÊß{-B¬£Û^¯œ…ãf8j˜ÝÊxÒ\HÎ…n0rØljcöïzy ºxRjíÆþ¬“{$¸Pòàü–—ÖÌbȵ¸n°Ï kpCב¤2µ¬+i‹+Ö}$9ºï s¨Ÿ|€ìáäçØKFYÁ†¾áܧ8¾íp ÉÄ/ú‰y"T2÷ò¤4nÙ'™RnäûÃQ.ȾJœók‰Èñ:Pï¡L)µ6,7ðuœý ÆÂý6 ÀÏ`@oàAƒåC‚<¥f¯ÿ.]i?3Øræ?ñÐÔ§t-¸îòÙ‚{ò’(3ÈÈǯ·yué:Žº@zÍÔ¾çéïk¶YqÄy"¶¶7¼ã/~XÆË…Á²æP‘®– |j $?SQSøØ“Ô5ªEhÔzÝsZԺݑN¹ëy&…Ó QH¼iî Û±"eySrÖï>X©“„(;0¼á Ië©;HCþ)¡wRbRÀuðmÏR¬#8âæŸ²‚/ïc¸$]Оù¥™S'mjê€ÛŽÖ!0zÁ6Ïê@pF,õ}Ötéþ’Þžz‰#I؈;XZÉ‹Jø—›îœÐ(È¿s'e¢²&«M²aÑþKºP&•‡r&EÏWqÿóCzZ†Y 2™[Í‘qÈÁ àœƒIük0¦’imü=öBÃNb¸Úóùü9,æRÀÆž¢´â<4Së ©›ƒ4Ì—ýTýZë@\åžJA¬‚p-çÈ`=[bèÑÛe 뉸iÎì¤îuФ¥ö°oÁzÀ¤Šq óÖJó|2·,ðÐ<ÊãÑC) s:,ÌÑJ‚ í3îÑ@_r™ä%ô5E¯(Œ8hÉ€(FRÇ„¿¦ÒÑŠ‘Ek MÏæwçß@+Ë7jûýÃjCÜŽ… ý(è%åN’„0l-?nr—~sÔw^ÖŒ^1g÷CVë|­$4Ák1òœ*Ëš†"kz1ÍîdªÄŽcÞ0¯G쪡5Ãá­øZ[1‡%SËæFJJ(.¶d}Z3úÂZF¥ö€˜(‰[Q€¾é»TFH[”¦v-ǹæªÙ‹ïheñ¯)v1@%ÛPÓ‹=½ƒ•5D\æ¨ZI{j#+0£gÑËj ÚÙ^ŸÍFõ“×”þð;HxB7{¬¢Ñyƒ[¬‚`@³Wê0¼A‚ÊUO Æb‚Ÿ0žcÿ›¶¸¹õ–²¯e¼µe·7m ðóc†‘}÷àô ^²¡¿ÂkMïËü^ ^¤‹ío†y—cz«Sjw¹zÁŸ/ Î]úD îüþu8}T¯uèÎŽpF¸Ã¨¥õx‰µ±IÛäPï°<¬@äëöGÉ+œp˜·×=“_J¤¨^’ {Pm½c|DkVï1n‰=^bOæ¬=88\žA®3GÇ6)²‡È‡geÚ´Ó”Å>b ÔЛKX‚-Ê™N0´Kž¨ëʪjsƒž ÛhxœÃu¯6°Jª7pϲY"àÂ]ÓM"oû±}5I&Q…ñqÏLî # ®Þ,Hn 9%~=ëëc†Që­KM°zp…•,zp’oÐι(+¬ ôàŒÐü’J)œþ‘Ô‚±·x€_GÔÉÙ)p¦?töM•:ªxo‹üæAi ‹µü‚ÐYõ¶ŠÔ¥{ĬtžQ¥:@Ö)Cþl¨Ps²d¶Qo#ÛΠ;Ùƒh›R7KTð]À·=ÀåOÁ¨S¿/± q†§¬a¼:Y°£'ÆO±=Ó dÕa€ï¿—¶‚»­ƒ -m½âÞ´³`€‚"€éð R@¸Rno›êSýÊðõ1ÃnÙ ðÈÛ€ #ÈÞ"ѹ eA€dwÞJ}X*¡à#ðÒÙX`e·º gÖ10c†k€F®ý¬`nã_,,eà‚ÂOH €;yôIIÖ@&Pš™%¸¿Ì„‘w3߀ÍgIæÍÒÕÑÀÖƒoÛò½šÔêß»(€ÌðOÖ¹òªÊìK¼J-Ê~nÒ2ÜIïÿ$)“´Ej|´¼¹2vÆ8X"poû$«QÏ'ÿ¹ƒ€L}ì¾MmAíÝ[Þ¡<¹"ïVÀeHÛ?&¹W´G[”Á~è÷V\)â$í!è WQÃH*@˜ y9h®0ë(HfF–m6ëhDy=¦PÅí9dæÛÆúçdÉsDrÁ“\#ò‹‹SkË”S‘»G$×'äÒŠ~¤£ü'pT J V´æ¤iáÒvO×­€[Øèøf3ÌR¤nþàW”ì&9?™GxEjÒƒ‚÷¬ k`½¬ƒìAÙ÷¥m=L^q ó+,m)µ“T ˜†f7T k WY_a`õÞ-wÆv{R­7Ó| ºÔ¯fî•ù@"@üY3WüÙÓI³§-{PmYZDzû-¸D¬Í×Ç _à1’‡50ª„&Ȍԫ'ù_ž…å› »óŠÇ+ÊxßH7oqÆ7pË”¼g#»Ò]QJÏFgÌ}G¸Qp‡•bJxE@•’g3"œ<ÚvMª™@TŒÂóMª€Õƒ-³ üm[y¯i ¾ÞQÚ(R l=@ •¾nÎ ý¶9ßøm§¥h%ÎN®Dl<‚Õ.½D€9wtnôKÆ[uÀHÐY\‡‡W)Zó¬ÚƒËÁ®"ȪýdÄ‹ÚE"«×%™«è5BsâûÃÂÓþ,ƒÊ"/þsÛËV\˜ºd^¸Ö:9ǶŸsw0}„ _0ö5(,¾Ã~ìN¸#÷ó;•+T5|i³7z`"ßl·g€âl]qY³¸Ë‚©O#hÅj¶… Ü•lô6.ìJ€Î¶(Þɨ™Œ¼“QÑØ5ø\ &ü ŸCõ »_{è+ÛŠ+t°À;X—m¤T˜sæÏ‘m“!< ¯¥ÀGYÅða}-ý×d]¤åo3êÖm8@p3XÀC¸üÍÊùRõ…à^±O?ý ª×åz&P¥:[ÒçG‡oÖêú,©²Ž;Œ5ßAì]jî¦Öv»¶§mÇ >ˆð5ìÙ†óϵ%F%@®÷/üüûÖVü³m±ùÔŠðõç0XæÁ¥gÜœªÏr]o#ˆ–”[0B, ãDiú(Ñ4: µ¦ƒP€ôÍDYÒ‡¥b¥Ýø×ÔÛÑ_϶“†¢´n•Š<—ùag$V÷ï×ýb#‚ >§)꣟áÃþ«OzŠ˜å­ª®ÿf<ˆÎ¯¸üüÑg"Ð{›Û[&³ÿõ¤ ’Ô.½ÖáþÌ“W4 áoÛÞáµîsà×ôZ[~WNwÞ(œWÊ.wÝÞÿúhK¼næõµÄ¸Pª;¶·uE/Ïvoc…¼Ú[o÷‡L­i0øÚÎuzØž±y(ØzPrW:JklÕêÒÀ›±ý oÁê¤KicÀü|@Ñf4ž@#“ŒÖFöyË¢•Ÿ¦%UÍ\9ài>›AÚ„Iîëc†Ïe›†k'SM®né“á*KŸ€"@ÁAr<Zél}Z€ÿþ»¶“Üo{ðõw½åÃÈ9§–ÑÖ–¦ÕÖ–c¨+Ju6à&²0¾¨Ø…Û'¸÷mú,e”–ŸÃ|ý5umÿ˜:…ÖLë³µ¶¤Ásï¦ñ&‚÷& Œó­#HBº€Ÿ_cžr­J l=ø¦­dJ­•€–üqŒ«3C–­¼W#øF¾>fÌýºÛw‚ŸoèJW4²§_Qø­+“ê“’íèb‘8}Ôd1nHM@×?Ju-P^9Ù›$‹úiÔY(ÓãŽb}ËÛ(RQ„²ëm ÷n}®KÐïN»¯W¢[îþŬXtö€žÑ©â0ý ¬Gº%TÇòaùÅ~¥ùq¬ŽÆØž©å4®¯À–ù Ë ö Ÿ]× ¯ó”=>=¯Á ovñäÍ :­ [„6¹Ò+[”Œ p ÜÞŸNÇ}Fødô`„ß¼¦'Á~3™Úr`XÖWG[ýî ~ÓÖÌÍÖpÒCz[Θt¥ÚpMÎÙÎÊí_ûéJ“‰a÷ÍB(#¯¹K·–Ø¢ÀÈW¡h†9©HyŸ\­V ç|ß‹ Ï" à×´„Z[‚{Ôù˜A¯˜ £OöÌ-ôÑé4 Ü¥V4ˆ|¿Ìó%s[†´È£4¨GV1A"AX3XAEòfÁ$ŸQÀ#‹Öi\TiCµYÉШ{#`Í­œ#9¯ƒ^@î¯iÒ]e4©9#j`®¨¹4ž”ÛNDv¬ž|m9cýí"¥Œî.wÐP÷½åÊÃIXoV¡Ôy€¶3¸1Ó¢Ãù°Á8?Ÿ]IDßÇë[ð*sÔ?´Eoû¬8Oº‹|{ýÛ ÈyÐ^¡æ—¼ní|Ò­Û *œ^Ó¾ìÁ]Ì•*À¬¹ãímŸ:9 güûü˜'( ûÔ8Ê’ÁÓ¨½ Ó”«¶"µZú„û|pÌf“I*—@¾\ ÒVÁ”šÚiŸ ‹‚2 tÑ9˜Çÿ ¿µ%ؤØzPŽ`·ì{^ûè^ +œ¡¥ ¶MÀ½pÙ} Ö~´3Àµõ M¤VyÓ`碀õÈblk¹¶û! Я ú ®7+Gõ¶f· Ä£>?ºÜÚRÿôúëM·ßö0='{:AÞåÎ#à4²_÷øÅÚW(°}…gÇÔ[Ÿ”ˆ×¥h½‚±&@ó±ZÌöýë¿þׇ/3ËÅqõÐíõµOÃŽýõ×xý1^êÁz#vÛzt‘1Ô3Œ<€ƒt” Øupßðýö´[-0s8<*6ê ;!æyÒ¿€ûò‚V°Ë©ZXÊÞ Qç¹` .±¡töN— æ_˹9(€ôÝùa<ˆLôGeY+üÓÀV.øœ–K°Ç•í޹ུ Àˆí¸fKîäeOAÎb šAÊàAðZêñ@ã eOQ¥Éva”Ó±ðÓ`±ç~ÍñÉѪãjmÉSÐBr®ˆçÀ“,5ž›˜ŸnK W‹H¹“jlË0r/)§\‡Qñ¹~ÒÉ)·–2äì‘ôÅèÑd[NzÁ3,£”pÖ6Bm„μ¤rÌõˆH›Øn””®ÃŒå»XáÎ@”Ò¶PÖH\70™BÍù[®QƒØÌF Å'3(¯p3zä:’ëÔJ‚^ÿ[¬PóW¨z:6Õƒªfc‘E1?õéÆ s GTŒñCÙO¾Âˆÿމt’ÈÁh/ŸŒ–Å®íD#Kz™ŒQs-«»ÆvhU‘¶‹ñŒwò/‘ƒÖÀâÊTË©m `=óp#FñH"»;ª›QÀ@‘˜;I’­F$˜±,;qsa`¼øM®ª„ûìÉ¥vgQ Y s‚!`*4²“yœÕZ©cÁjN2“ó×àð²Ý"p§¨‰bQÊJå¡ ¾êªØ³"íË0ð•YÌÉs¡ ™Ÿ6ñó…úú½FôY´=Pˆ¬h–D¨R:ÉóÁu7 øVjÑZ=¬…ë0ª<ÌÚöRrã`N0ò ¾°cU‹ÎBa"ÈA_¡@¥µ²ºP^Œ+jGtöNb[Ažm!Ý^:ÝAj¸:ÕÌ)61£(“ ]¹¶ÀLb®O¬Ã¸R:ßöˆáà@ýÇš„d•Š…Œì‚1µ£D‘:Ýûñz ¿/¾ÛUžæÜH˜ÚQÊÆê®¬[KF,FÐAöàõßË# 1ay]v«ª'J·Œúb¿ÞzøGƤkZë±ÁdtmDD&ÁÏ¿iû øö¨¹\)”ºì±ã™@üžÓõè„Ëâ £žÜKÀs­Óaß;0’Áidå[ ³ÚŸ{zƒšÉhə̶à¼j§«{â°_) 8¤ê\*i›ÌLÒÕ˯ŸÓ\¸ŒvlËQ-lÝj€©(ïet‰õò}ñ×Yõ^ÆÈ/}ƒ@j¹vn#àº70jž,îc¿w.±xÖ>2âŸP_¾PðRõ5x‡³¿€±æap²hï]Õ LÀV\el-¥&*˜YüõuWZжÆûRÁíj^Ë2rX]'j5sk²Zy]ð×ç·ˆN”C¶˜¸ŒÊv6SΟJ»`±MS”¢YQVÌ‘Á„m6ÏÀ'ÜxˆÑÜ2‘,ÈîY:9^áaY1Ââ*`g ÿ‚Ð71ÇÖõ¤Š7ËeÎB°·ƒ …(y@,Þ1q´ ìWÄ=y´N_4éªBÀÁÏhÑ”°Ydul¦Q_aüY’ƒÔv”eÛ+^:j³ÙgBÖ’¥èLGeVæŸNÒUÑHËÉ­„Ê΂åbÑxLýV©Ü%t6ú°bä F¯ÝU‚±=îäñ°3î¸û!8Ÿ†·\ (î6‹ºßYE\@δq&r‚{Ìo™]µ@´¶,&™ö#‹ª-Öm˜E,h¿ÏZÎã>ßÚb7—*àjq¿æ=HABÑÓçÊ\€-‚$fs§MÈÓ ÊZó»È%ùÇž·Wn) àÃ;Ë«WNØé#°mèÉ—‘¯xƒ©¨³âµ/NZ>ÙÌð•ÆŽ•,š ¥.…¢Mg,ZrÆìj3f$\âÕ©˜œHPËî¹G ƒ†NÅ#©8…QÏåä@|ü{¬ût¨í¬È£òócn‹z¡ž[âyÓžNvIPªÅE2M1u» {Té&ࢢñÓWkÁ°ˆîÇÁMn#Hàçt¬-J0[‰*vfRiíÜfçNƒÑÏ:Èae÷o$©¯IVx*˜©åÆQ ¬[ ¦’ÝÕ׎¿3Iàæç™Wm\-}ö:ËÚÀó𠦎¬àX.1W¤\éî Úƒ¼”w%[áT,ê¬Güü˜ÇVp`DG®AlçúÉBU¦XÔ€{ÂC€ÏΫn*Ôhú,øª‡áªÓA”Žol¹"@t€¼þ*XôÃéªü•[*Õ­N)_Ü`VSoà’Æ_Ê ,MøÐ!ÎRãj]e@/P‰fmÛ˜îòXqíXwi®äFZ[Aî’ºm´“NAßÑS7é&éèÜå·\óY½'Õáä˜Ü F ›æA§ ^à ž±ÑŲFˆ/Ê™ÇYÜÉëHí,rƒ…ÙQÛãòŽrÆ”"waËÈá“*')ÕãÎSq%`hrë@[Py:¸x‡×‰ç2ð+Ãà óéÆ:(1 {pf’Iù«ô@ÁûXgÐ.×ý¦]™;ð8ø°sÁÀ¤ÎûìA÷é 3£ê‡ÉX©únªÊ¸k ¤v¥,~ÿaFÇ YOõ ¹@µ¯§d³IÇpõn¤´+rgý΂ªõ»£¼òªß¹Ò7Ô¾Yk$(£ âJúw¢=<æ@pQjƒåCð…1ô‹DÁ^¹ŒŠ¾žíó,G~„‚ÁÓÚæmçGyK ¨‡¥€z­F„Ð$€A+: ¤míÍ”ä­pƒ1©¶ŽŒúi‘B9çCÊbÜB“jñ1ëµ Yt¦Ö¯Õl±4'Éæ’RÁä¾õ `PÖëÃ^;˵ßS·î¨†Ì1 ËÖ 06×?&ëÈÈbGc †/ă§ðÉï°Äá{ádvF™X" .[V™8¡,AadnöyÔkç¯Ãm¹: ®$–vá®/kè¼,œ†±õ¾~Mòؘ²Á¹¾ÖVGì ¼x.æóŸ"ÌÍÄå–YØãÖ%Ãë¾K»QÁϳÌÌQ¸ä£ÌU)Û;¶çangl;ƒÇ-FìôëF缬eû Ò¨Ek ¬rb_q¦v™‹cÍ&Ázƒ¤“ÄVg¹~Ãä,Z‚BÎ&/'̞ܛG&¨Õ<&È•4‚ßψ]G(hŸ¹2vô`Ü5%`EèiÚ`-èó>™¬/n¾g°|ŽLîBC€ój¬Ó³FÜo"±døúÿs«ª¯®€°¡‚Œú%ó])Àk©õ!PpÝ÷<"ª‚"Š+áX7øÌཛྷכ«½óàÛ €›QlÐÓ{ö‹;2¶(‚œGœ{´¶3Á6€ãœŽªÕ<üÉÙ[°ÆÉ,{/IdqªåÆÉ‰ü…78jΟâRä,¶nõÙ s|„£ÊõøW,[®«D@vÜe?¶i`°¾0^7•ù# ʺ-#´jšGW˜[&;Âêª-ˆ‹™,*+³ókZ 2i¯ã9dîõ`Û«/ð\0½¯‘„Ô8'Œ™©ß†Ž2¢²³Ç·o$i>È[|G‹ˆYgMy‡aïü5=e¾4£GÀOüúu|FÅA„'äÄÂà¯mœIj–yððÃg¦7ƒÖ¶+IqÂg»Ž÷¿Á™TZ`m0 ¼ž!¹*¹êQoÖÀ庛T ®¢Ôž°ôÑóš¶³ù%'ùƒv³ùí:]sfîú ÀÓÞ BHÇØI”½¨Û”n,ƒs¹ß¥®,êi±Ëzõe³ô€kôÈËb!~BÈ;e3ÛŒŠ4¦L“Jص(àÜãDØ£¦"¤Ž8¾PNR· §ŸŸ¿Ùƒóff%Oá½Ùv¿Î·øò¦ö¶Žp›ˆ÷†äÐÑ«Û ×KßN-!nYOgÚB‡›{{ÉÚ®Ñõ•ÍkEß³j²™qMjŒ¥ÃÝë1 ØQÛϳ€¯ÔáoÛ ŽnR[ª·ÔÄdÝ­i—‘E¦ãrmh›é–K&À4ß r*gÞ±»­°nŽJßë\¦µ]”–ýAJ}fÛ58ó\²‘,|S½sG7gØÝ{ nÉQ”ÚU|œÔ¹#/‡¼sC.ô»–ßagþöµYßó“·ý¹fl¹NÁx½ÔA‰íÈ“ç*¶0ôºNW 3Æ'çÙ.½>²|Æ•aþV`¸S ”³Ž,îzü`˜b“ª-Qî…¶Km÷--?û ð½€@·‰å p&=(:ìÂAÛ@~µöÉ›ÉõÞ&í1™¿j§nöÆÍÓChnjʉ®GRª€vÃ’?7š-²¼ŒÎå2jÕ¶sü@Í`£‘…6’:r“–Z6²“Ñt›TQÞ×û[òYU¤H'È¢&R™”jSž¥3?$¨/CUmë]@ù –©±IÕV­`nê? øöa´µÉ+¨¹Ñ^÷xÞÇ0­éIÿR+ܾ֯÷u¥’ÃÍlu¬$„”ˆ‹Æ×4Êö/mË!.-Õ§/7B:¶‚[¿6<ÌŸ3Lotéüh »)§¥xOd•‹zƒküîî—‹€ØÑÀ ì°ÑŠäV£`φ)ú ‡0ÏÕ¼Uµ „ºÞkü‚tà4°â2j—gÕ7= Ê¡/GŽD4ôۦ߂ ç[}.90ëÃÊf¨,Ù e´k3¬x™œYÂÒõi HíãQ­(b‡ÓºÅˆf0 Æ?¬o ¯û¸F/è¸ô†•% Í‹®û†çŠ0‡ýȬiT²¥»±Ê§€Ê9yÐý6aúúè[©¹7;Y‚}!k¤b'Ù¿Ëe»×‘#È7¨è ù.£2eyYì"7K†*X!œ¹™6Oríp*“qQ™k\Ò’^GÃÙŠfsÛ¢À‘FÿÜJZÝUØC~üd›y âÅȹ›”h5ܸëQ;V6¦Ü"%vO¿­¸óõu·âí¨ñÊèÁZ]€Á;#I{a_’¨’â8wÑP{œDvjÛ ¶¬=®U”9©µ¥®žºqµÐg¿= êh!ÃnÜh+‚Ô”º”µÐÿâË`´M•·Y¦ÀÔîÞSZô·Ìz‹'R~„ JWPJ0{oǹûÕªÃN÷H¦@›òÁv€ñÿÇZÆÈ6õü|¾/ëMNÕðbƒ \óYdd©¨~YµÕÕZõ™ü sP h;ŠŠïVk7¯¤+µ¬„‘;I•FZ)ÛŒ÷€wøòíూ79uä"4?àö Y‚ì¥ $?±P‡„¼+¯2:&9%}C=Ê]P?ÏŒ”Þ2³WÊ/)DeþöÒö, ÆhŠLª ¯Ñ•é/GZt—›¼ô–Á3gF>æ£Âñ•¤Òƒô[ISù­ZO‡‘kÓÁ¦Ç&õIGÆiJ¶O…n4Œ÷ÍGq 84Ò_JfR3‘ËÃ$±ˆNÍ@ØÞkÏ7Ĥ1‚ «ÐT™ÄVkrY0´Ç+|Ò%{vHÝÅßÌdûúhÑá÷²z[3r^LA©?Ùä…0Å.^Éø|Ø/¦d†^Œà¬`“.e¡“»Œœ" gÛ0#rOãÖ²ÙÌ,€¹]/ðØ‹'áu§‚Ü Ï†¹2^œDN´°<ò²Pð`Ñ<‘(!©} 2€µR"%ÔUG63cz´­@\­ö`®èj2ZW_áÒ†.à$ÿC0!8¼êÉt•{cV§¾äR ·•Á7Ãö m¸3 7@~ ÈñAn®%§s€)ÓGêe}×Ræžðè¼,ÅcuGÞúš!Ïu$™€õ*‹ªw\k¤ìáD?|Ò'uSóÑ;¿cþ?Ë¿þ×G‹Ïe>òŸ€¹Ð¤ž½Þž9ÌÄß#â;|$3\ƃfÏ 9ÑËä̃\wR|xtl¥7ð•´êu:^…‰šÔÑöf(/“^[êòŽð$‡GV$Úƒ#ÆÁ=Kô<÷Að®œÁ‰|[–*68rà¼^Øo§äé ›v·>Ñ”9Â’þ]åaÖÌ/ü> az[Öh{uöÜ!Àí =½Rù ¸|IéâŸ+“Ò ›æ€MdX‚9I‹kÃS±°;“—®‡±þ½Æ¹þ#Ësl ÉØ… Üóͦ|~ü¿ÿõ¿q/ËõóÿÄ9Ï´Î#9îÌAqðDcI–â‚Ò|kƒ9Ä8{~ÄFA#rx)X;YôMKv’Úà( ¬}7ct×Ë0Š&€Ñ}×ËøÝ!3´ ¥þŸ.·µ O¯ã\ßÁLÝÿA@é‘ò ùÃ~ýüº"àgÇ)a­· ÅHðß3,½eÇXݪ3MÖ¾.¥þðÉÛôرáÕ©*SIz  ¼nr˜i[dêxUW?UKÅ–ø)ÏjÆOçz)Ã" sÌT³`&SÓï$ó«tÁŠ€“­áÐÖ¥þŸoû0÷6Áz/,ýùu¼Û®ôp§iÇ7[•mcÿW¥àkycœåNü ØíŸ ø®u?ö"‘,p‹ÃþÆ–ˆbK‚º¨8H°î»é8ݹåEК ™¸Ñëåý³Sñ•À³€oA¿|ÁÚRc‘ºà€‡Ýabü¥Wíè9[Ýhp*‡i.bÛ_z[È!å„QÛàýIs¥V¾i)‡ã‰¨ÈÉÜó‚½Hé/5w\KÓ&îüt÷Yñ(„_Úå¹ÞÿšÁ |ìeXyû-YXaÏmIeÖZ:8oŠk]'‹ÍµA%R̈´¶u#œÚÏÉvkìZ¬Å“ök¶œìפÇú¥nb–ê -ÑÙø{Ñàþ8À3xŸ÷ ·T‡Éi'k ;pîØŠûǽÔ5À»¸¥¦ n4RëäÆp¾§co4 vêNít,uyÙï7_àçÔƒäqRÛÓòßQÐW66MÝZ‚À°ìÁÀ&{²´dì¬a¤¹Ë IŸç\S³!¼òj!ûf#¼²QKUäª0C Û¨j+z|‹n•<ª„çó߯!]*Øž¾>fØUþ?&¤Ý€©Ù䥿ž±?¢ßÉ(”‚˜4Tª‹Z+h‰æ ¸m9¶M@UÉúUîÐ>]jj,éxMôzÂñGŸo„Ûñóxf5§:“^ðŠZHÛÝÀôkœælo[à2‘&šLp]q9† æôî¯_F_7/ß‚Z®šjz£BÓO¿Ç|!È@ãѶ ÿÌjŸz#‰~ýþheÂ|qj÷·ª¾Ê'¨aÍWÕï²,gÍ ÌÍ뮜šÔŠfO¶GîÚ“g€{ü Ž;yǡ¤¨F½í· »pò.\#®ëý¨n‡ÔtôñD¬øÜ2š'G;ªyʳ"KÒLÕ@þçM±Èøújk:Ïäj&8ŸžàœìcpTz "ZΛ¼n­ûrÑêxÉü²d¶óœ–miµËvµìZÛEjÎy9OûA*ÌA®ÚI@Áò°³[µ˜Û+ärìm¿a¶œàëm Ìn)(¯Ö}Ý@˜ fìm)²Í¶yÀÞ¦}M™Êyv›OP›OéÈr,•’-' ‹‘5Zv(ï}Ÿ·n_ ¡úsëÀMéÕt9°#çµÌ{—É­z¹WcZŸqyÖ£Zrh—‘²«ûÅ…¿/øZ÷ùâÒ@>à¬×-IÀ´‡wл5ï§Ò¶Fº®N¥­Ä@MèËB®·á“ø¡ÿ3f¥ /”íMä¤à÷—¶µéÕíU6½V ¦%.µ¿?æÖ¤P™Ý@®½—Ùû€E4,Ðëd z`~”‘+6{@¸õ@oûÚR.ö*×áöÅ´Pl–œG]5-”!§ ÈcBÛ*˜=PÐßëó" u‹# “ ‘½½#©m:¤…©U{P8«=”Õ§Yˆ8ˆ#\ó ŽªxQŸQÊEØzPox½[ÿî‡uoû-È/ÁÏ7¤l`¹ôØ8~1)ÚV¿Øþ¤36A|ÆI]`Ûß] P;YÙ%ezäÜWC¬:í8Vù¨É#¢K/íëÄÍ–µ/\xaJ¿–`P£¯­ _‚Y¸ƒ ùß´U©Û¶]ß±‚sWRðÛ7óAœ¼M½-®ò}Àke£xò¦²¨´¾î­á›5Ú ãTº*|S'¨ƒóVõí¼ýaåøÒûz[9¹Q¼-ÓÿL[{[þÐ6 aáŸnèjã®­ªµ+y]™yWŠÊ2ým£LC_v9ÝnÙ­>ÜòV%à .ÿI£&ÜW£ wÍìH“ÃN¿—‚ùÁ ¼5•µæ¬È%ªS.×ç]`¬Ø#{Gúsu-®A°Rkñ †5„´±D’d/i¶prµLºOÁ¢Ž(H©ÉŽÐ«1Uð™(Oå„£žôKp-.¤¼R¢¾UPè¤B)œ¤¦Ym¢?U%ÍøyòO–ö^ô²¡æÿòž'ëgÔ…¢‚xäòÑ~îà¿n›¼»D¼ÁxXFÉõÇÒn"Cl E;ÈûSx3ø…·þ߀ß$Æ€bî ¤hä \Ô÷Û‡€p'ôàù¦’«eé¹h ß7?ß|Ó¶õ Àº^ˈÕMºõV¤²e{…šºIËÈxò<"Î…®O@Dš•ëX³-b×ÄZ&Ô²VœVXIô?|ÀèAFÚ‰ÑÖâQ-£ŒƒEé¨nކÂnÝ0s^ü…– ùL—†„@~¥ÕÛRož{² WSqçHK8‰ØQPZê ü  Z–C) ëÔ#Uì™úkLaWäP#.ó²2^V‰ÈŸÀ‘é— ÎJS51dÂØVLM Yr51šÔifS7ˆ¶º8áËô¾kp¾rn—aRÞK–\ÍÁö õäaõˆxSîá œû–‚nFýëcîM®òÈO®fÔ熪 oÔ½ MrìÖk ¿˜ZÊÚîMw´l};+ u0+K鱂ó. à.TKYRâ°äQU'Xž uÒ}s¨Ê³¿9~ëìÔSº°´§·|™“*>]Õ‰Œ§¡š¿Ïèª)¿ßÔÑsb/ –Ô%…iÌ ,íIø»U@²gÿ i}Ûƒ,„ØöÔ ¸j·ÄóBØ@Q©N=.®fÐJmSƒGÈÖ—–+ª«ç-QÁ¼%*(·ÄT˜U;O÷´sªîd»4h‘ͼ¶Ôåñ~µKƒEäß×Û­C‚› ܪ:lÝ~7-/K¢·& ºei ¨â¡Zµ/iʤj_Ý/Xe3@TZe½ùÕö›g!¾«? C0_{ö¬z.à–eÿä]Iø~·6X°u’V±-ê4þj/€üŠì­¨Þn,¢¦scpoNÄûf8[~„Œ~è 'bmëcðûcnCCº ä²È%†kšÄà (•"s1ò3RRŒX+r9=j?áô˜6: ¾k Wˆ€1çßGœ^”bØx€}~Ì-y?ìÇÖ;=—Ô2`ÔÖ/"ó”h×–¬‡™;têCUÓö}@ûïkaIK€ó·km äì‘¿KùîÖÖg{ÛÌ þç£`Íöº£k2H•3£Um}eô7«E(Ÿz cüÜÛ5’Kú›­Á[úï~v cݧ5´˜Enï ¶Õ ®{ZöêÑiq,©V7«ÝÖ*&t?´Å½Kâ…¥%¬ŽÓÝ@œ_uGëwËR.¯ SPXš&7‹Oü#èVýÉÔ!z  xù ä&Õ”éºÍ‰.\·9Qçë>©†S¹{–áT4©eú]@*ÞuÑHs Íò°Ì-3¯ä¼¶èæJ›U#kšfôJSà¢Kªu)éR~Y\ÁòïH©èRÒ먤ÿÕ{[TÞ¬ü;R“I§‡:(»º¶Mg¸Tìâ+„€Ìç­×•tàúbR‘N óR³¤nEZhx© ³ŠY\ê]]’Xµ’·LÑ«šÄ°â÷,?œðÞ+Ü%¡YÎ1¬qÉEÞ?B:7ô#¤'¥WÒÆæõMym~E~ñrUÕÝjk´²æ\ùÓd&7©,®>²Ó&“¶|@açÔã¦zPú¤–xw•¿‡M²Xçó+c¥=èHu.÷ö$l1ýçfnLCùô4ˆ6¬÷r2²ê¡DÖÝQ@(ŸsÛ<ìsÛ¤€É:§zgµ 5·ãv«.«ŸÜÀE*Àÿ]ÛInõö(DåÉÃC{[gZÓÓK9im LíªÀöº%·nÛeŒTÝ»ºµƒÀd–ÛvÀkµôZãü Ð1ÿ˜NvÑéK øôMœr©rXQ¥‡ê|6/5•Ì„šMýªÚR%/]ŒŠþ_ÝJJ¡cÂöyÚzO¦S(ï_Óï¯ÿ®¾BmŒ´/ì0îÿÉëÕšBdÓ¼Üà8ÇTIT{ŸƒÊןg‘Ü>j¼¶Ïc›¬òœTà Î[ËV®$µ¬AB5o2" 6C¹§Ô^¨¦¤ A7´òQm!TÇZÛóR¤ ¯Žy d)Ö+4}ݵ̬¶ÍG{+=˜^–ÇOyXh²ûÖé+Eá9©3EU«<'U)HU6Ò+ÚŽj ¥‰>¯šQjÞª5%VÕ4-µµ*bVʦfl®TìVß|‡ï‘»øû¢ŠA ÿJylºÄ+KÉk Eè0" :(= ˆG}~|Û±?¦7˨íXúîºÜt|õ7“¶¨úÝ¥ò#L+øÛ¶ß‚ 1Üôœ©âÜ@Îq§©–/˹¬Þ°¬! GÕ´Â*È[.u£R@\ÔfOgÅs·¶ß‚r,?6Úþþ˜ûÀÐm¹–-5á_‹¡7¹oˆ§N±ªÌR—Ò6~Øaèû“ëz eÓáÚøýѶ@H–VÝæÚ2¬/-«H??bl¤Î0çÄ|q“©¢ ÌµÝ!Lܵd¹|;YßÖûrùF@zªµ¥8æUnºÅuq§_]· ñ«ëîаmú¿û>"c%õ²P£JÍ¢ŽìÁ' $áY@¾‚¶ô€ƒèA’ÌT½T•:µjÀ¶rÿW0oÐ Žt –bwšmvëwåÓ>翚µå4:ÕëÉ_ÃÞr^Y ©ì"§9Ñ®Ù`.´ „¬ËþHšÝ2Áða]*l´@tÃB·•ˆÐ²t ôÇ!¤ù<ƒ~uYuP¬*¿à„óï Ê-—â9’¿¸œð Ÿ$bÃT@ú/OãNÍ(2¸? R@Áù éò>‡’¯Â­ÚÇ =ü* CôÊ 1ðm÷¶î¨æÔÀà RÍžeémz×;ï:Aú¶éònméo=(pÝ%ž†j Äc^Ä=Wøü˜Ûzþø˜['tIo+Їk):–1P§4gP6¶& Öhpel"¨†è£XõŸsÇIˆK«(i»H<9 VļW‘O²9UìÁOˆ²¹»MÌ‚ôÑWD.Ì ¼ªàQæÍ0Ââ÷ì­› ÑHž:‚ñÂE'm+/ìuß™mß‘ç}Á”…tµzK ˆ"_’ïf`ø•ü!£ÀoK˜ëpš²Œhû†A1m|[\†ïɯ°“½,Qe‹‹‘ÙaOåÇü„} ÄËê^J£Û÷`‹2R8 i7¬ø‘—M#%lqÍ.ÀÛþžŒé©”¨¦ruª%CB†Õæ¾e5/¤Š(ÑGÔF'›Ã >Îu Jª¥š=(8îé ‘ÐÞÂpŸ˜¼&rãþþçpDé ¡òt¸g:ßAº»áƒE5ƒA™\šÉ¢ì ­-í0bÇ(W·ÉaÏûß/uwìj"5O(ܲ~´¼®ô  9"µ¬Fí¾®mó¾ž1A¤ÝGoËbqZe–cŠôQ›En4«IYs^›Í¦$¤ 19â$þ‚݇A*GW—GÀ2æ’ýùÑÍ9¦+#,sñ;ˆ´}vëó£·mF"D}÷ A‘=x7=¥€z]ÙzY€´}}Û–Æ/|&tÒÐ&6žú8b5)›^›µõÉe~ýÖœqûÔüJ³`™[Ê,™KDAšGšµRÖM­†¶ô¹H%Úª–3Œ \xܧÚÞËØÏŒ÷ÒÐQÉ€è02 \YÞ®ƒ\Ö Ñ~ªtCxÞï”p#=–Ä>^¦øÌÐÑ£NÒ³º7€þ:™óz¯Ž‹iSžÑOJ7hž*’= Dñ©•¯’N)tB×.ý¢§'[Átš—~×ìVgÀY™Îø…JÔ¹\ bªñ‹–Ž)þñ-†höÌ*ŒuÏkyQjE©º¿iûÇGW~3£^ÛŠž­ ;—¿&íVà:Í-¼vaa½V) ;@ý¼a¸©›®uóº†ût«’[‚Þ)åBðC[^‹åcé­V^¿®eMª_öþúhk¯…ûSñ6èµ:©¶ArbëXm¬Lnƒê›]ñ\s¬q3,úk°®×ÖAù*‰­r“üZ/Æ" îÕèïàƒ•[ïÛ ,©IëýcÛoÁéQ¼ÆÃ ÐÛî(D–Äâ½¥×™íYs¥,jˆè J‰¹ˆwÙ¬ ¢R¥‚G‡¡q¨€*'jEæê“g98H%õ±3ËMgZÖC—]V<Ñé-r-i¹àËëÖõ¾Ê»ô–YùF–XUr‘Ũrçì=Èõ¬=PÒ-> àdŒè¯Ë¶R¾¯Æ@Š ª©+¨ ßRÿóÖ6¿Ø?‚Þƒ÷Þf Á¾X}[oÉ9Ãé‘•,µm–kÔAD¹Æù“gmHÝþPK³K5…û¸óØÛ¨[Ú?.ë{Êüž3cU3ÊVð‰ó>C¹XK¶i!Üq'ã¶­Âfw]Ãõ­¼–è¼Wg«):ÛßT Ôê¸î~sûN€Ã̺¹:],#Ë¥ÕLnm ¼®{Òmì0»Îc>. ·Eóèd‚_½þŽ÷9=,ëËÔ°—Ù‘ú Ô˜*t,_‘mgÐ+Q@Áò°’ú ˆ¾RE”žu‘úxN®Çj"AÉ`¸Ç¬rKÅÈÁ.gqÒר¦¶YÈ[ ÒÖ†ðjÖuU5\AÔ"§€‚%–©@Ô"×µp~…&€Ýº˜Û¥Þu%Èëá¸}X=÷q½…cýÔö[°õ—ªÝ.×¢Â`ifÃ}9óZ3$‹ÊÏRQ=^l£Z~¾?ì®@X1;ˆÜóT>°„n™r;¦d…²¯OPö”í[–Ñ’ú(ð‰»i\C‡Y šÉ «we‡u˜9o} fá:ºÔ0Pd¦r¸ã¨l˸ÞÏ+ü}Dyg[µ·fËw,ÚF<“5‹†a9ò{&ŒÒ‘p`*Ï}¢°3øÜ.Æ™…u³4÷½Â×µ.“ài:1Ø‹ªÑ3Ûªá$[¾ ÷`V\¤dx›Ã»ƒæ•]Ê CƒÏuŒ·¶¨šÜ[ÞÇ]”…KÛ›À0u%Øí)·ƒ+™–ÍÀ=KCeü™Á,G’68Ç5†µnxu»ëN#Ûþ0Ì£ Î=hm \Q¥~=¥€’;˜1¡=8—óy{ÐM©Ãj‰"à‘pcµ»8Êú1Ôm¬¯“õ¾8ë—°Z]‡R®|¯Ï{Û5ŸÚ£Þ{ǤmÄàýÞ¼Êþ(€ êUÏà¾^U¡9lÄ6^÷–,ªÁŸaKFJÚ6§yHëjÂ}Êì®Ý ­º5 v÷_ßzÌþ”Žîrp+róåFiù,ðœ2w¸YyaHyXs÷æön´„û™ðx_Wþ>„‰Î˜ü¼ÀÓ’Ž¾Þžïz~¸_w§AÈ–ý4x9.¶´_ªùV%ôáÕ–=ÀùN±½äžÓ5XÕüº¾˜Ý~¯ÛyÁ×ÓM^/%y[ë—’²Z²ù>ÛŸêj(¶²¸„Ò¨E˜m—Œ$b¼ ˜‘~il/ìaÓÊ@ œ!^ñÓAĤ€oÛ~+uêÁ×G‡_w¥qÞÿú¾ÒÙƒÇ,šÍ–!ãRF‹ºcCsîí×ÛþðÌͯP&ù ?€n:¢qÑPڶ̘ø‡(±2b¶TìÒA—aSª‚eÓjri’K,lZ}´¤²xo+fÌol›j‡-»žÌoéAlÛpK´mZWkd¿£ï, L“2•Åè[“-cGVbuÆ6Ò"ß[fYú¾Æ²š¤‚Y¾S»÷üœƒk»w¶6UæñÜoý—'e&}¿4¬‘`Ð8ÐoÚŠï¡ZüD^zÚä)P<%5¬Íȯp~C »¥öéç„ù¤T5/KÊÄ^Ÿ:‹jdÿêÞuç’å¸{‚~‡þc@’ÝTÞ/6üCúd4nc Ë:VÃ0r‹ÖÈ8Mò øö®ˆX+"kïý‘òi‡Ô9±ëËʪÊKäŠ+Þm€ˆïñ¾Ž8…“Vïpš½·AÛ=º­ÂøöáñZŸIN›½w‹·:Aë›ÙޏÙ͸#Çr/üXû¢Çz·Â•ìAjZׂKý½cSˆ‡…‘ïàåµaômél@/1ò?m¦il[¬ýÇG³ÑŸ®+¶ÂØ(έ46¤x,_:ÂÉ9£º7óÑUz>GŸÎ;÷§ß=}m£pÿk: ç•aã6íÐóŸ3þ}ùeÓŠ¦žê:¤mÆ´ªý¢Ô§-!òÐŽ%.ZÅ•l KDì±—­†QGås|Æ»ñœ.íi,• ` \ŽpjˆO$\FÍÚx4¶Ì™©e6@sDŸ/£Eñ<:Lù¶?.–-qÞÔ¼‚Ø£qRcß>²d£n€bÍt0ÅX¬^¡ð.ÌëIö|7 ÂÞ¬êÝm×iÿ§1”9ä8𔀽E?ßb€B¼³TÕS¼½ø§˜ÛVVöýZ#š-?Ët¥ñ±ÛµadˆûfŒxú­]½ö3ÌÙ²“õf$4;5ð´æf@ÀŒDó2o+.:]ar®<nq6¨QìG£Íl@cjÖ褫Õ="ÓÇ­_³dI² ‹qZ|óÑx-yåc`åÖÀõ!4e]Ðr ~˜±Ž^î`»7 Æ™;N="–¤Õ6’†gÉu—QÓß# ÍÂŒ •GªÏF>.ŒÏ ~¯Ý3[R×eÔ´þn[õX=¼mÆ¢Ž0ôuÑuh^ë-Û ?͈މQ“:Î(òݸ<£wJuï3»ÆFºÄ$s7¿iLèQxLRÿ^òÿlØæb(3Í3òh«¯7gÔF:ßÐ@² `„k—j&¥3XjÆeÆ3zš=‚zï­^{71\1£>ˆâE±C¦H¨¬ÇCº±,Î0´\Û»¾ÚóqÃxí,€/E¾ÚÒ!”nLQIØ„Z‡a"ÏÕmnf_¶qÿ}x4#â~7"6/ÆuØ?ŽkIûüfd«’8Qõ­œD1›ÀÀA¸_ zÁ½U§"ˆ9=Ò^oàdˆíÞ8æAtkiÉÇ#8ã]ã¶ø¢U6 ñãÍLdá]ã­aö©|Á(¹ßJoO ׆1åúhÜüíé¤K%ﮩŠÎô÷?7BÎc×ßܘEQà$äðö¼6(9÷í6m¥BaÉUa$R0j[O׆Ñ[½ü‡©XÑ{=¢ÏóÍ>=€"º+Qè3ÌwãÑêiœ#ϧ€ÁÜov3Žl+Œo¯M¦öuÂ=·:©FG²t[úáéZ¦¢] `ŸnØÒ Mwpꂯ׼Â-î:^v „]_¯¥rG'¯;â™ÍÑøÍ×F£7#ïÿР¹ûµ4Ûê´Ï—bw„ _Yø:îIëÁÞŠ§35ýïEž”°ì¢iׇ/á‹BéqܽÕDïQÎ,ÎêF;ÖßåÂŽkCÌïSÌ×'ä>Ë™QØÅ…C6ð×!d²QñÖë Ÿ­†°˜ã.XÃdÔÑuñÚ£ÕÄ ¸Ûep؃v|èö $é¦+hVèŠDvèrçÆ;üyH þzÈ |KµâC‹\Ì ²ã.«õŽ‘H¯ë&=7pô€×ºjѽW8ºw \bÔÂ8§LTÀÒ®IEA› JSŸÿÐå ß_Œ=BgMíófÄËŒ·º£ðbÍÆññ7£è7a¯@{ÏÞ: x(]Ãð̾›¡8ãùnÆc qÇ0ŒYàÂQÇ<nv3²[0¾}x4³úП6zQ÷{ŠÌËnñaâQ3ûpCC÷8u êÜHáuçN5~â`Ý·ÇSª"~ºšÂ >8‹'‘¨Œuß:|öSÐøðïCOœY§?ÉA–ã sœÚâJ?³G5cvžXœ§wx…áMr~SE^ñ›HÎ ¥åšìI”åwÉ]lצW®¹* õ-gjÍ7a;id§\ïF|(›oäf16è`‰±W‹j4É–Ih@©4úN.³¥z]ç“ë›Ø÷ku"üZ3V™äÊéb-Ûñë2'ÑÊüh6«‹1òf¢òeëÙÈטö×eÖ“®š{·p³Æ€ÄXeLÿðtmÅP¿¯}âÙ˜:ažË¬Ý0ßà4S½ £õÖßÁýZ§ÉH<§3½ŽvÅÁ5Qð£Âü(ãá}ÁÈG yضvo »<Ìu«nÍì}{è?Ì÷>u£Å=^ÙRá2šÑMš¯±ñVt ¹fï/ìlÚ.×6 p`ú"äfnR}ÇŒM1š£: a|Ãx×]Ù˜-´‰Üc¡°´j‘û¶,ü¨Ä”Âú!ws†‡pµL²2&è«7£v hhWÍ%®µLí‡L*]Y,.¬u\‹ŽÝ¦÷i<¯Ü®éf©éƒ˜F<—Ôé7­òŰèØeVí1^›–òªåÍêÉé2öksQ^¸¿nkàÚ´vm÷k/cQºµ²–Ša¸×­®ù~ÛÇG¸N™HJÂ>FQôI‚U¨ vö¿šPôýY±Ì›±ã\].šsh›ø ºèI„öŽ.×.J|íË8+½×Ûµj6ãÔH‹Leܯìçôø\ÇŒ›ÝŒ|ØËõ#F¯…ù~³›‘ïàš<îLï`xðý˜IrúmF¬Dl ̾”Iñ#ÄaÙ»ß W²vìXöâ%ÊA»?U¼€/3ô\ ãÅ­Æ0D¦âùñip³ÇÜ/üxܳét‰›Ù·‰0»×i¬Nî¸õÁˆ¯p40 >èW~¥³ ˜ém÷:ÚÀ -®ý ¸ê8<6†ì¹/ŸFÝØÙvm[²é}€ Äð¸9 ñÊâ£_«j‹3ƯîëÌ;×NÐ|nWNWA9V¥Ûµ\·Í(¾îcתš4]çt|õ¼Ü(ìŒ6‹P‡òã_‡ÃÕŧÌ3®4ÛÒ|©û__®™&lWž6¨kßl®Ò³QDÕšŒHvÙòý9¯;ï=àkÆ_ í5õÛs_¶¡j ¼ÎþúÚ)Æã'ê×V±ù*ù1/#äon¾_nÊ,#ç2NŸ<ýO©S¨Šç÷±Û»mB×Ò³R GUc¼»73'ëÍÎîífœÏ3céåi¢æãq£mzJfÔD’»½!݇јÞ7V/Oüüdv-¤ÖØ[1N“Š£+žà›¹­‡Ç½–A-6ó®ñ:©-oà}ýéfa<ˆŸüìíqm¶q º¸òö.£ö§ñ›Í˜L=™ì]SØü FW+̺í7cÇ¡;–%Ù–ã,çËÝÙªï†÷b\‹#æç»rž<}G>OGW9ÿý‡ÿâßÿå_ýöwó/_÷/¿þÕ?þöÿëËôÿíõ?ñûëä¿×_×먎É&vI˜é@\h›¼ót=1éÊJ×&ôÄέF$ŸÏöñÃóÕ’(ã ûâÀ¾ö‡¬kE!J£Ñþ‹´•úÑ‘\¸›lP ¤]-”ªíNƒ:Ÿ:Á” û˜tÓ\,‚žq“b•:­$¹5Q ä´©æ“M»ì2Ä®šÄs'ÒP MXQL¨8qž“Ï[?xUb¼’MT!wÛv¯Àí­FÖõ4`ÌÉ×å®!³àúå^Ôƒ³ðÇ'©5ñrJ¿3ùŠ7oâaaù?¬†…p#úyG­/é2®Å+-“КÀÊÄXà\_Fø“jìóɨíF}& ­[×-©.Æ2éR]o£V·L4Ñ JåèðÂûP`ZˆPG|±M° ‰“Ò¤t–g‚«™‹ÍlÙ~RÁV¥âƒlbZA7Û‡¸ec[Ɖ L×üG41ö*GÊg´«!$'ƺa\HRzµã²‰ø!î7ýžÔĈ•]8q-ZØR&š.²Í„ PŒy˜ç:òqM={ÃÐ,*™öâÆ5Ó,µì2z¤:ŒÝj²‰bký:y£Ò-X „¹R鳊´˜~Ò¶%IYÐÚ„—1 ®ÎËhóÃaX4Ò;’î~ð«_dʿ̩Ê¿ç _fë¿Ìë¡`M¼£ðR[àI‡€M¼P-x©oðB ÁšxG9á¥ÆÂƒÛ7ñR½áê¿øá¥ÊÆûÚ__4ñB½ã뇰‰gµ‘—º$Ï&hâO)ž¼’F±„+6ðRqå¥6Ë“Ž ›xGõå…>̃’ x©9óR›æAÇ&x©zóBçIK‡M4™ì6Q~hç~5[Ùþ€×•0®ãÐ%O®àʦu¡¯^â+-6ïD©çfPŒ.YfG 9阺ڭ§–w#˜bœ¿y˜ØâŒ»^øÀ’±5ÒÀ¬dÞâµå–69UóÑBYË/ž¼øòæ©â‡úÏÊ|ÑDFRlº ’×ìF;VÔÈ^ENçs´A]¯Z uôVêó©Ýq=6±ÄÇ‚>™¢"Ý– †ì*.LièŠ Ù±Ž&òæ''Ò‘Vs^ôñ¦k•kî”-P@©=ç°»í¸ö‡óÚÃþù°—m”ñl«¯û°ûââÙx±¢,w嵡lâ*оÔu¡@6AéÎÎQ%¸PÁµž,•WæócÌN­>r?ÔHÂË+ðvÑÌ›}=Þ$•UGõ&Fá«L=ÔÜ7õGUÝÿèE¢Ø?yHrÍŠêt¬ õfU-l;¾ãø+bÜëÙ¸“µ›È{a/;*S¶œ¸AO¹ƒµ’›‡NȈ¢D÷N,í,SGÚç:lઠ/ë+<Ôb`/+7¼Sãá¡D4ñ¢zÄË:O5)ØÄŸ¨`q–º¸Å`/+h¼¬µñT—ƒM¼SÅãe½§Ú lâe%‘—5Gžê“X/«™¼S÷ä©FŠ5ñ²¢Ê;µWžê´°‰—U]^Öy¨M€¯"•eU#•ÑÔ3còJܺب1P9¼Í®E§àbsÄ8X‚yÙçUãkMØk¶ú8÷+-O½hÎSÑ6ñ¢ÄÏ‹b@/ Yï”zYè©x›x§ÔÑË¢H”Ø„${µ¥Œêmr0« Oê÷B©F`V©¸l‚>Åð©q4GQ_k:«ô=ÊkN°÷°l²¬al168‚îoË~Ñ&òrÎÒf”âZ¤L@MÀe;V‰Qœ•ñ¹æk÷®oˆïh¶ŒIÜÏö 1ŽÁh½®oÞÄ*QBP.ÅØ#ë/Š8E/øC2†çý†7#ocôâú óhûÑè½…¬¾Ž+ÙDüpÜð4Ρ!›»q¤Ò&†ž„”æ`üU1^»®×ö¸òúv#EùaÏ:Ž>?ý°ÞU|3ʲ¢ƒÇ•ÓòÈžº'LÁÍ‹/o ghU/î ’j5\º1ú+£k¬†@̶Dü]$öfœÙjk(š(B(PZ“ÄF,i^Œ¥àݬW$u†d^]÷ÙÄà2',ߤÌW1*Êm4áÍéæJË$³_ˆÊV7UŒ-™êز>¦“…¥¯ ‹¤'6q}Ô‡‚€—ñ:RQÍ êë:.XËÆñÍ¢ø&s6ûÂÕ«f,ž,¶X„Z~À¥ÑúC¯¼Ö¢jœaL‹F?é˹nh€PÜE ãmd`y“ådè0–­pø Õð$Û<Í ãXg¶Ó¸ëžö*~F“ˆæ&‹ß˜Ñ\S»:Û›(Fž0ã8†Õµlâ¨àòlYírF¹áe^³w•çÍ^~H“/\56zHïRcYx:Ï£‰–&aÐM´ZÚTqß…v%<Õ`ÌÇ'Òù5bÔuÆÀ`“)£ä@™Q ØG׎ÊÊÄÛ4þ‰ªŒÃÞ;,¥âƒð%N}öòžëøÆkP=­XoG ~ 2þõc»\Ù°ð£>u¯§Ù×xGsS8¬ó…R ÎejlTlh_í½7tÝn2RæÄ8QQºÇ\8½—y<àå0 4éͨG«øxü!1dK »ØOz?_ÅÕDö×Ü+ 6Ÿ/p0M3?šX„¡”bú9~­ºÅc­íåW7õa;W¢†Ù—,ÍÆÊC®/ ×è,‡}­ÏM8 *ZZÒøÐ•c3B*P}ñ«UöÆ~0Õ25æÍ«­D‹5¤¤FEøxÃaÒÌzC£+ˆmæŽz|*PjÆeB/¢Šhéela C€ž†S‡hU³:j,WêÁ7FqJ mãµ€l3¢^òek%·°}õ ¦p»6l&‘u·Ná1¿âZf'¤ í¬K„mVΊ¥®ºŽ̈9÷žq˜ÿÕ›ˆŸ}öéÝ÷+!+cªšNà„ëÊX’ÆÕÿÂjÒ³s˜²ü±¸ZENþ€&ìý¨q¸1«Ç+Æy¼7WQ 6µ5"Ÿ½ÛjŽ›™Ç;;‹æz/’ݰ[d•MèÒ(Æä¢RjÔÀ×ñ xBäÕ~ñC¦w“MÛZóõ O2L5úÄÿã=ÕÔÁÜŠÏ(2,FôYÏ÷Fáj¦w]„å„%vÓKÞ’Q˜Ï!…‚£ü X/†$G¨omÍÆPŸ‰ê[ñyî»,—‹ xe2`õ›ÎЙ-.pޏB¯áÛnšªG$òPËG2”•i|´ÙгGc²d”Ó˜¨ýø*9SÇ” ‰cêP[#šÀD Ù±M¯«ÑsŽÅ‚W†GÐ’ ª,bßg»®Û!WjÆi\y,D³BNÃ]Ö2W1 £›ˆ1'u°Æ´?ÓÝM½lÆŽE&?X–ºk‡ÑdZdÃŒsßzÑ ÚžvN“ü0‹O©­Ðc*uÏÃx´M³fœO}¹WṟªCG&v¦aÊ¡O#ÆË݃êÒ_nÛ.õqžöcá—ÌÝ»V° Ó·Lîóºªñ ]г ïÖ®nØO9:U-3ãåÃàÊÜÒ8š0N¨v¯À«TÊI3cMžÉö6³¢ ²ùnh!Ý÷ŒÓÄØDü Ø1ü£Iý9¨ÚWBÛ(zQ!öâJHbDì>´êÄK[Е‘½¿o¯ç«ófôyÄH½¼#L/?\ß’wª2cÕ®K9‹J7¾b$zwS~ÈͯVÄX8Ž©Q'™(MYñoÂXGòÃÀètÿVŒœ§7c¤dé&H#?§þs¸ä9ãÐ7wóKµ¼²•DÙ9“)%É2ªÙv–c-üʨ“W»LØØjLTIÓ›EÙvwÉIh"ÉAlˆϗx¨§Ö[ ÅB ã‹Ñ„T°§›ä‚`ãÖËÅÊÈvÉ¿Ïþƒ.ÿ¡hF«0s( nAšS‚¾Ÿ¢]Œîœ?£"ÄhIdj4úÜìØû¤¸Œ2œµm ¨‰Lo1*ËŒ¨S.]ëÝýï´È¡9=K#k¢òWmâ½ ž.w¶Ò4f¬Š÷Y‹ØÊ ôŸE놅FÔrpoäPz³PšQf°_‡B[eÓ@æØV¾µ`y)þÃ' ÖmcuÝ£Û+‡‘Ïгóxuƒ e%éà~¥Ù‹f~©þ0pò|~è6{6Ñë"Æë¤t6º˜dpËöýÙÑ@¨øÃ' ^,8¹-ndÛÙT~ÓÏþÿBtðèÙ˜[qµÓ¼=:ß^Bª´~-TŒÛXнy•p»ÐcDŽ-¤,ƒ«ÍʸEÖI&¡üZÕy¾Ïö#ðHn^FÍ­yߨ™KÏM„^d° ½H„«î#¼2˜ 5„f¤E(Kœ1òƒnA!È gXîÎ)ðŒC„pW’F)™‘ø4§ ˆ’®A<¹ï´BSÑðMì´Ÿ½íh†2´‚FMÝÁfȲi¼Á¢9”B6ºføg€€Ì&2¤1ü‡G#%voF(>7AMà I‚ÈYÊ-Îp¶4*Â&äEÎrs…ÀTŒ¦& „i’nÞpHýikqY–4#’³¼NwÅa?(æQWøÅ‹Âć`Ծ剆M8CT‚HtuîðeìHì¸gÉÁíä¤É),êÆ«“­F²Ô)Ö ²ÏGRÆóŸýT3)¾1©vn‚ z"ýÌIâ×ö‘Nö8ªvÈëh‰MÀ¡¹šp-<ÇùÝÕÏ4ߨ®.ËÁjºÆÞålÑxpc„CQæiúrŸ”³o™¶2„8ۃȕ³Á&$K{ðêúËXÐð•‘û,FCöeh¦œæ$çB´í‚øÉ$oÍØ6³Zs£éQyFÛ»~@Îà^«â~µ„ìwçªÄQ@Å×W†Ä6SN—òï+§™ÕPÍÇMáPÝâUÈæ50sÔŒ-Wœ€cÚJãÅ‚åÑDÎþC÷L~ÅÈÌ%OI’±Î^h¶yü€ö UリP³75ÁuŒ²……dr]Éz§2¨$4›QsS>1«‹¡¦œEÖ +𱬉Ó©_Ó ÆÃ5ÊØÑ€ë‡Z{(­F/•·)ƪÞ4bi{ñjÍѰC½ábBÔžW8®þ`þ–üЦ_½ùtÇ»@ˆBö–\<4GC$ÀOÑ–*…{’õ¦QmÏŠ3»VÕJ [J3ÌITSZ &ët=Òd^O´píIlºdO3JvÔÕÙîµCPxŸo"ž=kò:dÙN“bDÕÍ.㺞ɚDAmzùÕÙ5à½fÙ4Íó ÆÙBj~qŠi|k…[b\ð J?Ÿ"YìbĶ2‡äd|9G§1è/úƒE©å–¡œuz46ow̳×ÍOPá‘2m*Y GxN™Š’áË‘©9lÝÀP ¯˜qf7nkÊ·&ü”UcñBÃÙkÑ¿êEÍÇÏÆ£ o7üô?ru{Õî{ïb²¢êf¬@.Vòº{øqøé"HÛ)ˆ=ü~Íð¾*.3<}qªÚ>žC³PìR¥Æƒ±Ä†ê»#yç£ ÍW7›B0oÈ…¾÷^Ì"…øõƒ§.?zê½ Êj›b’£cÆ w™WÉ„–]qÜ)y¥ƒU¢3¡6ŠÛË ÑqeÌHá÷áb ‡H¼*°&BÑþ&¨O=üIÀ!½?½yEQùâ)Gm†8•ê}Ñ<À ünÄ™únÔ•4šHiÖã‡O¨.Kpà0rÌß›âAdü€™.µ“Óæ©|WYµ¡Ø0` Q·¡ø*=&S¢îF–GÈF'`ÃÙJM´Sœ;óVDn¸L! ˆ Dœ£µŸ7rHéGŸ?©XÈ2rý0X BÎ~q}CÏëüÐ2ªí¤ÇšlBˆÍ ƒh ųZ6x >“Bc•ãûÈÌ’Ê „‡³¬óðC}¦-ív̯ÞB1ö3£ÃˆXŸœÑYû¡‰l暪±º±M7:f¡Uý¡ ´½Khß­…©žr®øÜ :Ãû—Ùi®¢, X¨Å8*ª¢ˆJÝÊ0¢ª ›Pó¶ZFñø:l&Fƒ 4d0x3"·ó€dДòpü@ið¤Ïã§XŒÓ?™à¡!µÇÿûå⌦ÞUÆÅæ®Ì¬É@‰Îl6!ծ̛–/öÊ?ôV/£¦'„1ZXÆ/NíPãj‡½r¢ Í:=šÈ ±.Tö½¹<íÚŽ ˜9? y%¨òƒ éAÏE*MÇNl”ú8Œg”ën¯FµQ¡ÊU`ôižP¤Æ~¨oÉ8òv×UL‹¶k™éFå>‹Q£$llzH²Q†Ä8ÛDÈ B¢ßi+Ð=à§̈QzxðnD¦ÃÝØ‚‹rþ 飙W#ðòI5¯,aç¨[ M¸tÖYgA„[y¨Þ ’©€Á¶EåÐ •ú2¼ÃÚ*t þkסÜY40jÂÜ*ÄØiä./Fc§‰+NûAÝ Ñõ®,&F×R\®B ‘¥®?l\Í•[ŒVShFC1ŽnÇé¯Ê{ƒ±±]ž¸±®E…Ú²l”ãÅUâ¡EEÌ ð$õ%šˆ®áÿ|5KªFpmbdbWw‰nbF =6a‚qg½7‘­µuEpd³Ç|&ï(fitåd]QÝ\7~ñ%g,§DÝmɰ* õe™›eoFÝuzq5ÏתmË"…Ô7ìycjµ„š-A!MhùOKæ W³Æ9uDz’/(!M0±"jËÆP ºQpþ±‰J¢²;'$×*ãF«ô½O©y°@b¬–!kgbl*,aaˆ·&ÆZ%#61ÆÔtW bœ‰±>6;ä4éÉ‘y3^¾r3ãN™]«Ù²LïzQ­! ãÊUv5tSwÍ–ãÊ»jYkßh— IŸŸ~ñF›$‘(¸ÅïÅbAÏi†MÓ³`£aþ4Ø>©ü)j¢jm"”jµ^ßBo•?ÜËÂÕŸTÃuAkYÝR6qþðòê1Ó³qÝ›€>¬2Xab²is{)Z­=&¶1NÜ…2$×0<ÔzUí*?© ®ŽÃSvø®ÊW…6ØÛñƒG§&#h2ªGœ©8*<Òò¦¬0–º жÔGD)œåædÕÍt4ÑŠ„.‚ «Ä@4¿Jˆk!R¬Y rŒYªIŒ–Ž*FS¨(×¢6]ÃØ‚ˆœ¸J'´ðÄØSFá5? TKÿgœïÊèß^üà:ê/ןÔÙãÜ; 3i{Åq¿K¾'›Àc¢Œ¬º{Çé»P$ÚÏœÝ3¦Mt"ÍéD´A.v…Î^½hÄ2ûü.ÞâEIth뎦o×Úõ-bIŠ yxfu{º©†£ÚDÒœºÀЂMîþùns°~ñ˜,÷/ozèÔÙãS3Mòoïýð¬Þö¯ù÷¹‰š)^ú-~(Z®¡&gjËv¬®'Fã¡(Ó!ÂBÒDmø!á$)å·"ÚÕ«Ho œŠØ‡8 ÑH­ru÷*óÕ6Ðå—Ïq¼LÑohÔŠ˜ë·°+Œ£vT‡£+@¬€ˆ c£¼Û©!² ˜¥ÆRÅc¢{šŒ1såÁa¢{š±춤l]ì`´ÉòŠ ±É8{ó"y#E.ž62™¼azåv·É^0é±k÷n+‘Zo« ðÑo8zrBBN¬ð¡5Å]VßO(Aжý0quÛ™¹$¦saÆÆ&@Z¾Þ~XÝ;Á²àÈà}~Œãþ;ƒoñCîüadgáç‚ì…¾&óöf¹Â‘û-#nd‚ÝMv±g”<¨ÍŒ8×Uuœ90`ìM? ¼èó—ÛGÃ`­Íøh׳9‚z±¥&F2f' P‹ñÈ›—d«ƒ´Ýýõ&°:‹>i^Ò4)ÁG¹Ü!°ó†ÓôŃ>p& |ó$y”:#âÛèz0¶Å¢è‡Jž´mj„‚LMˆýkÈF?)ŠŠ 1¬qÀÒ*ÿ>pC÷Æ·©‘£]^„O).öÇ?ûóÿð¿^ÿ”?þÍ 7çeûZò±öÈô-þûå¼ÖíG¬øˆxyy¿¸öìÃǾö|ÖJ¹>B è¼zd¨ÎþÒ£FâôÓ&ò&‰À8ôïPÂY@ÎDN !{ñåIš¶P¨ëúøEí 1äVÇÇÛý¤…žÖÇ—8zøŒ[}óšÅ€ä 15\Œ–ÿxD=hüMx~¿š ”ŒY¾ÆÎ¸Ê<¡ßâ‡<2ïGåÓ8{s”£P`õT^½ý \q3*&`ùù(Ñûa¡4òBßühlk†9 ¡X®¹Ö™è^åÝZ*(Ž%WƒR"Í*ÑM‹ždo÷¡Gƒç)Úvâ7}óÀLýº:~™Ú¥(Ëó$©ø ô aG2‚n·ó’¼O}8:¨¹W GCÕ€úöâ­ýeÆËGÁ±“ñ÷…òEâ³óêDU}Ô‘ÓðZlöý¢{{ÓƒE k/×ùüçWxÒèüæ?˜b˜é˜‚ó9ÈÛßÁµú£Š§«CBÔ_¹¬}ÓØ¨@úB)” Ö“4ý·ø¡»=à ÉýÌæo»&Z¦wcPB®5 ?8¯–Pc§æý |éâ_¼Ss*}üË¿ýÕï>þÙ_ýmN¿þúÛo~ýû_ýÓÇÿøþñ7¿üøí×ÿôË?ÿø_]Wý7ׯÿÿÿåõ?zmþŸþñw¿ûåoõï~ÿ»ÿåW¿üïýÛ¿ûÍoÿñ¿üíq½ïÿÒö¿ÿï~õO÷‡oÿǯÄ¿ÿõ/ÿù_~ËŸ½ýã·ßüóoåÖþ!}ü«ë¿ÿðŸ>üþCþøW¿¹þùo®ÿþ»’¥»ÄƒV‰°1¤^ôå À!âmSÖ#©5SÄõVåY+8ø‡¼ZÉRnúúÏ?üáú—{ýÃÿu™þÓÇöñüø¿ýïéã?Éÿg”§7lD~U‘þö`NÌЃrÇaÀ5«ÊXºÑÊho2shÖzb,3ãhB8ø…›ó†ni³aÖ}ófË!8Y@©Ž{‰Ø$Ää£_4¾}¸=ÍÚn<ñÑD¼šãf‡{{ýv?K‘pûÚöŸ¬ÿ±úßêâïbéqßðqž–艴«:e?Ë}xi†\Î()Åã=óÙˆž0Sy2Ÿ}ûQKï0ý¤Ôrpxx3{ì,•[‘MÇúpù)šJìùñu#?þ‰Ús/?9—Ú§!Â’WêõÐ{¦*ž†õç§b¼š,ÏëíñybÆèö8m_Îï§ÁŽäÃàþüôÃ1^Mšç·Íõú?Û¥úßüVî÷öãïÿãÕèmµþ Y°ÿ¿X««À4¢|r°úsÓ]Û9“&ë¶-ä0Iaì|ýp»Z5U¬GND ·Wíw¶Yz­ë~¥ø<¬DFúžªé«â^¿ðÅ\<¿’ Yë¦ü0«ÜU¦–ªn·r0Êý%«Ï¿k·º€Ÿ¡Mä¦fˆ—ý1™5sT:5[4ÉE¶å&¦b//½X98Kal•HÃÔû­êvSd¼·Ú² E³U/4d*o×}¯ƒ”©ü%iƭè 6Pé;®ÝÇͨòy¡h Ð,À7 ó©jÃ4cQ+IDüf3í±f¹ÄúEÂOrp* õÉôϪ)<¢Š#ø‰z6°¢£*ixÚ:D[…ùW÷4â"©9¾Â”ŽAÊë.ºM4ÇJ‹pì;4œˆþ•E=4µµ qlÞ¯­ò×âô`> ÇžÖ‚ZÇ×;'å^hTÆRIU@rÓÒŸ´ÿǵÃÅØ¢QÉ‚b…e>Ê~ì€Ð¡Ü%Ü›=^ö ªPÚýÚG«‡ñìA˜ÞjÊ–ïÏU„2Zöã;(¬ƒ±\Á È’¶‘à6­0É¡€§´³†‰$7kL[ëpk¥Öt›ê"¹”F[ $ÍJ‡ãÚkz“‚ºZ¥¬ía܆˜s)YÔróг¸Tò¦QaN‘êMŒâC<Ë„§è”g_/¯Õ‘©<Í,vÅ zGʹ¼í ¥$‚ÿ©:Æ>~a½<Ót7¤žÏ$©‰¥>³Qgž_NØX3Tä{€:J^ìµwÏ”CN«y:s¤z¿v)ó¼ÝZ=ŒgNs÷ü+­µa²D‹Ú¦’Ìï²­P"þfNÑ€l&å‡pØÝx¬$§yzU“”í+BvT_®ø7)üdiÕ™‚’PÅ#b;{†‹”=š¬u¤9M~6 s&P ÑR4îdÊ‚§+i©ƒ2‚Õ]qº÷׊¢IGJ•ÌÍXÖÀ•šuiú`²¸TBiÒEwBuÖRTIÂüŒ0ËHd¡ `ñ$åË÷µFú2H2=®•µÂV¸£Í0Þq`n­Ê{2cè_q`\&`q^»M9L,ϧºMøûQP ]\gÛgâïfL‹U¡¼ÌÙ¤L˜œLZñ“¥µf±#«hл*]n¥%G6íÃho l9¯U9Á"Ît‡ÕÓ°hVe¨ìŽà4'T{ÜÈoxœÇk¾‹Ê8wbû% / â»,J"LYù*‰ïâäž@ºRn¨þ½äçN¥nÐ9…1§ *fO¢‰ÈT¨ý#£HÌÒÁ ¶“¬ûVG=# [ül&wJ΂fkíY”&{öñß1øÀ ÛÄ%'DSì]-†ø,^¥·ä †¸ùì²WU`×z0,PZ“Ny}7/ì%ñ «×­Ð  F?؆Fß®U E2,„Ò -[‰Ðð~Eô׈bˆ¨<Þë‹uAhÜš:®—Ú[ɬëxÏ*}ñŠ–È¤”=cf身O©½S«!Ikà•O7C/¶ž[\ð9³Y%“׆Œ95ToÂK‰ýÐ2ïmñ\¤•_afbµîpe"YRC+ç°>…JÊò`u81‡¸[å8¼ÝŠ2#aG9u&«`æÚ3Æ KÞH¨ÃNk“‹:6÷ð¦/F ²ÈO}|}3RÖ$Yé…u:²—wENú쇦3,I=¡ÔwM{ æjˆ¼=ßî úÑýSTÛT¿}0GjÏŒ—©;èçæŸYÕ#•ÈGq •›«NÙÔo¾äØvöM¶¼¼ú¡ÜAWDœçoHÈ Í'L“…ÓÔöÌ\Kôæ4ûÉœoYäÍŸ›¦×ºð<ƒ\qùßôFs¦ç¹¨'¬‡~ž kS_LÓ`%AwMÈFH«ãϋ҈‚¤*»Ra6éñ‰RL/㤨RœD­R«ï¥&ÐÍÄýÇF¾«h¾vxïªý«¢Š~¥A$kïKDØ×+2 ÂHþòúvŸûA]„‡~çË臖AÝõ±VpÞû¡Þfêýàíд³ endstream endobj 78 0 obj <>stream ¨¥xø¯£Êq ý@Ç«T”©<:%`B{â›Ëš´\VGš<É·ÃxÕÑ]QÆLÃ`Ú §\³sñÀ.9k¬é¨B_>p&ÐêPêK:æ’o°¾¼¾ßÇÅSÝ$á¸ð};/7ã*,w£pŽ\—a XkÄqü­âºÌ^è}ƒ€YeeIȧŸ æjÚ¿Z´ÊN¸R“Çàa¿£šŠˆT¥$› ºº®u"ö/•?|x¹°~~w~¾ÝS?¸£¼¿û-`ŸßYë^,T?¼»¨=ßíßvÑoïî¸Ï»ó¯÷òÏïnÄÏ·ûáOD0ÿâ÷N™xŠ ñ‡ŸâŸÿ¼¸#¿#2Ä ìwĆ”Ãúó£Cöçß²¾+BÄ>|GŒÈ˜¼ß%rvóÏ‘¦ýó#EÖÂwÅŠ¬‰ïŠiß/²¾'bd-|WÌè¡?'jdïò»âFÃêçDŽ8(¾#vdM|WôÈféwÅ8ÑvÉ^æ÷Ĭ ßE²¾+Žôð~N$‰,ïˆ%‘lùÑ$òy¾#žÄùŽˆ’5ñ]1%'&ýü¨ïˆ+‘»ú‘%§ÖþÜØ’ó[~tÉXÂß_òLÉŸar:ØÏ1Yße²7ñ]q&kâ{"Mî;ÿÜXßåÏ6ÙC|W¼I›xqbbÀwÄœ"SíúýöŸ þFRßÏE¿­߃³…Ÿ€û+z…RÚß…S²íï@*­‰ïÂ*¹µZyK2¹Ç«‚sûó#VÜ-~ÌŠ}øùa;n1߸ûÿCú¿ùí/ù«õ›ßüøË#V©°8ðÿf«h°›¢ RHœ¼&ËKV´éœåõݹ޾ ®›'åFB‡TE(¥´+6Ü˨¢e¦åUvÉÉŸ ºšte H±„  w[Ý16-4¥eåéÜUK‹+¿v 5Ó‘ª?ì`ª¨Gi&“)2FVµ[êŒ[I8sQðrõ©NÜ»±™„ï×wsñ¼Õz·¼¶É@O_‘E¶õ´‡2„ó¯uÚ©ªÖf \XV$©‰0MAÍEKöS»äõòÚå æ‚…$Šˆ£U-¶2¬jžExíŽh@PìÊzyÙ´åNã:zfÕIH,pÑ2©}€âVkÇK—fY¶!d'Õœív7}`sÇÃè ãïVñ¼¯ÄÇ=Œr¸_ùÑ!<Âym÷š÷`5[‚ÂÈqó|­fÙ›q„±ðƒËÌðL‰»º¯ìmònIÕ ¼Äã+¬á»âDÇÕŒ¢€VZ°V5™ B°øºí¼®•‚Ô¨­>b¦}/Ò¡’/>î˜ìíðÁ!®=Çì>¾Â<‡2ÇÁœlUªÑð%z_U«·ÅWàd*þ¸ñEÀ”Æá­¶³Ÿ"¢ÃO>Ý8£§Ù¨Ô£_,YÃåMI¹TùÇz9]]3®‘»‡X$¿¡XðoS4¯¦ì<›L›N ]Ò>oòô‚r1/®¾%hx5LfUµ“a–;M$MËÏl.ZsÞ&š€d畬‡™ )Õ™õÖ¤,:Öâ©Bí«.Õ&š£“;‡à;µà(ÃVEµÚ±¹Y&£5P¨™²²KhbùF4E«ÄÙ€¤°E²SúWÄ„P7ôSpq“«¾Fÿä‰Ï*‚פ*Ë›a9žjõom€ó‘U¾Äƒgnþåá#ˆK•X‘@_­-l”V¯a³ ê‰h@é¾4£*œ¼x킼±ÎS/¤5)>¡gô•±«Ù%Ò&]¥X™í\2Üé?CϬ²¸$©#(ý¼^µdìä9DbG‚­òͤ\Èe’žr ôäYkMŠpBïÈZ«ÌRœE<Bc|`S¾#ÝËPyò E=dê€M?X_ží0FÏ…Xr5UÚ\nTÚäv­`¢Öa­VˆN$¨¤K´Þ2×lÓv454&àj-·A¾1Y…å×»n©³]IÏ3¡gž 9 ‘ª™Ö-ª“ÝÛ¶ ߬-wYÎÏ{ùîßV²¯ŽÔÏøQ#\¢§Ecæ5Ìüsp)'vÅÈã3fõ>£˜‘¥XÊjØ!•¼Ñ£CÈù+Xªx¦/Þu:„„õXޝ!u-4 –—ÿýØ–¯>͇³¿·"k›>qjq¸!•8YÛ4ñ°ej)Xû-Ü… ¾îÕFM±âwžÞ)//N-È43e0Ômó_E< Ž3ËùØ2¤¸€yžU”*–@yÙÌñ~þoÿ¯e˜NJÍl ¶‰_^¡ÆµXľ²´‚¸¶Åâm’¦_mZAT–ˆÛjƒõ¤P7YOëRQÄ2‰¼ë*¨6ëWYZ¦HýHXH›—[+á׋ç`µº‘+Þ>ðKè¢)*Ö†3‰b-jn–ˆÖ‡®¿kr™ÃfY´· *j)£µx-°Z}¡C_œª}maÝJNuÔ£ÂdOÆ\ÂÃ4ñ!9(pµ“imº<*•¿ÈÊE™–¾,Pco@k-™ø»è“ø^4Ê?PExc\[í†nÒ„2ið^påW PûZäð M×R†u°x½ù°¹šòr2h¦…hÕάW‰¿_ËÔ“ ƒAåÁ×ñ²Eöé ÊÌÄSI¯±@ˆ ÆÞý0’*Ü|âßÙ·×R”+_êÃÀÁN¶ÛEÌHsƒy²$´î]PèP!i¨¨Ù<Ç‘Ì{4Ç{š0°…Û ~+~³‰‰õ}AVa†í³CΦî«îËp”Ú|"ñ›‰×w–œëÝvÏ19c©.g‡=˜=T•SF¶¬WN3óÜ&ÝäÍêè;@lqÑS…²¤õÞ\u`»—h©“î«ÊýüoN-7ò”Ü^+Ü~ƒ7_M©MÅÎå7YñMÙˆråLÞÛ£ëžâ"ˆ&U&H^ðñ«É[é±s°öK³:uZ$Ñwx‰\L {W#VÓ̒ΊVå¾bÝæÒO4u „™¶U l] $æÛÊæØÐ/ãá9Ò#Ýøç—H@£Sj\*!Ê8¡ìáwsq"@aBæ|6uŸLë~!€Ë{-\B\ŽeÁê]†îéØÃº½úç‘uÄTƒëYH \JÙ\yÀ!œ3D½xš`Þ-GšEkéÀµ½úC*JNÈ+íIýR€s@\¿‚G¶ÀY¹Q¹(VÇ]ulÛv.’±>3Êiq|eE¦Œ‘DT7^ÅÀ‚K£v†• w©Ë]àkãÝpQLAí:èʰÕdª¥æž•QÜNpæ¶ÃƒR'u<;áö5Š 2}åQ˜w™º \ØBežH?‘oŠy››§o„9ª¥ eÅNCœø_^äÏ>ÂUŽ\±<8‘G·—}Éø¼Bë1VEHðžÔsRj€*‘Ëö}õ¶am¢Sß|Òµ—š˜æ%,f>£·%3ñÙ5 nÜ+Gâ¥Ëñjw´À«î7`Ÿi![º2°¤¨Û"ÆÅ‰§‡6ÑY•J~ȉDÚÔWæ ¾;»ÖŠGˆ1ÍSðò†Ù„Út('tm`­’ª Øó$vÎ"šÆÑ1ÒÝâÊ6@².Øûb±±ò;+Óóöj½³N¼\_®£/Ö\'G}Žk…NkÐ+°ÊQº”cN O`4ÐÊouQÊîȉE;l}ù.xÂOZL„-¡ 64(þÞjÝé³}ºFé0ùÁH®iy³ Ý{k·6ñä¸gêØ,q0”PÚ¹ÒAŒjOGE^Q%J3³à 8"g¢Í&¬¬Š£;Ž[bÜQg¹d§,,<,vë^$Bâ´VÈùa†Èá¢,ü0ë&þÑ’/#¤§_œ/ÈýŽS¶Eè¿çœm¡áï:iÛ«øž³¶Ónri÷òKe;Ñ\\ÓH̸O¶É5Ñer*&Á$U Q'FjRöŒÓSk9ÖÍ}}=£,ýtBXï&Lþéõ¹ÌÖ›W§¸—ç½WgC r»Lî+/…?$HlÊú6HSo5R™_®4á× iú˜D²ç;t¨D°yˆÓY`u’ùœÈ¡§ T’½­N¨ù½’g-ï¹*öÂ_:6¯\ Wî’ ß—ÎÕK7ì…ËfM¼pð^»‚Ï„ßì?wb‚Þöí×?ýò·ÿò«¾‘~(+âù‚6ůWÅ’ø“£ÅÃ/þ9j][åq5X$dPWô+8·IH—ÛÏ8PŒú˜½f½;}×j??}°9â«BìÅ T­Yëò O¤Ì+¿H®¨‰*íb“…ä'œÜj«4SX–DeþÈ]ÜÒ/8§–I&ã.^ǶõŠkµ.ËO¸vØz¯¬Îʳv3í.g àkP¥\þÒ`Óuä'ºñ‰,Ä>m“4©ÄaûãblˆÄ…?¶½œ ’Eõ~µÕfQb#صâ£RBòšºŽdÝT+šG -T­mñ¡ yEùR™H¾”€o±Z‚ϓޣ–n°íøŽ|Ûi¤B…‹Þˆ£±:ýu€ ò^»iÂNÃò¿«VW®…ªùò“2Ù¯¡ú¾6Á½ãʶaT`b VTÕJ5.£™O[ _e»*Ä«fiÛËm¹"œÒJÚÑ®¢ÀCá‹ š29íŒ4œ%®eóGÓ~Â[Å7 »œpÈzQ׬øËig5è5s²ÊwF[tÝj‡à潎 IãþBÖ biÃ4å?)x5p¯¡Â‹?aà®Öê'B8Ûš?¹ à!þ\íX·Y£]¸±Ø€ºíT?á¤)éO0ÐP@p2äH ÌZ»3]!ógdö€Dš Ûøbù©Úi¹QtZyú„›Ÿ€ºé ²{é¾WSµ&QûÖ"‡¨q X<"HÉË/"k²ëòò\?¢ õå OÉ ÙšÁÅY]'ZŠ=ÓkÕcÈ™-ª«yÈÙJq_sJîóÇÙT?óì9Ñf¤˜m.Ø2ûä¸ýXFöÉ0ÔTaÕæÖ>ÌH§¯(—¤nŽÅÝÔ“Æ`JVâ'\[´*å0â’¤#£Žðd*VF«1í¯õ“ØëæZØ3rµ¨ÐŽÃ‡dÚX¤CäiHVNoÈ"|ɳºÎ™’´oJÛÊOÙÍFµ$ í£Vm7^WM(8 AB, Ï^·±Ù57e|FŽÄl`ŠžR:’r«xü4vN’+}ÅÚª–6°ÂÕœ”ü—õ²»…¾àZÅk쨅’ bÄ*Ú¬ŠýO¼6o át!ïË*Åiм-3.h’«ÞªË(zÅŠ]PHWR¦T*[áÂ.!7ëU–­ÛV÷' ¾‘c©ÓD³B ¿€§|5À`ù'²—[»ÃžÑÂñH(¬×KJÙ':ì¬])Õì}0Bs,ý¡Äš†Ú¨97[µí72“xJÚlfpEØmlÓ=¨ Ê«O +ÂtÁ&ˆøúFaì „z9éÞ]&žê“·¦µìë½Ü,[]L¼E&52š–¿Üìf$wÁ™Ì§ªÆo²)²,S½=MŠÑÅNÊXù…Sôg˜áJ|×Ê' y½O«©m'ù €A#Ú‰b¯LjÊ%=óÈk೫1«SãÊðáÀ®U£Nt5ZM177–’GH–>™Ëb‰¥Æ¾ï6_ß°*ͱP©´‡Ïh–l F tY‘;°?`çƒUC[ÌØ×†Ï«øW[”|€«àÏÉPOhÜŒàžjêñ ”1W@ibä®2S%Ïe“ì:‡eèZ³5„³9þZ_вé„çdí Ö . ª 2üQƒZª»;\àÀ(%Îö,ådíÔY‹²ÑbœA[€ÓI³/•]¯NÈÆh( šÅùÁ^ôcf+ŽþɲÝlBÐHÇtÑóZ™IIúj¾ .8²!EÅFë'0K¬¨°€Í Y«­¼r5> ßÕÃ×&rDw؆ŸÁj;­pÞQÀ¸Zõrꨥ•a&d& 2†y5Ï™g%Œ]Ee*]\„$P+kˆ=C²o»raX«ð2úÝšðÅÌ•Å*R¶I›ÔÒc“_¬Ò{ĺª™?dEùå%ðgÿßüË¿ûÁ?þÙß ð×?þòWÿtõÿÃÿò‡ß ø³¿~÷¢¿ý›ãøŸ$ "›®HrKRÛQhxIÎQrPH°‹0„–¿4î^56Ÿ‘Qk9ø¨Žff–¿–µÿIs®¹ã5ç&Þ£H÷f'Ћ9q'Í¥x¦M¡Í›’ú..§ù•ƒbWæ?ÊP›ïïV0D<=ÇÙö>¦Ôm¢üÙ zñܶýbÙšf,¨à¢*íÞ-³‚¹Îõ°B]F»=¨Ù*Dš1“u½C­æ«fÄqô}Oòáé+«1#x©ŽÂ¿Í ASålgLFÇØT¦Ûô>¥éÞ˜Ö§23Ò®Õs£#Q'ÿºZ¥°…`ȶ`8ûš _HÜÔM á¢0,R)Éñ¯¾BŠÎŽUE”ïÊ/Ðít ã䎤U­ß0ô#ÃÜ]%¦%Þ™C§Ò1d7¨Ãë¯[Z‹Þ&«Ñ FTÂRc£¢A¨˜‹¹¶E³mµ€aØ5(jÁŠíÑœ9Ôå4°SÐ* $ªVƒíh7ç(MVAV˜ÍO^Èë±y@WìZÿÃ=RpÆŽ¯PÆQ9a[MmKN¤gSy‚2°×kyrW±ËtŪ‘>T°Âò¡Wò5/+1hûßy8Î-Ek)tV'ë‚ó•Ö™±Q[S“8:š•âTc£´dÕˆŒþnSò \å´éWô(‹|°N'Õef°>)ý–44IBª‰¬ô<é3²Âåbý#M»²m¤…_vdž™µ^!ý2:éɸÝfDôAÝÐðÖ¬X£xkka\(y®ð€ósÍ7Ë.U¸žZñ|{iDM±4×'þ/h3ÛÀsd2ûX»qØ2BW ±ñàvaÞåjŽGHÊé×°‰6ÏBèË“«guOMË—© ¥{NHÐ}ç ®»#UC£Ÿ¹NÉÃüÔíU”/åäÉ?Þ\øfõ„ >÷€kª°ö"Ev4U h7m§\^ΆÀ’8 Èò-†üß!ÙñEÌ ö*b!ŸWÙúv·ÌY¯X4<’kã¿«µB¢Õ‘áZÎîz®8i) iÍ4¶fÈ‚§5ËÅŸø8ì’˜ÌE¼3qû–²¡­jÒd2ÆxI7év^IGÇ´¨69>Ý š‰hÛøñ“Ì\–Î6‹Sgâ·gž)þoI °¤óBéW3²r‚IF0Ü0¬Ì¨† ÚàJ˜ºÓx ¤£`oøÚCñÌJÝ…,^!‡ƒÄ¨ÌXK.5bHQ™IÊb¸’wGNFª}ÕZ,:hK áÕdk“-üĹÊ|›qW/ú\^7 ²êº9û§Y¬]iˆ˜É’I™xtôt$!rM¬ÐŒŽŠÑc(ºa¿} y«¹ ,¢ ˆ?ÈPë“ YáH£\VuôÉè¡ØM»Å`ì<»o¾~1r+ÙP6Y_ˆÔÌ>H!ÂAT3HÝî†FŠëÓ8zêf‡ø=$« Š;å3Ÿ-Ø 7prj©kÑêF»ÓH©ùí©×b<ÓDÙ¥Ä]_Œy&°ét«à`²ºÅà‰Œ™lϪb4¦oXƒF^à×®Y<ñ¬3™ÓÙïÙjËëYC׎ßbH¬½kù\ Ç•”½¤_5Lëø„kÑ\§ bpšmº<½Â^·æÛ­üŸ3yðd0#ucg,£4ÓØ&•«ØòªNËæ%iüh1œ’÷‚(F©ûà¡Äšè)êgœð¯Æ'hܧ‘ï`B#YfzP&Â^ð¼[¼FVMPs£H嫆E+‚Ýj&u /ÂÚ×ÒW<äg»¡fG¡ˆ°qÆ,* ´ÆâÆÅÃh=ÓÍvÈge{¡§ý8Ý-iJ{@DŠ7Jó„$"ËFƒcv`«Ø2m”âò»¹2„i5Î…øéQl8ä·­d·¡h g'g—*††}qÛÊAhmîJ^Ò™ Èœ=,†Š”å½n+@,JF-FbͱB©ùœüªi…yõyÈKaΚžmÿ0ˆvMZ–å¹DŽÇpϲŒÙ£cYÝ„o0+ÝŠÔÜœ n`;4ÚP¬z±wë)9ÛyÒèìYL“ËŒ×S!Ý_£|5?ÛfŸ¼ÍŽð!Ò‡"ù.Û°gth;…`gFÄX¹@ÕùÄØÌm_¯yC„leò†š9¯2fZ[ÀH9oŠxœéþL±±H6ã¨d„k¥H@/¥2cÁ¹CÍFSsò˜·íW†›Ú&V6¤n¬ ö&ì—H =¢׵^IbQ['BY}¿³N<5CݤbQ#N¯Šú¹¶všÈ¯ÂWjÆŽ/_Ô¥¸T”š‘VE3Þ^gŠíÄÞN‡N ‹Œ0q!gļ§…Zä¤dn®|DcwMeà¡¥LÍ&®5מj«šëà^Bu0ÌÏ'EØ™Ÿ’¿º†V_À§÷*ÃUc­Ã‡a³ü<1sE+žñ–]jWŒFéãB¢•š-4¦Ì>ƒŸ%Q|¨#h¤ÆB<ÖËĨ٠ ¥­5\ºë8eq¥7v«oŽý ­phu,K Jc|«g]h´ä5ʪCà3`ñÞ7‘S:‰j´§麊Y½8&è{¹Úý² µ*»@3×÷+6;D hÜìâÉ•[³xáºnJÕdq¹Ù=˜YHfàÀ_‚\ä$ ÂÃÒàtH×¾JJA¡È…J‚|‹ôP° R´6Ù.Z¹ù;±é Ñ04eë`\[”ŸpmApTC¸^¶ (S1±ˆÀ¼A{ÊÚš¡ ì[«P\°¼1y\2Ű ˆ$Âè·Ã°0Kï­²Ú–þ¥FO¥Î^yøš(œ"ÄЧ±7H Mµ0"*!=/-”y;Ê l—AQc-;=aFŠŽR+7èºÎ Ñt/[ÂÖ3J†j™ÛbwDçU:Ëq=};ŸqÂ#©C½@&—¥mšQPÃ;çö×Ìh»ÖH’öÄ·[N™®°'id–]«¼ÝMöæðo<‚{¿ü_vmbCò)“Üð^—];‘åUh”} ÉA6èò?ÕrÖ´ÂôG‚+#PX±!òí´÷†K]ñH6 %[ت©ý$+&ê3ÓU3…˜$±¶âž(+†òòœm\Y _l7±™Ÿ‘Ùb㈙“vvTp4ƒ˜;,Ë‚O p(rvD¤vŽÃ@Y3â* ûÐGƒdÊäv•B¬¡ÚVs.$äܱÖÇðÁyËpC×)§!.*YźzWï:7d#}Eסè$ÿd+”àÉ\L¡q ú”úÉN-nøjFè+… ­MÕ˜ ±nU¢`Ö»øš•©è¡yËÚ@ç"0íPlÆ}œð±Ä.d“Ùú¤›‘¡£^O€ì¥aþ+{F€e)ÛTÃ4Væî·'M¤þíÂMºW3⤲ !f¢Ú:žtJñ«…z!…‰ÿ<\~‹4Éûö1 €‰´)~ÃQ´¾@Ö"÷ÛnæR¦*æiض{Ÿþ Iö¬tÒU¶ÓÐmQþÈP´Â#ª1ŠKÊDo»Äʪ˜0úÐ*ôäÄH”DÍ{šFÌpxWl #$)£ù{â®Eï]•ÃXý;B“K«Ðȸ‘˜Ažœô´d““8‘w"xfÜÍW¡aKž˜Gg( ¦4ƒ&+W9|Å2nk\«‹/(Àeàl1٩ͶgõÔž€T1kCQðÕâàTUY3º²‡äD×M¨ ÒÑ·16¤¦†%æø!ö%FÂ<“´]KÍŒS€Ÿ/íæØ›-àÎn™p ETIÙ¬‘áY&É »ûý7§2ÑøO`ß3«Ù’`VÊé)å+ü¤àiÊü¢Ì5_Øx˜锽¯ÓXF ¿@MíDÊ2õÚ®×Òéˆb T£‹)ápÌ:Ë£àD³±tš‘ I'î.èòŒ ×$E>‡Âð¢7m°j,ÈŸ&ÀkäØ øLÿW̠Ή±v™Þ<ÊpdlÖáÉòÃó=ô8X˜Æ¬DG Qã"ç¦9V<HË˃Š,üdäkÏòÐX½ßc‡Ø~â)ØDmÛ@²s‘°LÅ ŽØ‹«Ûp!D)ŸcTéˆk4ÇSuÀ¾t:¿hâxVšñGldWUËì%M¾VïÝ.!ÇBVÓ7³æŽžÁHÃ9«ÀœBÙlK9–IˆŒ9+ÎéÊo—;¹¯Q)F!|6âœÀ]µ…eËžáP(ÜP´ÃÈ]/þrºk× f¾ñÙ Ê[°;³ o!%1æ…, ÿ9+ )š—eßüÉ#´Ã’æÕ,¢™qš²rº– '!¯N— ¢¤ÉôþÌ(ƒï £ zòâ¡52ðÀ»V=µÎDhG- øü¶äFÙ() „#Ð ð¸;h¶,QÅ_ é¬åuuÊ ÁFZ-þZ!T%ÇÜÕfmµàÚÙœ^dÕ‡Ã~Jì6£ÅÙˆ»bF’‡@û8ÝTœwkò¯]¾QaR@²Oåìž9Š87ŒØzr¶—Øy-Aááy*ÝØ,0&ò!r=@F­ ©Øè0260RÖŒ8ž«qÇBy…ã`[†™h‹[=-¥”HÏT ¢íd„TЇ»²<õ:É›²u*Uä™DÊ&…±Ð«‰|Ì’ Ü®h%8®’àV 8qØùÙ Y`="œ¹œ2Ø3×éaz+€o’s0C™dYr–¶f ×ɦ9HYC­"1p#_v1ñ¥XzÈ–â gå)—›RröU§¦»33¢‡Šõ•Ô‚-åÞ•7sî±Un2>«Oe©[eN”‚ØÕº§%娾é+Þ’¾~Qm÷ø&YNʼn˪qê‰CB%¾ƒ…ÒÀ›"ÊžÙáÍ>phZ®µ”jâ9„7‡©I‹Ç,wÁÖLk›Íòœçv°?¹Š÷ÂÑ—ð&<Ÿ€.âK«¢ì–&2e•Rä+RV;ëÕHÖ^p.#ëŸËˆ*Ê]d÷‘Ã/î±¹lj\íp¹‰»núìpêŒý*ëÒø÷àûˆD‘$|&î hoš„ž1†Åø'â?ánúô6-Y(ã °5B²Ó–æ£Je•æ×v«³iP³|ÁÏ8×*/Àç`NTÊç<É~èl9µ+<ÂÊ[«NkMt¨ƒûSÀœÎ7¬Ó¹FÈR`8mœ$ãOáî*ÆMBV Z«¶M©Wcr×ÁùÌŒ}`[‚T$q²\EFH'“•ºyB‰œkûÉ’Ù™¾®i"W..+êˆ- ãÙËwøb« êþ„|¯ßU,Ÿ—¯’Fb¦:qöôËh™›L@§ºò;B!™µ¼ÄÁÌØ±ªbOÂz]DŒ8ó¶ –UÏ ýn¤6Á1)©7- ¿À &Hµ+“8½äH:€Æj‰A†ýrÏn…œ81ceíÜž K!‡³/,SŒÌ÷ƒ•'gz{¢Fnµ8«Á—e²äˆ4*T—؃Êt>5£ÂÕrD37B ©a_ÑRpÔj n0=öÖaë2‡:—“PuèÙ’´*Ù¡¾VfÔnUã*œGÓ_á rrõ³ªjØšRÛþ‘ñ„DmSã.L]Îä¬r±Þ†~8иˆ¤^7(»ÜF¶2Àù ¡j1¿!2`ä½£ä]$×±(ŒA㣄=ø Éã)ÎîUô±à„„Î8«ý&‰d¡îyzÛŠ§åYºº¼¼wÄ ®-A2rÇjhK`kËŸ‰È*A÷'rÑmvZ£|…Ý*“ÃhQ{5®êˆj¤cFÛI¤]1šK¿Áå,8ÊS¨WIÃÄT)ù§(ãF¥iÝì?•\–¹Àœ“|WÖSô¼E®jÌBMq9-Ä·_vƒcjFAD¿ò @ŠiLÐJ …¸ÇŠ‚F&¿®F&¸©däÁâØjkÀš™ ÁL‰vr Ë?›ÄÏžl–(BÂDùq5Vê .“ƒß«Šñ‰x@¾qbFtI5šžÃ¥¶âØÃ…ßËz(äËv§äÞR–7v€—¥ Qò=.ì:bF›È x ‘JÉoÑFá³ê^b=h<@*Læµ.Æ¢¾Gð㦡aÞ8#’æÏw8Œqh“9žb47e·ƒS)fO^E=¥Oú„ÍÃõ:Æ{ÓÈ;p„lvæß3b¸ýœ”]_ЈÓëX&Ô<áÓkEÃÁ:-×(v´'ÔÙ1åêJ"F(3 sb„–z¶yL¤3VmÒlÒfŽ¥Ö¹ë$…áXW< Þª|Ɔ”py*¤ßH_QYWŒ ±„É7:Ü$¼åìR«¢.e#CtjZ'tæ0„œŠŽëÉe ÎiÃY.,ƒ‘‰®b”÷"§Bœv󡥯5hÜüˆ×ü¨\ŠU4õ“2…°ÇÊb:k/’X+âäÅz°çѬ3™/X c@úœröpž–AÉNÑ+ Ù@*±êF-À»<¶G$­‚©ÛŒ"k L}–*ñÅ¿Ÿp°Ù÷W/b¡H˜9ÚâlÕL$ìŠÊÉJ½ÊÿÓz3¨@“¥œ…€›]@NùIYò¥H­¢œ™¼DâÌ\ÍS`dÙv!5:L˜½þ@2ž\¤ ‰/'{é²ÄÇùAµ‚ñZ@Ô\FM´y%ÚÈžraC­Þi§CM©&GV+}reÀaTÇÏ&”p!gV=YPò®% q ̤ärÿÅ28“ëØúNž ¤rj‰ìGGªQ?L·~]F§m¢œƒ§pW§ÿi+ç/6Tx)–Çg¢’Ñ–Éï®Ô{#K\)°h¹*jU±9×ѵ'ÔØn¥k"W£Õ¯ƒ dÈÀzºxw•¸bs†žV8â¬f$ƒ²p—4ªä@Ì!;«AÌ@PЧ kH}áË@Ñ\=Hä— £«¿ ùäb„sÁL‘ù1;óHõs6‘ ¥ÆI '˜|&‹£j»çAá„ 5óT¶¦ á4u– +s „ÖŽ}Ö6‘G›N‡š~ÉF1qMèRJ\)ûñ‚ÂÅɹi{Ð!YY&6C±%&ì$1ÆS«ðs7(š6ë"[¢’PL#9±$¹®6ürÇvMEw'¦ž(³ÕWÎiE¤Ô88¶¥ýŠ[ —R[ìô/,»²Â#ЬaFÄ “ì äÐ'†Ùr c¦ˆ¢–Æ`ˆ!k­P¦Lóuznd·f”m3£'K=äffüO*ö(d8ì%.(´û€w«³Ê¢&;™§](Û®àhœGMr6FÅD‚jŽÂ¨ï•Í4#âøܤX¡²œì¶ÃZ”ØùqPHœ¬£- f‘TôM\³P¦³S¦³J’º\œ­ ¼œ™,R¢•  gžʘ/0M4'®EhÎŒ…ŠD¹lÇgÈJ[v¸G«öµ R%ž§ð¯;9õÄËèNv^!#Ùy8:3ËáQÖÀ2%9‡<DU>–i“«Ê<é ÂÁ#† ´7\‹œ13z|ßyæãÀ©F/Æ–à gó:Cõ]ýhÇ×Bsq„2à8Ü^* ç–{¹-êo#µÅ^ ³}‰%Nëw²«iâW~ÿÎT®Ï„chœAÓ¨ fDц4Öæì5™ßcoÎ}óš‡rgRÄjT8²V3®\U0#ª¨­zL ß K rßü (ÁŒ^M„2ŠÀŸ54åÅ\‘áC±Ð±­¢–}P§Cª¦ÜhÆÅØ6 >™™êÃ…aÙ288‹ïÝð5B 8‰ã©e™H‰‹;’dÕ86z°ãô#Ÿ;lj‘.Œ•P¢ôÁõ“™°6CÎ<ŸVO”~ÖÐ \}X¾è?9 W‚ö²`M§Ñ…æ%à>"áùΛäÁZýŒ £Î¾Ä¼Ã æµÀÔØäêñÅQc'Å ­*­á‘Ñ­™FJªj!—ImwK̽÷C›}A„}XvëW †Yñ›úvõ´b×Î(µbi@·kéµXmäê"ƒæŠŒ´#!³a{•K5Žû…Ï«øC0ËRöÁ’ ‘\ePü qQÄŒs¯Jô›8ºìT9ZYÍ„JM)q#5@*݃%£>·ÖÈ#Š1Ê“m­,1$•!W¯B£œ®‘‘rÌrP¨—ØÞˆb'ÿ7so»kÉr‰=Á}‡ûGÀxŒ¦«ò;ø‡t`Ãc´aCjsDe°ÉL¶À·Ÿ±"VÖé¾2Œg` ¢šk×É]»>2WÆŠAëÚ[ 1l© á”ù»å †³%¤iWî`4áÌ$_v„ÄO°ñ4;בe05ÅÉP}‡Àiñk§î˜V™Ë̪ŧ@d*Æ­"{1Z kjŠágNã^2ÍàÇÚw'¶¨ f“öX¡RǰŒ}ŒvMŒë9h3~ ‚ÏG VNŒêµ`°rË#ÑðQ$Û(F5.2 üþNÄN ï$ÉQ|lú2´³¦‡c‰>Éh;zåFQÇëàV)Þ²ÒÞ4ïFËëßRˆö°ŽÓºòCÿYÌJã8ƯUÝš¾} )`ä¬>¥ŸXäà¸Ý28v¬`àôã«°ƒðüMdž頌4ÀÈ?Ç{£1éÇ%zX\­*¢˜’ÜkSÞƒŠÑqÚÌ6jåõjBжä^+ËsT¦:<‡&sŸø²ÝôS‹44~Wµ®Ú`cêÀÐCæõn±b´+þ;qÌwýiÕí±ã@pˆÖÍÛ"?§ÚUe4!W¯àë2+Yä÷Hÿ­Z6£²m䋎 ƒ¾qéEUP“' dYC3œbø"]6®·bö(j0™)-.Ñ^'Ùx`¥~fÄÙÔÚº\ÝXuJÔ ¼ÖC|€ÆÎ–Í?“\µ´/Eü†~nO³‡}Ñí¥í®á¾ix ¦ ¹1îýp ×< §L)Æï@–9,œÃoûMhÓ± ./Çè‡-‡{1Sü̩Ʃà‹NA.¿¯°\œÝ©ϧ;»Mº‹ü’^×ñV¿¤6žïºàw±>¯cµ|&Ÿy_^A„d7Å«t4òK`Ýñzœú'Îy®­t¢¸cwøYa¥K®x¯l½bù¦—ßL¿;µ z¶Ñf¬%¾o·áo=Û Þ©SÍAéWªÛ„¬ÂÞ³ÏÔ$pþ1žgÚõ+µ‹ZÌŽoš‘Œã´ òÖ°$X¬ho‹Å Ój  »œ_k?~–ñwÊ¡ÝQ ðl»®n`X¿wÜi*>"AóB¤ô”ÄŠ¢E¤d}qû)ÅâÜ ƒk¦-µ’F¸ÃŨ=õ½jd]†6˜‘zWÇȪe‰Îg"Þp]t<“Þìz‰UßVò·Uñ©ÝG–a ßf6.˜?/ëMu+ø0KI¯afŸ½-Öå™%Ü„ /-Ì\A'EƬÇN+þYuØæ~®‘fÅq±4-hcpfãBTJì",Rã¨Û% Š \'8îÜ…þ!ü)2wÌjt^É$=Íà•ÛaòГ^"mövé蓤’ ú°].êë!~sHë©GsÅ{ÇÎyzS‰;m€µloïf’ØvªÇä‡íì%—hn²áý÷~%3¶âF^–½£ÏVŠ\Ñ+͈zŒÓ²šŒÖ¡–9K—"]¥Ç,46äjË’ÄGç iYÒ¶£Aœé—D±µÕ‰TmæR¥j)x¿hÐÏö‘ûdö°ë º‘>ŸHà¤ã>ҰʤSµë⸵¡´®k†Ên<çjÂ=Aúh9FlÞ#̬aŒp‹äÅ•xнÌðc×®häUtð]pÎq¿‘C QÏì=g¥÷‹a¢iÖD,"Wë!OZ±);Øk9hÔ¶!±q8p[ç 4-¾í(>YI04‡Ž”Ji.}4KuÑÞ~ú>,'ÄÀ³‡’9•ªià2²ÑñN³ŽC)‰00víÏŠ^K(Xloù27Ÿ®6luÏÄè3M*Ä0:ØšæÈMo£7Øj¨\!K\µ~ÝÑÉÿ&ÄUU „Õ.„>8E`[¨HÄÞïº]bVaï'H·[jà·Õ{#hc‹cø(ùÊŸ›æ"º\4bX6ù÷Ø¿;Q—îÏo×’|¨ê%×ñ»É" °·ŸîNo±Ì±¬«ú@§…¢òE"ÿW´¡­P8ovZSQv»µSvâÛk¸¯”Ý¡]pè>±qYöÊÍQ­ca±Žýg›“Å5¬qÕ¢ƒôJSFØà¾ =–¯~‘jóˆ‡hÒuðîÚmvBZæ5±Äo*J¶×~̳²¤½NkÒ²Y\\®…€x+ávŸ$‚su>YÐ…»4<8-§\;´/µÛbËQ ‚Ñ&I rÊX¥ªë,¬‚‡}‰ $+˜ÎÈ5-$ÇoUÔà8ê^vFVi]uî§[(ãL£e=­Àà¨6Ïb¦óGXþÖM™RŽ–,®43ŸKÐ%1(-¬“­jgЖSÞóô%ˆµ?ÂY¥R½5“1lÝT­(§i;Â}=Â1G·,*ò´å”M§1Ý-Í¡‡’„)™¢ŸÛ£ ¢F GÓa»)]‹p÷c`¨½§‘Ö¯±]=ïº ÑÅZVè-q{þ¬êXdöå'Â-ÃñÎ#(H¾úo\0¼´52`í\­8¦l‚ˆàû~ T*º‡ðÍ™‰ÞŽg~BÖÆ¿@ÂÉÀ™e°Ûzºõaá˜H‰T¼»l‰Ë`kpKÜ7U ¼¥FY©Ô7ŒG!˜0˜Í\”¼s÷>fîów.% .=òe8Ê3;çr¤›WÑHÄŽ5«ÕuµRÆáð f½¤+% .ªKMÀ¤W]-¢ážá˜ÌFQÏv”Gb{5t‰´wÂÌU޾TžëíZœË”,ºåŽþö~{™&ç~: f( )=Ï@¯2ù‘ÝW _Ó,ëÊòÈ:çUO¶|E?Î Æ5@ñsn‡c=G9o7UxœO ¬¼®¦E7«|s«¼îºŸéÛÝÍáŒà5´÷ÂÅõHùæ Xõf,º ¦î eï€Þ˪‰ÆÜ‰Í˜'i)N#T×í %aVÑäm~•æ"]N<’¨½©n°OyæwÉ¿äö¨I÷x‘qÅŽ~ÚÂlÔµ#ÝŽ5ôe&4MÍ̼¶ÕDýn®§uÑ!¶¹PDÑ´(®ÓÁƒp@Ÿ¤CH¹½ucD_Ñ.èõh'ð—Và–Ïa]bÝò‰‘ÚïeðÏ.ã™åõÿo¶ZjñOk NsÒî€Dõl·zð³ŽõUá>ÿ¾F›³.ËÕD2¯pp(­)ζ]Žº`eËÁ>˜uÚícÌ–úª4=ñ·[Rq·é%Æ©@}š@…b"`¿<*Ê’™‚ƒY$+mYÇ  9`P®7Ò·}Sa̦öó<Õ2H{¥Øn+©JqÈ­,^'6HHóÓ£P˨¾ª%ª1ˆÝV+FxØËðJÛ¼ºÊŸÁê\©n÷<ª¡íJÈ5Y+ˆ @›‘öÇ÷_zá“,vÜ5yÄTàM°o¤/Y™,wÛy™owî"^Ixz Ò!tòfÔº&;LfŒí²°š…º ¬f †·pjÛÐ?a¥ _õïGlÚ amd«{vø`§(í®y[ÕþFô)ÁFµÑPÓ¶ú ´©YMÙ÷¶,帕Ëú ŒwˆaéÈ´™ÁÛ‡ 6ï­K « Å0rù"UëÅvÌ[ !§eMjwžƒð¶$GØgØSUçHæô#‹rÇÞå]Ó»”÷‰í¶¬‡{¨uÖS%‚&¸3\Œcæú´ o韀 Þ"–Õóï¹Ñ'#žÁ. Y^VûÖ¾BïØëQÄÀ§ᾓX×kênwâ§Þ·ýæIdó÷]ø³Öݪ þ}ˆD&ýàd¹¯u:x<5mñÆÇò "ö•,ÉËíR¡1aÍïz_˜ Õ.b43‘o:Ò’zòVŽ%yÅIÚ%”ÖU˜¿r2Ô²dÄ;ö‡G€dVÚëf!sÁÜâ0£ >²_šöÀG"h«õFNµ¯îêfft+‹åHŒ¦ÃN7íxc€šl TUKá,ÙúÑ£FÿM; W°{°°õçåž¾ 㨳S†(I͙‘̰³¼Ú½ãµù¬œ¹=šL#8‡»‰ñ¬Yå}5áX;ÙKµiŽ%Õ—mƒKŸpn¨óߺÀòσi]¾³a5†UÔž»R xZc’'+.ÃŒÎÛÙQÝîad˜`c60ª2Go$Âø¦›k—Ìû Ö%Ü3b>‹.%?üS§Ƶ ‚ò£Jjw>ps§•æo¦½òÜññ‹L=¼ÓÙƒºš)J6Ò;‰À?åB ˆ|Ú*âÖÂEܼ[ç`НÉì²FT©r€nY>+ââå)®Èeû |S—F,m§-:~_¤Œe”G=*hº¦™ˆRÍ•D¢Ýï:{§='(ÙÇ£º{Ê8Ε'ÕU0*è:×N@èNK+ÈA8sÛ3‘]¤ïºƒjÚã‰;H/*ý²ÔÅÜ ê‘ºå½“×»S{„\Y)ޤ)!(šÒb¤‘y—{g06âw™vªûü±Û4¿T€›;uÛwVE_‘œdP±Ÿ± dðÖ‘LÉŒëEVÌ \,RxÌZ¸Õ/œi ‚ ’H~‡<•¶òX;¦LËÝ {Êø6šÔY2OX‡ê˜¢Ë^Ú²¶Øwùøl›à©ís`³~¸¦¸qµ'º<  !,rP±ÄqÕ¯ÌçH€ÊxxOÙ,3\¢m$§Äa‹r-oXkú,!¬k˜æ<ƒQÄyvÉã€u :ÙC¸]†Da£«W¸j¤k] Zï®æ¤-"õáÔm;ê§ Öìç†î—ôºug¯‘8U`$SœÍV«ÉÂÐkÂ+.1˜¼lWÁ`ÔÑëxÓšrêPxxߨhÆ›Üänð€³ÝéÆh‚òÂAI5îlMUöp=žcC°ð a?"2쿘—»Äÿ®ôeaÃ’+‘º‘?êTÇÃâgÈ‘#†ĖV€¼ï&{kÏ|v-m•KÆóLLp©ÎÈ_%Žb_Ifoqr fñ+=¸ ÒéißGÖÔšei ;÷ ÝÆ÷£jéûêJw?ôöný|Ç*Çʨ¨qᑆìki½"¥Ï:û9¨2ûö³D¬äÇ·). ÕUÚ6¤VÈ`¢ók‚ëYël]nä<-QÙwqéua_wœASþK[;´ÖeÄçJ¤ÔÖ•­ñná¾y#¨å U%çÒ_öé—ÈïAMõMî k^O·”ipó#¦ 9'?¿|¾ ñ#Pr)Á‰î&œ1¯Še"Øìæø1\MÂ÷ZvgÙ¨É0— wcI?»]Bvéìu_ƒÃFAm–Ð:s/—g/ ´»»\í‚AÛjœã|¡¦ —ëí$¬¿éÉ’t>ÄŸÃeˆ÷u˜[)ïxüV+—® Vø¾šî·r¿ñ :Wœ,n ” ìxûð`„µ—x«©½S~A zìl<㪒ÚÛ;âØÀÛ»õ«#h•Ó¨a½x•‰Wª(¾¶7#7|€[ƒfE»/)ŒfÏ©qaîòR… `µ‹Ñ[^D3þŒ×lHi1-*¸Wn…®Ï‘¸f6EziãqGAK§ÖÀ†=?H7áV͹tWM•ób²âØÒì3¶nÞ‡v:ŸÄ£ì‚K]FïWja×xrbŠÄ£^„xÒ HÏìLPL W<±BëîÆÈ)Òä8}B—ÎÉÛî^híQÝF8ì¢Ö–©×‡Ì¬w1(P‰áTŽÛH„KÖèb‹…[¾Ì´UL¬RЏía'ÉpngoÓ8Øx(0¨½Y‹]­ÿ^ú3€ ÕmÕW2º›˜¹F^fwž–ã>²ºQ²…£·ì=ºÎÂՓøiRïÉï\qŠ6MgJj$w’Y)ü``ó<0Ús!#·PŠ½Ç¸f«ÃtÚ¹3{¹Ïéf#Ì Â4UOþŸ8m5±âg®Õ¬`?gO€Óz¨+óQ“1)ãw¥Z}*®Î9¯ëA7ÀybSRÀú”àÙLÆ>rã+¨–5è3çfX[tóTû“ûE ~¬À”ŸBJûÙ¸§À½EÎOÜdÔÛ(-Oì›6)BßÞˆvÿ`k†dgz\¯èÇ6Ö¨4vOù“Iú¬m­5rÛÚ¥ÝGÝ+n;eq«wñ»æ¥,¾ìpYîþɦyΣI)Ù07©'ÁCĸu2÷t7sÝ^rAIt X`¤êÏ™‚0+&Iý\aó-[ðs»ýÒ\-˜Õ:C` ±¨Öñqx½A¿V”žÙfÆ» ß!r}•KÜ€gÞ¹ÀCÇn )šƒúÄòo.?õÿýó¥D¶4W6z¤^| &惲`”àÈ)ÃÈ£€†îÖ–wS ‚-Bý:³Í!˳ÿ^æöóþ$ÜGò¡0}@LÓ³™¹å3Jìèm6½påBn1Èï`}+ˆ$RA³F¹gè>Vœš!B zuK°ˆPŒ)¯ÃAXŒÅzv‰;‹J% ñЬ&Qa_‚+™q&¶ó,EÖd+HÐô¼‰ ?`/Ä"\êÈ|â¾+8@Q·UcÝÊÚEጰ2—׆°h.mùz2èªÖAPú`ÄWIÓf÷ç\ªmW¿“9;±ß*ÏGQ$Õ˜ñÅ[£¹ eù?¶»Þj”fCàI†ÃQ›bÍ~  ; ùîâé¹çûQå†ÃC¯DG}RÃΖf¾k}0o¶&2€•[«üaãö[Øþ¨ö³ ~´0ìÔèÙüÏàhž&wµ¶ÔÆâ):r 7óX Í~jkÕ>I­iK‹²ÞmdÑœ~üÔËí£Óþ( T.ÙÊšpçÙªRÜÇ ­Q3û×J¦&É–Ç8›ûúÐÂO¨dÅ9Q6¢#ý`›W²9µ*x Š  É½Lló›„–vYjK¿’Å”Ù^xfö’î]°­¤Ô”ï‰D.ó<+Œk«À¢,T/î£{ª¥FÖõ,ç»Hϰr•ÑjÔbv[½ ×WÜžÏÊÛo‰ í|œ¥–•AkéŒñi–yÛê«U¿YÉÝöêüúÄ ›åwì7L,V…Nëf ×y«Q3ô«‹9½ öd–jat®3÷Qâ_tl“æÒ’™bQ¼ /ëŠa¯'ú¬1¬ù›Û®Ì{šeܧçû))£ˆš;v/Á¯U‘?«Z„–3·•Vú¸~uÔ YÇ“;|aÅP&—=÷tVÉP¢ð)@¤SÚðFó$-åÑSÎ=¥¿¦š Ú§òÞaû›/äÉ¥ÉÖ¬ªB=ÚSЄ•‘ª‹÷®Mù14íO]ΦuåR ‚Ù#À÷úͨùe2û­ýçgówWXÔ4“žvY] ;’º˜—-U܉«•lƘÑÈA³ŸW0›ôXoƒ ÄëýÛ)x§åù¼…ö¶:<¯‰lŽ`¾‚+3Ú)ë0OŠ¿3åÄNž*«é¾Ñ:B…È(yˆ·xwèJî¦ô}\1-ëTBÙºÒ†³@‰‹)ç{ÎâCÓZÀÛ´:ïå>oS`:“e¸µ¥÷)ÚÔê'7Ù¾†g?êä ¯@q·]"ŽE¶Oć“9ˆpƶ¦,s?lhsÂàºÏ:Ð,6ºÜ~% ©ž7ó5»½ëI—Õì [i ‰h¢j Q¿ÃUƶìÁ؇ÛB9íòú0EO+φè•lߣû‚·Ví£O{$ñ/d@4 ¼^„K}Œl×W>!Þ[ ±å:J h‰/vëC$I±'ËñL ë`1˜ÝÀ7?œlÜyµº( •xeœl5aÔ%g#hîäKäƒ$yGióÍÙZ÷ƒÜœ•ä—T,G©†âûAEGÊ)d‰®F¾x ¿Ã=IÁ¼ lû0 P^.脹ž]á·d›¯¨÷û "å+î”âÔ—½³"g^NëÜ€9M±r×!F½b•ÝϼÝ~2^4ÄYE¼"™ü¤ú>æÂ°ë$Ž©zÜŽ÷)áMÑ'v IŒ+UJ€žÁQNGz(´²ÁVK!9(ñd_‡W²²Ùw®g}gIæ:Íß;§Í;V`«Ÿl6Þ5@r}J]`¶HÔ‹È6<é@tY€Y [w¿Ï¬(ÜÙR‚à²X"{<ÀåYW(`ïÚ'S—Q­¬½…,tÛuvïkgØ=ýE©Oà… cI~ÝÏzÂẌ́Ĕƒ»µ×àiY£í²Œ¾4€Á¶ýø]Åé® óp#%•bÙ³;,ÃhÛ~ßÑ’G>ð›ïPH!›¯xBeó5WÌWî6¯ùèÁÅÆ?Ù`û\µ+É‚Äiö’óL쬟üúâNO&‚ž—Ùg(ºåÍØB=¦Kã›LºÎÂ1¢zËfòzM`˜Û]¼mJ õOý0È餘“š‚y%DR)hœÿ! ¢Î”D7CA=ÛÃÌZþ(‹2سȌ`wÙ^ôÅpg¾œ`Ú‘Q<êBÀ·–[¦R/°&‡´ÇÞû`a—~@9°—{}û™jb6=r ¯_ÀNê«éOßÇUQ¾=_†úB´Ãë²*b†Z×6%‚­ÝyýÏ_»9®ÛbÐŽ‹Î4mx×_µa—œÁN^ii¬ù¥¸©ýJ„§=SRîºÛ?ø¦›Ý¹ §_e€†A-#lzô;Êq¦¼m™þ¹Ð³†5ŠE~¼Õ̳ý:ÍØxëè‹\Å;Q¿+Ö2áE½\ÿ2„%Ö€çb«ß3»òUoIAfS·wœL!\+;{VKêt¼‰\F2ÍœêÑJáå,ªˆ^Îü¾ –ñæ·7§c-]sJáluïÞJV'°6«¶:#êéqL•ùåBòŠ÷0%Zvj È‘ò³!ZÝ/Ù(uÉ­<Ÿ-c™~‰ÛS(ÇÌÚ³°Ý,BZ)à{Ó?­Zdò)¯”-­6º‹´¤hÇküÍÇJæO³’¡•u„HµÉ?}*wÊÔxNŒÚרf›1‚šk€6›T¯FSÝýzZUÐ4?Ö©qZwPy¯%¨r‡¯Î M~o^þ¹÷³‘WíµKò ±J¯ø© >ŽaI½<¤âº¶åNV«Qâ’PÍhI0¿‡>TUËråù¬}GU·+TY$“Ú“‰uE"õMǶyO‡[¶è彄0ž+c¸}=¹+9Êc=îʯKÇ•óeØnw36º~wÂÞ:F¹³?iôœ)ïÓ2ÕÒŽ­SWËÔS–côï/£.Œ \÷ƒÑ=š…àtÈq$/Ë)8’Z 1ºü Òå( ÚŽ‘’4ØO3H3~)ŒØ5Ë#T¨~ZMÎÌÌ·†ëÿ»ð¤VS#eÊø2ÕíÜˬÃ:é/¯ŒSj% ,«¬u%‚­{ªÈxo)ËS:ä¨;WŸÕ™ü¸[ð ¸6Ò²]ݺ¬ÍNá´g_GêÊa€mµ‘m]ß³¶ƒ.9Mu;ŸCp¾‹"[1•ûÎ.ŸÍ™+@\ÎÂNžg5§ç£ÕSdA$ëèÇгTÏÅ•zÅ™Jâ zrH{f|xnƒ©¹Ùóú¸O_Òý!ûƒðrÁý©’CòÓ0!vzdÙF.!#r-‡“vs]éƒ1…³²IÍqz€ÜáÞ a[£ÛwÁa9„«³û•Я˼#z¬n¯Cr3#û×CºŸÂ™f´ ä40Ý‹UΜ³TÉ›QÏÔ©F;¶LÅÅS„•òÌälàËR÷)×ßþºg“ Ï`ä/óžcœRõ´O*ƒ)quv=|4»Nlyl‹ç¶<‚ÃÇLêqV6b?F]©ó1ŽªŽœg9p'ÏÊmËc‚¥£ƒ's©Ò‚ØïŠÂ8Üâ$ݯÖJ¾ö°Ð)ƒ6¶åj ­ˆõ,‘z=\Ù>-æ†<"Ö åMÿ°:³îK¢XÙÀ2ÃJ,µ>.Ëå—¸& c ¾æÍ~v,¼Ân@b~:¶C1üy Ï¿t3¸Ó…á>ökwú5¸¨óè¢Æ/Í3(«]gn»Z§š|J×OiB„¯<öàx·Ê%+ûÖŽŸÏ–4ƒ¾=Ö¶ÝÇ]Òu#¯AÉŠ¥î¶Ï@‚7<['—^eeͪ`ñ ¢à8õ²õ$ØÌjf³'‘Èîà¶Ô+ìme¸Ë kKD$ÕJîL üõÍgø~ª0ßÛç$qò­½á›3y¦3.SRÊò¶\­»šœi„U\[6F°K"keÅ”»™ËïæII.yåüAõ—ÔvÚëkÞâ‚>ƒ’Ö ‰gs‰•½v_Ã`C´Ù˜ÍE…GOàJð³v˜s $¾dØÑW¶9î'}T¦ÝÞɪW1|-£K`ˆÚWÂZá×Co¹Ÿ\U;ñOÄEvvû¾þÞAƒBOuÍÞ’(·ŽeX“v-oËu²^ኌˌ€,ªsp£*´v%þRxf  <“õyÁ™ü÷ÃðY~CB3­ °Ñ4šy<ç^'¥›n(C† Ö‹/{ÈÇwy937hfÌqï¢E!yYLNÜ€(o¦awrªÕE9N‰ê’*)+ÈͳpƒÛ“A’ž¦ sÐŒGgi·ß³¸™Â²‰ò¸ãäÇ‹õÿ#3ç×í‘Ò€l»uûoü7 Ù~8î°ÿÑÔy£¬RÔÚ·½¯žšxÅ^&ÚÊSgvLÂyý I|{ìyaƒ-8`ªQEÖí1ãP'¨‹ÇÞ¼ô35 a®­²)?W;äuÉä`³e…«bx9(ÔobÚ…LP‡ðøØ-ÚœÉÓ#ÔŠ}·¡È}Iºç:,?‡°$áæ±¤G‘Hݨrôù¦«+ªÄ:ezj‹r‚œ=ó³Û/èRfAódå=>ȼÚ[)÷\ǯÚÕ\üI²Âc`…mK‰n8>ÿÛNÏô+)Ýn,_®°™B¬ØQwKZ¯/ªzuÅ)À´1²[ùò¶QvhO©íí¤€ØAÛ±df¯ðöO’XQ{iM•FÈôݶy÷~ÑxþÑJO>ìÁø*–Õ×wÙÕÒd9Å÷•5\$õï@¡ìÐ7ºI0ø³Âã2É8ÝŒ%%µ‚ Úzöî^5y£ö\éZ¾ÔhÉKšñ”y'L*Ħ©O¥Çž¹è£{nœ"ÇÍ&ŠôN±í”´gf“ò6Ûw¯zÌ—]G¹bŠcå=ÆÛ¤MR1.)nº0<å¨-×wŽ ²sq‡÷áC™¬ˆZ²×ΕïjÏ´a$ÇQÌé¹p ­²é‡³#2Õ9sË;å½öY9¸c°L]²‡-Þ´ò.«ÞO(…i<Ôo[ Ïžú:Ýíi˜‰érdsé;àt„5™½bª¦yéÅÜu›1(_]DOÆJ,aG§Ë$žöltÀ6šu£3ˆAÍèlŠÒ$P¤ÔmÇUˆä˜w¤8Eâ ú öè]ü¢4V)ûxø¶!b¡€tšZÒŒ[UlØÛtUBêº|3úçìÇ/Ëþª‚ñ±DgÙ(à#4îG©D•dÐfÖÑ ö)Û k`JHbrWz™À"±ñá6.?ããÎ R_ÆÂ‡<(¿é.èõWŠ<ò˶‚ÄolÜŽæÕ¾[Ç4„õ™ÃîÀú1êF9 ôBp2ËÞ¥xIÂ/„–ZPÌcC„ü´´SfÐ&½iü1+/#2ü#ˆ¼Õ)ˆc—ÌËjÏöôÎnÙ~s*Ç6¬£˜W¦³6¨H#‡ôŒ'*±/pÌx5z€_Gï¨0} ÕØÀné|×Wj3[ŠçÁnFöçáëƒ'Ï+¾Tê"ìCŠA¬ÙÅF‚Œ¹²› QðÙ—Æm÷Þ!©Ì RÈ«nÏ‘ðÙ©XÍÒo_ióvÅvoÔ|N—›ÚqÜD²® ÐS§7lmßø1⥴q®Š•4 þÌ>?¢>è÷Èýb+lJÏ),!iL É~áäÇÞ·µh=%´skÜm…”}%L4R¹Ayb#ˆe;òâêÆ9‡#‡–ù{—úü:5^"¿.6ðâGDéAövðH&ïÚè "î§„û:fŠxï®Qµ¹Â ‰a¼ Ÿµ=Q“/)'clO„~jÁ«‘‡Ù¤ön¬†ØPƒÅÛõ+¦ÁžW6a+1TŒìžˆmù¬¢£9š§VJ¤%Z«˜¿¦!WD¦Œïxj¥aþfì0¢u—œÍoaaü’ãò½BF¬ÍJ‹të®Y)îÖ›Õͯ<ÒÕM4 ¥âûž²fæsk§¬¯k—ÃŽÝo:öŽÂl¦œb«¦WhÖx5¿xÓøÎa?ö ›ÛÙâùÓÅe´ïÇþüoþæ¯ßßÿôõoÿðÇßàXíàÿ¢fÐ-|`4 Ÿeûí‚'J%/­bn{îäµDGË.¶Ø_V‰ “„›]WèÿÅãºúYöxÕ4Iá0™d‘{Ûƒ@âAX¸÷8l&ØXº¯ò ¶DOÒH ñ}Òö) µïKaœ«™åkßËoá2]["¥¨Jô”ª6;¤kgÊz(Å2¬$O izxê´Æ¦™“d}Ȥj΀PI–8c–‰pÉ8rÈÔÚ%’ëÞÝá¤Ô¦å¨×áÊªÔ ð»›†Ü¢ùËZK^2Yb\s-(QlЫ˜ÑùàF´ÛýIóûwãiÁ][í|?‹XÁN±Wo/8>†èR?‰A““v l.¼Á~²È©*®@RâˆkèCªVB‘%ué݆¬Ñ]Ù³!,ž,ÄF{´\e:¼Ü¨"\ Z³!DË'ƒæG²{jn‡·U]J´ªŽc0Â`d¥Wì.Þ¼c"ÍÍò'îî‹Ö§µbòŽ`*Εg°’t_…@­ñh)c0Ÿ·T2ü¶‚\ââ!ë)aO¾Hy›0Lc'áBà5¹½ Y"c0Ü )mgR$a(|Ù?Qés¨©@Ox½•à:©œj»˜áÄ&AÒÖbáì±´Ä/èf¼¸idõZ2ئQ©+tñÀ׬·5®ù|£C r¹íš1s¨Ö… ÒÑê<]d»~íQÝZÙM?Ž0ÛãÞJ*Ëùt¼×z—€E}šeNƒ];¥‡p| 4ñ•¸D‘ÜMûË#²´/賨Ñ^«äòmÌ·‚Ååuf&ipyÜØÎ%M¢ÚÙI†-¦ÌÍÖ‚Kµº£6å’¸ ]Ü»‰ÍsD?’»¹&¸b+µ¯ùy¬_—S(àÄ kN¡nk¦t²§X°BÐY˜Tš#%¹£ˆû\Z‘ÍzÞ‘³ѱBnÀ^âkŠ,.Z¡Ü‘¡‡b¶fE:DXpãÌ–ç%îÀâÛn`Z[Yë,qfÛ\jÌ{ÁWD&@C—.ú½ŒTÍ4:ãwÅB8ÕöóMdžÚš@kwÅäPÐþ‡`•Qr\•Èfq·-sçXØŽ*ÔaMÎL$#φ˜P ¡3)€ûJ|Áæö  ÅZ†uB’o;]šfÉJ/ƒ—RÃc¸±Ó[c qÒ^!¦ñ™êÚ›Êô‘x÷zÓó¨ŽE„à “"D¬*‡M‰Œ²8‚§N –]ÚÔ¡Ñ{˜¬ÎŒÞIõB-y Çžá=ºeQKPs yx<œêí†,%¦·w=ˆmζe©…k-&­V¯åŠÍOpÓ˜S¨ÃqMD'cÅä* ªÌ¼®cùÈ(j9AŠäDl&¨R®;gŸèøf°ø$íöã±Úí±”kHîªÓ:'ÊD•ÔÆ^äÉ:S§Ùô­?‚^.ˆ­ÇNäNÇk¥™³Ú™n_vöSìMåmgzØ¡;ââëhÙ3jO€;j8ïšþí¤?:¥!!POƒ=ƒNþQ‘̰»zqèüfÛ&w¼B$ªêk£ ´Š¸9–å±ûÀ2¯>\í:´{–ÛׇcÞ†1ø²RwD>û.”EÜk¤7âꦡH¤Æ cƒèàÛOGA±§ï'`šÀ»×ÌVt¬íÍ'îÏß•´ˆò«Ú¶¼B»2××^̰޼Mú5¬8•;ƒw{ãIàã±ÊÔ÷d¤uZ¯ï˜_#Ë܆ Áùu±h§&æ}ìBöƒ2|i«¡úN¸ Ë\f·ºQg°I–˜ó»e+¬_i*Iö…îœAý?Á·Ÿ¾ÇwǦ¥ ’jÓî®eàÖÔ,4ç2¸‘öDê6U«`áaP];e0ΠÇÛöñØjz.JcŽÿ¢|,Í¡Þl\½é©ß;uDç^%ú­ YŽòðòC8šžÇÞž ibtg›¶fƒ0Ú»QÞ oÑi¤WÔˆêïí‘Ai€(øö“Ã×pxØJû”Kwº W ŒI‘½`§Û•oÕÛ=w!xõú Jt´=EêSEDxôÊ3Õ;AWмªÏäS“>àB`#ƒñ$;ø&œ[/#rÁ–Ž>òPÅ#©]/J¬±og0…<«[T,!ÇNUÚLDH˜™‚o?9å³Ç±É ¤áPõNXìž©¦>?ìWæ÷ÛÞ˜™æV 1%’o[¶Í§üž³ÒÇ’Ó%µTOÜ÷ï˜ù¦rì$/sOšIxÃ6b±ÃÌ0›ØAS¬³>Žm <Mz{Mï ½Cœ˜bº|ù\7ê&Lºân^XÏKc ´¶öK¤6mC” ¥ñ}L^|WÌÍñ]ª°ŠÞMw{-¶:²:#ÁIûN{ß¾mD‹—òX›r·»St'Á*ÈXؼèUÞ¨Èl»ïÈ™õÿaMd'‹ZúÄð0:Ílëš2½Âf8€QvI mÓ‘|UX4@ì[[î{˜‹l„"µIŸ¯ÖTBX3$F«v•ÝVªñƒlÝm\“§ÄPå^ÎŽ•,ilÝ6>pIì˜7#8—ïÂHi*¹·ïØJ?>Wå®Ð¡Š ø„ªëñ…”‹%nŽ1ÀdµãVÖÊ`‚r˜÷œ7?Âêð\Ù¼Mã¥5rN¸ìs5Ô>V7´)£¶[UC›ÚÙ=Úô##b¹‚AÒBPÏ‚±öŒù@&±?8{´Vڣ蹤JÈàÙëbûrJ¹RæYvâ«0¤X´¬/ždŠ·Ÿ~1llÔ5æ–Ù4òZQ7dÃòk qÏ[%xË!bÜàh!IH2¹€ÍhŸTíwÒ²Åí ´]ÈÛ£y=o\–¯c—ñ4”*Î:Úÿú*iÕõsµÃc²Ôõ¥Ö‚OŒAC¬ÚÆ=íi/‡gé§AÒ÷\ÔÈe'Íì ª‚öÓÝPhŠ®²Œ»úâh‹üE­@f[;î€Sf¢qtœ/‚"¦€"w`ÞfJ?[Út}_;ÁmÞS’B¶]ñxÅ| TÌém2¿Ñ óñ!bçg¡©J—ÇfS]d¾âÌÒÊwì»PÔ6f è TÙ(­^nøšÁ1I*"SCîaK´N{¨,6ïífwã¾Ï´ò}xÞº êÏá¬~7  R#Mjºîðt1»Å¸Ã¸•ÊU8è6—¢)ljûÿ¦çQm´óX¼m9¥Ì#_Äæ¼[NEÿùÛQ|UQÀ¶y¤(žAÝåϸÅe®™æöûJ¡Z$á!û~ p-²*Ã2Fxé%yq²5g0ˆ¼ôHU]”Oøò®§éAìf yŠêZ¢½¹<¬0,ñ}L„—õòÄ'Äaxéjù¦W-ü½4”A©RÛþ\có4Œ ’ë.åIéQþæ ïáÈëò8V@Ú`Lç&°I³,K鿦ó-©[N¶Æ7­KE}Ê»9èÒôÚÆjæ %À÷‚=‡òC¿ ú)£qðM3»y!=e øå £ftÀ–+nâz¤á ¤ëÒµRtÑ{ˆ†F‘À!(~¨‚iC~ø…™œÀÔâ1„éû•Éøî>Û¹ùFÝUÖ+U³×•2wCÍAWÛZBPÌEÀò8«p™%5pÔ£u þA·wÙ°®i•,n¯l»¨x0ÎE…%&ƒ¤Æ¦>K¸€–䨱R-G,ÌÆÚ¶ŽÐ?R¥ ù­š ƒÕܰê Ó¹">µÃ.p4»þ¬âµŠÁ¢épåÖÍaƒø°ŽH9.]l³™Úl×–ïÐâcøX7]‰ïi2ˆ ›(N79‘û»lº•‚‘Ã1jH"èg$ìQr[Bß…¼ Õ}mi’v§+¶ú"fàVM_Œî4OŠV2t²X¸6û¹ ŽçF$ë:6ÿ}ˆ·~O0Éà"ss4”C;üéÙ>±®¤šʉ.sÜ¡$êLI21l~æV–+3s5Í+häXÃÃ{z±Dh1W³#BÖ|P½99º{Â{ráUPU?}‡ŸŸÇ¶GÓSúT*­à}®ÁH,Ñ’¬ë¶å<ü‚u÷%(ì~î¨pÝ8Ó®ÎE³®J¾0í¦‚#š'€(°­Û¶P¾3õQõBX õ ÇHq£-­enD©ãXhÚñžA[GK¹ &9CY)PX ãÖAÃ÷î¸{{gMýØž OY'p¸BWÌqr=×c N­ëË›“­t…ÏÀ‡c‘ƒG?î”6‘ƒWy íˆè‚³ÝiÕf*¼†ÖA Î¥Ó"8oΙÖ³&@‰ÖédÞ½fìIŸÊÚÙ:g=éÈoÅ™»Í‡ALÏæ¸=Ã`7ÑMñÊÇv©žT>A+Ê ¼ƒ³Fâ¸)cÏ©ºª· ±oïÒ³{æ„ò¿pÊAà¦â‘N¹Tÿª?m?à¦ÍOñPvûUaêJÆVO° š:¢24Žø:2~f¶i=Ôêu¨l#Ù’_<‚Øg«þ°ï%µœt·g"^ÀåàÒÞq<º…ç+&+½)·¾yœ×Ríøê,Ì–J÷xS˜HŮܪT;÷¸-zLã䱂 ²žs¹… êNGSuNYÍÒ¦úŠ"<—«jîm`q[\åJÝË©ª©ùŸ˜ØÎ³ Í*T û¥èUÐiÂâ½B7çî®ÙeZŽhÇ{ è(¡:`â¹ß§þT½#"¨^B«¥è$75®ù¼@¸CïkäÆy¹'×Ù.¾,Z5©ÐP¼`¾“†ˆà*þ*'jˆ T»³ë k]è’c{ÛaP Á¸žÔiðÇóJ;N™ Œzº)wb¨5`à,±G :%ÊuS,b/ö@ûÆÿ{Wa’Ûè—•báŠ5Ÿ݇q´.YU¾†dñÅÓZÙcA¾)²a–4^ªbhº¹¤¯=€ðRR'ÔÝšÑ?’ùþp¯Ã`WÏ."’ le–Ѥ]Œ°k€d¨VLU¿!ë´iÂ:Éæjf°Q.I$҆ŠáÜ^7¾3æmÛÕüÐóç/Õ"‰Y±&j, W‚¾EÞ-à´èt1‘ðeÓ$ÛÛ-#ñe}ûlµ«¿’{ÛcšÊîóË…¥2ºwõL=hDEá›öß"Ä‚#êýwÉUN*îTïÉÚ·½Én´t§à!T&¶»®¬¾‚è †©ôO³SSLá¢#Íœ‘zÚ9³Y©(X/|£§nù¶ («ƒn7ÞI Æ“€Ùñ³aqIGôI u»\J$çЄXÙx`© V¾³Š¼^›bËnR“¡Ö "ÅÚVM€„s)ê"Aþ³QF=7ÛÝzªã˜ ’ù¬@Cuâ[ôÙ‘³­v’¦ÏÊ,Þ©¦‚·ë×´Lô¸ÂÎáìpoÿ ½T\êÄlÙ[|Å…4NÇ#",Žê•ý\@‡о’$Y•à 9k¯t§XȱFã´D•B0J­È¬‹õ}(û6u³§n˜Ðߦ°8rû zÂÔJnú BH¤³¸ý•,è`ÇýùÁP¡-ŽÔ™°âhn¶*¡±~Mgô£¬,náYÖ =û6²JÅ=¢QÇGФ&†›7[Ê¢Æ0çîç4SÒšïzDÕĈͯD ¡«£]MÏ *ðÔ;-dcŽâp7yWíEóˆðíd7LñÝýª“8®¦wÞÆªÊ@@SçÝÁ¼Ãýóc¥ÑHt9ŠV ^ª>Ѓ¸ý®¹J"d$ÚDqû4ˆNµÀFPä{ ˜ªh5ÅDúôlV˜Ç·ÁÛ]{×á”ÞÉÁngº+.4Òª[òéq‡@`MJç5. Úí+©¾3é,.‹¾0hÄ6ì; ¸ª¶½/ O‘”<ä&$¸pí8Îàrî°®Û‚1}TAàõʽœT9è…×å€ǾÖ1A7[æk&ˆz…5—ñR%`”wXnÝU š\agÛ•J¿úPŠWª&®ÃXÝI‘t±!µ õÓ†%äŠ0€éŒ½*G½O?óA–ó‡Ú]™ÀðTïuõfÁÁ7çnrÓvÜAÓ#«ñêb)€%=˜weêÓ^5M.–Ì5b€’Õz³Š¿«ÖKÏàyìå–>㇙y­%Z –`³AK¸ßi]ƒÛí#  áàÛOþ²’Çvc­ê ,Óc€µB¶ï‡êÁÚ¡cÃOÃðÕ°OúNI¥õðEX|·•’èÝ©GdsÚUOÜl‡gk›éý8Túø—²Ä9Ýkï ÑZ•®ŸÇBv¢êåN3«‘Á ÛQãtÚa’Ý+\tÚ˜“ƕ؟V©ˆùû¥8Ìh5PYjQEm“11а$Xœ&_óƒ%{Xš?—#5½*h˜Ð¢VŽUÏ·êßOÞXÆ|ý¯˜ÝΑx°«iK¤àÞ±-rÐ/KñûPt1µÝÖˆ2Ì9íŽÈàã0±æK€{™-༿ J æÑÎC¸õþݱÃîˆó(•ϔئtÕ½ó=ÿ³g¹¸HÕ‹±xÝ;q£ÅýˆÜÜW-›­%V>´8T3#ÌVøz¿ÄÅ-‚H´®’1_Àó›Õ>޼¬.5ËÁ®0]’Üÿm¹Ý¡œkló ‘6Ê*YxØmã¡Y:¼ÜŒ'¹úðrÁ9 ±z¥‰˜Šøù—GG_SÖ뾃G_ ÞD}+ƒýö¯À+õxt^®âQ¤üuS¿*¬ª ÎVb?4Ž›ÚMN;ÄYdFdÙx&n»›Ž‘~˜W¢‘#jàq`‰zØ98ë—•~®fm¨Û_Ÿ„{VÄ=í$ŒY׳¦öâ"Œyö[·¿É$°™]†£'[†mx׈]“ã;wè·](XA«"ZqتB Éâ©^ÒÉ£=8 ܇,N¹,µ‡4@N‹å…hU«y $ >’‚™*TŽ èÖ<­DÁø û'ÐZ ÂÊN°ÚÄÞeHI^×`Ly=[pZÞÃJÍ1×ïªÇçr&B*ìÍó²x;·Þ”=جª¹»ö0‹g¶ëSó8óÁêiÈØ¡'Áö¨$› Us«‡†nRŠœUŸÖÈ©y{Ÿ„k ú)R­È„¨ 5"ú«ÚC¢¥†ŸŽîÕte3Ï~·aK¸¤§ìï,ùоžÑ“êÁ`уÌ& gÉêi¬äl²Zýw´¤í# jù(tM5¨ä r5—ºþÙ#ßÄ^xÎó%ÛÇpBMÀ]é›÷aÔH­ŽôÕì÷÷û9³£‘äÕåîæÔ-[͈yëýwG{Ä‹îÎð¨Ñ±MŠ–å:Ümö½K%(ßÁÚ¯VrÓ¿Ö±ê¾#‹^û’ñààròûb45‰(y?½/,ÉÈç,f‰ÒõÖ…‚¶Ý_¾b7mçoãr¦'ÞéaOØ7™à:Œ©#˜î_Àû»Ã.=Qÿ¢)o'ž­`3i…›š8ƒ‘¤Çb/'ƒ³¤t=–†‡lôJ´¹>Áa6ÙæY_ÁvpiñÖïRÅ¥dý”{Çêåq·s \V-¹­’÷àNzÌJQð)+aÚÔ)PòM1‹Ëº«çÕÎö.$N=ÇG 5”ÎMêœÆ .“®-§j|vT§ßnFì'83 AŠ›ÊN‹;-×¢îd>­sð»Rާe4Ïí…ó˜nWް3R¦ø#ùIiM ™×ô>%½÷¸ÐsÿʯB~)L² ’’L*ô´ÎHÆ¿ºô1Lô²4‰ú]Aï܆În‡+t îD¸ô(Ó³ð¤$J:¢È”ůîVÈ)$=ïO pÍX3´î§|w%ú9Î<ûì³ å`½ÝS„™fÀÔ*‘ÀØÐŸf N¸=3ëÙÌ)maN¾1oe»²]D<Ü8Ž-.=÷ü÷$%Gl]žý•(’Íå=À†¾+kÛrr6¦Ó¢íEÕË\÷ˆ¸öS«ƒñmö›=72áà"®ìÉG¶ú1uúï/×–Mbê¡úœ´Có5•©ÅãSé6‚§ké5¹Jͱ'~²ÊC0×JCl·Úþ­‡ÍQ~e>šäÉ¿ºÉ,ì?ý¾8_Ó~…Ì77­ŸçÂÒ#¬¿2_ôe)”À÷¬ ,N×/÷ÉÎWMOíP#å㬾5MDÐö Ìå"Ä6ˆv(öçÕD0’¾šëd̃³èC«¼bpuôßÏ¡©˜Ø³SveF+Ëÿ÷AãF„…η€Ÿ$´@kâÔü‡ ìÖC⇀léfeÁó£àsðM»ÕÊÙ/]!@… ®ågjîü‡Qçå刳‹RY”álzö,/8*̳çÒ5ÏÞ²»½‹Šõ×ÁRo5ÌÏ“I—v‡´u¿éØ#ÆoèÇ&.HÑq»ï<¿ ´8h[ SNÌcGNF¢-ä¸ê+P;U 05ΤEAìüˆT‰Fø\œåó²þû|¨¬•âö3jŸ _蛇Á½­ rÑo†Ÿ³$ew—]kX(¦þnwwÒÿ ¹U-aCŽ<†‰Éè¶}¶ãJ×L±Å þ3#øuf9ò0äs^ÔTe¨!–ÁŸ±0Ÿ°o>P§$7rœÐ.ããã…àòµb{ž)ñó^‰líiî´žzÞ¯aº ©qm)Ò­jUÍßÊtg„曀-›:¬ôS§©·'”×Cq§æ%IY†ã»Â kH1‚NŒ´û ü†íìHÛ¹zMÁßFe%{œecXW–ö÷!Š^©5Ä3ØàtcíÛ>¤ëÎä8N“€)•ªàp»|je  Öelîˆ(˜ÉG2¢Bi›Ž DRmú¾[ûPoµ`ª•ä]¨=—Ž?YÄÑ7tÞ·¾›ƒó´º¸RÁËöB1AIR¿wˆ1Ú³òéQ$’9u]m‰˜`†/6ƒ†ö¬G{Ë*‚ƳµaŠ ¼SôG6Ã&>i>Ü’6Ž‰Ïø*KƒyÃû?ëüÀü+±ûÚow1¨ëƒÁÚsyŽg²1ÜÃÌý¢Çýš/#ÜÿÎìh¨;P/·Ã9ƒý”$m{q[á‚ÇFzø¨¬çÆøX¿³Ôie&:±ˆÎÔíp›7‚ R§n×ë"cI ÐïºÜŒÒ…å”Ç“LbiW¸ÔIMfÂÝê?†ÎôH‰žáéc•¶²Ps‚ÙáÛÊ£Y_¦>+Ø,hb†ÃjÉî.1M;kr'I˜5åÏu‰Á|F ’0{¯Ž­åò˜_ÐR]²Äræ30|VÜ¿Àd.!žlÌ:*#åaÚŒðèß[ݳ8Kb„…#Ê^sPj…ê¥63t· =ø 5{"R·ºÃ‘r‚Å;ôÔø~µÃâµ°ÎRu<Ö8]fLåQ®aЛ%´ůÝ@7ö9·g¾ƒðÅÎW´÷íýÓ¸ åþ­äµRð ÖÃÊ8Ç=A©ç®mZŒc*û̃XŸrd–vÊúJ=âv /5>ƒ;ÄDZÊÈçé%$ª9ïGÐg |˜áâ-èiƒÉ)µ$·ôzN©(Ûm¡¥n´â¨>væuÙO=è…®ôÖºSxý2þ¶¦}„¼ý¶Jýã¸×l 6˦¬Û^¤ìÉþ»ãòsEÑHÁuÄwµp*hüaßþAc[ËÂR 4_ã:BÞ—û‰©aëü)Ë%W2°ô x¿NçïN”kwKÙ»2sAÏ.ýõŽë PÓ{m+yUŠA8©bñ5a0éæít†™Y"GÑßF™iá„KŒt$p¹’^C¾ó¥ !Ö/mNFvßQíÕ,¥*W= Þ§Ä5(ÆSœôxGðñ´§,æ Û âà?‚‘IŒ4`ГeImÓ4ƒ\j[nÜt4DŠw5{ùZ~Õò r»×§±wè­ ÿìÔ´ºûžnH¿SÂim¹}ØnTpä\>ÏI &FºãÊià!’°_iœb/qY9F/óc ØòꆴS‰í MÛo¶cÅ‹‹îsT~¼^»ø_Ñ®ûÿåsý»ÿþõÿúO¯ÿ€›÷ë?ÿs) ð°õþ«¿]³dÓù–ëW}°Ó]x¥ w­æiBÁ¼Ø/qt½E½¿ypÑsÊØ¦çpŒ–~<«ø`ŠüWÑ#Ví;7͵›@ ÂÊMo ÑŒ$ ÉOZ²tqÝ3PmtÀ`¿°<Ç] Ùø ž« þ ö‚1DTâ*ÀÚ¡/c¡ý-‡À3ˆcMI¯èl:vé!8ä’Ç+IJ 0…ëð¥Ë­YûÄ«NØŒG7ÔR&ǾCÜÁ[†Lã’oѯ56}Íg|`Õª:´z#¸•^W´OžE5í+†êcÇV ¯†Ã´òweŸ‚ÁÝ:W¨+îº}m±AcÐÛ/Þ§LÓ÷¼Õ!c9(%µ›:TxhöEêýå<+¾pØ2nàÅ»:C{æ[þÀ:ÄfâViºplº£ñÚÇLÄÞó~Ħ™ß¥QžÿæÛD‰&ë’×^’ ¿è as×[Q—‚\}÷-„2`‹£ô·‡É§:7=Pãh˜Dðîãƒ)ið)Çv€gÓ ‡]‡èNîñA—lY§gd ýÞ\ñöï yˆ¦ÕRÄç…é|Œ€o=.ê^‚\3iç<15*Á(—R.|* J9°I8¸»Ù0üiÆ¥öM=0ô Œc Òpêí ^iYrˆÃn†JE~ ¶Ä¶­!Î÷÷ü-‡3~p©?§ÄÄS“eçØ;ØiØBßtåÌ¿˜Äë6JqÛJH¯$Dnfìô‘÷X/U‹¤l¼X,{¦S#Î"èp{¸S/Ïâ"2„®iáø×Í¿}ô•ÁðÕ䑽çÕ›Èc5ÄeE&P(ˆÑ¢ófŸD”T¶UÏI”ÊRÉVåI TÑü¾Óí‰ÁhFe°ÇRëÝf4)æï m˜8Ö¦ÈÊãF×O&2ùñú»"(2˖έ¯Ã²ó $Õ´Ý"éÙ㋎†“@ìã§›}²Ìg"dØo²ÈËÇK]t(aÑòX^šã”ëy@iÊ9u°µ°`»ÃIÊäÝCDöE„¡eÆÁ¿­`QŠGðµù,:3Ý}¤V=O÷1ëÜõùšÜwÌV[8A U5\ÁmÏ!òÕæ]û!ü5I¾ºÂ·½•9BÉñ]ŠGŽ[ä`øÅæø¼[\Ãlæ-‡ˆÎxb-1·¿†ÄÞ¥hã¡ËSÔ‘ÁÒ 0½ôW>ÓµM‘å.ó”qߪß¼­¬rÇž>‚^a$$§§¥^ªZñ¼c .;ž²xÞ‚6‚ÅÚÚ¡¾ç¬að‚v•Ú‡¦›8‰š†AÎC]ÛC¤Î¾0¶VBÁì¼›^[q´@z4eÊÁÐXE³'vìßÎÑ…0=º×‚*„3­Â~‘Õ¼æ<€Í ¾^OßAb•—†¦T9±1ȇÊAV¡"åøbÅ/ÇJË.\ L²F£®ýÂî´DP=¾­½PYÒÕ·€j2ñj¨ô5*¶žÞwzèÖêæ™-Æ„¯|IðØw®¸F!HS‚½ò²V¾¯ór%d°õAËCð•DÊ–ÀüYîD‚^ÉšÁº»†•ßæöZì«^CçÇ'tmèḗ–Wàs~l%ý† <(ý6ÏI° mžr3=žŠp޽¾ZÏÜ š3‡#¨ÉÁî.,[*/‚}t?üŽja "±ÞªtDP«‚š4ÚÇç ³xѽ9“÷‘z½º—svH_Ôz~ ?ÇmdJÚ3x/»äÞ]; ¥å›ùî¼>½ëömI* õ,²(x†à$K]rÇR†gá{*k4ÌY¡E–ù`ðA(o­‰ )T—P™:‹m~>º<‘!fŠvRùs>÷ÊŽçÉò£#·šbü:Ÿ.[c½&ŸË·Ð ?™^~9buÏ­:p9Ü…9ƒ·úíÜpõQOs3ð„õlp¦–Í'íAÜc;Ãâ$÷ sZU.ÀÓz©!•€zšVÕ“0¡@sÛµJÎŽØ5ÙÉbàÐëÖ‘ôÆ=Û´UÜ¿K¼àì¦%¾„¾Ü ŽPWxgðvhݾ…øÎ.v‹Ìª…Š{½íÜÒÎVúRGºÚWc„fQ%z`Î\¹ˆÑØ?CpDm_ø_VÙ#*žÕÖfd×úìª=fµO‚f¡Õ¨ÓG°F®ÉöÜ3ï`0,ÉÀdåóù@|¨äÆrÿI­LæÏèL߬f>6—)1×jˆ÷Ë£MSƯ,+·UV*V{ßÂny‹çe½×C_¢Ã{­¢;kYÄ̰U–íl¥¨Àþ }â/©PA¡(oµj¾·Í7´Ûàÿ·ÇØM¤?/ùÖÇ&Ü}¡_ò·¸Ñ`Åöù\Õe¢þµ–× 2hëÿuÎy³º]ãöE½³'K]Ûñ¹ée™ŽíéÀ^•i'Â68yì÷ÛMA[ D9Ká¸‡Ž–Þæ&ï+ü'3¯ö»Ý H{¢Ï9'ˆO»‰áÓLu±š[ØÊ€}!zàIÜÐÝÖ…-R ”Œ Ds0K«Çµ °|Z¤ò~­ŒÕ-Ùz^ä3Â7ФéuAJ’ÖÁU–‚Å ¸ƒ~›ýªœ‰z#‚ò«¢”P³ÆØy™©$+Öšú:¯‡ë>Û¢=îiEØ#¬t§–3m ûJ,å±ñ´Wâ gœyŠÞû´¢´ªÞŽ–íL2s0ÂM+U_ ëÄPW*n̆ÅO¡ÃÀð tß0W›´f×`Òø£^Ó)1°„¸Ä€\q£ëÝ«5UÆv?'¥º<ÄzôtŽ‘š&véÁ3Šàè›díÎC¤ &ÚxŽÒ‰<±(Õx¹–d{ài¢± -×ÕÝã6¶{çúrКZ+­ÝÙPw¨+çòQŸ=8Òï+6Ñ_ò²I ¥KwósžÉèLµú²q'%ÕÔ| ꯋT+6˜¸Æã>ðÁ=4 Ô´Þx%йårŠþ׃Ë{þ|t÷Â*3$!Ùp¡Hü—œ7¾>Ÿ2ÞJ µÄ®Z# P×OÝ”Ûåq[@7~ù•3ŠÁÒ¶†Ns“kÁ¥ºYá¶§‡˜{éíp{ȽBkzöj3¬ÇÜŒ¢»/Ý=|^ïŽ_O±+iùe¯´Ð³‹îìÒ®.DÐ,Ms•üh€4aiØô°ËN !£ø_ç¹½ò:­¡ÁIÀeï·&FëÂà&Iþ¤…Å{Þ¤+ì(ñA°èðP´K)k‡\±w*Þ˜é8ì·0ZÈC!ØC¾U)x¬ª½Ûzæ+‘0G- ÑB63Ž&š«ÔNx<8¬V¦¸%¬ñ z¡Ñ·ÿ-Ë Þ·HÉx–…_-¯–iʇÎÇúŽ_¨.’•­d½<¤*-ðÝ‹UŒíÐ÷žga•;õ´{uubŠ‘æ_x Q{¨hiˆ^u 8¿àŸ]Yu\Ùú5rÙÆó1̦e"ZÕ¢±©;KÌŠ¶PwSˆ›W¸=ô@û—Oâ¶3´Y‘îTO¤Šòôi.˦Ão91¶D«ÞÑrYgΚÃFh(ºÎŠÅ$üö]ïûH8iDÅ:‚´·ãSB߯ët—<-{/Ó™¼êjhÊæ¾MŠjjÎå ö;¸ b{cˆÙå_aû)¬—Õi£ð J$k5!0}ùšËj*m ;Æ’@ßrÙm©Pé†CX õfg&M^ôîé<Æcˆ"÷§yZz{4{oz8Ÿ!z)ðÁÎÅßmz#i¥?˜œÜv>2éEp[?2×þ4œJÇ=DIsF£LÜ¡7~¦ð8ƒ»<‚oçö…&ËÇ£å:N¸bÀ×ò¦q™í½åóbÑÆõ`)Bf!öéôš‡¼³õyø“¸°K®Dân024ìj|oi8/ÿ£„ÚŽ[A§Arö]—Õñü÷E¶êW$dz³wà÷wúSH«©R'c¿îmÛkÇ b ªEAMŠç8‰2Uôz?ø#¦ËVù}Ó€Ó)e,šQ¸ŠKêÄ[Ne4UZ,7JI³©jCnEp]û1Ä5‡JTö¥¦³®í‰,d‹EOžçE.2ž:ƒûGÅIâ¾] …“ïÜ:Û¾ÙZª\vWWd;Ï÷RLóî!­<ãð¶Ây©ÈåVÖAóPŸ…Éæ©„…/»Ïä[¬/Ž¡õÞYj±Ì{¡\ÑúúÇ MÂOl³ˆ6™NšMRø@&P;tO#è’öΗ¬oÛ:¾ôâ-‡qí(9rùèÂû;û{¶ïBõee  ƒ*>pJ‹£#ØÊ=c ¯‘XMòØ!cÔ‚äWB`]Cˆ=V2i éœU#ÔxGw5wÁW¾Ej† ŽcXyÖ@§ãßÑ­ï¡ña{5:p§>l¿‚Þ¬Gkçî­m±ýqk-7Ž£]u£–\6:–GN‘øÕå\¦gñcJö®0Ãë¢â°å)‚šÖ¡b-•Ó3Ânw|@_e¼5xl§÷ ‰´8E5´…N"-ÄÄ0}°˜ž5@×JÁG΀»œÈL’ä]_ùÀ‰¨§t;ÕºG{œ„,øÀ™ê2ŒD"Uñó)·CÚ¦Îù<‹á/d û§çÆÏ‹7~)‹¾ƒœÒõ|Ö(SF°…為Ã94b׌›lÙ`X©« O‘^ÁîîÝVÖ´òù¼5¶þØ€µK:v‰êIéý1Âkmz®ÜÃ…œ%®pIü¶7‹áM}þÖj| *žîjžiÁ×&S1!mŸEµ.þÏ9£¨ï5zq=B …t ¨b=ZûDEE#¨(!Ò•~G1tÆ#Û³;PÓ:m#ãg ;ú¾«h*¼méG'Ç$Ïàƒ+r°Ä¤ªÝ/5r6Õ…À”ÕER{fY¯^§4ô7Eh}Î`‹‰ ÁP½CЫN¢-W8–¨° ^)g÷`ÞÖ“e}R½_¦?ó1™dqz¾ºäH_Ã>À-/í²”ó]_`]lóޏx5lh é7<ZA™ ýmMz!wjÓà°»ßùñ<…€ ©Ó¤,‰:+/¥P„E-ü œÒî:½xTåÔ¥ÝV^JBp+dšž?µO6›÷‘e½ÞÔìè7š—féÈÙû‡_Á´™H¨ót§ÍwïçyyÉÆ×òÞS¯.;zwW‹ŸÛa ‚²†0,l#¸¶ƒÏæá‘}ÙN?Ý -pà£ü®(ùbÃÞ>ô÷Ä~ÜØÊà­­5]ú4Dˆs+z}ðA_ú@×ùÙ-yQoéµôø!ÍxŒä2H\ M P †Šë¾?²Ø¡at£¹ùMKCp5Þ͇‡1A¸ ôçïhÍ-úIYÆsxi\zÜüÂ[úxAh¤å?ô龋1(ã†>¸Ú‘ÔÛå>Q6œw4=¶9÷KsOåÄD:§4•³Ê>½é—E‘‡`»a¢-aU§©v»éèåÙ"#î%Å+qâCÕÅ¥n$H/Þê \g×jŽ¿Ûl,Ëíç¾<ꦻe…š_U‹uÅÓ§!Ft¶^ÖGF°Q‹¥×ÇÕ„@MXÏ­ëtyß*늟õ ÷ô™“R÷Ct‡^zî}èðxw°u©ãÁfõ×’XK?âƒ4} YÖBçnΦ<ðÑ{ÍÄæh¡ÌY¦|æÆCpoyö=8C/£kŸÝ¨îxäf3g“º¶­žØùò:ùx¬LÿZîªÙe{?Öffx˜'Õ2º”S—D"ƒdILûc>Ò$Sê6 Ç'BðnEâo¦ïô¿þ´I¯Ÿÿ»óû?þü¯þúßÜ×Ïïøúÿð§ßÿÃÏÿPþú‡øíCûô¯þþïþÛ×ðØûûÍÿøÛúýÿú§?þîÿÛÿñÿôoÿã?ýæÏ¿ý§Çñ[ª¨…±ÿþøý?üÛ?ý÷øþûßüö?üãïùWÿÓ?þ‡ÿëŸóçÿæ§ëç¿~ýßßýóOú Z©—ÄNoþïßýæøÛŸ.úè§îp-CÒ½ (ò:öW”Lµ†ªËþú§Ê©×Ïÿóëÿ÷+ôÏ?·Ÿÿ—Ÿÿwýüøâ¿µ„½ö1’Yú*!]¡ÍhM  ë¡êNÉé+Q¢X¡Þk»ð*Õ#߀bK®ÃÈBÀ.ÙŒ)3Mt/ 2ï’&2ôãî*úáÿ³-9J$3ºJg“‡Àmöq">?w‹-÷ÅþUÓ¢ éEÀ.Š÷›¥¢ƒ8¤“ø]È‚xò8ß9m’íßöMZѾ8ç:<‚(X¿f-ß][lŒ5%_!À‰¤¦7ìÇ›ûöÓ¿ÿUîýÏyÞ~“;b˦\QÞüš¼NÒùLõ¶Â‹>++}ëþ”_•”m@¼²‡Ô·Ëhß{éY¸åqÌÙj8sÞ–d—ªÂÜj|~|0óƒÔí] "³Ô–iÁžçs~ÐÛ°ìÈ>,%xé©–7£Ûlw›ï‘Æð¸wzäzZ} H¹ÎÙÕhqMvÄ0c†]Ñ®m˜ DžÌeežÇlK­¡ßƒ×è{·yþL¡óA ¯$| R6 •ÛçÑÝô:ºþÂY/Ãd߸ŸÊ/õûˆJãkwj׫?^mVŽûüñþ .ßQ¯Œž÷¿ìÇ_,â´P?>¸îúñÁ#‘e(‹é­üðSA©@*Á´Ào#úø·šýˆøUŸ,³Ö² àC6 z“]ˆ‹å·¦ Uô‡QPóÀRù@ÊÚ+X¶q¹¬Æ(!B91 Šz)3!6Ê I³PŽ6ÄÕ: S¸1Bq” (þ^1¼…°ÑXì’ÉÎRʹ"èTÛ’ßíl¼ÄÝíïöø«U*X«ÿ»VŠˆÒn0W‚hA®2伓Жrã„'AÛj1Àš@SÄPo­*oÆ|z½ª}—¡ØL'¥â¦ÈÍRèH)ƒ¬Ì7¢.€—ÎöÊ L븉bœ¨ê5k³>[z¸á;ä§fˆ våCeÅC‚JnŒÏ2¤¨8'‘hè +²3Þ}jl°!TšbÙ\쨘P¨«è˜×Ì^1QB ÛPºY0ñ!>9‹šÎEÅʸٕ†X¾ê3ÍYAȱÊ(èn×™9eÍð¸Td¿=vÎî¡_¦‰‡M¦B3 ·%{»œâlHh&jt¤¶‚º}ü}Éúh”K@ ¡ ÄÅàp±Á£™ÈßgsI8kðµ») ç:0dÐÄãV-­%éZ⺣¿ŽŠBͲ<ðr¢¾³vA oêSUé*™Ê;&[ÍúSoüÄhAâwB1Ë3sS—Š4 _z°49îQô;Tõ[!ÄGܯŸÆÉè&”ΜD]tZ)θNÆË¢9 åJU#·WÍ7&< s#t#U qþíü´mÔW°»ýÍÀxѲ !›&ïdòf¼‘ÓfƒpOU©M–îp¶+ÿ» ë!l«6‘åÜÑoR*P¸¹•hŒÀåyB{×f„£æª’ŒœLÓ®Zh°¸¾ _0f1Ý1i'c á P9áÙGÀ—&jz|}ÅVÚ/»=—¨U̼<ä™B©¨¬J7*ñH¢¤·;J&Ÿ£¿Ä3”âÀÂLÇÑÊPk `z€Ý**>¹Q {Ò<`Ÿû¸†è/~‚ð[ÿ+&0KèaNâ¬@†Ì©r ÑLd vº­® ÆS5i“mâª#ÍZÏU»½Ö ±²±bw·/dlJE0…rÆ:?ÂÅâö3/¿¢ãRLŸ¯ª¦àå&j!a|’z½:Yp-C‚šKµRÓk™^â<À8u¨+Ëf£Ëó¸:`ü‰³V^{WÖ‘»Ð0d¬oDTO4,“¥ù¦oÒUchÒšìÞ-ÝÃQf¸(–÷§Xœ*›I^ˆ9rcÇÊŒÈöu³¿WÕsú_*ºJÿSƒ Å`ô÷ÂtIF»y#°-øf•‘µªB€r3‹S mÚ®åïÁ*Ë;>±´ÂXÀ ;Ô!Šïä_âÅpJ“ßWÉØ»¨¹”Œî«5W¦ñbu†¬.ÉZ¬­]„*LVbjÀ—WÅ3…Ô=¾²"JÚè $¡‰[µ@Û¥×1‹ª;pB»EcWÜXì€[ûnv·Nôm ¬wéÃMRr”7Ç4~FÝÓVUì"Õ!EÏô*Ynñ-U‘›À°\|Í8›'ŽéáƒîX\z\›ƒ"€ Öµ˜X6‘æ±ùWkÄ‚ÆÍ |O&„¬¢Œ°ÌŽ0¸p¸þ¦a=Å„›ÕÙðQ;(2D®|Ä©å¦0…S\[³ ICÖA!2ÉuEºn<8ßäO<H-º×,…Ë'•¿J²áà¡HâÔ~¹£Í\"è% r/wnO¼˜ñ™õI°„ÉåОâ•q/Ö–‘eòª=n'4BÂËE˜{´´t¹hˆW!×ÉIuûkvÿE®¿‹eÜK‡ñ„ŸF]¯YDÿ¶­÷Ý­_dÄïÈ¿B5˜j•sºr…êÉ@°…§’R³œœ,½!z­dÞé‚ëθwÉ&žØø,ß®½t\hÆ€Œ ªæ9Ÿ"ÖÌ`ÒãÀ–­kº*^Ï.*ÞÅ¡0Ž)‹ Õœ=®»x.\!A¿Õ*GÀÄ0‰À7]ÉÌÖ9”«T…š¡r]`¯aÖ±W~2årŠcÍÄÓPÚ@åï]ñ½PEl “ªœVɬÎ*eôM"§Â7AdÁh˜‡ËãBsˆ÷Ž6"e ØÑ·£4gU±‡Ç7›“>ÉÚøy#¢S–ŸMƒa×ÝHt1äùÖ"#+¬Eó1IµÔ‹Ö:h³ž˜ PM1Ý(¿ø·B CJ˜Z ”­V7Ó€JyÇxºÌŒ*@¼É­ŸÓîö¯LíH ^uPgp}þšfž¤ŒÅ@ãå›â ³‘ˆ#VÂh‡u>7Wl¸¸R’å ƒ d€>TÄÑh9U¤ Ÿ*^s«0ôrÍQËšS—¦©eñCBœ¦A›¼e34ȧ«E ÐU͓֫r.„Ù% ÂhÍÍüõïØø5½_4+jŠÜäMâèAy=š§àQQÊt-ˆ—Išt±«0åˆ^xà²ØùQJ^?<Í&¬Â²jªÉfÓCInd}ˆÉ¶%UÈàPÊÆˆ‹a1;yX£øE¡…Þ­÷aý5¸±3èÞ«ÃS³-Q7/¦Á äÌ®¨ß)} š"᡼’ÕpàÁ<®îK1aÙ6oç!M¦CÁŽ#jV> !mÀRýLŒ)¾F䥨¥Mû4ÐÓè)r`Kê¤É}Qîr/ æ¸TvË<|+´nð#ŠV_,YÆjÃjSÀg‚4{³ï‘P%¦À7¨ÚÊQ¯”lŒÖXogwCwv•¯`œ™}üüåb_k–Æ v‰žØÚ¼‰nË"zÄG(pü–m%B).¤ï£a²’F“Ì>S<>U%;f]jŽ„Ó³Ð½1—IçƒMT€´cx»ôí²^±Ð-w3ÕÙ—ñóøüØNkÊ﫵µcs'Ú;}°l·ÈñâÄÜÕÄG*¨£3À\°óxp40õ—l ‹pÇ»i.ÞY.Eú»]ïvøj3"»:9DQ:gÕBì³ÁRõŒêb‚Àâ)®éÍe;§qît{»d©mÕ‡ƒÈGŸš%Ýïf¦³@úÆ—»»ýƒé&XžUö=µrÕø%°@eó%Þ3lXp0:æ,BÞ+”Ô`’@¾s pI¶…p|+º¯†"k^RdømƒGÀ•×výn·UÇõ­œµ)ì^Õß*Ó²!8ŽƒI^à~Œ‹…á9W”É[1,t6sä$”ÜÚ:êN¸³šf™b¯¤ –B’ „k¸­–àSrD[“-Ú2¶Õ„£³•A+¤îQŒM|jóK ]-jÙ—ÍU´»}qÁ fddo{³4j™YSÞÔ lm–F!º³á·kÍÒˆj%×䣚À[2¿î UØu«oBŸÅòº¼J ZÕC\B…fB†":¡¤s]9éÌÍ×}í'©@‚ R7Á5’"*R¹Ó¤PWp—è¥CïÉÛbÎhðJwÍ®»T;%$#8æ•Lª*to¶9•‘‚."ý¶ƒ/ACÌMŸøˆÕÓªwê´Ö‰^Æ…ð/Ù‘¾V£'¹9ýFõlàøš„J8Ê_‹b½4ÍL"7š¡;´±41w­þ4ëÍ6¹ê—hìBÕÚ«¡¸yÆû‚º$)ipFM+¶£u+·³µÑºi1ŒÅé ö5/›­À´ Ù6u9   nÔ,´Œô4ÕÚRª±1— @ѧ\ ¥ØÞ¦;¿-- ÝÚ¬KhÌð/8°µYµŠÛɵ¶6k£ØÆ¬;±zÆè@›˜ÁϪ» ¬™MÈ´î2cÔ n3á¼$sR‰» nùr€¡¦˜ ©ïCü‡ñ–èo‹žWYˆD¥“P‘“kñå몡#Ͼ\V6äU—ÇÃéB(Ó„Q+? ¼ºn‚ãôá)¹.ÁÉÈ«ÃA Bº,ANÙ;«‘ZÎÐió2èÈÔ<å'#f´{Ȉ·<›s³åð7ZåRM"ÀMÝ·k,/–- B¿MIÏ[L|·»’>Á°ãÉ@ Œýïe:‰1Ýh÷`Žeñ¶ àUcP/…¶‚kIBà Þhõ„÷´e…,œ otCŒÒ ¹–Éõ¡Ð¶.æ ¶¤´$ñX^D4°8o öDiS„`Å>¨Æ”åŸ<„ÌJƒˆWuˆõÃÔòaü½<Ýb*Ï #»ôöX«ÆÉc–Ì$ݪÅàm\6jN›%šmÙóZІ–{òÖ„?ÕíwþÞÒb´µW·»ýßpÊ» "Ny´ØQ3?™©àaúE5ÕÉÙRšS7-8¢ëV“«_xQúõ…WÏÎmQ?=7OQ˜¤D~¯åÈL°¾K׀ذԋÖÁ€—I!tÕ4jñÌS!fm]8aË?ɦ¿hž`1¨®ÙÚ X÷­´Y_X‰§þ]— ›o€ˆ/‹Ø|}ÓÍ ž á›ÕMWª~y^Þàmq0Ó'ÈêY-?­&ž$¬sÁß7%z²©ñ÷ˆªIX½Ô(ž3Y½0°˜>CG¼öMâžRåÒà*ô0…¢h½yo‹<àT ñüs0¾ª<¶‰YYõ í”ÎV¿Hm*ü@|±v%¦[Cø 7[͉fE QÏsÁ£œ‰`áKœöJyH%n‰#©mJ“%!8´9Ò®\¼s £‹ÐÓYR|>©‰Øóc¶†¨"#†Uš0zãõoÞ7c¹PÄ(ƒp.*̇‹öœ²‚WpVXET~£¬Ää3z«\´x!KùJ•Õ¨ägU¨¢§G P…뀖8W7Î%úúbbª4ÆÈY…‹*O¡Ôöø‚@WívAVƒ>Á^/EèAÓVE R =Ú@:ó=r³·3‡/ñk§òjup½F+Ÿ6§ìem:g´XvT€-÷§)z3¹¥>XåðGr-‹‘8ˆ­Òíj-O3šZÓ §3²œ(ïÔ ²tÔc:+‘Jvþ6wjÝ»íUi{Nê%+¸±˜m´ûdRt<•ÕîŠC†""HÄN W‹qägõ®á…ãÖlÕØŠÞ£Æˆ¢n+ÑnFDd:ÐúÎsÐz‚j)ïp±IÀ›Ñ 3Á.¢«¢é§ËÞÒ•Õ–²11Ug ê{q Ü®~xºÑPT, 4P94(¨öÃ.ÊÌâ—Z¦€<}á5gwÕC%²$0u¢ aãÃßݺÐ6ñ¥*þïrÍêÿ\Ãå§÷c€/«Àó¨Õaeb‹Ú³ïJ'kCñ·ÊÂ2QyEñ&"mAä;PüÍTÛúk”uqI¦×Ö‡E¡Að̃fÕÚAÀšúB<d.dÄ« úU8¬†›™QG‘ t;UPš«t æÁÄn\=Ä ‰eÕE-ä uíQÃÌbàªþÑž¢ ÖØ¡D¹Ñ0 •„4Ž›îoá{4¿²›0×xS™Ù]ÉZ¸kåãP„Óæ›ÎN7jÑÔ$§×ǪeS)Àu¢"® Šòó*ãElè{p¤‚ŒÆÝ±¥Q,f4À]û+í­VUÞ®öÀx+~ìx­Æéñ‡Šm¯†Ž[\yÇ`¦PñæâGѷܫΊ}8Ÿ]³¡TRËþ¡s¤95FœklbŒ/Ãëæe{ÕFµçFû¸˜C‡˜­·NÈÒ=ÊŽ4 Ip#˜ÄRªHÜÑpA8쎎?}&Ìì„_rNqy:A.öïWå9¨ƒÎ£û W» ®TFiª¾neê”<´@Ëxð&ûô×&‚Ú…›^¬ Šm}…x¿´ÏZ©ý%þསõÚµ0š-•½©ÃëGbËž>=2â¸úRߣ°–J‚r"ü ÔÑh›âx+$íäu$#UãÄ3XÀOn ëô”isY=a%t.ª¤G@ÔÞæ˜“•Þ2Å ’Ä!!Ç.­C—gǩ˲YÒ(4elÇYã‘_®mW5=¤à•ÂÅ´„¢nk”m×V|…,ÚH‡8¢×HP‡Dñ×äP®ãä6W.Az›ã^Qƒ4&ºfŠ’ô6ÊØ7¦Ž‚ I&AÑ"¶A ½¨,`ˆs2B“—xˆLt]ªCJxÒ*ƒ€ë¨—ã°öBâÐ, 9˜¿‹ƒÏžÒ8sí{å>Ø9Ä´S2¢0ÒëÐÈB´8sQ=ÌjB¾­(Ó«ÐÁP €ÖPI5ìXT½ÒУ$­ÓpŠ™5–=ä¨ÉàH'}+W”Áœj™ØÜí-€ëdØk¦ƒ¹Ê0稛>ÓìMh.ɾ³oÊb ! q"ͧÈuêS¾„€þ…÷Ú§‹!šR¥hÇæ^A¶Óx£,^“A@ÒÃÔ®ºîÔ®íD¢{O(xA6ÈÄ)›#HSé,˜:êhÈ­s&dÇ:”=•Åã¬!Á6‘ᥣ„3ô VHש0.é6ÄÉøãÙµå3xÆQ_¼Iû%“Ôbº…l’ŒO&E°3§AðŸJÕ[K}´5këó ¼5Šˆb2wP³\d[‚±2ou;_5Ža¢©±. aòàXIJgÅ¥ŽzÆvN• zèY^lÔ˜C™¹ðY Q± [­%,¸Æ& !*ÚÆ=VåHIƒ ÎËIïƒqôW±H¤mÊ•P8©tí€Úå¯ÙA—_ÎIY:âÄ1PPRu  3©Éè}Ôi£Üä ÛJaóè˜Þk1Äil¬DƇsÑŒTŒíœI 2$PA9“{\¹*‰ŒàYU·vX>ƒLxåm©;Ì’X2®Àß„bÊ”¾÷ð|Ä "äLn2¾j®ÊÑd 'ÉdiTH 7eibV›#ÓF›¢"„2„ýºn—ð#G¶ßÜú¼qééî䙢š¸”oMSqÑ Œö`±:»FŠX ª5üÚ…Ž`G3¼Ì8KóäΫ©^· LNr##0)9K¬³Ü„KØ8 8™“¥)-—î©ñé¡AÆ{F¬:ÎÖ.Q”Ú¯!|¡8m4_uerƒ:†ÞÒä«ñ” oÄ»J÷JRÄost „D´HÙ $6Á&òFª’kñBÃ}ìhLy£SgÞÜbvàI\Ùnº~Чµ ™ªMÙ9‰Ž¤ÝH%ôbªvÖg¤IÛ±EeUd.-`;¢T0p#§9¦hcpº·GõùI»€Fýš“æzx×'_CÜP:Μpl°láèÐ _Ì”w™u|M¸H’øâÚê£">»¼ð$æ­Ÿax†š@) ÏY™È/”ëJ5 ·o ëA›¢ä§]ŠGÐfµ£c„h³ÝRP½ê·É\û8Ö1«„˯ƒ~ DƒoD}Íc©öP.¶Ûp~S:°*£¹tÏ%Ü:‘íÛó5óM&„CmB¡ÿÞèÈ '&„ÊŽµûfÂRM³íeN#T@Ý!ÒM8¸`§"…@Eáø2gjFÚ"ižRžI­QEDÊY’ØM²¢¿ÅDÃÖzÅAYY¶+3)xD‚¦`òš^ 3…Aߘf£!¸#€ÌÎJ8ºÅÈIaA0ÍÁ¨öe„PVÕô)^…¢£‚zزRÆX.ðjUq’ C8u=Ø”‹ÂHÅÕI›Ä&*†`Q¶á pGÕ¯)jŒœAPQwúUÕ¥á •^Ø‚/Ž:lR²Ð’²²=;:p‚njTáB‚IV\tåqyiTraòbx ºxÅJ÷Ë•—òÍiV›í³Ò°c8 ™Šª|1›Å”>‹Ä¬ŽØÌn(q¤>Ö®ð$ëTXÐC͆¤42˜Lº ­ ªÊ‘ÕA6ðõgXÒnQ<šKÑ1¿ˆá+dWðøé*“I÷z ¦)œ"€p¼ÉI?"+U8¯k…œSc²sÚ™–ñjf +gÄêš*ÑIÇä·dÍKq»Ð±ÚÝ×Raw ïœ:4+Ü$m9uô¨v cvvì=¥ô¬ã•+Ÿ‰ˆ²¢G‹{GeßUÂAùÒ8˜­$Yµ´X-¥Â}¨õÐÂCãh%v \Ò CÁ‘®Y§ïTàRaý¼ç´¢_¼bN44#Q×$¶3N¹µ}ãäcðƒ>båKÛÞ_ôØ2\ñÎÔRNì!Xiô`ÏTõÂLM¶Ö{n¹“‹ ÝmæZÐ’+‡÷FÇøÄÆA»î+ä¶Fl}RàÄß]ð3qu º·4½ÚB|Ðqç­OÑwT"9oŒ±”»¡váp‹Ö3Ê·n›KVT^‘—}d¿™ïŒÇBqgñ}é¸ïuȨ:³[Ü9®F  ÐUnMnœN6;—¸Ã9„7˜$­ñ®qpµÐ˜ê²"–܆Ô43³Gý±ŠÞ Û›| €ÂEeudíÉé&2ð-ópf¤7"n}ÛqeKËÇ øŽ¯ËfO˜\ƒ; R"ŠÏúüØš‘Æ>¸3s±4ÇÈéÆ·Ê Ù0Õõí’#v€/ÆU Þtà׆äÐŒ™Óɺ¢£¿%($CÜ84‚Y¦¨Cƒ›WE¾Þ€¾A˜D‘<ì ÷³èþ¢›…P'"K­ QpÄs•-µ¢üeˆ ‘6§§¸X+kÚÞycå©J™¤fC$Á[NlDh²äQ”Y̸ȧM‰2ÙŒ«{cMNÿ —‘q¢Dœ¤fYDòá8=Á¨¨Ýƒ÷U2±U‘¸hUl;[0 «!ùû@)'³ÿª1Q& –ªîSüÆÄ0õÙãͲƒ#$¶¬¿Ì}`BÈŒ->ã.<øjÎàj£/`·VƒÓ¯P|0„ "©ƒ«.wÆíuÐîNcá–$Ç¡ÏBÝ£„;Æsî1£Ã¸IªÅQ[—’ ½ ÿ°«•ÛD~~ u/7Žëyg*ÙdÚŽ5#âc š:šÄêTeȱ‰¶!Ç”\4ÚêXÅø†q_Û÷6B´qä æd™‚ïkÅ€sJ_²qèÚsG6O!6Û©°k°=~éÐÝrˆÅíÍÇbjsžsåîMøôù+ONêwè!­ñH³ùwTÆÓ7&1 6/yoæz€Æ-çeö¬C4á¹#À©%ȼ>f[„ÀÊí¤R¾2#l"ÚαiÙYkÜiQs &ƒu2K®kJêÉÆèðЬ‹tSó "±ê›WÎ8XéÄÉe׃5‘‡+;t†d¤p‡p¡Wü&£§`·JÊ«í1TýEbãIõ°5zÇ m‡™. Ífxø¨a.®Æ×”YW'³UF!n&šWÍÊ3c²Ë´?•kU¥©u°!ªÀ5fPWDøZ”tL#¾h,H˜x³¶­,Fmë#}Ê’ ¥ÒWÙ!êнW{{žvQKìT¨0S†“ªT(q+^JÜèáà±7J•ªìÔ pJÓ§E/B à”’‹M0e³rª®ŽG}Í©;­ f:Iå’)(ue)Œ@ 6W±d+œ)Ř]]K°}'EÑÜf(êÐr>Æ¥Æ4-n…÷°xXœÚWÇp“vÝÑø ]™"˜†A?(/¢Ô^ð=ãTVîУ¤ƒÿ«zѵÆ7O0-O£”*f¯G r“æSQTˆíÀíéÐ{gÅž¦j¬.®xðÚ( ¦ÏöfKi_Òå:|ŠßHµ*_”4&%• ¨K¶ ‘²9ê=ü,}šTíàÔ)d—Þ` ó]ÄôÕÁWU5æM¸ FÒ—Ú{šFX­ñ‚}åh ¦¶^S[Û°·›+CEÃ.qöp°|ãšÛ鯥Q½ˆtMªé ú)TØW;ˆ×W¯w<Ú¸6wD°Žkå§4ƶý×üáŽbcô\T'–ñK!D°!¤Ü¯jUý=mŒ \þ%¾HŽfÎßR× •;v,ðïôý5ðí(þ³šÅG[ƒGyÃÐ2pì šögMgS·ÈµƒÊpT@4XJž0Ï:äÁ;‡Ï"=zÅ‘JÂ5U2ć^íl2šNæDIƒToA¥:i߬!N[¤ë9`ïÌ:c嚪 j/“R ³:°1(-Knº«Écñ“\ùò8¸sìàï¥}sl‘ í§Ï‘ÂÃbgÀìGGµ¯ºö0µ¯Žn|1ÎÏ  Kê˜+«Q\ˆð s¼XLj R‡«ú-(Ç< ?œÈAvkõ>OÇ©¿]R6xøsS»å-373‰ô-Gtdãc ŒÜIÖ'¸ü˜m¢Ø¯aéPµPÃóŽ6uÁ^rc¨Ë!`i²™ƒWV çƸË÷ˆW- fµÖu2üì T£ Õè)5ÆS$æ1V¢Â¸ÃH³²ÃÊÉZÆW8lª&àÆQ(ø×e¶\šàäÈ›"û2+UM*Kxjú‹‚õÆœ ÚŠ>Eoy óÓò’’ä&øfÙÖèéú•æ¹zŠyšr¨Ú5’y ÞˆR‡ò F Ó òGg8 þÈdóve¤3²4 ¡²S?Œe'¤tt£d½£`•ö_ÍÜNÐ$Yì,°@Ú*á0ubLU4ŠI£ÖXÓÆ3ݽ§{¶›|êÖ*.¡5â·X ·gÛIG=v]’aq§il4*€×UÔPîê«ÀÇí)Û ½Ê%éMÑ–këœþ*³¦ÄÌQæRç"ùdò",Y©– •”b‡ì¤5¾ÀÛÓ:Þ¬ì€8«¬Tê» IN?äój[׎§Çl…×$â0qQ‡PCRÇd> â„Ö’ec^g-_L¼ˆºþ²NØh*Ðòò(®½Û 7Èi\µ¥PŒ¬á©t\M§Ã0+|‚*F®ÞÔä*~™ý¨~Xv¨TUl^ÃhƒþÅüç%ª[¦újîèȨ‹ ·–ú¢ñc½¬™zÂk‚—Õõ(7¶µ­mIËÝ]I;Áئ#\~l' ¾ ý9Ê.•û’-w*#œOEå2OŠkÖ•Xí•òŠZ„ïRÚ G`òç`¢BØ”]/~vÆÀ¸6Ý1IâÍë8ix)à•­Žƒ¯9†Ã°¹«FðNØÜÂ%LiAÂÔDǪœ‡ì1xíÝÃöܵŸŒ«æËSÞº*LX;àÅ®DÍœ5ÔFa{¡Æ¹è£JþR:¼QœN eøh–ÆDškGö»¹µªžÊ„Ð ÈrGz÷TSªôµÍˆ"IúI­’j§1WÈ×s“ §Lð^8(ÆÃ—*%î˜UL|-ŠGÔ‘í­THu±ÂïEökeÿæõåæifMî0a¾T%ãç4™b©’âlNœ‚¯s•¥´uMEÂÊäð-”±jhM:Çš½š¦§A’òiÞÜLAŽð‘€€ÌÛ #ów²Ž^*¬å­"SúœxdòåÀ†8É8lSq|kÄΊi„.wéT{3Bœª(­=ëÈÂUÈZ6nñ”ÕÙCÒ¤q*O³ iŽvGœÌmÎԣɓ`'Cðõ&ÒØ»(Vˆlu”è(‡"ÀJoO[—@Q(»Lň]œ#Þ@QWÀ&>ÕKQyX+ƒ4É/¹ÔY‡ >ñBiÇVp'mú:‘ÖÍÞ-\q,œ\@ÝÔ†„=5fhaÍ1Û/‹u„ƒM­-j4gÚP£œq­ÉD3@雦¦OPµAâQìòUÐ "œJEo|GI(¶K–ÏV¿L‘¢G ‰"×y§dJ¯4Ï•UÜg$Âc2"ûµ¥yº æµÝf,çÎÙX=Mà½e–ÇÌò‡&T$¿Ù‰h’d­DR Öj j¢8 ëì!­rƒ¹ô¶?§ ¶1ƒü¥‹©-ÑóX­J„ãÒû B¬ªý jL:äŒGªFWrÅE•ºœ«ŒuÉP ®´¨¤£ Â,k± 7b;¦‡œtˆ™]¨Y©")ý‰_ÁX$§S{ËÊÁ-™3֔ݗ`í Œ®\Àôe3ê^Þôȵp(`×–$ƒÉ4Uœî\ U/9éÕ)ÙJ‚&¡G¤êÌ„Œñ]fäîP’l‚§b|WùÊ6}ú8-¡&º&µbÒ¦\AŒûšªX\CŸ<¯¥‘c5²<*(W«WQ™X7FJ+s²‘Ë65Ç”Lžx†Zƒ?@°ËÏlÃEÆTÓE™§‘Ú¡uÈ”y;S¦ÀUH;[FÍ?àŒ9”Ѩ¨ Âox×F¨š8Bm5 R›T¥š=Zm<2pðšñº‰ÏÐÕ +Ekg2€ U¯öÑàe`”{ØRFN"ÂÄâ¦a0Ú™|ä[ë‹)$Ѐ»SxDS*ݳQCžöç`#¬ìiD’´®žj[‚×;£²åq«ÿ(ÆÊäÃ(r™uË„0.Õ 9[óÂ8ÞV{;\V™kPyeÁmkh»O=¤0©¾&YUTÖ³7:D&'èµ{ÑœJXIÔ¨¹VTëH8°ªe-Ú¡jT¯–°/P#ä’œ ;d:æú"Ì5ÒâèˆÅ÷bÓ¸§˜TÒ/#¨¢uqÙÞ|³ 9ë £5gƒ£ Õ¨œ¯êÚ)ŠwKpýi.Þ ÔáݺºÏNõ<É%tÝÎ<„ €ê í1LC(/+íó"-ÁªR7ÀÊÁTd›ÄZŒ¬ÃuGh‡ó k_ü²Zþuùkè`ÐÚ"ÖŽt*^92dM¸00eख़˺v¬Ù{9ÑÚì41ì^ *$Ù„D·6rò ‰Š§Ñ061FÈ{ŽDWwà50)±©#B L™èígbf½mŒbÀSù[œð‰ŽçÚW?Xt)åÊòÌ{4:Še©üשg1='G™Vä®ql,:ç…äÏ ]Lªàlz‹ZåNË—ãô<þfthׇŀm±a˜¸9½hüZ‚ÿÌîßçQLWõ¤Qð mF¤®Ljmœ’é,–*8Q^ÇV|Åʈ‚FàµìýÔU7 ¦JXNΦo[—, Ę%ËÖ8·»”~©â@·Å‚¬r”ÛŒçoŒ:‚ÃÂ*À–Žd^XŠ5šA³Z|ÓÐò«"l0;zn:Èú nÞ´ÉËǹê¡!²ËÂЪJKeuY ¼UZŠäxµ29αk»¤²QRàW7rgòì´ñU2vÀ|…ò´¹¯^Ÿ¾9Û•sU›‡ƒ_ت›jòÄ‘&cùTaán SǤùЏ SG€Ý£*Ÿ&¾©%¤··4%[°£\ˆN+‘A`®€#álAÉÃèUôT c<ººJ{)ð‘—yã]„Ì%å«:”—Ë›G2®C&q‡GéÈß!Í3S„#³€nYÄF-ôˆ–gi˶¡‹С$dÒ¸:ßñä52H×r0!E_Úî!aµ¨¹LÁ§«°k¶‹ïµéꮓ–wuàÙÝÙÖµŽh†e–š¿‹ì×I‘áàöëf;%#šÆ0ŠÄd5hõ¹ÑuklÖÚtëR«);åTWàQìHK½´¹pȤ"ØqH˜ì…¿WE<ʃþÙÊ8öDÈ·—qÄFà©:ØUTÆUåÍÌþºkeóК*óšÏj‰¸¢U†„¦d%Ê$*jäßÈ4rï•ôš“˜ÁÞC¡‚ƒ¾eÞk!wŸ4 FÕÚ%¿¥‹Ù³é̬ƒ´¸Â%=™¿vÏ:\‡Î0šÉxë8ÆmS&²ÔŠƒ!šøºÓüZô¶\s³U–à!16}Ü0­‰£åánÄdNtÎPbæÇsJf\K•B›iN»öz`ƒW=ÞÊei£31ÜΖàôjí\™7:´B˜l¹ÖæKä”Õ ›xßÙ•ê]¶æ<ž©°üpкl¾\¹ža´ w4-•ÊÀÎSÙL°£6ë?5R¨s˜šˆ1ôa:Sm¯Üs73…›Ú»¤ÇÇŠ %çÃ5Xõ>5" k~b“™ÜÓDDí:¤‘§í»NÎ4/.Œ;©˜Ðã„ãÖÁ|ÁoE “\vi>¬P#“¨Ž!P½ÜÀbÀE°ÕŒt P£+øþ{“#6°6ü¤k…B†òÞxç°EÉb·ôòîì7ÔL?”ý˜ß9C±N«ß8k:€ÃÔ‘ñ8@Û­²µ% €ÈÔs«ˆÈŽìwÍå UQ_äåÛótC|ë¦*¿?ý¢Ù¯º¿&QöžŒO{⬣3椪2t«Óý»ÿ³5Zü”û¦±KP3•#‚H|%Ü^í[›áîbúQJîÉ-* ÁP¢nÀÅÁœ¨ƒ¹qÍåZt(”•Å;½†Œ( ðãšaÖs‡9â5=dG­W.Û͉™V· ‡ÐD%J#xÜÖÄ1?Xl«Óû»à¬¸Ñ! ÂÕGlÍ{Rqƒy×9TÖæF›79È‡ÙØ#"š1ki"ÍzÜÁÚþã¨9ç _\Ž7ärµ–†Pª¹ÃOÛšPž¶ 4Ĥ_Õƒ‰Œ Eï(ÈP3¸4ñi· t’ׯììhôài˜è$ 4—¬Õ?¾ÊQsÉ>yX(íN’"¢ba”¢Ø¡Ù+JXõp5Ù iÁÊfE+úË*ÎörÄѸFWEn„jsÑ®g!éáhr€öݪØ.׆ ëì½ûêCgÕû´«g”O¦X&c²ºQWYÀƒ –Ua:å•LʭƱÎVñjS”„y´C·[ƒ…¹1‘iÛr£-Mž¾Þ.[²¼ Y‹œ˜“½UcS ¾ÎŸ…1Ë[[ãý~í«¥·¥¨áÙlÜÅMÀk0#¨µÏ鋽Ž6ÄešAŽãñ )e21ˆ-8äo&&*Óó^‡‰Z:C7ÝŠæ·Ti¾T¥eÜÄ(I^vn·(ä¥ \¹)ËHíÊÕÃè;Aª‘¦©çWuKc¡BõM:¥„52 §äu¥àkáF©.¦DC„Q§]”©B:0Q2J½¼­0Õ¬$øB°1Ið™êA¥ízªMth~å œ1‹se4Qz»Å!ˆ—§Ó¹II@DîˆÃúÆsBzD^yy¸>Ú×èC7WÝ~¡á^ÒB 6ó÷FG2 âˆÂs‡†ý‚Qƒ:wEZ6¸lÔ ¢èœïÞkúÏKDwb¿–À7–Hä m¡Ž u„Ô!DܶѢëWÚæ¿F]Êô[©ãK©pZ £"CŽØ­ÁñPªô ¹;” Ý3Ү̎!è]¡¤Ñ;þ\"Æmâ oyy7Á"y(å=ºÞ³MÕ\ë¯XLJ¢†:7t’ù!eº‡<Mä·AîV³”~SˆYå E ªjý ɦ“è‰uçV«•Ûu1N4.äŸJn†÷´`5™â’.1ºŽÅÈ!ëáiŠqu°²²‡ÜšV§‘åª2Ï0ÚNû½ÑdO^bÁk¥òÍí„A§tnÄãOþàÖ—uÌr2 ÊÐÇÍ8j‰’Yì)•Ð’fþñ-³Cßõ@£g"-ÕÆ>ª X'h£Æ_ó³šÚ_Ç ¥›£Òx—Ú¾ä]‚”<ñ j^Õˆwͬð°3: pg ‘!£(bâóœkè<ûñ©ÑÍUÔÁÚüXÄ`BÉk›VhW94Ø ¨¢g•¡ë‰7áP³Àyƒ¢RUði9Ò“Ù€¦R?oò¡ 5èXJ]ÓHò¡ô8#4ÇIØ„,¦g«¦ãã±i£ËÆ¡E\¥_±»I¶Á§¢ÅØ¡ÈÊ.ßT®*¾wXŒA32Üh,êbpã` å N¯VòE‹®â6’ØŽ’ 'µMÔw’éÖ¡±1.‹ Úˆšg® (ºò™RæÈøªlÇ™‘Œ:„[³G1»G‡²÷Q‹ç‰¹E[Ófqª‘džtª³R¤Æ ººŒº;ú¢¿Æša• _ÛìúqHShÈãH£&Èi&Wd°UEI…H#^VZ85&2øÃ™iR°Ô' š*´ ÒQê’À¨¨­Í4íƒUO+ø&Åc²#Ø,èUm1;#ô6*±66Í ·u¹* ¶¡„ªÈ}°R¶hbçÅ(¹ðL–¸~~GlkúFàR!ò’žTBŽÁ r1Mát¥;vÙDû¨:«Ç… ]rÆŽ ¬+ØGÆùêj×툽3=G‘Ù+4­Í΂âo.ç†$÷N&¸}‘* 4 ;Õ w¹e¯^ûæcž²ª|#]?6¶Ú÷¦ŽfÁøl<âPÌ·©ºÛÅ%=¡”2¢VÅTzƒ1:4 >=º?2õy{»‡1ÂÒNŠ{æýi”nguG`-¼Ù d\†Í!FÉ8Ò‰nÃÁ™]݉˜(-laxtpS:Ûµ|»Õ{ú×Óϸêä½®Ø=yÅ•'Ž^uÝÁ»óŽ}úY'N<õŒ³¼;¸{åÞ#®¼æÄe¯¾üè#ŽÜ»ò²cßwðn«_}ÿê?«ÿá]Wÿ‡ëÏ;zò䱫NÜǯ8qì>W^uþ#®:zݱ«¦ßÛÅiìKî}â²ó¯Û{È•Çõß{è'´åÔs¯xèå'žòèUßwÀÖ‡n’ÜÙ~×4·­«óÔCT%ŸcoßwðôóO^uʼn‡<õðá3vw¯Ùûá+O¥ßN+Î<ã«WÿÃVÇb?xæê¿ÜÊv;øHº*ó–0?ÿ½esm3›5× «JLÙ q—çeßš+j=Õ/Fq4ÀÔÌ»C@Á„ŒÊ·ª&=ùìnçߎyM£n>ƒÝ‡bŸØáËWOðÔž8qtïØezÕÑË®8¶Ú¼û¾é”ÿæŸ?ô‰Ñ¬,}þ×Cø¾S½Q{Þ;ðÕÒ=|øÀ>{Ð…ÿmP×ðn´z«ÿ¢×÷Pþ÷iÁ“ÛþH l|¨#›Ær$Ü1S]s‡Wä5*¤—JÙË}P£PGϨžƒÂ·l”dû]ã ›ò”$­ÎÐýÍ„X©±Wõç!¹G˜'ª“厊JM–³–FT¿tÓ+¤FaÔ¥ÔRÙÞU‡ªHPÛø¦cMZY‰2|Ö­ÉÚÈÐÙ1r2ÞØ[Ô"“ãPE6Ú“ØÔ)›SŒµrÞZ„E‘Æn#´jYÈÖç'¡·Ì6󠻀s(Z¿ÃyÓ‰šÞ‹Îp›ê5„ªÑ(Ÿ™ˆQr"£ÌC(¿™Gàzñ€ØPî®ê–âäÃ{RKðÀÞ°‰RŒ”‘¥9E‡óŸÒ°M9¸!Œb‘ŒÅnUe‡V7‚lÕð­DXb›†(j4gÅ~ cÖÀ+IcOp¡{Ä…$™f)Ò¢›\´;+‚“Cd!sêJ!U¨™Ø+kPQgZ_q†ÂøÂÈ,»ê5H£×€Fº$iä²-ñÓH³{ôI"ú}MßU;ˆTxÊÉ NÓ+%àµdäÛà ¥š*Èÿ"uF >Q0 ÷z&Ùb9`í0älF ˜sVüærÂc•iU€ÿˆdÃA‚"JÝ:ëV5tÐ7GÕ1M#T‘~¢âI_¡XÑ{Õ!ªéƒ(Ò‚Ø?&ÊR vŠÁN{'~[­÷âœáUŒ–Œ9B8œDá£ÈгWštˆTŒl,ñ¶M ÞÔ¦µOÔt7ýTÓÔ ZZ ¯ªÝNÖ×ýÙü5[1®Ÿî¢o½ Á^¬Ý³ÐšÉìLTD¼y} ”Öô!­ü ÖJQ1IM»C(° Mqš 9ý­ Ñéн6úgïà YÝìÏÚåT÷ ºšôÆ:æ¶ïÃÜç×ó¸F!<ßÅH±Ó=t γ!öÕ´[*hpãxLÑßtÖ(Äeš7ŒnKŠBªº®•` €(‹|#éI·)i#té½(Vr#Û‚Nß‚åÄH‹¶¦Ež”Rõ¸V«3ý¢HìQ;ËîŠù?Fí˜å3<ë$®Us€;º%DÅ0b“9Õ¤Ô1ÜÆÂä_·¸ök%VÖq¡ ô”raq„ÚÒƒåN(NxTÞ©Õ®Ž6yÞ B®#g=ûiŠ:|11ëq$^Ò–{.š?œ'Xæ{ƓȒÚ|nE„¤—¿V%öåû(z2n¼=Ú¢íÁ%øsÙ·µUA¢Û²„ ÈµXodùâ&FÇ¥-k¸i&v±â›"•ߥN¶~I]Cì‹ï®àúJÔæÇLb=±¯}ù]I=æ=‚²^µ…Í…åÄK]î?äÖ²XÒ¼SÞ¼¸-ûÚ~¿žÇ Ûîbì®, l/îP•­ªi?íÚ]ùÔÖ÷xº`(myúŽ‘àóÉÁ•½ãœæ½ß§’‡ 14¹ÇùE@ý·œvtAWËòl4ìý|Šîÿ8é×iý×Ëq§»([Nþµ{Žøõ–Ùm< äOƒÄÚ‡a‚ÆјFc­h\Ô_±r©<Þj¤²f<:6¦`0üÒŠbxXk ‹«+ÏÒÂ4ã€4̰٣Р÷miöIjÎ/ìC…‘ Û5c’91X5™žä°ˆ˜ìd¤R”T E×LZŠ’Š®Çd³rÍKS™bž>m1¬É“éÈçÀ 'O¦Ô¸4ØÉ‹‘Ú¶5óže ‘ù3й$Ç/ÝJÊDäV&ƒÜ›žúÒ!!!z×…òkR§·æèÐorkK·ˆFsð¬à@QZG)G–îVçÒžç,€ppe/uxqPFO4Ï ÚDž¿³Uªj&˜ƒˆÆ`jDÏV'8 ?$Å®¹áö æÝ5ßµÏéxºôÚE&wò‰™ 1ùMšV޹ìð·i ÿéä™3M^®›~|Ÿ3&q&ìà g¦â”lP¡&Âí%¡]Ë–~jD6xÖµoºûg”l’"›,Ì>F­X‹‰Ð‡ìáæWì~gé¬~Ñ6£2´m?ìÃ!®Hu0G´‡ $Ó–ØmGšE‘$jÔø°…œz‡ÄÈZ|Š:Á5E³hG1•)îż” ´eS”¬sŽ..cjÔ©CôQô8E꨹!R§Q=ÔºF,‰ÿq£iÄ-”á5¶( ¿–(äÚ/òikÊ`}ì"” s8 ì:_´H:wyß3¿Ð<É<ÊeÇãÈ"Õ6?º,©ÄéÑécÎãp/$‰Ù½|}I¼¦1^v2ÚiY$ƒÄED>HóJFú"Jéä´2)ŸãR_®còš&bû±ê œìràO_Q˜f?/dýöˆ+Ô ú‰>Íñ53â<ΫX?}–‰Å&Î7?“Äê6C0êf2Ì•¨ä*½,{Éf°íRwF® Kóà‘v–µ;.{â¶]êþL~{^ìÏ=ïÂ×¶Ø÷™g?¬”ÛžPr¦h‡SIÖqújÀg;îäcnýádðÙX4уÏ ¦/A?Ôå‘˺ ÓÖV¥ªM@çËø2,Š IuT˜Ì›ÈMÏCx½ ¤èÁ¯:ïUÐj;xˆž2ùöd;ýká*#ðbˆhLÃûLÄ, þ5¬5IxذfÀ°ŽjŸPkG°£¸µ‹ª²ï-Œ(Ö> ~²ÃÔäb­)#§U㌅ÿUM9Ž^º2 ¡†KêÙh&" ‹G4ªAÉÂ]“-gæ'éÁÑm†jÍÆê>ÌZ–gí}B`Šð‚+ØÌeö*úp×T¦]ã|Ìi·þëÕ¸qc\•ãÙ¼ èp,îyËì²àÆ6Ÿ=9¿ùä¶>ch-ë9bC¬u QBdY‰A²Àö! Ó/š|ae”ɇ‘m’`íJ”Ï>LÑGŠ•¼ïc6‡§¦ñ™kDÃ6c½SGªjMÕBÝ.óF'§þYÀ–áÌQú¡„™gyåPhDØG̪˜¢Â\ìP‚j€m“^ ¬Æ‚GÒXSÔlÀ3f!*cžýsˆÆGU†e¿V"IñÏ“*¥1ÓˆUhý3%•ºÔö1®,€`XmÆC ~v*[1ê…j] ^AÁù&“‡*9£¦×£WÜ‚{D¯ø.”ÈNÃWÜÔ§?ßòË}Æ”ð™ÜÁÐT³`w¨{oa9™Y±Hbªöüü‚Ý…é@!8Èë¡Dn¤Bï9”(¯?˜ÚÛ€©nŒ«¤x[îBÜþuâ½·”ÐÐXíÆZÙˆÁNxéHàee±97“ÿ;›‡$Ø(ñ™ï#‚aý®£œË9R@º´µ§ðõƳC°{ñ¤£Iñ.Æ…q±qr_¼oç+‘üu„¸ÿbÕ…i\[ŸH'¬­å`j³Óo÷u¾‡ék B²üöŒ-sþJ à™ñxæoÚƒÕ•î!L Ä€½¢A :èq¢Q”dö=lCœlsP¶”5R~ëÛ›%çÍpJÛæ¤‡´Üd-M9íÈ#9mÝ#÷¹¶ÑDét,Œ”êt€ŒìÚq3ÒµÓá4òºÓ16²Àk‡ ’¶l'$.kÓ#ºòlrõˆ“×ÏÚ•µ›†ÈRè°°Y8Ý3Ì“1Æ 4‰ý =…y„}ça¹ïåõ4K>ÙH#§¾f# üd#\ýd#Ìþš4p“4“4ðkVë@#L6îÀ-LÖð9¬ÙÎ1YÚ<1Ùäj±4à.c²ö‚c¸î±æC pÈä: Éð±ädÍ!•É}P–ÉÑÀ—5·pÀd&'rj&wsÀoÖœÓÖ™\Ù뙜ÞZs‘dhr¨¸hr½iÍQÀ¥É­§áÿ8ÔZ°``§Fda€¬¦Ä€d­…+€k n ¨×À°µ É€‘M!–7³PÌÀ¦­…m&$ÛòL˜·šrËàÑ„§¡¦ y7‚R†Ò[°&DßvMØ¿›‚ Žî Vh7mTâu«CŸݰ¥¶!‘­°C®«qAŽ9îm\x Ïèñë­Èǩڒ'Ú,9Õ¦1ˆû;^­r&sØG{¬ Fb–±ùÁ?]ªãÁ‚ç.Ivss‚»cökãOÂñÓ­+#—‚]@BíÌåXma T³ù=/Ì¢K(+­1Cµ…Y4|½Ýt]ýè©ÇÏ$t9‘#‹éké1J»f.RWnÄüÕ®îO)(ìCÙMÌ0È” ð€A`$‡LÀ;‡¤ÙÍäóÂðZ’k69K8ulHt­åYCÐjÞ„nÂgÓåÑ[®š5±îµyÌ“$ ³¢wÂöȘdsIçc6{4z”"‰XlQkÿrm~a²yƒÒÆ5“mÝ«Š+K{V/¸‹©÷"š=Ö»‰Ì³ŒÂ ­im#_!·Êj±ÍäIöd«¡W*Sÿj#SVMƱx+]ùSa§¾6ǚǟÀ¼‰tPXÓznÓ˜§HÁ× ¹¦ÝݳàÖétpC”‘A Þ ½Bµ@¹•ÞfOfå )@ª$³Š7ƒ0±"t `œàÀs¥ãIã«VJ¨­™gI ž_”˜†Jx†€团CQŒòÚHKš²2 uALŽk‹Š=ŽÉÀÇš?éì•ëðå0ƒ¨Ua¦7S“«ÙŽ®&éÀ­Ó˜çÈî¹m(‚4„Ћz35Ãùd2pnSø׸®÷—fSµNP™š ¨4„kªpÕ„Ð[0ŒUë§k! 2¨¢* È ]×g1ͼ‘ôAÚF¥5³ò(ª®Í ]0_†ì›ðÆ„e @kB“0€«ŠÕ¬adóŒ‘qìsê‹ ²¯dy1‹y†KôëP¦àpµMõ˨º¨õH¥ôèÅ2#pÃC¤€Zraeü$JÔSÂûkbüDÁ@fÞèÛ6¦1Oîõ)VÝå¶K m6o°Êwµ˜Íô‰iƒMlã!Qáiªk´ª² endstream endobj 79 0 obj <>stream xøëÓ˜§¸„®Éžu Œ¶-)ª%ÄÛ_“šÚÍ¥Ú4³XØ+-ëmT†Ÿ`°]üÍå¢ìJE½X¾ó˜&ÉI›fßúà“‘´OÅÎFæ(­í!LÎÖvœ §*‹bu‚ÛØŽpdЖ˜Ã:2OÍö fÜæËYÌS¤šõ¢{;‹ýîY(Wp@0R«wlâ­j£jJõ¶8ý)åY½½ôhC`w-qŠãÔXÞ@tôõ}âwÞ˜Æ9â<î°6èI[„ú5%ñΗ+sW¼ZÇIïµÝ„o²Øº[§±œ£Òs5­7s,ÚóÓÝðª4ûx¢Þ"%áú¼¸5²NÞ¢!å'(2©Ž.vŸMà²æÚù&lûªM娦{mË9ÆÜ5ÈäácŽÁ'½s×0E—šê „ȑהæZ¹F—ã–b ÎÐÝNhyç!¾2:óM(É*';“=çå4–&Ø.½@q†I±:ûU…¢Â°#+!j¢8Ô óœ óÜÓ4IÖ¹”´²òø®a©Í¦€:ãòºäpÇ{ÖF&B¬†ÿ^Nd«yˆäù0{+†ÀÖB¸&æ‹&ÏC±Y ¸/ßCEV”‡0 ³ /:¥ð£Ùv«¢Àç2^’=š‚Ý¢÷6„× ø~c"[]`%†/qÆJ´G$% ƒæIÙÎw jž¤Ždˆœ0ü*¥Ï&ÀFèÿ!R¹9€A&\3u ÌÇæ<–žwl]á@9M~·ž 4R"2vö»Â’­cc,+Ú‰S#4…ržÐN(ï#Â}!Pä8£ZãxFQ¨–ìÎõúH ¬ObžÊIÏÕ†ÒG{ ÜêWí÷ Rr.älk&ïa|¬W™IypR2@ Ž÷E¼nÇÇ.‘´iàn™#Ò ˆXŸ¥`Ü*†2ŒÛ4ÜþÐ9ÄÔùðT¡cç™gpɵ„Û® Ž §Â`ôP]Ý¡º |·ß-^u2Âî*Îk ÁíâC\.>ºA ÿóR'$P"vBÐÜYc¨šz*R*+mNæûÒºt}˺‚7ç±™¦¶$ °b#‰âJ2d™¦ƒVœ–‘wÈP¯k¬'õw°B4BÌIöƒ#ú)Æöµ-À+!¨mX!Á ˆkY‚ì›kÀ-rj/tàþ†FÆz½&hÞF€Þ`^űD-_æ9 Û1r0‚,&7FX›Æ6ÂW`BÍ .ÄxÃŽçnD\²;=F0Ä¡Ô'°aî¡)ò*ØïóºÛ°É^–©R†´2®Íbs2Hü¡1Ñ­Æ,{3cû¸OA†% ›áëU‡ðÒbÅ…³Ç°&¸j³ mu‚QÌî"Öb®Dkó˜×íÀ–©g;&éõºiq3ŠYK„|F›¨»síïp¸Å®›žu 6 Ùjóµ£Yä¥*ú Ÿ{sÓ$'ðß=™‘‚‹˜1…µX;à4ç£Ò¸"Rq”ޏ _jÔW’M¼æL/iPк3™q óô0õÿµzÏ»êʽc'/?vÍÕ †^pôú›HÈKj¥Z†Wo‡4DúZoPôJVÔÐýj%f‘ÎIRópíÑ fÐ{#ÆÕV²¨³!œ¥Q$Ì=)Úà°`æ[õ kÎ1'Qn·Fæ¹Î"Ðê'Ná%6|¤™™–8Æ¥‚îµ%©Y¯"¤#÷à 7sÃH]…3Ø¢i\ÇYêJPås9ÂIÏSÀÏ«§&ä7,†Ú$ÖABÆÊuM@Ïæ®ÊÎö ðkeô!iId¬¶Ûè–w`ÔA2@¡$2%ÁIü9TDgYÿ}Õ' À Ü—¤(VrUº{õÛ"AÀ­ðó¢ä;W^Ro®ëÝÊÆ\¼ÃÞÄ );Ê ãºÜ‚–ÒÑËÍAÅg‘B“–*R0¦¢jƒ_n¶iU‚¾Uñc¤¨%PR¾Êo†8ƪü}Sc’•{XõDWÆHÑÆnJ뚎§RbGX>-:…´‚’BŽ V¢±`E”åû®ŠŠ–ìON• ¡Oä+ãZ–Þ«oâ „²ybÏ‹[*!‹Ñ%¯Å9«…(Œ›–7°úækôS•i‘’ràù)-[t¦CÈßÃUmÒ«‡z-nVï!š"eUƒU|”Èî!%cJ<d€]Twù­—$Ð!Áî$A8ÕÓ&ê;b.û4èïSh"d!E 0X°‘ÅI‡#lBÝ\‘Q#ÓðgÊ^+QÓ`S#ïor}k›«8(sG%!_XeŸU'E®¯Ä®MªªL£&Të±gHB¥ÌÙ®ryCQ S´h¼vôø9GO^uÅ£ØH=rÆYgêðãW^µ']jž®lØË®|ȱKÎ8«_²ºóO^wüØ%㲓KÆç…—­=ÄðeW?vwü ÛØ?|ôê•¥¾jZ]j5—3Åè¿×±k¯Ø=¶zB׼܋I÷‚pPöÙÏæ£.¼®õçž|Ö 7<û‘¼óWþZi÷‰/ü…—<몳o÷¿ÔíwN>ç^qÃSŽÕ¯ø¥N9íAá+^öüGßK£?ìé/yù‹Ÿò°#_ùGx»s®yîK_úÜkÏýî¯ø¥N9õÂÇ<ÿç_øÄÝå+©ÕëzÜϼè¹×Þûf¸Ô)§?ø±Ï{Á3N|ÿWô"j8ºø'¯Þ“¯øÊ.ø¯þjþ¯;?ðš§>ë§/K_Ñk}í×òÝö̇?î)9¿¢×úµeÒƒù¸G]ò%®õÿ•zà_Ïÿ}êyäÕÎ_Ék}ãínÿ­ü?nsÏí¸äŒ[ïû˯þ²Mâ[ßñ{ÕH;õìK/¿ô¾ß³ï/¿æËµˆ¿õNþn:•[¶ó/yð9‡öýéWý—y±;¤»ûÛêÿ¾ý=pñù÷øïûþöë¾ñ˺حÃg$ÛØï|æ“ö5پ替óûÖþÈY÷ ¶nÕÎûÑ‹ÎÜ÷ý†oùºÿú¥Â½Ï9猻}›5ÜéÌ‹/½èÈöûý×~Û·ÿWgv›xæyçÿPŸ†¾õ÷_pÙC/>|p¿¿ø–[ßê›ÿk—J÷=ÿ‚óŽúö©í.ç{Ä•—Þw¿óòëou‡;Üú[þ+—:ëž¿X ·9ük{ÝÃιÓ>ôÍw¸ëÝîôŸvšV—zàE¼o\Û'ÜÅzÚ³ž|õ÷[ ·=ýîßÚ­þ+—:+Ýf­ý;ϽæÙ/ùùçÿÔŧoÿ»o;ýðÙ÷Îÿ)óçVñ¾Øv©SNùÁG<ïW^ÿÚ—=íŠ{niw¾Ïݯÿ'.v wŸ}.uJ¸üù¯{×»ßñÚ\{Á]·ýéϺäòËзüå>ÿ|ÏáûÓ¥n»¥ë».}Þ›ÞûñoyÙOÿȶòÝg;yÍ÷¿Éëmï~¿‹.8;o¿·û]ÿýÙ?|ì#þÎ_|Ìý·x}·¹÷Ãó„G»×MœØ-ÓÎEžS¶ÍjõÏÙÏ|Ûÿí³ŸþØ_¼ý†Gô-ý?xüI×?õšÜD‡ðÔûþèƒøûíçg=ëó™oüì?¾ï5O~Àwlö¹êY?÷¼Ç]rÓŒ ÛÞó¢ÝKwöÝaϾþ]ùü7Þø‰¼åyG7_Ëw>ð§^ð 7<õagÜâ¦\ë´\±wé½öy‚§œòCÏùÿð…Õµ>õ׿õ‚ÝÍ“Óí>õ¥¯ü…gî¾)׺ý}/ä5GÛ¾ýç<ÿwÿé‹|­·?÷âƒÝýÄséU/æû0ýüè'=öK8tçýÜ{>¾ºÔÿþ7=å¾›Ý÷¾î†WýÚËž¶{S ÉÛï\ýŒç?ýÄÝ÷ýÁE/{ÿ¿ÑµþùþÏë6õ½zê+^óêŸÂÅ7å;ôà'¾øå?÷¨Ãûõßåäk>ð©Õ¥>÷÷ï~Ñî÷ntßã'~öU¯{Õ ¹³e…nü“þÜ_}ý+Ÿzî~ý‡Ÿò¶¿ý=¿|ã6¤Sôä—¿öu¿øÌË÷}³Åz÷“/yÓ;~ó¥W†}~ûÀ~ÿc«¥ñù¾ç®Øø.ÞïºþÚ^ý¢Ÿ:ÿà>þU_=ýË=ýÊw½÷÷ßøÜK·G1]ýê?ÿ÷Õ´>ùÁ7?õ¬Þïß{ö/¿á ¯¼þaû®BõDäŸ3ûê÷|àïyÍ7G¢vžõNz„_üøüâñ}þ®—>å¯ãkVÓÚ7<öõ³¥uø ¯ÿ£|ôC¿÷KWo[µw;ñÊ÷ÿËjZŸýðÛŸ¾q3§^øø—¾þÍ¿ñÊ/ñq}íÙÐ:òÄßøóò_?øÛ7Fûîçþæ7öÖ§¼ûœ×ÿîûß÷?^ýÔá¯ZwÉnñ]ß5Mì{ŽÞðî 3ãÓùŸ¿ôËWvÖÓßò!Ú3nüÜß½ù±ËyÝáO|Õ»ÿìüŽ—¼ÇhÝpÿnyÇ;ÍÝ}žòæ¿â?ù¡w¾àèü•Ýåø+ÞûO4­¿ð¿óœå¾[®|É;þìo?üÇo~Þôa~õ†t«Sï6ŸÁ«eý>zÿ7~ñ_þüן4/ìûâ.n¼ñ_ßÿŠ-§üÄ׿ÿ#ûÈû_÷¸#£qñáò?·¾[¸ó·Nÿ~Þsßñ·Ÿá'õïùÅÃæ¼Óå/ýý~^®õé¿~Ëãgcã{òsïúпþû?¬¾ðiƒÿº é–w«aþ ¾ÿ'_û§|jÜø©¾íú‹m/ÿÁǾá/>!—Zíïÿ¥Ÿ˜ö×ÕŠúÃ~æ³}Ï‹/šFúÆ éÀ]àžq2±¾÷Ø‹ßý‘ÏòkùØû~õ:‹@Ýï¹ïú»ÏêµnüÌßýÎÏ+ç{ßÿÛ¿ø±÷Üð€iZß>?.}÷8ûÌ<Ù÷~üëÿô_dbýö眧­w~ø/òw¬ÿ|òƒïºá„íE÷zò›?¸úðþå_rÁç›n÷߬_ë»Ï8ÿ‚6Lð;]ú‚wý ¿±/|ü}¿|â.öÿòßíR7~ñßþê]/»öl]t÷yúÛþf5çOüé+/ã~ÃwÜé»çm‚þùÎ3~äè%÷ocᇫå}ÿ‚¼±·À¨8çY¿õáÏŽkÝø…O|è÷~åI–µsæ3ßñwŸ£%ó¦yÉÜÞå»®ùG·¼û…—ß=gZ@;+Û–W÷>úž—^Îfûw?D¿ñ1³OþÝ{_wý._ì¾ÏzçGV×úÂ?½çe»áwÔ#g„5cû´<üäUGï;CÇ_ñž¤“þÆOüÅëËA8ñ²÷|ô 7.þùôßÿÑŸw™ÓkÑ|ê¯ÞúôsÆûsÏÿ¡ºôîxîî{ÌÉ£÷ëãÌ'­v{î³ûÎç°íQñòkÝø™þñ›žóÕqpÖõï¤g¸zÁôk×›×=xéƒïß®émŽ{ô“~úä…ÃÆ¸óC~î·ùƒþâÇßû²‡Ò'æ®xÉ»ÿþsk׺ñ³ýã_æÝñ”³Ÿõ[lñÜø™¿ÿ½—íÁ–ÿoýÂ+N»ÿi‹‰¥?ú©Ï|•S<<]óª÷ÿ3­ðOü髯¥ö?öÜ·}èSë׺ñ3ÿðÞW=æ>+GémþŒ~&ï|áØ—O¿àÄ£®}èY‹£ó.<ù´ç^ÿøËï5ží=óíüןúÀo<öžÔpø1¿öþ­?ÄUÿ‡Þõ¢«Î;úLl•_¤Sö2ÝÙî|Þ‰Çþô£Žž÷ÛÛyü‰ÏûÙg]÷£Îšîú¿úÇÿJïÿƒo~"o§wÚ}Áo}ðß7®µÚ[^óÔKÎû©WÿÉ¿jÃ?ÿÙo^ÿà;é¸üÓŸ|Í4,½{Ìs^ø³O9~ÖH²žóœß¦eü™¿~Ë“Åæ¼ç£~ù÷?òé‹}â/ßôôsO¹ðç~_Äçþé^ûÓzÊ–ÝÇ]ÿì'îÝw^‹·ÿ¡ŸxÆ _ôœŸ¼x˜§_óÚ¿ü$]ë­O‘k}ÏEO{ýû?úÙõk}êCoyÆY§~âoâ¼¹ñ3ùŸ/ß“§xèâÇ<çgŸý“-¬ûtéãŸÿ¢<ùŠÉ¸àÅÿ÷Çy^z­SN»ôú7þÉÇÖ/öé¿ígžr×ã+ó»å'ÿŸ·^ÿcl ÜþÜkŸý¢<å¡ 'ã;Ϲú/¼áúkÎñÞÏxÇêû\½¯'ÝK[N»ìùoþÓ­-üÏ|ø­O»Ï)§œûì·Ëºúçóÿô‡¿úh^P§üà‰g½ø%ϹæÜE<^úøŸyÑó÷cã!zä?ô™ÿ_öÞ;Ê«*Mþýugîw?ׄ^=s;Ø]=ÝÚtO'u™ P‡ ˆ²¨$CQÂEP1‘d©¨€€¥ bãRAÁ,.IJ € ˆ„¥ ¡¾ý¼aŸó …hßžoÍé™îbÿÎÙgŸß½ßç}žïÖ?}ÍšäÕM{‹_¶÷Óç®7»š“®xD{¦]LÓPØoâœ{g\]¼E:þ¼ú›fN¿±_nê¬}týw‡ö|¸ht–æô½cñ‡;ЦÅïÖ?1ÖTÑ¿]rÇ«›µ¶¾ußÑ­.½~ÖÜY7\Vl …µ×Þ>cêˆó²SßÇ>ùîàÎ5Ì8~ßÛôMþe{>X07#ûЉoÖ<2šÌÄßt;ýÞÙêŠ ²ßvj˜:ó¶«/±•èŽ{þ‹ï~³òîü²næª/®Û•­™;WÝÕƒ~é<ýMÛ;vøø8n°3êo½kÖ„º’#ˆ¨ïÄ;gM`­ˆÎw¼¹íà¡ïÎ:¿è¶ ÿŒe¾ÍÞµã¥l‹7êïù艫¸•O|Ó¬××–lç~×ëú9÷M·»W·aáG{ÕÌËÝx÷›_fµøõÛwÈ&´ïãŸ}o¿kÑX¶I““¦ßvÍ¥Nq…sÆÏ}tþd5NzÌ|3Á7ïÞYºKˆ‡?´vwþ»ä†þÙ»v®Y0’+(îãmSÇ\Pºs<熇—vü³tfþ~ã‹“yö=þ¼&_USzÖ~Òóëv|÷íŽÍë?X»nã™pl~é†SKm¹~õƒ'¯j‹}öšZ±ß}òÔ8þ”V]9yò••t ³¹z÷+ ü{¿ývo6íZûHC~ÿû—vOznCnm9ðõÚgï{ûS«·Ù‡v¯}` ›Si¿ënž<ª{ÉN󜉋7”¯ñØô½=$÷ß?ŸzÖy=GNžksþŽ;?]ùúŠ ;²ò}³b6ïã;7ÜtÛ䊻>«Â߈åèG&Ô^Ð¥ë…C¯žtÛÝ —­úb÷¡¢;íÛõõ®½¹´¯ßš.ã»ÆL|“RüY¦µ*˜.tíýjí²GæÎ™3÷‘g–¾±jݦoöU¾/»¶/¿Ç÷Ão¹kÖÄ~aég­ØVñ³P»6¯[³jÕê6lújçwe†[ùe¾‹Æ÷.º~μ»n¬)vœ3¡rkÉuà»Ý;wîþvßþCMß“»L{ÑôsÆÈ™ ½çÚî¿É¿êÏæ¾Óägýeö+—"×Ú›~öÉ{¯,>kwóŸ|{ä<š{íýüÙñfœœ{ÝCK_]ìàöó†eû¯kï|uãOöaßnX|ËE™A_}Õc«·ÿˆ XѵË[óFŸkÏSN¸dÚ’õ?UW<¸í½E/ÎN¥Ü!÷¾¾ñ0ÆÍ±\ßo]¹hJm’þ¶¹êáw¿üI^vp׆׿¿ÐÍÞõ‡^“_ùS¼ìÀ®Ïß^tˀ꼙ݪ÷”ÇßÝ´çGîù‡ön_ÿæc· *µ¬™òèòÏvý¨½ñûo6®^:BŸSKŠ­z]sÿËoÿñÆÙ÷»6­}uáWôlU(»Nh?bÖó«7íþQ>íྛ?xýñÙW_vf剠ïͽññÖ=Çú¶Cû÷lÿüýמ˜uuß6Mz[_|ÍÝϾýɶoåmÌFxÝŠeÝyMŸv‡Ã9ŸÐ®ßõsŸ{gÝ–{ÈëØ·Çì¸W¾üÔýSÇÔV QÝâìç>óæÚ϶îܳ÷ûý6o:øýÞ=;·oùü㕯>5oÚøçÚ-ý{û˯ýØ’7Þûè“Ï7nÞòÕ×ßìùîûýªøÖC‡îß÷­yË>zï­W—<~ÿ­W è|z³#Z´ë3fÒŒy ŸYüâK¯¾ñŽÙQâÛ¶m/¿¶mÛºeÓg¯~ëÕŸ]4Ö­Æ^Þé´£ +9á䳺^>êš&N¹ù¶;ç-zîÅ—_}íõ7Þx³ôzã×_{yésß?ã–I×нC›“›SuåïKÎhsÖÙçœ×}ÐØ&O½åÖi·U¸¦ÝzËÔI×îß­ÃYÕ'ý!-Nªn×¾ý9çVºÎ9§ýÙmÏŒÿ $³âIÛîƒhR„Íž­ñ±&ÍFǶ«‚koÏhŸVµùþÏè*åÑâ z×’ÝX’œáõ|“£9´ÜP7¼^ƒwmrõÀþC‡öÜ·$¹Mÿ5— Ô»O¦\Zòj'Fhñá™qˆ;§6®H¬ÓR˜ìˆÄGÈv˜{ÂâY¼ì96*=lGÄ/‚¨yP©( ‚Ï!ôQÄ\L ´²æ©Pˆ0¢@U Àggl~ 0«É»lè­DÚ ¤=±#*ŽÄéËÏû­’ B±8`ÒŒLÊK¤ Âà$ªlù,«5þŠ¥UŠ˜Ÿ‚>ËÉH~ŠITÝ,`–>¢AP>¢þ#JP.$žñ{–&låã.VìÅÂG&üY@‘Ä©%Py‹8“±Š•+Í@CÙÞ$r8_IXÜ.rÀ3—²_ ïƒ>‘5HP,aZQÒ®’ Bˆ?DIñ'„¾ÌQÈÔçÙbÌ ²âç=KV}âòÉšö»¢€M ¾¤TµR‡¤ Ô:Ž[\€lêÍeŸ£r÷ÚÕ'ÿ."N¤½Lïô·h>L(V¤B%%òHdî6ŒÏJþ&LHa"$< °õ0Í1Üç&Ô»C‡)÷ùñXIÖ‚@Åa@ç° CÙòJ„8Ìï¬tdb—ønFÙXfý(:-¨{$Â]ã‚ÉóR æc]ÇE{ƒÎö̾ÇAéšÆ&Éu@Ôíci3·qÒçb‚ ŽÉ3ý˜ÙÉŽU§ÙåûožcäÙÑò¡¯:£y¤]\:U©›qëánüÈOð7ƒM'0³Ðß™Îÿú»£}¢ðz¤ë¨íŽ?jÊ ¿úh7Ög\Øî(Ÿ8wø€£ ïzý=|WþºðÖ9c+En5}õšþàÍ]|[îê:í¡éù¶ÜuÒ¸{§÷>ª' ßr[Ÿ£{âÔ±S¯8Êú½ôÆqB™wu»ª¡M¡ð?â‰Î#êüÂÏä˜GœŸ×¿S¡ð»#ðBüsƒÜ꒾Յ‰GèÁ¿ÎÊŸYw±S(ü¥©à!¹ŽÏªÏí ']tÖaGÖ¯r…öëúÁ7zJ&C¯ÌõÛ0Wèó‡üíÔÚKµœ”!yÛ^qùæ[÷һɸ³Vm3àÔÙãïœÀ³öÃFtlâ°Ûùö#ÛNZ¸h"ƒŽÜÞ£.¯±æöœ…|xvÕÒ+å*ôñuÎè«í»`á†moë…Ãë+–낉“u&h7óÃï¼?ξ½vtßÒØ\5·ß~‰üÙç¹o?¼ÚþtòÀ!殪!wÍÑ!7äµ}_“ýØ}X—ò' ýî?Tþ¼üå½ëÆg¿u=¤Âhì;ÿÉ©kíøØ×ë¯Í~ë1Ạ¡sµó—̽Tþž¸¾±ñÓ³ßjnŸVa"ºhî‹ GÈßõïhüò¶ì·áóï%(^ñ>ã¦Å‹gžÃwz|gã·OYÌã9³—.ˆ?~Ya0àÑמ"ßôyã¡·†ë/#—~ð"ýãßªŠžhç+¯Í<õ«MõN‘:=òéö·®À_'dÞšF-Yñ¤¼¤û‹û¿yBêg슽ûWÆ_Ì·†`ù> ß_>[‚zæïnÜÿö0ú³óÂí«è-²÷O˜CκoíúçúÓ¿{¼¼ßëj~Å{÷¿A‘TÉy9h)¾ñ½/¥ÇNø¸±±qÓ-ø³ãÂmßë+üºñÜõTgS9ó6’{çÁ&qÒ'û^£Êm×ët} Eá7lh<ônƒy×*Fµ½w%Óôü­ КAŸãuf‚HÞ±¹±ñóÙ…þ/ €ú£‰…ÂÐå­ ¯;ô0»¼ËúãáîÏrñÙ+q½ñžS W}ÐØ¸}!À4éÈëéÔuþÿöCº/B}1û”Â-Ÿ›ïž„».š4Eûv<üÀ©/z¾Ô½ýþøBÇE;÷/GŸ>yÜœ[zÉ]nœRcê}Þç%ì}eHáòWö6îX„¹®ÇmóíúÞçöi cÞ.uYnyè¼Â°7ö5~:wõ¿ûëBzÊø¹wô*œûÐÖ’ö¿mz_ßvî]=ÖÜuê Ý;@^ÑmÚ·u+ zu_ÉwozÐL í|ñÕ+hÈîw<›K£vÌ+ïЀï=cf?mð §ÞbêùjjŒO͸[HÎïÝÏrÛ¯¬^lMŸ·ôÐ'ºOœÜKŸødB¡ûKÔ©>¸Ž½rùæU˜¹†ß3Ñ‚ô;ŒŸpazƒéUS c©xû—]È¿Ž_»oç‹ ½qã§Í{bíUúÄeÛÄWËÚÜÍÇÈÍh¼¯OLiæg4®–/ïòT3;‡Þ½BFÙ{Í|Åw/Ñ]8k~3kªñ˸—Ô<ýuóØ¿R,®‹–N†M\[‘PÍ3o¿Y@Øo_·½ê‚{×6ž³oõôÌXì~ÏÊoŽôÀ÷kﲺÉUOþ¶oí]Š®Kî_ùõa€ûÞ¿»W¡ä:ïªGß)ãëÐÎU³/,}À\®zäÍ6–y¾ßñéêÅÓÊ7èê8ôê›måšµk?àkíÚ5+_]xÓØ¾‡Ûäu4jÜUWëuÕØQƒJã]þ×»¶‹\ÛÝJÕb*:¾Åà‡¢g‚câAâ@p“X„&“X} nêˆ0c¤îè—º¢§Búkê€H!‡ò‰¸â ªÊbà‰E;VW`d%¾Ô7“ª÷Y|·PÈpYSÍmå³?ÜÂKﲫZ29_x0Dó ¡ü²8§.*[~”f$‹r|Ÿâ!„’…ÀÑ¯ÚÆPËðÄKšîÕš(—D,ÅÞ!'%›(`o"Ÿ¿§!ÕvI''´N«Ð¾ÌúœT°´"<¼lùEŒŠ1 ÷ ¨…±ÚôX -U-Ïûi‘4¬Þš„*@íŠ^ê@CÚ1¹0V¡¢ZTè'HqܪÂI©›t 4ƒ8ŽD˜Iz©êñSÍ h¤…€k=ÀÏãkÔ•IPÇ“ LÄï ùŒÄªÚ«ãܤŠÃ<`qÞÄcQI®”PÀS™¾~¯0Ë@&BøÀEXÞE:…©HI0Ì@´¹ ììª.I8ÒІ” ¿±Oh'Ss‰ëôIKV‹òKìù"W¥žr©!g`)0i¢÷bû~QŸO¡ýê (Ãcdôl´–³£ ¬V%‡*'/ÈœP@<䤗 HOîiÀ_U-`Ò]¥l“ÀUhPÌ™"QÕ{ ˜Ãè ­ÂLZ6-ES4Q³( ´ЬJ¥UUr-²Ë [Õ‹6ÝÖµ sm•J¬w=qìrA^[m/‰D.ÚLG3ð=ÒÖÄ7:©öÍ5´`X%œ@Ö@óÙR®.Ø0ÜÒTÛËsc]odeRýc²yr_€9€† œL2Û´ÝëÛ™ JÃ< CíÇQs=†ç«ÈáÞ)^q¨Xæ "ΕÀŽY7&½:XMAà¶Ë§‚Ë12”1õ(¹ØÐ@ˆ\‹ÖB7€ fTGõeSFƒ„0\·4ƒ0¶ú€ÔÏItÃÈŽO¶:ˆWËi "¦´UYˆG¡bˆ…AÎ’0U$šN&9ŽbÆ“&:m…± R"’%ìé‚Z)KF d¥Õ(eÁpªZô¤¼O€î™ RÁ\©îȵ€R¡o»¢••*¬Š,o•ÝCi~ƒ½Šô"h€±‰ lªŒ.@W#Ov* }‡û1æ ™K ƒbNêbHxË@$ÂiÈi%’9Ï%>ëöš~"zcÆpÐ^-IWKŒT¬®/󹩟Č]i˜±¼%H¬ö$Fµ¨C‡\Õ¢×J –dòRƒ6vÌ“4”qͰò­=e’uñ€1ƒO‘È †ÕËj€Qm²­n 33-²¦Gè³9­R …ʘãŠéHf*}@êV'Év`èщÊ/ëlZÑ9 ½RûPoç&dTW­¯Äª¢Šòb€‰þEqxÆvSXÐaäÚŽ%k—´ [©¨_Ø*˜&`3“•#ÃÀ ”ÐuE§{‚È-?Œ8Zü5ƒ€K`jˆ Mî^D"è!¶Ë<—!1 Ùß@6ì M^0¬˜sõX‚5€ª[4¿<ÁùMùžÈ%« „.0wÂÐ긅Y/FÇà]‘IL\Ý„‘ZZø1`Qá2mX¥lÓ1R‡´»MZ ¡ÍjiÂÈ¥ñ:vù#ôa&S‰÷ë y-€(:˜cí°!½+0¿F®ö‚„t2IÞÎËÊ/‹oà[ûÃT€džµTàÄísÙ|Ñ6”3‹ÀÑm™éD2?û™F" ¶)}SP×ÏéA²µçÇÜ0-):ÀÉ*ÒkŒ–n“˜ /Hkä µ"Ï<5ø‘ÝVÅ}@J|äu1aüuè<#‰ )_€-˜XÕ‘F h¢î‹¤µs÷bô{´×ð­‚«Çë½Èª ãDº IVã#Í*Àç)¯%$…4_˜;É0V@0Ý89V0«£0e? „ YùÀerŧ"áŠdÁ#QŒ_Ï%.ë͸¦J £~¤ ¸Hô³ILD×׉µ š¶¦S Î QH·é"ë qb1¿¨º¼ØXñ¹­9’åpzŒ k9ûj@>ˇrbDÐgRÖ1DÉ!5¬²#gÞ˜±.†HLS[ìÖÊÓnâÈØLùˆ²Ñ®Ëì¦ÀcJt\6SÈxâ ›X‹ÆñäÞP¦‘POIäZ2HØJà ô0ÎØ®øMbƹWë0fLxb¥}irà-'Ãx{J}X6ó¦"RQ€E¾zDàèö4% q2pHɧ礲ÎsfþˆÉºdæz9åÄËÔÒµ#4éÅj|ÙÕð÷n ñHÚÚNlõëÍË©YêºT‰f”%~d'ÓÀeÝæ$‹­ué‡U¬5ªýŒã&5‰ÐбÀ§v‡ž‚nD¤Yµ]RÖÕ¶E(KÝÓëùä3àñ¢Ï“=¤G·öõ|ô£Ø•oEŒ”#'::7à¼ÎÑ!GÏ8¾ÂKŒñJÀ3ãË1¯ìíÈ[D­ß íê㊓Íh”ˆ2„´ð‰ŽyÞq¬H|Ì3&¼u5#7ÏÄ8#ÓÕÌŒgÞàC®ÜOCIÔÓ/Ó–òùèäƒ.=Ž=Uà]Ž8ÇPNhrÍïêZJBÛ,Û23c\±-€DYß5~RƒUTÊ;ÉÖr/·{ÐåÕ׳Lø^ì:ä ä/–¡mãZ¬ckJžL fÚPtŠÁ‰©¢ÌóŽ#ŽµÔº "V›çDǰÐÒ ÆŒaã ’gq$úÜþ8Y cÒ}çÃLÊÃb¦±Ý‚šKÎ ÓH€“ yAÖgõ÷ɪ ?/Å”+…˜ÒjØZkØZ,f¶– ±UKŽH邉&êAa™Ç³¶q-žó'„®8±éò8­¢ðÓÕ%À¬Ì.¬w!Mæ(2ßíª ‹oÚÏtkr¸ˆI  fª]vóðäøžXÖ‚Q&úHåú¿ÈÒŒªý/É’hl bµ86Å,ÕfôUŒd©p7~ä'ø¿›Éš½äß@$˹ÊðÈõÃ$²Š¯ü1ÄgÑ|u¤&¯ŸW»–ð¯þxìù]TQêèò8³í±‹ŽºÚ»ÄgtÞ)Gß×JHÏ?¥ð÷|?Š˜­|`Êß›Oíq÷Ø< E²|‡A›ÚÎ…àê¿nRѤìú§¼`Ò¯M'ë8jÜÅmÀR÷ÛÖMk_ÿò›œ Ü¯Z›—wŸzÏT"ú¥W.þSéúõ 'ä?¼´Ò.½ûé®pTð—#Äàpmžp’—/ñ g4Þï‘×-þõw…°œþéòÂv?‡°B«óÚø´î€lXòþ # …?žÛù‚ÒX•㟗7¡h ¿\Ø¿sþ–Ö5ƒ4ž°rËÊ …B‹š†a%*E¿KÃ"Ý?üδeÃuyEÂYc'*ú.Þ~ð«û §^unq&Qû(ÿÏ_y' 'Ìšœ§£ìzë¢Go¾ HËí/Ý6iÞý7žS”ljºE¹ý16™ô˜öМaN¡ uÕ}ÎòO>ÝÄ$‰»?[óæÂ±E/.œtÉEEâ= ÌÇõšñèÜQ§~Ù‚ª:N_‘ƒ0ïxoî%öþŸAi´Mß^ù‰æWzÀ%3ÜÑ×)´H©;üÁ+ [’ƒ™nYrÍérûï[ýÓe·aE\œ¿wQË—Íœ3ÖŒ5ç ôñ–]/jwñ½ë-Hw÷›7+ô3ìÒÌd§Ž™T“Ïäô¢hì¬›Ç ÎÄDÖqäÈŽ…‹žøJòØ»òvAp·î6j ýÙîÃ7手[žlÆH§Éw7ëÄ6§V™GN›Ô½P'AëïVVÊ o}èÓà…žóß~ûþ<ÔmçD¼Þ|Ldz°rþ-ße ÛùqF¬î~þ’Â?ÑÈòÜõ…6ýj©ú.½oÙ"ßoÝȵ:ÓôOšNz-X¿çëU,^³ýPãÞ7òuÒ©ûÉ…ÞZÿêÌ{¦ È¬~O¬^Ž€¢) ,ß6§PðiÎïóì¶ÆÆý;¿%¥œ÷s1G…B»ÁWÞðò×û÷lzÿiúôÂæ-¯\ß½0‹‘Á߯š<è2âÝ­y6×ì›ÈIÒå·/&°òîwX<ø¥];?|aÁz¡8޵⡱~rÖ9Àñ7‹³¨ÈŸÿºpæõ˶Sú·™å»P¨{q7P÷™”Ä–çÆñà¼yc–Éž—3…$ÄžwÿÜ!Þ¾¹¾wP8wa &zËã}ùæé›²Ä]K³æi….:ú]îß~ü Óg•À¤×ÏæÏïñlþåãþR8¡Ý™¦õÎ_$ï>°éù…N%ño_Vø™ùÌ3ïø(ƒ«ï~gª•Z:©;I¾Ü¤Øô}«ÆF¼SŒ"þlnÇŸ“ß.{j{–ñû³íLxb—^í ®{­Ø8½0³8ÈfßòQfÊ톼jqÚß®½'‹£Mzv£Y< (Ø¿þ©uÅtÛ;u.´º¨Ïé…‘ok ¿ûàžÉëé—ràÇ-_äÞ\\«›n7=¤¾áœÂŠàÿþ£¹ùÙä섯¾li¹¾ˆ½¶Î0Ãwâ ]²L>ŸŸŠº\?m̨q7½ôUÓy4~·ìòÂ÷MïUhx—»ðîçŠ5¤.¾kñK¯¯úôð¡ ;Þœ·ìõ‡.+ _Έñ S‹ò(ô{tÅú/H|»oÇŽÏžêSè+½öšâLF>ýˆ–7×WO÷.œ³€¿zõ•Eytœñâ7O{aûr0×–yí …Éèï÷Æäó8åÚg–N3ßôÚ‘Yƒ×Oκä{E%éyߪµÏô.æ®q$ùܰžþ^s]>“º§6îþâ‘Þ…¹GŒÈiÜd:Kaæ—ô÷º;òK¿ÅæéMo<±áˆy4îý`ÎÔ»×ðxøàæüº\ó,Šp YÜÆ¾Ú¸…óØûê°üç´»ÿËæ<_rmkjÆOpc3£Š®Ïo6Ožüá_ÅrµâðL~fZ;ìÚ¾…ššý—fô6u}5»pîÈ‘™…wΛŽüPéupí} Ý™=…kVÿ€ï9¸cËÇOÎõ”%?ŒÄwÇk×eÕíæ–F>6ïúæåñ¹hñú—›3”^?´.×ßΞþÞh ­¯LΩé™Åï®æDý_›^¸¥C¡èê>÷££$!ßôôè2Ëîs×±í¶G—fa® þ´ù·¾1­¢êçÀÇ>iæíÛñá³7WÖ_M?¸æë#æàž­ëW/ff¥øx¾ºÞþÌ;wîkZ‡âûÍï½ôÐÄ+‡÷>=È™}®™÷Âòï­^½z\ïøé¶=ûè’ñ7üm\ÿ:U:UñS[œû§ªÖ]ꇛ²TµèÒ¯fhÝ™ë÷é\S߯ëè¡uüÞmš¼©}›²¢)8 > ‰ñƒV©ïGßh$˜–„hêà'×fà±o¨Aü1(‘BgS7VL ðI »$76cšÂ”á°ê ^ÇÈKÀ¹*Î)0qF/þáHIã‚_ÂWå{¼£…%€¼å{„Âgl' Ò≓08ŒñKlàÂý8T)ö8j[ƒø¢@!: èC ŸðÁ‘§Ñ7©âzc X-}Þ¢mQ‰Pˆ%ò¼¡äÞ£Üjª]Ð<„BV.òH‚¹K- \K¼—Õ »†.3ŠÃ’T¢çupP®ž d2É P§ ÐÅb*xÛ £Û À…°:%V”FF í7Øé³Ø0ákVÛ¨%E0y"g\ªR(–=ÎBád|e÷­&·ˆ£˜âj—D“#¸Lcù6©˜ÛiG‰Bš_# óX‚€&d´“%'¹è“8Ð@´0TRü¬i@,ÌÎ@I¸–¬ÔZÝx¨Œ?V‚Œƒ %±£@][j`gmøˆ²~S®¾„Œ)ôµ!@hY»83.ãÔ-¶¡5:sëbJ8ò5"Å>¯0ެà ^Ša´:ur²pÈ,eqš~Q̈ PåIðs±…Œ ‰ -Ù?°¿\߀Õ:GC,a¾¬Ôð ^Ä\‚”©@GÄÅ\­oÖÆô#,$–`sGqö¤O‘꘎4Ø&qtS%¬Ý/ÄcÑþà¡æ;™¾žBðíúš&ˆ7"ƒ…m`ð©Ä‡Žî²è&¬Ò±fHb.Z'Ë@¾@[\¢Áì rKŠO“=(þe6ˆ2n„ü†a£‘{ òæ:”’ÜlZ»hBËJkÞŠ•ÎÂïÍÀ¬F_lqE)âP* ^®â.'"!ØbýYÂ3—$JÞŽ8ŽË Fá¡'+¨¬?Ye­•YÍ"”Ë·Ñt.ïÕ&|*æÏ@¢£y“« âÈ-¶¡Ýüh® Mç¸Q~½æÚbmƒürŸå`r³Þ%‘ÔËqŠEcIc^Z²z ›l/ÊÏGb^R¢:‘èHtŒ†'Jàû¹x:ðpƒ+G¬qThÐë)0SyòÏgÛ Á/'-»JßËèëËNsš…<õ› dpgâ™bgxScÁ˜ë ~0ãÆô&T‡ùœÊˆ)kV:ö3T,ÓnÇ8­\œÿë0ÓæÖã)˜)÷ 3«ÌtX˜iîn‚™ÒüßÍ!LwÃø¿(Ì´äúû#ßr„ëgÿÚÌ›þÃ?ÿ±™¨Æ¿o¢´ÿûøÂ‹Ð•Mã› ÛþW÷ÏÿŒ¼*cÓHÚ&Zý—§$…v]2‚èÂ?6]1ÿoé§_Ôs@Ÿhê×EóyÐÝÏ›Àƶ:v\¿ í÷þñ¹_«ò2è?;±XÃ^¯³G\ÓpA‰öëÔÉåÑvÿ9­¨úxö€=Šh´ã³´Z¤gU·ÌÿÔêœ6ÀÈþ%ÿE>éünÕÅàÅSz]È ûEÂ"¹ÄßwèÔï¢ 3ÙêìžÝN.e?eÀ•P½Þeõ5ná·¿ÈÿvúEçŸXøÕiçØluIÃÈrþ¾VýnºelûB¡ëu“z ¿pþ’«Ã¸×EIáøvÝ,kÛ1·NèV–E¡ÛÍ?|S—Bý¼y@œtVî;ÿØýSÀ“zu×ú?oÂ=·U ¦>ùÚEo¾òøœçßy}vׂߣ{”Êç\h*£Å—µ‘Ÿ;aÞœ¾åYjX¹ñËO7n\÷ê¬Áƒ.ïÔ\îÖ8Š/•–ÇÌ7¾eùi_ߺwÏk?\ñìŒQ—žnЯŽzê…Ï;wøÐÎ2¬zN{ð¶Kʳ(tyðãíŸ,¹ëÉ¥ONíA•ÿ[»÷ ä[‡‘õÝÑAþÎÔ˵G¨³«ªÁY—^Úº@—‘ƒ?ý`ÁëîzlÎe²õÔ’;Î-œ4|ò(þÎ3ÅŽjG½€ªÀëÛPcþøMkdÜuÚ¢Ç&µ-ËáÌ©O.‡ùiîìCÿÄßœ~¦ ãáØqä°³M'%¨¡ôŠûžž7î´Ò,úÜÿÌ=„tê}“K½:õ,tàï2óê9Ó[pûÈq£Í×Ä ó—>uËù…Bÿ‡–>D_Ôæâóxú¸dÎ KîÍÊÙ3Öìþn%Ävœòø’'çÝ{ÿt $ÚÞ²äíe3.(\ÿÚÚçé‹ÚÖ]ÌŸ“®zdÙSr£áÕ]f êï[òÚãw\=cÑÂÛP©ý¬\ÿîÓ÷¾¹õ›U“é—_*У³o\ôÂ=*ò‚ÇýÙ¿vÎí‹Þü𣧞_è?ÙsSÏ5M=ùÕ/¶}ùéŽÆÆo^0ÅN/»¼‹Î5æ,}v²£Ó½“{ÿÀW›wìÝûùÃÝÑ@/¿÷­Mß÷Á¶í›7îmlÜú̵CG ¿0›e¯}é …½Vߺ"äøŒÒG¾¸áÓW&™V¹réÚUOß·ÚÜñå«÷O¬Ë‰L]ùÁSÂY]÷̶<ª`QZ_öäæ=7eôг³/*ܸæûÆo×>2Jš±}¿‘WO{wÛ–h3veÞpרǶljÜ»Ü4ó€93LÛtyt㾯—OAêI ½öß^ûÅÞÆo^fÖù¶ó6æsh<ð.é&ÚØøÉôB§©wŽ;ïyíóæ>œ^ùÀKïÉÅ[½[û\ ¼æëçSžøØhï}è‘4»Ô<ôæójë5ïýo[qpÛ;pçør)lË3ã/(Ü €éþ/?Z6‰Fäi7>6ŸX€(Öz÷ú''\ÓƒBI½\Ïù惥¯ãWm{^ð°—NŸMx“°/‡6¿>ûÂÂ9<àkžÝYšEc£EÚn] (÷S¯= CóŠÈûàºGG·/üAØíÛ>¸¥< {m¼U»Á€¹^m:ã¢?þt>æ–à<ªO8&íËéšÅå¼ü ©qï£÷FÒÉÝ¥ƒ_ñîa\ß.QÐæÐ%¯¼·cá:À®Æ\&Lºý^¨PöúôAõŽ}wçŽ×îˆÜz'%õ¨¯áUò칇ãò>´ñ髹v»¹kÏÚ'Ö£È{_‚vC‡«'‘UmÄ+‡… n{oÑÍ×ß0kó ˆ¶¼|Ûu7Î~`Æ`¸íço<\ûw|¾î“ÍÅP¨o¿øhÕÛÏÝa²#„ìÐΟgm¾ ÛñæÍ¹eàü9ï7 5™¿ö­]d.u¿÷ã„ übATØXJ÷|pTyürñ°BÉuÁÜ£)ÇÞÏO(‡[u»gm3ëãÐÞ¯V?8´`ë‚{×6£]¾ÛºnõOO«`5âê:ûݯööù½_­yiÁÄ+‡]vFåLÛN{nõæ]ûç$’ãvaÿÐÊâ³j¡ƒ7 SsN,VÈm¥ZÊp.¦ ¨Q]v賿ÝXáyŽú—L±”þ¯b œ ÄJ ŸXš: $0Á] Þ™Ðr B Z8ùœ£-|sÌ= ÊLáž‘®O)lKaÔ&÷±µ)W(¯Y8G+6öÂÃéšalDTäÕ;rÔ2>cÆxH©Ø› "´A#¦åüc5¹sI‚⚎’_[»«¾Ëç "ÌX9€jàÁI¾M!_N-ïªÏœÞ ÜÆP.)Õ;ü‘pàgŒÎ©€Àõªp±Üó s1fÁe_o$4, 2Q.,8ÙCW°ÊeX¿0"dœòdX[œA˜#VwmÍä:7X£}éq `*¾2š%±ŠÀ‹p©šÇ––=rBáy°=Ù+Û’`âoÉ×Rø÷”ì0ÇU(/v®°ÐJˆ3¾#øˆX±VäÖö?/ƒ1rs‚P̺,Ï÷FJa V `âõTvÁ—¾‘q¡Âù¯DkðÕ Ÿ<Ô ôg¯® O@Ê&néP ÑÂá#A¬ôèß ‰nV-® @jj%šá&eøk®kEëÔE„%äÜ1‰2îþéPÞ/ôwù¶r”WZ9uj <‚À–óS¨×€¦¨AL¨ÞQî.`¼”>1¥ø”Eû;É‘[â ¹kB­à†Øòôfµc̼ϣidÖR¶¢³1‹æ|áX…›Vý×Â!Œ€¹gt²¨L“Âîè G]ˆßå«W:ƒÒñ®(WPzÊ1 /2i ‡ •KSâ;€qñƒüðhÓ<˜À2*O¡_Ó%™›@้€ðŒò‰sˆ âŒF DQ ƒ¶Jãaxúâú–?^iÇÚ°ÐØã$ÌŽÙ`¿5Js%æfÔc1«>ßé1¸=ÈÈòŠB0x ° =–ç7?ƒñai"Ë(V3+)+‡€vT—ƒØ²vz61›Š}?‡ÎÖ9xûa€ðêmš#å\]?±# ¸ósœ“06+² 1/ÅòD^Áèo\ f/wà,xbš “ k j.Ð’º­yÄÃOUˆQ›TA 'põDd™¢»åÿ/ÑÍ®ÆÿhHýÿqjÑQ•éfÑî&´=ÁÿÝ ´€ïùÿeÑÌ´TMùº›} ;Påë—•ýÜG¾þýúß4Ÿ\¨èÊÊ^õ»ÃÝ×ô••ýßN<Ü}M\—/ûâßuÿð³¼€øoN;õ¨¿ãW¿(NÌ<þñ9Éan.¡“¢úÿÅ~^(xm-"!èv~ËBé¥-UÊ^Ç/þ…N{uÓ€ï:÷>ÏâÔo~ÜñìºþÕñEþõŸLÝ·‚êú)ýG\¬0†Óz÷R¾‚¶@O9 ¥¬*ÁDüÆ´á šà _¯nùï~ÑÉòÅU¶]~w~mV¦€Q1$æ¿/üÊgÈCŸIרÃÕê Lÿ€/nØ~ÒùÊ1]Í;O9-O õ›¸Eáß*üÉc§‹r¹¹Î@ÔÇZœb¥¿{Þ<ûšS ¿ÃÙ9”…{ú¿~QÅ÷švï+ØÚ¾×©ÒÇ~Ó¦­–ºfî³óû ¿o×££Õo>ál ýo©¾î¾û¯×ÞÓúÕb>œJ{Z'E |ò½7§·5µÔ©w7Í‚à ­Û9…¶ãî^pçpáz8gôSùq•ùGÛž Shxm˦Åð;]Þ½³NÍå`Ž9ñ‚þ¦Ì]0ç*þˆ¶Cï|lîåø€3L×Lúô9]r¸ñÃýû×Ý G§aýØãÕiôªý®7ÜõÈÂ9c»“ëç¼i‹×|ø Ò¶©éuɈ+ˆ{ì‚g¾nlüúy8®;ŽFN ~ÚD:ÜïzócOÏÃD6g¾½mß·k'Ró›<õ¦k.áÞ~Ö¬u‡@ƒÏè4f$jwšrÿÄÃÒñ¦GL`2«3¦,‡í›gà5¾xÊ왓úKï¬$)‡Vƒ,äâñ Ôù.¼óñ{zãøÊ{g õÎ¥‹˜æâ“—Ú\që­×^.¥¶wo >¾Ö4Ï•S‡Q]:wñCLZP{û4ñÐ ÇèÏ]=†tQotís̲yz¡0èîÙ Eé=ÿ•'ع|É´[ÅOXÿ¶ø6ö¼àÆ¡3>¥Æù~í]ÓŸ{í±Ë)ñÂyË_ºš_0kf-ß8j¥º46̯5=ûýÉÂ)ë¯6oßüÃDªg­øàQ*ý¨…¹Ó•kÔòÀ?·ÃjÄ[9Ç˾U›rãšížÛ¹Ðû±Õ+ær[\ó‘ÍázóÏ?Ú14äµ¼ïoÃdNºáÐÁí+ÏyÓ·_¿Áª­Ó,ŧ·›žÒV§‡>Kò¾Ò ‰ž ó“¨ÞCßí€[òËÑ={gœß¾\W8£oosϺ?/k»ÿrÂ_•óâî{çS£æø=¶/½õŽ©#N×Ïÿ~ÞmôõbSõ}ž+¢yÚ³bÎK7çïÚùÁ²ûFX@ØÀeE”Û–Íœýr ãÌ÷_m-qÚm'§îÚ~n±dðw_m=²îËç®ÊÁC†¾xd~š’kÇëSòtm§¯>:'é¡íoL+bÉ+t›sT¾Ú=Ÿ.™RœA¡pþÝ«ç@/º¾ûâõû†žU(½ºÝ¾ôóæ|ÉÁÝ_¿ÿŠsËžG]Œœÿ滾?¬òó¡=›×¼tßÈ&]‹ç6Üûüë+?ܸ«2%Æ=[V/{`üÀòòçËÑgø˜\º|å{– |ŸlÙ¾mã‡ï.›?~`Åâ—¥nx1ÆUï|ÑÜëúƒ_±ÍÅŽÈãoàúo¯äQx%›ØÚÒÞõϼyíd·°|òš €ºŽ ýA¤F@//!™8ä÷YS¨ÎåH•cmSÖ`­Îr)È"Í"çËß×ÝÜýŸ²³v«Úð³åâPR¬ÊRRE§*Tq•Ô¬š½*“ÈâpôI0¹EøðË\QÙJ؇³\ËzN.0­GX@k òLjA÷=¡¯—‚E"˱U¦žs9ø~,’JApwFÁK-+‡rñgT üª"VN¦Y4|V¨ÖÓÞ]1¬­b\i¬œæPXW1¯<\O² Õ,O¢ÐŸÝ[‘£qh¹ãÚ°4ö¿C''—Õ6 ÑLM¤YùLØô ¹ÛŠÇUˆPÔ,ħ›Œ´Ü,œüí©" B ¯G¬bV†8UM Xƹt艪fs¢ï±R…Ïlš<©è2P€)'Æn"5a£/uÛQG§Šš8´&D¾i©/=ˆˆpºÛ›‰Þ…j^ý1iF–©Ÿag:Τ“pRˆ³…:™Q\™R¹RvÉVœg´Ä±z˜ÑýH£E|1 3‰>Â.ÈÐsáË&6ñ‹ X#ˆE'0áù¶c³F)gÙê†À)S„â^¨\KuÁÌ\dD ÃY8âG‡ñ%”‚y"7¶Ä9Ú©k¾†+ú!{¹©»Ò¾,»x1(5ØŠs/äÑI0-AÊ=6Þ˜„†`Ê}‚8l²Š#_5w–@KÌ~`ô*?XO @T]k!RôÓüÆdK` i•t„Í€ž`=žÃ$‡T! øfü†9‘;Džo—AèÞ“3ò¢¢, T”é`Æ­õR¬¦‡ž)SEêÈ`jÕŒdîài("‘ïY)Rô)EÈtiZæH„§ŒeØ*CY‘פE* —РH¨³$ì’®--„ãÚ±›*§†­å|¾j‡kPpäîØå ŸÁ,Ir)‰WÈš°îø6?èªB&-5ÏAi¬:£ ÞQr°XÚƒÖ” [º!ëã„2·X¬@æ6t+QfÊiEH2³+U¬¾ZQTåùr¯À.ŽhI‘ˆ†¹¶›Ù+Šdè(¡K"AòÕYLD_("OŽš QmTU–íÒ L?I¸–U€Ðqd$P¢%]•ïKD›NË*² aÈ$¿ð±Ì²Š T€“´±2±½ˆTß<V2V "¡IÇjRQ\?†žˆqjã1cº¬ˆSgÆÈóxÙÔqS– £3YÌ.ß :eêÀ’Ùe6C]ˈÊa§²åÉH¡€ä”uX2GiÅ…<¥°æ[ ¤|¡•RN™`° Ñ8Í¢‚Ä\E1º ÂuœE™1å¯s|½[ÖYI $?" ³^+Y)Á):±b¦U`]ÔêÄ$â ¹uML\MLTPècȶõ}-IY&âv¥Û§<ÄV«öb)Y™ !G¢…ä +H!rwdëN`.™i±„#‘bsÙâ©Ã;èjÛ³B‡ð¤Æ-¨)£ËfŠ2kzV 0²9 ·„;žûP97fO{· ³hê«ØfÌä”XX£8DcȾÉAmê GrÅœQ°2´McÝn” Æ™]ó4Ã9‹H¬–ÖF–0„”*ó€0Æ8Õ2'ØsËJ"g?¹DlõSý ­Ú›ô±ØÂÒb>È@•ëñ…a” 4t”5ö/+"ÖY5c Î?ÊUê(„ØÔñB­¸2éR­¸ B§%QËÕSõ3`lU‚M'ZXmi*¨[êe|g*k è±ke:A",.©ïÄRõAê LYXIHW„»I¸6WôjRò%ÍÇŠð£žÙt‘ÂÃâg⦎˰&KAŲ”‘$zˆEÐaè"î‡j—U Gɦ{±€Žì ŒŽ„β|P˜ñÅØ±+ €š—È"»c6}-ËšŸ£”ƒzº+‰±—d˜=³×ø>ó,¶$hnìP“ø.w²–•ifx“„3O cºû&av)p*Ø;ì y®G"¶ºÍò¸!¨†h{&›lÆ%BHZ¹¤À(+WNV‹sCMO”&˓ψ¬U‰mÇo•qóTdñ©ÄøÃ‡lö´py9ÉB´I@tc~jA›~ªBíi¶ÑòÓ§®…膱i& ŸÅÒ¨•ó­JðZŠ×,èÅóÇØSO”åeöƇs](Z´š‘ ŒÛX€–))UvNÚøq¢™ÖüIôžÙ‡!^% EÆ“==# ôH‡$¤su(‘b(ça-+q;õ´wÓ!(ÿ ‡È"ä…±Pà!7 Ëx«­/DÇvç®[;|= |#›Xš-9fÏCl+‚qKq»ÙárEo ¸§½›Öô½„MÏl¿†˜È5ÔyeÌ; ÿ‰" “åó(e³^:pÇ@9(Y.7Ò‘:­tÏB[OŽT‰PÌÕ…%·µGWeÌ8¸ eˈ6Qd…ï9ñY!Ôî&¸^P}Êî^NȾRî!©GŠ#N”̺Fa° ' ÿ@ &~ˆY™½øî$Ì t¶ú\Ž×É,1™pÍÖÆÇ†È“DbGlY™v\íÁØr@JȨӅIÛ±Fnäe:^¾®'&*N¹êØfëZÉî’ª¨•ÚjYAqvP¶ëIb!õ¤µOG¬q=ŽÃÖ3õ$:¥Ô-«ù!v„ð-ÜáZ*ÚÀq$”4*ÖD~èÚu9MxÛ4ÈþÀå8­ }6 G‘Ë^:Oj)!;øÈœ×‡`^ìÉÝN¢Î,ß¡š†^…t†ØŠ1¤I|芘j5T'†ìØçÊs•¿›ŽË(‘ÜÔZ 8¼h Çl'ÑSHäó†4óÇ(µV’r\–…D,“”ÆÊxî±6|Š˜naw”Ÿô¹“}üÀñ8wW~óT¡P£Òõ²É:uJ¾žOvÊý ¾rW¥R˜ rˆ#‹"%F6‹T"Í<Çaž;5H}9þ¢ùŒÍ>Ý…Ý$9û%Q-ÐÁ§jgÐx¢C£T\åd¨· +Y¡ãËÝÊ'Df%§f³"²ÑJ¤+æ²ðBùÁõãÌr51m)ŠuT2çSÕ•2…–žö…Q t‡øáa1¥ö&·?çTHßÄÒ†ØC4ÎÍ¥ÿô¨)÷5‰ 4íæ#Â:{%…uÄÇÑ*O…8ànßažö :|Ìî™ÑçDâã&,qcx ‹ Ðäì´R¿&Ã7XNÂX»ö΄ï¬V:ÂôÀ®Úžè Al&l~ “hd²ý€ýéy‡Êì¥røgßX|VB3:l¾-™ñU(T‚˜\A%EŒ#è „ÿr¾‹PFªÐ5ÖcæÁc–Èîˆ8KècQ1¡¯ÚOûµ¼Ô–ÁŒ©B´W·êYmùõ'âÐ…Gµí`,n‘€ë}cùÚ óó‰r8.!~N¶u,CZÂôËûK5"CÍÏ8¬r &€ÿÅ@™íºH4Ä`dŽÍ6ÊÞôPn¸8ôeÒ¡ðAB'A:äør„ìµ…×:ÀàUGÁ؆¯ªCåœ;÷ŸÇ<ÆñA Ä6¦ÔØ8ÃB3Æ–ÞLz *‘?ø£ý@œhÔ-Ñ~ôѾ#mï“á‚NèIµ4Õ3½TùeÏ ØÐؤ…(õ³\ÍUGf­” ”‚¹Ù½®-­g‘Y埀.À£CrF'²ßÚ]ƒäBCAž:QRÏò…ÃAÐh|¡5€Š¯}Þ Ì:C.;rTºÜQ ;æ@„¾7íÄOÃF¸¥zoD‡c©Ý'ú*—FÉ/ˆ–ºC]Ä*iЙ²Çܽ§ h‘W Ñ‘èU“ÑW-EŽÚш2½{±Ny‰“ÕK¬ÀIMÔÅŽ"‹ï…RU"Y$‘O yûÃdɉÅÌe¹¦ŽÒåJ ‰zr±Æxþ^Ä¿¸7Vv’|¤LQ^²è8l‘$¬¤Ê‡ƒxœ;¹-³^(‘CA&dŠ6ô¸i±¹[íî;¦ ´ ð°Z& ÙÂëÛ>0,¬„5š…gò™‰ërà鿆+E¥ÈŽ$Ä)èî´ $|d@¿@=DnÑI?ÈÇj‚Äå;qLjóÆj]bÒÐp³Äl*«»ÚÎPä+K#öÓˆ‘—¥6Ïîÿôì­t¶¶K¬‰Ì¾u²DÇ®°Ù†$;SChëh'ïŠ-Ïh~.SºVN>¹€Äe6Ý;v•× Ê§ãc…=\tÅ3”Aö‡c8Eá,|Ù±àuøfˆ= %ªË GA-† h.®н¾µd±H¹JHù©fˆïE<6·:d?”…¨!ÑãÀ%O‘@÷SœÅ1í¨Øéu,{*…2ÿð]•"ra_ÅYËΪcýƒöV”í8‘°> {Ǩð&…aÄva÷yï,²&í¡#¶Óà` ½°©é†³éV™ò"µb‰˜­lΕ¨pEჵ‰jc†gšTž¡SÇB>!ô6(1ÈB=|—Ñìò90Älj /œpcƒ€Žt…¤£ÍÇä<Ë®I©«aA„iYñ ŸO­+Ã3(‘£MÈy$šªë1¹,RW¶¢YŽÄ„qHt¬' l³¬YÄ…ˆ®&eËÁ&È5‘©¡f›‡ÔÁqàºzÞšò0ðkÆÌfÚ²òÎU³fp˜‚q¤•©âˆu‹9‘VÉ q-â,…T¨øéÖ’Ï DFûoöÊøÖýIžó\×N5ª“žZnÆlÑuLöÅ•Ö1ÎÂãøú!‘í!dÕ•À:ë—CE»“R1v šBYD‘¨°,øN%šªÂF^§»cØÊk?|3o½ß?|;OYTÚÐóÇ´¥·K›ÇÕïsH‹$J4½©zq·#‘ÉÕaœ„Aš[yK|3R¼cóΰ—úoÖAýýê†Wµ2°MßRÿt'¸³2ùäôÙÿ‡?á4Õ‰ØF/&ÆÕØ˜ÐÆÚ±îk¯îk"ÝfX©FÂþkH¨RèZ€- œ =tÉÍhà ždLÔ ï‹éÀC<Õ™ò•Õ$c„í‡ãêÂá[ŠpÄ%ÈUí0^’0YsB¬˜£rÖĦO1Þ0fÞ1jÒ Gœ²z¥dâ”c¾3Âct~ íB`¥ò#‡ 05ñè†%Êq$6±ö¸â{=a…¦¹r©ä@>¥ù³¨\ÀH‡–M1@|F°J2ÒˆNX¹´åÃ`.# íÁqÝ.âöS…­™žãñôR•ΖJt2Ÿ•m:Ñ0³Í;1ÁññË$(ˆX=¼Œ±&hŽ ǦðÔ©—•ÀuÏn9å³nœž[’JPNmq—Ë÷N_qØ/$®[Üå`_e™êyòp ­%#¡<ófõAøŠÙËc°ÉXD)Ζq§ç†8óqê…ÏÜî$<ŸÏ†¢n¼ˆÉb8'I·p˜JÂÍ ’p@¿¤ý7u¡Àa!õb_øOòá•°ÈÎ|÷ì¡:‚”ßeh¿Q锩2À8" @Ã-´=h²TÈ;û‡Â|"ÓMÍdæž„°äß sŠA%Ɔ½#ú‰d!˜p ÿU´B–‹Î†›BË+–Ž-[E<[Ò> …zL)Iˆ©ä­tÚlIØ@¡6æ·YKRn*쥸RȲ>D¬£@%JqúÙ Dè¥ î|­Øj'Gg9j\™Fîž)>Þ4Mhq¡†‘FârçÖKc Î*zƒÈ¨˜†5ö‚Ê %@Ê”DF”w>a¾†ÀcÒ.NôÊ׸ ðd2c„/6Þxâ_i „ %²Ãf‰0€|-m–ŒÝ˜ª¾„R¦½›Ã[Äi‹'™ƒ•x>}“ÔÆ¶áÏ€`¶^`CͲDc:Že®/mñ?Á€;b5‰€ì@)Iý{ÌR$–ND0Em¼SƒLÁÝécc¢‹+Ç­F¾ ¸¹¥T`EìI•6RžA|OYÒp–΀ïê‘Õ3Å•a½ ¬HNÈÒFKË™èWbêÆÀU;Ë@2òÆ\ÓYhh%±¼k¡vUßc…»VAF‹ÀØBi2,„“çêB Tª –_IK3ÖSÞ\c õ‰)ÂWª²6a§G.ú@ñÁøa| ±õPc‚ª€g#BJC¤ @ˆt–(‡ÄŠè%ÂÉF¬¢å"7M¬N£1u;îd:ô…â†݈«#ùBÌ…H÷" 6Uµ%Ðt…žÜë;Œ%:|RÕP|¯o÷ã¹—ù±£gÆ Ç: Ù)ú°Xý q°3Š*i”Wm-ã¤î’ ¥“Ò ™,)䤸hÙ'» Gj ænøêgÀ`‹„ƒÞk1l<^c©gÐɽ"‡h»M£U†úBº5ˆy ÓÁ*vXÚI 1då @j:tܦ¦ÖJêÇ–ÃT)Ûü”ûRlcÚÊ+FÖ@ê&!¤?uᙄ % ‡õ]a%DH‡JzÞƒÄÁÌ&*L.á}"¥6f¤òerg·P%P@ð#GbŽŠƒš°_àü‘¹="§Štµ8 J+~I±n©”žJµ©s/fE1l£•Ȉ§HŠ)I;W\=Â9ŧ[!ÇR§®2ò¥¼îŠWC!ª8dIù$Íã0aÍ€WÒ|¼DØ©‰ƒo()l¤ôVìƒQl…°áÌC”RàÖÕMþÃPWì.qcUÞ"6-3žFÇ•(ADÄg Šáˆ# íáãF¥'G–‹Ç6 úþ²ÖFØ—)Êã@˜ªª‹+²zNÆÃã(cŸç”»AøóŸhÔ'œwUóeU©Ð_kü…•q˜$*ÓÞ qÀ…1·tÄÁdÜzÚU1M‰ ZÚqÕY&nꂎ#ÝÊzQc&b`ækŒcÝ:Ó‹{¥´åD<#‡%´fr¯ôey¦{S€èëLð¢‰\Vœk:~ñ½¦lJäK€M+·éW©kUÄP_1Ó×äjg̾ú+Kj¶yË1>ÓåÐoÄ| ;H>SÂâÒŒAvkeÂÍüŸýL9„WÆËXúdv‘±ËZ©„5ª \HièIÊâØ]t=1 C…dšúo™­ ɉ憎^â©áÿôÅ/΀p)VêkŽ,y”,'ÀH÷‰X:P9xT¿Kg‰oDV´Y½Pæ/O ¡ž§‚c@iªÞ¾L"áL`=‰œ&ÚØÃ‡ž0D¢Ö•¯ÙPdt”)’Q±ÂØSÈ<‡•›k]–ÐLA´ó½!G%ó¨’P¬òþÂ6zL$av>ûÉ5®#ð"‰8¹{™ù3>&níH3¥^æFŽ,:ÀÍð ö@Îi=©A5 »¸›SÛk41Pc–Ö K…ÞÆf{¾¦:„˜p†f‚8–Ò†ÂOˆ—åüÛ~Ä®ž%=Ê9–¼L_Ÿ+b`È áBõHi”S^·<;{f>¦)–uôäÏ„§`QK!`E!OÎÌ”8ÑiÄL°”‰Ív7 ½¹V°1ba? ¤Í3ýáña¦Êý%Ù™œÃ´$x°/Ûø˜·Ë¼FÒ¾EKô¡+XÉ$!ß«Û/"…P=ÌŸOÂÌZDdÛÇ_Eçó…X\q´½O%1ä~sS™à‰â½¹±Š1oäÌ1\&:¨eõâó¥4ÑHPQÕ5mfg;f [Rž9С!D>±›>väa¯éi$…{Ó¢µ:Ùós ¸ÇË7‰Wl\î5œWeË{,–y:;'Xš€ÐBögšo ü2H, &ã†SZ{ š4R€;mÅä(ZqßrÄ`áµS›JçúiJžpØw•Hç’ PÌ! BW¹Öp\QP¹¢ XT0Ëæ¡'‘®H §5.¥VÏ|fï.Ó¤Êéï\AuÉ¡ð-™Þ‹÷ P”¿Ë;.×åc/v¬1ª–šı›tÊÄŠŽ*XYËü¦Ãt€„sÅ%gbÀÄ|`*ƒ‰¡NP7b©AjÄ‹hV€­a ž(ôâ´JM7'Õ½"Eþê~&VVr¢öˆ2K_Ú)¶„¦é’œÙT+{²X,ÊXI`N‹N$EìzÖl—ÐM0Ê2³Þ¯T錈å…Y# žæ² Q/ÂÉN‰è\¨¥@^«”ˆ©=pØa¨Z቞ :™™ë¡=aCbxÃ%JŒb¶âø˜IcËXA‚í|<E÷kÐ>NqÅåX{\;]ˆÖ'¡â 9^ÎcÞ\šœõÐ_ü¡g둎y)09"¦-_¦[ŽXǦßrÛ#€Ý¥gˆNxÍ,³Xö*]„¾¨L^1pÆ®Á]’#¶ÈªRà4¹W¹ܼx—²´Sð;¼ãL G™®q”áǾ}s áD™8(y!cË‹S ivY½6ÓXÇY9O5ð9$DÜ!ûTÚþ`°³J(z4«€ˆ¡¯«%æ¢D¢|bëÌJ@ýêëÈ"õlÆ€á.‘F39Æ‹0BÞW ¼¥‰Ãøà›_&2$ºo=¾àÃUl‚Ãij#€eÝávSF$L¶\Ÿ.X¿-c æ† º°Ä†I›ûø4´/`®Ž5«P¯rp;^pT•F¡Œ¥È W'öýtÜ€¦&|–º4Ñd9@_ãÕ%ÊÍÑ‘L ƉÂk“ÄÎ…¡+á¤LRÕ€É$Q߀+ì—šŠ6†utõ`µä»Ä4`—­8šÜ¼QiªŒŠn{K Væä¯ (ƒdlµå@ƒrPBF4Z†`¨u¨‹àªwe†u«r àgé?ä Ž‡+S£*œœú¢ á­ ŠÓŽÌäÎÐŽUéð„™Z*Ê”àè‡T:î)?RÝœˆ¹ÕÉÐQi)tU†é„Šæ'|CÊfZL+„¾.n ¤‡¾õÜÇ›OrÊÉiÊöÌ(®Z[o".Ö U ÙO‡´íkê„L«MÌE8Ç…ä ³.Ghx¡%èMÈUæÊÞ(ÉH…‰pÂñyŒfTjÞg?åÞɉtM6 ’dL‘Êd“i‘ùŠÅ¦ŒþØ:ð€tä8*àÓcœ ¸¼ƒ/?¿ÈøÜËO;*ŸŠ”ŸpO[*žËT8Ãá, ÅŸ›«[þÔµzCrXîDªÛCèǹO&Sн¾x c2x=SY‚2+Sg-A^j"’p9êöô#Bá|î*ERc®IäLYE,Ê›Zí•\¡ånSÑ+©ìd­èŽ-sÝÖÚ8ˆrGo¹SXŠWÙ…\ÉÙ\É1]ú…™»¢»»‚k\kT@ëi¶‹Æ~ÓÕ}áˆù X¼ )Ê…Ñ( r ¯Â–D>‡"y‘²6— › …=Z5´«¸‚c§Ò\/dE€8QO0ù¬ÙëÎaqEV(ñqèAEB !££+ƒ?Tp=+]EGu—vE÷7—¹¢³¼‚S½ÜûÎÏWòÔ7áÒ/qÿ×f3ž ÙžúsGÓp q V©GâÙ ¨ ¤‘rÅöÀÅsÅ&ÏÕ{ÙžXIõÄ=€hVvE‡_¢æsœÑ!i¸“xæ2ŠÞÈrÒÆ¯4ÁÂΉ[£â¼¶~Åãû²£þžö…M¸JÜ µ¶9ª¥("V!s1Òç…a¤TIªë³Ñ¬ßìå·d7C±¨I^~„×LÙ¦)-3›IöˆpŸ *­ 4©ÆJƲCé9DfEìf%œ'$”3BBèI*âC™Õ©ÿÊ‘'Ô¨t¡ß¢\ü´aXÓrþž¹TG·ViR´‡¦ˆ}™ó*QdôNãÅv=EË&‰Ä‹Î< b"Ú{å!™l¢pã{¢u¥5J“ e”(ci‰ÃL³©è^«äˆ«ä´ãݓ҂:X žÈ´qÐ9È…“€‚½4·36J,ãGQ e |)sEÄ~¸?»¹B(@Å  œEÅp„J •‚t[U1$¢ ¨žR1¥,æEr¨ SLÓ³ìî,ô¦bN¥€K¡\~L9ÈþĶð '’]Ɖ*¤>…#//ÅÈ:M<=Ù3vMÌõ¤®B¨sUÞ'›ÒDk•Æ'z¡'h¥‰OB,> Ú9dYH|¢·=«@iþ©8–çªxd›qM—B!2–øÀOuô‹¿ ›L;¸êöĆ5a¡_ßËë#Çe4Ç1…N4QDL´.[‰ÕsHŠcê#Br(¡"Ý-£·p—}ƒ~ßß9mˆ^zÞÁ‡÷\ßpß–-9™"ó?wÞPü’ð/Ž4ÿÝé²ËëjëkqFŸ!—ÕU9|äˆ~Uk×ô­^ÕixSˆÃÿVÅ?V× Ø¿ïðš¡ýú×Ê]‡ غʯZ_õ¨ˆÖnýSUK“Eþþ÷·XS_Uéþ¢[M%›{)‹&_Pü@ˆ:5Ô ,¾•²¨p¿çhaŽ˜5eá;¥ù›>Òi°iÞ~E7W÷«8 ªKíðþ—]6°Nï¥,*?ÐÆt°öƒ>WS”Eß~xÁðÚ!G*FWóª:× ®íŸÝÉuQéö jL'­2pÈðª.õÇ ¨k*wÊ‚Ÿi7²O]ë?UµângúiQ§û‘;oc:)÷ê$øzýÿ?»‚èWÔöfÛåøÅ!þ/r²ÿc/Ôÿâ¬ïÒ‹Í?=þRc3´ÉýI¾×/©èªÐVsbþÇcÍOòf§¨¦Í?}úæØ‘Zw¢OÎf,z±Y/¤µÄç¶læ7ÿ˜¡Òp7e+žvÐGÌÛmðàšAu}ªüÖUúôÖUâ=Ö¡ÑDYdF+)„åKå—œ?ua0K•”$úëV‡1¹i»´VþÊm“_JŠÂ÷‰½ò×-UÙòSR´¤¸ëŒö=ºRõ LùSä.õ£Ö8®õ¹ƒ‡\1˜þaLÂm†Œ¼ B:æªZŸg k̺Ög˱¡Nol]-Öb»þÍgâQÓú®â8õOô­å–¿Tz¨K}iºÃ>tf͈þµù'P—‡}Ä£¿v.÷šLò†¯ù¦!õÿQW;ÄX„}ð#ß&ŸVÕ\ݺ£Éºî?«N®:®ªE.Â'WÑ[«N>®ªuçšáõ¾¥zÈà>#û×7ñùPu—¼ urøWKæÆ3MÇ®jÑmD]Û†ºÁúôÁWRMgUG\UüÿŽ !@Ö𺌱ƒQHG¡3ûŠêÛ¾¹™µÍ£µëðšÁ#þsÈðA¢÷f_ßÂþÒª¦ÿPÓóy°™ßëd ´È=ÛºkÿúGìZ¶ÒêõI™ŠFü)ÿëðºÿhFtÏJ‰=s¤õÔÕ˜äµ5ëº_ÚÙÌ-uƒëéÇ’ŸÚÕÔÖ^”ýÒÁìÕFTÊíì¦s;»87þeøz3·]úÿµ÷Ýý‰ãÜÂïà; .˜’j ©¤N’ILI„±a÷™ýã~öW’›lK¶ dÊîìýÝy‚-«®stÎåNO6Wb{Ué¾(Ý®c‘ò 3|ïýƒ¶+«[ž#ÀR‡=mdÃLÞËÃQOû¼`ôü>ü .{Œž®ÚÀàoú.D0ÞRñcLhÀ‹&€v/ÂJÆ“æHnmcµóÒ=ù««ôåÑ•¬ôdØ3jv~æxÍ™ÛgÌÑÙ@r4€H¡Ò‡ÏlLÄá®{ñ+Ü¿+Ï’ô”`3XK‹šÔ¹bXxÕ^åÍ«D2¯ÿðª_žWý$¶3ëUâŸÆ<`Sêwé“AßU¶­™[ŸS§ÊTÿ×mOàÐ ô­ËÒQ†£˜Q󵫴ºãðÅ÷ѯhîx˜˜NV¡·ð%•€FZ?j/Õz`ºvúžóÍàæ+ØÍ¸>Œ‘7#w2;ÓÑ(ëìÞPASìãüør¤ö:Ý Øhüiì4ÆûÃöÛß=µ«©}t¾MÔñ»%Qô/€ÝÞûÇdF®…B£L*¯ôÔQ_þ®ýLÌI@~i@Ô°°!¤oÞò ï"Ös2%þ¶R±?P¾føf—Lèú(…ÿÝÌR‡”’7|ñwW~së<ð)]ßѾarõš’aàÚëPù=1å.fhŸÈƒö«íÁp2¶ IùUÓAò–0’ÿêÚÕ¹¥û“q×h »òƒdR0‰Rjî7\Z/ P³%Yù*ÖaEé|U*Í Ÿ6w;òüx¡ý¬·úç.<©ËUÚ^¸ÔŸ(T|±µ Œ7/C½RÏh·Û,ïï¤ hÛÝÄ"à¿èúþ·×·v í˨tQjÅáÃÈÿmµÆ;òXF*‹¡^ÂM]åd€ÅœÅ0ä%sÄÿ!ubOî)á’ 5ô_N‡øoºL’JŸE¢©ôúÄfž¥”åaP*ÐŽ²1áÝnÚ}¼YÔôg¨ô?ÅÐs.;S$¨|¼¯¡É{›™N#Òie62yv“ hhz»Cî ÿv¾Ó^Qmûœ Ö‚S¿ê ’B­þ ckÐBâ¨7&8:²ò¦.oÂn@oSŠF€R(ĸtÖLDÎ$S4³”!úÏ@ j»¯à«j«JûçÈÕŸ%öÛÝ_ƤŸ•€¬°îÀE5ús*ɘß1»B !˜¶Áà5 ¢É¢:cÍò4€ùþcwJêÊÜ,Jÿ/nþ£@„¯Ñ¯-/ ©/iŸ×.ÅN@sºï®`ØÿEí$”fÛ‹ŸbÙÿ9Vø L=É~¬`{äXaî–cNÒ­üÏ0çÔ;<ôcd±ËÆ)¤›ûCº?‰tÑ¥/“®Õ‰©0~iÒÍ}&åþToÃÕVŒ3¼…ÕüÓ8,hQGæ­òDöºÿè>ÿ©"û'˜ySM0Öþ¥Úq¼ýUN7’¹eDŽpPg‘ž§k˜^"Û4¾(‡M<Ø4þÓ8ù†¯/·Dõž‚Vß^‰‡îi€~k@˜ gŒhР·€`DÒ@ñ9?'DC©‹æµ²8æUÝy`ÄŠ¼vAEö·…©Í™X¡ã ¢ íT:gÀ+¯§–P ñ9ñæ?  X96lPª tìÈé5±) ø«÷·Eþ÷…Î5Í„+Ü b8೺p5keP@Qø½A¡³Š‚dˆR‹kšrÃ<€€€è\³ø[ƒÂHÁ1U)(xã6ЇÌÔ¯¸Ÿœ§óŸ0nLÏøYïO[‹ÍZk œ5ÝÞFà,)L–pÞÇèy3~L¿f°ÿÀWкýªEöý|Ûð_‚Ä›ÑàF’´hgþl~±¯?×ÑÆ7ïãfsŒýŽÑ¦jÀ6SÑòMϱabÒO ÚÚ fàþø×Œø"9Ø?,6FE `* 9Øæ­Öe¨·ÌêG¶ÄËøûèg9y5Ö|åÆÏT&½Ä¸¿ D†õós·}/Q-÷•=—ÀCw!…÷äþóx8覵¦DÁgoÉ*ý¯N-÷6Etkj"·ÐØè™¿£øû›õ{[í£KðwßúþØ~ëjaÊ[WÝÀST·ŠWV¾«cXíoÈYÍ>ëÚÜíð~ß‚ï¸{–ûEîžæÏõKîŒ/_ Ò»ùëøÃ:~2ëÈþazˆ–‘ãd^5¨GqÛâØK‰ÝÊþ£xüá?€{¬ý¢Üã3ïø‘ë(ü,³ú®Þ‡/J﹇ŽIÿƒ3Ê12fD£ÐKÁ:ô*]ç1Q«ùBÊ1.•¸Ùœ¿ÑE=ë!-95X>³},ÐÍ“o“2˜Ÿë;'gæÏÊúM=þYÚõÖ×é_ÈÓ}þ}QÝþ¹4—ónÿla~ÿl¿ÿ¯qáçÏsdß§ò¤?~À„q³÷>ê›Â˜rtp>spW{‚4[âH£1¶T¡¼:èìšõÉ}‹œŸ”D„VtÚb//¿;Ÿ«€!<7ÿ„œÏC§m7´âׯ½qW{7sDØz Õè±^£>»íöa¦Šö]ÐÓUð}£÷n,aʘÐÉqïåu kh™]÷6[÷rhyœ¦p›7q„ãûÍr¸?|†[ðsmÞBŽÇ:Œ|\³Zžd$" F·h)ˆ²áøéîñÅÉq5œ¤ð¥5ý1è´d"œW¦á(:iÈŠÞèÚxƒS åXÉ¥6ãY‹Žˆ9ë:R¬¦¥z%~1Ž# |1œÀ ^3/Yå¢;´_Ò#„ç´WÍïï­avóÿ`Ñ ¹ÕU?àfÆ!¦„†Êèu~•å÷Ñ J5?ê`ÉÝp¹?QÇ&u (áÝÑÍ¶ŽšþÕEåÀüêý-‡€y)]UôÚSßRcV¾wǯ݉ L”„€ ~àÁ9°R”pmØï¡Ñ–/€}ÿ+Ãön^X³¡ØcÆø ˜-ü…I ð;~wÔíô&ïáó.J÷Ó¸YdL€›4»ãÉ(\ëC=概u‚톌Š wï†ølµœ®Ø£È™Æö¨—Öž™¢Wî÷TÇ#u4;½£ðYÔ™)^G²¦ÈÅ×á¤Ã»“ñ0|.ýÓ%9Ö€Tx„h@í½OúfuìѬÈZ9‡°5܆ž}}7GcèX Œü¿÷þ¼^ˆ=wõådvEÖZ}vsèkÕ~íõ;JW‘]n¼…ÿŒÑÅWðm|i >þ%+ê:†@xÓ¿dÄYQ[ø\¥´˜ø¤ÏDµýúM¡3ÐÜ‚~€bºÈ-焘Ӯ«ÕîõÂ3¬ `!»ð_ÞzNÛ?#$xOH0­¿'qÇ‚ø¾»ú“ ½ ãðý³Hýwâbk1/6eGåÏÃÃ5U†6Ô‰±¢ã§Ó˜Ë/4••ªÏÿÂÒø'“Úïµw^,æòi)g¼ÓÖúew¿ÿlæ+dói®+ú­æL¸ú³WÃóùt±è»˜¿µ¼Lÿým$pþÌEe¥4½8>‹zíB«—eUFËŸ¼W†qH[Pk8úN£û<>QzÚQ¶ïÒÜßüÂq½æp¢´»%èÄøéÒȨŸ=…÷îXÖ¢f›GqÆy,ttW vaî žïÂo`&'ã0ôl̦º›ÃíÝiȃ—‰üÒ ŸGFûœ$‰Õ5æÃŠa‡JBV(Ð[ axÞ2ðœpOöåq7Ü‚Gz~=FŸ¨1r<)uÃÝÿÃÕNo,·zýÞø;ã|[&È}'l5å­¢Ó°åQW}5]Lȇ„ùÐì,6G§l# Jû;€B¯VMÏ”ï$Løú® ƒ¯ÈÙæ{2xÏØ¥ØØR³Ûß“Çaöa-ÛýŠŠÞ’X—Ù²1lË}hÃãmñPÛ†£ÚAö¶»*+à;0zýÚk¿ž*Ãç^¿{Øýn§y[Ëê{«Ûqµ´akÜœ´Ôî¸6ŒÕs¼k ÙlÍaü‚îØõjvZ©Á– C%³Ø¦éTHÝg¶ 7ºuûnLçÂϦ³udà<ô9 ãWõþ Ýï^@Cïƒ^À¼}¾êU*T‹àtÅR j-ófÚZ*åVÿêƒÚpKî˃¶ÉÆ2Ø©¥ÿœ‡šN–Q=mš¥9.ÌYð8sCM<à%„w÷å=T%g‚FÉX"<ómØJ·á©ÊØÅðÍF€Ã†ðÒMxö¦´PÔ.V±¯ÎÙR}ëZ°o&…éŒi [ûƒçaØ"3Ž"µN0âìPkR7‚¾a¾©ÆüGô‰ÆŽ2Wn”pÜà©›mÛ(w³2Dü²Žøç4ÄGÃÓ›²ŒÀÁcÃ.A zõä4¨ÀÑ1Œ‰ô”:ZŽ]¹ª—róZãrÞÔ†„‚m-ðÒb* ‹…jæ¤ê™= ú™ rw© 7] €Ã8+ÌQ›¿ËÊ›jGc†Æ&}0´Å°‰†çÁ8Ýé”ç¡©¹2têàónàöKqªÀ6º4Ôǵ.­t¶Ãö2_¤¶Â]¥”­lº MBÙp‡&ŸºÞ E_ÃÏÜñV¯ §‡Ú…×|ƒI{ÎYoó—Ëêw¶B‘ÃF_¾íþò'j{Ôo§£Ö¦=P½ ÚŒ{}ÓÛE¥gÕÉõhƒ(ÔOb(…‘¦¬ÑŒmKˆmÔIËX•H}›_ƒÔ¢…R·&:È(ß §•Ú#Ê -#…ªH§Ã~Ï‹WŸéÌýA»?q~vâå óIìÖèBÛ,訌õî0ÏD>`ªRÆö; /=µÎo”áÀkМ»€QµäqCþÞU¼3ÞËAZ~WÍÑbÁƒ¨Ÿiå}kÊð}Wÿ=TÞ.<µêgç–4 öaÉOÓ¢~Ù0•®¬°†ƒaû&c.îÃÞ@"Y¢€\þ=Ð"Šö¡•¼Ûþ…û¤¶z °¶@ß[óöú°ÔïØbu7¼ö P˜ù%}½d{Šüm•ê|„<á\€-ðx/}7í:;¿Ûïøz`ˆ޹¿æ­ÅJ›~raÆrx~xå¾étñe”%OÇÑœCKc}Þê©>¾&vãø]ò&P~]Ñ4#üZ%—Þˆ‘«®h—ª˜€ó\ ½}1¾˜4Š'K–Êu·uÕëþͰ È äq÷âuòÞȽ¾J·¬ñýsx·9$*CäǦàBh9%€ñ ^iªsÙÇLF%iR€ÃôÕqüO6q3Ò¬ð¦º÷•®Õâ­Ø+’®ck ävÌî7 ØÜ<èf7xs`8©–ºFdfxóg¥û1±H–ÈÎðd£8‰?¨{jûý»o·õÛ·û ¨µ¨µhðì|žíƒ¬.ÅY´D×#þµß)'ÞžLYǽÞ•Ø‘W ‚¼†¼$>fky¥`È+C^)(òJìÈ+Ù‘7Mv”Ûº€¿’Ó¼ÿÌí(Ì1~àDáœ(0 °…% { P{8aÃ^ŽÑ9;¢û5¶á¢wË ˆÎ9–K÷Þ .®sAqÃqÝoò5ѹ@Œšs`9[kÅ•a¨áòwyà‹á\ çî Mžwy;îzc$á®à×2îò.ÜÍ=øp—Š»<;îòAp—„»| Üåá.OÁÝ#`Î l¹´ïÙÑ—„¾;ú vôõFJC_’™ak}úò>è+C_!(ú ìè+A_!ú ÐW„¾}õ‹yü0R€½B ìÙ±W´c¯7NŠözëÒb0ìrÚÇ6ƒ!¯yEväƒ ¯yÅ@È+B^‘‚¼ÚeT~ø(À]ѻƑüþà- /ØÁÎâ}®•]nJãh,¹ÝÚ+™“½âzMŽ)›¥æóÑBcc·‰lˆ‹ÿì¬ìŒ¥ÉZéäŸÊZÿþ‹DO•Hde9‰Ä¢¡êèë?xImrG9ÛçÁ *üÙÜÍ?¼ôÁ‹çðFÛ|½´Ó­£yÄzð½´sõð‘,¡+n¥êÓÖükiþÌ”„×–6ÐÏ‹œôÞ£ŸÕ§öþüÙGß–ÄÂú6\aý Åv.¾´×àƒmô V~~Øü'÷%7z­¶.¸hm£º6Kñ`·Ð½$K+g)ÐfƒOî.îÝWž/ž UY^^ÜMõ/8´´B!­ Ê¡ØîáM'—Û¿ÄRqéàç¡øÁBîòY‡ÜÊÛí!øoGM¼P§ÑÈÃòóöÀÈñý6ú[:‹\x~/¸¨ñ0ú­Þ|)ƒ‡'#óáöø}öÀ /ÿß–‰;‚•B§Ÿt‡+úͱG)gÐ+¹¥å}\w»Í¬+èìw:A„Õîz‚ÑùÆ»r âOˆ˜›Ü’žòÉí«V†Ë$V’Û¯cþ%d7ÎÖDóÅ™ùz±.n_ŒK•çbýmoá|S®"©×o{æÉv:I=vî")¡ÖŒÄ÷Ôüy›ÅHrks˪ââ>»}ò´Åí=lÃÉ’[¹•…JW)MªÉ£Æuåp?Ò4ÞVÞÒUÚ+>]Ô7C±êu©{¾“Q_62{»_+_jWÍ̘‚–ïà›Ó2@Š”#}¥›·YmÊ¥¡z¬ý¥¯´¡*J¶Òã27oy«I(f­P¹—ï²`…Ir«Yʪ‚zdLªP&·O-ð³Þç:K·¼ÛuõFyHTޏL¶Ç×üØ-ƒ/“_À(Qam|ÈàlO°A.sê Ò™ø¦Ð}R>Æ—Ö `|Ør+w.¯ ÄAÕÂ5Ot/[Œí¾‘݈.…bêòâpDZ«2yJ/Æ[‹ç÷¤A“Bƒ¶ÒÜÂÂÕ—cÉ`2¾o·_¸Z)wBp´ö­°8×OIƒrµçöuÐPlIÈÞVÉkÍÞv¸z]¹%ïjíãR(_´bà³ìе§Ëïkú §ËË`_ì»**W™W4(¿²ÛªÚwõNy¨\ÂAnTÊ>dÇéËUÒ ¡˜ò0Ú;°†u š;æÖhƒ¶•¯þ†<èqueá#79BƒifV]•j´A÷¶…ÿ…pµ‡½s4(Ä1'*©ë±·ÌU“8h=59¦ºÜ}Ù9! Ö¢lD2Š::]„î¸|V[ÙÎïD €ó#ç |éVôv5î4×l¼]¡AC1¾zÿV³­õË׸«JÄA£{jþmá,GôhEé‘ Åа;oå]m­®Aï\s­«’=\½?ìtScâ ÍÇíu4(”bîµßï”hƒ–¹«å›yÐÆÂ¤ùÒꃂQаW ~Hðe=SïÓ=ä®FâeÐíÄÕ×ë§ÝPŒ¸ÖëíÖ uÐÇÇÝñ5eÐû,÷pr‘p Fц=>yùvSÙX!ú0NŸQ}?M.ÝЭqg`âZOvÊÝ®Z&Zý¶š£ ZØ‹\s mP9:®£Aá(š¬‰l+“ë»,4é"š“…õÄ×Éû#tSqú´r¾¨úV\± *½.qGÇÒ”ê}ay+¾gp‘´¢¾,ÀAWÝì¡‘ŽÜ/äj`ÐÕ%Sï‡EmÐíx5…E£èŽìÖN–µAÆkvVx™\ßÛ<€ƒfÜ2õ’_Í7–¾Akç Joð1}ص³´}­{—¥ØÒTܾl4l+]¸S¥Ö’4œ›é—¢7ã³}0¨piвÛ\&câ†õ[*,ß^6îˆo'rdƒÛ¿OŽIo!ç——·xY=] ½{PKEb¥Å |K`k­A._[äá[ÒD÷^G¹ÁrNDTIz?Pò'{åíx\à·¾äÉo÷—";'×Õ3ë­M‹î×÷TòׇÜC#™”&”·¹Çã­É2é-ÐÇ¢‡‡Ï§kù«Uâ×…ã/|"¾}÷ߦܜŠ[4wÒñÜÒ¥|WÝÒ Fx¿¿*o\ïPÞ–V®•^‰òv/õXÎ]Ü[oí;Ú­}ÛLˆ ò×Çç¯ßÔÇj’òöæÛ»¨fÒ[±ã÷áê[·@þúöáÔÐ oVîLìv¿}ü¸BÜ1ùFØŒ¦ò5òÛîÍqm=é’ß>s¯Ëßö£ˆÅ®Ï:WñÈñ6ékEÙ|<wÎâqø6í~+”öOÎJïð­“ Af÷ñ]¶uÅz¿5JlŒ0 ²™­âÞâ7Ä4û¬¼ºrxR#O3=uãråpveªr~I]}mBkò"¿KLà_§À¦|+GV%Ì~ÛÚ¾Ù4wÐxÖÈ™£Â`˜‚7ÈÏã€9>o˜ƒ?ÓÛl%€–­ª…ÓŒ÷)QayótUSm¡ƒ1Ü­q™žHŒ@;çÍb·ø ÙÄ=âÉø°Ø ÑÚ×Uê ÈΡ T[`ç<âú˜mØÛ¯ƒÖ#}Phç˜ƒŠ¶A ÀÞ‡úÿ½1l½oð>h¶¹ˆƒ÷lç´³´´` Š´kP(+m†Úÿˆh´öÂQT õÊZs PûoÑ•=­sk6}Ì>,Ò)¨ƒBâ’ÞuPÈÇjûKŽ]åS@_@ã¿ô8žt˜Ú,tí€eAj=ÙŒ0ô¨Lßb·€k¶9„tÂÕ5%ðu*ŽùnÀ_e¨Ãí#ÀjR|ýäÀø(¥ÿ³Íí[Æ:„öYVͦÎm:ÿÖé`qËwe}òy Ltm¸5Šw.œ¬ _ʼv+1øÏ‚9À >€A‹`6w~¥ô­¦éÉ¢ÍûØÞÖV5†ý8£¥1Ÿéî2«ñéÒ‡ÑD_®5aî@ŠÅÀ(ð :ØŒ}f'æ *É­–¸‡ƒ|ýòü\‚æÃd…4%Ë£MJõžT¦·°–BÿhðÔ|.O òÆÄ9Òù‰@Gÿœãv5a}ÛüaÃo}àh%É7ï·¯.Žüö/u¤ã‹fÓØÖ‡FA+\_ñûþÕ›~~K*°<:»bFvÜâ#‹{^þ¸™³,ÈjT9äåÅå½Y oÂ=C‚»¾/A!ßRqݧDb>`Ê©“õTïË#|sõž¬GóÂÙwãk•¯>¨u³ ‘ Àúá’®”`W½?Û©Ò5ÄÛSðŸ;Ümê‚]ZÁ‡¶M¡ÊѾVÅÅõÃÆ,KCþ±ûP/i4D›ו/©« ÅŒu%–Ъȼý65B‚bʦz_IÛ0Ý$CžsÝÓô’]WÇ·i«~ÿA Àä@€y^‹¡Ié3i,)ôÀd¾ Þ™êZÂêcvº“£ ⪃Š|¹f65žìÞËT5¥ý£ï•vHáF‹–eØN]îë\9¢ ”,Gxjg™×arÓ=¯µšÜo BéKñ€Œ°©Rœ …ymÉ[a„6Ä´^Á¤À×—Š'¯ee=u–šµfD•–`ò×±ýíÔí\Õ-– (†b~ûûV˜Ì¬=é´&ߊx ®/ã;¥bÔCVZóaPéÀx¯ ´)íX4kí²’(;è£Ò=N–Y÷/óSéXéó­ ˜¢ÊÙU(6Ege¹h^&·twf(3-ÊJ6œg茪ÕM1‹×ÎbvŽp‘º_ËôÃ¥›ÛU»áºI¥:³vœÜoi|Ñ‹¯)A¦ƒ—=Võ:£é {NK|jª|Ù{˜”ÊÚy,:Û1*WÕe%tØÍ>7l4M n÷é;«±@Ûi•ÊB1†©a7ñÑ,qm*~\€e"vÝÒ˜ˆS·ô‰Ù;,Ö˜0u»ˆ*ÝWþSâuz™Î¯wà qЇ$±¤{HȈÆ.z¬ú;Г× £ÀÏ(fpÉ8õwsiˆöñÅy.->¥{óޏÄò~Ÿ÷®«¾];¤ŸYXÐÁ$¸Î%ÅÄÅâGvJÀØÀò¨øøú¬ I‡Ž‡¿gÃ} eÆ"svUúЩJÓ°hŸ¢L¿0+쑴Ѿs>ÌšðèÐ. ×Îæ@/‡NHãJx¾v± ?Ñ®[²¹lÅí˘|A¶Uwn|ìž `tèv¸| » £0CÐÁÝ7´Ytò ÐaÐe‘n™ˆ'íñ`U7Í@tçaÂìô*LáćÎ÷Uï5‡˜åì,Â^o«‹'ÃθYùJÀsg“=qí»È³ŸX9û±’ÓÎævŠÍ£òI…ÕKˆ±ŸG%ˆïß)÷,¹:³ŸêÌá¯7–¾irKðÔi°ºÐ`Wvqc÷ór¼ÀÙzúPÎøhJÄÍ#(qõÓÎÑìTù”X!p´Ë™9šµ/WÃ9p4õÈ„pë•£©oôCGC'ïdS v&ÌÌрЌÎNû— …ö/gæhÈ~Aý̬S ^æpöŠúy¤ípÝñeFÇ!›.€q~û–­sTwƒíèÐåqÃÃBõ‰,£“÷­GP×”„Õ_!3ÚSg8’ÛÉÀdC166 :óÔê½™¬'ƒÎfŽ~€q:N“?{e&çê}%ˆ)Pp ôã£È1Î&íðöLÛ‹&bè‡N9þ*9~š€:ãgèÌîÈJ¤²Pãc×sÓïï?H²0 Åm,F’…!w²±Þ“ùèM»Ê:|°S!ší.Î.Å®gviY»?»~M•…Á¤Ø5ƒ~OêÏ®5ú™FR6ìHðð'—†0$<å…Vä‹Éù§–†7^Ne=tJ‹èÆ1¨ë3û:¡m‰ ”AROß ±à£Q2kº «,çg¡îµ¸äçU``ÜÄ ê.Ñtbò #{žRp¸®ž+ÿp:ç”èDŠaDˆU0¥ FÚ-«X ù†Ñ“ÒÃHcˆ\³Ûû·ÎXz(Yˆ«tóS´-ììÃG´`òÅûôv6ž‰Ýcñ'c*†ídÀ¾“Žà[šVb”Óà[#2‡ñš”ãtªXU\OÖ‚Â ãáùrñóÅ<¼Œ¥ 3ã‘ÕÂê#Ê¡óΠ Åæ“CçAŠÍ'‡Î;ƒÎq{ÃÔ9tÞt¶lÁrè¼3èìÙ‚ÓçÐygÐ9³§Í¡óΠ Åæ“CçAçÈœ:‡Î;ƒNÏ}›9‡Î;ƒÎÊá-‡.é™AGõÌ¡óΠÃ|žÉô´·ƒÑk§gí£ÏX§dZ¯§KŠ_àöf+ÎHŠr±ÛȬžüÓ%ŸXrvO/€ÓiXrêÖ-Gýâ”Xáä̲±‡…tÏ– – '«+—ý;KÍi}fÞœIû®H:Öõ¥¦%2äì‡9§„e>ú¸Á<àä›2‡üÉ>¾c6„½M)T³öK ¢§'û…‚8,¾¯ÕYÜÆ¶¥­b1ŸQj>K  B‹´¿MHÁ AuñLžÞ*ë±a%‘Iæ§Ñu~ÆŒ*Y 3tFÍÏBg¾ÙC°€ÍZOÚ•ˆš·M€'ËѪOÉÇèuÆöÔX“L}SLåšÅþ ž<½m_ó<ËÖÜ$„HÇaÒí&éÔˆO¬Þ ôÄ~†,0GßÝØ[`Ïã³9[1ðòÀ|s‡Ž†x ¼Ç¤ÆÛ1ÉžZˆ<ð`RôxSdÚ¿â"iÿ¦‰"py0}÷Ï+Ï7'†ྸïA˜³()2Ø™EÎ<¢êƒCŒœ33%ÄèG!I¾ bvÇo^q†ÖÃL¿L.6ûeÏ7Q'vªßÒ?_ŽÒ…Õ•áX™¼öu·‰Ôí}ÔA>u¹v=Œ=¢*&”n£Kv¯uð.nY¬ëXÃ3â™*ǺCÍCOqó£}0ˆYiB p0äÈâúLpxi.{þWž,xùÆíz¤ð ¶Òv=rß/+Ö¡EÒ1ùAq[ø¥Çyd Ù¹=#Š!=™M“bÉø¢nÚô±‡q|i.pZvLÉAÄ 'o÷Ž<%°û>w¹ñ’6%1˜óʰ ä‘¡F§[iqÓÀÉî‘ÙæT×ÝâbqäcÓ±xd¶ùCç (SD©÷ÈPcàßæä‘K[ž=‚è€Á#bIC›Ù#³‹3x{d°ŒT¿ü¼<2†&Pz=9À&Ç„ÉlQ;WêÚYÄ?nœEYÎ#'qû’÷Ž`54-—ÉÈ©3:dˆœ ù§¡m&fNƒ±£^7‡±¦yßb!]˜96Sþ¨fñN¯çÊ«£¤Ø3…ýDPrý’* õ⺥#TŒ¼°ì8IÏâÞYDAG°_ê§ïó·#ûùçÇtÿØÌùpz´##nÞùpÁ"T§Í‡sÆõ5ç’=â̇›%[=N…8§|8#Ùž7ï|8Ý£8¯37J>é–€¥¹çÃ7·x…ZN•ç²Å(Ç:З2‡”Ž•Ýšê“/Æé¸d˜®[²ÄDº¢$¦£ýËÙÓë!bŒ„dèÇ}­Eà^ØÃxžr6P‰Ÿ9“ öã{©ïñ|ééóI'Ð æ CÂQLb @†"´Y`#f¾¶ì¸!»óÆiv2¬Þ_1PŽQɰzUt^Aûev2¼Íå6`ÔO2¤E©Á~æ@†°·-ô®­†ìp›bOå0°3û3~·Myx¥¡¯&qEð™c3¨aÒ<2Rï?昑 :›_FêýÇ2Rù¨3éfªŒT9z” Äï(© Ÿ9ðMÐ v22S?,æ“oF*û5Ð.-ç ÄãÒÔ AF=¤,"4GY‹ûl#Sá,>4['H*œ¡ÁÒüƒóI…à ÆäÏ™..˜ßrÚT8»rN©p^è’v^©pšW!Ót¦T8Ó?Ævåç7ÂS%rKµHL‘Wg-RåôQ´ŽÎ¨1Ž»Ȱ3ÊE†Áu˜–j¿dxÚÔ†ݨãÛE8À¸ºAŠ1ˆ,¯Ž #œÂÁðŽjâA÷iUãˆèl+ž¾{εÁKªòuóqó¢òÆ—K™ƒëÊB÷ YÙN6/B±ÍáS2þ®Ÿ‚–ËåÚÍ}­#,oE+š8Bî^ÌŸ|åÎ;+oã¹XŽrq W·§¶U{ ØÖZùî––ìvCMvS&Ok¼cP<ÃŽ«q+G”As ‹ùóÄ-ÙÍ3Ãn$zeØÕ¾\R]Þo¥_h¹X G.–£Ÿ$`ƒÚSÀÔåü’UêÕ™ìK\ö)Yg Ï »hMNSåj‡§”As ±ìq剞a÷è•춘£Z?[øBÖã‹ôŽdZ†Ý¹G.áñá}Ðjõ²fóÀƒaµ Œ¿ô\¼ÉÊfƾû”vb™óngTa~ZYÛeè1¹6W-Ñ Ö|›u*¢æŽ%N±|ä²W̽oÈ­#L~eWJX'DšÜ¯ p¢§ölËœglE¿ìš°ÿ”È1W`ReŸxRÆ,?Õ?æjªJr„)ÅB¬N^ßJr¬^8tíÙ\à4´‹yÿ¸¾ Eä|½pÓ‘cYŸQ÷5V×oJ¾µ˜Îš+`M‰èU`¨Ç>%è¾ñ¬,I wªËÓ;s6³f¦l:R.±9eÓ‘–š{6^æ›M7kæãôÇØ–DžW6I®›¾ñ¹eÓ±Ý2k6]‰‘]¨³À‰µxž¸3±–pE1x¶é-¥Ùo„•é+4<[Wc!LvQAù­»â JR½W¯j ­%œ‰ à™O‘&§%N¡¾d­Qí™r5œ&¡u5¿ †WCÖDOÚWߦ¨Së Õ_Ù]_ Í¡Æë–â©N«Q?3åsu¬\WO»*{rºý†CÖT‹@%2øðBÝkÅ•O´üᳬx½ÆÝlGäF…;ψf2ô«p nõ 3—E'V¸›¶R^0ò¡WÊ›K>ge.yIŒîX|ã³W¸sÖ{uÖ¸Ûb©pÇz«9 Ra*í—EטâÞQØÙ#C.,¦æÝ’šX+G[,.OÓåÅ8Í!ó‘á²ß{®´~fôf!ß8èg‰µ°J “Ãóï‡~/œG“™™â,—7u~»û :±ªï¾ of&C3?óàcÔ4& (ï”3†)éfJ³¸/7s»ÚvÌöéý–vˆyÛîìJ˜è9eæƒi†WtÆL1„SrÆ*¼•ß©–Ó«.ŰœÆ&L»µ‰É>»e(÷ˆÝwá_‘î•zSƒO¹G‚>VNû˜EÌWS®$?ˆ±ç¸–Óλù¦Öa\ñAìµgÏq…EòÜ"œõ̘éyÇ›S8xÜAdÑ/—©=®’Æ3Ò̺eEÙæcZŠÞÅvþ¶ò¥v{QùRUvv÷r¡X¹”n—Ë¥Ì! ãlŽ ÑëÛ§§{—uØ.Gý;r>ÜFäÎÊœÒ|¶Ü¿³µS•lùpÉõö - Oz]‰mD†¤AC1˜°EÏýS£µN†:(W»(QÍ-X9búî۳Ğ<­¯±AuØÖ’ª9(–šŠ!go^ë”Ü¿hœšš¦Lžxz^rcý¿Ì™†çQ]/{{ç•ù÷NL74²ÒjË ÒZÑ Kîk‡6h×+ ïìÆÆ-ixÇwuÊ …=[ñBç g®=EgâúÀß&¦¯‘ZÚ­3µËÞ7ìù•ô–‰S­.&9‚ÒinmÒwÕ~òôï¢Ê½Â&“îÛåN—†óªbF …¡zHèù?SNÉq¾&(†žmeÓtg©ÌrWñ‹kÃnjõñ$.û„ 1l²Åî*ÁB«<²ÒÈUÓd¥ùEhº±‰v̺óDÎ뻊ôXŸ7j†‚Lʯê uJöÓ˜wç§Å6%úˆe#wêÂ1X"YaìÐG5S˜S¿zßs(ÇÊ/.Þæ¥L yG»Ô{´q|Jw§9%¤L´ó{–TNš¦ôVô5˜÷ïjÕß²`ócÊ}öΈgëÞó¢TeùÿeŸ?OˆÑ‹lM1z‘Ÿ) –¥væJ¦k‡z ]¾Í¤”+Ðëj+ê9¬×€Y€¬9€:çŸÒŸÌšè¡[2d²æ2U1£À„½¢žG®(C k K– = =ÇŠ Ž`×Àx沑i§oÞ9€fÆk“ÚÓ¬Eù¼+²Í«(_0/Ü´EùBDm€6©i‹ò*²}BQ>2›wQ¾?œKQ>¤õÁ xŸZ”^-kžEù¨õ+g(Êç˜R#{o?Å#B.™Rƒº~ÖHUý¦ºŠP×oŠX¸)êúQ ¦Wõ›ÇÝP°®ßìѶ,uý|ã”æR×Ï»ªóÝP>uýX­®Ÿ•Žèy7ÔŒuý¼Ca6Ç<êúy+줢iêú9—k¯êGô)MQ×Ï;ž)äïÐeªëç½´Pl>uýæQÄ¿®Ÿ÷‚t)6s]?#áÎëVóÙëúyGœ‘s§L?ÂCOÌä#xͳ¶–Ùëú‘rÛ,ª›)+Í· ë T¬uý¼M]CSšµ®ŸmrU¿àõøæó>u]?ïª~³Ôãc?P¡çŒ«ëç†2RçQ×O?P¡TõÃrxgMOñ¨êg‹»˜¡®ŸçQd’¾/Áêú\ #;UΣ®ŸwU¿ùd¥Õ¼×¼€ñÍT×Ïû Ë•+:e]?ïª~3Ôã P$Ø«ßÌ·x˜UýæRÏW‰gÈæp×õcÌ{ FÛÎT×÷€])Š2S]?uý¼A ëŠÎ£®Ÿ 1¢7Ç}/KΓ»®_0¿å´uý¼& 7ON‘óô¨xWõ =èQ×Ï[1ÄøØLuý¼C×Iâ”uý( Ô«úÑNF‚Öõó>± ÅæS×Ï;˜˜];E]?*ÄP¦€ÿY[ =ï{víôuý¼…ƒ3‹sÚº~dáÐȦ‘p°ÒÈzLY“ ^—˜"×®¸X|Ë8»¡é“5ðÞž¶ètiY>,MV.ÙÈ>þŽ»¼c6 ‚ 4#ª€;»í–(Ì‹Äï“ÈjfùåXF UQu7²ò¢œeVckKâõ‘´+å’êë~f8‘—÷º…âÊöÝâ—hdœˆìÖÎ3ÑÛ¯¹µÅæõB%ö6h6–»¯£Õ\³ññ˜ë4^vÞžŽ_C±Ãn³X<¾ßû¸jò£ÃçæëY¯YÏM®ë‰øãc9™øv+};y?M®?’_vÆJ¬_Vq1v‡™·øºžøÒh_%‹É£øÖÇâ{ƒëÄEÙ^;¬<ÔÁZ"B餟\ogw¸·½ÅÕ.®k\}axÌÕOŽ_¥·½ªL^·–ÕåÔq .<¢gZn}T“›…ã;¸%”öÆU¯òŠúr°ÀeNºØ6áž^}_P~é–:®|©í6j›»›m«¤VGp¹ôqNVŸÏ6_/?”Aî8r}|˜D+ ňk<¥W–b7§‹…õ~)vÚ¬,?5÷7³Å¥£\ÒLÛt_]Í7–¾´HÖÔhm5¢ô20óˆ–Åf‹iTbiWO±¾Í· Õ ÝßZ²–fIÛùåµ¥¡­^—>®v2ã• à0Ål+Sª {;àéÑÁÎóåÅñî^îé8Y”6·kÅÅóNùá`a­T(Ý&«a£Kݶê×qxÂOVR±I-¾·¿ÏW¿®m”{r†‡›3¨¶ß>Š^nÞV…ǽNŠËÈ«PÆ/ˆˆUø5˜›Ã7qû2šFÇ5o_XFÆ—‘² ô@lg~®%ÑO@ÌçàçΪ~Êzì¦ÐßââÆÆSí1qwÈ=ÝyÙYoD0ïC|¢)nðd¾XÁ_”c-óE qÉwB1óUõ²ùl¾à°«‹û¯Æ‹ãZ)_oDeóYk\ÿšn£ÈF>^Å_Ö8ø,£‹阃 Kïü^®!ÀŸ‚ÖwëkÌìû,©5iøUøsÕd8‹Uâ{h”³´Ö¨+Ã~Î8tm<ßÞ;A?õnÛ_îxd¦p™ÛZ2sÔ|ÁÛ‹z+$rkcЋ´6 —X,pB¿ ¤X5UL|ÝYç®q”,Sc©ÈÂt[¯:ç=f=’úC–8sÖ#ŸYP7’—ëJnë2{¼›èÄ5jJ|iFþ‚5ß »ïÆŠí^_?Yè%$&7céײ•½M¨ ^kØ-T¾ìóÚWÚ'’þWÿRÐÿšÜ}E¤.Tò£+vT“gX®ìæ(†‘½I•¬dh;»‚I÷;u´h¿2‘OOˆd祥«càÁ»fJÆœ@ËÜëQjÒhrõ,ñTn àÒ½ ßg’Õ«›=Ê{=’Yâ㨼&ªƒ ~æW4Š—£Í,êÚ4únŠG ÖPø¤ù•¢[âàŸü†Æ2Ÿ/×îˆ.Àîu1ÿ/øÔòkRo'ëâzz5" Åô§$¤§ÃU6R_ó]“öAù«½òÓÛn*(ýR?:¨9¹D>´u¤…Êê]’ËÔw’p׎ðø1M7±Û0§e:»œi–¬°¼i*Ä®…‰žóY’†XXíY´¼žaó+[¦·ÖEu¡wêU$Ë‹ÛUÝ®DE›…xñV´d3znm×u5as¸‚+Sk\¬i~BÔ˜ëF¥Œ£ƒ››Ó]­x¯Âf/Žépè@ &´CÕûõUqiýŽøTIA6«i°èP ¯ÒÚ³õQDHZ« Gð×ãØ‚{H“Iú ÂË™Unê+Qëf(ù¢ðÅ­=K~Ù\ÐëÊ"¶Œ«và Gôhñí»0ÑlÝyK‚žÁ÷%{ûÅR’ìE‹Â0Ú…Vuèówá+~2¢•ªÓTQ›æ‚•¢“”yÛ Uk hr‰¯hr:Ž!`᱇¨,‰¦3.¬{3v®Wd¤Ae RØéÐ]ë¹ò¦)þ次v¡Ïû+¾ýËcÚFd6± ÎÛçV°.b‘'£‹MÁê"ÞZ<¿§ìd‚T€Éž³°w‘šr¦-ö”Xui*(ޱ,ƒ£t±)ØÚ¥ès b*ÅØ£9y­rú±qMÈ goLJbô™™¬¡4<×ï^9,;Î÷3+ؤâú©ãî¤ ™º£jde÷~7Jô1MŒ~ªJ®sËOVÉ5__ç“UrKçÿL•ÆÃ¥ü“Ur°/4zŽ*¹Åa>S%Ú8TÊ?Y%û•rÓ“7·lIÓ34%xó6®)ÁÕû]D+Z4Gz@fàç­v-ç2ãx©HÙ@fofý|À‹Ã!³ÛK <€Âè'øçv˜Ö m'ò SSi3§@}™lìgz7ã´vvÞK­%·׫¶ètó Aܾ:>4tgýøâR—ç[ù„ ãÀkò€ö·6“Ø39ºö­2âq¡ôår;Ó¹ÍÖ~†“Z‡ÛZŠñöÕ¨¤7©¯%Ö‹ ˜KAÛ¾~/uáåD׃wÿo+”/¤pA*äÙóI¿«œ(½—Þ œ ­‡2»û<9è kJ·{Ñý߸2lOÞ»ƒqx-œÙm–÷÷ R¥Ûvº 9õ“µ+ºËO÷É4Ý:¬áRª<ëo{ ç›rå™»ÝrºïâÞ&t߇b‘äÖÛF$Öå#©×oMø³¦)mšýæð kÊûP;s+ •®RšT“GëÊá~¤i©öHõ•ú­êGåKM&üîž´«l'_ïJOÇB3¸³?Û«š…†Œ»›rþ¼é=¶åI!ý~¼Ilgá2®à¬‚Y¬2‘Tbg>=ˆ$ϢǑd;} _lGVwÅN$ut³YùXP ¦ Ku“Ôv˜YëúÆ× "=Z$ÐÆý²…lG»½EB/½ï}ÌqñtF³»òc\ÿë[wE§8F/èçZcO3×à±]#«w¬Ä±aTîsVs{ò¸h ±¬8è`±¼i¼(¯b¬éÑ„EÖ @—/»Æ‹Þ|ñU7Ýê›+Ö3|äz9…¹#¾âc×÷ÓPXVÍ=’É ‚¿MÀ‹sýB=~žîX}?¢8ð¬†Dõ `aÝÂ6hf[µQ@¾IÐè$-õàcü¼DÝ®h›“9½MIÀ¿°±€ü`€4·U‹c£ Œÿ VÉÈKk/ƒåËÚF5ûÍ$¾¸n×oÎðcRŒÐ(‚iÊV·ŽN± ‡`Ý>Ômâ pV,Ôk;ËÝ‹Ê~g3¢ÓÕí oaò…€‰žDÿqÁ\rÖ‚Œ#ZëñДÎf[—Z7ßjì'À_@äk²¤õU€IsûØ·–,¢¿ìÇ0$·±ÁLúôg«@:߀À¶5.ú€ÉatYÒÍqM$ ôeœtW%¢Ë%šÈé“BWÁ!U"§«¢×UY“w€ì¡ÜÜ‹k±«¾AuoE'v>šÑ*Òfʰã!í£dF𴜆ÇÄ7¦ûÇ(ä"Õ2ä£EÀ ,haà Ù,w7·€àâñ5ƒŽ×V4Õ7Ž«Ý[;)MÊù¼t~oå\wÝ[êù§(çÙÔs‚r^²¶.øI*:GÕ®yüÄ“T´*tœú™'©¦óöSOR Xý¿­ Nè"z¬:¸{(‹'Íîx2‚ ¤ÇR÷¥7hÈß»JˆkÿÇÿƒÿæ‹a^(„I?$ø´Ñ ÅQÛ0Ÿ7c~Ìì*ãJ¯=î ²ò=¼Ý5.÷+áµ°Öö´]ÇÁl¸GмJ@ŸÔ#˜ácˆ ï‚ÿ¿ùüsâÒ9A”„b˜KK"üþÁ \ü!ˆ¼˜‡Oļ e‹è\6ÏÃ? Y‘φ㧻Ç'ÇÕpV— ´Š›·§/ óü8|þgÃGá».Ü38 ¹<_ ‹à¥œ” ¿‡DžKù¼õ¨¹|:+ÃbGÿ+ä‹ÚWù|šËòaW/åÐ3ø¨˜–²9ðU^­À oŽ×á9Ð^ á,'¦‹°ã,è°¿)Hi tc=°f#䤴À$Û³VFSð̆áPyÔ ¼‚}»çƒf V[³è!ü_8Çš“X„€9Áb y)œåy0˜½&Ççòè\˜¦ã ˜˜o|•ç ¥òÙ4¾Î‚þ ð!WÔŸë)†Û`e…´˜ËŠRQÊ#È ðkØH*Š ÐFëFJgÅ<€"z»FÌçÒ"j‡æ´ox!-D®è‘”CS¶€ŸO‹"k^ÐÖƒ‹Á¼x´|þx@…´PäÑ3>ˆP’¶EÐ-ìD( õfQû-ré<ø"Ëñ›Ê!øö—å8кˆ&ãø[<ì ~“Uˆ¼Ž©Å,\8 ÔP°‡“‚@Ä‚CÁ!¢hC8¡IÔ8¿/¢þÀÆ#R}Á¨þLä{¸¼”¾!àu 9–aÐ3ðC‚ð¹BNÈkÔ›ÎI…‚9A!ßo–ÃýáË0ÜêOº&¥Ã%ò  9mDc=+ä:ºÏD>]¸ùö­Ð °!Û#¸p c¾—%Pæ²Ö`ÚEÀšà“BQ‚lBH£ÅÁdÁ 7Ÿ5ðg`|~ ˆ˜ã ዘY€â|!g=i‡Ä¬.ft°Vb:—åµ9ð|AÀŸÖUÈkß™ÏÕ œ;ø# ñ<ݰ'€å‰íö Ð"W€­Ü$IDà Ù,šg¾˜/ZOàxÿ9{«<˜9zºÌòè Â_ȬÚIJRÞ|ÒÀŸiÀ¾òhq€5çЄ8È8|Ž$ë ʈ€f+Þ¬ ÀIŠ€ŒÛ¸ýY -×x–4&äôi#¸A6%ˆØ!ÍÁÝ£éÀžÐÜÀAÐ1%+äá´s`»à„,q$`ZÈ¢·pLTÁç´¾²Y¸¿è‰˜G EÛ°œ¶Oæ3°À%¬•¹R—·íS0<”Ñ*$‡_  Üúœˆ¹X@Û"B\…s$À‰¼õ¬?3…dBÛl Ö^IYïc­çBô“Ïsö_²ù  ¹(äÂVO&q˜ãa$fUD{bµÒ) d ì)ÏóÚÌ Å‚ÆåÈ#¦£iú³þŒKgóB l[m=àdpw5‰â°­7y.¶õÎ#Y!*™¬±n×EQ^“.N>ù+QWã™ýÁXSÎÂíáûh8tÂê«<ê†ß‡.¦©5JšÂÔG¤Ö­k&v*¿t/¹×êã‹*ÿÕ ËƒÁp,»#ð&ü¢tÕñP邇Ã'à£9PDOj¡ÿIHÈ” endstream endobj 89 0 obj <> endobj xref 0 94 0000000003 65535 f 0000000016 00000 n 0000019955 00000 n 0000000004 00000 f 0000000006 00000 f 0000020779 00000 n 0000000007 00000 f 0000000008 00000 f 0000000009 00000 f 0000000010 00000 f 0000000011 00000 f 0000000012 00000 f 0000000013 00000 f 0000000014 00000 f 0000000015 00000 f 0000000019 00000 f 0000020006 00000 n 0000020638 00000 n 0000020669 00000 n 0000000020 00000 f 0000000021 00000 f 0000000022 00000 f 0000000023 00000 f 0000000024 00000 f 0000000025 00000 f 0000000026 00000 f 0000000027 00000 f 0000000028 00000 f 0000000029 00000 f 0000000030 00000 f 0000000031 00000 f 0000000032 00000 f 0000000033 00000 f 0000000034 00000 f 0000000035 00000 f 0000000036 00000 f 0000000037 00000 f 0000000041 00000 f 0000020077 00000 n 0000020522 00000 n 0000020553 00000 n 0000000042 00000 f 0000000043 00000 f 0000000044 00000 f 0000000045 00000 f 0000000046 00000 f 0000000047 00000 f 0000000048 00000 f 0000000049 00000 f 0000000050 00000 f 0000000051 00000 f 0000000052 00000 f 0000000053 00000 f 0000000054 00000 f 0000000055 00000 f 0000000056 00000 f 0000000057 00000 f 0000000058 00000 f 0000000059 00000 f 0000000063 00001 f 0000020148 00000 n 0000020406 00000 n 0000020437 00000 n 0000000064 00000 f 0000000065 00000 f 0000000066 00000 f 0000000067 00000 f 0000000068 00001 f 0000000069 00000 f 0000000070 00000 f 0000000071 00000 f 0000000080 00000 f 0000023371 00000 n 0000023445 00000 n 0000023685 00000 n 0000024716 00000 n 0000035850 00000 n 0000101438 00000 n 0000167026 00000 n 0000232614 00000 n 0000000000 00001 f 0000020754 00000 n 0000020219 00000 n 0000020290 00000 n 0000020321 00000 n 0000022308 00000 n 0000022421 00000 n 0000022456 00000 n 0000021142 00000 n 0000285780 00000 n 0000022810 00000 n 0000022858 00000 n 0000022054 00000 n 0000000190 00000 n trailer <<879DB089327A454292F4CFF94C60DAE4>]>> startxref 285961 %%EOF bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch07.html0000644000470500017500000002757112271526120017022 0ustar lamontlamont Chapter 7. BIND 9 Security Considerations

    Chapter 7. BIND 9 Security Considerations

    Access Control Lists

    Access Control Lists (ACLs) are address match lists that you can set up and nickname for future use in allow-notify, allow-query, allow-query-on, allow-recursion, allow-recursion-on, blackhole, allow-transfer, etc.

    Using ACLs allows you to have finer control over who can access your name server, without cluttering up your config files with huge lists of IP addresses.

    It is a good idea to use ACLs, and to control access to your server. Limiting access to your server by outside parties can help prevent spoofing and denial of service (DoS) attacks against your server.

    Here is an example of how to properly apply ACLs:

    // Set up an ACL named "bogusnets" that will block
    // RFC1918 space and some reserved space, which is
    // commonly used in spoofing attacks.
    acl bogusnets {
            0.0.0.0/8;  192.0.2.0/24; 224.0.0.0/3;
            10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
    };
    
    // Set up an ACL called our-nets. Replace this with the
    // real IP numbers.
    acl our-nets { x.x.x.x/24; x.x.x.x/21; };
    options {
      ...
      ...
      allow-query { our-nets; };
      allow-recursion { our-nets; };
      ...
      blackhole { bogusnets; };
      ...
    };
    
    zone "example.com" {
      type master;
      file "m/example.com";
      allow-query { any; };
    };
    

    This allows recursive queries of the server from the outside unless recursion has been previously disabled.

    Chroot and Setuid

    On UNIX servers, it is possible to run BIND in a chrooted environment (using the chroot() function) by specifying the "-t" option for named. This can help improve system security by placing BIND in a "sandbox", which will limit the damage done if a server is compromised.

    Another useful feature in the UNIX version of BIND is the ability to run the daemon as an unprivileged user ( -u user ). We suggest running as an unprivileged user when using the chroot feature.

    Here is an example command line to load BIND in a chroot sandbox, /var/named, and to run named setuid to user 202:

    /usr/local/sbin/named -u 202 -t /var/named

    The chroot Environment

    In order for a chroot environment to work properly in a particular directory (for example, /var/named), you will need to set up an environment that includes everything BIND needs to run. From BIND's point of view, /var/named is the root of the filesystem. You will need to adjust the values of options like like directory and pid-file to account for this.

    Unlike with earlier versions of BIND, you typically will not need to compile named statically nor install shared libraries under the new root. However, depending on your operating system, you may need to set up things like /dev/zero, /dev/random, /dev/log, and /etc/localtime.

    Using the setuid Function

    Prior to running the named daemon, use the touch utility (to change file access and modification times) or the chown utility (to set the user id and/or group id) on files to which you want BIND to write.

    Note

    Note that if the named daemon is running as an unprivileged user, it will not be able to bind to new restricted ports if the server is reloaded.

    Dynamic Update Security

    Access to the dynamic update facility should be strictly limited. In earlier versions of BIND, the only way to do this was based on the IP address of the host requesting the update, by listing an IP address or network prefix in the allow-update zone option. This method is insecure since the source address of the update UDP packet is easily forged. Also note that if the IP addresses allowed by the allow-update option include the address of a slave server which performs forwarding of dynamic updates, the master can be trivially attacked by sending the update to the slave, which will forward it to the master with its own source IP address causing the master to approve it without question.

    For these reasons, we strongly recommend that updates be cryptographically authenticated by means of transaction signatures (TSIG). That is, the allow-update option should list only TSIG key names, not IP addresses or network prefixes. Alternatively, the new update-policy option can be used.

    Some sites choose to keep all dynamically-updated DNS data in a subdomain and delegate that subdomain to a separate zone. This way, the top-level zone containing critical data such as the IP addresses of public web and mail servers need not allow dynamic update at all.

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch08.html0000644000470500017500000001503412271526120017012 0ustar lamontlamont Chapter 8. Troubleshooting

    Chapter 8. Troubleshooting

    Common Problems

    It's not working; how can I figure out what's wrong?

    The best solution to solving installation and configuration issues is to take preventative measures by setting up logging files beforehand. The log files provide a source of hints and information that can be used to figure out what went wrong and how to fix the problem.

    Incrementing and Changing the Serial Number

    Zone serial numbers are just numbers — they aren't date related. A lot of people set them to a number that represents a date, usually of the form YYYYMMDDRR. Occasionally they will make a mistake and set them to a "date in the future" then try to correct them by setting them to the "current date". This causes problems because serial numbers are used to indicate that a zone has been updated. If the serial number on the slave server is lower than the serial number on the master, the slave server will attempt to update its copy of the zone.

    Setting the serial number to a lower number on the master server than the slave server means that the slave will not perform updates to its copy of the zone.

    The solution to this is to add 2147483647 (2^31-1) to the number, reload the zone and make sure all slaves have updated to the new zone serial number, then reset the number to what you want it to be, and reload the zone again.

    Where Can I Get Help?

    The Internet Systems Consortium (ISC) offers a wide range of support and service agreements for BIND and DHCP servers. Four levels of premium support are available and each level includes support for all ISC programs, significant discounts on products and training, and a recognized priority on bug fixes and non-funded feature requests. In addition, ISC offers a standard support agreement package which includes services ranging from bug fix announcements to remote support. It also includes training in BIND and DHCP.

    To discuss arrangements for support, contact info@isc.org or visit the ISC web page at http://www.isc.org/services/support/ to read more.

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch03.html0000644000470500017500000007030712271526120017011 0ustar lamontlamont Chapter 3. Name Server Configuration

    Chapter 3. Name Server Configuration

    In this chapter we provide some suggested configurations along with guidelines for their use. We suggest reasonable values for certain option settings.

    Sample Configurations

    A Caching-only Name Server

    The following sample configuration is appropriate for a caching-only name server for use by clients internal to a corporation. All queries from outside clients are refused using the allow-query option. Alternatively, the same effect could be achieved using suitable firewall rules.

    // Two corporate subnets we wish to allow queries from.
    acl corpnets { 192.168.4.0/24; 192.168.7.0/24; };
    options {
         // Working directory
         directory "/etc/namedb";
    
         allow-query { corpnets; };
    };
    // Provide a reverse mapping for the loopback
    // address 127.0.0.1
    zone "0.0.127.in-addr.arpa" {
         type master;
         file "localhost.rev";
         notify no;
    };
    

    An Authoritative-only Name Server

    This sample configuration is for an authoritative-only server that is the master server for "example.com" and a slave for the subdomain "eng.example.com".

    options {
         // Working directory
         directory "/etc/namedb";
         // Do not allow access to cache
         allow-query-cache { none; };
         // This is the default
         allow-query { any; };
         // Do not provide recursive service
         recursion no;
    };
    
    // Provide a reverse mapping for the loopback
    // address 127.0.0.1
    zone "0.0.127.in-addr.arpa" {
         type master;
         file "localhost.rev";
         notify no;
    };
    // We are the master server for example.com
    zone "example.com" {
         type master;
         file "example.com.db";
         // IP addresses of slave servers allowed to
         // transfer example.com
         allow-transfer {
              192.168.4.14;
              192.168.5.53;
         };
    };
    // We are a slave server for eng.example.com
    zone "eng.example.com" {
         type slave;
         file "eng.example.com.bk";
         // IP address of eng.example.com master server
         masters { 192.168.4.12; };
    };
    

    Load Balancing

    A primitive form of load balancing can be achieved in the DNS by using multiple records (such as multiple A records) for one name.

    For example, if you have three WWW servers with network addresses of 10.0.0.1, 10.0.0.2 and 10.0.0.3, a set of records such as the following means that clients will connect to each machine one third of the time:

    Name

    TTL

    CLASS

    TYPE

    Resource Record (RR) Data

    www

    600

    IN

    A

    10.0.0.1

    600

    IN

    A

    10.0.0.2

    600

    IN

    A

    10.0.0.3

    When a resolver queries for these records, BIND will rotate them and respond to the query with the records in a different order. In the example above, clients will randomly receive records in the order 1, 2, 3; 2, 3, 1; and 3, 1, 2. Most clients will use the first record returned and discard the rest.

    For more detail on ordering responses, check the rrset-order sub-statement in the options statement, see RRset Ordering.

    Name Server Operations

    Tools for Use With the Name Server Daemon

    This section describes several indispensable diagnostic, administrative and monitoring tools available to the system administrator for controlling and debugging the name server daemon.

    Diagnostic Tools

    The dig, host, and nslookup programs are all command line tools for manually querying name servers. They differ in style and output format.

    dig

    The domain information groper (dig) is the most versatile and complete of these lookup tools. It has two modes: simple interactive mode for a single query, and batch mode which executes a query for each in a list of several query lines. All query options are accessible from the command line.

    dig [@server] domain [query-type] [query-class] [+query-option] [-dig-option] [%comment]

    The usual simple use of dig will take the form

    dig @server domain query-type query-class

    For more information and a list of available commands and options, see the dig man page.

    host

    The host utility emphasizes simplicity and ease of use. By default, it converts between host names and Internet addresses, but its functionality can be extended with the use of options.

    host [-aCdlnrsTwv] [-c class] [-N ndots] [-t type] [-W timeout] [-R retries] [-m flag] [-4] [-6] hostname [server]

    For more information and a list of available commands and options, see the host man page.

    nslookup

    nslookup has two modes: interactive and non-interactive. Interactive mode allows the user to query name servers for information about various hosts and domains or to print a list of hosts in a domain. Non-interactive mode is used to print just the name and requested information for a host or domain.

    nslookup [-option...] [[host-to-find] | [- [server]]]

    Interactive mode is entered when no arguments are given (the default name server will be used) or when the first argument is a hyphen (`-') and the second argument is the host name or Internet address of a name server.

    Non-interactive mode is used when the name or Internet address of the host to be looked up is given as the first argument. The optional second argument specifies the host name or address of a name server.

    Due to its arcane user interface and frequently inconsistent behavior, we do not recommend the use of nslookup. Use dig instead.

    Administrative Tools

    Administrative tools play an integral part in the management of a server.

    named-checkconf

    The named-checkconf program checks the syntax of a named.conf file.

    named-checkconf [-jvz] [-t directory] [filename]

    named-checkzone

    The named-checkzone program checks a master file for syntax and consistency.

    named-checkzone [-djqvD] [-c class] [-o output] [-t directory] [-w directory] [-k (ignore|warn|fail)] [-n (ignore|warn|fail)] [-W (ignore|warn)] zone [filename]

    named-compilezone

    Similar to named-checkzone, but it always dumps the zone content to a specified file (typically in a different format).

    rndc

    The remote name daemon control (rndc) program allows the system administrator to control the operation of a name server. Since BIND 9.2, rndc supports all the commands of the BIND 8 ndc utility except ndc start and ndc restart, which were also not supported in ndc's channel mode. If you run rndc without any options it will display a usage message as follows:

    rndc [-c config] [-s server] [-p port] [-y key] command [command...]

    See rndc(8) for details of the available rndc commands.

    rndc requires a configuration file, since all communication with the server is authenticated with digital signatures that rely on a shared secret, and there is no way to provide that secret other than with a configuration file. The default location for the rndc configuration file is /etc/rndc.conf, but an alternate location can be specified with the -c option. If the configuration file is not found, rndc will also look in /etc/rndc.key (or whatever sysconfdir was defined when the BIND build was configured). The rndc.key file is generated by running rndc-confgen -a as described in the section called “controls Statement Definition and Usage”.

    The format of the configuration file is similar to that of named.conf, but limited to only four statements, the options, key, server and include statements. These statements are what associate the secret keys to the servers with which they are meant to be shared. The order of statements is not significant.

    The options statement has three clauses: default-server, default-key, and default-port. default-server takes a host name or address argument and represents the server that will be contacted if no -s option is provided on the command line. default-key takes the name of a key as its argument, as defined by a key statement. default-port specifies the port to which rndc should connect if no port is given on the command line or in a server statement.

    The key statement defines a key to be used by rndc when authenticating with named. Its syntax is identical to the key statement in named.conf. The keyword key is followed by a key name, which must be a valid domain name, though it need not actually be hierarchical; thus, a string like "rndc_key" is a valid name. The key statement has two clauses: algorithm and secret. While the configuration parser will accept any string as the argument to algorithm, currently only the string "hmac-md5" has any meaning. The secret is a base-64 encoded string as specified in RFC 3548.

    The server statement associates a key defined using the key statement with a server. The keyword server is followed by a host name or address. The server statement has two clauses: key and port. The key clause specifies the name of the key to be used when communicating with this server, and the port clause can be used to specify the port rndc should connect to on the server.

    A sample minimal configuration file is as follows:

    key rndc_key {
         algorithm "hmac-md5";
         secret
           "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
    };
    options {
         default-server 127.0.0.1;
         default-key    rndc_key;
    };
    

    This file, if installed as /etc/rndc.conf, would allow the command:

    $ rndc reload

    to connect to 127.0.0.1 port 953 and cause the name server to reload, if a name server on the local machine were running with following controls statements:

    controls {
            inet 127.0.0.1
                allow { localhost; } keys { rndc_key; };
    };
    

    and it had an identical key statement for rndc_key.

    Running the rndc-confgen program will conveniently create a rndc.conf file for you, and also display the corresponding controls statement that you need to add to named.conf. Alternatively, you can run rndc-confgen -a to set up a rndc.key file and not modify named.conf at all.

    Signals

    Certain UNIX signals cause the name server to take specific actions, as described in the following table. These signals can be sent using the kill command.

    SIGHUP

    Causes the server to read named.conf and reload the database.

    SIGTERM

    Causes the server to clean up and exit.

    SIGINT

    Causes the server to clean up and exit.

    bind9-9.9.5.dfsg/doc/arm/man.dig.html0000644000470500017500000010272512271526120016572 0ustar lamontlamont dig

    Name

    dig — DNS lookup utility

    Synopsis

    dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type] [-x addr] [-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt...]

    dig [-h]

    dig [global-queryopt...] [query...]

    DESCRIPTION

    dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and displays the answers that are returned from the name server(s) that were queried. Most DNS administrators use dig to troubleshoot DNS problems because of its flexibility, ease of use and clarity of output. Other lookup tools tend to have less functionality than dig.

    Although dig is normally used with command-line arguments, it also has a batch mode of operation for reading lookup requests from a file. A brief summary of its command-line arguments and options is printed when the -h option is given. Unlike earlier versions, the BIND 9 implementation of dig allows multiple lookups to be issued from the command line.

    Unless it is told to query a specific name server, dig will try each of the servers listed in /etc/resolv.conf. If no usable server addresses are found, dig will send the query to the local host.

    When no command line arguments or options are given, dig will perform an NS query for "." (the root).

    It is possible to set per-user defaults for dig via ${HOME}/.digrc. This file is read and any options in it are applied before the command line arguments.

    The IN and CH class names overlap with the IN and CH top level domains names. Either use the -t and -c options to specify the type and class, use the -q the specify the domain name, or use "IN." and "CH." when looking up these top level domains.

    SIMPLE USAGE

    A typical invocation of dig looks like:

     dig @server name type 

    where:

    server

    is the name or IP address of the name server to query. This can be an IPv4 address in dotted-decimal notation or an IPv6 address in colon-delimited notation. When the supplied server argument is a hostname, dig resolves that name before querying that name server.

    If no server argument is provided, dig consults /etc/resolv.conf; if an address is found there, it queries the name server at that address. If either of the -4 or -6 options are in use, then only addresses for the corresponding transport will be tried. If no usable addresses are found, dig will send the query to the local host. The reply from the name server that responds is displayed.

    name

    is the name of the resource record that is to be looked up.

    type

    indicates what type of query is required — ANY, A, MX, SIG, etc. type can be any valid query type. If no type argument is supplied, dig will perform a lookup for an A record.

    OPTIONS

    The -b option sets the source IP address of the query to address. This must be a valid address on one of the host's network interfaces or "0.0.0.0" or "::". An optional port may be specified by appending "#<port>"

    The default query class (IN for internet) is overridden by the -c option. class is any valid class, such as HS for Hesiod records or CH for Chaosnet records.

    The -f option makes dig operate in batch mode by reading a list of lookup requests to process from the file filename. The file contains a number of queries, one per line. Each entry in the file should be organized in the same way they would be presented as queries to dig using the command-line interface.

    The -m option enables memory usage debugging.

    If a non-standard port number is to be queried, the -p option is used. port# is the port number that dig will send its queries instead of the standard DNS port number 53. This option would be used to test a name server that has been configured to listen for queries on a non-standard port number.

    The -4 option forces dig to only use IPv4 query transport. The -6 option forces dig to only use IPv6 query transport.

    The -t option sets the query type to type. It can be any valid query type which is supported in BIND 9. The default query type is "A", unless the -x option is supplied to indicate a reverse lookup. A zone transfer can be requested by specifying a type of AXFR. When an incremental zone transfer (IXFR) is required, type is set to ixfr=N. The incremental zone transfer will contain the changes made to the zone since the serial number in the zone's SOA record was N.

    The -q option sets the query name to name. This useful do distinguish the name from other arguments.

    Reverse lookups — mapping addresses to names — are simplified by the -x option. addr is an IPv4 address in dotted-decimal notation, or a colon-delimited IPv6 address. When this option is used, there is no need to provide the name, class and type arguments. dig automatically performs a lookup for a name like 11.12.13.10.in-addr.arpa and sets the query type and class to PTR and IN respectively. By default, IPv6 addresses are looked up using nibble format under the IP6.ARPA domain. To use the older RFC1886 method using the IP6.INT domain specify the -i option. Bit string labels (RFC2874) are now experimental and are not attempted.

    To sign the DNS queries sent by dig and their responses using transaction signatures (TSIG), specify a TSIG key file using the -k option. You can also specify the TSIG key itself on the command line using the -y option; hmac is the type of the TSIG, default HMAC-MD5, name is the name of the TSIG key and key is the actual key. The key is a base-64 encoded string, typically generated by dnssec-keygen(8). Caution should be taken when using the -y option on multi-user systems as the key can be visible in the output from ps(1) or in the shell's history file. When using TSIG authentication with dig, the name server that is queried needs to know the key and algorithm that is being used. In BIND, this is done by providing appropriate key and server statements in named.conf.

    QUERY OPTIONS

    dig provides a number of query options which affect the way in which lookups are made and the results displayed. Some of these set or reset flag bits in the query header, some determine which sections of the answer get printed, and others determine the timeout and retry strategies.

    Each query option is identified by a keyword preceded by a plus sign (+). Some keywords set or reset an option. These may be preceded by the string no to negate the meaning of that keyword. Other keywords assign values to options like the timeout interval. They have the form +keyword=value. The query options are:

    +[no]tcp

    Use [do not use] TCP when querying name servers. The default behavior is to use UDP unless an AXFR or IXFR query is requested, in which case a TCP connection is used.

    +[no]vc

    Use [do not use] TCP when querying name servers. This alternate syntax to +[no]tcp is provided for backwards compatibility. The "vc" stands for "virtual circuit".

    +[no]ignore

    Ignore truncation in UDP responses instead of retrying with TCP. By default, TCP retries are performed.

    +domain=somename

    Set the search list to contain the single domain somename, as if specified in a domain directive in /etc/resolv.conf, and enable search list processing as if the +search option were given.

    +[no]search

    Use [do not use] the search list defined by the searchlist or domain directive in resolv.conf (if any). The search list is not used by default.

    +[no]showsearch

    Perform [do not perform] a search showing intermediate results.

    +[no]defname

    Deprecated, treated as a synonym for +[no]search

    +[no]aaonly

    Sets the "aa" flag in the query.

    +[no]aaflag

    A synonym for +[no]aaonly.

    +[no]adflag

    Set [do not set] the AD (authentic data) bit in the query. This requests the server to return whether all of the answer and authority sections have all been validated as secure according to the security policy of the server. AD=1 indicates that all records have been validated as secure and the answer is not from a OPT-OUT range. AD=0 indicate that some part of the answer was insecure or not validated. This bit is set by default.

    +[no]cdflag

    Set [do not set] the CD (checking disabled) bit in the query. This requests the server to not perform DNSSEC validation of responses.

    +[no]cl

    Display [do not display] the CLASS when printing the record.

    +[no]ttlid

    Display [do not display] the TTL when printing the record.

    +[no]recurse

    Toggle the setting of the RD (recursion desired) bit in the query. This bit is set by default, which means dig normally sends recursive queries. Recursion is automatically disabled when the +nssearch or +trace query options are used.

    +[no]nssearch

    When this option is set, dig attempts to find the authoritative name servers for the zone containing the name being looked up and display the SOA record that each name server has for the zone.

    +[no]trace

    Toggle tracing of the delegation path from the root name servers for the name being looked up. Tracing is disabled by default. When tracing is enabled, dig makes iterative queries to resolve the name being looked up. It will follow referrals from the root servers, showing the answer from each server that was used to resolve the lookup.

    +dnssec is also set when +trace is set to better emulate the default queries from a nameserver.

    +[no]cmd

    Toggles the printing of the initial comment in the output identifying the version of dig and the query options that have been applied. This comment is printed by default.

    +[no]short

    Provide a terse answer. The default is to print the answer in a verbose form.

    +[no]identify

    Show [or do not show] the IP address and port number that supplied the answer when the +short option is enabled. If short form answers are requested, the default is not to show the source address and port number of the server that provided the answer.

    +[no]comments

    Toggle the display of comment lines in the output. The default is to print comments.

    +[no]rrcomments

    Toggle the display of per-record comments in the output (for example, human-readable key information about DNSKEY records). The default is not to print record comments unless multiline mode is active.

    +split=W

    Split long hex- or base64-formatted fields in resource records into chunks of W characters (where W is rounded up to the nearest multiple of 4). +nosplit or +split=0 causes fields not to be split at all. The default is 56 characters, or 44 characters when multiline mode is active.

    +[no]stats

    This query option toggles the printing of statistics: when the query was made, the size of the reply and so on. The default behavior is to print the query statistics.

    +[no]qr

    Print [do not print] the query as it is sent. By default, the query is not printed.

    +[no]question

    Print [do not print] the question section of a query when an answer is returned. The default is to print the question section as a comment.

    +[no]answer

    Display [do not display] the answer section of a reply. The default is to display it.

    +[no]authority

    Display [do not display] the authority section of a reply. The default is to display it.

    +[no]additional

    Display [do not display] the additional section of a reply. The default is to display it.

    +[no]all

    Set or clear all display flags.

    +time=T

    Sets the timeout for a query to T seconds. The default timeout is 5 seconds. An attempt to set T to less than 1 will result in a query timeout of 1 second being applied.

    +tries=T

    Sets the number of times to try UDP queries to server to T instead of the default, 3. If T is less than or equal to zero, the number of tries is silently rounded up to 1.

    +retry=T

    Sets the number of times to retry UDP queries to server to T instead of the default, 2. Unlike +tries, this does not include the initial query.

    +ndots=D

    Set the number of dots that have to appear in name to D for it to be considered absolute. The default value is that defined using the ndots statement in /etc/resolv.conf, or 1 if no ndots statement is present. Names with fewer dots are interpreted as relative names and will be searched for in the domains listed in the search or domain directive in /etc/resolv.conf.

    +bufsize=B

    Set the UDP message buffer size advertised using EDNS0 to B bytes. The maximum and minimum sizes of this buffer are 65535 and 0 respectively. Values outside this range are rounded up or down appropriately. Values other than zero will cause a EDNS query to be sent.

    +edns=#

    Specify the EDNS version to query with. Valid values are 0 to 255. Setting the EDNS version will cause a EDNS query to be sent. +noedns clears the remembered EDNS version. EDNS is set to 0 by default.

    +[no]multiline

    Print records like the SOA records in a verbose multi-line format with human-readable comments. The default is to print each record on a single line, to facilitate machine parsing of the dig output.

    +[no]onesoa

    Print only one (starting) SOA record when performing an AXFR. The default is to print both the starting and ending SOA records.

    +[no]fail

    Do not try the next server if you receive a SERVFAIL. The default is to not try the next server which is the reverse of normal stub resolver behavior.

    +[no]besteffort

    Attempt to display the contents of messages which are malformed. The default is to not display malformed answers.

    +[no]dnssec

    Requests DNSSEC records be sent by setting the DNSSEC OK bit (DO) in the OPT record in the additional section of the query.

    +[no]sigchase

    Chase DNSSEC signature chains. Requires dig be compiled with -DDIG_SIGCHASE.

    +trusted-key=####

    Specifies a file containing trusted keys to be used with +sigchase. Each DNSKEY record must be on its own line.

    If not specified, dig will look for /etc/trusted-key.key then trusted-key.key in the current directory.

    Requires dig be compiled with -DDIG_SIGCHASE.

    +[no]topdown

    When chasing DNSSEC signature chains perform a top-down validation. Requires dig be compiled with -DDIG_SIGCHASE.

    +[no]nsid

    Include an EDNS name server ID request when sending a query.

    +[no]keepopen

    Keep the TCP socket open between queries and reuse it rather than creating a new TCP socket for each lookup. The default is +nokeepopen.

    MULTIPLE QUERIES

    The BIND 9 implementation of dig supports specifying multiple queries on the command line (in addition to supporting the -f batch file option). Each of those queries can be supplied with its own set of flags, options and query options.

    In this case, each query argument represent an individual query in the command-line syntax described above. Each consists of any of the standard options and flags, the name to be looked up, an optional query type and class and any query options that should be applied to that query.

    A global set of query options, which should be applied to all queries, can also be supplied. These global query options must precede the first tuple of name, class, type, options, flags, and query options supplied on the command line. Any global query options (except the +[no]cmd option) can be overridden by a query-specific set of query options. For example:

    dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
    

    shows how dig could be used from the command line to make three lookups: an ANY query for www.isc.org, a reverse lookup of 127.0.0.1 and a query for the NS records of isc.org. A global query option of +qr is applied, so that dig shows the initial query it made for each lookup. The final query has a local query option of +noqr which means that dig will not print the initial query when it looks up the NS records for isc.org.

    IDN SUPPORT

    If dig has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. dig appropriately converts character encoding of domain name before sending a request to DNS server or displaying a reply from the server. If you'd like to turn off the IDN support for some reason, defines the IDN_DISABLE environment variable. The IDN support is disabled if the variable is set when dig runs.

    FILES

    /etc/resolv.conf

    ${HOME}/.digrc

    SEE ALSO

    host(1), named(8), dnssec-keygen(8), RFC1035.

    BUGS

    There are probably too many query options.

    bind9-9.9.5.dfsg/doc/arm/man.dnssec-signzone.html0000644000470500017500000006720712271526120021145 0ustar lamontlamont dnssec-signzone

    Name

    dnssec-signzone — DNSSEC zone signing tool

    Synopsis

    dnssec-signzone [-a] [-c class] [-d directory] [-D] [-E engine] [-e end-time] [-f output-file] [-g] [-h] [-K directory] [-k key] [-L serial] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-P] [-p] [-R] [-r randomdev] [-S] [-s start-time] [-T ttl] [-t] [-u] [-v level] [-X extended end-time] [-x] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

    DESCRIPTION

    dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a keyset file for each child zone.

    OPTIONS

    -a

    Verify all generated signatures.

    -c class

    Specifies the DNS class of the zone.

    -C

    Compatibility mode: Generate a keyset-zonename file in addition to dsset-zonename when signing a zone, for use by older versions of dnssec-signzone.

    -d directory

    Look for dsset- or keyset- files in directory.

    -D

    Output only those record types automatically managed by dnssec-signzone, i.e. RRSIG, NSEC, NSEC3 and NSEC3PARAM records. If smart signing (-S) is used, DNSKEY records are also included. The resulting file can be included in the original zone file with $INCLUDE. This option cannot be combined with -O raw or serial number updating.

    -E engine

    Uses a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance signing with private keys from a secure key store. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.

    -g

    Generate DS records for child zones from dsset- or keyset- file. Existing DS records will be removed.

    -K directory

    Key repository: Specify a directory to search for DNSSEC keys. If not specified, defaults to the current directory.

    -k key

    Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times.

    -l domain

    Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records.

    -s start-time

    Specify the date and time when the generated RRSIG records become valid. This can be either an absolute or relative time. An absolute start time is indicated by a number in YYYYMMDDHHMMSS notation; 20000530144500 denotes 14:45:00 UTC on May 30th, 2000. A relative start time is indicated by +N, which is N seconds from the current time. If no start-time is specified, the current time minus 1 hour (to allow for clock skew) is used.

    -e end-time

    Specify the date and time when the generated RRSIG records expire. As with start-time, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no end-time is specified, 30 days from the start time is used as a default. end-time must be later than start-time.

    -X extended end-time

    Specify the date and time when the generated RRSIG records for the DNSKEY RRset will expire. This is to be used in cases when the DNSKEY signatures need to persist longer than signatures on other records; e.g., when the private component of the KSK is kept offline and the KSK signature is to be refreshed manually.

    As with start-time, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no extended end-time is specified, the value of end-time is used as the default. (end-time, in turn, defaults to 30 days from the start time.) extended end-time must be later than start-time.

    -f output-file

    The name of the output file containing the signed zone. The default is to append .signed to the input filename. If output-file is set to "-", then the signed zone is written to the standard output, with a default output format of "full".

    -h

    Prints a short summary of the options and arguments to dnssec-signzone.

    -i interval

    When a previously-signed zone is passed as input, records may be resigned. The interval option specifies the cycle interval as an offset from the current time (in seconds). If a RRSIG record expires after the cycle interval, it is retained. Otherwise, it is considered to be expiring soon, and it will be replaced.

    The default cycle interval is one quarter of the difference between the signature end and start times. So if neither end-time or start-time are specified, dnssec-signzone generates signatures that are valid for 30 days, with a cycle interval of 7.5 days. Therefore, if any existing RRSIG records are due to expire in less than 7.5 days, they would be replaced.

    -I input-format

    The format of the input zone file. Possible formats are "text" (default) and "raw". This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non-text format containing updates can be signed directly. The use of this option does not make much sense for non-dynamic zones.

    -j jitter

    When signing a zone with a fixed signature lifetime, all RRSIG records issued at the time of signing expires simultaneously. If the zone is incrementally signed, i.e. a previously-signed zone is passed as input to the signer, all expired signatures have to be regenerated at about the same time. The jitter option specifies a jitter window that will be used to randomize the signature expire time, thus spreading incremental signature regeneration over time.

    Signature lifetime jitter also to some extent benefits validators and servers by spreading out cache expiration, i.e. if large numbers of RRSIGs don't expire at the same time from all caches there will be less congestion than if all validators need to refetch at mostly the same time.

    -L serial

    When writing a signed zone to 'raw' format, set the "source serial" value in the header to the specified serial number. (This is expected to be used primarily for testing purposes.)

    -n ncpus

    Specifies the number of threads to use. By default, one thread is started for each detected CPU.

    -N soa-serial-format

    The SOA serial number format of the signed zone. Possible formats are "keep" (default), "increment" and "unixtime".

    "keep"

    Do not modify the SOA serial number.

    "increment"

    Increment the SOA serial number using RFC 1982 arithmetics.

    "unixtime"

    Set the SOA serial number to the number of seconds since epoch.

    -o origin

    The zone origin. If not specified, the name of the zone file is assumed to be the origin.

    -O output-format

    The format of the output file containing the signed zone. Possible formats are "text" (default) "full", which is text output in a format suitable for processing by external scripts, and "raw" or "raw=N", which store the zone in a binary format for rapid loading by named. "raw=N" specifies the format version of the raw zone file: if N is 0, the raw file can be read by any version of named; if N is 1, the file can be read by release 9.9.0 or higher. The default is 1.

    -p

    Use pseudo-random data when signing the zone. This is faster, but less secure, than using real random data. This option may be useful when signing large zones or when the entropy source is limited.

    -P

    Disable post sign verification tests.

    The post sign verification test ensures that for each algorithm in use there is at least one non revoked self signed KSK key, that all revoked KSK keys are self signed, and that all records in the zone are signed by the algorithm. This option skips these tests.

    -Q

    Remove signatures from keys that are no longer active.

    Normally, when a previously-signed zone is passed as input to the signer, and a DNSKEY record has been removed and replaced with a new one, signatures from the old key that are still within their validity period are retained. This allows the zone to continue to validate with cached copies of the old DNSKEY RRset. The -Q forces dnssec-signzone to remove signatures from keys that are no longer active. This enables ZSK rollover using the procedure described in RFC 4641, section 4.2.1.1 ("Pre-Publish Key Rollover").

    -R

    Remove signatures from keys that are no longer published.

    This option is similar to -Q, except it forces dnssec-signzone to signatures from keys that are no longer published. This enables ZSK rollover using the procedure described in RFC 4641, section 4.2.1.2 ("Double Signature Zone Signing Key Rollover").

    -r randomdev

    Specifies the source of randomness. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -S

    Smart signing: Instructs dnssec-signzone to search the key repository for keys that match the zone being signed, and to include them in the zone if appropriate.

    When a key is found, its timing metadata is examined to determine how it should be used, according to the following rules. Each successive rule takes priority over the prior ones:

    If no timing metadata has been set for the key, the key is published in the zone and used to sign the zone.

    If the key's publication date is set and is in the past, the key is published in the zone.

    If the key's activation date is set and in the past, the key is published (regardless of publication date) and used to sign the zone.

    If the key's revocation date is set and in the past, and the key is published, then the key is revoked, and the revoked key is used to sign the zone.

    If either of the key's unpublication or deletion dates are set and in the past, the key is NOT published or used to sign the zone, regardless of any other metadata.

    -T ttl

    Specifies a TTL to be used for new DNSKEY records imported into the zone from the key repository. If not specified, the default is the TTL value from the zone's SOA record. This option is ignored when signing without -S, since DNSKEY records are not imported from the key repository in that case. It is also ignored if there are any pre-existing DNSKEY records at the zone apex, in which case new records' TTL values will be set to match them, or if any of the imported DNSKEY records had a default TTL value. In the event of a a conflict between TTL values in imported keys, the shortest one is used.

    -t

    Print statistics at completion.

    -u

    Update NSEC/NSEC3 chain when re-signing a previously signed zone. With this option, a zone signed with NSEC can be switched to NSEC3, or a zone signed with NSEC3 can be switch to NSEC or to NSEC3 with different parameters. Without this option, dnssec-signzone will retain the existing chain when re-signing.

    -v level

    Sets the debugging level.

    -x

    Only sign the DNSKEY RRset with key-signing keys, and omit signatures from zone-signing keys. (This is similar to the dnssec-dnskey-kskonly yes; zone option in named.)

    -z

    Ignore KSK flag on key when determining what to sign. This causes KSK-flagged keys to sign all records, not just the DNSKEY RRset. (This is similar to the update-check-ksk no; zone option in named.)

    -3 salt

    Generate an NSEC3 chain with the given hex encoded salt. A dash (salt) can be used to indicate that no salt is to be used when generating the NSEC3 chain.

    -H iterations

    When generating an NSEC3 chain, use this many iterations. The default is 10.

    -A

    When generating an NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations.

    Using this option twice (i.e., -AA) turns the OPTOUT flag off for all records. This is useful when using the -u option to modify an NSEC3 chain which previously had OPTOUT set.

    zonefile

    The file containing the zone to be signed.

    key

    Specify which keys should be used to sign the zone. If no keys are specified, then the zone will be examined for DNSKEY records at the zone apex. If these are found and there are matching private keys, in the current directory, then these will be used for signing.

    EXAMPLE

    The following command signs the example.com zone with the DSA key generated by dnssec-keygen (Kexample.com.+003+17247). Because the -S option is not being used, the zone's keys must be in the master file (db.example.com). This invocation looks for dsset files, in the current directory, so that DS records can be imported from them (-g).

    % dnssec-signzone -g -o example.com db.example.com \
    Kexample.com.+003+17247
    db.example.com.signed
    %

    In the above example, dnssec-signzone creates the file db.example.com.signed. This file should be referenced in a zone statement in a named.conf file.

    This example re-signs a previously signed zone with default parameters. The private keys are assumed to be in the current directory.

    % cp db.example.com.signed db.example.com
    % dnssec-signzone -o example.com db.example.com
    db.example.com.signed
    %

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/libdns.xml0000644000470500017500000004264212271526120016365 0ustar lamontlamont BIND 9 DNS Library Support This version of BIND 9 "exports" its internal libraries so that they can be used by third-party applications more easily (we call them "export" libraries in this document). In addition to all major DNS-related APIs BIND 9 is currently using, the export libraries provide the following features: The newly created "DNS client" module. This is a higher level API that provides an interface to name resolution, single DNS transaction with a particular server, and dynamic update. Regarding name resolution, it supports advanced features such as DNSSEC validation and caching. This module supports both synchronous and asynchronous mode. The new "IRS" (Information Retrieval System) library. It provides an interface to parse the traditional resolv.conf file and more advanced, DNS-specific configuration file for the rest of this package (see the description for the dns.conf file below). As part of the IRS library, newly implemented standard address-name mapping functions, getaddrinfo() and getnameinfo(), are provided. They use the DNSSEC-aware validating resolver backend, and could use other advanced features of the BIND 9 libraries such as caching. The getaddrinfo() function resolves both A and AAAA RRs concurrently (when the address family is unspecified). An experimental framework to support other event libraries than BIND 9's internal event task system. Prerequisite GNU make is required to build the export libraries (other part of BIND 9 can still be built with other types of make). In the reminder of this document, "make" means GNU make. Note that in some platforms you may need to invoke a different command name than "make" (e.g. "gmake") to indicate it's GNU make. Compilation $ ./configure --enable-exportlib [other flags] $ make This will create (in addition to usual BIND 9 programs) and a separate set of libraries under the lib/export directory. For example, lib/export/dns/libdns.a is the archive file of the export version of the BIND 9 DNS library. Sample application programs using the libraries will also be built under the lib/export/samples directory (see below). Installation $ cd lib/export $ make install This will install library object files under the directory specified by the --with-export-libdir configure option (default: EPREFIX/lib/bind9), and header files under the directory specified by the --with-export-includedir configure option (default: PREFIX/include/bind9). Root privilege is normally required. "make install" at the top directory will do the same. To see how to build your own application after the installation, see lib/export/samples/Makefile-postinstall.in. Known Defects/Restrictions Currently, win32 is not supported for the export library. (Normal BIND 9 application can be built as before). The "fixed" RRset order is not (currently) supported in the export library. If you want to use "fixed" RRset order for, e.g. named while still building the export library even without the fixed order support, build them separately: $ ./configure --enable-fixed-rrset [other flags, but not --enable-exportlib] $ make $ ./configure --enable-exportlib [other flags, but not --enable-fixed-rrset] $ cd lib/export $ make The client module and the IRS library currently do not support DNSSEC validation using DLV (the underlying modules can handle it, but there is no tunable interface to enable the feature). RFC 5011 is not supported in the validating stub resolver of the export library. In fact, it is not clear whether it should: trust anchors would be a system-wide configuration which would be managed by an administrator, while the stub resolver will be used by ordinary applications run by a normal user. Not all common /etc/resolv.conf options are supported in the IRS library. The only available options in this version are "debug" and "ndots". The dns.conf File The IRS library supports an "advanced" configuration file related to the DNS library for configuration parameters that would be beyond the capability of the resolv.conf file. Specifically, it is intended to provide DNSSEC related configuration parameters. By default the path to this configuration file is /etc/dns.conf. This module is very experimental and the configuration syntax or library interfaces may change in future versions. Currently, only the trusted-keys statement is supported, whose syntax is the same as the same name of statement for named.conf. (See for details.) Sample Applications Some sample application programs using this API are provided for reference. The following is a brief description of these applications. sample: a simple stub resolver utility It sends a query of a given name (of a given optional RR type) to a specified recursive server, and prints the result as a list of RRs. It can also act as a validating stub resolver if a trust anchor is given via a set of command line options. Usage: sample [options] server_address hostname Options and Arguments: -t RRtype specify the RR type of the query. The default is the A RR. [-a algorithm] [-e] -k keyname -K keystring specify a command-line DNS key to validate the answer. For example, to specify the following DNSKEY of example.com: example.com. 3600 IN DNSKEY 257 3 5 xxx specify the options as follows: -e -k example.com -K "xxx" -e means that this key is a zone's "key signing key" (as known as "secure Entry point"). When -a is omitted rsasha1 will be used by default. -s domain:alt_server_address specify a separate recursive server address for the specific "domain". Example: -s example.com:2001:db8::1234 server_address an IP(v4/v6) address of the recursive server to which queries are sent. hostname the domain name for the query sample-async: a simple stub resolver, working asynchronously Similar to "sample", but accepts a list of (query) domain names as a separate file and resolves the names asynchronously. Usage: sample-async [-s server_address] [-t RR_type] input_file Options and Arguments: -s server_address an IPv4 address of the recursive server to which queries are sent. (IPv6 addresses are not supported in this implementation) -t RR_type specify the RR type of the queries. The default is the A RR. input_file a list of domain names to be resolved. each line consists of a single domain name. Example: www.example.com mx.examle.net ns.xxx.example sample-request: a simple DNS transaction client It sends a query to a specified server, and prints the response with minimal processing. It doesn't act as a "stub resolver": it stops the processing once it gets any response from the server, whether it's a referral or an alias (CNAME or DNAME) that would require further queries to get the ultimate answer. In other words, this utility acts as a very simplified dig. Usage: sample-request [-t RRtype] server_address hostname Options and Arguments: -t RRtype specify the RR type of the queries. The default is the A RR. server_address an IP(v4/v6) address of the recursive server to which the query is sent. hostname the domain name for the query sample-gai: getaddrinfo() and getnameinfo() test code This is a test program to check getaddrinfo() and getnameinfo() behavior. It takes a host name as an argument, calls getaddrinfo() with the given host name, and calls getnameinfo() with the resulting IP addresses returned by getaddrinfo(). If the dns.conf file exists and defines a trust anchor, the underlying resolver will act as a validating resolver, and getaddrinfo()/getnameinfo() will fail with an EAI_INSECUREDATA error when DNSSEC validation fails. Usage: sample-gai hostname sample-update: a simple dynamic update client program It accepts a single update command as a command-line argument, sends an update request message to the authoritative server, and shows the response from the server. In other words, this is a simplified nsupdate. Usage: sample-update [options] (add|delete) "update data" Options and Arguments: -a auth_server An IP address of the authoritative server that has authority for the zone containing the update name. This should normally be the primary authoritative server that accepts dynamic updates. It can also be a secondary server that is configured to forward update requests to the primary server. -k keyfile A TSIG key file to secure the update transaction. The keyfile format is the same as that for the nsupdate utility. -p prerequisite A prerequisite for the update (only one prerequisite can be specified). The prerequisite format is the same as that is accepted by the nsupdate utility. -r recursive_server An IP address of a recursive server that this utility will use. A recursive server may be necessary to identify the authoritative server address to which the update request is sent. -z zonename The domain name of the zone that contains (add|delete) Specify the type of update operation. Either "add" or "delete" must be specified. "update data" Specify the data to be updated. A typical example of the data would look like "name TTL RRtype RDATA". In practice, either -a or -r must be specified. Others can be optional; the underlying library routine tries to identify the appropriate server and the zone name for the update. Examples: assuming the primary authoritative server of the dynamic.example.com zone has an IPv6 address 2001:db8::1234, $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1" adds an A RR for foo.dynamic.example.com using the given key. $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A" removes all A RRs for foo.dynamic.example.com using the given key. $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com" removes all RRs for foo.dynamic.example.com using the given key. nsprobe: domain/name server checker in terms of RFC 4074 It checks a set of domains to see the name servers of the domains behave correctly in terms of RFC 4074. This is included in the set of sample programs to show how the export library can be used in a DNS-related application. Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file] Options -d run in the "debug" mode. with this option nsprobe will dump every RRs it receives. -v increase verbosity of other normal log messages. This can be specified multiple times -c cache_address specify an IP address of a recursive (caching) name server. nsprobe uses this server to get the NS RRset of each domain and the A and/or AAAA RRsets for the name servers. The default value is 127.0.0.1. input_file a file name containing a list of domain (zone) names to be probed. when omitted the standard input will be used. Each line of the input file specifies a single domain name such as "example.com". In general this domain name must be the apex name of some DNS zone (unlike normal "host names" such as "www.example.com"). nsprobe first identifies the NS RRsets for the given domain name, and sends A and AAAA queries to these servers for some "widely used" names under the zone; specifically, adding "www" and "ftp" to the zone name. Library References As of this writing, there is no formal "manual" of the libraries, except this document, header files (some of them provide pretty detailed explanations), and sample application programs. bind9-9.9.5.dfsg/doc/arm/pkcs11.xml0000644000470500017500000004753312271526120016220 0ustar lamontlamont]> PKCS #11 (Cryptoki) support PKCS #11 (Public Key Cryptography Standard #11) defines a platform- independent API for the control of hardware security modules (HSMs) and other cryptographic support devices. BIND 9 is known to work with two HSMs: The Sun SCA 6000 cryptographic acceleration board, tested under Solaris x86, and the AEP Keyper network-attached key storage device, tested with Debian Linux, Solaris x86 and Windows Server 2003. Prerequisites See the HSM vendor documentation for information about installing, initializing, testing and troubleshooting the HSM. BIND 9 uses OpenSSL for cryptography, but stock OpenSSL does not yet fully support PKCS #11. However, a PKCS #11 engine for OpenSSL is available from the OpenSolaris project. It has been modified by ISC to work with with BIND 9, and to provide new features such as PIN management and key by reference. The patched OpenSSL depends on a "PKCS #11 provider". This is a shared library object, providing a low-level PKCS #11 interface to the HSM hardware. It is dynamically loaded by OpenSSL at runtime. The PKCS #11 provider comes from the HSM vendor, and is specific to the HSM to be controlled. There are two "flavors" of PKCS #11 support provided by the patched OpenSSL, one of which must be chosen at configuration time. The correct choice depends on the HSM hardware: Use 'crypto-accelerator' with HSMs that have hardware cryptographic acceleration features, such as the SCA 6000 board. This causes OpenSSL to run all supported cryptographic operations in the HSM. Use 'sign-only' with HSMs that are designed to function primarily as secure key storage devices, but lack hardware acceleration. These devices are highly secure, but are not necessarily any faster at cryptography than the system CPU — often, they are slower. It is therefore most efficient to use them only for those cryptographic functions that require access to the secured private key, such as zone signing, and to use the system CPU for all other computationally-intensive operations. The AEP Keyper is an example of such a device. The modified OpenSSL code is included in the BIND 9 release, in the form of a context diff against the latest verions of OpenSSL. OpenSSL 0.9.8, 1.0.0 and 1.0.1 are supported; there are separate diffs for each version. In the examples to follow, we use OpenSSL 0.9.8, but the same methods work with OpenSSL 1.0.0 and 1.0.1. The latest OpenSSL versions at the time of the BIND release are 0.9.8y, 1.0.0k and 1.0.1e. ISC will provide an updated patch as new versions of OpenSSL are released. The version number in the following examples is expected to change. Before building BIND 9 with PKCS #11 support, it will be necessary to build OpenSSL with this patch in place and inform it of the path to the HSM-specific PKCS #11 provider library. Obtain OpenSSL 0.9.8s: $ wget http://www.openssl.org/source/openssl-0.9.8s.tar.gz Extract the tarball: $ tar zxf openssl-0.9.8s.tar.gz Apply the patch from the BIND 9 release: $ patch -p1 -d openssl-0.9.8s \ < bind9/bin/pkcs11/openssl-0.9.8s-patch (Note that the patch file may not be compatible with the "patch" utility on all operating systems. You may need to install GNU patch.) When building OpenSSL, place it in a non-standard location so that it does not interfere with OpenSSL libraries elsewhere on the system. In the following examples, we choose to install into "/opt/pkcs11/usr". We will use this location when we configure BIND 9. Building OpenSSL for the AEP Keyper on Linux The AEP Keyper is a highly secure key storage device, but does not provide hardware cryptographic acceleration. It can carry out cryptographic operations, but it is probably slower than your system's CPU. Therefore, we choose the 'sign-only' flavor when building OpenSSL. The Keyper-specific PKCS #11 provider library is delivered with the Keyper software. In this example, we place it /opt/pkcs11/usr/lib: $ cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so This library is only available for Linux as a 32-bit binary. If we are compiling on a 64-bit Linux system, it is necessary to force a 32-bit build, by specifying -m32 in the build options. Finally, the Keyper library requires threads, so we must specify -pthread. $ cd openssl-0.9.8s $ ./Configure linux-generic32 -m32 -pthread \ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \ --pk11-flavor=sign-only \ --prefix=/opt/pkcs11/usr After configuring, run "make" and "make test". If "make test" fails with "pthread_atfork() not found", you forgot to add the -pthread above. Building OpenSSL for the SCA 6000 on Solaris The SCA-6000 PKCS #11 provider is installed as a system library, libpkcs11. It is a true crypto accelerator, up to 4 times faster than any CPU, so the flavor shall be 'crypto-accelerator'. In this example, we are building on Solaris x86 on an AMD64 system. $ cd openssl-0.9.8s $ ./Configure solaris64-x86_64-cc \ --pk11-libname=/usr/lib/64/libpkcs11.so \ --pk11-flavor=crypto-accelerator \ --prefix=/opt/pkcs11/usr (For a 32-bit build, use "solaris-x86-cc" and /usr/lib/libpkcs11.so.) After configuring, run make and make test. Building OpenSSL for SoftHSM SoftHSM is a software library provided by the OpenDNSSEC project (http://www.opendnssec.org) which provides a PKCS#11 interface to a virtual HSM, implemented in the form of encrypted data on the local filesystem. It uses the Botan library for encryption and SQLite3 for data storage. Though less secure than a true HSM, it can provide more secure key storage than traditional key files, and can allow you to experiment with PKCS#11 when an HSM is not available. The SoftHSM cryptographic store must be installed and initialized before using it with OpenSSL, and the SOFTHSM_CONF environment variable must always point to the SoftHSM configuration file: $ cd softhsm-1.3.0 $ configure --prefix=/opt/pkcs11/usr $ make $ make install $ export SOFTHSM_CONF=/opt/pkcs11/softhsm.conf $ echo "0:/opt/pkcs11/softhsm.db" > $SOFTHSM_CONF $ /opt/pkcs11/usr/bin/softhsm --init-token 0 --slot 0 --label softhsm SoftHSM can perform all cryptographic operations, but since it only uses your system CPU, there is no need to use it for anything but signing. Therefore, we choose the 'sign-only' flavor when building OpenSSL. $ cd openssl-0.9.8s $ ./Configure linux-x86_64 -pthread \ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \ --pk11-flavor=sign-only \ --prefix=/opt/pkcs11/usr After configuring, run "make" and "make test". Once you have built OpenSSL, run "apps/openssl engine pkcs11" to confirm that PKCS #11 support was compiled in correctly. The output should be one of the following lines, depending on the flavor selected: (pkcs11) PKCS #11 engine support (sign only) Or: (pkcs11) PKCS #11 engine support (crypto accelerator) Next, run "apps/openssl engine pkcs11 -t". This will attempt to initialize the PKCS #11 engine. If it is able to do so successfully, it will report [ available ]. If the output is correct, run "make install" which will install the modified OpenSSL suite to /opt/pkcs11/usr. Building BIND 9 with PKCS#11 When building BIND 9, the location of the custom-built OpenSSL library must be specified via configure. Configuring BIND 9 for Linux with the AEP Keyper To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build. The PKCS #11 library for the AEP Keyper is currently only available as a 32-bit binary. If we are building on a 64-bit host, we must force a 32-bit build by adding "-m32" to the CC options on the "configure" command line. $ cd ../bind9 $ ./configure CC="gcc -m32" --enable-threads \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so Configuring BIND 9 for Solaris with the SCA 6000 To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build. $ cd ../bind9 $ ./configure CC="cc -xarch=amd64" --enable-threads \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/usr/lib/64/libpkcs11.so (For a 32-bit build, omit CC="cc -xarch=amd64".) If configure complains about OpenSSL not working, you may have a 32/64-bit architecture mismatch. Or, you may have incorrectly specified the path to OpenSSL (it should be the same as the --prefix argument to the OpenSSL Configure). Configuring BIND 9 for SoftHSM $ cd ../bind9 $ ./configure --enable-threads \ --with-openssl=/opt/pkcs11/usr \ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so After configuring, run "make", "make test" and "make install". (Note: If "make test" fails in the "pkcs11" system test, you may have forgotten to set the SOFTHSM_CONF environment variable.) PKCS #11 Tools BIND 9 includes a minimal set of tools to operate the HSM, including pkcs11-keygen to generate a new key pair within the HSM, pkcs11-list to list objects currently available, and pkcs11-destroy to remove objects. In UNIX/Linux builds, these tools are built only if BIND 9 is configured with the --with-pkcs11 option. (NOTE: If --with-pkcs11 is set to "yes", rather than to the path of the PKCS #11 provider, then the tools will be built but the provider will be left undefined. Use the -m option or the PKCS11_PROVIDER environment variable to specify the path to the provider.) Using the HSM First, we must set up the runtime environment so the OpenSSL and PKCS #11 libraries can be loaded: $ export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH} When operating an AEP Keyper, it is also necessary to specify the location of the "machine" file, which stores information about the Keyper for use by PKCS #11 provider library. If the machine file is in /opt/Keyper/PKCS11Provider/machine, use: $ export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider These environment variables must be set whenever running any tool that uses the HSM, including pkcs11-keygen, pkcs11-list, pkcs11-destroy, dnssec-keyfromlabel, dnssec-signzone, dnssec-keygen(which will use the HSM for random number generation), and named. We can now create and use keys in the HSM. In this case, we will create a 2048 bit key and give it the label "sample-ksk": $ pkcs11-keygen -b 2048 -l sample-ksk To confirm that the key exists: $ pkcs11-list Enter PIN: object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0] object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0] Before using this key to sign a zone, we must create a pair of BIND 9 key files. The "dnssec-keyfromlabel" utility does this. In this case, we will be using the HSM key "sample-ksk" as the key-signing key for "example.net": $ dnssec-keyfromlabel -l sample-ksk -f KSK example.net The resulting K*.key and K*.private files can now be used to sign the zone. Unlike normal K* files, which contain both public and private key data, these files will contain only the public key data, plus an identifier for the private key which remains stored within the HSM. The HSM handles signing with the private key. If you wish to generate a second key in the HSM for use as a zone-signing key, follow the same procedure above, using a different keylabel, a smaller key size, and omitting "-f KSK" from the dnssec-keyfromlabel arguments: $ pkcs11-keygen -b 1024 -l sample-zsk $ dnssec-keyfromlabel -l sample-zsk example.net Alternatively, you may prefer to generate a conventional on-disk key, using dnssec-keygen: $ dnssec-keygen example.net This provides less security than an HSM key, but since HSMs can be slow or cumbersome to use for security reasons, it may be more efficient to reserve HSM keys for use in the less frequent key-signing operation. The zone-signing key can be rolled more frequently, if you wish, to compensate for a reduction in key security. Now you can sign the zone. (Note: If not using the -S option to dnssec-signzone, it will be necessary to add the contents of both K*.key files to the zone master file before signing it.) $ dnssec-signzone -S example.net Enter PIN: Verifying the zone using the following algorithms: NSEC3RSASHA1. Zone signing complete: Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by example.net.signed Specifying the engine on the command line The OpenSSL engine can be specified in named and all of the BIND dnssec-* tools by using the "-E <engine>" command line option. If BIND 9 is built with the --with-pkcs11 option, this option defaults to "pkcs11". Specifying the engine will generally not be necessary unless for some reason you wish to use a different OpenSSL engine. If you wish to disable use of the "pkcs11" engine — for troubleshooting purposes, or because the HSM is unavailable — set the engine to the empty string. For example: $ dnssec-signzone -E '' -S example.net This causes dnssec-signzone to run as if it were compiled without the --with-pkcs11 option. Running named with automatic zone re-signing If you want named to dynamically re-sign zones using HSM keys, and/or to to sign new records inserted via nsupdate, then named must have access to the HSM PIN. This can be accomplished by placing the PIN into the openssl.cnf file (in the above examples, /opt/pkcs11/usr/ssl/openssl.cnf). The location of the openssl.cnf file can be overridden by setting the OPENSSL_CONF environment variable before running named. Sample openssl.cnf: openssl_conf = openssl_def [ openssl_def ] engines = engine_section [ engine_section ] pkcs11 = pkcs11_section [ pkcs11_section ] PIN = <PLACE PIN HERE> This will also allow the dnssec-* tools to access the HSM without PIN entry. (The pkcs11-* tools access the HSM directly, not via OpenSSL, so a PIN will still be required to use them.) Placing the HSM's PIN in a text file in this manner may reduce the security advantage of using an HSM. Be sure this is what you want to do before configuring OpenSSL in this way. bind9-9.9.5.dfsg/doc/arm/managed-keys.xml0000644000470500017500000001213112271526120017445 0ustar lamontlamont Dynamic Trust Anchor Management BIND 9.7.0 introduces support for RFC 5011, dynamic trust anchor management. Using this feature allows named to keep track of changes to critical DNSSEC keys without any need for the operator to make changes to configuration files. Validating Resolver To configure a validating resolver to use RFC 5011 to maintain a trust anchor, configure the trust anchor using a managed-keys statement. Information about this can be found in . Authoritative Server To set up an authoritative zone for RFC 5011 trust anchor maintenance, generate two (or more) key signing keys (KSKs) for the zone. Sign the zone with one of them; this is the "active" KSK. All KSK's which do not sign the zone are "stand-by" keys. Any validating resolver which is configured to use the active KSK as an RFC 5011-managed trust anchor will take note of the stand-by KSKs in the zone's DNSKEY RRset, and store them for future reference. The resolver will recheck the zone periodically, and after 30 days, if the new key is still there, then the key will be accepted by the resolver as a valid trust anchor for the zone. Any time after this 30-day acceptance timer has completed, the active KSK can be revoked, and the zone can be "rolled over" to the newly accepted key. The easiest way to place a stand-by key in a zone is to use the "smart signing" features of dnssec-keygen and dnssec-signzone. If a key with a publication date in the past, but an activation date which is unset or in the future, " dnssec-signzone -S" will include the DNSKEY record in the zone, but will not sign with it: $ dnssec-keygen -K keys -f KSK -P now -A now+2y example.net $ dnssec-signzone -S -K keys example.net To revoke a key, the new command dnssec-revoke has been added. This adds the REVOKED bit to the key flags and re-generates the K*.key and K*.private files. After revoking the active key, the zone must be signed with both the revoked KSK and the new active KSK. (Smart signing takes care of this automatically.) Once a key has been revoked and used to sign the DNSKEY RRset in which it appears, that key will never again be accepted as a valid trust anchor by the resolver. However, validation can proceed using the new active key (which had been accepted by the resolver when it was a stand-by key). See RFC 5011 for more details on key rollover scenarios. When a key has been revoked, its key ID changes, increasing by 128, and wrapping around at 65535. So, for example, the key "Kexample.com.+005+10000" becomes "Kexample.com.+005+10128". If two keys have ID's exactly 128 apart, and one is revoked, then the two key ID's will collide, causing several problems. To prevent this, dnssec-keygen will not generate a new key if another key is present which may collide. This checking will only occur if the new keys are written to the same directory which holds all other keys in use for that zone. Older versions of BIND 9 did not have this precaution. Exercise caution if using key revocation on keys that were generated by previous releases, or if using keys stored in multiple directories or on multiple machines. It is expected that a future release of BIND 9 will address this problem in a different way, by storing revoked keys with their original unrevoked key ID's. bind9-9.9.5.dfsg/doc/arm/man.dnssec-checkds.html0000644000470500017500000001340012271526120020677 0ustar lamontlamont dnssec-checkds

    Name

    dnssec-checkds — A DNSSEC delegation consistency checking tool.

    Synopsis

    dnssec-checkds [-l domain] [-f file] [-d dig path] [-D dsfromkey path] {zone}

    dnssec-dsfromkey [-l domain] [-f file] [-d dig path] [-D dsfromkey path] {zone}

    DESCRIPTION

    dnssec-checkds verifies the correctness of Delegation Signer (DS) or DNSSEC Lookaside Validation (DLV) resource records for keys in a specified zone.

    OPTIONS

    -f file

    If a file is specified, then the zone is read from that file to find the DNSKEY records. If not, then the DNSKEY records for the zone are looked up in the DNS.

    -l domain

    Check for a DLV record in the specified lookaside domain, instead of checking for a DS record in the zone's parent. For example, to check for DLV records for "example.com" in ISC's DLV zone, use: dnssec-checkds -l dlv.isc.org example.com

    -d dig path

    Specifies a path to a dig binary. Used for testing.

    -D dsfromkey path

    Specifies a path to a dnssec-dsfromkey binary. Used for testing.

    SEE ALSO

    dnssec-dsfromkey(8), dnssec-keygen(8), dnssec-signzone(8),

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch09.html0000644000470500017500000020635612271526120017024 0ustar lamontlamont Appendix A. Appendices

    Appendix A. Appendices

    Acknowledgments

    A Brief History of the DNS and BIND

    Although the "official" beginning of the Domain Name System occurred in 1984 with the publication of RFC 920, the core of the new system was described in 1983 in RFCs 882 and 883. From 1984 to 1987, the ARPAnet (the precursor to today's Internet) became a testbed of experimentation for developing the new naming/addressing scheme in a rapidly expanding, operational network environment. New RFCs were written and published in 1987 that modified the original documents to incorporate improvements based on the working model. RFC 1034, "Domain Names-Concepts and Facilities", and RFC 1035, "Domain Names-Implementation and Specification" were published and became the standards upon which all DNS implementations are built.

    The first working domain name server, called "Jeeves", was written in 1983-84 by Paul Mockapetris for operation on DEC Tops-20 machines located at the University of Southern California's Information Sciences Institute (USC-ISI) and SRI International's Network Information Center (SRI-NIC). A DNS server for Unix machines, the Berkeley Internet Name Domain (BIND) package, was written soon after by a group of graduate students at the University of California at Berkeley under a grant from the US Defense Advanced Research Projects Administration (DARPA).

    Versions of BIND through 4.8.3 were maintained by the Computer Systems Research Group (CSRG) at UC Berkeley. Douglas Terry, Mark Painter, David Riggle and Songnian Zhou made up the initial BIND project team. After that, additional work on the software package was done by Ralph Campbell. Kevin Dunlap, a Digital Equipment Corporation employee on loan to the CSRG, worked on BIND for 2 years, from 1985 to 1987. Many other people also contributed to BIND development during that time: Doug Kingston, Craig Partridge, Smoot Carl-Mitchell, Mike Muuss, Jim Bloom and Mike Schwartz. BIND maintenance was subsequently handled by Mike Karels and Øivind Kure.

    BIND versions 4.9 and 4.9.1 were released by Digital Equipment Corporation (now Compaq Computer Corporation). Paul Vixie, then a DEC employee, became BIND's primary caretaker. He was assisted by Phil Almquist, Robert Elz, Alan Barrett, Paul Albitz, Bryan Beecher, Andrew Partan, Andy Cherenson, Tom Limoncelli, Berthold Paffrath, Fuat Baran, Anant Kumar, Art Harkin, Win Treese, Don Lewis, Christophe Wolfhugel, and others.

    In 1994, BIND version 4.9.2 was sponsored by Vixie Enterprises. Paul Vixie became BIND's principal architect/programmer.

    BIND versions from 4.9.3 onward have been developed and maintained by the Internet Systems Consortium and its predecessor, the Internet Software Consortium, with support being provided by ISC's sponsors.

    As co-architects/programmers, Bob Halley and Paul Vixie released the first production-ready version of BIND version 8 in May 1997.

    BIND version 9 was released in September 2000 and is a major rewrite of nearly all aspects of the underlying BIND architecture.

    BIND versions 4 and 8 are officially deprecated. No additional development is done on BIND version 4 or BIND version 8.

    BIND development work is made possible today by the sponsorship of several corporations, and by the tireless work efforts of numerous individuals.

    General DNS Reference Information

    IPv6 addresses (AAAA)

    IPv6 addresses are 128-bit identifiers for interfaces and sets of interfaces which were introduced in the DNS to facilitate scalable Internet routing. There are three types of addresses: Unicast, an identifier for a single interface; Anycast, an identifier for a set of interfaces; and Multicast, an identifier for a set of interfaces. Here we describe the global Unicast address scheme. For more information, see RFC 3587, "Global Unicast Address Format."

    IPv6 unicast addresses consist of a global routing prefix, a subnet identifier, and an interface identifier.

    The global routing prefix is provided by the upstream provider or ISP, and (roughly) corresponds to the IPv4 network section of the address range. The subnet identifier is for local subnetting, much the same as subnetting an IPv4 /16 network into /24 subnets. The interface identifier is the address of an individual interface on a given network; in IPv6, addresses belong to interfaces rather than to machines.

    The subnetting capability of IPv6 is much more flexible than that of IPv4: subnetting can be carried out on bit boundaries, in much the same way as Classless InterDomain Routing (CIDR), and the DNS PTR representation ("nibble" format) makes setting up reverse zones easier.

    The Interface Identifier must be unique on the local link, and is usually generated automatically by the IPv6 implementation, although it is usually possible to override the default setting if necessary. A typical IPv6 address might look like: 2001:db8:201:9:a00:20ff:fe81:2b32

    IPv6 address specifications often contain long strings of zeros, so the architects have included a shorthand for specifying them. The double colon (`::') indicates the longest possible string of zeros that can fit, and can be used only once in an address.

    Bibliography (and Suggested Reading)

    Request for Comments (RFCs)

    Specification documents for the Internet protocol suite, including the DNS, are published as part of the Request for Comments (RFCs) series of technical notes. The standards themselves are defined by the Internet Engineering Task Force (IETF) and the Internet Engineering Steering Group (IESG). RFCs can be obtained online via FTP at:

    ftp://www.isi.edu/in-notes/RFCxxxx.txt

    (where xxxx is the number of the RFC). RFCs are also available via the Web at:

    http://www.ietf.org/rfc/.

    Bibliography

    Standards

    [RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

    [RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

    [RFC1035] P. V. Mockapetris. Domain Names — Implementation and Specification. November 1987.

    Proposed Standards

    [RFC2181] R., R. Bush Elz. Clarifications to the DNS Specification. July 1997.

    [RFC2308] M. Andrews. Negative Caching of DNS Queries. March 1998.

    [RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

    [RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

    [RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

    [RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

    [RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

    [RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

    [RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

    [RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

    [RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

    [RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG). October 2003.

    DNS Security Proposed Standards

    [RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

    [RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

    [RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

    [RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

    [RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS Security Extensions. March 2005.

    Other Important RFCs About DNS Implementation

    [RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely Deployed DNS Software.. October 1993.

    [RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation Errors and Suggested Fixes. October 1993.

    [RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

    [RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS Queries for IPv6 Addresses. May 2005.

    Resource Record Types

    [RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

    [RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

    [RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using the Domain Name System. June 1997.

    [RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the Domain Name System. January 1996.

    [RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the Location of Services.. October 1996.

    [RFC2163] A. Allocchio. Using the Internet DNS to Distribute MIXER Conformant Global Address Mapping. January 1998.

    [RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

    [RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

    [RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

    [RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

    [RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

    [RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

    [RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

    [RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

    [RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

    [RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

    [RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP version 6. October 2003.

    [RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

    DNS and the Internet

    [RFC1101] P. V. Mockapetris. DNS Encoding of Network Names and Other Types. April 1989.

    [RFC1123] Braden. Requirements for Internet Hosts - Application and Support. October 1989.

    [RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

    [RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

    [RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

    [RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

    DNS Operations

    [RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

    [RFC1537] P. Beertema. Common DNS Data File Configuration Errors. October 1993.

    [RFC1912] D. Barr. Common DNS Operational and Configuration Errors. February 1996.

    [RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

    [RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for Network Services.. October 1997.

    Internationalized Domain Names

    [RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols. May 2000.

    [RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

    [RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

    [RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA). March 2003.

    Other DNS-related RFCs

    Note

    Note: the following list of RFCs, although DNS-related, are not concerned with implementing software.

    [RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String Attributes. May 1993.

    [RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

    [RFC1794] T. Brisco. DNS Support for Load Balancing. April 1995.

    [RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

    [RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

    [RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

    [RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

    [RFC3258] T. Hardie. Distributing Authoritative Name Servers via Shared Unicast Addresses. April 2002.

    [RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

    Obsolete and Unimplemented Experimental RFC

    [RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical Location. November 1994.

    [RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

    [RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation and Renumbering. July 2000.

    Obsoleted DNS Security RFCs

    Note

    Most of these have been consolidated into RFC4033, RFC4034 and RFC4035 which collectively describe DNSSECbis.

    [RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

    [RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

    [RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

    [RFC3008] B. Wellington. Domain Name System Security (DNSSEC) Signing Authority. November 2000.

    [RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

    [RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

    [RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

    [RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

    [RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

    [RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag. April 2004.

    [RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

    Internet Drafts

    Internet Drafts (IDs) are rough-draft working documents of the Internet Engineering Task Force. They are, in essence, RFCs in the preliminary stages of development. Implementors are cautioned not to regard IDs as archival, and they should not be quoted or cited in any formal documents unless accompanied by the disclaimer that they are "works in progress." IDs have a lifespan of six months after which they are deleted unless updated by their authors.

    Other Documents About BIND

    Bibliography

    Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

    BIND 9 DNS Library Support

    This version of BIND 9 "exports" its internal libraries so that they can be used by third-party applications more easily (we call them "export" libraries in this document). In addition to all major DNS-related APIs BIND 9 is currently using, the export libraries provide the following features:

    • The newly created "DNS client" module. This is a higher level API that provides an interface to name resolution, single DNS transaction with a particular server, and dynamic update. Regarding name resolution, it supports advanced features such as DNSSEC validation and caching. This module supports both synchronous and asynchronous mode.

    • The new "IRS" (Information Retrieval System) library. It provides an interface to parse the traditional resolv.conf file and more advanced, DNS-specific configuration file for the rest of this package (see the description for the dns.conf file below).

    • As part of the IRS library, newly implemented standard address-name mapping functions, getaddrinfo() and getnameinfo(), are provided. They use the DNSSEC-aware validating resolver backend, and could use other advanced features of the BIND 9 libraries such as caching. The getaddrinfo() function resolves both A and AAAA RRs concurrently (when the address family is unspecified).

    • An experimental framework to support other event libraries than BIND 9's internal event task system.

    Prerequisite

    GNU make is required to build the export libraries (other part of BIND 9 can still be built with other types of make). In the reminder of this document, "make" means GNU make. Note that in some platforms you may need to invoke a different command name than "make" (e.g. "gmake") to indicate it's GNU make.

    Compilation

    $ ./configure --enable-exportlib [other flags]
    $ make
    

    This will create (in addition to usual BIND 9 programs) and a separate set of libraries under the lib/export directory. For example, lib/export/dns/libdns.a is the archive file of the export version of the BIND 9 DNS library. Sample application programs using the libraries will also be built under the lib/export/samples directory (see below).

    Installation

    $ cd lib/export
    $ make install
    

    This will install library object files under the directory specified by the --with-export-libdir configure option (default: EPREFIX/lib/bind9), and header files under the directory specified by the --with-export-includedir configure option (default: PREFIX/include/bind9). Root privilege is normally required. "make install" at the top directory will do the same.

    To see how to build your own application after the installation, see lib/export/samples/Makefile-postinstall.in.

    Known Defects/Restrictions

    • Currently, win32 is not supported for the export library. (Normal BIND 9 application can be built as before).

    • The "fixed" RRset order is not (currently) supported in the export library. If you want to use "fixed" RRset order for, e.g. named while still building the export library even without the fixed order support, build them separately:

      $ ./configure --enable-fixed-rrset [other flags, but not --enable-exportlib]
      $ make
      $ ./configure --enable-exportlib [other flags, but not --enable-fixed-rrset]
      $ cd lib/export
      $ make
      

    • The client module and the IRS library currently do not support DNSSEC validation using DLV (the underlying modules can handle it, but there is no tunable interface to enable the feature).

    • RFC 5011 is not supported in the validating stub resolver of the export library. In fact, it is not clear whether it should: trust anchors would be a system-wide configuration which would be managed by an administrator, while the stub resolver will be used by ordinary applications run by a normal user.

    • Not all common /etc/resolv.conf options are supported in the IRS library. The only available options in this version are "debug" and "ndots".

    The dns.conf File

    The IRS library supports an "advanced" configuration file related to the DNS library for configuration parameters that would be beyond the capability of the resolv.conf file. Specifically, it is intended to provide DNSSEC related configuration parameters. By default the path to this configuration file is /etc/dns.conf. This module is very experimental and the configuration syntax or library interfaces may change in future versions. Currently, only the trusted-keys statement is supported, whose syntax is the same as the same name of statement for named.conf. (See the section called “trusted-keys Statement Grammar” for details.)

    Sample Applications

    Some sample application programs using this API are provided for reference. The following is a brief description of these applications.

    sample: a simple stub resolver utility

    It sends a query of a given name (of a given optional RR type) to a specified recursive server, and prints the result as a list of RRs. It can also act as a validating stub resolver if a trust anchor is given via a set of command line options.

    Usage: sample [options] server_address hostname

    Options and Arguments:

    -t RRtype

    specify the RR type of the query. The default is the A RR.

    [-a algorithm] [-e] -k keyname -K keystring

    specify a command-line DNS key to validate the answer. For example, to specify the following DNSKEY of example.com:


                    example.com. 3600 IN DNSKEY 257 3 5 xxx

    specify the options as follows:

    
              -e -k example.com -K "xxx"
    
    

    -e means that this key is a zone's "key signing key" (as known as "secure Entry point"). When -a is omitted rsasha1 will be used by default.

    -s domain:alt_server_address

    specify a separate recursive server address for the specific "domain". Example: -s example.com:2001:db8::1234

    server_address

    an IP(v4/v6) address of the recursive server to which queries are sent.

    hostname

    the domain name for the query

    sample-async: a simple stub resolver, working asynchronously

    Similar to "sample", but accepts a list of (query) domain names as a separate file and resolves the names asynchronously.

    Usage: sample-async [-s server_address] [-t RR_type] input_file

    Options and Arguments:

    -s server_address
    an IPv4 address of the recursive server to which queries are sent. (IPv6 addresses are not supported in this implementation)
    -t RR_type
    specify the RR type of the queries. The default is the A RR.
    input_file
    a list of domain names to be resolved. each line consists of a single domain name. Example:


      www.example.com
      mx.examle.net
      ns.xxx.example

    sample-request: a simple DNS transaction client

    It sends a query to a specified server, and prints the response with minimal processing. It doesn't act as a "stub resolver": it stops the processing once it gets any response from the server, whether it's a referral or an alias (CNAME or DNAME) that would require further queries to get the ultimate answer. In other words, this utility acts as a very simplified dig.

    Usage: sample-request [-t RRtype] server_address hostname

    Options and Arguments:

    -t RRtype

    specify the RR type of the queries. The default is the A RR.

    server_address

    an IP(v4/v6) address of the recursive server to which the query is sent.

    hostname

    the domain name for the query

    sample-gai: getaddrinfo() and getnameinfo() test code

    This is a test program to check getaddrinfo() and getnameinfo() behavior. It takes a host name as an argument, calls getaddrinfo() with the given host name, and calls getnameinfo() with the resulting IP addresses returned by getaddrinfo(). If the dns.conf file exists and defines a trust anchor, the underlying resolver will act as a validating resolver, and getaddrinfo()/getnameinfo() will fail with an EAI_INSECUREDATA error when DNSSEC validation fails.

    Usage: sample-gai hostname

    sample-update: a simple dynamic update client program

    It accepts a single update command as a command-line argument, sends an update request message to the authoritative server, and shows the response from the server. In other words, this is a simplified nsupdate.

    Usage: sample-update [options] (add|delete) "update data"

    Options and Arguments:

    -a auth_server

    An IP address of the authoritative server that has authority for the zone containing the update name. This should normally be the primary authoritative server that accepts dynamic updates. It can also be a secondary server that is configured to forward update requests to the primary server.

    -k keyfile

    A TSIG key file to secure the update transaction. The keyfile format is the same as that for the nsupdate utility.

    -p prerequisite

    A prerequisite for the update (only one prerequisite can be specified). The prerequisite format is the same as that is accepted by the nsupdate utility.

    -r recursive_server

    An IP address of a recursive server that this utility will use. A recursive server may be necessary to identify the authoritative server address to which the update request is sent.

    -z zonename

    The domain name of the zone that contains

    (add|delete)

    Specify the type of update operation. Either "add" or "delete" must be specified.

    "update data"

    Specify the data to be updated. A typical example of the data would look like "name TTL RRtype RDATA".

    Note

    In practice, either -a or -r must be specified. Others can be optional; the underlying library routine tries to identify the appropriate server and the zone name for the update.

    Examples: assuming the primary authoritative server of the dynamic.example.com zone has an IPv6 address 2001:db8::1234,

    $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1"

    adds an A RR for foo.dynamic.example.com using the given key.

    $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A"

    removes all A RRs for foo.dynamic.example.com using the given key.

       
    $ sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com"

    removes all RRs for foo.dynamic.example.com using the given key.

    nsprobe: domain/name server checker in terms of RFC 4074

    It checks a set of domains to see the name servers of the domains behave correctly in terms of RFC 4074. This is included in the set of sample programs to show how the export library can be used in a DNS-related application.

    Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file]

    Options

    -d

    run in the "debug" mode. with this option nsprobe will dump every RRs it receives.

    -v

    increase verbosity of other normal log messages. This can be specified multiple times

    -c cache_address

    specify an IP address of a recursive (caching) name server. nsprobe uses this server to get the NS RRset of each domain and the A and/or AAAA RRsets for the name servers. The default value is 127.0.0.1.

    input_file

    a file name containing a list of domain (zone) names to be probed. when omitted the standard input will be used. Each line of the input file specifies a single domain name such as "example.com". In general this domain name must be the apex name of some DNS zone (unlike normal "host names" such as "www.example.com"). nsprobe first identifies the NS RRsets for the given domain name, and sends A and AAAA queries to these servers for some "widely used" names under the zone; specifically, adding "www" and "ftp" to the zone name.

    Library References

    As of this writing, there is no formal "manual" of the libraries, except this document, header files (some of them provide pretty detailed explanations), and sample application programs.

    bind9-9.9.5.dfsg/doc/arm/dnssec.xml0000644000470500017500000003220412271526120016362 0ustar lamontlamont DNSSEC, Dynamic Zones, and Automatic Signing As of BIND 9.7.0 it is possible to change a dynamic zone from insecure to signed and back again. A secure zone can use either NSEC or NSEC3 chains. Converting from insecure to secure Changing a zone from insecure to secure can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option. For either method, you need to configure named so that it can see the K* files which contain the public and private parts of the keys that will be used to sign the zone. These files will have been generated by dnssec-keygen. You can do this by placing them in the key-directory, as specified in named.conf: zone example.net { type master; update-policy local; file "dynamic/example.net/example.net"; key-directory "dynamic/example.net"; }; If one KSK and one ZSK DNSKEY key have been generated, this configuration will cause all records in the zone to be signed with the ZSK, and the DNSKEY RRset to be signed with the KSK as well. An NSEC chain will be generated as part of the initial signing process. Dynamic DNS update method To insert the keys via dynamic update: % nsupdate > ttl 3600 > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8= > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk= > send While the update request will complete almost immediately, the zone will not be completely signed until named has had time to walk the zone and generate the NSEC and RRSIG records. The NSEC record at the apex will be added last, to signal that there is a complete NSEC chain. If you wish to sign using NSEC3 instead of NSEC, you should add an NSEC3PARAM record to the initial update request. If you wish the NSEC3 chain to have the OPTOUT bit set, set it in the flags field of the NSEC3PARAM record. % nsupdate > ttl 3600 > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8= > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk= > update add example.net NSEC3PARAM 1 1 100 1234567890 > send Again, this update request will complete almost immediately; however, the record won't show up until named has had a chance to build/remove the relevant chain. A private type record will be created to record the state of the operation (see below for more details), and will be removed once the operation completes. While the initial signing and NSEC/NSEC3 chain generation is happening, other updates are possible as well. Fully automatic zone signing To enable automatic signing, add the auto-dnssec option to the zone statement in named.conf. auto-dnssec has two possible arguments: allow or maintain. With auto-dnssec allow, named can search the key directory for keys matching the zone, insert them into the zone, and use them to sign the zone. It will do so only when it receives an rndc sign <zonename>. auto-dnssec maintain includes the above functionality, but will also automatically adjust the zone's DNSKEY records on schedule according to the keys' timing metadata. (See and for more information.) named will periodically search the key directory for keys matching the zone, and if the keys' metadata indicates that any change should be made the zone, such as adding, removing, or revoking a key, then that action will be carried out. By default, the key directory is checked for changes every 60 minutes; this period can be adjusted with the , up to a maximum of 24 hours. The rndc loadkeys forces named to check for key updates immediately. If keys are present in the key directory the first time the zone is loaded, the zone will be signed immediately, without waiting for an rndc sign or rndc loadkeys command. (Those commands can still be used when there are unscheduled key changes, however.) If you wish the zone to be signed using NSEC3 instead of NSEC, submit an NSEC3PARAM record via dynamic update prior to the scheduled publication and activation of the keys. If you wish the NSEC3 chain to have the OPTOUT bit set, set it in the flags field of the NSEC3PARAM record. The NSEC3PARAM record will not appear in the zone immediately, but it will be stored for later reference. When the zone is signed and the NSEC3 chain is completed, the NSEC3PARAM record will appear in the zone. Using the auto-dnssec option requires the zone to be configured to allow dynamic updates, by adding an allow-update or update-policy statement to the zone configuration. If this has not been done, the configuration will fail. Private-type records The state of the signing process is signaled by private-type records (with a default type value of 65534). When signing is complete, these records will have a nonzero value for the final octet (for those records which have a nonzero initial octet). The private type record format: If the first octet is non-zero then the record indicates that the zone needs to be signed with the key matching the record, or that all signatures that match the record should be removed. algorithm (octet 1) key id in network order (octet 2 and 3) removal flag (octet 4) complete flag (octet 5) Only records flagged as "complete" can be removed via dynamic update. Attempts to remove other private type records will be silently ignored. If the first octet is zero (this is a reserved algorithm number that should never appear in a DNSKEY record) then the record indicates changes to the NSEC3 chains are in progress. The rest of the record contains an NSEC3PARAM record. The flag field tells what operation to perform based on the flag bits. 0x01 OPTOUT 0x80 CREATE 0x40 REMOVE 0x20 NONSEC DNSKEY rollovers As with insecure-to-secure conversions, rolling DNSSEC keys can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option. Dynamic DNS update method To perform key rollovers via dynamic update, you need to add the K* files for the new keys so that named can find them. You can then add the new DNSKEY RRs via dynamic update. named will then cause the zone to be signed with the new keys. When the signing is complete the private type records will be updated so that the last octet is non zero. If this is for a KSK you need to inform the parent and any trust anchor repositories of the new KSK. You should then wait for the maximum TTL in the zone before removing the old DNSKEY. If it is a KSK that is being updated, you also need to wait for the DS RRset in the parent to be updated and its TTL to expire. This ensures that all clients will be able to verify at least one signature when you remove the old DNSKEY. The old DNSKEY can be removed via UPDATE. Take care to specify the correct key. named will clean out any signatures generated by the old key after the update completes. Automatic key rollovers When a new key reaches its activation date (as set by dnssec-keygen or dnssec-settime), if the auto-dnssec zone option is set to maintain, named will automatically carry out the key rollover. If the key's algorithm has not previously been used to sign the zone, then the zone will be fully signed as quickly as possible. However, if the new key is replacing an existing key of the same algorithm, then the zone will be re-signed incrementally, with signatures from the old key being replaced with signatures from the new key as their signature validity periods expire. By default, this rollover completes in 30 days, after which it will be safe to remove the old key from the DNSKEY RRset. NSEC3PARAM rollovers via UPDATE Add the new NSEC3PARAM record via dynamic update. When the new NSEC3 chain has been generated, the NSEC3PARAM flag field will be zero. At this point you can remove the old NSEC3PARAM record. The old chain will be removed after the update request completes. Converting from NSEC to NSEC3 To do this, you just need to add an NSEC3PARAM record. When the conversion is complete, the NSEC chain will have been removed and the NSEC3PARAM record will have a zero flag field. The NSEC3 chain will be generated before the NSEC chain is destroyed. Converting from NSEC3 to NSEC To do this, use nsupdate to remove all NSEC3PARAM records with a zero flag field. The NSEC chain will be generated before the NSEC3 chain is removed. Converting from secure to insecure To convert a signed zone to unsigned using dynamic DNS, delete all the DNSKEY records from the zone apex using nsupdate. All signatures, NSEC or NSEC3 chains, and associated NSEC3PARAM records will be removed automatically. This will take place after the update request completes. This requires the dnssec-secure-to-insecure option to be set to yes in named.conf. In addition, if the auto-dnssec maintain zone statement is used, it should be removed or changed to allow instead (or it will re-sign). Periodic re-signing In any secure zone which supports dynamic updates, named will periodically re-sign RRsets which have not been re-signed as a result of some update action. The signature lifetimes will be adjusted so as to spread the re-sign load over time rather than all at once. NSEC3 and OPTOUT named only supports creating new NSEC3 chains where all the NSEC3 records in the zone have the same OPTOUT state. named supports UPDATES to zones where the NSEC3 records in the chain have mixed OPTOUT state. named does not support changing the OPTOUT state of an individual NSEC3 record, the entire chain needs to be changed if the OPTOUT state of an individual NSEC3 needs to be changed. bind9-9.9.5.dfsg/doc/arm/man.nsec3hash.html0000644000470500017500000001041212271526120017675 0ustar lamontlamont nsec3hash

    Name

    nsec3hash — generate NSEC3 hash

    Synopsis

    nsec3hash {salt} {algorithm} {iterations} {domain}

    DESCRIPTION

    nsec3hash generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone.

    ARGUMENTS

    salt

    The salt provided to the hash algorithm.

    algorithm

    A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument.

    iterations

    The number of additional times the hash should be performed.

    domain

    The domain name to be hashed.

    SEE ALSO

    BIND 9 Administrator Reference Manual, RFC 5155.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.dnssec-coverage.html0000644000470500017500000002347712271526120021105 0ustar lamontlamont dnssec-coverage

    Name

    dnssec-coverage — checks future DNSKEY coverage for a zone

    Synopsis

    dnssec-coverage [-K directory] [-f file] [-d DNSKEY TTL] [-m max TTL] [-r interval] [-c compilezone path] [zone]

    DESCRIPTION

    dnssec-coverage verifies that the DNSSEC keys for a given zone or a set of zones have timing metadata set properly to ensure no future lapses in DNSSEC coverage.

    If zone is specified, then keys found in the key repository matching that zone are scanned, and an ordered list is generated of the events scheduled for that key (i.e., publication, activation, inactivation, deletion). The list of events is walked in order of occurrence. Warnings are generated if any event is scheduled which could cause the zone to enter a state in which validation failures might occur: for example, if the number of published or active keys for a given algorithm drops to zero, or if a key is deleted from the zone too soon after a new key is rolled, and cached data signed by the prior key has not had time to expire from resolver caches.

    If zone is not specified, then all keys in the key repository will be scanned, and all zones for which there are keys will be analyzed. (Note: This method of reporting is only accurate if all the zones that have keys in a given repository share the same TTL parameters.)

    OPTIONS

    -f file

    If a file is specified, then the zone is read from that file; the largest TTL and the DNSKEY TTL are determined directly from the zone data, and the -m and -d options do not need to be specified on the command line.

    -K directory

    Sets the directory in which keys can be found. Defaults to the current working directory.

    -m maximum TTL

    Sets the value to be used as the maximum TTL for the zone or zones being analyzed when determining whether there is a possibility of validation failure. When a zone-signing key is deactivated, there must be enough time for the record in the zone with the longest TTL to have expired from resolver caches before that key can be purged from the DNSKEY RRset. If that condition does not apply, a warning will be generated.

    The length of the TTL can be set in seconds, or in larger units of time by adding a suffix: 'mi' for minutes, 'h' for hours, 'd' for days, 'w' for weeks, 'mo' for months, 'y' for years.

    This option is mandatory unless the -f has been used to specify a zone file. (If -f has been specified, this option may still be used; it will overrde the value found in the file.)

    -d DNSKEY TTL

    Sets the value to be used as the DNSKEY TTL for the zone or zones being analyzed when determining whether there is a possibility of validation failure. When a key is rolled (that is, replaced with a new key), there must be enough time for the old DNSKEY RRset to have expired from resolver caches before the new key is activated and begins generating signatures. If that condition does not apply, a warning will be generated.

    The length of the TTL can be set in seconds, or in larger units of time by adding a suffix: 'mi' for minutes, 'h' for hours, 'd' for days, 'w' for weeks, 'mo' for months, 'y' for years.

    This option is mandatory unless the -f has been used to specify a zone file, or a default key TTL was set with the -L to dnssec-keygen. (If either of those is true, this option may still be used; it will overrde the value found in the zone or key file.)

    -r resign interval

    Sets the value to be used as the resign interval for the zone or zones being analyzed when determining whether there is a possibility of validation failure. This value defaults to 22.5 days, which is also the default in named. However, if it has been changed by the sig-validity-interval option in named.conf, then it should also be changed here.

    The length of the interval can be set in seconds, or in larger units of time by adding a suffix: 'mi' for minutes, 'h' for hours, 'd' for days, 'w' for weeks, 'mo' for months, 'y' for years.

    -c compilezone path

    Specifies a path to a named-compilezone binary. Used for testing.

    SEE ALSO

    dnssec-checkds(8), dnssec-dsfromkey(8), dnssec-keygen(8), dnssec-signzone(8)

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.rndc-confgen.html0000644000470500017500000002606312271526120020372 0ustar lamontlamont rndc-confgen

    Name

    rndc-confgen — rndc key generation tool

    Synopsis

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

    DESCRIPTION

    rndc-confgen generates configuration files for rndc. It can be used as a convenient alternative to writing the rndc.conf file and the corresponding controls and key statements in named.conf by hand. Alternatively, it can be run with the -a option to set up a rndc.key file and avoid the need for a rndc.conf file and a controls statement altogether.

    OPTIONS

    -a

    Do automatic rndc configuration. This creates a file rndc.key in /etc (or whatever sysconfdir was specified as when BIND was built) that is read by both rndc and named on startup. The rndc.key file defines a default command channel and authentication key allowing rndc to communicate with named on the local host with no further configuration.

    Running rndc-confgen -a allows BIND 9 and rndc to be used as drop-in replacements for BIND 8 and ndc, with no changes to the existing BIND 8 named.conf file.

    If a more elaborate configuration than that generated by rndc-confgen -a is required, for example if rndc is to be used remotely, you should run rndc-confgen without the -a option and set up a rndc.conf and named.conf as directed.

    -b keysize

    Specifies the size of the authentication key in bits. Must be between 1 and 512 bits; the default is 128.

    -c keyfile

    Used with the -a option to specify an alternate location for rndc.key.

    -h

    Prints a short summary of the options and arguments to rndc-confgen.

    -k keyname

    Specifies the key name of the rndc authentication key. This must be a valid domain name. The default is rndc-key.

    -p port

    Specifies the command channel port where named listens for connections from rndc. The default is 953.

    -r randomfile

    Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -s address

    Specifies the IP address where named listens for command channel connections from rndc. The default is the loopback address 127.0.0.1.

    -t chrootdir

    Used with the -a option to specify a directory where named will run chrooted. An additional copy of the rndc.key will be written relative to this directory so that it will be found by the chrooted named.

    -u user

    Used with the -a option to set the owner of the rndc.key file generated. If -t is also specified only the file in the chroot area has its owner changed.

    EXAMPLES

    To allow rndc to be used with no manual configuration, run

    rndc-confgen -a

    To print a sample rndc.conf file and corresponding controls and key statements to be manually inserted into named.conf, run

    rndc-confgen

    SEE ALSO

    rndc(8), rndc.conf(5), named(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch05.html0000644000470500017500000001440212271526120017005 0ustar lamontlamont Chapter 5. The BIND 9 Lightweight Resolver

    Chapter 5. The BIND 9 Lightweight Resolver

    The Lightweight Resolver Library

    Traditionally applications have been linked with a stub resolver library that sends recursive DNS queries to a local caching name server.

    IPv6 once introduced new complexity into the resolution process, such as following A6 chains and DNAME records, and simultaneous lookup of IPv4 and IPv6 addresses. Though most of the complexity was then removed, these are hard or impossible to implement in a traditional stub resolver.

    BIND 9 therefore can also provide resolution services to local clients using a combination of a lightweight resolver library and a resolver daemon process running on the local host. These communicate using a simple UDP-based protocol, the "lightweight resolver protocol" that is distinct from and simpler than the full DNS protocol.

    Running a Resolver Daemon

    To use the lightweight resolver interface, the system must run the resolver daemon lwresd or a local name server configured with a lwres statement.

    By default, applications using the lightweight resolver library will make UDP requests to the IPv4 loopback address (127.0.0.1) on port 921. The address can be overridden by lwserver lines in /etc/resolv.conf.

    The daemon currently only looks in the DNS, but in the future it may use other sources such as /etc/hosts, NIS, etc.

    The lwresd daemon is essentially a caching-only name server that responds to requests using the lightweight resolver protocol rather than the DNS protocol. Because it needs to run on each host, it is designed to require no or minimal configuration. Unless configured otherwise, it uses the name servers listed on nameserver lines in /etc/resolv.conf as forwarders, but is also capable of doing the resolution autonomously if none are specified.

    The lwresd daemon may also be configured with a named.conf style configuration file, in /etc/lwresd.conf by default. A name server may also be configured to act as a lightweight resolver daemon using the lwres statement in named.conf.

    bind9-9.9.5.dfsg/doc/arm/man.rndc.conf.html0000644000470500017500000002456512271526120017706 0ustar lamontlamont rndc.conf

    Name

    rndc.conf — rndc configuration file

    Synopsis

    rndc.conf

    DESCRIPTION

    rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to named.conf. Statements are enclosed in braces and terminated with a semi-colon. Clauses in the statements are also semi-colon terminated. The usual comment styles are supported:

    C style: /* */

    C++ style: // to end of line

    Unix style: # to end of line

    rndc.conf is much simpler than named.conf. The file uses three statements: an options statement, a server statement and a key statement.

    The options statement contains five clauses. The default-server clause is followed by the name or address of a name server. This host will be used when no name server is given as an argument to rndc. The default-key clause is followed by the name of a key which is identified by a key statement. If no keyid is provided on the rndc command line, and no key clause is found in a matching server statement, this default key will be used to authenticate the server's commands and responses. The default-port clause is followed by the port to connect to on the remote name server. If no port option is provided on the rndc command line, and no port clause is found in a matching server statement, this default port will be used to connect. The default-source-address and default-source-address-v6 clauses which can be used to set the IPv4 and IPv6 source addresses respectively.

    After the server keyword, the server statement includes a string which is the hostname or address for a name server. The statement has three possible clauses: key, port and addresses. The key name must match the name of a key statement in the file. The port number specifies the port to connect to. If an addresses clause is supplied these addresses will be used instead of the server name. Each address can take an optional port. If an source-address or source-address-v6 of supplied then these will be used to specify the IPv4 and IPv6 source addresses respectively.

    The key statement begins with an identifying string, the name of the key. The statement has two clauses. algorithm identifies the encryption algorithm for rndc to use; currently only HMAC-MD5 is supported. This is followed by a secret clause which contains the base-64 encoding of the algorithm's encryption key. The base-64 string is enclosed in double quotes.

    There are two common ways to generate the base-64 string for the secret. The BIND 9 program rndc-confgen can be used to generate a random key, or the mmencode program, also known as mimencode, can be used to generate a base-64 string from known input. mmencode does not ship with BIND 9 but is available on many systems. See the EXAMPLE section for sample command lines for each.

    EXAMPLE

          options {
            default-server  localhost;
            default-key     samplekey;
          };
    

          server localhost {
            key             samplekey;
          };
    

          server testserver {
            key		testkey;
            addresses	{ localhost port 5353; };
          };
    

          key samplekey {
            algorithm       hmac-md5;
            secret          "6FMfj43Osz4lyb24OIe2iGEz9lf1llJO+lz";
          };
    

          key testkey {
            algorithm	hmac-md5;
            secret		"R3HI8P6BKw9ZwXwN3VZKuQ==";
          };
        

    In the above example, rndc will by default use the server at localhost (127.0.0.1) and the key called samplekey. Commands to the localhost server will use the samplekey key, which must also be defined in the server's configuration file with the same name and secret. The key statement indicates that samplekey uses the HMAC-MD5 algorithm and its secret clause contains the base-64 encoding of the HMAC-MD5 secret enclosed in double quotes.

    If rndc -s testserver is used then rndc will connect to server on localhost port 5353 using the key testkey.

    To generate a random secret with rndc-confgen:

    rndc-confgen

    A complete rndc.conf file, including the randomly generated key, will be written to the standard output. Commented-out key and controls statements for named.conf are also printed.

    To generate a base-64 secret with mmencode:

    echo "known plaintext for a secret" | mmencode

    NAME SERVER CONFIGURATION

    The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf file, using the controls statement in named.conf. See the sections on the controls statement in the BIND 9 Administrator Reference Manual for details.

    SEE ALSO

    rndc(8), rndc-confgen(8), mmencode(1), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch10.html0000644000470500017500000001622512271526120017006 0ustar lamontlamont Manual pages

    Manual pages


    Table of Contents

    dig — DNS lookup utility
    host — DNS lookup utility
    dnssec-checkds — A DNSSEC delegation consistency checking tool.
    dnssec-coverage — checks future DNSKEY coverage for a zone
    dnssec-dsfromkey — DNSSEC DS RR generation tool
    dnssec-keyfromlabel — DNSSEC key generation tool
    dnssec-keygen — DNSSEC key generation tool
    dnssec-revoke — Set the REVOKED bit on a DNSSEC key
    dnssec-settime — Set the key timing metadata for a DNSSEC key
    dnssec-signzone — DNSSEC zone signing tool
    dnssec-verify — DNSSEC zone verification tool
    named-checkconf — named configuration file syntax checking tool
    named-checkzone — zone file validity checking or converting tool
    named — Internet domain name server
    named-journalprint — print zone journal in human-readable form
    nsupdate — Dynamic DNS update utility
    rndc — name server control utility
    rndc.conf — rndc configuration file
    rndc-confgen — rndc key generation tool
    ddns-confgen — ddns key generation tool
    arpaname — translate IP addresses to the corresponding ARPA names
    genrandom — generate a file containing random data
    isc-hmac-fixup — fixes HMAC keys generated by older versions of BIND
    nsec3hash — generate NSEC3 hash
    bind9-9.9.5.dfsg/doc/arm/man.dnssec-revoke.html0000644000470500017500000001252612271526120020576 0ustar lamontlamont dnssec-revoke

    Name

    dnssec-revoke — Set the REVOKED bit on a DNSSEC key

    Synopsis

    dnssec-revoke [-hr] [-v level] [-K directory] [-E engine] [-f] [-R] {keyfile}

    DESCRIPTION

    dnssec-revoke reads a DNSSEC key file, sets the REVOKED bit on the key as defined in RFC 5011, and creates a new pair of key files containing the now-revoked key.

    OPTIONS

    -h

    Emit usage message and exit.

    -K directory

    Sets the directory in which the key files are to reside.

    -r

    After writing the new keyset files remove the original keyset files.

    -v level

    Sets the debugging level.

    -E engine

    Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.

    -f

    Force overwrite: Causes dnssec-revoke to write the new key pair even if a file already exists matching the algorithm and key ID of the revoked key.

    -R

    Print the key tag of the key with the REVOKE bit set but do not revoke the key.

    SEE ALSO

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

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/man.rndc.html0000644000470500017500000007275512271526120016766 0ustar lamontlamont rndc

    Name

    rndc — name server control utility

    Synopsis

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

    DESCRIPTION

    rndc controls the operation of a name server. It supersedes the ndc utility that was provided in old BIND releases. If rndc is invoked with no command line options or arguments, it prints a short summary of the supported commands and the available options and their arguments.

    rndc communicates with the name server over a TCP connection, sending commands authenticated with digital signatures. In the current versions of rndc and named, the only supported authentication algorithm is HMAC-MD5, which uses a shared secret on each end of the connection. This provides TSIG-style authentication for the command request and the name server's response. All commands sent over the channel must be signed by a key_id known to the server.

    rndc reads a configuration file to determine how to contact the name server and decide what algorithm and key it should use.

    OPTIONS

    -b source-address

    Use source-address as the source address for the connection to the server. Multiple instances are permitted to allow setting of both the IPv4 and IPv6 source addresses.

    -c config-file

    Use config-file as the configuration file instead of the default, /etc/rndc.conf.

    -k key-file

    Use key-file as the key file instead of the default, /etc/rndc.key. The key in /etc/rndc.key will be used to authenticate commands sent to the server if the config-file does not exist.

    -s server

    server is the name or address of the server which matches a server statement in the configuration file for rndc. If no server is supplied on the command line, the host named by the default-server clause in the options statement of the rndc configuration file will be used.

    -p port

    Send commands to TCP port port instead of BIND 9's default control channel port, 953.

    -V

    Enable verbose logging.

    -y key_id

    Use the key key_id from the configuration file. key_id must be known by named with the same algorithm and secret string in order for control message validation to succeed. If no key_id is specified, rndc will first look for a key clause in the server statement of the server being used, or if no server statement is present for that host, then the default-key clause of the options statement. Note that the configuration file contains shared secrets which are used to send authenticated control commands to name servers. It should therefore not have general read or write access.

    COMMANDS

    A list of commands supported by rndc can be seen by running rndc without arguments.

    Currently supported commands are:

    reload

    Reload configuration file and zones.

    reload zone [class [view]]

    Reload the given zone.

    refresh zone [class [view]]

    Schedule zone maintenance for the given zone.

    retransfer zone [class [view]]

    Retransfer the given slave zone from the master server.

    If the zone is configured to use inline-signing, the signed version of the zone is discarded; after the retransfer of the unsigned version is complete, the signed version will be regenerated with all new signatures.

    sign zone [class [view]]

    Fetch all DNSSEC keys for the given zone from the key directory (see the key-directory option in the BIND 9 Administrator Reference Manual). If they are within their publication period, merge them into the zone's DNSKEY RRset. If the DNSKEY RRset is changed, then the zone is automatically re-signed with the new key set.

    This command requires that the auto-dnssec zone option be set to allow or maintain, and also requires the zone to be configured to allow dynamic DNS. (See "Dynamic Update Policies" in the Administrator Reference Manual for more details.)

    loadkeys zone [class [view]]

    Fetch all DNSSEC keys for the given zone from the key directory. If they are within their publication period, merge them into the zone's DNSKEY RRset. Unlike rndc sign, however, the zone is not immediately re-signed by the new keys, but is allowed to incrementally re-sign over time.

    This command requires that the auto-dnssec zone option be set to maintain, and also requires the zone to be configured to allow dynamic DNS. (See "Dynamic Update Policies" in the Administrator Reference Manual for more details.)

    freeze [zone [class [view]]]

    Suspend updates to a dynamic zone. If no zone is specified, then all zones are suspended. This allows manual edits to be made to a zone normally updated by dynamic update. It also causes changes in the journal file to be synced into the master file. All dynamic update attempts will be refused while the zone is frozen.

    thaw [zone [class [view]]]

    Enable updates to a frozen dynamic zone. If no zone is specified, then all frozen zones are enabled. This causes the server to reload the zone from disk, and re-enables dynamic updates after the load has completed. After a zone is thawed, dynamic updates will no longer be refused. If the zone has changed and the ixfr-from-differences option is in use, then the journal file will be updated to reflect changes in the zone. Otherwise, if the zone has changed, any existing journal file will be removed.

    sync [-clean] [zone [class [view]]]

    Sync changes in the journal file for a dynamic zone to the master file. If the "-clean" option is specified, the journal file is also removed. If no zone is specified, then all zones are synced.

    notify zone [class [view]]

    Resend NOTIFY messages for the zone.

    reconfig

    Reload the configuration file and load new zones, but do not reload existing zone files even if they have changed. This is faster than a full reload when there is a large number of zones because it avoids the need to examine the modification times of the zones files.

    stats

    Write server statistics to the statistics file.

    querylog [on|off]

    Enable or disable query logging. (For backward compatibility, this command can also be used without an argument to toggle query logging on and off.)

    Query logging can also be enabled by explicitly directing the queries category to a channel in the logging section of named.conf or by specifying querylog yes; in the options section of named.conf.

    dumpdb [-all|-cache|-zone] [view ...]

    Dump the server's caches (default) and/or zones to the dump file for the specified views. If no view is specified, all views are dumped.

    secroots [view ...]

    Dump the server's security roots to the secroots file for the specified views. If no view is specified, security roots for all views are dumped.

    stop [-p]

    Stop the server, making sure any recent changes made through dynamic update or IXFR are first saved to the master files of the updated zones. If -p is specified named's process id is returned. This allows an external process to determine when named had completed stopping.

    halt [-p]

    Stop the server immediately. Recent changes made through dynamic update or IXFR are not saved to the master files, but will be rolled forward from the journal files when the server is restarted. If -p is specified named's process id is returned. This allows an external process to determine when named had completed halting.

    trace

    Increment the servers debugging level by one.

    trace level

    Sets the server's debugging level to an explicit value.

    notrace

    Sets the server's debugging level to 0.

    flush

    Flushes the server's cache.

    flushname name [view]

    Flushes the given name from the server's DNS cache and, if applicable, from the server's nameserver address database or bad-server cache.

    flushtree name [view]

    Flushes the given name, and all of its subdomains, from the server's DNS cache. Note that this does not affect he server's address database or bad-server cache.

    status

    Display status of the server. Note that the number of zones includes the internal bind/CH zone and the default ./IN hint zone if there is not an explicit root zone configured.

    recursing

    Dump the list of queries named is currently recursing on.

    validation ( on | off | check ) [view ...]

    Enable, disable, or check the current status of DNSSEC validation. Note dnssec-enable also needs to be set to yes or auto to be effective. It defaults to enabled.

    tsig-list

    List the names of all TSIG keys currently configured for use by named in each view. The list both statically configured keys and dynamic TKEY-negotiated keys.

    tsig-delete keyname [view]

    Delete a given TKEY-negotiated key from the server. (This does not apply to statically configured TSIG keys.)

    addzone zone [class [view]] configuration

    Add a zone while the server is running. This command requires the allow-new-zones option to be set to yes. The configuration string specified on the command line is the zone configuration text that would ordinarily be placed in named.conf.

    The configuration is saved in a file called hash.nzf, where hash is a cryptographic hash generated from the name of the view. When named is restarted, the file will be loaded into the view configuration, so that zones that were added can persist after a restart.

    This sample addzone command would add the zone example.com to the default view:

    $ rndc addzone example.com '{ type master; file "example.com.db"; };'

    (Note the brackets and semi-colon around the zone configuration text.)

    delzone zone [class [view]]

    Delete a zone while the server is running. Only zones that were originally added via rndc addzone can be deleted in this manner.

    signing [( -list | -clear keyid/algorithm | -clear all | -nsec3param ( parameters | none ) ) ] zone [class [view]]

    List, edit, or remove the DNSSEC signing state for the specified zone. The status of ongoing DNSSEC operations (such as signing or generating NSEC3 chains) is stored in the zone in the form of DNS resource records of type sig-signing-type. rndc signing -list converts these records into a human-readable form, indicating which keys are currently signing or have finished signing the zone, and which NSEC3 chains are being created or removed.

    rndc signing -clear can remove a single key (specified in the same format that rndc signing -list uses to display it), or all keys. In either case, only completed keys are removed; any record indicating that a key has not yet finished signing the zone will be retained.

    rndc signing -nsec3param sets the NSEC3 parameters for a zone. This is the only supported mechanism for using NSEC3 with inline-signing zones. Parameters are specified in the same format as an NSEC3PARAM resource record: hash algorithm, flags, iterations, and salt, in that order.

    Currently, the only defined value for hash algorithm is 1, representing SHA-1. The flags may be set to 0 or 1, depending on whether you wish to set the opt-out bit in the NSEC3 chain. iterations defines the number of additional times to apply the algorithm when generating an NSEC3 hash. The salt is a string of data expressed in hexadecimal, or a hyphen (`-') if no salt is to be used.

    So, for example, to create an NSEC3 chain using the SHA-1 hash algorithm, no opt-out flag, 10 iterations, and a salt value of "FFFF", use: rndc signing -nsec3param 1 0 10 FFFF zone. To set the opt-out flag, 15 iterations, and no salt, use: rndc signing -nsec3param 1 1 15 - zone.

    rndc signing -nsec3param none removes an existing NSEC3 chain and replaces it with NSEC.

    LIMITATIONS

    There is currently no way to provide the shared secret for a key_id without using the configuration file.

    Several error messages could be clearer.

    SEE ALSO

    rndc.conf(5), rndc-confgen(8), named(8), named.conf(5), ndc(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/arm/Bv9ARM.ch06.html0000644000470500017500000212142012271526120017007 0ustar lamontlamont Chapter 6. BIND 9 Configuration Reference

    Chapter 6. BIND 9 Configuration Reference

    BIND 9 configuration is broadly similar to BIND 8; however, there are a few new areas of configuration, such as views. BIND 8 configuration files should work with few alterations in BIND 9, although more complex configurations should be reviewed to check if they can be more efficiently implemented using the new features found in BIND 9.

    BIND 4 configuration files can be converted to the new format using the shell script contrib/named-bootconf/named-bootconf.sh.

    Configuration File Elements

    Following is a list of elements used throughout the BIND configuration file documentation:

    acl_name

    The name of an address_match_list as defined by the acl statement.

    address_match_list

    A list of one or more ip_addr, ip_prefix, key_id, or acl_name elements, see the section called “Address Match Lists”.

    masters_list

    A named list of one or more ip_addr with optional key_id and/or ip_port. A masters_list may include other masters_lists.

    domain_name

    A quoted string which will be used as a DNS name, for example "my.test.domain".

    namelist

    A list of one or more domain_name elements.

    dotted_decimal

    One to four integers valued 0 through 255 separated by dots (`.'), such as 123, 45.67 or 89.123.45.67.

    ip4_addr

    An IPv4 address with exactly four elements in dotted_decimal notation.

    ip6_addr

    An IPv6 address, such as 2001:db8::1234. IPv6 scoped addresses that have ambiguity on their scope zones must be disambiguated by an appropriate zone ID with the percent character (`%') as delimiter. It is strongly recommended to use string zone names rather than numeric identifiers, in order to be robust against system configuration changes. However, since there is no standard mapping for such names and identifier values, currently only interface names as link identifiers are supported, assuming one-to-one mapping between interfaces and links. For example, a link-local address fe80::1 on the link attached to the interface ne0 can be specified as fe80::1%ne0. Note that on most systems link-local addresses always have the ambiguity, and need to be disambiguated.

    ip_addr

    An ip4_addr or ip6_addr.

    ip_port

    An IP port number. The number is limited to 0 through 65535, with values below 1024 typically restricted to use by processes running as root. In some cases, an asterisk (`*') character can be used as a placeholder to select a random high-numbered port.

    ip_prefix

    An IP network specified as an ip_addr, followed by a slash (`/') and then the number of bits in the netmask. Trailing zeros in a ip_addr may omitted. For example, 127/8 is the network 127.0.0.0 with netmask 255.0.0.0 and 1.2.3.0/28 is network 1.2.3.0 with netmask 255.255.255.240.

    When specifying a prefix involving a IPv6 scoped address the scope may be omitted. In that case the prefix will match packets from any scope.

    key_id

    A domain_name representing the name of a shared key, to be used for transaction security.

    key_list

    A list of one or more key_ids, separated by semicolons and ending with a semicolon.

    number

    A non-negative 32-bit integer (i.e., a number between 0 and 4294967295, inclusive). Its acceptable value might further be limited by the context in which it is used.

    path_name

    A quoted string which will be used as a pathname, such as zones/master/my.test.domain.

    port_list

    A list of an ip_port or a port range. A port range is specified in the form of range followed by two ip_ports, port_low and port_high, which represents port numbers from port_low through port_high, inclusive. port_low must not be larger than port_high. For example, range 1024 65535 represents ports from 1024 through 65535. In either case an asterisk (`*') character is not allowed as a valid ip_port.

    size_spec

    A 64-bit unsigned integer, or the keywords unlimited or default.

    Integers may take values 0 <= value <= 18446744073709551615, though certain parameters may use a more limited range within these extremes. In most cases, setting a value to 0 does not literally mean zero; it means "undefined" or "as big as psosible", depending on the context. See the expalantions of particular parameters that use size_spec for details on how they interpret its use.

    Numeric values can optionally be followed by a scaling factor: K or k for kilobytes, M or m for megabytes, and G or g for gigabytes, which scale by 1024, 1024*1024, and 1024*1024*1024 respectively.

    unlimited generally means "as big as possible", though in certain contexts, (including max-cache-size), it may mean the largest possible 32-bit unsigned integer (0xffffffff); this distinction can be important when dealing with larger quantities. unlimited is usually the best way to safely set a very large number.

    default uses the limit that was in force when the server was started.

    yes_or_no

    Either yes or no. The words true and false are also accepted, as are the numbers 1 and 0.

    dialup_option

    One of yes, no, notify, notify-passive, refresh or passive. When used in a zone, notify-passive, refresh, and passive are restricted to slave and stub zones.

    Address Match Lists

    Syntax

    address_match_list = address_match_list_element ;
      [ address_match_list_element; ... ]
    address_match_list_element = [ ! ] (ip_address [/length] |
       key key_id | acl_name | { address_match_list } )
    

    Definition and Usage

    Address match lists are primarily used to determine access control for various server operations. They are also used in the listen-on and sortlist statements. The elements which constitute an address match list can be any of the following:

    • an IP address (IPv4 or IPv6)
    • an IP prefix (in `/' notation)
    • a key ID, as defined by the key statement
    • the name of an address match list defined with the acl statement
    • a nested address match list enclosed in braces

    Elements can be negated with a leading exclamation mark (`!'), and the match list names "any", "none", "localhost", and "localnets" are predefined. More information on those names can be found in the description of the acl statement.

    The addition of the key clause made the name of this syntactic element something of a misnomer, since security keys can be used to validate access without regard to a host or network address. Nonetheless, the term "address match list" is still used throughout the documentation.

    When a given IP address or prefix is compared to an address match list, the comparison takes place in approximately O(1) time. However, key comparisons require that the list of keys be traversed until a matching key is found, and therefore may be somewhat slower.

    The interpretation of a match depends on whether the list is being used for access control, defining listen-on ports, or in a sortlist, and whether the element was negated.

    When used as an access control list, a non-negated match allows access and a negated match denies access. If there is no match, access is denied. The clauses allow-notify, allow-recursion, allow-recursion-on, allow-query, allow-query-on, allow-query-cache, allow-query-cache-on, allow-transfer, allow-update, allow-update-forwarding, and blackhole all use address match lists. Similarly, the listen-on option will cause the server to refuse queries on any of the machine's addresses which do not match the list.

    Order of insertion is significant. If more than one element in an ACL is found to match a given IP address or prefix, preference will be given to the one that came first in the ACL definition. Because of this first-match behavior, an element that defines a subset of another element in the list should come before the broader element, regardless of whether either is negated. For example, in 1.2.3/24; ! 1.2.3.13; the 1.2.3.13 element is completely useless because the algorithm will match any lookup for 1.2.3.13 to the 1.2.3/24 element. Using ! 1.2.3.13; 1.2.3/24 fixes that problem by having 1.2.3.13 blocked by the negation, but all other 1.2.3.* hosts fall through.

    Comment Syntax

    The BIND 9 comment syntax allows for comments to appear anywhere that whitespace may appear in a BIND configuration file. To appeal to programmers of all kinds, they can be written in the C, C++, or shell/perl style.

    Syntax

    /* This is a BIND comment as in C */

    // This is a BIND comment as in C++

    # This is a BIND comment as in common UNIX shells
    # and perl

    Definition and Usage

    Comments may appear anywhere that whitespace may appear in a BIND configuration file.

    C-style comments start with the two characters /* (slash, star) and end with */ (star, slash). Because they are completely delimited with these characters, they can be used to comment only a portion of a line or to span multiple lines.

    C-style comments cannot be nested. For example, the following is not valid because the entire comment ends with the first */:

    /* This is the start of a comment.
       This is still part of the comment.
    /* This is an incorrect attempt at nesting a comment. */
       This is no longer in any comment. */
    

    C++-style comments start with the two characters // (slash, slash) and continue to the end of the physical line. They cannot be continued across multiple physical lines; to have one logical comment span multiple lines, each line must use the // pair. For example:

    // This is the start of a comment.  The next line
    // is a new comment, even though it is logically
    // part of the previous comment.
    

    Shell-style (or perl-style, if you prefer) comments start with the character # (number sign) and continue to the end of the physical line, as in C++ comments. For example:

    # This is the start of a comment.  The next line
    # is a new comment, even though it is logically
    # part of the previous comment.
    

    Warning

    You cannot use the semicolon (`;') character to start a comment such as you would in a zone file. The semicolon indicates the end of a configuration statement.

    Configuration File Grammar

    A BIND 9 configuration consists of statements and comments. Statements end with a semicolon. Statements and comments are the only elements that can appear without enclosing braces. Many statements contain a block of sub-statements, which are also terminated with a semicolon.

    The following statements are supported:

    acl

    defines a named IP address matching list, for access control and other uses.

    controls

    declares control channels to be used by the rndc utility.

    include

    includes a file.

    key

    specifies key information for use in authentication and authorization using TSIG.

    logging

    specifies what the server logs, and where the log messages are sent.

    lwres

    configures named to also act as a light-weight resolver daemon (lwresd).

    masters

    defines a named masters list for inclusion in stub and slave zones' masters or also-notify lists.

    options

    controls global server configuration options and sets defaults for other statements.

    server

    sets certain configuration options on a per-server basis.

    statistics-channels

    declares communication channels to get access to named statistics.

    trusted-keys

    defines trusted DNSSEC keys.

    managed-keys

    lists DNSSEC keys to be kept up to date using RFC 5011 trust anchor maintenance.

    view

    defines a view.

    zone

    defines a zone.

    The logging and options statements may only occur once per configuration.

    acl Statement Grammar

    acl acl-name {
        address_match_list
    };
    

    acl Statement Definition and Usage

    The acl statement assigns a symbolic name to an address match list. It gets its name from a primary use of address match lists: Access Control Lists (ACLs).

    Note that an address match list's name must be defined with acl before it can be used elsewhere; no forward references are allowed.

    The following ACLs are built-in:

    any

    Matches all hosts.

    none

    Matches no hosts.

    localhost

    Matches the IPv4 and IPv6 addresses of all network interfaces on the system.

    localnets

    Matches any host on an IPv4 or IPv6 network for which the system has an interface. Some systems do not provide a way to determine the prefix lengths of local IPv6 addresses. In such a case, localnets only matches the local IPv6 addresses, just like localhost.

    controls Statement Grammar

    controls {
       [ inet ( ip_addr | * ) [ port ip_port ]
                    allow {  address_match_list  }
                    keys { key_list }; ]
       [ inet ...; ]
       [ unix path perm number owner number group number
         keys { key_list }; ]
       [ unix ...; ]
    };
    

    controls Statement Definition and Usage

    The controls statement declares control channels to be used by system administrators to control the operation of the name server. These control channels are used by the rndc utility to send commands to and retrieve non-DNS results from a name server.

    An inet control channel is a TCP socket listening at the specified ip_port on the specified ip_addr, which can be an IPv4 or IPv6 address. An ip_addr of * (asterisk) is interpreted as the IPv4 wildcard address; connections will be accepted on any of the system's IPv4 addresses. To listen on the IPv6 wildcard address, use an ip_addr of ::. If you will only use rndc on the local host, using the loopback address (127.0.0.1 or ::1) is recommended for maximum security.

    If no port is specified, port 953 is used. The asterisk "*" cannot be used for ip_port.

    The ability to issue commands over the control channel is restricted by the allow and keys clauses. Connections to the control channel are permitted based on the address_match_list. This is for simple IP address based filtering only; any key_id elements of the address_match_list are ignored.

    A unix control channel is a UNIX domain socket listening at the specified path in the file system. Access to the socket is specified by the perm, owner and group clauses. Note on some platforms (SunOS and Solaris) the permissions (perm) are applied to the parent directory as the permissions on the socket itself are ignored.

    The primary authorization mechanism of the command channel is the key_list, which contains a list of key_ids. Each key_id in the key_list is authorized to execute commands over the control channel. See Remote Name Daemon Control application in the section called “Administrative Tools”) for information about configuring keys in rndc.

    If no controls statement is present, named will set up a default control channel listening on the loopback address 127.0.0.1 and its IPv6 counterpart ::1. In this case, and also when the controls statement is present but does not have a keys clause, named will attempt to load the command channel key from the file rndc.key in /etc (or whatever sysconfdir was specified as when BIND was built). To create a rndc.key file, run rndc-confgen -a.

    The rndc.key feature was created to ease the transition of systems from BIND 8, which did not have digital signatures on its command channel messages and thus did not have a keys clause. It makes it possible to use an existing BIND 8 configuration file in BIND 9 unchanged, and still have rndc work the same way ndc worked in BIND 8, simply by executing the command rndc-confgen -a after BIND 9 is installed.

    Since the rndc.key feature is only intended to allow the backward-compatible usage of BIND 8 configuration files, this feature does not have a high degree of configurability. You cannot easily change the key name or the size of the secret, so you should make a rndc.conf with your own key if you wish to change those things. The rndc.key file also has its permissions set such that only the owner of the file (the user that named is running as) can access it. If you desire greater flexibility in allowing other users to access rndc commands, then you need to create a rndc.conf file and make it group readable by a group that contains the users who should have access.

    To disable the command channel, use an empty controls statement: controls { };.

    include Statement Grammar

    include filename;

    include Statement Definition and Usage

    The include statement inserts the specified file at the point where the include statement is encountered. The include statement facilitates the administration of configuration files by permitting the reading or writing of some things but not others. For example, the statement could include private keys that are readable only by the name server.

    key Statement Grammar

    key key_id {
        algorithm string;
        secret string;
    };
    

    key Statement Definition and Usage

    The key statement defines a shared secret key for use with TSIG (see the section called “TSIG”) or the command channel (see the section called “controls Statement Definition and Usage”).

    The key statement can occur at the top level of the configuration file or inside a view statement. Keys defined in top-level key statements can be used in all views. Keys intended for use in a controls statement (see the section called “controls Statement Definition and Usage”) must be defined at the top level.

    The key_id, also known as the key name, is a domain name uniquely identifying the key. It can be used in a server statement to cause requests sent to that server to be signed with this key, or in address match lists to verify that incoming requests have been signed with a key matching this name, algorithm, and secret.

    The algorithm_id is a string that specifies a security/authentication algorithm. Named supports hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512 TSIG authentication. Truncated hashes are supported by appending the minimum number of required bits preceded by a dash, e.g. hmac-sha1-80. The secret_string is the secret to be used by the algorithm, and is treated as a base-64 encoded string.

    logging Statement Grammar

    logging {
       [ channel channel_name {
         ( file path_name
             [ versions ( number | unlimited ) ]
             [ size size_spec ]
           | syslog syslog_facility
           | stderr
           | null );
         [ severity (critical | error | warning | notice |
                     info | debug [ level ] | dynamic ); ]
         [ print-category yes or no; ]
         [ print-severity yes or no; ]
         [ print-time yes or no; ]
       }; ]
       [ category category_name {
         channel_name ; [ channel_name ; ... ]
       }; ]
       ...
    };
    

    logging Statement Definition and Usage

    The logging statement configures a wide variety of logging options for the name server. Its channel phrase associates output methods, format options and severity levels with a name that can then be used with the category phrase to select how various classes of messages are logged.

    Only one logging statement is used to define as many channels and categories as are wanted. If there is no logging statement, the logging configuration will be:

    logging {
         category default { default_syslog; default_debug; };
         category unmatched { null; };
    };
    

    In BIND 9, the logging configuration is only established when the entire configuration file has been parsed. In BIND 8, it was established as soon as the logging statement was parsed. When the server is starting up, all logging messages regarding syntax errors in the configuration file go to the default channels, or to standard error if the "-g" option was specified.

    The channel Phrase

    All log output goes to one or more channels; you can make as many of them as you want.

    Every channel definition must include a destination clause that says whether messages selected for the channel go to a file, to a particular syslog facility, to the standard error stream, or are discarded. It can optionally also limit the message severity level that will be accepted by the channel (the default is info), and whether to include a named-generated time stamp, the category name and/or severity level (the default is not to include any).

    The null destination clause causes all messages sent to the channel to be discarded; in that case, other options for the channel are meaningless.

    The file destination clause directs the channel to a disk file. It can include limitations both on how large the file is allowed to become, and how many versions of the file will be saved each time the file is opened.

    If you use the versions log file option, then named will retain that many backup versions of the file by renaming them when opening. For example, if you choose to keep three old versions of the file lamers.log, then just before it is opened lamers.log.1 is renamed to lamers.log.2, lamers.log.0 is renamed to lamers.log.1, and lamers.log is renamed to lamers.log.0. You can say versions unlimited to not limit the number of versions. If a size option is associated with the log file, then renaming is only done when the file being opened exceeds the indicated size. No backup versions are kept by default; any existing log file is simply appended.

    The size option for files is used to limit log growth. If the file ever exceeds the size, then named will stop writing to the file unless it has a versions option associated with it. If backup versions are kept, the files are rolled as described above and a new one begun. If there is no versions option, no more data will be written to the log until some out-of-band mechanism removes or truncates the log to less than the maximum size. The default behavior is not to limit the size of the file.

    Example usage of the size and versions options:

    channel an_example_channel {
        file "example.log" versions 3 size 20m;
        print-time yes;
        print-category yes;
    };
    

    The syslog destination clause directs the channel to the system log. Its argument is a syslog facility as described in the syslog man page. Known facilities are kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0, local1, local2, local3, local4, local5, local6 and local7, however not all facilities are supported on all operating systems. How syslog will handle messages sent to this facility is described in the syslog.conf man page. If you have a system which uses a very old version of syslog that only uses two arguments to the openlog() function, then this clause is silently ignored.

    On Windows machines syslog messages are directed to the EventViewer.

    The severity clause works like syslog's "priorities", except that they can also be used if you are writing straight to a file rather than using syslog. Messages which are not at least of the severity level given will not be selected for the channel; messages of higher severity levels will be accepted.

    If you are using syslog, then the syslog.conf priorities will also determine what eventually passes through. For example, defining a channel facility and severity as daemon and debug but only logging daemon.warning via syslog.conf will cause messages of severity info and notice to be dropped. If the situation were reversed, with named writing messages of only warning or higher, then syslogd would print all messages it received from the channel.

    The stderr destination clause directs the channel to the server's standard error stream. This is intended for use when the server is running as a foreground process, for example when debugging a configuration.

    The server can supply extensive debugging information when it is in debugging mode. If the server's global debug level is greater than zero, then debugging mode will be active. The global debug level is set either by starting the named server with the -d flag followed by a positive integer, or by running rndc trace. The global debug level can be set to zero, and debugging mode turned off, by running rndc notrace. All debugging messages in the server have a debug level, and higher debug levels give more detailed output. Channels that specify a specific debug severity, for example:

    channel specific_debug_level {
        file "foo";
        severity debug 3;
    };
    

    will get debugging output of level 3 or less any time the server is in debugging mode, regardless of the global debugging level. Channels with dynamic severity use the server's global debug level to determine what messages to print.

    If print-time has been turned on, then the date and time will be logged. print-time may be specified for a syslog channel, but is usually pointless since syslog also logs the date and time. If print-category is requested, then the category of the message will be logged as well. Finally, if print-severity is on, then the severity level of the message will be logged. The print- options may be used in any combination, and will always be printed in the following order: time, category, severity. Here is an example where all three print- options are on:

    28-Feb-2000 15:05:32.863 general: notice: running

    There are four predefined channels that are used for named's default logging as follows. How they are used is described in the section called “The category Phrase”.

    channel default_syslog {
        // send to syslog's daemon facility
        syslog daemon;
        // only send priority info and higher
        severity info;
    
    channel default_debug {
        // write to named.run in the working directory
        // Note: stderr is used instead of "named.run" if
        // the server is started with the '-f' option.
        file "named.run";
        // log at the server's current debug level
        severity dynamic;
    };
    
    channel default_stderr {
        // writes to stderr
        stderr;
        // only send priority info and higher
        severity info;
    };
    
    channel null {
       // toss anything sent to this channel
       null;
    };
    

    The default_debug channel has the special property that it only produces output when the server's debug level is nonzero. It normally writes to a file called named.run in the server's working directory.

    For security reasons, when the "-u" command line option is used, the named.run file is created only after named has changed to the new UID, and any debug output generated while named is starting up and still running as root is discarded. If you need to capture this output, you must run the server with the "-g" option and redirect standard error to a file.

    Once a channel is defined, it cannot be redefined. Thus you cannot alter the built-in channels directly, but you can modify the default logging by pointing categories at channels you have defined.

    The category Phrase

    There are many categories, so you can send the logs you want to see wherever you want, without seeing logs you don't want. If you don't specify a list of channels for a category, then log messages in that category will be sent to the default category instead. If you don't specify a default category, the following "default default" is used:

    category default { default_syslog; default_debug; };
    

    As an example, let's say you want to log security events to a file, but you also want keep the default logging behavior. You'd specify the following:

    channel my_security_channel {
        file "my_security_file";
        severity info;
    };
    category security {
        my_security_channel;
        default_syslog;
        default_debug;
    };

    To discard all messages in a category, specify the null channel:

    category xfer-out { null; };
    category notify { null; };
    

    Following are the available categories and brief descriptions of the types of log information they contain. More categories may be added in future BIND releases.

    default

    The default category defines the logging options for those categories where no specific configuration has been defined.

    general

    The catch-all. Many things still aren't classified into categories, and they all end up here.

    database

    Messages relating to the databases used internally by the name server to store zone and cache data.

    security

    Approval and denial of requests.

    config

    Configuration file parsing and processing.

    resolver

    DNS resolution, such as the recursive lookups performed on behalf of clients by a caching name server.

    xfer-in

    Zone transfers the server is receiving.

    xfer-out

    Zone transfers the server is sending.

    notify

    The NOTIFY protocol.

    client

    Processing of client requests.

    unmatched

    Messages that named was unable to determine the class of or for which there was no matching view. A one line summary is also logged to the client category. This category is best sent to a file or stderr, by default it is sent to the null channel.

    network

    Network operations.

    update

    Dynamic updates.

    update-security

    Approval and denial of update requests.

    queries

    Specify where queries should be logged to.

    At startup, specifying the category queries will also enable query logging unless querylog option has been specified.

    The query log entry reports the client's IP address and port number, and the query name, class and type. Next it reports whether the Recursion Desired flag was set (+ if set, - if not set), if the query was signed (S), EDNS was in use (E), if TCP was used (T), if DO (DNSSEC Ok) was set (D), or if CD (Checking Disabled) was set (C). After this the destination address the query was sent to is reported.

    client 127.0.0.1#62536 (www.example.com): query: www.example.com IN AAAA +SE

    client ::1#62537 (www.example.net): query: www.example.net IN AAAA -SE

    (The first part of this log message, showing the client address/port number and query name, is repeated in all subsequent log messages related to the same query.)

    query-errors

    Information about queries that resulted in some failure.

    dispatch

    Dispatching of incoming packets to the server modules where they are to be processed.

    dnssec

    DNSSEC and TSIG protocol processing.

    lame-servers

    Lame servers. These are misconfigurations in remote servers, discovered by BIND 9 when trying to query those servers during resolution.

    delegation-only

    Delegation only. Logs queries that have been forced to NXDOMAIN as the result of a delegation-only zone or a delegation-only in a hint or stub zone declaration.

    edns-disabled

    Log queries that have been forced to use plain DNS due to timeouts. This is often due to the remote servers not being RFC 1034 compliant (not always returning FORMERR or similar to EDNS queries and other extensions to the DNS when they are not understood). In other words, this is targeted at servers that fail to respond to DNS queries that they don't understand.

    Note: the log message can also be due to packet loss. Before reporting servers for non-RFC 1034 compliance they should be re-tested to determine the nature of the non-compliance. This testing should prevent or reduce the number of false-positive reports.

    Note: eventually named will have to stop treating such timeouts as due to RFC 1034 non compliance and start treating it as plain packet loss. Falsely classifying packet loss as due to RFC 1034 non compliance impacts on DNSSEC validation which requires EDNS for the DNSSEC records to be returned.

    RPZ

    Information about errors in response policy zone files, rewritten responses, and at the highest debug levels, mere rewriting attempts.

    rate-limit

    (Only available when BIND 9 is configured with the --enable-rrl option at compile time.)

    The start, periodic, and final notices of the rate limiting of a stream of responses are logged at info severity in this category. These messages include a hash value of the domain name of the response and the name itself, except when there is insufficient memory to record the name for the final notice The final notice is normally delayed until about one minute after rate limit stops. A lack of memory can hurry the final notice, in which case it starts with an asterisk (*). Various internal events are logged at debug 1 level and higher.

    Rate limiting of individual requests is logged in the query-errors category.

    The query-errors Category

    The query-errors category is specifically intended for debugging purposes: To identify why and how specific queries result in responses which indicate an error. Messages of this category are therefore only logged with debug levels.

    At the debug levels of 1 or higher, each response with the rcode of SERVFAIL is logged as follows:

    client 127.0.0.1#61502: query failed (SERVFAIL) for www.example.com/IN/AAAA at query.c:3880

    This means an error resulting in SERVFAIL was detected at line 3880 of source file query.c. Log messages of this level will particularly help identify the cause of SERVFAIL for an authoritative server.

    At the debug levels of 2 or higher, detailed context information of recursive resolutions that resulted in SERVFAIL is logged. The log message will look like as follows:

    fetch completed at resolver.c:2970 for www.example.com/A
    in 30.000183: timed out/success [domain:example.com,
    referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,
    badresp:1,adberr:0,findfail:0,valfail:0]
                

    The first part before the colon shows that a recursive resolution for AAAA records of www.example.com completed in 30.000183 seconds and the final result that led to the SERVFAIL was determined at line 2970 of source file resolver.c.

    The following part shows the detected final result and the latest result of DNSSEC validation. The latter is always success when no validation attempt is made. In this example, this query resulted in SERVFAIL probably because all name servers are down or unreachable, leading to a timeout in 30 seconds. DNSSEC validation was probably not attempted.

    The last part enclosed in square brackets shows statistics information collected for this particular resolution attempt. The domain field shows the deepest zone that the resolver reached; it is the zone where the error was finally detected. The meaning of the other fields is summarized in the following table.

    referral

    The number of referrals the resolver received throughout the resolution process. In the above example this is 2, which are most likely com and example.com.

    restart

    The number of cycles that the resolver tried remote servers at the domain zone. In each cycle the resolver sends one query (possibly resending it, depending on the response) to each known name server of the domain zone.

    qrysent

    The number of queries the resolver sent at the domain zone.

    timeout

    The number of timeouts since the resolver received the last response.

    lame

    The number of lame servers the resolver detected at the domain zone. A server is detected to be lame either by an invalid response or as a result of lookup in BIND9's address database (ADB), where lame servers are cached.

    neterr

    The number of erroneous results that the resolver encountered in sending queries at the domain zone. One common case is the remote server is unreachable and the resolver receives an ICMP unreachable error message.

    badresp

    The number of unexpected responses (other than lame) to queries sent by the resolver at the domain zone.

    adberr

    Failures in finding remote server addresses of the domain zone in the ADB. One common case of this is that the remote server's name does not have any address records.

    findfail

    Failures of resolving remote server addresses. This is a total number of failures throughout the resolution process.

    valfail

    Failures of DNSSEC validation. Validation failures are counted throughout the resolution process (not limited to the domain zone), but should only happen in domain.

    At the debug levels of 3 or higher, the same messages as those at the debug 1 level are logged for other errors than SERVFAIL. Note that negative responses such as NXDOMAIN are not regarded as errors here.

    At the debug levels of 4 or higher, the same messages as those at the debug 2 level are logged for other errors than SERVFAIL. Unlike the above case of level 3, messages are logged for negative responses. This is because any unexpected results can be difficult to debug in the recursion case.

    lwres Statement Grammar

    This is the grammar of the lwres statement in the named.conf file:

    lwres {
        [ listen-on { ip_addr [port ip_port] ;
                    [ ip_addr [port ip_port] ; ... ] }; ]
        [ view view_name; ]
        [ search { domain_name ; [ domain_name ; ... ] }; ]
        [ ndots number; ]
    };
    

    lwres Statement Definition and Usage

    The lwres statement configures the name server to also act as a lightweight resolver server. (See the section called “Running a Resolver Daemon”.) There may be multiple lwres statements configuring lightweight resolver servers with different properties.

    The listen-on statement specifies a list of addresses (and ports) that this instance of a lightweight resolver daemon should accept requests on. If no port is specified, port 921 is used. If this statement is omitted, requests will be accepted on 127.0.0.1, port 921.

    The view statement binds this instance of a lightweight resolver daemon to a view in the DNS namespace, so that the response will be constructed in the same manner as a normal DNS query matching this view. If this statement is omitted, the default view is used, and if there is no default view, an error is triggered.

    The search statement is equivalent to the search statement in /etc/resolv.conf. It provides a list of domains which are appended to relative names in queries.

    The ndots statement is equivalent to the ndots statement in /etc/resolv.conf. It indicates the minimum number of dots in a relative domain name that should result in an exact match lookup before search path elements are appended.

    masters Statement Grammar

    masters name [port ip_port] { ( masters_list | 
          ip_addr [port ip_port] [key key] ) ; [...] };
    

    masters Statement Definition and Usage

    masters lists allow for a common set of masters to be easily used by multiple stub and slave zones in their masters or also-notify lists.

    options Statement Grammar

    This is the grammar of the options statement in the named.conf file:

    options {
        [ attach-cache cache_name; ]
        [ version version_string; ]
        [ hostname hostname_string; ]
        [ server-id server_id_string; ]
        [ directory path_name; ]
        [ key-directory path_name; ]
        [ managed-keys-directory path_name; ]
        [ named-xfer path_name; ]
        [ tkey-gssapi-keytab path_name; ]
        [ tkey-gssapi-credential principal; ]
        [ tkey-domain domainname; ]
        [ tkey-dhkey key_name key_tag; ]
        [ cache-file path_name; ]
        [ dump-file path_name; ]
        [ bindkeys-file path_name; ]
        [ secroots-file path_name; ]
        [ session-keyfile path_name; ]
        [ session-keyname key_name; ]
        [ session-keyalg algorithm_id; ]
        [ memstatistics yes_or_no; ]
        [ memstatistics-file path_name; ]
        [ pid-file path_name; ]
        [ recursing-file path_name; ]
        [ statistics-file path_name; ]
        [ zone-statistics full | terse | none; ]
        [ auth-nxdomain yes_or_no; ]
        [ deallocate-on-exit yes_or_no; ]
        [ dialup dialup_option; ]
        [ fake-iquery yes_or_no; ]
        [ fetch-glue yes_or_no; ]
        [ flush-zones-on-shutdown yes_or_no; ]
        [ has-old-clients yes_or_no; ]
        [ host-statistics yes_or_no; ]
        [ host-statistics-max number; ]
        [ minimal-responses yes_or_no; ]
        [ multiple-cnames yes_or_no; ]
        [ notify yes_or_no | explicit | master-only; ]
        [ recursion yes_or_no; ]
        [ request-nsid yes_or_no; ]
        [ rfc2308-type1 yes_or_no; ]
        [ use-id-pool yes_or_no; ]
        [ maintain-ixfr-base yes_or_no; ]
        [ ixfr-from-differences (yes_or_no | master | slave); ]
        [ dnssec-enable yes_or_no; ]
        [ dnssec-validation (yes_or_no | auto); ]
        [ dnssec-lookaside ( auto |
                            no |
                            domain trust-anchor domain ); ]
        [ dnssec-must-be-secure domain yes_or_no; ]
        [ dnssec-accept-expired yes_or_no; ]
        [ forward ( only | first ); ]
        [ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
        [ dual-stack-servers [port ip_port] {
            ( domain_name [port ip_port] |
              ip_addr [port ip_port] ) ; 
            ... }; ]
        [ check-names ( master | slave | response )
            ( warn | fail | ignore ); ]
        [ check-dup-records ( warn | fail | ignore ); ]
        [ check-mx ( warn | fail | ignore ); ]
        [ check-wildcard yes_or_no; ]
        [ check-integrity yes_or_no; ]
        [ check-mx-cname ( warn | fail | ignore ); ]
        [ check-srv-cname ( warn | fail | ignore ); ]
        [ check-sibling yes_or_no; ]
        [ check-spf ( warn | fail | ignore ); ]
        [ allow-new-zones { yes_or_no }; ]
        [ allow-notify { address_match_list }; ]
        [ allow-query { address_match_list }; ]
        [ allow-query-on { address_match_list }; ]
        [ allow-query-cache { address_match_list }; ]
        [ allow-query-cache-on { address_match_list }; ]
        [ allow-transfer { address_match_list }; ]
        [ allow-recursion { address_match_list }; ]
        [ allow-recursion-on { address_match_list }; ]
        [ allow-update { address_match_list }; ]
        [ allow-update-forwarding { address_match_list }; ]
        [ update-check-ksk yes_or_no; ]
        [ dnssec-update-mode ( maintain | no-resign ); ]
        [ dnssec-dnskey-kskonly yes_or_no; ]
        [ dnssec-loadkeys-interval number; ]
        [ dnssec-secure-to-insecure yes_or_no ;]
        [ try-tcp-refresh yes_or_no; ]
        [ allow-v6-synthesis { address_match_list }; ]
        [ blackhole { address_match_list }; ]
        [ use-v4-udp-ports { port_list }; ]
        [ avoid-v4-udp-ports { port_list }; ]
        [ use-v6-udp-ports { port_list }; ]
        [ avoid-v6-udp-ports { port_list }; ]
        [ listen-on [ port ip_port ] { address_match_list }; ]
        [ listen-on-v6 [ port ip_port ] { address_match_list }; ]
        [ query-source ( ( ip4_addr | * )
            [ port ( ip_port | * ) ] |
            [ address ( ip4_addr | * ) ]
            [ port ( ip_port | * ) ] ) ; ]
        [ query-source-v6 ( ( ip6_addr | * )
            [ port ( ip_port | * ) ] | 
            [ address ( ip6_addr | * ) ] 
            [ port ( ip_port | * ) ] ) ; ]
        [ use-queryport-pool yes_or_no; ]
        [ queryport-pool-ports number; ]
        [ queryport-pool-updateinterval number; ]
        [ max-transfer-time-in number; ]
        [ max-transfer-time-out number; ]
        [ max-transfer-idle-in number; ]
        [ max-transfer-idle-out number; ]
        [ tcp-clients number; ]
        [ reserved-sockets number; ]
        [ recursive-clients number; ]
        [ serial-query-rate number; ]
        [ serial-queries number; ]
        [ tcp-listen-queue number; ]
        [ transfer-format ( one-answer | many-answers ); ]
        [ transfers-in  number; ]
        [ transfers-out number; ]
        [ transfers-per-ns number; ]
        [ transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ alt-transfer-source-v6 (ip6_addr | *)
                                 [port ip_port] ; ]
        [ use-alt-transfer-source yes_or_no; ]
        [ notify-delay seconds ; ]
        [ notify-source (ip4_addr | *) [port ip_port] ; ]
        [ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ notify-to-soa yes_or_no ; ]
        [ also-notify { ip_addr
                        [port ip_port] [key keyname] ;
                        [ ip_addr [port ip_port] [key keyname] ; ... ] }; ]
        [ max-ixfr-log-size number; ]
        [ max-journal-size size_spec; ]
        [ coresize size_spec ; ]
        [ datasize size_spec ; ]
        [ files size_spec ; ]
        [ stacksize size_spec ; ]
        [ cleaning-interval number; ]
        [ heartbeat-interval number; ]
        [ interface-interval number; ]
        [ statistics-interval number; ]
        [ topology { address_match_list }];
        [ sortlist { address_match_list }];
        [ rrset-order { order_spec ; [ order_spec ; ... ] ] };
        [ lame-ttl number; ]
        [ max-ncache-ttl number; ]
        [ max-cache-ttl number; ]
        [ sig-validity-interval number [number] ; ]
        [ sig-signing-nodes number ; ]
        [ sig-signing-signatures number ; ]
        [ sig-signing-type number ; ]
        [ min-roots number; ]
        [ use-ixfr yes_or_no ; ]
        [ provide-ixfr yes_or_no; ]
        [ request-ixfr yes_or_no; ]
        [ treat-cr-as-space yes_or_no ; ]
        [ min-refresh-time number ; ]
        [ max-refresh-time number ; ]
        [ min-retry-time number ; ]
        [ max-retry-time number ; ]
        [ port ip_port; ]
        [ additional-from-auth yes_or_no ; ]
        [ additional-from-cache yes_or_no ; ]
        [ random-device path_name ; ]
        [ max-cache-size size_spec ; ]
        [ match-mapped-addresses yes_or_no; ]
        [ filter-aaaa-on-v4 ( yes_or_no | break-dnssec ); ]
        [ filter-aaaa { address_match_list }; ]
        [ dns64 ipv6-prefix {
            [ clients { address_match_list }; ]
            [ mapped { address_match_list }; ]
            [ exclude { address_match_list }; ]
            [ suffix IPv6-address; ]
            [ recursive-only yes_or_no; ]
            [ break-dnssec yes_or_no; ]
        }; ];
        [ dns64-server name ]
        [ dns64-contact name ]
        [ preferred-glue ( A | AAAA | NONE ); ]
        [ edns-udp-size number; ]
        [ max-udp-size number; ]
        [ max-rsa-exponent-size number; ]
        [ root-delegation-only [ exclude { namelist } ] ; ]
        [ querylog yes_or_no ; ]
        [ disable-algorithms domain { algorithm;
                                    [ algorithm; ] }; ]
        [ acache-enable yes_or_no ; ]
        [ acache-cleaning-interval number; ]
        [ max-acache-size size_spec ; ]
        [ clients-per-query number ; ]
        [ max-clients-per-query number ; ]
        [ masterfile-format (text|raw) ; ]
        [ empty-server name ; ]
        [ empty-contact name ; ]
        [ empty-zones-enable yes_or_no ; ]
        [ disable-empty-zone zone_name ; ]
        [ zero-no-soa-ttl yes_or_no ; ]
        [ zero-no-soa-ttl-cache yes_or_no ; ]
        [ resolver-query-timeout number ; ]
        [ deny-answer-addresses { address_match_list } [ except-from { namelist } ];]
        [ deny-answer-aliases { namelist } [ except-from { namelist } ];]
        [ rate-limit {
            [ responses-per-second number ; ]
            [ referrals-per-second number ; ]
            [ nodata-per-second number ; ]
            [ nxdomains-per-second number ; ]
            [ errors-per-second number ; ]
            [ all-per-second number ; ]
            [ window number ; ]
            [ log-only yes_or_no ; ]
            [ qps-scale number ; ]
            [ ipv4-prefix-length number ; ]
            [ ipv6-prefix-length number ; ]
            [ slip number ; ]
            [ exempt-clients  { address_match_list } ; ]
            [ max-table-size number ; ]
            [ min-table-size number ; ]
          } ; ]
        [ response-policy { zone_name
            [ policy given | disabled | passthru | nxdomain | nodata | cname domain ]
            [ recursive-only yes_or_no ] [ max-policy-ttl number ] ;
        } [ recursive-only yes_or_no ] [ max-policy-ttl number ]
            [ break-dnssec yes_or_no ] [ min-ns-dots number ] ; ]
    };
    

    options Statement Definition and Usage

    The options statement sets up global options to be used by BIND. This statement may appear only once in a configuration file. If there is no options statement, an options block with each option set to its default will be used.

    attach-cache

    Allows multiple views to share a single cache database. Each view has its own cache database by default, but if multiple views have the same operational policy for name resolution and caching, those views can share a single cache to save memory and possibly improve resolution efficiency by using this option.

    The attach-cache option may also be specified in view statements, in which case it overrides the global attach-cache option.

    The cache_name specifies the cache to be shared. When the named server configures views which are supposed to share a cache, it creates a cache with the specified name for the first view of these sharing views. The rest of the views will simply refer to the already created cache.

    One common configuration to share a cache would be to allow all views to share a single cache. This can be done by specifying the attach-cache as a global option with an arbitrary name.

    Another possible operation is to allow a subset of all views to share a cache while the others to retain their own caches. For example, if there are three views A, B, and C, and only A and B should share a cache, specify the attach-cache option as a view A (or B)'s option, referring to the other view name:

      view "A" {
        // this view has its own cache
        ...
      };
      view "B" {
        // this view refers to A's cache
        attach-cache "A";
      };
      view "C" {
        // this view has its own cache
        ...
      };
    

    Views that share a cache must have the same policy on configurable parameters that may affect caching. The current implementation requires the following configurable options be consistent among these views: check-names, cleaning-interval, dnssec-accept-expired, dnssec-validation, max-cache-ttl, max-ncache-ttl, max-cache-size, and zero-no-soa-ttl.

    Note that there may be other parameters that may cause confusion if they are inconsistent for different views that share a single cache. For example, if these views define different sets of forwarders that can return different answers for the same question, sharing the answer does not make sense or could even be harmful. It is administrator's responsibility to ensure configuration differences in different views do not cause disruption with a shared cache.

    directory

    The working directory of the server. Any non-absolute pathnames in the configuration file will be taken as relative to this directory. The default location for most server output files (e.g. named.run) is this directory. If a directory is not specified, the working directory defaults to `.', the directory from which the server was started. The directory specified should be an absolute path.

    key-directory

    When performing dynamic update of secure zones, the directory where the public and private DNSSEC key files should be found, if different than the current working directory. (Note that this option has no effect on the paths for files containing non-DNSSEC keys such as bind.keys, rndc.key or session.key.)

    managed-keys-directory

    Specifies the directory in which to store the files that track managed DNSSEC keys. By default, this is the working directory.

    If named is not configured to use views, then managed keys for the server will be tracked in a single file called managed-keys.bind. Otherwise, managed keys will be tracked in separate files, one file per view; each file name will be the SHA256 hash of the view name, followed by the extension .mkeys.

    named-xfer

    This option is obsolete. It was used in BIND 8 to specify the pathname to the named-xfer program. In BIND 9, no separate named-xfer program is needed; its functionality is built into the name server.

    tkey-gssapi-keytab

    The KRB5 keytab file to use for GSS-TSIG updates. If this option is set and tkey-gssapi-credential is not set, then updates will be allowed with any key matching a principal in the specified keytab.

    tkey-gssapi-credential

    The security credential with which the server should authenticate keys requested by the GSS-TSIG protocol. Currently only Kerberos 5 authentication is available and the credential is a Kerberos principal which the server can acquire through the default system key file, normally /etc/krb5.keytab. The location keytab file can be overridden using the tkey-gssapi-keytab option. Normally this principal is of the form "DNS/server.domain". To use GSS-TSIG, tkey-domain must also be set if a specific keytab is not set with tkey-gssapi-keytab.

    tkey-domain

    The domain appended to the names of all shared keys generated with TKEY. When a client requests a TKEY exchange, it may or may not specify the desired name for the key. If present, the name of the shared key will be client specified part + tkey-domain. Otherwise, the name of the shared key will be random hex digits + tkey-domain. In most cases, the domainname should be the server's domain name, or an otherwise non-existent subdomain like "_tkey.domainname". If you are using GSS-TSIG, this variable must be defined, unless you specify a specific keytab using tkey-gssapi-keytab.

    tkey-dhkey

    The Diffie-Hellman key used by the server to generate shared keys with clients using the Diffie-Hellman mode of TKEY. The server must be able to load the public and private keys from files in the working directory. In most cases, the keyname should be the server's host name.

    cache-file

    This is for testing only. Do not use.

    dump-file

    The pathname of the file the server dumps the database to when instructed to do so with rndc dumpdb. If not specified, the default is named_dump.db.

    memstatistics-file

    The pathname of the file the server writes memory usage statistics to on exit. If not specified, the default is named.memstats.

    pid-file

    The pathname of the file the server writes its process ID in. If not specified, the default is /var/run/named/named.pid. The PID file is used by programs that want to send signals to the running name server. Specifying pid-file none disables the use of a PID file — no file will be written and any existing one will be removed. Note that none is a keyword, not a filename, and therefore is not enclosed in double quotes.

    recursing-file

    The pathname of the file the server dumps the queries that are currently recursing when instructed to do so with rndc recursing. If not specified, the default is named.recursing.

    statistics-file

    The pathname of the file the server appends statistics to when instructed to do so using rndc stats. If not specified, the default is named.stats in the server's current directory. The format of the file is described in the section called “The Statistics File”.

    bindkeys-file

    The pathname of a file to override the built-in trusted keys provided by named. See the discussion of dnssec-lookaside and dnssec-validation for details. If not specified, the default is /etc/bind.keys.

    secroots-file

    The pathname of the file the server dumps security roots to when instructed to do so with rndc secroots. If not specified, the default is named.secroots.

    session-keyfile

    The pathname of the file into which to write a TSIG session key generated by named for use by nsupdate -l. If not specified, the default is /var/run/named/session.key. (See the section called “Dynamic Update Policies”, and in particular the discussion of the update-policy statement's local option for more information about this feature.)

    session-keyname

    The key name to use for the TSIG session key. If not specified, the default is "local-ddns".

    session-keyalg

    The algorithm to use for the TSIG session key. Valid values are hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384, hmac-sha512 and hmac-md5. If not specified, the default is hmac-sha256.

    port

    The UDP/TCP port number the server uses for receiving and sending DNS protocol traffic. The default is 53. This option is mainly intended for server testing; a server using a port other than 53 will not be able to communicate with the global DNS.

    random-device

    The source of entropy to be used by the server. Entropy is primarily needed for DNSSEC operations, such as TKEY transactions and dynamic update of signed zones. This options specifies the device (or file) from which to read entropy. If this is a file, operations requiring entropy will fail when the file has been exhausted. If not specified, the default value is /dev/random (or equivalent) when present, and none otherwise. The random-device option takes effect during the initial configuration load at server startup time and is ignored on subsequent reloads.

    preferred-glue

    If specified, the listed type (A or AAAA) will be emitted before other glue in the additional section of a query response. The default is not to prefer any type (NONE).

    root-delegation-only

    Turn on enforcement of delegation-only in TLDs (top level domains) and root zones with an optional exclude list.

    DS queries are expected to be made to and be answered by delegation only zones. Such queries and responses are treated as an exception to delegation-only processing and are not converted to NXDOMAIN responses provided a CNAME is not discovered at the query name.

    If a delegation only zone server also serves a child zone it is not always possible to determine whether an answer comes from the delegation only zone or the child zone. SOA NS and DNSKEY records are apex only records and a matching response that contains these records or DS is treated as coming from a child zone. RRSIG records are also examined to see if they are signed by a child zone or not. The authority section is also examined to see if there is evidence that the answer is from the child zone. Answers that are determined to be from a child zone are not converted to NXDOMAIN responses. Despite all these checks there is still a possibility of false negatives when a child zone is being served.

    Similarly false positives can arise from empty nodes (no records at the name) in the delegation only zone when the query type is not ANY.

    Note some TLDs are not delegation only (e.g. "DE", "LV", "US" and "MUSEUM"). This list is not exhaustive.

    options {
            root-delegation-only exclude { "de"; "lv"; "us"; "museum"; };
    };
    
    disable-algorithms

    Disable the specified DNSSEC algorithms at and below the specified name. Multiple disable-algorithms statements are allowed. Only the most specific will be applied.

    dnssec-lookaside

    When set, dnssec-lookaside provides the validator with an alternate method to validate DNSKEY records at the top of a zone. When a DNSKEY is at or below a domain specified by the deepest dnssec-lookaside, and the normal DNSSEC validation has left the key untrusted, the trust-anchor will be appended to the key name and a DLV record will be looked up to see if it can validate the key. If the DLV record validates a DNSKEY (similarly to the way a DS record does) the DNSKEY RRset is deemed to be trusted.

    If dnssec-lookaside is set to auto, then built-in default values for the DLV domain and trust anchor will be used, along with a built-in key for validation.

    If dnssec-lookaside is set to no, then dnssec-lookaside is not used.

    The default DLV key is stored in the file bind.keys; named will load that key at startup if dnssec-lookaside is set to auto. A copy of the file is installed along with BIND 9, and is current as of the release date. If the DLV key expires, a new copy of bind.keys can be downloaded from https://www.isc.org/solutions/dlv/.

    (To prevent problems if bind.keys is not found, the current key is also compiled in to named. Relying on this is not recommended, however, as it requires named to be recompiled with a new key when the DLV key expires.)

    NOTE: named only loads certain specific keys from bind.keys: those for the DLV zone and for the DNS root zone. The file cannot be used to store keys for other zones.

    dnssec-must-be-secure

    Specify hierarchies which must be or may not be secure (signed and validated). If yes, then named will only accept answers if they are secure. If no, then normal DNSSEC validation applies allowing for insecure answers to be accepted. The specified domain must be under a trusted-keys or managed-keys statement, or dnssec-lookaside must be active.

    dns64

    This directive instructs named to return mapped IPv4 addresses to AAAA queries when there are no AAAA records. It is intended to be used in conjunction with a NAT64. Each dns64 defines one DNS64 prefix. Multiple DNS64 prefixes can be defined.

    Compatible IPv6 prefixes have lengths of 32, 40, 48, 56, 64 and 96 as per RFC 6052.

    Additionally a reverse IP6.ARPA zone will be created for the prefix to provide a mapping from the IP6.ARPA names to the corresponding IN-ADDR.ARPA names using synthesized CNAMEs. dns64-server and dns64-contact can be used to specify the name of the server and contact for the zones. These are settable at the view / options level. These are not settable on a per-prefix basis.

    Each dns64 supports an optional clients ACL that determines which clients are affected by this directive. If not defined, it defaults to any;.

    Each dns64 supports an optional mapped ACL that selects which IPv4 addresses are to be mapped in the corresponding A RRset. If not defined it defaults to any;.

    Normally, DNS64 won't apply to a domain name that owns one or more AAAA records; these records will simply be returned. The optional exclude ACL allows specification of a list of IPv6 addresses that will be ignored if they appear in a domain name's AAAA records, and DNS64 will be applied to any A records the domain name owns. If not defined, exclude defaults to none.

    A optional suffix can also be defined to set the bits trailing the mapped IPv4 address bits. By default these bits are set to ::. The bits matching the prefix and mapped IPv4 address must be zero.

    If recursive-only is set to yes the DNS64 synthesis will only happen for recursive queries. The default is no.

    If break-dnssec is set to yes the DNS64 synthesis will happen even if the result, if validated, would cause a DNSSEC validation failure. If this option is set to no (the default), the DO is set on the incoming query, and there are RRSIGs on the applicable records, then synthesis will not happen.

            acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
    
            dns64 64:FF9B::/96 {
                    clients { any; };
                    mapped { !rfc1918; any; };
                    exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
                    suffix ::;
            };
    
    dnssec-update-mode

    If this option is set to its default value of maintain in a zone of type master which is DNSSEC-signed and configured to allow dynamic updates (see the section called “Dynamic Update Policies”), and if named has access to the private signing key(s) for the zone, then named will automatically sign all new or changed records and maintain signatures for the zone by regenerating RRSIG records whenever they approach their expiration date.

    If the option is changed to no-resign, then named will sign all new or changed records, but scheduled maintenance of signatures is disabled.

    With either of these settings, named will reject updates to a DNSSEC-signed zone when the signing keys are inactive or unavailable to named. (A planned third option, external, will disable all automatic signing and allow DNSSEC data to be submitted into a zone via dynamic update; this is not yet implemented.)

    zone-statistics

    If full, the server will collect statistical data on all zones (unless specifically turned off on a per-zone basis by specifying zone-statistics terse or zone-statistics none in the zone statement). The default is terse, providing minimal statistics on zones (including name and current serial number, but not query type counters).

    These statistics may be accessed via the statistics-channel or using rndc stats, which will dump them to the file listed in the statistics-file. See also the section called “The Statistics File”.

    For backward compatibility with earlier versions of BIND 9, the zone-statistics option can also accept yes or no, which have the same effect as full and terse, respectively.

    Boolean Options

    allow-new-zones

    If yes, then zones can be added at runtime via rndc addzone or deleted via rndc delzone. The default is no.

    auth-nxdomain

    If yes, then the AA bit is always set on NXDOMAIN responses, even if the server is not actually authoritative. The default is no; this is a change from BIND 8. If you are using very old DNS software, you may need to set it to yes.

    deallocate-on-exit

    This option was used in BIND 8 to enable checking for memory leaks on exit. BIND 9 ignores the option and always performs the checks.

    memstatistics

    Write memory statistics to the file specified by memstatistics-file at exit. The default is no unless '-m record' is specified on the command line in which case it is yes.

    dialup

    If yes, then the server treats all zones as if they are doing zone transfers across a dial-on-demand dialup link, which can be brought up by traffic originating from this server. This has different effects according to zone type and concentrates the zone maintenance so that it all happens in a short interval, once every heartbeat-interval and hopefully during the one call. It also suppresses some of the normal zone maintenance traffic. The default is no.

    The dialup option may also be specified in the view and zone statements, in which case it overrides the global dialup option.

    If the zone is a master zone, then the server will send out a NOTIFY request to all the slaves (default). This should trigger the zone serial number check in the slave (providing it supports NOTIFY) allowing the slave to verify the zone while the connection is active. The set of servers to which NOTIFY is sent can be controlled by notify and also-notify.

    If the zone is a slave or stub zone, then the server will suppress the regular "zone up to date" (refresh) queries and only perform them when the heartbeat-interval expires in addition to sending NOTIFY requests.

    Finer control can be achieved by using notify which only sends NOTIFY messages, notify-passive which sends NOTIFY messages and suppresses the normal refresh queries, refresh which suppresses normal refresh processing and sends refresh queries when the heartbeat-interval expires, and passive which just disables normal refresh processing.

    dialup mode

    normal refresh

    heart-beat refresh

    heart-beat notify

    no (default)

    yes

    no

    no

    yes

    no

    yes

    yes

    notify

    yes

    no

    yes

    refresh

    no

    yes

    no

    passive

    no

    no

    no

    notify-passive

    no

    no

    yes

    Note that normal NOTIFY processing is not affected by dialup.

    fake-iquery

    In BIND 8, this option enabled simulating the obsolete DNS query type IQUERY. BIND 9 never does IQUERY simulation.

    fetch-glue

    This option is obsolete. In BIND 8, fetch-glue yes caused the server to attempt to fetch glue resource records it didn't have when constructing the additional data section of a response. This is now considered a bad idea and BIND 9 never does it.

    flush-zones-on-shutdown

    When the nameserver exits due receiving SIGTERM, flush or do not flush any pending zone writes. The default is flush-zones-on-shutdown no.

    has-old-clients

    This option was incorrectly implemented in BIND 8, and is ignored by BIND 9. To achieve the intended effect of has-old-clients yes, specify the two separate options auth-nxdomain yes and rfc2308-type1 no instead.

    host-statistics

    In BIND 8, this enables keeping of statistics for every host that the name server interacts with. Not implemented in BIND 9.

    maintain-ixfr-base

    This option is obsolete. It was used in BIND 8 to determine whether a transaction log was kept for Incremental Zone Transfer. BIND 9 maintains a transaction log whenever possible. If you need to disable outgoing incremental zone transfers, use provide-ixfr no.

    minimal-responses

    If yes, then when generating responses the server will only add records to the authority and additional data sections when they are required (e.g. delegations, negative responses). This may improve the performance of the server. The default is no.

    multiple-cnames

    This option was used in BIND 8 to allow a domain name to have multiple CNAME records in violation of the DNS standards. BIND 9.2 onwards always strictly enforces the CNAME rules both in master files and dynamic updates.

    notify

    If yes (the default), DNS NOTIFY messages are sent when a zone the server is authoritative for changes, see the section called “Notify”. The messages are sent to the servers listed in the zone's NS records (except the master server identified in the SOA MNAME field), and to any servers listed in the also-notify option.

    If master-only, notifies are only sent for master zones. If explicit, notifies are sent only to servers explicitly listed using also-notify. If no, no notifies are sent.

    The notify option may also be specified in the zone statement, in which case it overrides the options notify statement. It would only be necessary to turn off this option if it caused slaves to crash.

    notify-to-soa

    If yes do not check the nameservers in the NS RRset against the SOA MNAME. Normally a NOTIFY message is not sent to the SOA MNAME (SOA ORIGIN) as it is supposed to contain the name of the ultimate master. Sometimes, however, a slave is listed as the SOA MNAME in hidden master configurations and in that case you would want the ultimate master to still send NOTIFY messages to all the nameservers listed in the NS RRset.

    recursion

    If yes, and a DNS query requests recursion, then the server will attempt to do all the work required to answer the query. If recursion is off and the server does not already know the answer, it will return a referral response. The default is yes. Note that setting recursion no does not prevent clients from getting data from the server's cache; it only prevents new data from being cached as an effect of client queries. Caching may still occur as an effect the server's internal operation, such as NOTIFY address lookups. See also fetch-glue above.

    request-nsid

    If yes, then an empty EDNS(0) NSID (Name Server Identifier) option is sent with all queries to authoritative name servers during iterative resolution. If the authoritative server returns an NSID option in its response, then its contents are logged in the resolver category at level info. The default is no.

    rfc2308-type1

    Setting this to yes will cause the server to send NS records along with the SOA record for negative answers. The default is no.

    Note

    Not yet implemented in BIND 9.

    use-id-pool

    This option is obsolete. BIND 9 always allocates query IDs from a pool.

    use-ixfr

    This option is obsolete. If you need to disable IXFR to a particular server or servers, see the information on the provide-ixfr option in the section called “server Statement Definition and Usage”. See also the section called “Incremental Zone Transfers (IXFR)”.

    provide-ixfr

    See the description of provide-ixfr in the section called “server Statement Definition and Usage”.

    request-ixfr

    See the description of request-ixfr in the section called “server Statement Definition and Usage”.

    treat-cr-as-space

    This option was used in BIND 8 to make the server treat carriage return ("\r") characters the same way as a space or tab character, to facilitate loading of zone files on a UNIX system that were generated on an NT or DOS machine. In BIND 9, both UNIX "\n" and NT/DOS "\r\n" newlines are always accepted, and the option is ignored.

    additional-from-auth, additional-from-cache

    These options control the behavior of an authoritative server when answering queries which have additional data, or when following CNAME and DNAME chains.

    When both of these options are set to yes (the default) and a query is being answered from authoritative data (a zone configured into the server), the additional data section of the reply will be filled in using data from other authoritative zones and from the cache. In some situations this is undesirable, such as when there is concern over the correctness of the cache, or in servers where slave zones may be added and modified by untrusted third parties. Also, avoiding the search for this additional data will speed up server operations at the possible expense of additional queries to resolve what would otherwise be provided in the additional section.

    For example, if a query asks for an MX record for host foo.example.com, and the record found is "MX 10 mail.example.net", normally the address records (A and AAAA) for mail.example.net will be provided as well, if known, even though they are not in the example.com zone. Setting these options to no disables this behavior and makes the server only search for additional data in the zone it answers from.

    These options are intended for use in authoritative-only servers, or in authoritative-only views. Attempts to set them to no without also specifying recursion no will cause the server to ignore the options and log a warning message.

    Specifying additional-from-cache no actually disables the use of the cache not only for additional data lookups but also when looking up the answer. This is usually the desired behavior in an authoritative-only server where the correctness of the cached data is an issue.

    When a name server is non-recursively queried for a name that is not below the apex of any served zone, it normally answers with an "upwards referral" to the root servers or the servers of some other known parent of the query name. Since the data in an upwards referral comes from the cache, the server will not be able to provide upwards referrals when additional-from-cache no has been specified. Instead, it will respond to such queries with REFUSED. This should not cause any problems since upwards referrals are not required for the resolution process.

    match-mapped-addresses

    If yes, then an IPv4-mapped IPv6 address will match any address match list entries that match the corresponding IPv4 address.

    This option was introduced to work around a kernel quirk in some operating systems that causes IPv4 TCP connections, such as zone transfers, to be accepted on an IPv6 socket using mapped addresses. This caused address match lists designed for IPv4 to fail to match. However, named now solves this problem internally. The use of this option is discouraged.

    filter-aaaa-on-v4

    This option is only available when BIND 9 is compiled with the --enable-filter-aaaa option on the "configure" command line. It is intended to help the transition from IPv4 to IPv6 by not giving IPv6 addresses to DNS clients unless they have connections to the IPv6 Internet. This is not recommended unless absolutely necessary. The default is no. The filter-aaaa-on-v4 option may also be specified in view statements to override the global filter-aaaa-on-v4 option.

    If yes, the DNS client is at an IPv4 address, in filter-aaaa, and if the response does not include DNSSEC signatures, then all AAAA records are deleted from the response. This filtering applies to all responses and not only authoritative responses.

    If break-dnssec, then AAAA records are deleted even when dnssec is enabled. As suggested by the name, this makes the response not verify, because the DNSSEC protocol is designed detect deletions.

    This mechanism can erroneously cause other servers to not give AAAA records to their clients. A recursing server with both IPv6 and IPv4 network connections that queries an authoritative server using this mechanism via IPv4 will be denied AAAA records even if its client is using IPv6.

    This mechanism is applied to authoritative as well as non-authoritative records. A client using IPv4 that is not allowed recursion can erroneously be given AAAA records because the server is not allowed to check for A records.

    Some AAAA records are given to IPv4 clients in glue records. IPv4 clients that are servers can then erroneously answer requests for AAAA records received via IPv4.

    ixfr-from-differences

    When yes and the server loads a new version of a master zone from its zone file or receives a new version of a slave file via zone transfer, it will compare the new version to the previous one and calculate a set of differences. The differences are then logged in the zone's journal file such that the changes can be transmitted to downstream slaves as an incremental zone transfer.

    By allowing incremental zone transfers to be used for non-dynamic zones, this option saves bandwidth at the expense of increased CPU and memory consumption at the master. In particular, if the new version of a zone is completely different from the previous one, the set of differences will be of a size comparable to the combined size of the old and new zone version, and the server will need to temporarily allocate memory to hold this complete difference set.

    ixfr-from-differences also accepts master and slave at the view and options levels which causes ixfr-from-differences to be enabled for all master or slave zones respectively. It is off by default.

    multi-master

    This should be set when you have multiple masters for a zone and the addresses refer to different machines. If yes, named will not log when the serial number on the master is less than what named currently has. The default is no.

    dnssec-enable

    Enable DNSSEC support in named. Unless set to yes, named behaves as if it does not support DNSSEC. The default is yes.

    dnssec-validation

    Enable DNSSEC validation in named. Note dnssec-enable also needs to be set to yes to be effective. If set to no, DNSSEC validation is disabled. If set to auto, DNSSEC validation is enabled, and a default trust-anchor for the DNS root zone is used. If set to yes, DNSSEC validation is enabled, but a trust anchor must be manually configured using a trusted-keys or managed-keys statement. The default is yes.

    dnssec-accept-expired

    Accept expired signatures when verifying DNSSEC signatures. The default is no. Setting this option to yes leaves named vulnerable to replay attacks.

    querylog

    Specify whether query logging should be started when named starts. If querylog is not specified, then the query logging is determined by the presence of the logging category queries.

    check-names

    This option is used to restrict the character set and syntax of certain domain names in master files and/or DNS responses received from the network. The default varies according to usage area. For master zones the default is fail. For slave zones the default is warn. For answers received from the network (response) the default is ignore.

    The rules for legal hostnames and mail domains are derived from RFC 952 and RFC 821 as modified by RFC 1123.

    check-names applies to the owner names of A, AAAA and MX records. It also applies to the domain names in the RDATA of NS, SOA, MX, and SRV records. It also applies to the RDATA of PTR records where the owner name indicated that it is a reverse lookup of a hostname (the owner name ends in IN-ADDR.ARPA, IP6.ARPA, or IP6.INT).

    check-dup-records

    Check master zones for records that are treated as different by DNSSEC but are semantically equal in plain DNS. The default is to warn. Other possible values are fail and ignore.

    check-mx

    Check whether the MX record appears to refer to a IP address. The default is to warn. Other possible values are fail and ignore.

    check-wildcard

    This option is used to check for non-terminal wildcards. The use of non-terminal wildcards is almost always as a result of a failure to understand the wildcard matching algorithm (RFC 1034). This option affects master zones. The default (yes) is to check for non-terminal wildcards and issue a warning.

    check-integrity

    Perform post load zone integrity checks on master zones. This checks that MX and SRV records refer to address (A or AAAA) records and that glue address records exist for delegated zones. For MX and SRV records only in-zone hostnames are checked (for out-of-zone hostnames use named-checkzone). For NS records only names below top of zone are checked (for out-of-zone names and glue consistency checks use named-checkzone). The default is yes.

    Check that the two forms of Sender Policy Framework records (TXT records starting with "v=spf1" and SPF) either both exist or both don't exist. Warnings are emitted it they don't and be suppressed with check-spf.

    check-mx-cname

    If check-integrity is set then fail, warn or ignore MX records that refer to CNAMES. The default is to warn.

    check-srv-cname

    If check-integrity is set then fail, warn or ignore SRV records that refer to CNAMES. The default is to warn.

    check-sibling

    When performing integrity checks, also check that sibling glue exists. The default is yes.

    check-spf

    When performing integrity checks, check that the two forms of Sender Policy Framwork records (TXT records starting with "v=spf1" and SPF) both exist or both don't exist and issue a warning if not met. The default is warn.

    zero-no-soa-ttl

    When returning authoritative negative responses to SOA queries set the TTL of the SOA record returned in the authority section to zero. The default is yes.

    zero-no-soa-ttl-cache

    When caching a negative response to a SOA query set the TTL to zero. The default is no.

    update-check-ksk

    When set to the default value of yes, check the KSK bit in each key to determine how the key should be used when generating RRSIGs for a secure zone.

    Ordinarily, zone-signing keys (that is, keys without the KSK bit set) are used to sign the entire zone, while key-signing keys (keys with the KSK bit set) are only used to sign the DNSKEY RRset at the zone apex. However, if this option is set to no, then the KSK bit is ignored; KSKs are treated as if they were ZSKs and are used to sign the entire zone. This is similar to the dnssec-signzone -z command line option.

    When this option is set to yes, there must be at least two active keys for every algorithm represented in the DNSKEY RRset: at least one KSK and one ZSK per algorithm. If there is any algorithm for which this requirement is not met, this option will be ignored for that algorithm.

    dnssec-dnskey-kskonly

    When this option and update-check-ksk are both set to yes, only key-signing keys (that is, keys with the KSK bit set) will be used to sign the DNSKEY RRset at the zone apex. Zone-signing keys (keys without the KSK bit set) will be used to sign the remainder of the zone, but not the DNSKEY RRset. This is similar to the dnssec-signzone -x command line option.

    The default is no. If update-check-ksk is set to no, this option is ignored.

    dnssec-loadkeys-interval

    When a zone is configured with auto-dnssec maintain; its key repository must be checked periodically to see if any new keys have been added or any existing keys' timing metadata has been updated (see dnssec-keygen(8) and dnssec-settime(8)). The dnssec-loadkeys-interval option sets the frequency of automatic repository checks, in minutes. The default is 60 (1 hour), the minimum is 1 (1 minute), and the maximum is 1440 (24 hours); any higher value is silently reduced.

    try-tcp-refresh

    Try to refresh the zone using TCP if UDP queries fail. For BIND 8 compatibility, the default is yes.

    dnssec-secure-to-insecure

    Allow a dynamic zone to transition from secure to insecure (i.e., signed to unsigned) by deleting all of the DNSKEY records. The default is no. If set to yes, and if the DNSKEY RRset at the zone apex is deleted, all RRSIG and NSEC records will be removed from the zone as well.

    If the zone uses NSEC3, then it is also necessary to delete the NSEC3PARAM RRset from the zone apex; this will cause the removal of all corresponding NSEC3 records. (It is expected that this requirement will be eliminated in a future release.)

    Note that if a zone has been configured with auto-dnssec maintain and the private keys remain accessible in the key repository, then the zone will be automatically signed again the next time named is started.

    Forwarding

    The forwarding facility can be used to create a large site-wide cache on a few servers, reducing traffic over links to external name servers. It can also be used to allow queries by servers that do not have direct access to the Internet, but wish to look up exterior names anyway. Forwarding occurs only on those queries for which the server is not authoritative and does not have the answer in its cache.

    forward

    This option is only meaningful if the forwarders list is not empty. A value of first, the default, causes the server to query the forwarders first — and if that doesn't answer the question, the server will then look for the answer itself. If only is specified, the server will only query the forwarders.

    forwarders

    Specifies the IP addresses to be used for forwarding. The default is the empty list (no forwarding).

    Forwarding can also be configured on a per-domain basis, allowing for the global forwarding options to be overridden in a variety of ways. You can set particular domains to use different forwarders, or have a different forward only/first behavior, or not forward at all, see the section called “zone Statement Grammar”.

    Dual-stack Servers

    Dual-stack servers are used as servers of last resort to work around problems in reachability due the lack of support for either IPv4 or IPv6 on the host machine.

    dual-stack-servers

    Specifies host names or addresses of machines with access to both IPv4 and IPv6 transports. If a hostname is used, the server must be able to resolve the name using only the transport it has. If the machine is dual stacked, then the dual-stack-servers have no effect unless access to a transport has been disabled on the command line (e.g. named -4).

    Access Control

    Access to the server can be restricted based on the IP address of the requesting system. See the section called “Address Match Lists” for details on how to specify IP address lists.

    allow-notify

    Specifies which hosts are allowed to notify this server, a slave, of zone changes in addition to the zone masters. allow-notify may also be specified in the zone statement, in which case it overrides the options allow-notify statement. It is only meaningful for a slave zone. If not specified, the default is to process notify messages only from a zone's master.

    allow-query

    Specifies which hosts are allowed to ask ordinary DNS questions. allow-query may also be specified in the zone statement, in which case it overrides the options allow-query statement. If not specified, the default is to allow queries from all hosts.

    Note

    allow-query-cache is now used to specify access to the cache.

    allow-query-on

    Specifies which local addresses can accept ordinary DNS questions. This makes it possible, for instance, to allow queries on internal-facing interfaces but disallow them on external-facing ones, without necessarily knowing the internal network's addresses.

    Note that allow-query-on is only checked for queries that are permitted by allow-query. A query must be allowed by both ACLs, or it will be refused.

    allow-query-on may also be specified in the zone statement, in which case it overrides the options allow-query-on statement.

    If not specified, the default is to allow queries on all addresses.

    Note

    allow-query-cache is used to specify access to the cache.

    allow-query-cache

    Specifies which hosts are allowed to get answers from the cache. If allow-query-cache is not set then allow-recursion is used if set, otherwise allow-query is used if set unless recursion no; is set in which case none; is used, otherwise the default (localnets; localhost;) is used.

    allow-query-cache-on

    Specifies which local addresses can give answers from the cache. If not specified, the default is to allow cache queries on any address, localnets and localhost.

    allow-recursion

    Specifies which hosts are allowed to make recursive queries through this server. If allow-recursion is not set then allow-query-cache is used if set, otherwise allow-query is used if set, otherwise the default (localnets; localhost;) is used.

    allow-recursion-on

    Specifies which local addresses can accept recursive queries. If not specified, the default is to allow recursive queries on all addresses.

    allow-update

    Specifies which hosts are allowed to submit Dynamic DNS updates for master zones. The default is to deny updates from all hosts. Note that allowing updates based on the requestor's IP address is insecure; see the section called “Dynamic Update Security” for details.

    allow-update-forwarding

    Specifies which hosts are allowed to submit Dynamic DNS updates to slave zones to be forwarded to the master. The default is { none; }, which means that no update forwarding will be performed. To enable update forwarding, specify allow-update-forwarding { any; };. Specifying values other than { none; } or { any; } is usually counterproductive, since the responsibility for update access control should rest with the master server, not the slaves.

    Note that enabling the update forwarding feature on a slave server may expose master servers relying on insecure IP address based access control to attacks; see the section called “Dynamic Update Security” for more details.

    allow-v6-synthesis

    This option was introduced for the smooth transition from AAAA to A6 and from "nibble labels" to binary labels. However, since both A6 and binary labels were then deprecated, this option was also deprecated. It is now ignored with some warning messages.

    allow-transfer

    Specifies which hosts are allowed to receive zone transfers from the server. allow-transfer may also be specified in the zone statement, in which case it overrides the options allow-transfer statement. If not specified, the default is to allow transfers to all hosts.

    blackhole

    Specifies a list of addresses that the server will not accept queries from or use to resolve a query. Queries from these addresses will not be responded to. The default is none.

    filter-aaaa

    Specifies a list of addresses to which filter-aaaa-on-v4 is applies. The default is any.

    resolver-query-timeout

    The amount of time the resolver will spend attempting to resolve a recursive query before failing. The default and minimum is 10 and the maximum is 30. Setting it to 0 will result in the default being used.

    Interfaces

    The interfaces and ports that the server will answer queries from may be specified using the listen-on option. listen-on takes an optional port and an address_match_list. The server will listen on all interfaces allowed by the address match list. If a port is not specified, port 53 will be used.

    Multiple listen-on statements are allowed. For example,

    listen-on { 5.6.7.8; };
    listen-on port 1234 { !1.2.3.4; 1.2/16; };
    

    will enable the name server on port 53 for the IP address 5.6.7.8, and on port 1234 of an address on the machine in net 1.2 that is not 1.2.3.4.

    If no listen-on is specified, the server will listen on port 53 on all IPv4 interfaces.

    The listen-on-v6 option is used to specify the interfaces and the ports on which the server will listen for incoming queries sent using IPv6.

    When

    { any; }

    is specified as the address_match_list for the listen-on-v6 option, the server does not bind a separate socket to each IPv6 interface address as it does for IPv4 if the operating system has enough API support for IPv6 (specifically if it conforms to RFC 3493 and RFC 3542). Instead, it listens on the IPv6 wildcard address. If the system only has incomplete API support for IPv6, however, the behavior is the same as that for IPv4.

    A list of particular IPv6 addresses can also be specified, in which case the server listens on a separate socket for each specified address, regardless of whether the desired API is supported by the system.

    Multiple listen-on-v6 options can be used. For example,

    listen-on-v6 { any; };
    listen-on-v6 port 1234 { !2001:db8::/32; any; };
    

    will enable the name server on port 53 for any IPv6 addresses (with a single wildcard socket), and on port 1234 of IPv6 addresses that is not in the prefix 2001:db8::/32 (with separate sockets for each matched address.)

    To make the server not listen on any IPv6 address, use

    listen-on-v6 { none; };
    

    If no listen-on-v6 option is specified, the server will not listen on any IPv6 address unless -6 is specified when named is invoked. If -6 is specified then named will listen on port 53 on all IPv6 interfaces by default.

    Query Address

    If the server doesn't know the answer to a question, it will query other name servers. query-source specifies the address and port used for such queries. For queries sent over IPv6, there is a separate query-source-v6 option. If address is * (asterisk) or is omitted, a wildcard IP address (INADDR_ANY) will be used.

    If port is * or is omitted, a random port number from a pre-configured range is picked up and will be used for each query. The port range(s) is that specified in the use-v4-udp-ports (for IPv4) and use-v6-udp-ports (for IPv6) options, excluding the ranges specified in the avoid-v4-udp-ports and avoid-v6-udp-ports options, respectively.

    The defaults of the query-source and query-source-v6 options are:

    query-source address * port *;
    query-source-v6 address * port *;
    

    If use-v4-udp-ports or use-v6-udp-ports is unspecified, named will check if the operating system provides a programming interface to retrieve the system's default range for ephemeral ports. If such an interface is available, named will use the corresponding system default range; otherwise, it will use its own defaults:

    use-v4-udp-ports { range 1024 65535; };
    use-v6-udp-ports { range 1024 65535; };
    

    Note: make sure the ranges be sufficiently large for security. A desirable size depends on various parameters, but we generally recommend it contain at least 16384 ports (14 bits of entropy). Note also that the system's default range when used may be too small for this purpose, and that the range may even be changed while named is running; the new range will automatically be applied when named is reloaded. It is encouraged to configure use-v4-udp-ports and use-v6-udp-ports explicitly so that the ranges are sufficiently large and are reasonably independent from the ranges used by other applications.

    Note: the operational configuration where named runs may prohibit the use of some ports. For example, UNIX systems will not allow named running without a root privilege to use ports less than 1024. If such ports are included in the specified (or detected) set of query ports, the corresponding query attempts will fail, resulting in resolution failures or delay. It is therefore important to configure the set of ports that can be safely used in the expected operational environment.

    The defaults of the avoid-v4-udp-ports and avoid-v6-udp-ports options are:

    avoid-v4-udp-ports {};
    avoid-v6-udp-ports {};
    

    Note: BIND 9.5.0 introduced the use-queryport-pool option to support a pool of such random ports, but this option is now obsolete because reusing the same ports in the pool may not be sufficiently secure. For the same reason, it is generally strongly discouraged to specify a particular port for the query-source or query-source-v6 options; it implicitly disables the use of randomized port numbers.

    use-queryport-pool

    This option is obsolete.

    queryport-pool-ports

    This option is obsolete.

    queryport-pool-updateinterval

    This option is obsolete.

    Note

    The address specified in the query-source option is used for both UDP and TCP queries, but the port applies only to UDP queries. TCP queries always use a random unprivileged port.

    Note

    Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets.

    Note

    See also transfer-source and notify-source.

    Zone Transfers

    BIND has mechanisms in place to facilitate zone transfers and set limits on the amount of load that transfers place on the system. The following options apply to zone transfers.

    also-notify

    Defines a global list of IP addresses of name servers that are also sent NOTIFY messages whenever a fresh copy of the zone is loaded, in addition to the servers listed in the zone's NS records. This helps to ensure that copies of the zones will quickly converge on stealth servers. Optionally, a port may be specified with each also-notify address to send the notify messages to a port other than the default of 53. An optional TSIG key can also be specified with each address to cause the notify messages to be signed; this can be useful when sending notifies to multiple views. In place of explicit addresses, one or more named masters lists can be used.

    If an also-notify list is given in a zone statement, it will override the options also-notify statement. When a zone notify statement is set to no, the IP addresses in the global also-notify list will not be sent NOTIFY messages for that zone. The default is the empty list (no global notification list).

    max-transfer-time-in

    Inbound zone transfers running longer than this many minutes will be terminated. The default is 120 minutes (2 hours). The maximum value is 28 days (40320 minutes).

    max-transfer-idle-in

    Inbound zone transfers making no progress in this many minutes will be terminated. The default is 60 minutes (1 hour). The maximum value is 28 days (40320 minutes).

    max-transfer-time-out

    Outbound zone transfers running longer than this many minutes will be terminated. The default is 120 minutes (2 hours). The maximum value is 28 days (40320 minutes).

    max-transfer-idle-out

    Outbound zone transfers making no progress in this many minutes will be terminated. The default is 60 minutes (1 hour). The maximum value is 28 days (40320 minutes).

    serial-query-rate

    Slave servers will periodically query master servers to find out if zone serial numbers have changed. Each such query uses a minute amount of the slave server's network bandwidth. To limit the amount of bandwidth used, BIND 9 limits the rate at which queries are sent. The value of the serial-query-rate option, an integer, is the maximum number of queries sent per second. The default is 20.

    In addition to controlling the rate SOA refresh queries are issued at serial-query-rate also controls the rate at which NOTIFY messages are sent from both master and slave zones.

    serial-queries

    In BIND 8, the serial-queries option set the maximum number of concurrent serial number queries allowed to be outstanding at any given time. BIND 9 does not limit the number of outstanding serial queries and ignores the serial-queries option. Instead, it limits the rate at which the queries are sent as defined using the serial-query-rate option.

    transfer-format

    Zone transfers can be sent using two different formats, one-answer and many-answers. The transfer-format option is used on the master server to determine which format it sends. one-answer uses one DNS message per resource record transferred. many-answers packs as many resource records as possible into a message. many-answers is more efficient, but is only supported by relatively new slave servers, such as BIND 9, BIND 8.x and BIND 4.9.5 onwards. The many-answers format is also supported by recent Microsoft Windows nameservers. The default is many-answers. transfer-format may be overridden on a per-server basis by using the server statement.

    transfers-in

    The maximum number of inbound zone transfers that can be running concurrently. The default value is 10. Increasing transfers-in may speed up the convergence of slave zones, but it also may increase the load on the local system.

    transfers-out

    The maximum number of outbound zone transfers that can be running concurrently. Zone transfer requests in excess of the limit will be refused. The default value is 10.

    transfers-per-ns

    The maximum number of inbound zone transfers that can be concurrently transferring from a given remote name server. The default value is 2. Increasing transfers-per-ns may speed up the convergence of slave zones, but it also may increase the load on the remote name server. transfers-per-ns may be overridden on a per-server basis by using the transfers phrase of the server statement.

    transfer-source

    transfer-source determines which local address will be bound to IPv4 TCP connections used to fetch zones transferred inbound by the server. It also determines the source IPv4 address, and optionally the UDP port, used for the refresh queries and forwarded dynamic updates. If not set, it defaults to a system controlled value which will usually be the address of the interface "closest to" the remote end. This address must appear in the remote end's allow-transfer option for the zone being transferred, if one is specified. This statement sets the transfer-source for all zones, but can be overridden on a per-view or per-zone basis by including a transfer-source statement within the view or zone block in the configuration file.

    Note

    Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets.

    transfer-source-v6

    The same as transfer-source, except zone transfers are performed using IPv6.

    alt-transfer-source

    An alternate transfer source if the one listed in transfer-source fails and use-alt-transfer-source is set.

    Note

    If you do not wish the alternate transfer source to be used, you should set use-alt-transfer-source appropriately and you should not depend upon getting an answer back to the first refresh query.
    alt-transfer-source-v6

    An alternate transfer source if the one listed in transfer-source-v6 fails and use-alt-transfer-source is set.

    use-alt-transfer-source

    Use the alternate transfer sources or not. If views are specified this defaults to no otherwise it defaults to yes (for BIND 8 compatibility).

    notify-source

    notify-source determines which local source address, and optionally UDP port, will be used to send NOTIFY messages. This address must appear in the slave server's masters zone clause or in an allow-notify clause. This statement sets the notify-source for all zones, but can be overridden on a per-zone or per-view basis by including a notify-source statement within the zone or view block in the configuration file.

    Note

    Solaris 2.5.1 and earlier does not support setting the source address for TCP sockets.

    notify-source-v6

    Like notify-source, but applies to notify messages sent to IPv6 addresses.

    UDP Port Lists

    use-v4-udp-ports, avoid-v4-udp-ports, use-v6-udp-ports, and avoid-v6-udp-ports specify a list of IPv4 and IPv6 UDP ports that will be used or not used as source ports for UDP messages. See the section called “Query Address” about how the available ports are determined. For example, with the following configuration

    use-v6-udp-ports { range 32768 65535; };
    avoid-v6-udp-ports { 40000; range 50000 60000; };
    

    UDP ports of IPv6 messages sent from named will be in one of the following ranges: 32768 to 39999, 40001 to 49999, and 60001 to 65535.

    avoid-v4-udp-ports and avoid-v6-udp-ports can be used to prevent named from choosing as its random source port a port that is blocked by your firewall or a port that is used by other applications; if a query went out with a source port blocked by a firewall, the answer would not get by the firewall and the name server would have to query again. Note: the desired range can also be represented only with use-v4-udp-ports and use-v6-udp-ports, and the avoid- options are redundant in that sense; they are provided for backward compatibility and to possibly simplify the port specification.

    Operating System Resource Limits

    The server's usage of many system resources can be limited. Scaled values are allowed when specifying resource limits. For example, 1G can be used instead of 1073741824 to specify a limit of one gigabyte. unlimited requests unlimited use, or the maximum available amount. default uses the limit that was in force when the server was started. See the description of size_spec in the section called “Configuration File Elements”.

    The following options set operating system resource limits for the name server process. Some operating systems don't support some or any of the limits. On such systems, a warning will be issued if the unsupported limit is used.

    coresize

    The maximum size of a core dump. The default is default.

    datasize

    The maximum amount of data memory the server may use. The default is default. This is a hard limit on server memory usage. If the server attempts to allocate memory in excess of this limit, the allocation will fail, which may in turn leave the server unable to perform DNS service. Therefore, this option is rarely useful as a way of limiting the amount of memory used by the server, but it can be used to raise an operating system data size limit that is too small by default. If you wish to limit the amount of memory used by the server, use the max-cache-size and recursive-clients options instead.

    files

    The maximum number of files the server may have open concurrently. The default is unlimited.

    stacksize

    The maximum amount of stack memory the server may use. The default is default.

    Server Resource Limits

    The following options set limits on the server's resource consumption that are enforced internally by the server rather than the operating system.

    max-ixfr-log-size

    This option is obsolete; it is accepted and ignored for BIND 8 compatibility. The option max-journal-size performs a similar function in BIND 9.

    max-journal-size

    Sets a maximum size for each journal file (see the section called “The journal file”). When the journal file approaches the specified size, some of the oldest transactions in the journal will be automatically removed. The largest permitted value is 2 gigabytes. The default is unlimited, which also means 2 gigabytes. This may also be set on a per-zone basis.

    host-statistics-max

    In BIND 8, specifies the maximum number of host statistics entries to be kept. Not implemented in BIND 9.

    recursive-clients

    The maximum number of simultaneous recursive lookups the server will perform on behalf of clients. The default is 1000. Because each recursing client uses a fair bit of memory, on the order of 20 kilobytes, the value of the recursive-clients option may have to be decreased on hosts with limited memory.

    tcp-clients

    The maximum number of simultaneous client TCP connections that the server will accept. The default is 100.

    reserved-sockets

    The number of file descriptors reserved for TCP, stdio, etc. This needs to be big enough to cover the number of interfaces named listens on, tcp-clients as well as to provide room for outgoing TCP queries and incoming zone transfers. The default is 512. The minimum value is 128 and the maximum value is 128 less than maxsockets (-S). This option may be removed in the future.

    This option has little effect on Windows.

    max-cache-size

    The maximum amount of memory to use for the server's cache, in bytes. When the amount of data in the cache reaches this limit, the server will cause records to expire prematurely based on an LRU based strategy so that the limit is not exceeded. A value of 0 is special, meaning that records are purged from the cache only when their TTLs expire. Another special keyword unlimited means the maximum value of 32-bit unsigned integers (0xffffffff), which may not have the same effect as 0 on machines that support more than 32 bits of memory space. Any positive values less than 2MB will be ignored reset to 2MB. In a server with multiple views, the limit applies separately to the cache of each view. The default is 0.

    tcp-listen-queue

    The listen queue depth. The default and minimum is 10. If the kernel supports the accept filter "dataready" this also controls how many TCP connections that will be queued in kernel space waiting for some data before being passed to accept. Nonzero values less than 10 will be silently raised. A value of 0 may also be used; on most platforms this sets the listen queue length to a system-defined default value.

    Periodic Task Intervals

    cleaning-interval

    This interval is effectively obsolete. Previously, the server would remove expired resource records from the cache every cleaning-interval minutes. BIND 9 now manages cache memory in a more sophisticated manner and does not rely on the periodic cleaning any more. Specifying this option therefore has no effect on the server's behavior.

    heartbeat-interval

    The server will perform zone maintenance tasks for all zones marked as dialup whenever this interval expires. The default is 60 minutes. Reasonable values are up to 1 day (1440 minutes). The maximum value is 28 days (40320 minutes). If set to 0, no zone maintenance for these zones will occur.

    interface-interval

    The server will scan the network interface list every interface-interval minutes. The default is 60 minutes. The maximum value is 28 days (40320 minutes). If set to 0, interface scanning will only occur when the configuration file is loaded. After the scan, the server will begin listening for queries on any newly discovered interfaces (provided they are allowed by the listen-on configuration), and will stop listening on interfaces that have gone away.

    statistics-interval

    Name server statistics will be logged every statistics-interval minutes. The default is 60. The maximum value is 28 days (40320 minutes). If set to 0, no statistics will be logged.

    Note

    Not yet implemented in BIND 9.

    Topology

    All other things being equal, when the server chooses a name server to query from a list of name servers, it prefers the one that is topologically closest to itself. The topology statement takes an address_match_list and interprets it in a special way. Each top-level list element is assigned a distance. Non-negated elements get a distance based on their position in the list, where the closer the match is to the start of the list, the shorter the distance is between it and the server. A negated match will be assigned the maximum distance from the server. If there is no match, the address will get a distance which is further than any non-negated list element, and closer than any negated element. For example,

    topology {
        10/8;
        !1.2.3/24;
        { 1.2/16; 3/8; };
    };

    will prefer servers on network 10 the most, followed by hosts on network 1.2.0.0 (netmask 255.255.0.0) and network 3, with the exception of hosts on network 1.2.3 (netmask 255.255.255.0), which is preferred least of all.

    The default topology is

        topology { localhost; localnets; };
    

    Note

    The topology option is not implemented in BIND 9.

    The sortlist Statement

    The response to a DNS query may consist of multiple resource records (RRs) forming a resource records set (RRset). The name server will normally return the RRs within the RRset in an indeterminate order (but see the rrset-order statement in the section called “RRset Ordering”). The client resolver code should rearrange the RRs as appropriate, that is, using any addresses on the local net in preference to other addresses. However, not all resolvers can do this or are correctly configured. When a client is using a local server, the sorting can be performed in the server, based on the client's address. This only requires configuring the name servers, not all the clients.

    The sortlist statement (see below) takes an address_match_list and interprets it even more specifically than the topology statement does (the section called “Topology”). Each top level statement in the sortlist must itself be an explicit address_match_list with one or two elements. The first element (which may be an IP address, an IP prefix, an ACL name or a nested address_match_list) of each top level list is checked against the source address of the query until a match is found.

    Once the source address of the query has been matched, if the top level statement contains only one element, the actual primitive element that matched the source address is used to select the address in the response to move to the beginning of the response. If the statement is a list of two elements, then the second element is treated the same as the address_match_list in a topology statement. Each top level element is assigned a distance and the address in the response with the minimum distance is moved to the beginning of the response.

    In the following example, any queries received from any of the addresses of the host itself will get responses preferring addresses on any of the locally connected networks. Next most preferred are addresses on the 192.168.1/24 network, and after that either the 192.168.2/24 or 192.168.3/24 network with no preference shown between these two networks. Queries received from a host on the 192.168.1/24 network will prefer other addresses on that network to the 192.168.2/24 and 192.168.3/24 networks. Queries received from a host on the 192.168.4/24 or the 192.168.5/24 network will only prefer other addresses on their directly connected networks.

    sortlist {
        // IF the local host
        // THEN first fit on the following nets
        { localhost;
            { localnets;
                192.168.1/24;
                { 192.168.2/24; 192.168.3/24; }; }; };
        // IF on class C 192.168.1 THEN use .1, or .2 or .3
        { 192.168.1/24;
            { 192.168.1/24;
                { 192.168.2/24; 192.168.3/24; }; }; };
        // IF on class C 192.168.2 THEN use .2, or .1 or .3
        { 192.168.2/24;
            { 192.168.2/24;
                { 192.168.1/24; 192.168.3/24; }; }; };
        // IF on class C 192.168.3 THEN use .3, or .1 or .2
        { 192.168.3/24;
            { 192.168.3/24;
                { 192.168.1/24; 192.168.2/24; }; }; };
        // IF .4 or .5 THEN prefer that net
        { { 192.168.4/24; 192.168.5/24; };
        };
    };

    The following example will give reasonable behavior for the local host and hosts on directly connected networks. It is similar to the behavior of the address sort in BIND 4.9.x. Responses sent to queries from the local host will favor any of the directly connected networks. Responses sent to queries from any other hosts on a directly connected network will prefer addresses on that same network. Responses to other queries will not be sorted.

    sortlist {
               { localhost; localnets; };
               { localnets; };
    };
    

    RRset Ordering

    When multiple records are returned in an answer it may be useful to configure the order of the records placed into the response. The rrset-order statement permits configuration of the ordering of the records in a multiple record response. See also the sortlist statement, the section called “The sortlist Statement”.

    An order_spec is defined as follows:

    [class class_name] [type type_name] [name "domain_name"] order ordering

    If no class is specified, the default is ANY. If no type is specified, the default is ANY. If no name is specified, the default is "*" (asterisk).

    The legal values for ordering are:

    fixed

    Records are returned in the order they are defined in the zone file.

    random

    Records are returned in some random order.

    cyclic

    Records are returned in a cyclic round-robin order.

    If BIND is configured with the "--enable-fixed-rrset" option at compile time, then the initial ordering of the RRset will match the one specified in the zone file.

    For example:

    rrset-order {
       class IN type A name "host.example.com" order random;
       order cyclic;
    };
    

    will cause any responses for type A records in class IN that have "host.example.com" as a suffix, to always be returned in random order. All other records are returned in cyclic order.

    If multiple rrset-order statements appear, they are not combined — the last one applies.

    By default, all records are returned in random order.

    Note

    In this release of BIND 9, the rrset-order statement does not support "fixed" ordering by default. Fixed ordering can be enabled at compile time by specifying "--enable-fixed-rrset" on the "configure" command line.

    Tuning

    lame-ttl

    Sets the number of seconds to cache a lame server indication. 0 disables caching. (This is NOT recommended.) The default is 600 (10 minutes) and the maximum value is 1800 (30 minutes).

    Lame-ttl also controls the amount of time DNSSEC validation failures are cached. There is a minimum of 30 seconds applied to bad cache entries if the lame-ttl is set to less than 30 seconds.

    max-ncache-ttl

    To reduce network traffic and increase performance, the server stores negative answers. max-ncache-ttl is used to set a maximum retention time for these answers in the server in seconds. The default max-ncache-ttl is 10800 seconds (3 hours). max-ncache-ttl cannot exceed 7 days and will be silently truncated to 7 days if set to a greater value.

    max-cache-ttl

    Sets the maximum time for which the server will cache ordinary (positive) answers. The default is one week (7 days). A value of zero may cause all queries to return SERVFAIL, because of lost caches of intermediate RRsets (such as NS and glue AAAA/A records) in the resolution process.

    min-roots

    The minimum number of root servers that is required for a request for the root servers to be accepted. The default is 2.

    Note

    Not implemented in BIND 9.

    sig-validity-interval

    Specifies the number of days into the future when DNSSEC signatures automatically generated as a result of dynamic updates (the section called “Dynamic Update”) will expire. There is an optional second field which specifies how long before expiry that the signatures will be regenerated. If not specified, the signatures will be regenerated at 1/4 of base interval. The second field is specified in days if the base interval is greater than 7 days otherwise it is specified in hours. The default base interval is 30 days giving a re-signing interval of 7 1/2 days. The maximum values are 10 years (3660 days).

    The signature inception time is unconditionally set to one hour before the current time to allow for a limited amount of clock skew.

    The sig-validity-interval should be, at least, several multiples of the SOA expire interval to allow for reasonable interaction between the various timer and expiry dates.

    sig-signing-nodes

    Specify the maximum number of nodes to be examined in each quantum when signing a zone with a new DNSKEY. The default is 100.

    sig-signing-signatures

    Specify a threshold number of signatures that will terminate processing a quantum when signing a zone with a new DNSKEY. The default is 10.

    sig-signing-type

    Specify a private RDATA type to be used when generating key signing records. The default is 65534.

    It is expected that this parameter may be removed in a future version once there is a standard type.

    These records can be removed from the zone once named has completed signing the zone with the matching key using nsupdate or rndc signing -clear. rndc signing -clear is the only supported way to remove these records from inline-signing zones.

    min-refresh-time, max-refresh-time, min-retry-time, max-retry-time

    These options control the server's behavior on refreshing a zone (querying for SOA changes) or retrying failed transfers. Usually the SOA values for the zone are used, but these values are set by the master, giving slave server administrators little control over their contents.

    These options allow the administrator to set a minimum and maximum refresh and retry time either per-zone, per-view, or globally. These options are valid for slave and stub zones, and clamp the SOA refresh and retry times to the specified values.

    The following defaults apply. min-refresh-time 300 seconds, max-refresh-time 2419200 seconds (4 weeks), min-retry-time 500 seconds, and max-retry-time 1209600 seconds (2 weeks).

    edns-udp-size

    Sets the advertised EDNS UDP buffer size in bytes to control the size of packets received. Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting edns-udp-size to a non-default value is to get UDP answers to pass through broken firewalls that block fragmented packets and/or block UDP packets that are greater than 512 bytes.

    named will fallback to using 512 bytes if it get a series of timeout at the initial value. 512 bytes is not being offered to encourage sites to fix their firewalls. Small EDNS UDP sizes will result in the excessive use of TCP.

    max-udp-size

    Sets the maximum EDNS UDP message size named will send in bytes. Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting max-udp-size to a non-default value is to get UDP answers to pass through broken firewalls that block fragmented packets and/or block UDP packets that are greater than 512 bytes. This is independent of the advertised receive buffer (edns-udp-size).

    Setting this to a low value will encourage additional TCP traffic to the nameserver.

    masterfile-format

    Specifies the file format of zone files (see the section called “Additional File Formats”). The default value is text, which is the standard textual representation, except for slave zones, in which the default value is raw. Files in other formats than text are typically expected to be generated by the named-compilezone tool, or dumped by named.

    Note that when a zone file in a different format than text is loaded, named may omit some of the checks which would be performed for a file in the text format. In particular, check-names checks do not apply for the raw format. This means a zone file in the raw format must be generated with the same check level as that specified in the named configuration file. This statement sets the masterfile-format for all zones, but can be overridden on a per-zone or per-view basis by including a masterfile-format statement within the zone or view block in the configuration file.

    clients-per-query, max-clients-per-query

    These set the initial value (minimum) and maximum number of recursive simultaneous clients for any given query (<qname,qtype,qclass>) that the server will accept before dropping additional clients. named will attempt to self tune this value and changes will be logged. The default values are 10 and 100.

    This value should reflect how many queries come in for a given name in the time it takes to resolve that name. If the number of queries exceed this value, named will assume that it is dealing with a non-responsive zone and will drop additional queries. If it gets a response after dropping queries, it will raise the estimate. The estimate will then be lowered in 20 minutes if it has remained unchanged.

    If clients-per-query is set to zero, then there is no limit on the number of clients per query and no queries will be dropped.

    If max-clients-per-query is set to zero, then there is no upper bound other than imposed by recursive-clients.

    notify-delay

    The delay, in seconds, between sending sets of notify messages for a zone. The default is five (5) seconds.

    The overall rate that NOTIFY messages are sent for all zones is controlled by serial-query-rate.

    max-rsa-exponent-size

    The maximum RSA exponent size, in bits, that will be accepted when validating. Valid values are 35 to 4096 bits. The default zero (0) is also accepted and is equivalent to 4096.

    Built-in server information zones

    The server provides some helpful diagnostic information through a number of built-in zones under the pseudo-top-level-domain bind in the CHAOS class. These zones are part of a built-in view (see the section called “view Statement Grammar”) of class CHAOS which is separate from the default view of class IN. Most global configuration options (allow-query, etc) will apply to this view, but some are locally overridden: notify, recursion and allow-new-zones are always set to no.

    If you need to disable these zones, use the options below, or hide the built-in CHAOS view by defining an explicit view of class CHAOS that matches all clients.

    version

    The version the server should report via a query of the name version.bind with type TXT, class CHAOS. The default is the real version number of this server. Specifying version none disables processing of the queries.

    hostname

    The hostname the server should report via a query of the name hostname.bind with type TXT, class CHAOS. This defaults to the hostname of the machine hosting the name server as found by the gethostname() function. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying hostname none; disables processing of the queries.

    server-id

    The ID the server should report when receiving a Name Server Identifier (NSID) query, or a query of the name ID.SERVER with type TXT, class CHAOS. The primary purpose of such queries is to identify which of a group of anycast servers is actually answering your queries. Specifying server-id none; disables processing of the queries. Specifying server-id hostname; will cause named to use the hostname as found by the gethostname() function. The default server-id is none.

    Built-in Empty Zones

    Named has some built-in empty zones (SOA and NS records only). These are for zones that should normally be answered locally and which queries should not be sent to the Internet's root servers. The official servers which cover these namespaces return NXDOMAIN responses to these queries. In particular, these cover the reverse namespaces for addresses from RFC 1918, RFC 4193, RFC 5737 and RFC 6598. They also include the reverse namespace for IPv6 local address (locally assigned), IPv6 link local addresses, the IPv6 loopback address and the IPv6 unknown address.

    Named will attempt to determine if a built-in zone already exists or is active (covered by a forward-only forwarding declaration) and will not create an empty zone in that case.

    The current list of empty zones is:

    • 10.IN-ADDR.ARPA
    • 16.172.IN-ADDR.ARPA
    • 17.172.IN-ADDR.ARPA
    • 18.172.IN-ADDR.ARPA
    • 19.172.IN-ADDR.ARPA
    • 20.172.IN-ADDR.ARPA
    • 21.172.IN-ADDR.ARPA
    • 22.172.IN-ADDR.ARPA
    • 23.172.IN-ADDR.ARPA
    • 24.172.IN-ADDR.ARPA
    • 25.172.IN-ADDR.ARPA
    • 26.172.IN-ADDR.ARPA
    • 27.172.IN-ADDR.ARPA
    • 28.172.IN-ADDR.ARPA
    • 29.172.IN-ADDR.ARPA
    • 30.172.IN-ADDR.ARPA
    • 31.172.IN-ADDR.ARPA
    • 168.192.IN-ADDR.ARPA
    • 64.100.IN-ADDR.ARPA
    • 65.100.IN-ADDR.ARPA
    • 66.100.IN-ADDR.ARPA
    • 67.100.IN-ADDR.ARPA
    • 68.100.IN-ADDR.ARPA
    • 69.100.IN-ADDR.ARPA
    • 70.100.IN-ADDR.ARPA
    • 71.100.IN-ADDR.ARPA
    • 72.100.IN-ADDR.ARPA
    • 73.100.IN-ADDR.ARPA
    • 74.100.IN-ADDR.ARPA
    • 75.100.IN-ADDR.ARPA
    • 76.100.IN-ADDR.ARPA
    • 77.100.IN-ADDR.ARPA
    • 78.100.IN-ADDR.ARPA
    • 79.100.IN-ADDR.ARPA
    • 80.100.IN-ADDR.ARPA
    • 81.100.IN-ADDR.ARPA
    • 82.100.IN-ADDR.ARPA
    • 83.100.IN-ADDR.ARPA
    • 84.100.IN-ADDR.ARPA
    • 85.100.IN-ADDR.ARPA
    • 86.100.IN-ADDR.ARPA
    • 87.100.IN-ADDR.ARPA
    • 88.100.IN-ADDR.ARPA
    • 89.100.IN-ADDR.ARPA
    • 90.100.IN-ADDR.ARPA
    • 91.100.IN-ADDR.ARPA
    • 92.100.IN-ADDR.ARPA
    • 93.100.IN-ADDR.ARPA
    • 94.100.IN-ADDR.ARPA
    • 95.100.IN-ADDR.ARPA
    • 96.100.IN-ADDR.ARPA
    • 97.100.IN-ADDR.ARPA
    • 98.100.IN-ADDR.ARPA
    • 99.100.IN-ADDR.ARPA
    • 100.100.IN-ADDR.ARPA
    • 101.100.IN-ADDR.ARPA
    • 102.100.IN-ADDR.ARPA
    • 103.100.IN-ADDR.ARPA
    • 104.100.IN-ADDR.ARPA
    • 105.100.IN-ADDR.ARPA
    • 106.100.IN-ADDR.ARPA
    • 107.100.IN-ADDR.ARPA
    • 108.100.IN-ADDR.ARPA
    • 109.100.IN-ADDR.ARPA
    • 110.100.IN-ADDR.ARPA
    • 111.100.IN-ADDR.ARPA
    • 112.100.IN-ADDR.ARPA
    • 113.100.IN-ADDR.ARPA
    • 114.100.IN-ADDR.ARPA
    • 115.100.IN-ADDR.ARPA
    • 116.100.IN-ADDR.ARPA
    • 117.100.IN-ADDR.ARPA
    • 118.100.IN-ADDR.ARPA
    • 119.100.IN-ADDR.ARPA
    • 120.100.IN-ADDR.ARPA
    • 121.100.IN-ADDR.ARPA
    • 122.100.IN-ADDR.ARPA
    • 123.100.IN-ADDR.ARPA
    • 124.100.IN-ADDR.ARPA
    • 125.100.IN-ADDR.ARPA
    • 126.100.IN-ADDR.ARPA
    • 127.100.IN-ADDR.ARPA
    • 0.IN-ADDR.ARPA
    • 127.IN-ADDR.ARPA
    • 254.169.IN-ADDR.ARPA
    • 2.0.192.IN-ADDR.ARPA
    • 100.51.198.IN-ADDR.ARPA
    • 113.0.203.IN-ADDR.ARPA
    • 255.255.255.255.IN-ADDR.ARPA
    • 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
    • 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
    • 8.B.D.0.1.0.0.2.IP6.ARPA
    • D.F.IP6.ARPA
    • 8.E.F.IP6.ARPA
    • 9.E.F.IP6.ARPA
    • A.E.F.IP6.ARPA
    • B.E.F.IP6.ARPA

    Empty zones are settable at the view level and only apply to views of class IN. Disabled empty zones are only inherited from options if there are no disabled empty zones specified at the view level. To override the options list of disabled zones, you can disable the root zone at the view level, for example:

                disable-empty-zone ".";
    

    If you are using the address ranges covered here, you should already have reverse zones covering the addresses you use. In practice this appears to not be the case with many queries being made to the infrastructure servers for names in these spaces. So many in fact that sacrificial servers were needed to be deployed to channel the query load away from the infrastructure servers.

    Note

    The real parent servers for these zones should disable all empty zone under the parent zone they serve. For the real root servers, this is all built-in empty zones. This will enable them to return referrals to deeper in the tree.
    empty-server

    Specify what server name will appear in the returned SOA record for empty zones. If none is specified, then the zone's name will be used.

    empty-contact

    Specify what contact name will appear in the returned SOA record for empty zones. If none is specified, then "." will be used.

    empty-zones-enable

    Enable or disable all empty zones. By default, they are enabled.

    disable-empty-zone

    Disable individual empty zones. By default, none are disabled. This option can be specified multiple times.

    Additional Section Caching

    The additional section cache, also called acache, is an internal cache to improve the response performance of BIND 9. When additional section caching is enabled, BIND 9 will cache an internal short-cut to the additional section content for each answer RR. Note that acache is an internal caching mechanism of BIND 9, and is not related to the DNS caching server function.

    Additional section caching does not change the response content (except the RRsets ordering of the additional section, see below), but can improve the response performance significantly. It is particularly effective when BIND 9 acts as an authoritative server for a zone that has many delegations with many glue RRs.

    In order to obtain the maximum performance improvement from additional section caching, setting additional-from-cache to no is recommended, since the current implementation of acache does not short-cut of additional section information from the DNS cache data.

    One obvious disadvantage of acache is that it requires much more memory for the internal cached data. Thus, if the response performance does not matter and memory consumption is much more critical, the acache mechanism can be disabled by setting acache-enable to no. It is also possible to specify the upper limit of memory consumption for acache by using max-acache-size.

    Additional section caching also has a minor effect on the RRset ordering in the additional section. Without acache, cyclic order is effective for the additional section as well as the answer and authority sections. However, additional section caching fixes the ordering when it first caches an RRset for the additional section, and the same ordering will be kept in succeeding responses, regardless of the setting of rrset-order. The effect of this should be minor, however, since an RRset in the additional section typically only contains a small number of RRs (and in many cases it only contains a single RR), in which case the ordering does not matter much.

    The following is a summary of options related to acache.

    acache-enable

    If yes, additional section caching is enabled. The default value is no.

    acache-cleaning-interval

    The server will remove stale cache entries, based on an LRU based algorithm, every acache-cleaning-interval minutes. The default is 60 minutes. If set to 0, no periodic cleaning will occur.

    max-acache-size

    The maximum amount of memory in bytes to use for the server's acache. When the amount of data in the acache reaches this limit, the server will clean more aggressively so that the limit is not exceeded. In a server with multiple views, the limit applies separately to the acache of each view. The default is 16M.

    Content Filtering

    BIND 9 provides the ability to filter out DNS responses from external DNS servers containing certain types of data in the answer section. Specifically, it can reject address (A or AAAA) records if the corresponding IPv4 or IPv6 addresses match the given address_match_list of the deny-answer-addresses option. It can also reject CNAME or DNAME records if the "alias" name (i.e., the CNAME alias or the substituted query name due to DNAME) matches the given namelist of the deny-answer-aliases option, where "match" means the alias name is a subdomain of one of the name_list elements. If the optional namelist is specified with except-from, records whose query name matches the list will be accepted regardless of the filter setting. Likewise, if the alias name is a subdomain of the corresponding zone, the deny-answer-aliases filter will not apply; for example, even if "example.com" is specified for deny-answer-aliases,

    www.example.com. CNAME xxx.example.com.

    returned by an "example.com" server will be accepted.

    In the address_match_list of the deny-answer-addresses option, only ip_addr and ip_prefix are meaningful; any key_id will be silently ignored.

    If a response message is rejected due to the filtering, the entire message is discarded without being cached, and a SERVFAIL error will be returned to the client.

    This filtering is intended to prevent "DNS rebinding attacks," in which an attacker, in response to a query for a domain name the attacker controls, returns an IP address within your own network or an alias name within your own domain. A naive web browser or script could then serve as an unintended proxy, allowing the attacker to get access to an internal node of your local network that couldn't be externally accessed otherwise. See the paper available at http://portal.acm.org/citation.cfm?id=1315245.1315298 for more details about the attacks.

    For example, if you own a domain named "example.net" and your internal network uses an IPv4 prefix 192.0.2.0/24, you might specify the following rules:

    deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; };
    deny-answer-aliases { "example.net"; };
    

    If an external attacker lets a web browser in your local network look up an IPv4 address of "attacker.example.com", the attacker's DNS server would return a response like this:

    attacker.example.com. A 192.0.2.1

    in the answer section. Since the rdata of this record (the IPv4 address) matches the specified prefix 192.0.2.0/24, this response will be ignored.

    On the other hand, if the browser looks up a legitimate internal web server "www.example.net" and the following response is returned to the BIND 9 server

    www.example.net. A 192.0.2.2

    it will be accepted since the owner name "www.example.net" matches the except-from element, "example.net".

    Note that this is not really an attack on the DNS per se. In fact, there is nothing wrong for an "external" name to be mapped to your "internal" IP address or domain name from the DNS point of view. It might actually be provided for a legitimate purpose, such as for debugging. As long as the mapping is provided by the correct owner, it is not possible or does not make sense to detect whether the intent of the mapping is legitimate or not within the DNS. The "rebinding" attack must primarily be protected at the application that uses the DNS. For a large site, however, it may be difficult to protect all possible applications at once. This filtering feature is provided only to help such an operational environment; it is generally discouraged to turn it on unless you are very sure you have no other choice and the attack is a real threat for your applications.

    Care should be particularly taken if you want to use this option for addresses within 127.0.0.0/8. These addresses are obviously "internal", but many applications conventionally rely on a DNS mapping from some name to such an address. Filtering out DNS records containing this address spuriously can break such applications.

    Response Policy Zone (RPZ) Rewriting

    BIND 9 includes a limited mechanism to modify DNS responses for requests analogous to email anti-spam DNS blacklists. Responses can be changed to deny the existence of domains(NXDOMAIN), deny the existence of IP addresses for domains (NODATA), or contain other IP addresses or data.

    Response policy zones are named in the response-policy option for the view or among the global options if there is no response-policy option for the view. RPZs are ordinary DNS zones containing RRsets that can be queried normally if allowed. It is usually best to restrict those queries with something like allow-query { localhost; };.

    Four policy triggers are encoded in RPZ records, QNAME, IP, NSIP, and NSDNAME. QNAME RPZ records triggered by query names of requests and targets of CNAME records resolved to generate the response. The owner name of a QNAME RPZ record is the query name relativized to the RPZ.

    The second kind of RPZ trigger is an IP address in an A and AAAA record in the ANSWER section of a response. IP address triggers are encoded in records that have owner names that are subdomains of rpz-ip relativized to the RPZ origin name and encode an IP address or address block. IPv4 trigger addresses are represented as prefixlength.B4.B3.B2.B1.rpz-ip. The prefix length must be between 1 and 32. All four bytes, B4, B3, B2, and B1, must be present. B4 is the decimal value of the least significant byte of the IPv4 address as in IN-ADDR.ARPA. IPv6 addresses are encoded in a format similar to the standard IPv6 text representation, prefixlength.W8.W7.W6.W5.W4.W3.W2.W1.rpz-ip. Each of W8,...,W1 is a one to four digit hexadecimal number representing 16 bits of the IPv6 address as in the standard text representation of IPv6 addresses, but reversed as in IN-ADDR.ARPA. All 8 words must be present except when consecutive zero words are replaced with .zz. analogous to double colons (::) in standard IPv6 text encodings. The prefix length must be between 1 and 128.

    NSDNAME triggers match names of authoritative servers for the query name, a parent of the query name, a CNAME for query name, or a parent of a CNAME. They are encoded as subdomains of rpz-nsdomain relativized to the RPZ origin name. NSIP triggers match IP addresses in A and AAAA RRsets for domains that can be checked against NSDNAME policy records. NSIP triggers are encoded like IP triggers except as subdomains of rpz-nsip. NSDNAME and NSIP triggers are checked only for names with at least min-ns-dots dots. The default value of min-ns-dots is 1 to exclude top level domains.

    The query response is checked against all RPZs, so two or more policy records can be triggered by a response. Because DNS responses can be rewritten according to at most one policy record, a single record encoding an action (other than DISABLED actions) must be chosen. Triggers or the records that encode them are chosen in the following order:

    • Choose the triggered record in the zone that appears first in the response-policy option.
    • Prefer QNAME to IP to NSDNAME to NSIP triggers in a single zone.
    • Among NSDNAME triggers, prefer the trigger that matches the smallest name under the DNSSEC ordering.
    • Among IP or NSIP triggers, prefer the trigger with the longest prefix.
    • Among triggers with the same prefex length, prefer the IP or NSIP trigger that matches the smallest IP address.

    When the processing of a response is restarted to resolve DNAME or CNAME records and a policy record set has not been triggered, all RPZs are again consulted for the DNAME or CNAME names and addresses.

    RPZ record sets are sets of any types of DNS record except DNAME or DNSSEC that encode actions or responses to queries.

    • The NXDOMAIN response is encoded by a CNAME whose target is the root domain (.)
    • A CNAME whose target is the wildcard top-level domain (*.) specifies the NODATA action, which rewrites the response to NODATA or ANCOUNT=1.
    • The Local Data action is represented by a set ordinary DNS records that are used to answer queries. Queries for record types not the set are answered with NODATA. A special form of local data is a CNAME whose target is a wildcard such as *.example.com. It is used as if were an ordinary CNAME after the astrisk (*) has been replaced with the query name. The purpose for this special form is query logging in the walled garden's authority DNS server.
    • The PASSTHRU policy is specified by a CNAME whose target is rpz-passthru. It causes the response to not be rewritten and is most often used to "poke holes" in policies for CIDR blocks. (A CNAME whose target is the variable part of its owner name is an obsolete specification of the PASSTHRU policy.)

    The actions specified in an RPZ can be overridden with a policy clause in the response-policy option. An organization using an RPZ provided by another organization might use this mechanism to redirect domains to its own walled garden.

    • GIVEN says "do not override but perform the action specified in the zone."
    • DISABLED causes policy records to do nothing but log what they might have done. The response to the DNS query will be written according to any triggered policy records that are not disabled. Disabled policy zones should appear first, because they will often not be logged if a higher precedence trigger is found first.
    • PASSTHRU causes all policy records to act as if they were CNAME records with targets the variable part of their owner name. They protect the response from being changed.
    • NXDOMAIN causes all RPZ records to specify NXDOMAIN policies.
    • NODATA overrides with the NODATA policy
    • CNAME domain causes all RPZ policy records to act as if they were "cname domain" records.

    By default, the actions encoded in an RPZ are applied only to queries that ask for recursion (RD=1). That default can be changed for a single RPZ or all RPZs in a view with a recursive-only no clause. This feature is useful for serving the same zone files both inside and outside an RFC 1918 cloud and using RPZ to delete answers that would otherwise contain RFC 1918 values on the externally visible name server or view.

    Also by default, RPZ actions are applied only to DNS requests that either do not request DNSSEC metadata (DO=0) or when no DNSSEC records are available for request name in the original zone (not the response policy zone). This default can be changed for all RPZs in a view with a break-dnssec yes clause. In that case, RPZ actions are applied regardless of DNSSEC. The name of the clause option reflects the fact that results rewritten by RPZ actions cannot verify.

    The TTL of a record modified by RPZ policies is set from the TTL of the relevant record in policy zone. It is then limited to a maximum value. The max-policy-ttl clause changes that maximum from its default of 5.

    For example, you might use this option statement

        response-policy { zone "badlist"; };

    and this zone statement

        zone "badlist" {type master; file "master/badlist"; allow-query {none;}; };

    with this zone file

    $TTL 1H
    @                       SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h)
                            NS  LOCALHOST.
    
    ; QNAME policy records.  There are no periods (.) after the owner names.
    nxdomain.domain.com     CNAME   .               ; NXDOMAIN policy
    nodata.domain.com       CNAME   *.              ; NODATA policy
    bad.domain.com          A       10.0.0.1        ; redirect to a walled garden
                            AAAA    2001:2::1
    
    ; do not rewrite (PASSTHRU) OK.DOMAIN.COM
    ok.domain.com           CNAME   rpz-passthru.
    
    bzone.domain.com        CNAME   garden.example.com.
    
    ; redirect x.bzone.domain.com to x.bzone.domain.com.garden.example.com
    *.bzone.domain.com      CNAME   *.garden.example.com.
    
    
    ; IP policy records that rewrite all answers for 127/8 except 127.0.0.1
    8.0.0.0.127.rpz-ip      CNAME   .
    32.1.0.0.127.rpz-ip     CNAME   rpz-passthru.
    
    ; NSDNAME and NSIP policy records
    ns.domain.com.rpz-nsdname   CNAME   .
    48.zz.2.2001.rpz-nsip       CNAME   .
    

    RPZ can affect server performance. Each configured response policy zone requires the server to perform one to four additional database lookups before a query can be answered. For example, a DNS server with four policy zones, each with all four kinds of response triggers, QNAME, IP, NSIP, and NSDNAME, requires a total of 17 times as many database lookups as a similar DNS server with no response policy zones. A BIND9 server with adequate memory and one response policy zone with QNAME and IP triggers might achieve a maximum queries-per-second rate about 20% lower. A server with four response policy zones with QNAME and IP triggers might have a maximum QPS rate about 50% lower.

    Responses rewritten by RPZ are counted in the RPZRewrites statistics.

    Response Rate Limiting

    This feature is only available when BIND 9 is compiled with the --enable-rrl option on the "configure" command line.

    Excessive almost identical UDP responses can be controlled by configuring a rate-limit clause in an options or view statement. This mechanism keeps authoritative BIND 9 from being used in amplifying reflection denial of service (DoS) attacks. Short truncated (TC=1) responses can be sent to provide rate-limited responses to legitimate clients within a range of forged, attacked IP addresses. Legitimate clients react to dropped or truncated response by retrying with UDP or with TCP respectively.

    This mechanism is intended for authoritative DNS servers. It can be used on recursive servers but can slow applications such as SMTP servers (mail receivers) and HTTP clients (web browsers) that repeatedly request the same domains. When possible, closing "open" recursive servers is better.

    Response rate limiting uses a "credit" or "token bucket" scheme. Each combination of identical response and client has a conceptual account that earns a specified number of credits every second. A prospective response debits its account by one. Responses are dropped or truncated while the account is negative. Responses are tracked within a rolling window of time which defaults to 15 seconds, but can be configured with the window option to any value from 1 to 3600 seconds (1 hour). The account cannot become more positive than the per-second limit or more negative than window times the per-second limit. When the specified number of credits for a class of responses is set to 0, those responses are not rate limited.

    The notions of "identical response" and "DNS client" for rate limiting are not simplistic. All responses to an address block are counted as if to a single client. The prefix lengths of addresses blocks are specified with ipv4-prefix-length (default 24) and ipv6-prefix-length (default 56).

    All non-empty responses for a valid domain name (qname) and record type (qtype) are identical and have a limit specified with responses-per-second (default 0 or no limit). All empty (NODATA) responses for a valid domain, regardless of query type, are identical. Responses in the NODATA class are limited by nodata-per-second (default responses-per-second). Requests for any and all undefined subdomains of a given valid domain result in NXDOMAIN errors, and are identical regardless of query type. They are limited by nxdomain-per-second (default responses-per-second). This controls some attacks using random names, but can be relaxed or turned off (set to 0) on servers that expect many legitimate NXDOMAIN responses, such as from anti-spam blacklists. Referrals or delegations to the server of a given domain are identical and are limited by referrals-per-second (default responses-per-second).

    Responses generated from local wildcards are counted and limited as if they were for the parent domain name. This controls flooding using random.wild.example.com.

    All requests that result in DNS errors other than NXDOMAIN, such as SERVFAIL and FORMERR, are identical regardless of requested name (qname) or record type (qtype). This controls attacks using invalid requests or distant, broken authoritative servers. By default the limit on errors is the same as the responses-per-second value, but it can be set separately with errors-per-second.

    Many attacks using DNS involve UDP requests with forged source addresses. Rate limiting prevents the use of BIND 9 to flood a network with responses to requests with forged source addresses, but could let a third party block responses to legitimate requests. There is a mechanism that can answer some legitimate requests from a client whose address is being forged in a flood. Setting slip to 2 (its default) causes every other UDP request to be answered with a small truncated (TC=1) response. The small size and reduced frequency, and so lack of amplification, of "slipped" responses make them unattractive for reflection DoS attacks. slip must be between 0 and 10. A value of 0 does not "slip": no truncated responses are sent due to rate limiting, all responses are dropped. A value of 1 causes every response to slip; values between 2 and 10 cause every n'th response to slip. Some error responses including REFUSED and SERVFAIL cannot be replaced with truncated responses and are instead leaked at the slip rate.

    (NOTE: Dropped responses from an authoritative server may reduce the difficulty of a third party successfully forging a response to a recursive resolver. The best security against forged responses is for authoritative operators to sign their zones using DNSSEC and for resolver operators to validate the responses. When this is not an option, operators who are more concerned with response integrity than with flood mitigation may consider setting slip to 1, causing all rate-limited responses to be truncated rather than dropped. This reduces the effectiveness of rate-limiting against reflection attacks.)

    When the approximate query per second rate exceeds the qps-scale value, then the responses-per-second, errors-per-second, nxdomains-per-second and all-per-second values are reduced by the ratio of the current rate to the qps-scale value. This feature can tighten defenses during attacks. For example, with qps-scale 250; responses-per-second 20; and a total query rate of 1000 queries/second for all queries from all DNS clients including via TCP, then the effective responses/second limit changes to (250/1000)*20 or 5. Responses sent via TCP are not limited but are counted to compute the query per second rate.

    Communities of DNS clients can be given their own parameters or no rate limiting by putting rate-limit statements in view statements instead of the global option statement. A rate-limit statement in a view replaces, rather than supplementing, a rate-limit statement among the main options. DNS clients within a view can be exempted from rate limits with the exempt-clients clause.

    UDP responses of all kinds can be limited with the all-per-second phrase. This rate limiting is unlike the rate limiting provided by responses-per-second, errors-per-second, and nxdomains-per-second on a DNS server which are often invisible to the victim of a DNS reflection attack. Unless the forged requests of the attack are the same as the legitimate requests of the victim, the victim's requests are not affected. Responses affected by an all-per-second limit are always dropped; the slip value has no effect. An all-per-second limit should be at least 4 times as large as the other limits, because single DNS clients often send bursts of legitimate requests. For example, the receipt of a single mail message can prompt requests from an SMTP server for NS, PTR, A, and AAAA records as the incoming SMTP/TCP/IP connection is considered. The SMTP server can need additional NS, A, AAAA, MX, TXT, and SPF records as it considers the STMP Mail From command. Web browsers often repeatedly resolve the same names that are repeated in HTML <IMG> tags in a page. All-per-second is similar to the rate limiting offered by firewalls but often inferior. Attacks that justify ignoring the contents of DNS responses are likely to be attacks on the DNS server itself. They usually should be discarded before the DNS server spends resources making TCP connections or parsing DNS requests, but that rate limiting must be done before the DNS server sees the requests.

    The maximum size of the table used to track requests and rate limit responses is set with max-table-size. Each entry in the table is between 40 and 80 bytes. The table needs approximately as many entries as the number of requests received per second. The default is 20,000. To reduce the cold start of growing the table, min-table-size (default 500) can set the minimum table size. Enable rate-limit category logging to monitor expansions of the table and inform choices for the initial and maximum table size.

    Use log-only yes to test rate limiting parameters without actually dropping any requests.

    Responses dropped by rate limits are included in the RateDropped and QryDropped statistics. Responses that truncated by rate limits are included in RateSlipped and RespTruncated.

    server Statement Grammar

    server ip_addr[/prefixlen] {
        [ bogus yes_or_no ; ]
        [ provide-ixfr yes_or_no ; ]
        [ request-ixfr yes_or_no ; ]
        [ edns yes_or_no ; ]
        [ edns-udp-size number ; ]
        [ max-udp-size number ; ]
        [ transfers number ; ]
        [ transfer-format ( one-answer | many-answers ) ; ]]
        [ keys { string ; [ string ; [...]] } ; ]
        [ transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ notify-source (ip4_addr | *) [port ip_port] ; ]
        [ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ query-source [ address ( ip_addr | * ) ]
                      [ port ( ip_port | * ) ]; ]
        [ query-source-v6 [ address ( ip_addr | * ) ]
                         [ port ( ip_port | * ) ]; ]
        [ use-queryport-pool yes_or_no; ]
        [ queryport-pool-ports number; ]
        [ queryport-pool-updateinterval number; ]
    };
    

    server Statement Definition and Usage

    The server statement defines characteristics to be associated with a remote name server. If a prefix length is specified, then a range of servers is covered. Only the most specific server clause applies regardless of the order in named.conf.

    The server statement can occur at the top level of the configuration file or inside a view statement. If a view statement contains one or more server statements, only those apply to the view and any top-level ones are ignored. If a view contains no server statements, any top-level server statements are used as defaults.

    If you discover that a remote server is giving out bad data, marking it as bogus will prevent further queries to it. The default value of bogus is no.

    The provide-ixfr clause determines whether the local server, acting as master, will respond with an incremental zone transfer when the given remote server, a slave, requests it. If set to yes, incremental transfer will be provided whenever possible. If set to no, all transfers to the remote server will be non-incremental. If not set, the value of the provide-ixfr option in the view or global options block is used as a default.

    The request-ixfr clause determines whether the local server, acting as a slave, will request incremental zone transfers from the given remote server, a master. If not set, the value of the request-ixfr option in the view or global options block is used as a default. It may also be set in the zone block and, if set there, it will override the global or view setting for that zone.

    IXFR requests to servers that do not support IXFR will automatically fall back to AXFR. Therefore, there is no need to manually list which servers support IXFR and which ones do not; the global default of yes should always work. The purpose of the provide-ixfr and request-ixfr clauses is to make it possible to disable the use of IXFR even when both master and slave claim to support it, for example if one of the servers is buggy and crashes or corrupts data when IXFR is used.

    The edns clause determines whether the local server will attempt to use EDNS when communicating with the remote server. The default is yes.

    The edns-udp-size option sets the EDNS UDP size that is advertised by named when querying the remote server. Valid values are 512 to 4096 bytes (values outside this range will be silently adjusted). This option is useful when you wish to advertises a different value to this server than the value you advertise globally, for example, when there is a firewall at the remote site that is blocking large replies.

    The max-udp-size option sets the maximum EDNS UDP message size named will send. Valid values are 512 to 4096 bytes (values outside this range will be silently adjusted). This option is useful when you know that there is a firewall that is blocking large replies from named.

    The server supports two zone transfer methods. The first, one-answer, uses one DNS message per resource record transferred. many-answers packs as many resource records as possible into a message. many-answers is more efficient, but is only known to be understood by BIND 9, BIND 8.x, and patched versions of BIND 4.9.5. You can specify which method to use for a server with the transfer-format option. If transfer-format is not specified, the transfer-format specified by the options statement will be used.

    transfers is used to limit the number of concurrent inbound zone transfers from the specified server. If no transfers clause is specified, the limit is set according to the transfers-per-ns option.

    The keys clause identifies a key_id defined by the key statement, to be used for transaction security (TSIG, the section called “TSIG”) when talking to the remote server. When a request is sent to the remote server, a request signature will be generated using the key specified here and appended to the message. A request originating from the remote server is not required to be signed by this key.

    Although the grammar of the keys clause allows for multiple keys, only a single key per server is currently supported.

    The transfer-source and transfer-source-v6 clauses specify the IPv4 and IPv6 source address to be used for zone transfer with the remote server, respectively. For an IPv4 remote server, only transfer-source can be specified. Similarly, for an IPv6 remote server, only transfer-source-v6 can be specified. For more details, see the description of transfer-source and transfer-source-v6 in the section called “Zone Transfers”.

    The notify-source and notify-source-v6 clauses specify the IPv4 and IPv6 source address to be used for notify messages sent to remote servers, respectively. For an IPv4 remote server, only notify-source can be specified. Similarly, for an IPv6 remote server, only notify-source-v6 can be specified.

    The query-source and query-source-v6 clauses specify the IPv4 and IPv6 source address to be used for queries sent to remote servers, respectively. For an IPv4 remote server, only query-source can be specified. Similarly, for an IPv6 remote server, only query-source-v6 can be specified.

    statistics-channels Statement Grammar

    statistics-channels {
       [ inet ( ip_addr | * ) [ port ip_port ]
       [ allow {  address_match_list  } ]; ]
       [ inet ...; ]
    };
    

    statistics-channels Statement Definition and Usage

    The statistics-channels statement declares communication channels to be used by system administrators to get access to statistics information of the name server.

    This statement intends to be flexible to support multiple communication protocols in the future, but currently only HTTP access is supported. It requires that BIND 9 be compiled with libxml2; the statistics-channels statement is still accepted even if it is built without the library, but any HTTP access will fail with an error.

    An inet control channel is a TCP socket listening at the specified ip_port on the specified ip_addr, which can be an IPv4 or IPv6 address. An ip_addr of * (asterisk) is interpreted as the IPv4 wildcard address; connections will be accepted on any of the system's IPv4 addresses. To listen on the IPv6 wildcard address, use an ip_addr of ::.

    If no port is specified, port 80 is used for HTTP channels. The asterisk "*" cannot be used for ip_port.

    The attempt of opening a statistics channel is restricted by the optional allow clause. Connections to the statistics channel are permitted based on the address_match_list. If no allow clause is present, named accepts connection attempts from any address; since the statistics may contain sensitive internal information, it is highly recommended to restrict the source of connection requests appropriately.

    If no statistics-channels statement is present, named will not open any communication channels.

    If the statistics channel is configured to listen on 127.0.0.1 port 8888, then the statistics are accessible in XML format at http://127.0.0.1:8888/ or http://127.0.0.1:8888/xml. A CSS file is included which can format the XML statistics into tables when viewed with a stylesheet-capable browser. When BIND 9 is configured with --enable-newstats, a new XML schema is used (version 3) which adds additional zone statistics and uses a flatter tree for more efficient parsing. The stylesheet included uses the Google Charts API to render data into into charts and graphs when using a javascript-capable browser.

    Applications that depend on a particular XML schema can request http://127.0.0.1:8888/xml/v2 for version 2 of the statistics XML schema or http://127.0.0.1:8888/xml/v3 for version 3. If the requested schema is supported by the server, then it will respond; if not, it will return a "page not found" error.

    trusted-keys Statement Grammar

    trusted-keys {
        string number number number string ;
        [ string number number number string ; [...]]
    };
    

    trusted-keys Statement Definition and Usage

    The trusted-keys statement defines DNSSEC security roots. DNSSEC is described in the section called “DNSSEC”. A security root is defined when the public key for a non-authoritative zone is known, but cannot be securely obtained through DNS, either because it is the DNS root zone or because its parent zone is unsigned. Once a key has been configured as a trusted key, it is treated as if it had been validated and proven secure. The resolver attempts DNSSEC validation on all DNS data in subdomains of a security root.

    All keys (and corresponding zones) listed in trusted-keys are deemed to exist regardless of what parent zones say. Similarly for all keys listed in trusted-keys only those keys are used to validate the DNSKEY RRset. The parent's DS RRset will not be used.

    The trusted-keys statement can contain multiple key entries, each consisting of the key's domain name, flags, protocol, algorithm, and the Base-64 representation of the key data. Spaces, tabs, newlines and carriage returns are ignored in the key data, so the configuration may be split up into multiple lines.

    trusted-keys may be set at the top level of named.conf or within a view. If it is set in both places, they are additive: keys defined at the top level are inherited by all views, but keys defined in a view are only used within that view.

    managed-keys Statement Grammar

    managed-keys {
        name initial-key flags protocol algorithm key-data ;
        [ name initial-key flags protocol algorithm key-data ; [...]]
    };
    

    managed-keys Statement Definition and Usage

    The managed-keys statement, like trusted-keys, defines DNSSEC security roots. The difference is that managed-keys can be kept up to date automatically, without intervention from the resolver operator.

    Suppose, for example, that a zone's key-signing key was compromised, and the zone owner had to revoke and replace the key. A resolver which had the old key in a trusted-keys statement would be unable to validate this zone any longer; it would reply with a SERVFAIL response code. This would continue until the resolver operator had updated the trusted-keys statement with the new key.

    If, however, the zone were listed in a managed-keys statement instead, then the zone owner could add a "stand-by" key to the zone in advance. named would store the stand-by key, and when the original key was revoked, named would be able to transition smoothly to the new key. It would also recognize that the old key had been revoked, and cease using that key to validate answers, minimizing the damage that the compromised key could do.

    A managed-keys statement contains a list of the keys to be managed, along with information about how the keys are to be initialized for the first time. The only initialization method currently supported (as of BIND 9.7.0) is initial-key. This means the managed-keys statement must contain a copy of the initializing key. (Future releases may allow keys to be initialized by other methods, eliminating this requirement.)

    Consequently, a managed-keys statement appears similar to a trusted-keys, differing in the presence of the second field, containing the keyword initial-key. The difference is, whereas the keys listed in a trusted-keys continue to be trusted until they are removed from named.conf, an initializing key listed in a managed-keys statement is only trusted once: for as long as it takes to load the managed key database and start the RFC 5011 key maintenance process.

    The first time named runs with a managed key configured in named.conf, it fetches the DNSKEY RRset directly from the zone apex, and validates it using the key specified in the managed-keys statement. If the DNSKEY RRset is validly signed, then it is used as the basis for a new managed keys database.

    From that point on, whenever named runs, it sees the managed-keys statement, checks to make sure RFC 5011 key maintenance has already been initialized for the specified domain, and if so, it simply moves on. The key specified in the managed-keys is not used to validate answers; it has been superseded by the key or keys stored in the managed keys database.

    The next time named runs after a name has been removed from the managed-keys statement, the corresponding zone will be removed from the managed keys database, and RFC 5011 key maintenance will no longer be used for that domain.

    named only maintains a single managed keys database; consequently, unlike trusted-keys, managed-keys may only be set at the top level of named.conf, not within a view.

    In the current implementation, the managed keys database is stored as a master-format zone file called managed-keys.bind. When the key database is changed, the zone is updated. As with any other dynamic zone, changes will be written into a journal file, managed-keys.bind.jnl. They are committed to the master file as soon as possible afterward; in the case of the managed key database, this will usually occur within 30 seconds. So, whenever named is using automatic key maintenance, those two files can be expected to exist in the working directory. (For this reason among others, the working directory should be always be writable by named.)

    If the dnssec-validation option is set to auto, named will automatically initialize a managed key for the root zone. Similarly, if the dnssec-lookaside option is set to auto, named will automatically initialize a managed key for the zone dlv.isc.org. In both cases, the key that is used to initialize the key maintenance process is built into named, and can be overridden from bindkeys-file.

    view Statement Grammar

    view view_name
          [class] {
          match-clients { address_match_list };
          match-destinations { address_match_list };
          match-recursive-only yes_or_no ;
          [ view_option; ...]
          [ zone_statement; ...]
    };
    

    view Statement Definition and Usage

    The view statement is a powerful feature of BIND 9 that lets a name server answer a DNS query differently depending on who is asking. It is particularly useful for implementing split DNS setups without having to run multiple servers.

    Each view statement defines a view of the DNS namespace that will be seen by a subset of clients. A client matches a view if its source IP address matches the address_match_list of the view's match-clients clause and its destination IP address matches the address_match_list of the view's match-destinations clause. If not specified, both match-clients and match-destinations default to matching all addresses. In addition to checking IP addresses match-clients and match-destinations can also take keys which provide an mechanism for the client to select the view. A view can also be specified as match-recursive-only, which means that only recursive requests from matching clients will match that view. The order of the view statements is significant — a client request will be resolved in the context of the first view that it matches.

    Zones defined within a view statement will only be accessible to clients that match the view. By defining a zone of the same name in multiple views, different zone data can be given to different clients, for example, "internal" and "external" clients in a split DNS setup.

    Many of the options given in the options statement can also be used within a view statement, and then apply only when resolving queries with that view. When no view-specific value is given, the value in the options statement is used as a default. Also, zone options can have default values specified in the view statement; these view-specific defaults take precedence over those in the options statement.

    Views are class specific. If no class is given, class IN is assumed. Note that all non-IN views must contain a hint zone, since only the IN class has compiled-in default hints.

    If there are no view statements in the config file, a default view that matches any client is automatically created in class IN. Any zone statements specified on the top level of the configuration file are considered to be part of this default view, and the options statement will apply to the default view. If any explicit view statements are present, all zone statements must occur inside view statements.

    Here is an example of a typical split DNS setup implemented using view statements:

    view "internal" {
          // This should match our internal networks.
          match-clients { 10.0.0.0/8; };
    
          // Provide recursive service to internal
          // clients only.
          recursion yes;
    
          // Provide a complete view of the example.com
          // zone including addresses of internal hosts.
          zone "example.com" {
                type master;
                file "example-internal.db";
          };
    };
    
    view "external" {
          // Match all clients not matched by the
          // previous view.
          match-clients { any; };
    
          // Refuse recursive service to external clients.
          recursion no;
    
          // Provide a restricted view of the example.com
          // zone containing only publicly accessible hosts.
          zone "example.com" {
               type master;
               file "example-external.db";
          };
    };
    

    zone Statement Grammar

    zone zone_name [class] {
        type master;
        [ allow-query { address_match_list }; ]
        [ allow-query-on { address_match_list }; ]
        [ allow-transfer { address_match_list }; ]
        [ allow-update { address_match_list }; ]
        [ update-check-ksk yes_or_no; ]
        [ dnssec-dnskey-kskonly yes_or_no; ]
        [ dnssec-loadkeys-interval number; ]
        [ update-policy local | { update_policy_rule [...] }; ]
        [ also-notify { ip_addr [port ip_port] ;
                      [ ip_addr [port ip_port] ; ... ] }; ]
        [ check-names (warn|fail|ignore) ; ]
        [ check-mx (warn|fail|ignore) ; ]
        [ check-wildcard yes_or_no; ]
        [ check-spf ( warn | fail | ignore ); ]
        [ check-integrity yes_or_no ; ]
        [ dialup dialup_option ; ]
        [ file string ; ]
        [ masterfile-format (text|raw) ; ]
        [ journal string ; ]
        [ max-journal-size size_spec; ]
        [ forward (only|first) ; ]
        [ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
        [ ixfr-base string ; ]
        [ ixfr-from-differences yes_or_no; ]
        [ ixfr-tmp-file string ; ]
        [ request-ixfr yes_or_no ; ]
        [ maintain-ixfr-base yes_or_no ; ]
        [ max-ixfr-log-size number ; ]
        [ max-transfer-idle-out number ; ]
        [ max-transfer-time-out number ; ]
        [ notify yes_or_no | explicit | master-only ; ]
        [ notify-delay seconds ; ]
        [ notify-to-soa yes_or_no; ]
        [ pubkey number number number string ; ]
        [ notify-source (ip4_addr | *) [port ip_port] ; ]
        [ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ zone-statistics full | terse | none; ]
        [ sig-validity-interval number [number] ; ]
        [ sig-signing-nodes number ; ]
        [ sig-signing-signatures number ; ]
        [ sig-signing-type number ; ]
        [ database string ; ]
        [ min-refresh-time number ; ]
        [ max-refresh-time number ; ]
        [ min-retry-time number ; ]
        [ max-retry-time number ; ]
        [ key-directory path_name; ]
        [ auto-dnssec allow|maintain|off; ]
        [ inline-signing yes_or_no; ]
        [ zero-no-soa-ttl yes_or_no ; ]
        [ serial-update-method increment|unixtime; ]
    };
    
    zone zone_name [class] {
        type slave;
        [ allow-notify { address_match_list }; ]
        [ allow-query { address_match_list }; ]
        [ allow-query-on { address_match_list }; ]
        [ allow-transfer { address_match_list }; ]
        [ allow-update-forwarding { address_match_list }; ]
        [ dnssec-update-mode ( maintain | no-resign ); ]
        [ update-check-ksk yes_or_no; ]
        [ dnssec-dnskey-kskonly yes_or_no; ]
        [ dnssec-loadkeys-interval number; ]
        [ dnssec-secure-to-insecure yes_or_no ; ]
        [ try-tcp-refresh yes_or_no; ]
        [ also-notify [port ip_port] { ( masters_list | ip_addr
                                  [port ip_port]
                                  [key key] ) ; [...] }; ]
        [ check-names (warn|fail|ignore) ; ]
        [ dialup dialup_option ; ]
        [ file string ; ]
        [ masterfile-format (text|raw) ; ]
        [ journal string ; ]
        [ max-journal-size size_spec; ]
        [ forward (only|first) ; ]
        [ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
        [ ixfr-base string ; ]
        [ ixfr-from-differences yes_or_no; ]
        [ ixfr-tmp-file string ; ]
        [ maintain-ixfr-base yes_or_no ; ]
        [ masters [port ip_port] { ( masters_list | ip_addr
                                  [port ip_port]
                                  [key key] ) ; [...] }; ]
        [ max-ixfr-log-size number ; ]
        [ max-transfer-idle-in number ; ]
        [ max-transfer-idle-out number ; ]
        [ max-transfer-time-in number ; ]
        [ max-transfer-time-out number ; ]
        [ notify yes_or_no | explicit | master-only ; ]
        [ notify-delay seconds ; ]
        [ notify-to-soa yes_or_no; ]
        [ pubkey number number number string ; ]
        [ transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ alt-transfer-source-v6 (ip6_addr | *)
                                 [port ip_port] ; ]
        [ use-alt-transfer-source yes_or_no; ]
        [ notify-source (ip4_addr | *) [port ip_port] ; ]
        [ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
        [ zone-statistics full | terse | none; ]
        [ sig-validity-interval number [number] ; ]
        [ sig-signing-nodes number ; ]
        [ sig-signing-signatures number ; ]
        [ sig-signing-type number ; ]
        [ database string ; ]
        [ min-refresh-time number ; ]
        [ max-refresh-time number ; ]
        [ min-retry-time number ; ]
        [ max-retry-time number ; ]
        [ key-directory path_name; ]
        [ auto-dnssec allow|maintain|off; ]
        [ inline-signing yes_or_no; ]
        [ multi-master yes_or_no ; ]
        [ zero-no-soa-ttl yes_or_no ; ]
    };
    
    zone zone_name [class] {
        type hint;
        file string ;
        [ delegation-only yes_or_no ; ]
        [ check-names (warn|fail|ignore) ; ] // Not Implemented.
    };
    
    zone zone_name [class] {
        type stub;
        [ allow-query { address_match_list }; ]
        [ allow-query-on { address_match_list }; ]
        [ check-names (warn|fail|ignore) ; ]
        [ dialup dialup_option ; ]
        [ delegation-only yes_or_no ; ]
        [ file string ; ]
        [ masterfile-format (text|raw) ; ]
        [ forward (only|first) ; ]
        [ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
        [ masters [port ip_port] { ( masters_list | ip_addr
                                  [port ip_port]
                                  [key key] ) ; [...] }; ]
        [ max-transfer-idle-in number ; ]
        [ max-transfer-time-in number ; ]
        [ pubkey number number number string ; ]
        [ transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ transfer-source-v6 (ip6_addr | *)
                             [port ip_port] ; ]
        [ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
        [ alt-transfer-source-v6 (ip6_addr | *)
                                [port ip_port] ; ]
        [ use-alt-transfer-source yes_or_no; ]
        [ zone-statistics yes_or_no ; ]
        [ database string ; ]
        [ min-refresh-time number ; ]
        [ max-refresh-time number ; ]
        [ min-retry-time number ; ]
        [ max-retry-time number ; ]
        [ multi-master yes_or_no ; ]
    };
    
    zone zone_name [class] {
        type static-stub;
        [ allow-query { address_match_list }; ]
        [ server-addresses { [ ip_addr ; ... ] }; ]
        [ server-names { [ namelist ] }; ]  
        [ zone-statistics yes_or_no ; ]
    };
    
    zone zone_name [class] {
        type forward;
        [ forward (only|first) ; ]
        [ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
        [ delegation-only yes_or_no ; ]
    };
    
    zone "." [class] {
        type redirect;
        file string ;
        [ masterfile-format (text|raw) ; ]
        [ allow-query { address_match_list }; ]
    };
    
    zone zone_name [class] {
        type delegation-only;
    };
    
    

    zone Statement Definition and Usage

    Zone Types

    master

    The server has a master copy of the data for the zone and will be able to provide authoritative answers for it.

    slave

    A slave zone is a replica of a master zone. The masters list specifies one or more IP addresses of master servers that the slave contacts to update its copy of the zone. Masters list elements can also be names of other masters lists. By default, transfers are made from port 53 on the servers; this can be changed for all servers by specifying a port number before the list of IP addresses, or on a per-server basis after the IP address. Authentication to the master can also be done with per-server TSIG keys. If a file is specified, then the replica will be written to this file whenever the zone is changed, and reloaded from this file on a server restart. Use of a file is recommended, since it often speeds server startup and eliminates a needless waste of bandwidth. Note that for large numbers (in the tens or hundreds of thousands) of zones per server, it is best to use a two-level naming scheme for zone filenames. For example, a slave server for the zone example.com might place the zone contents into a file called ex/example.com where ex/ is just the first two letters of the zone name. (Most operating systems behave very slowly if you put 100000 files into a single directory.)

    stub

    A stub zone is similar to a slave zone, except that it replicates only the NS records of a master zone instead of the entire zone. Stub zones are not a standard part of the DNS; they are a feature specific to the BIND implementation.

    Stub zones can be used to eliminate the need for glue NS record in a parent zone at the expense of maintaining a stub zone entry and a set of name server addresses in named.conf. This usage is not recommended for new configurations, and BIND 9 supports it only in a limited way. In BIND 4/8, zone transfers of a parent zone included the NS records from stub children of that zone. This meant that, in some cases, users could get away with configuring child stubs only in the master server for the parent zone. BIND 9 never mixes together zone data from different zones in this way. Therefore, if a BIND 9 master serving a parent zone has child stub zones configured, all the slave servers for the parent zone also need to have the same child stub zones configured.

    Stub zones can also be used as a way of forcing the resolution of a given domain to use a particular set of authoritative servers. For example, the caching name servers on a private network using RFC1918 addressing may be configured with stub zones for 10.in-addr.arpa to use a set of internal name servers as the authoritative servers for that domain.

    static-stub

    A static-stub zone is similar to a stub zone with the following exceptions: the zone data is statically configured, rather than transferred from a master server; when recursion is necessary for a query that matches a static-stub zone, the locally configured data (nameserver names and glue addresses) is always used even if different authoritative information is cached.

    Zone data is configured via the server-addresses and server-names zone options.

    The zone data is maintained in the form of NS and (if necessary) glue A or AAAA RRs internally, which can be seen by dumping zone databases by rndc dumpdb -all. The configured RRs are considered local configuration parameters rather than public data. Non recursive queries (i.e., those with the RD bit off) to a static-stub zone are therefore prohibited and will be responded with REFUSED.

    Since the data is statically configured, no zone maintenance action takes place for a static-stub zone. For example, there is no periodic refresh attempt, and an incoming notify message will be rejected with an rcode of NOTAUTH.

    Each static-stub zone is configured with internally generated NS and (if necessary) glue A or AAAA RRs

    forward

    A "forward zone" is a way to configure forwarding on a per-domain basis. A zone statement of type forward can contain a forward and/or forwarders statement, which will apply to queries within the domain given by the zone name. If no forwarders statement is present or an empty list for forwarders is given, then no forwarding will be done for the domain, canceling the effects of any forwarders in the options statement. Thus if you want to use this type of zone to change the behavior of the global forward option (that is, "forward first" to, then "forward only", or vice versa, but want to use the same servers as set globally) you need to re-specify the global forwarders.

    hint

    The initial set of root name servers is specified using a "hint zone". When the server starts up, it uses the root hints to find a root name server and get the most recent list of root name servers. If no hint zone is specified for class IN, the server uses a compiled-in default set of root servers hints. Classes other than IN have no built-in defaults hints.

    redirect

    Redirect zones are used to provide answers to queries when normal resolution would result in NXDOMAIN being returned. Only one redirect zone is supported per view. allow-query can be used to restrict which clients see these answers.

    If the client has requested DNSSEC records (DO=1) and the NXDOMAIN response is signed then no substitution will occur.

    To redirect all NXDOMAIN responses to 100.100.100.2 and 2001:ffff:ffff::100.100.100.2, one would configure a type redirect zone named ".", with the zone file containing wildcard records that point to the desired addresses: "*. IN A 100.100.100.2" and "*. IN AAAA 2001:ffff:ffff::100.100.100.2".

    To redirect all Spanish names (under .ES) one would use similar entries but with the names "*.ES." instead of "*.". To redirect all commercial Spanish names (under COM.ES) one would use wildcard entries called "*.COM.ES.".

    Note that the redirect zone supports all possible types; it is not limited to A and AAAA records.

    Because redirect zones are not referenced directly by name, they are not kept in the zone lookup table with normal master and slave zones. Consequently, it is not currently possible to use rndc reload zonename to reload a redirect zone. However, when using rndc reload without specifying a zone name, redirect zones will be reloaded along with other zones.

    delegation-only

    This is used to enforce the delegation-only status of infrastructure zones (e.g. COM, NET, ORG). Any answer that is received without an explicit or implicit delegation in the authority section will be treated as NXDOMAIN. This does not apply to the zone apex. This should not be applied to leaf zones.

    delegation-only has no effect on answers received from forwarders.

    See caveats in root-delegation-only.

    Class

    The zone's name may optionally be followed by a class. If a class is not specified, class IN (for Internet), is assumed. This is correct for the vast majority of cases.

    The hesiod class is named for an information service from MIT's Project Athena. It is used to share information about various systems databases, such as users, groups, printers and so on. The keyword HS is a synonym for hesiod.

    Another MIT development is Chaosnet, a LAN protocol created in the mid-1970s. Zone data for it can be specified with the CHAOS class.

    Zone Options

    allow-notify

    See the description of allow-notify in the section called “Access Control”.

    allow-query

    See the description of allow-query in the section called “Access Control”.

    allow-query-on

    See the description of allow-query-on in the section called “Access Control”.

    allow-transfer

    See the description of allow-transfer in the section called “Access Control”.

    allow-update

    See the description of allow-update in the section called “Access Control”.

    update-policy

    Specifies a "Simple Secure Update" policy. See the section called “Dynamic Update Policies”.

    allow-update-forwarding

    See the description of allow-update-forwarding in the section called “Access Control”.

    also-notify

    Only meaningful if notify is active for this zone. The set of machines that will receive a DNS NOTIFY message for this zone is made up of all the listed name servers (other than the primary master) for the zone plus any IP addresses specified with also-notify. A port may be specified with each also-notify address to send the notify messages to a port other than the default of 53. A TSIG key may also be specified to cause the NOTIFY to be signed by the given key. also-notify is not meaningful for stub zones. The default is the empty list.

    check-names

    This option is used to restrict the character set and syntax of certain domain names in master files and/or DNS responses received from the network. The default varies according to zone type. For master zones the default is fail. For slave zones the default is warn. It is not implemented for hint zones.

    check-mx

    See the description of check-mx in the section called “Boolean Options”.

    check-spf

    See the description of check-spf in the section called “Boolean Options”.

    check-wildcard

    See the description of check-wildcard in the section called “Boolean Options”.

    check-integrity

    See the description of check-integrity in the section called “Boolean Options”.

    check-sibling

    See the description of check-sibling in the section called “Boolean Options”.

    zero-no-soa-ttl

    See the description of zero-no-soa-ttl in the section called “Boolean Options”.

    update-check-ksk

    See the description of update-check-ksk in the section called “Boolean Options”.

    dnssec-update-mode

    See the description of dnssec-update-mode in the section called “options Statement Definition and Usage”.

    dnssec-dnskey-kskonly

    See the description of dnssec-dnskey-kskonly in the section called “Boolean Options”.

    try-tcp-refresh

    See the description of try-tcp-refresh in the section called “Boolean Options”.

    database

    Specify the type of database to be used for storing the zone data. The string following the database keyword is interpreted as a list of whitespace-delimited words. The first word identifies the database type, and any subsequent words are passed as arguments to the database to be interpreted in a way specific to the database type.

    The default is "rbt", BIND 9's native in-memory red-black-tree database. This database does not take arguments.

    Other values are possible if additional database drivers have been linked into the server. Some sample drivers are included with the distribution but none are linked in by default.

    dialup

    See the description of dialup in the section called “Boolean Options”.

    delegation-only

    The flag only applies to hint and stub zones. If set to yes, then the zone will also be treated as if it is also a delegation-only type zone.

    See caveats in root-delegation-only.

    forward

    Only meaningful if the zone has a forwarders list. The only value causes the lookup to fail after trying the forwarders and getting no answer, while first would allow a normal lookup to be tried.

    forwarders

    Used to override the list of global forwarders. If it is not specified in a zone of type forward, no forwarding is done for the zone and the global options are not used.

    ixfr-base

    Was used in BIND 8 to specify the name of the transaction log (journal) file for dynamic update and IXFR. BIND 9 ignores the option and constructs the name of the journal file by appending ".jnl" to the name of the zone file.

    ixfr-tmp-file

    Was an undocumented option in BIND 8. Ignored in BIND 9.

    journal

    Allow the default journal's filename to be overridden. The default is the zone's filename with ".jnl" appended. This is applicable to master and slave zones.

    max-journal-size

    See the description of max-journal-size in the section called “Server Resource Limits”.

    max-transfer-time-in

    See the description of max-transfer-time-in in the section called “Zone Transfers”.

    max-transfer-idle-in

    See the description of max-transfer-idle-in in the section called “Zone Transfers”.

    max-transfer-time-out

    See the description of max-transfer-time-out in the section called “Zone Transfers”.

    max-transfer-idle-out

    See the description of max-transfer-idle-out in the section called “Zone Transfers”.

    notify

    See the description of notify in the section called “Boolean Options”.

    notify-delay

    See the description of notify-delay in the section called “Tuning”.

    notify-to-soa

    See the description of notify-to-soa in the section called “Boolean Options”.

    pubkey

    In BIND 8, this option was intended for specifying a public zone key for verification of signatures in DNSSEC signed zones when they are loaded from disk. BIND 9 does not verify signatures on load and ignores the option.

    zone-statistics

    If yes, the server will keep statistical information for this zone, which can be dumped to the statistics-file defined in the server options.

    server-addresses

    Only meaningful for static-stub zones. This is a list of IP addresses to which queries should be sent in recursive resolution for the zone. A non empty list for this option will internally configure the apex NS RR with associated glue A or AAAA RRs.

    For example, if "example.com" is configured as a static-stub zone with 192.0.2.1 and 2001:db8::1234 in a server-addresses option, the following RRs will be internally configured.

    example.com. NS example.com.
    example.com. A 192.0.2.1
    example.com. AAAA 2001:db8::1234

    These records are internally used to resolve names under the static-stub zone. For instance, if the server receives a query for "www.example.com" with the RD bit on, the server will initiate recursive resolution and send queries to 192.0.2.1 and/or 2001:db8::1234.

    server-names

    Only meaningful for static-stub zones. This is a list of domain names of nameservers that act as authoritative servers of the static-stub zone. These names will be resolved to IP addresses when named needs to send queries to these servers. To make this supplemental resolution successful, these names must not be a subdomain of the origin name of static-stub zone. That is, when "example.net" is the origin of a static-stub zone, "ns.example" and "master.example.com" can be specified in the server-names option, but "ns.example.net" cannot, and will be rejected by the configuration parser.

    A non empty list for this option will internally configure the apex NS RR with the specified names. For example, if "example.com" is configured as a static-stub zone with "ns1.example.net" and "ns2.example.net" in a server-names option, the following RRs will be internally configured.

    example.com. NS ns1.example.net.
    example.com. NS ns2.example.net.
    

    These records are internally used to resolve names under the static-stub zone. For instance, if the server receives a query for "www.example.com" with the RD bit on, the server initiate recursive resolution, resolve "ns1.example.net" and/or "ns2.example.net" to IP addresses, and then send queries to (one or more of) these addresses.

    sig-validity-interval

    See the description of sig-validity-interval in the section called “Tuning”.

    sig-signing-nodes

    See the description of sig-signing-nodes in the section called “Tuning”.

    sig-signing-signatures

    See the description of sig-signing-signatures in the section called “Tuning”.

    sig-signing-type

    See the description of sig-signing-type in the section called “Tuning”.

    transfer-source

    See the description of transfer-source in the section called “Zone Transfers”.

    transfer-source-v6

    See the description of transfer-source-v6 in the section called “Zone Transfers”.

    alt-transfer-source

    See the description of alt-transfer-source in the section called “Zone Transfers”.

    alt-transfer-source-v6

    See the description of alt-transfer-source-v6 in the section called “Zone Transfers”.

    use-alt-transfer-source

    See the description of use-alt-transfer-source in the section called “Zone Transfers”.

    notify-source

    See the description of notify-source in the section called “Zone Transfers”.

    notify-source-v6

    See the description of notify-source-v6 in the section called “Zone Transfers”.

    min-refresh-time, max-refresh-time, min-retry-time, max-retry-time

    See the description in the section called “Tuning”.

    ixfr-from-differences

    See the description of ixfr-from-differences in the section called “Boolean Options”. (Note that the ixfr-from-differences master and slave choices are not available at the zone level.)

    key-directory

    See the description of key-directory in the section called “options Statement Definition and Usage”.

    auto-dnssec

    Zones configured for dynamic DNS may also use this option to allow varying levels of automatic DNSSEC key management. There are three possible settings:

    auto-dnssec allow; permits keys to be updated and the zone fully re-signed whenever the user issues the command rndc sign zonename.

    auto-dnssec maintain; includes the above, but also automatically adjusts the zone's DNSSEC keys on schedule, according to the keys' timing metadata (see dnssec-keygen(8) and dnssec-settime(8)). The command rndc sign zonename causes named to load keys from the key repository and sign the zone with all keys that are active. rndc loadkeys zonename causes named to load keys from the key repository and schedule key maintenance events to occur in the future, but it does not sign the full zone immediately. Note: once keys have been loaded for a zone the first time, the repository will be searched for changes periodically, regardless of whether rndc loadkeys is used. The recheck interval is defined by dnssec-loadkeys-interval.)

    The default setting is auto-dnssec off.

    serial-update-method

    Zones configured for dynamic DNS may use this option to set the update method that will be used for the zone serial number in the SOA record.

    With the default setting of serial-update-method increment;, the SOA serial number will be incremented by one each time the zone is updated.

    When set to serial-update-method unixtime;, the SOA serial number will be set to the number of seconds since the UNIX epoch, unless the serial number is already greater than or equal to that value, in which case it is simply incremented by one.

    inline-signing

    If yes, this enables "bump in the wire" signing of a zone, where a unsigned zone is transferred in or loaded from disk and a signed version of the zone is served, with possibly, a different serial number. This behaviour is disabled by default.

    multi-master

    See the description of multi-master in the section called “Boolean Options”.

    masterfile-format

    See the description of masterfile-format in the section called “Tuning”.

    dnssec-secure-to-insecure

    See the description of dnssec-secure-to-insecure in the section called “Boolean Options”.

    Dynamic Update Policies

    BIND 9 supports two alternative methods of granting clients the right to perform dynamic updates to a zone, configured by the allow-update and update-policy option, respectively.

    The allow-update clause works the same way as in previous versions of BIND. It grants given clients the permission to update any record of any name in the zone.

    The update-policy clause allows more fine-grained control over what updates are allowed. A set of rules is specified, where each rule either grants or denies permissions for one or more names to be updated by one or more identities. If the dynamic update request message is signed (that is, it includes either a TSIG or SIG(0) record), the identity of the signer can be determined.

    Rules are specified in the update-policy zone option, and are only meaningful for master zones. When the update-policy statement is present, it is a configuration error for the allow-update statement to be present. The update-policy statement only examines the signer of a message; the source address is not relevant.

    There is a pre-defined update-policy rule which can be switched on with the command update-policy local;. Switching on this rule in a zone causes named to generate a TSIG session key and place it in a file, and to allow that key to update the zone. (By default, the file is /var/run/named/session.key, the key name is "local-ddns" and the key algorithm is HMAC-SHA256, but these values are configurable with the session-keyfile, session-keyname and session-keyalg options, respectively).

    A client running on the local system, and with appropriate permissions, may read that file and use the key to sign update requests. The zone's update policy will be set to allow that key to change any record within the zone. Assuming the key name is "local-ddns", this policy is equivalent to:

    update-policy { grant local-ddns zonesub any; };
                

    The command nsupdate -l sends update requests to localhost, and signs them using the session key.

    Other rule definitions look like this:

    ( grant | deny ) identity nametype [ name ] [ types ]
    

    Each rule grants or denies privileges. Once a message has successfully matched a rule, the operation is immediately granted or denied and no further rules are examined. A rule is matched when the signer matches the identity field, the name matches the name field in accordance with the nametype field, and the type matches the types specified in the type field.

    No signer is required for tcp-self or 6to4-self however the standard reverse mapping / prefix conversion must match the identity field.

    The identity field specifies a name or a wildcard name. Normally, this is the name of the TSIG or SIG(0) key used to sign the update request. When a TKEY exchange has been used to create a shared secret, the identity of the shared secret is the same as the identity of the key used to authenticate the TKEY exchange. TKEY is also the negotiation method used by GSS-TSIG, which establishes an identity that is the Kerberos principal of the client, such as "user@host.domain". When the identity field specifies a wildcard name, it is subject to DNS wildcard expansion, so the rule will apply to multiple identities. The identity field must contain a fully-qualified domain name.

    For nametypes krb5-self, ms-self, krb5-subdomain, and ms-subdomain the identity field specifies the Windows or Kerberos realm of the machine belongs to.

    The nametype field has 13 values: name, subdomain, wildcard, self, selfsub, selfwild, krb5-self, ms-self, krb5-subdomain, ms-subdomain, tcp-self, 6to4-self, zonesub, and external.

    name

    Exact-match semantics. This rule matches when the name being updated is identical to the contents of the name field.

    subdomain

    This rule matches when the name being updated is a subdomain of, or identical to, the contents of the name field.

    zonesub

    This rule is similar to subdomain, except that it matches when the name being updated is a subdomain of the zone in which the update-policy statement appears. This obviates the need to type the zone name twice, and enables the use of a standard update-policy statement in multiple zones without modification.

    When this rule is used, the name field is omitted.

    wildcard

    The name field is subject to DNS wildcard expansion, and this rule matches when the name being updated name is a valid expansion of the wildcard.

    self

    This rule matches when the name being updated matches the contents of the identity field. The name field is ignored, but should be the same as the identity field. The self nametype is most useful when allowing using one key per name to update, where the key has the same name as the name to be updated. The identity would be specified as * (an asterisk) in this case.

    selfsub

    This rule is similar to self except that subdomains of self can also be updated.

    selfwild

    This rule is similar to self except that only subdomains of self can be updated.

    ms-self

    This rule takes a Windows machine principal (machine$@REALM) for machine in REALM and and converts it machine.realm allowing the machine to update machine.realm. The REALM to be matched is specified in the identity field.

    ms-subdomain

    This rule takes a Windows machine principal (machine$@REALM) for machine in REALM and converts it to machine.realm allowing the machine to update subdomains of machine.realm. The REALM to be matched is specified in the identity field.

    krb5-self

    This rule takes a Kerberos machine principal (host/machine@REALM) for machine in REALM and and converts it machine.realm allowing the machine to update machine.realm. The REALM to be matched is specified in the identity field.

    krb5-subdomain

    This rule takes a Kerberos machine principal (host/machine@REALM) for machine in REALM and converts it to machine.realm allowing the machine to update subdomains of machine.realm. The REALM to be matched is specified in the identity field.

    tcp-self

    Allow updates that have been sent via TCP and for which the standard mapping from the initiating IP address into the IN-ADDR.ARPA and IP6.ARPA namespaces match the name to be updated.

    Note

    It is theoretically possible to spoof these TCP sessions.

    6to4-self

    Allow the 6to4 prefix to be update by any TCP connection from the 6to4 network or from the corresponding IPv4 address. This is intended to allow NS or DNAME RRsets to be added to the reverse tree.

    Note

    It is theoretically possible to spoof these TCP sessions.

    external

    This rule allows named to defer the decision of whether to allow a given update to an external daemon.

    The method of communicating with the daemon is specified in the identity field, the format of which is "local:path", where path is the location of a UNIX-domain socket. (Currently, "local" is the only supported mechanism.)

    Requests to the external daemon are sent over the UNIX-domain socket as datagrams with the following format:

       Protocol version number (4 bytes, network byte order, currently 1)
       Request length (4 bytes, network byte order)
       Signer (null-terminated string)
       Name (null-terminated string)
       TCP source address (null-terminated string)
       Rdata type (null-terminated string)
       Key (null-terminated string)
       TKEY token length (4 bytes, network byte order)
       TKEY token (remainder of packet)

    The daemon replies with a four-byte value in network byte order, containing either 0 or 1; 0 indicates that the specified update is not permitted, and 1 indicates that it is.

    In all cases, the name field must specify a fully-qualified domain name.

    If no types are explicitly specified, this rule matches all types except RRSIG, NS, SOA, NSEC and NSEC3. Types may be specified by name, including "ANY" (ANY matches all types except NSEC and NSEC3, which can never be updated). Note that when an attempt is made to delete all records associated with a name, the rules are checked for each existing record type.

    Zone File

    Types of Resource Records and When to Use Them

    This section, largely borrowed from RFC 1034, describes the concept of a Resource Record (RR) and explains when each is used. Since the publication of RFC 1034, several new RRs have been identified and implemented in the DNS. These are also included.

    Resource Records

    A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource information associated with a particular name is composed of separate RRs. The order of RRs in a set is not significant and need not be preserved by name servers, resolvers, or other parts of the DNS. However, sorting of multiple RRs is permitted for optimization purposes, for example, to specify that a particular nearby server be tried first. See the section called “The sortlist Statement” and the section called “RRset Ordering”.

    The components of a Resource Record are:

    owner name

    The domain name where the RR is found.

    type

    An encoded 16-bit value that specifies the type of the resource record.

    TTL

    The time-to-live of the RR. This field is a 32-bit integer in units of seconds, and is primarily used by resolvers when they cache RRs. The TTL describes how long a RR can be cached before it should be discarded.

    class

    An encoded 16-bit value that identifies a protocol family or instance of a protocol.

    RDATA

    The resource data. The format of the data is type (and sometimes class) specific.

    The following are types of valid RRs:

    A

    A host address. In the IN class, this is a 32-bit IP address. Described in RFC 1035.

    AAAA

    IPv6 address. Described in RFC 1886.

    A6

    IPv6 address. This can be a partial address (a suffix) and an indirection to the name where the rest of the address (the prefix) can be found. Experimental. Described in RFC 2874.

    AFSDB

    Location of AFS database servers. Experimental. Described in RFC 1183.

    APL

    Address prefix list. Experimental. Described in RFC 3123.

    CERT

    Holds a digital certificate. Described in RFC 2538.

    CNAME

    Identifies the canonical name of an alias. Described in RFC 1035.

    DHCID

    Is used for identifying which DHCP client is associated with this name. Described in RFC 4701.

    DNAME

    Replaces the domain name specified with another name to be looked up, effectively aliasing an entire subtree of the domain name space rather than a single record as in the case of the CNAME RR. Described in RFC 2672.

    DNSKEY

    Stores a public key associated with a signed DNS zone. Described in RFC 4034.

    DS

    Stores the hash of a public key associated with a signed DNS zone. Described in RFC 4034.

    GPOS

    Specifies the global position. Superseded by LOC.

    HINFO

    Identifies the CPU and OS used by a host. Described in RFC 1035.

    IPSECKEY

    Provides a method for storing IPsec keying material in DNS. Described in RFC 4025.

    ISDN

    Representation of ISDN addresses. Experimental. Described in RFC 1183.

    KEY

    Stores a public key associated with a DNS name. Used in original DNSSEC; replaced by DNSKEY in DNSSECbis, but still used with SIG(0). Described in RFCs 2535 and 2931.

    KX

    Identifies a key exchanger for this DNS name. Described in RFC 2230.

    LOC

    For storing GPS info. Described in RFC 1876. Experimental.

    MX

    Identifies a mail exchange for the domain with a 16-bit preference value (lower is better) followed by the host name of the mail exchange. Described in RFC 974, RFC 1035.

    NAPTR

    Name authority pointer. Described in RFC 2915.

    NSAP

    A network service access point. Described in RFC 1706.

    NS

    The authoritative name server for the domain. Described in RFC 1035.

    NSEC

    Used in DNSSECbis to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. Described in RFC 4034.

    NSEC3

    Used in DNSSECbis to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. NSEC3 differs from NSEC in that it prevents zone enumeration but is more computationally expensive on both the server and the client than NSEC. Described in RFC 5155.

    NSEC3PARAM

    Used in DNSSECbis to tell the authoritative server which NSEC3 chains are available to use. Described in RFC 5155.

    NXT

    Used in DNSSEC to securely indicate that RRs with an owner name in a certain name interval do not exist in a zone and indicate what RR types are present for an existing name. Used in original DNSSEC; replaced by NSEC in DNSSECbis. Described in RFC 2535.

    PTR

    A pointer to another part of the domain name space. Described in RFC 1035.

    PX

    Provides mappings between RFC 822 and X.400 addresses. Described in RFC 2163.

    RP

    Information on persons responsible for the domain. Experimental. Described in RFC 1183.

    RRSIG

    Contains DNSSECbis signature data. Described in RFC 4034.

    RT

    Route-through binding for hosts that do not have their own direct wide area network addresses. Experimental. Described in RFC 1183.

    SIG

    Contains DNSSEC signature data. Used in original DNSSEC; replaced by RRSIG in DNSSECbis, but still used for SIG(0). Described in RFCs 2535 and 2931.

    SOA

    Identifies the start of a zone of authority. Described in RFC 1035.

    SPF

    Contains the Sender Policy Framework information for a given email domain. Described in RFC 4408.

    SRV

    Information about well known network services (replaces WKS). Described in RFC 2782.

    SSHFP

    Provides a way to securely publish a secure shell key's fingerprint. Described in RFC 4255.

    TXT

    Text records. Described in RFC 1035.

    WKS

    Information about which well known network services, such as SMTP, that a domain supports. Historical.

    X25

    Representation of X.25 network addresses. Experimental. Described in RFC 1183.

    The following classes of resource records are currently valid in the DNS:

    IN

    The Internet.

    CH

    Chaosnet, a LAN protocol created at MIT in the mid-1970s. Rarely used for its historical purpose, but reused for BIND's built-in server information zones, e.g., version.bind.

    HS

    Hesiod, an information service developed by MIT's Project Athena. It is used to share information about various systems databases, such as users, groups, printers and so on.

    The owner name is often implicit, rather than forming an integral part of the RR. For example, many name servers internally form tree or hash structures for the name space, and chain RRs off nodes. The remaining RR parts are the fixed header (type, class, TTL) which is consistent for all RRs, and a variable part (RDATA) that fits the needs of the resource being described.

    The meaning of the TTL field is a time limit on how long an RR can be kept in a cache. This limit does not apply to authoritative data in zones; it is also timed out, but by the refreshing policies for the zone. The TTL is assigned by the administrator for the zone where the data originates. While short TTLs can be used to minimize caching, and a zero TTL prohibits caching, the realities of Internet performance suggest that these times should be on the order of days for the typical host. If a change can be anticipated, the TTL can be reduced prior to the change to minimize inconsistency during the change, and then increased back to its former value following the change.

    The data in the RDATA section of RRs is carried as a combination of binary strings and domain names. The domain names are frequently used as "pointers" to other data in the DNS.

    Textual expression of RRs

    RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form when stored in a name server or resolver. In the examples provided in RFC 1034, a style similar to that used in master files was employed in order to show the contents of RRs. In this format, most RRs are shown on a single line, although continuation lines are possible using parentheses.

    The start of the line gives the owner of the RR. If a line begins with a blank, then the owner is assumed to be the same as that of the previous RR. Blank lines are often included for readability.

    Following the owner, we list the TTL, type, and class of the RR. Class and type use the mnemonics defined above, and TTL is an integer before the type field. In order to avoid ambiguity in parsing, type and class mnemonics are disjoint, TTLs are integers, and the type mnemonic is always last. The IN class and TTL values are often omitted from examples in the interests of clarity.

    The resource data or RDATA section of the RR are given using knowledge of the typical representation for the data.

    For example, we might show the RRs carried in a message as:

    ISI.EDU.

    MX

    10 VENERA.ISI.EDU.

    MX

    10 VAXA.ISI.EDU

    VENERA.ISI.EDU

    A

    128.9.0.32

    A

    10.1.0.52

    VAXA.ISI.EDU

    A

    10.2.0.27

    A

    128.9.0.33

    The MX RRs have an RDATA section which consists of a 16-bit number followed by a domain name. The address RRs use a standard IP address format to contain a 32-bit internet address.

    The above example shows six RRs, with two RRs at each of three domain names.

    Similarly we might see:

    XX.LCS.MIT.EDU.

    IN A

    10.0.0.44

     

    CH A

    MIT.EDU. 2420

    This example shows two addresses for XX.LCS.MIT.EDU, each of a different class.

    Discussion of MX Records

    As described above, domain servers store information as a series of resource records, each of which contains a particular piece of information about a given domain name (which is usually, but not always, a host). The simplest way to think of a RR is as a typed pair of data, a domain name matched with a relevant datum, and stored with some additional type information to help systems determine when the RR is relevant.

    MX records are used to control delivery of email. The data specified in the record is a priority and a domain name. The priority controls the order in which email delivery is attempted, with the lowest number first. If two priorities are the same, a server is chosen randomly. If no servers at a given priority are responding, the mail transport agent will fall back to the next largest priority. Priority numbers do not have any absolute meaning — they are relevant only respective to other MX records for that domain name. The domain name given is the machine to which the mail will be delivered. It must have an associated address record (A or AAAA) — CNAME is not sufficient.

    For a given domain, if there is both a CNAME record and an MX record, the MX record is in error, and will be ignored. Instead, the mail will be delivered to the server specified in the MX record pointed to by the CNAME. For example:

    example.com.

    IN

    MX

    10

    mail.example.com.

    IN

    MX

    10

    mail2.example.com.

    IN

    MX

    20

    mail.backup.org.

    mail.example.com.

    IN

    A

    10.0.0.1

    mail2.example.com.

    IN

    A

    10.0.0.2

    Mail delivery will be attempted to mail.example.com and mail2.example.com (in any order), and if neither of those succeed, delivery to mail.backup.org will be attempted.

    Setting TTLs

    The time-to-live of the RR field is a 32-bit integer represented in units of seconds, and is primarily used by resolvers when they cache RRs. The TTL describes how long a RR can be cached before it should be discarded. The following three types of TTL are currently used in a zone file.

    SOA

    The last field in the SOA is the negative caching TTL. This controls how long other servers will cache no-such-domain (NXDOMAIN) responses from you.

    The maximum time for negative caching is 3 hours (3h).

    $TTL

    The $TTL directive at the top of the zone file (before the SOA) gives a default TTL for every RR without a specific TTL set.

    RR TTLs

    Each RR can have a TTL as the second field in the RR, which will control how long other servers can cache the it.

    All of these TTLs default to units of seconds, though units can be explicitly specified, for example, 1h30m.

    Inverse Mapping in IPv4

    Reverse name resolution (that is, translation from IP address to name) is achieved by means of the in-addr.arpa domain and PTR records. Entries in the in-addr.arpa domain are made in least-to-most significant order, read left to right. This is the opposite order to the way IP addresses are usually written. Thus, a machine with an IP address of 10.1.2.3 would have a corresponding in-addr.arpa name of 3.2.1.10.in-addr.arpa. This name should have a PTR resource record whose data field is the name of the machine or, optionally, multiple PTR records if the machine has more than one name. For example, in the [example.com] domain:

    $ORIGIN

    2.1.10.in-addr.arpa

    3

    IN PTR foo.example.com.

    Note

    The $ORIGIN lines in the examples are for providing context to the examples only — they do not necessarily appear in the actual usage. They are only used here to indicate that the example is relative to the listed origin.

    Other Zone File Directives

    The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format itself is class independent all records in a Master File must be of the same class.

    Master File Directives include $ORIGIN, $INCLUDE, and $TTL.

    The @ (at-sign)

    When used in the label (or name) field, the asperand or at-sign (@) symbol represents the current origin. At the start of the zone file, it is the <zone_name> (followed by trailing dot).

    The $ORIGIN Directive

    Syntax: $ORIGIN domain-name [comment]

    $ORIGIN sets the domain name that will be appended to any unqualified records. When a zone is first read in there is an implicit $ORIGIN <zone_name>. (followed by trailing dot). The current $ORIGIN is appended to the domain specified in the $ORIGIN argument if it is not absolute.

    $ORIGIN example.com.
    WWW     CNAME   MAIN-SERVER
    

    is equivalent to

    WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
    

    The $INCLUDE Directive

    Syntax: $INCLUDE filename [ origin ] [ comment ]

    Read and process the file filename as if it were included into the file at this point. If origin is specified the file is processed with $ORIGIN set to that value, otherwise the current $ORIGIN is used.

    The origin and the current domain name revert to the values they had prior to the $INCLUDE once the file has been read.

    Note

    RFC 1035 specifies that the current origin should be restored after an $INCLUDE, but it is silent on whether the current domain name should also be restored. BIND 9 restores both of them. This could be construed as a deviation from RFC 1035, a feature, or both.

    The $TTL Directive

    Syntax: $TTL default-ttl [ comment ]

    Set the default Time To Live (TTL) for subsequent records with undefined TTLs. Valid TTLs are of the range 0-2147483647 seconds.

    $TTL is defined in RFC 2308.

    BIND Master File Extension: the $GENERATE Directive

    Syntax: $GENERATE range lhs [ttl] [class] type rhs [comment]

    $GENERATE is used to create a series of resource records that only differ from each other by an iterator. $GENERATE can be used to easily generate the sets of records required to support sub /24 reverse delegations described in RFC 2317: Classless IN-ADDR.ARPA delegation.

    $ORIGIN 0.0.192.IN-ADDR.ARPA.
    $GENERATE 1-2 @ NS SERVER$.EXAMPLE.
    $GENERATE 1-127 $ CNAME $.0

    is equivalent to

    0.0.0.192.IN-ADDR.ARPA. NS SERVER1.EXAMPLE.
    0.0.0.192.IN-ADDR.ARPA. NS SERVER2.EXAMPLE.
    1.0.0.192.IN-ADDR.ARPA. CNAME 1.0.0.0.192.IN-ADDR.ARPA.
    2.0.0.192.IN-ADDR.ARPA. CNAME 2.0.0.0.192.IN-ADDR.ARPA.
    ...
    127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA.
    

    Generate a set of A and MX records. Note the MX's right hand side is a quoted string. The quotes will be stripped when the right hand side is processed.

    $ORIGIN EXAMPLE.
    $GENERATE 1-127 HOST-$ A 1.2.3.$
    $GENERATE 1-127 HOST-$ MX "0 ."

    is equivalent to

    HOST-1.EXAMPLE.   A  1.2.3.1
    HOST-1.EXAMPLE.   MX 0 .
    HOST-2.EXAMPLE.   A  1.2.3.2
    HOST-2.EXAMPLE.   MX 0 .
    HOST-3.EXAMPLE.   A  1.2.3.3
    HOST-3.EXAMPLE.   MX 0 .
    ...
    HOST-127.EXAMPLE. A  1.2.3.127
    HOST-127.EXAMPLE. MX 0 .
    

    range

    This can be one of two forms: start-stop or start-stop/step. If the first form is used, then step is set to 1. All of start, stop and step must be positive.

    lhs

    This describes the owner name of the resource records to be created. Any single $ (dollar sign) symbols within the lhs string are replaced by the iterator value. To get a $ in the output, you need to escape the $ using a backslash \, e.g. \$. The $ may optionally be followed by modifiers which change the offset from the iterator, field width and base. Modifiers are introduced by a { (left brace) immediately following the $ as ${offset[,width[,base]]}. For example, ${-20,3,d} subtracts 20 from the current value, prints the result as a decimal in a zero-padded field of width 3. Available output forms are decimal (d), octal (o), hexadecimal (x or X for uppercase) and nibble (n or N\ for uppercase). The default modifier is ${0,0,d}. If the lhs is not absolute, the current $ORIGIN is appended to the name.

    In nibble mode the value will be treated as if it was a reversed hexadecimal string with each hexadecimal digit as a separate label. The width field includes the label separator.

    For compatibility with earlier versions, $$ is still recognized as indicating a literal $ in the output.

    ttl

    Specifies the time-to-live of the generated records. If not specified this will be inherited using the normal TTL inheritance rules.

    class and ttl can be entered in either order.

    class

    Specifies the class of the generated records. This must match the zone class if it is specified.

    class and ttl can be entered in either order.

    type

    Any valid type.

    rhs

    rhs, optionally, quoted string.

    The $GENERATE directive is a BIND extension and not part of the standard zone file format.

    BIND 8 does not support the optional TTL and CLASS fields.

    Additional File Formats

    In addition to the standard textual format, BIND 9 supports the ability to read or dump to zone files in other formats. The raw format is currently available as an additional format. It is a binary format representing BIND 9's internal data structure directly, thereby remarkably improving the loading time.

    For a primary server, a zone file in the raw format is expected to be generated from a textual zone file by the named-compilezone command. For a secondary server or for a dynamic zone, it is automatically generated (if this format is specified by the masterfile-format option) when named dumps the zone contents after zone transfer or when applying prior updates.

    If a zone file in a binary format needs manual modification, it first must be converted to a textual form by the named-compilezone command. All necessary modification should go to the text file, which should then be converted to the binary form by the named-compilezone command again.

    Although the raw format uses the network byte order and avoids architecture-dependent data alignment so that it is as much portable as possible, it is primarily expected to be used inside the same single system. In order to export a zone file in the raw format or make a portable backup of the file, it is recommended to convert the file to the standard textual representation.

    BIND9 Statistics

    BIND 9 maintains lots of statistics information and provides several interfaces for users to get access to the statistics. The available statistics include all statistics counters that were available in BIND 8 and are meaningful in BIND 9, and other information that is considered useful.

    The statistics information is categorized into the following sections.

    Incoming Requests

    The number of incoming DNS requests for each OPCODE.

    Incoming Queries

    The number of incoming queries for each RR type.

    Outgoing Queries

    The number of outgoing queries for each RR type sent from the internal resolver. Maintained per view.

    Name Server Statistics

    Statistics counters about incoming request processing.

    Zone Maintenance Statistics

    Statistics counters regarding zone maintenance operations such as zone transfers.

    Resolver Statistics

    Statistics counters about name resolution performed in the internal resolver. Maintained per view.

    Cache DB RRsets

    The number of RRsets per RR type and nonexistent names stored in the cache database. If the exclamation mark (!) is printed for a RR type, it means that particular type of RRset is known to be nonexistent (this is also known as "NXRRSET"). Maintained per view.

    Socket I/O Statistics

    Statistics counters about network related events.

    A subset of Name Server Statistics is collected and shown per zone for which the server has the authority when zone-statistics is set to yes. These statistics counters are shown with their zone and view names. In some cases the view names are omitted for the default view.

    There are currently two user interfaces to get access to the statistics. One is in the plain text format dumped to the file specified by the statistics-file configuration option. The other is remotely accessible via a statistics channel when the statistics-channels statement is specified in the configuration file (see the section called “statistics-channels Statement Grammar”.)

    The Statistics File

    The text format statistics dump begins with a line, like:

    +++ Statistics Dump +++ (973798949)

    The number in parentheses is a standard Unix-style timestamp, measured as seconds since January 1, 1970. Following that line is a set of statistics information, which is categorized as described above. Each section begins with a line, like:

    ++ Name Server Statistics ++

    Each section consists of lines, each containing the statistics counter value followed by its textual description. See below for available counters. For brevity, counters that have a value of 0 are not shown in the statistics file.

    The statistics dump ends with the line where the number is identical to the number in the beginning line; for example:

    --- Statistics Dump --- (973798949)

    Statistics Counters

    The following tables summarize statistics counters that BIND 9 provides. For each row of the tables, the leftmost column is the abbreviated symbol name of that counter. These symbols are shown in the statistics information accessed via an HTTP statistics channel. The rightmost column gives the description of the counter, which is also shown in the statistics file (but, in this document, possibly with slight modification for better readability). Additional notes may also be provided in this column. When a middle column exists between these two columns, it gives the corresponding counter name of the BIND 8 statistics, if applicable.

    Name Server Statistics Counters

    Symbol

    BIND8 Symbol

    Description

    Requestv4

    RQ

    IPv4 requests received. Note: this also counts non query requests.

    Requestv6

    RQ

    IPv6 requests received. Note: this also counts non query requests.

    ReqEdns0

    Requests with EDNS(0) received.

    ReqBadEDNSVer

    Requests with unsupported EDNS version received.

    ReqTSIG

    Requests with TSIG received.

    ReqSIG0

    Requests with SIG(0) received.

    ReqBadSIG

    Requests with invalid (TSIG or SIG(0)) signature.

    ReqTCP

    RTCP

    TCP requests received.

    AuthQryRej

    RUQ

    Authoritative (non recursive) queries rejected.

    RecQryRej

    RURQ

    Recursive queries rejected.

    XfrRej

    RUXFR

    Zone transfer requests rejected.

    UpdateRej

    RUUpd

    Dynamic update requests rejected.

    Response

    SAns

    Responses sent.

    RespTruncated

    Truncated responses sent.

    RespEDNS0

    Responses with EDNS(0) sent.

    RespTSIG

    Responses with TSIG sent.

    RespSIG0

    Responses with SIG(0) sent.

    QrySuccess

    Queries resulted in a successful answer. This means the query which returns a NOERROR response with at least one answer RR. This corresponds to the success counter of previous versions of BIND 9.

    QryAuthAns

    Queries resulted in authoritative answer.

    QryNoauthAns

    SNaAns

    Queries resulted in non authoritative answer.

    QryReferral

    Queries resulted in referral answer. This corresponds to the referral counter of previous versions of BIND 9.

    QryNxrrset

    Queries resulted in NOERROR responses with no data. This corresponds to the nxrrset counter of previous versions of BIND 9.

    QrySERVFAIL

    SFail

    Queries resulted in SERVFAIL.

    QryFORMERR

    SFErr

    Queries resulted in FORMERR.

    QryNXDOMAIN

    SNXD

    Queries resulted in NXDOMAIN. This corresponds to the nxdomain counter of previous versions of BIND 9.

    QryRecursion

    RFwdQ

    Queries which caused the server to perform recursion in order to find the final answer. This corresponds to the recursion counter of previous versions of BIND 9.

    QryDuplicate

    RDupQ

    Queries which the server attempted to recurse but discovered an existing query with the same IP address, port, query ID, name, type and class already being processed. This corresponds to the duplicate counter of previous versions of BIND 9.

    QryDropped

    Recursive queries for which the server discovered an excessive number of existing recursive queries for the same name, type and class and were subsequently dropped. This is the number of dropped queries due to the reason explained with the clients-per-query and max-clients-per-query options (see the description about clients-per-query.) This corresponds to the dropped counter of previous versions of BIND 9.

    QryFailure

    Other query failures. This corresponds to the failure counter of previous versions of BIND 9. Note: this counter is provided mainly for backward compatibility with the previous versions. Normally a more fine-grained counters such as AuthQryRej and RecQryRej that would also fall into this counter are provided, and so this counter would not be of much interest in practice.

    XfrReqDone

    Requested zone transfers completed.

    UpdateReqFwd

    Update requests forwarded.

    UpdateRespFwd

    Update responses forwarded.

    UpdateFwdFail

    Dynamic update forward failed.

    UpdateDone

    Dynamic updates completed.

    UpdateFail

    Dynamic updates failed.

    UpdateBadPrereq

    Dynamic updates rejected due to prerequisite failure.

    RPZRewrites

    Response policy zone rewrites.

    RateDropped

    Responses dropped by rate limits.

    RateSlipped

    Responses truncated by rate limits.

    Zone Maintenance Statistics Counters

    Symbol

    Description

    NotifyOutv4

    IPv4 notifies sent.

    NotifyOutv6

    IPv6 notifies sent.

    NotifyInv4

    IPv4 notifies received.

    NotifyInv6

    IPv6 notifies received.

    NotifyRej

    Incoming notifies rejected.

    SOAOutv4

    IPv4 SOA queries sent.

    SOAOutv6

    IPv6 SOA queries sent.

    AXFRReqv4

    IPv4 AXFR requested.

    AXFRReqv6

    IPv6 AXFR requested.

    IXFRReqv4

    IPv4 IXFR requested.

    IXFRReqv6

    IPv6 IXFR requested.

    XfrSuccess

    Zone transfer requests succeeded.

    XfrFail

    Zone transfer requests failed.

    Resolver Statistics Counters

    Symbol

    BIND8 Symbol

    Description

    Queryv4

    SFwdQ

    IPv4 queries sent.

    Queryv6

    SFwdQ

    IPv6 queries sent.

    Responsev4

    RR

    IPv4 responses received.

    Responsev6

    RR

    IPv6 responses received.

    NXDOMAIN

    RNXD

    NXDOMAIN received.

    SERVFAIL

    RFail

    SERVFAIL received.

    FORMERR

    RFErr

    FORMERR received.

    OtherError

    RErr

    Other errors received.

    EDNS0Fail

    EDNS(0) query failures.

    Mismatch

    RDupR

    Mismatch responses received. The DNS ID, response's source address, and/or the response's source port does not match what was expected. (The port must be 53 or as defined by the port option.) This may be an indication of a cache poisoning attempt.

    Truncated

    Truncated responses received.

    Lame

    RLame

    Lame delegations received.

    Retry

    SDupQ

    Query retries performed.

    QueryAbort

    Queries aborted due to quota control.

    QuerySockFail

    Failures in opening query sockets. One common reason for such failures is a failure of opening a new socket due to a limitation on file descriptors.

    QueryTimeout

    Query timeouts.

    GlueFetchv4

    SSysQ

    IPv4 NS address fetches invoked.

    GlueFetchv6

    SSysQ

    IPv6 NS address fetches invoked.

    GlueFetchv4Fail

    IPv4 NS address fetch failed.

    GlueFetchv6Fail

    IPv6 NS address fetch failed.

    ValAttempt

    DNSSEC validation attempted.

    ValOk

    DNSSEC validation succeeded.

    ValNegOk

    DNSSEC validation on negative information succeeded.

    ValFail

    DNSSEC validation failed.

    QryRTTnn

    Frequency table on round trip times (RTTs) of queries. Each nn specifies the corresponding frequency. In the sequence of nn_1, nn_2, ..., nn_m, the value of nn_i is the number of queries whose RTTs are between nn_(i-1) (inclusive) and nn_i (exclusive) milliseconds. For the sake of convenience we define nn_0 to be 0. The last entry should be represented as nn_m+, which means the number of queries whose RTTs are equal to or over nn_m milliseconds.

    Socket I/O Statistics Counters

    Socket I/O statistics counters are defined per socket types, which are UDP4 (UDP/IPv4), UDP6 (UDP/IPv6), TCP4 (TCP/IPv4), TCP6 (TCP/IPv6), Unix (Unix Domain), and FDwatch (sockets opened outside the socket module). In the following table <TYPE> represents a socket type. Not all counters are available for all socket types; exceptions are noted in the description field.

    Symbol

    Description

    <TYPE>Open

    Sockets opened successfully. This counter is not applicable to the FDwatch type.

    <TYPE>OpenFail

    Failures of opening sockets. This counter is not applicable to the FDwatch type.

    <TYPE>Close

    Sockets closed.

    <TYPE>BindFail

    Failures of binding sockets.

    <TYPE>ConnFail

    Failures of connecting sockets.

    <TYPE>Conn

    Connections established successfully.

    <TYPE>AcceptFail

    Failures of accepting incoming connection requests. This counter is not applicable to the UDP and FDwatch types.

    <TYPE>Accept

    Incoming connections successfully accepted. This counter is not applicable to the UDP and FDwatch types.

    <TYPE>SendErr

    Errors in socket send operations. This counter corresponds to SErr counter of BIND 8.

    <TYPE>RecvErr

    Errors in socket receive operations. This includes errors of send operations on a connected UDP socket notified by an ICMP error message.

    Compatibility with BIND 8 Counters

    Most statistics counters that were available in BIND 8 are also supported in BIND 9 as shown in the above tables. Here are notes about other counters that do not appear in these tables.

    RFwdR,SFwdR

    These counters are not supported because BIND 9 does not adopt the notion of forwarding as BIND 8 did.

    RAXFR

    This counter is accessible in the Incoming Queries section.

    RIQ

    This counter is accessible in the Incoming Requests section.

    ROpts

    This counter is not supported because BIND 9 does not care about IP options in the first place.

    bind9-9.9.5.dfsg/doc/arm/man.ddns-confgen.html0000644000470500017500000002115512271526120020371 0ustar lamontlamont ddns-confgen

    Name

    ddns-confgen — ddns key generation tool

    Synopsis

    ddns-confgen [-a algorithm] [-h] [-k keyname] [-r randomfile] [ -s name | -z zone ] [-q] [name]

    DESCRIPTION

    ddns-confgen generates a key for use by nsupdate and named. It simplifies configuration of dynamic zones by generating a key and providing the nsupdate and named.conf syntax that will be needed to use it, including an example update-policy statement.

    If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample named.conf syntax. For example, ddns-confgen example.com would generate a key called "ddns-key.example.com", and sample named.conf command that could be used in the zone definition for "example.com".

    Note that named itself can configure a local DDNS key for use with nsupdate -l. ddns-confgen is only needed when a more elaborate configuration is required: for instance, if nsupdate is to be used from a remote system.

    OPTIONS

    -a algorithm

    Specifies the algorithm to use for the TSIG key. Available choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512. The default is hmac-sha256.

    -h

    Prints a short summary of the options and arguments to ddns-confgen.

    -k keyname

    Specifies the key name of the DDNS authentication key. The default is ddns-key when neither the -s nor -z option is specified; otherwise, the default is ddns-key as a separate label followed by the argument of the option, e.g., ddns-key.example.com. The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods.

    -q

    Quiet mode: Print only the key, with no explanatory text or usage examples.

    -r randomfile

    Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -s name

    Single host mode: The example named.conf text shows how to set an update policy for the specified name using the "name" nametype. The default key name is ddns-key.name. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the -z option.

    -z zone

    zone mode: The example named.conf text shows how to set an update policy for the specified zone using the "zonesub" nametype, allowing updates to all subdomain names within that zone. This option cannot be used with the -s option.

    SEE ALSO

    nsupdate(1), named.conf(5), named(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/doc/xsl/0002755000470500017500000000000012271527124014416 5ustar lamontlamontbind9-9.9.5.dfsg/doc/xsl/isc-manpage.xsl.in0000644000470500017500000001117012271526120017730 0ustar lamontlamont .\" ansi .\" .\" $Id$ .\" .hy 0 .ad l .RS .B " : :" .RE .HP .nf .fi bind9-9.9.5.dfsg/doc/xsl/isc-docbook-latex-mappings.xml0000644000470500017500000000301112271526120022247 0ustar lamontlamont % % ------------------------------------------------------------- % Refentry % ------------------------------------------------------------- \section{%title%} \label{%id%}\hypertarget{%id%}{}% bind9-9.9.5.dfsg/doc/xsl/copyright.xsl0000644000470500017500000000575712271526120017165 0ustar lamontlamont Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Copyright (C) bind9-9.9.5.dfsg/doc/xsl/pre-latex.xsl0000644000470500017500000000356612271526120017052 0ustar lamontlamont --- bind9-9.9.5.dfsg/doc/xsl/isc-docbook-latex.xsl.in0000644000470500017500000001363612271526120021064 0ustar lamontlamont 10pt,twoside,openright ansi , % \par [ ] \begin{titlepage} \null\vfil \vskip 60pt \begin{center}% { %\LARGE \Huge \bfseries \par}% \vskip 3em% { %\large \Large \lineskip .75em% \par} %\vskip 1.5em% \vfil % Not sure exactly how much to trim logo, but given that % this is a centered environment, we need not be too precise % so long as the image is centered in the input PDF, we % trim enough for it to fit on page, and we do not trim % so much that we clip out part of the graphic itself. % This seems to work, anyway. \includegraphics[trim=400 400 400 400,scale=2.5]{isc-logo} \end{center}\par \vfil\null \end{titlepage} \thispagestyle{empty} \begin{center} \end{center} \begin{center} \end{center} \vfill \begin{center} Internet System Consortium \\ 950 Charter Street \\ Redwood City, California \\ USA \\ http://www.isc.org/ \end{center} \newpage \pagenumbering{roman} \tableofcontents \newpage \pagenumbering{arabic} \mbox{ } bind9-9.9.5.dfsg/doc/xsl/Makefile.in0000644000470500017500000000203612271526120016455 0ustar lamontlamont# Copyright (C) 2005, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.4 2007/06/19 23:47:13 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ SUBDIRS = TARGETS = @BIND9_MAKE_RULES@ distclean:: rm -f isc-docbook-chunk.xsl isc-docbook-html.xsl \ isc-docbook-latex.xsl isc-manpage.xsl bind9-9.9.5.dfsg/doc/xsl/isc-docbook-text.xsl0000644000470500017500000000336512271526120020324 0ustar lamontlamont bind9-9.9.5.dfsg/doc/xsl/isc-docbook-chunk.xsl.in0000644000470500017500000000433712271526120021055 0ustar lamontlamont ansi - $Id$ bind9-9.9.5.dfsg/doc/xsl/isc-docbook-html.xsl.in0000644000470500017500000000371112271526120020704 0ustar lamontlamont ansi - $Id$ bind9-9.9.5.dfsg/doc/Makefile.in0000644000470500017500000000227012271526120015647 0ustar lamontlamont# Copyright (C) 2004-2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.11 2007/06/19 23:47:13 tbox Exp $ # This Makefile is a placeholder. It exists merely to make # sure that its directory gets created in the object directory # tree when doing a build using separate object directories. srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ SUBDIRS = arm misc xsl doxygen TARGETS = @BIND9_MAKE_RULES@ bind9-9.9.5.dfsg/doc/misc/0002755000470500017500000000000012276444014014544 5ustar lamontlamontbind9-9.9.5.dfsg/doc/misc/migration0000644000470500017500000002611112271526120016451 0ustar lamontlamontCopyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001, 2003 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. BIND 8 to BIND 9 Migration Notes BIND 9 is designed to be mostly upwards compatible with BIND 8, but there is still a number of caveats you should be aware of when upgrading an existing BIND 8 installation to use BIND 9. 1. Configuration File Compatibility 1.1. Unimplemented Options and Changed Defaults BIND 9 supports most, but not all of the named.conf options of BIND 8. For a complete list of implemented options, see doc/misc/options. If your named.conf file uses an unimplemented option, named will log a warning message. A message is also logged about each option whose default has changed unless the option is set explicitly in named.conf. The default of the "transfer-format" option has changed from "one-answer" to "many-answers". If you have slave servers that do not understand the many-answers zone transfer format (e.g., BIND 4.9.5 or older) you need to explicitly specify "transfer-format one-answer;" in either the options block or a server statement. BIND 9.4 onwards implements "allow-query-cache". The "allow-query" option is no longer used to specify access to the cache. The "allow-query" option continues to specify which hosts are allowed to ask ordinary DNS questions. The new "allow-query-cache" option is used to specify which hosts are allowed to get answers from the cache. Since BIND 9.4.1, if "allow-query-cache" is not set then "allow-recursion" is used if it is set, otherwise "allow-query" is used if it is set, otherwise the default localnets and localhost is used. 1.2. Handling of Configuration File Errors In BIND 9, named refuses to start if it detects an error in named.conf. Earlier versions would start despite errors, causing the server to run with a partial configuration. Errors detected during subsequent reloads do not cause the server to exit. Errors in master files do not cause the server to exit, but they do cause the zone not to load. 1.3. Logging The set of logging categories in BIND 9 is different from that in BIND 8. If you have customised your logging on a per-category basis, you need to modify your logging statement to use the new categories. Another difference is that the "logging" statement only takes effect after the entire named.conf file has been read. This means that when the server starts up, any messages about errors in the configuration file are always logged to the default destination (syslog) when the server first starts up, regardless of the contents of the "logging" statement. In BIND 8, the new logging configuration took effect immediately after the "logging" statement was read. 1.4. Notify messages and Refresh queries The source address and port for these is now controlled by "notify-source" and "transfer-source", respectively, rather that query-source as in BIND 8. 1.5. Multiple Classes. Multiple classes have to be put into explicit views for each class. 2. Zone File Compatibility 2.1. Strict RFC1035 Interpretation of TTLs in Zone Files BIND 9 strictly complies with the RFC1035 and RFC2308 rules regarding omitted TTLs in zone files. Omitted TTLs are replaced by the value specified with the $TTL directive, or by the previous explicit TTL if there is no $TTL directive. If there is no $TTL directive and the first RR in the file does not have an explicit TTL field, the zone file is illegal according to RFC1035 since the TTL of the first RR is undefined. Unfortunately, BIND 4 and many versions of BIND 8 accept such files without warning and use the value of the SOA MINTTL field as a default for missing TTL values. BIND 9.0 and 9.1 completely refused to load such files. BIND 9.2 emulates the nonstandard BIND 4/8 SOA MINTTL behaviour and loads the files anyway (provided the SOA is the first record in the file), but will issue the warning message "no TTL specified; using SOA MINTTL instead". To avoid problems, we recommend that you use a $TTL directive in each zone file. 2.2. Periods in SOA Serial Numbers Deprecated Some versions of BIND allow SOA serial numbers with an embedded period, like "3.002", and convert them into integers in a rather unintuitive way. This feature is not supported by BIND 9; serial numbers must be integers. 2.3. Handling of Unbalanced Quotes TXT records with unbalanced quotes, like 'host TXT "foo', were not treated as errors in some versions of BIND. If your zone files contain such records, you will get potentially confusing error messages like "unexpected end of file" because BIND 9 will interpret everything up to the next quote character as a literal string. 2.4. Handling of Line Breaks Some versions of BIND accept RRs containing line breaks that are not properly quoted with parentheses, like the following SOA: @ IN SOA ns.example. hostmaster.example. ( 1 3600 1800 1814400 3600 ) This is not legal master file syntax and will be treated as an error by BIND 9. The fix is to move the opening parenthesis to the first line. 2.5. Unimplemented BIND 8 Extensions $GENERATE: The "$$" construct for getting a literal $ into a domain name is deprecated. Use \$ instead. 2.6. TXT records are no longer automatically split. Some versions of BIND accepted strings in TXT RDATA consisting of more than 255 characters and silently split them to be able to encode the strings in a protocol conformant way. You may now see errors like this dns_rdata_fromtext: local.db:119: ran out of space if you have TXT RRs with too longs strings. Make sure to split the string in the zone data file at or before a single one reaches 255 characters. 3. Interoperability Impact of New Protocol Features 3.1. EDNS0 BIND 9 uses EDNS0 (RFC2671) to advertise its receive buffer size. It also sets DO EDNS flag bit in queries to indicate that it wishes to receive DNSSEC responses. Most older servers that do not support EDNS0, including prior versions of BIND, will send a FORMERR or NOTIMP response to these queries. When this happens, BIND 9 will automatically retry the query without EDNS0. Unfortunately, there exists at least one non-BIND name server implementation that silently ignores these queries instead of sending an error response. Resolving names in zones where all or most authoritative servers use this server will be very slow or fail completely. We have contacted the manufacturer of the name server in case, and they are working on a solution. When BIND 9 communicates with a server that does support EDNS0, such as another BIND 9 server, responses of up to 4096 bytes may be transmitted as a single UDP datagram which is subject to fragmentation at the IP level. If a firewall incorrectly drops IP fragments, it can cause resolution to slow down dramatically or fail. 3.2. Zone Transfers Outgoing zone transfers now use the "many-answers" format by default. This format is not understood by certain old versions of BIND 4. You can work around this problem using the option "transfer-format one-answer;", but since these old versions all have known security problems, the correct fix is to upgrade the slave servers. Zone transfers to Windows 2000 DNS servers sometimes fail due to a bug in the Windows 2000 DNS server where DNS messages larger than 16K are not handled properly. Obtain the latest service pack for Windows 2000 from Microsoft to address this issue. In the meantime, the problem can be worked around by setting "transfer-format one-answer;". http://support.microsoft.com/default.aspx?scid=kb;en-us;297936 4. Unrestricted Character Set BIND 9.2 only BIND 9 does not restrict the character set of domain names - it is fully 8-bit clean in accordance with RFC2181 section 11. It is strongly recommended that hostnames published in the DNS follow the RFC952 rules, but BIND 9 will not enforce this restriction. Historically, some applications have suffered from security flaws where data originating from the network, such as names returned by gethostbyaddr(), are used with insufficient checking and may cause a breach of security when containing unexpected characters; see for details. Some earlier versions of BIND attempt to protect these flawed applications from attack by discarding data containing characters deemed inappropriate in host names or mail addresses, under the control of the "check-names" option in named.conf and/or "options no-check-names" in resolv.conf. BIND 9 provides no such protection; if applications with these flaws are still being used, they should be upgraded. BIND 9.3 onwards implements check-names. 5. Server Administration Tools 5.1 Ndc Replaced by Rndc The "ndc" program has been replaced by "rndc", which is capable of remote operation. Unlike ndc, rndc requires a configuration file. The easiest way to generate a configuration file is to run "rndc-confgen -a"; see the man pages for rndc(8), rndc-confgen(8), and rndc.conf(5) for details. 5.2. Nsupdate Differences The BIND 8 implementation of nsupdate had an undocumented feature where an update request would be broken down into multiple requests based upon the discovered zones that contained the records. This behaviour has not been implemented in BIND 9. Each update request must pertain to a single zone, but it is still possible to do multiple updates in a single invocation of nsupdate by terminating each update with an empty line or a "send" command. 6. No Information Leakage between Zones BIND 9 stores the authoritative data for each zone in a separate data structure, as recommended in RFC1035 and as required by DNSSEC and IXFR. When a BIND 9 server is authoritative for both a child zone and its parent, it will have two distinct sets of NS records at the delegation point: the authoritative NS records at the child's apex, and a set of glue NS records in the parent. BIND 8 was unable to properly distinguish between these two sets of NS records and would "leak" the child's NS records into the parent, effectively causing the parent zone to be silently modified: responses and zone transfers from the parent contained the child's NS records rather than the glue configured into the parent (if any). In the case of children of type "stub", this behaviour was documented as a feature, allowing the glue NS records to be omitted from the parent configuration. Sites that were relying on this BIND 8 behaviour need to add any omitted glue NS records, and any necessary glue A records, to the parent zone. Although stub zones can no longer be used as a mechanism for injecting NS records into their parent zones, they are still useful as a way of directing queries for a given domain to a particular set of name servers. 7. Umask not Modified The BIND 8 named unconditionally sets the umask to 022. BIND 9 does not; the umask inherited from the parent process remains in effect. This may cause files created by named, such as journal files, to be created with different file permissions than they did in BIND 8. If necessary, the umask should be set explicitly in the script used to start the named process. $Id: migration,v 1.49 2008/03/18 15:42:53 jreed Exp $ bind9-9.9.5.dfsg/doc/misc/sort-options.pl0000644000470500017500000000255212271526120017555 0ustar lamontlamont#!/bin/perl # # Copyright (C) 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sort-options.pl,v 1.3 2007/09/24 23:46:48 tbox Exp $ sub sortlevel() { my @options = (); my $fin = ""; my $i = 0; while (<>) { if (/^\s*};$/) { $fin = $_; # print 2, $_; last; } next if (/^$/); if (/{$/) { # print 3, $_; my $sec = $_; push(@options, $sec . sortlevel()); } else { push(@options, $_); # print 1, $_; } $i++; } my $result = ""; foreach my $i (sort @options) { $result = ${result}.${i}; $result = $result."\n" if ($i =~ /^[a-z]/i); # print 5, ${i}; } $result = ${result}.${fin}; return ($result); } print sortlevel(); bind9-9.9.5.dfsg/doc/misc/sdb0000644000470500017500000001462612271526120015240 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. Using the BIND 9 Simplified Database Interface This document describes the care and feeding of the BIND 9 Simplified Database Interface, which allows you to extend BIND 9 with new ways of obtaining the data that is published as DNS zones. The Original BIND 9 Database Interface BIND 9 has a well-defined "back-end database interface" that makes it possible to replace the component of the name server responsible for the storage and retrieval of zone data, called the "database", on a per-zone basis. The default database is an in-memory, red-black-tree data structure commonly referred to as "rbtdb", but it is possible to write drivers to support any number of alternative database technologies such as in-memory hash tables, application specific persistent on-disk databases, object databases, or relational databases. The original BIND 9 database interface defined in is designed to efficiently support the full set of database functionality needed by a name server that implements the complete DNS protocols, including features such as zone transfers, dynamic update, and DNSSEC. Each of these aspects of name server operations places its own set of demands on the data store, with the result that the database API is quite complex and contains operations that are highly specific to the DNS. For example, data are stored in a binary format, the name space is tree structured, and sets of data records are conceptually associated with DNSSEC signature sets. For these reasons, writing a driver using this interface is a highly nontrivial undertaking. The Simplified Database Interface Many BIND users wish to provide access to various data sources through the DNS, but are not necessarily interested in completely replacing the in-memory "rbt" database or in supporting features like dynamic update, DNSSEC, or even zone transfers. Often, all you want is limited, read-only DNS access to an existing system. For example, you may have an existing relational database containing hostname/address mappings and wish to provide forvard and reverse DNS lookups based on this information. Or perhaps you want to set up a simple DNS-based load balancing system where the name server answers queries about a single DNS name with a dynamically changing set of A records. BIND 9.1 introduced a new, simplified database interface, or "sdb", which greatly simplifies the writing of drivers for these kinds of applications. The sdb Driver An sdb driver is an object module, typically written in C, which is linked into the name server and registers itself with the sdb subsystem. It provides a set of callback functions, which also serve to advertise its capabilities. When the name server receives DNS queries, invokes the callback functions to obtain the data to respond with. Unlike the full database interface, the sdb interface represents all domain names and resource records as ASCII text. Writing an sdb Driver When a driver is registered, it specifies its name, a list of callback functions, and flags. The flags specify whether the driver wants to use relative domain names where possible. The callback functions are as follows. The only one that must be defined is lookup(). - create(zone, argc, argv, driverdata, dbdata) Create a database object for "zone". - destroy(zone, driverdata, dbdata) Destroy the database object for "zone". - lookup(zone, name, dbdata, lookup) Return all the records at the domain name "name". - authority(zone, dbdata, lookup) Return the SOA and NS records at the zone apex. - allnodes(zone, dbdata, allnodes) Return all data in the zone, for zone transfers. For more detail about these functions and their parameters, see bind9/lib/dns/include/dns/sdb.h. For example drivers, see bind9/contrib/sdb. Rebuilding the Server The driver module and header file must be copied to (or linked into) the bind9/bin/named and bind9/bin/named/include directories respectively, and must be added to the DBDRIVER_OBJS and DBDRIVER_SRCS lines in bin/named/Makefile.in (e.g. for the timedb sample sdb driver, add timedb.c to DBDRIVER_SRCS and timedb.@O@ to DBDRIVER_OBJS). If the driver needs additional header files or libraries in nonstandard places, the DBDRIVER_INCLUDES and DBDRIVER_LIBS lines should also be updated. Calls to dns_sdb_register() and dns_sdb_unregister() (or wrappers, e.g. timedb_init() and timedb_clear() for the timedb sample sdb driver) must be inserted into the server, in bind9/bin/named/main.c. Registration should be in setup(), before the call to ns_server_create(). Unregistration should be in cleanup(), after the call to ns_server_destroy(). A #include should be added corresponding to the driver header file. You should try doing this with one or more of the sample drivers before attempting to write a driver of your own. Configuring the Server To make a zone use a new database driver, specify a "database" option in its "zone" statement in named.conf. For example, if the driver registers itself under the name "acmedb", you might say zone "foo.com" { database "acmedb"; }; You can pass arbitrary arguments to the create() function of the driver by adding any number of whitespace-separated words after the driver name: zone "foo.com" { database "acmedb -mode sql -connect 10.0.0.1"; }; Hints for Driver Writers - If a driver is generating data on the fly, it probably should not implement the allnodes() function, since a zone transfer will not be meaningful. The allnodes() function is more relevant with data from a database. - The authority() function is necessary if and only if the lookup() function will not add SOA and NS records at the zone apex. If SOA and NS records are provided by the lookup() function, the authority() function should be NULL. - When a driver is registered, an opaque object can be provided. This object is passed into the database create() and destroy() functions. - When a database is created, an opaque object can be created that is associated with that database. This object is passed into the lookup(), authority(), and allnodes() functions, and is destroyed by the destroy() function. Future Directions A future release may support dynamic loading of sdb drivers. $Id: sdb,v 1.6 2004/03/05 05:04:54 marka Exp $ bind9-9.9.5.dfsg/doc/misc/Makefile.in0000644000470500017500000000321512271526120016602 0ustar lamontlamont# Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.9 2009/07/10 23:47:58 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_RULES@ PERL = @PERL@ MANOBJS = options doc man:: ${MANOBJS} docclean manclean maintainer-clean:: rm -f options # Do not make options depend on ../../bin/tests/cfg_test, doing so # will cause excessively clever versions of make to attempt to build # that program right here, right now, if it is missing, which will # cause make doc to bomb. CFG_TEST = ../../bin/tests/cfg_test options: FORCE if test -x ${CFG_TEST} ; \ then \ ${CFG_TEST} --named --grammar > $@.raw ; \ ${PERL} ${srcdir}/sort-options.pl < $@.raw > $@.sorted ; \ ${PERL} ${srcdir}/format-options.pl < $@.sorted > $@.new ; \ mv -f $@.new $@ ; \ rm -f $@.raw $@.sorted ; \ else \ rm -f $@.new $@.raw $@.sorted ; \ fi bind9-9.9.5.dfsg/doc/misc/format-options.pl0000644000470500017500000000274612271526120020063 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: format-options.pl,v 1.5 2007/09/24 04:21:59 marka Exp $ print <) { chomp; s/\t/ /g; my $line = $_; m!^( *)!; my $indent = $1; my $comment = ""; if ( $line =~ m!//.*! ) { $comment = $&; $line =~ s!//.*!!; } my $start = ""; while (length($line) >= 79 - length($comment)) { $_ = $line; # this makes sure that the comment has something in front of it $len = 75 - length($comment); m!^(.{0,$len}) (.*)$!; $start = $start.$1."\n"; $line = $indent." ".$2; } print $start.$line.$comment."\n"; } bind9-9.9.5.dfsg/doc/misc/dnssec0000644000470500017500000000602312271526120015737 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000-2002 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. DNSSEC Release Notes This document summarizes the state of the DNSSEC implementation in this release of BIND9. OpenSSL Library Required To support DNSSEC, BIND 9 must be linked with version 0.9.6e or newer of the OpenSSL library. As of BIND 9.2, the library is no longer included in the distribution - it must be provided by the operating system or installed separately. To build BIND 9 with OpenSSL, use "configure --with-openssl". If the OpenSSL library is installed in a nonstandard location, you can specify a path as in "configure --with-openssl=/var". Key Generation and Signing The tools for generating DNSSEC keys and signatures are now in the bin/dnssec directory. Documentation for these programs can be found in doc/arm/Bv9ARM.4.html and the man pages. The random data used in generating DNSSEC keys and signatures comes from either /dev/random (if the OS supports it) or keyboard input. Alternatively, a device or file containing entropy/random data can be specified. Serving Secure Zones When acting as an authoritative name server, BIND9 includes KEY, SIG and NXT records in responses as specified in RFC2535 when the request has the DO flag set in the query. Secure Resolution Basic support for validation of DNSSEC signatures in responses has been implemented but should still be considered experimental. When acting as a caching name server, BIND9 is capable of performing basic DNSSEC validation of positive as well as nonexistence responses. This functionality is enabled by including a "trusted-keys" clause in the configuration file, containing the top-level zone key of the the DNSSEC tree. Validation of wildcard responses is not currently supported. In particular, a "name does not exist" response will validate successfully even if it does not contain the NXT records to prove the nonexistence of a matching wildcard. Proof of insecure status for insecure zones delegated from secure zones works when the zones are completely insecure. Privately secured zones delegated from secure zones will not work in all cases, such as when the privately secured zone is served by the same server as an ancestor (but not parent) zone. Handling of the CD bit in queries is now fully implemented. Validation is not attempted for recursive queries if CD is set. Secure Dynamic Update Dynamic update of secure zones has been implemented, but may not be complete. Affected NXT and SIG records are updated by the server when an update occurs. Advanced access control is possible using the "update-policy" statement in the zone definition. Secure Zone Transfers BIND 9 does not implement the zone transfer security mechanisms of RFC2535 section 5.6, and we have no plans to implement them in the future as we consider them inferior to the use of TSIG or SIG(0) to ensure the integrity of zone transfers. $Id: dnssec,v 1.19 2004/03/05 05:04:53 marka Exp $ bind9-9.9.5.dfsg/doc/misc/migration-4to90000644000470500017500000000401612271526120017246 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id: migration-4to9,v 1.4 2004/03/05 05:04:53 marka Exp $ BIND 4 to BIND 9 Migration Notes To transition from BIND 4 to BIND 9 you first need to convert your configuration file to the new format. There is a conversion tool in contrib/named-bootconf that allows you to do this. named-bootconf.sh < /etc/named.boot > /etc/named.conf BIND 9 uses a system assigned port for the UDP queries it makes rather than port 53 that BIND 4 uses. This may conflict with some firewalls. The following directives in /etc/named.conf allows you to specify a port to use. query-source address * port 53; transfer-source * port 53; notify-source * port 53; BIND 9 no longer uses the minimum field to specify the TTL of records without a explicit TTL. Use the $TTL directive to specify a default TTL before the first record without a explicit TTL. $TTL 3600 @ IN SOA ns1.example.com. hostmaster.example.com. ( 2001021100 7200 1200 3600000 7200 ) BIND 9 does not support multiple CNAMEs with the same owner name. Illegal: www.example.com. CNAME host1.example.com. www.example.com. CNAME host2.example.com. BIND 9 does not support "CNAMEs with other data" with the same owner name, ignoring the DNSSEC records (SIG, NXT, KEY) that BIND 4 did not support. Illegal: www.example.com. CNAME host1.example.com. www.example.com. MX 10 host2.example.com. BIND 9 is less tolerant of errors in master files, so check your logs and fix any errors reported. The named-checkzone program can also be to check master files. Outgoing zone transfers now use the "many-answers" format by default. This format is not understood by certain old versions of BIND 4. You can work around this problem using the option "transfer-format one-answer;", but since these old versions all have known security problems, the correct fix is to upgrade the slave servers. bind9-9.9.5.dfsg/doc/misc/ipv60000644000470500017500000001070212271526120015343 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. Currently, there are multiple interesting problems with ipv6 implementations on various platforms. These problems range from not being able to use ipv6 with bind9 (or in particular the ISC socket library, contained in libisc) to listen-on lists not being respected, to strange warnings but seemingly correct behavior of named. COMPILE-TIME ISSUES ------------------- The socket library requires a certain level of support from the operating system. In particular, it must follow the advanced ipv6 socket API to be usable. The systems which do not follow this will currently not get any warnings or errors, but ipv6 will simply not function on them. These systems currently include, but are not limited to: AIX 3.4 (with ipv6 patches) RUN-TIME ISSUES --------------- In the original drafts of the ipv6 RFC documents, binding an ipv6 socket to the ipv6 wildcard address would also cause the socket to accept ipv4 connections and datagrams. When an ipv4 packet is received on these systems, it is mapped into an ipv6 address. For example, 1.2.3.4 would be mapped into ::ffff:1.2.3.4. The intent of this mapping was to make transition from an ipv4-only application into ipv6 easier, by only requiring one socket to be open on a given port. Later, it was discovered that this was generally a bad idea. For one, many firewalls will block connection to 1.2.3.4, but will let through ::ffff:1.2.3.4. This, of course, is bad. Also, access control lists written to accept only ipv4 addresses were suddenly ignored unless they were rewritten to handle the ipv6 mapped addresses as well. Partly because of these problems, the latest IPv6 API introduces an explicit knob (the "IPV6_V6ONLY" socket option ) to turn off the ipv6 mapped address usage. In bind9, we first check if both the advanced API and the IPV6_V6ONLY socket option are available. If both of them are available, bind9 named will bind to the ipv6 wildcard port for both TCP and UDP. Otherwise named will make a warning and try to bind to all available ipv6 addresses separately. In any case, bind9 named binds to specific addresses for ipv4 sockets. The followings are historical notes when we always bound to the ipv6 wildcard port regardless of the availability of the API support. These problems should not happen with the closer checks above. IPV6 Sockets Accept IPV4, Specific IPV4 Addresses Bindings Fail --------------------------------------------------------------- The only OS which seems to do this is (some kernel versions of) linux. If an ipv6 socket is bound to the ipv6 wildcard socket, and a specific ipv4 socket is later bound (say, to 1.2.3.4 port 53) the ipv4 binding will fail. What this means to bind9 is that the application will log warnings about being unable to bind to a socket because the address is already in use. Since the ipv6 socket will accept ipv4 packets and map them, however, the ipv4 addresses continue to function. The effect is that the config file listen-on directive will not be respected on these systems. IPV6 Sockets Accept IPV4, Specific IPV4 Address Bindings Succeed ---------------------------------------------------------------- In this case, the system allows opening an ipv6 wildcard address socket and then binding to a more specific ipv4 address later. An example of this type of system is Digital Unix with ipv6 patches applied. What this means to bind9 is that the application will respect listen-on in regards to ipv4 sockets, but it will use mapped ipv6 addresses for any that do not match the listen-on list. This, in effect, makes listen-on useless for these machines as well. IPV6 Sockets Do Not Accept IPV4 ------------------------------- On these systems, opening an IPV6 socket does not implicitly open any ipv4 sockets. An example of these systems are NetBSD-current with the latest KAME patch, and other systems which use the latest KAME patches as their ipv6 implementation. On these systems, listen-on is fully functional, as the ipv6 socket only accepts ipv6 packets, and the ipv4 sockets will handle the ipv4 packets. RELEVANT RFCs ------------- 3513: Internet Protocol Version 6 (IPv6) Addressing Architecture 3493: Basic Socket Interface Extensions for IPv6 3542: Advanced Sockets Application Program Interface (API) for IPv6 $Id: ipv6,v 1.9 2004/08/10 04:27:51 jinmei Exp $ bind9-9.9.5.dfsg/doc/misc/options0000644000470500017500000007063112271526120016161 0ustar lamontlamont This is a summary of the named.conf options supported by this version of BIND 9. acl { ; ... }; controls { inet ( | | * ) [ port ( | * ) ] allow { ; ... } [ keys { ; ... } ]; unix perm owner group [ keys { ; ... } ]; }; dlz { database ; }; key { algorithm ; secret ; }; logging { category { ; ... }; channel { file [ versions ( "unlimited" | ) ] [ size ]; null; print-category ; print-severity ; print-time ; severity ; stderr; syslog ; }; }; lwres { listen-on [ port ] { ( | ) [ port ]; ... }; ndots ; search { ; ... }; view ; }; managed-keys { ; ... }; masters [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; options { acache-cleaning-interval ; acache-enable ; additional-from-auth ; additional-from-cache ; allow-new-zones ; allow-notify { ; ... }; allow-query { ; ... }; allow-query-cache { ; ... }; allow-query-cache-on { ; ... }; allow-query-on { ; ... }; allow-recursion { ; ... }; allow-recursion-on { ; ... }; allow-transfer { ; ... }; allow-update { ; ... }; allow-update-forwarding { ; ... }; allow-v6-synthesis { ; ... }; // obsolete also-notify [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; alt-transfer-source ( | * ) [ port ( | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; attach-cache ; auth-nxdomain ; // default changed auto-dnssec ( allow | maintain | off ); avoid-v4-udp-ports { ; ... }; avoid-v6-udp-ports { ; ... }; bindkeys-file ; blackhole { ; ... }; cache-file ; check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); check-mx-cname ( fail | warn | ignore ); check-names ( master | slave | response ) ( fail | warn | ignore ); check-sibling ; check-spf ( warn | ignore ); check-srv-cname ( fail | warn | ignore ); check-wildcard ; cleaning-interval ; clients-per-query ; coresize ; datasize ; deallocate-on-exit ; // obsolete deny-answer-addresses { ; ... } [ except-from { ; ... } ]; deny-answer-aliases { ; ... } [ except-from { ; ... } ]; dialup ; directory ; disable-algorithms { ; ... }; disable-empty-zone ; dns64 { break-dnssec ; clients { ; ... }; exclude { ; ... }; mapped { ; ... }; recursive-only ; suffix ; }; dns64-contact ; dns64-server ; dnssec-accept-expired ; dnssec-dnskey-kskonly ; dnssec-enable ; dnssec-loadkeys-interval ; dnssec-lookaside ( trust-anchor | auto | no ); dnssec-must-be-secure ; dnssec-secure-to-insecure ; dnssec-update-mode ( maintain | no-resign ); dnssec-validation ( yes | no | auto ); dual-stack-servers [ port ] { ( [ port ] | [ port ] | [ port ] ); ... }; dump-file ; edns-udp-size ; empty-contact ; empty-server ; empty-zones-enable ; fake-iquery ; // obsolete fetch-glue ; // obsolete files ; filter-aaaa { ; ... }; // not configured filter-aaaa-on-v4 ; // not configured flush-zones-on-shutdown ; forward ( first | only ); forwarders [ port ] { ( | ) [ port ]; ... }; has-old-clients ; // obsolete heartbeat-interval ; host-statistics ; // not implemented host-statistics-max ; // not implemented hostname ( | none ); inline-signing ; interface-interval ; ixfr-from-differences ; key-directory ; lame-ttl ; listen-on [ port ] { ; ... }; listen-on-v6 [ port ] { ; ... }; maintain-ixfr-base ; // obsolete managed-keys-directory ; masterfile-format ( text | raw ); match-mapped-addresses ; max-acache-size ; max-cache-size ; max-cache-ttl ; max-clients-per-query ; max-ixfr-log-size ; // obsolete max-journal-size ; max-ncache-ttl ; max-refresh-time ; max-retry-time ; max-rsa-exponent-size ; max-transfer-idle-in ; max-transfer-idle-out ; max-transfer-time-in ; max-transfer-time-out ; max-udp-size ; memstatistics ; memstatistics-file ; min-refresh-time ; min-retry-time ; min-roots ; // not implemented minimal-responses ; multi-master ; multiple-cnames ; // obsolete named-xfer ; // obsolete notify ; notify-delay ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; notify-to-soa ; nsec3-test-zone ; // test only pid-file ( | none ); port ; preferred-glue ; provide-ixfr ; query-source ; query-source-v6 ; querylog ; queryport-pool-ports ; // obsolete queryport-pool-updateinterval ; // obsolete random-device ; recursing-file ; recursion ; recursive-clients ; request-ixfr ; request-nsid ; reserved-sockets ; resolver-query-timeout ; response-policy { zone [ policy ( given | disabled | passthru | no-op | nxdomain | nodata | cname ) ] [ recursive-only ] [ max-policy-ttl ]; ... } [ recursive-only ] [ break-dnssec ] [ max-policy-ttl ] [ min-ns-dots ]; rfc2308-type1 ; // not yet implemented root-delegation-only [ exclude { ; ... } ]; rrset-order { [ class ] [ type ] [ name ] ; ... }; secroots-file ; serial-queries ; // obsolete serial-query-rate ; serial-update-method ( increment | unixtime ); server-id ( | none | hostname ); session-keyalg ; session-keyfile ( | none ); session-keyname ; sig-signing-nodes ; sig-signing-signatures ; sig-signing-type ; sig-validity-interval [ ]; sortlist { ; ... }; stacksize ; statistics-file ; statistics-interval ; // not yet implemented suppress-initial-notify ; // not yet implemented tcp-clients ; tcp-listen-queue ; tkey-dhkey ; tkey-domain ; tkey-gssapi-credential ; tkey-gssapi-keytab ; topology { ; ... }; // not implemented transfer-format ( many-answers | one-answer ); transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; transfers-in ; transfers-out ; transfers-per-ns ; treat-cr-as-space ; // obsolete try-tcp-refresh ; update-check-ksk ; use-alt-transfer-source ; use-id-pool ; // obsolete use-ixfr ; use-queryport-pool ; // obsolete use-v4-udp-ports { ; ... }; use-v6-udp-ports { ; ... }; version ( | none ); zero-no-soa-ttl ; zero-no-soa-ttl-cache ; zone-statistics ; }; server { bogus ; edns ; edns-udp-size ; keys ; max-udp-size ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; provide-ixfr ; query-source ; query-source-v6 ; request-ixfr ; support-ixfr ; // obsolete transfer-format ( many-answers | one-answer ); transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; transfers ; }; statistics-channels { inet ( | | * ) [ port ( | * ) ] [ allow { ; ... } ]; }; trusted-keys { ; ... }; view { acache-cleaning-interval ; acache-enable ; additional-from-auth ; additional-from-cache ; allow-new-zones ; allow-notify { ; ... }; allow-query { ; ... }; allow-query-cache { ; ... }; allow-query-cache-on { ; ... }; allow-query-on { ; ... }; allow-recursion { ; ... }; allow-recursion-on { ; ... }; allow-transfer { ; ... }; allow-update { ; ... }; allow-update-forwarding { ; ... }; allow-v6-synthesis { ; ... }; // obsolete also-notify [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; alt-transfer-source ( | * ) [ port ( | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; attach-cache ; auth-nxdomain ; // default changed auto-dnssec ( allow | maintain | off ); cache-file ; check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); check-mx-cname ( fail | warn | ignore ); check-names ( master | slave | response ) ( fail | warn | ignore ); check-sibling ; check-spf ( warn | ignore ); check-srv-cname ( fail | warn | ignore ); check-wildcard ; cleaning-interval ; clients-per-query ; database ; deny-answer-addresses { ; ... } [ except-from { ; ... } ]; deny-answer-aliases { ; ... } [ except-from { ; ... } ]; dialup ; disable-algorithms { ; ... }; disable-empty-zone ; dlz { database ; }; dns64 { break-dnssec ; clients { ; ... }; exclude { ; ... }; mapped { ; ... }; recursive-only ; suffix ; }; dns64-contact ; dns64-server ; dnssec-accept-expired ; dnssec-dnskey-kskonly ; dnssec-enable ; dnssec-loadkeys-interval ; dnssec-lookaside ( trust-anchor | auto | no ); dnssec-must-be-secure ; dnssec-secure-to-insecure ; dnssec-update-mode ( maintain | no-resign ); dnssec-validation ( yes | no | auto ); dual-stack-servers [ port ] { ( [ port ] | [ port ] | [ port ] ); ... }; edns-udp-size ; empty-contact ; empty-server ; empty-zones-enable ; fetch-glue ; // obsolete filter-aaaa { ; ... }; // not configured filter-aaaa-on-v4 ; // not configured forward ( first | only ); forwarders [ port ] { ( | ) [ port ]; ... }; inline-signing ; ixfr-from-differences ; key { algorithm ; secret ; }; key-directory ; lame-ttl ; maintain-ixfr-base ; // obsolete managed-keys { ; ... }; masterfile-format ( text | raw ); match-clients { ; ... }; match-destinations { ; ... }; match-recursive-only ; max-acache-size ; max-cache-size ; max-cache-ttl ; max-clients-per-query ; max-ixfr-log-size ; // obsolete max-journal-size ; max-ncache-ttl ; max-refresh-time ; max-retry-time ; max-transfer-idle-in ; max-transfer-idle-out ; max-transfer-time-in ; max-transfer-time-out ; max-udp-size ; min-refresh-time ; min-retry-time ; min-roots ; // not implemented minimal-responses ; multi-master ; notify ; notify-delay ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; notify-to-soa ; nsec3-test-zone ; // test only preferred-glue ; provide-ixfr ; query-source ; query-source-v6 ; queryport-pool-ports ; // obsolete queryport-pool-updateinterval ; // obsolete recursion ; request-ixfr ; request-nsid ; resolver-query-timeout ; response-policy { zone [ policy ( given | disabled | passthru | no-op | nxdomain | nodata | cname ) ] [ recursive-only ] [ max-policy-ttl ]; ... } [ recursive-only ] [ break-dnssec ] [ max-policy-ttl ] [ min-ns-dots ]; rfc2308-type1 ; // not yet implemented root-delegation-only [ exclude { ; ... } ]; rrset-order { [ class ] [ type ] [ name ] ; ... }; serial-update-method ( increment | unixtime ); server { bogus ; edns ; edns-udp-size ; keys ; max-udp-size ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; provide-ixfr ; query-source ; query-source-v6 ; request-ixfr ; support-ixfr ; // obsolete transfer-format ( many-answers | one-answer ); transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; transfers ; }; sig-signing-nodes ; sig-signing-signatures ; sig-signing-type ; sig-validity-interval [ ]; sortlist { ; ... }; suppress-initial-notify ; // not yet implemented topology { ; ... }; // not implemented transfer-format ( many-answers | one-answer ); transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; trusted-keys { ; ... }; try-tcp-refresh ; update-check-ksk ; use-alt-transfer-source ; use-queryport-pool ; // obsolete zero-no-soa-ttl ; zero-no-soa-ttl-cache ; zone { allow-notify { ; ... }; allow-query { ; ... }; allow-query-on { ; ... }; allow-transfer { ; ... }; allow-update { ; ... }; allow-update-forwarding { ; ... }; also-notify [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; alt-transfer-source ( | * ) [ port ( | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; auto-dnssec ( allow | maintain | off ); check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); check-mx-cname ( fail | warn | ignore ); check-names ( fail | warn | ignore ); check-sibling ; check-spf ( warn | ignore ); check-srv-cname ( fail | warn | ignore ); check-wildcard ; database ; delegation-only ; dialup ; dnssec-dnskey-kskonly ; dnssec-loadkeys-interval ; dnssec-secure-to-insecure ; dnssec-update-mode ( maintain | no-resign ); file ; forward ( first | only ); forwarders [ port ] { ( | ) [ port ]; ... }; inline-signing ; ixfr-base ; // obsolete ixfr-from-differences ; ixfr-tmp-file ; // obsolete journal ; key-directory ; maintain-ixfr-base ; // obsolete masterfile-format ( text | raw ); masters [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; max-ixfr-log-size ; // obsolete max-journal-size ; max-refresh-time ; max-retry-time ; max-transfer-idle-in ; max-transfer-idle-out ; max-transfer-time-in ; max-transfer-time-out ; min-refresh-time ; min-retry-time ; multi-master ; notify ; notify-delay ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; notify-to-soa ; nsec3-test-zone ; // test only pubkey ; // obsolete request-ixfr ; serial-update-method ( increment | unixtime ); server-addresses { ( | ) [ port ]; ... }; server-names { ; ... }; sig-signing-nodes ; sig-signing-signatures ; sig-signing-type ; sig-validity-interval [ ]; transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; try-tcp-refresh ; type ( master | slave | stub | static-stub | hint | forward | delegation-only | redirect ); update-check-ksk ; update-policy ( local | { ( grant | deny ) ( name | subdomain | wildcard | self | selfsub | selfwild | krb5-self | ms-self | krb5-subdomain | ms-subdomain | tcp-self | 6to4-self | zonesub | external ) [ ] ; ... }; use-alt-transfer-source ; zero-no-soa-ttl ; zone-statistics ; }; zone-statistics ; }; zone { allow-notify { ; ... }; allow-query { ; ... }; allow-query-on { ; ... }; allow-transfer { ; ... }; allow-update { ; ... }; allow-update-forwarding { ; ... }; also-notify [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; alt-transfer-source ( | * ) [ port ( | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; auto-dnssec ( allow | maintain | off ); check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); check-mx-cname ( fail | warn | ignore ); check-names ( fail | warn | ignore ); check-sibling ; check-spf ( warn | ignore ); check-srv-cname ( fail | warn | ignore ); check-wildcard ; database ; delegation-only ; dialup ; dnssec-dnskey-kskonly ; dnssec-loadkeys-interval ; dnssec-secure-to-insecure ; dnssec-update-mode ( maintain | no-resign ); file ; forward ( first | only ); forwarders [ port ] { ( | ) [ port ]; ... }; inline-signing ; ixfr-base ; // obsolete ixfr-from-differences ; ixfr-tmp-file ; // obsolete journal ; key-directory ; maintain-ixfr-base ; // obsolete masterfile-format ( text | raw ); masters [ port ] { ( | [ port ] | [ port ] ) [ key ]; ... }; max-ixfr-log-size ; // obsolete max-journal-size ; max-refresh-time ; max-retry-time ; max-transfer-idle-in ; max-transfer-idle-out ; max-transfer-time-in ; max-transfer-time-out ; min-refresh-time ; min-retry-time ; multi-master ; notify ; notify-delay ; notify-source ( | * ) [ port ( | * ) ]; notify-source-v6 ( | * ) [ port ( | * ) ]; notify-to-soa ; nsec3-test-zone ; // test only pubkey ; // obsolete request-ixfr ; serial-update-method ( increment | unixtime ); server-addresses { ( | ) [ port ]; ... }; server-names { ; ... }; sig-signing-nodes ; sig-signing-signatures ; sig-signing-type ; sig-validity-interval [ ]; transfer-source ( | * ) [ port ( | * ) ]; transfer-source-v6 ( | * ) [ port ( | * ) ]; try-tcp-refresh ; type ( master | slave | stub | static-stub | hint | forward | delegation-only | redirect ); update-check-ksk ; update-policy ( local | { ( grant | deny ) ( name | subdomain | wildcard | self | selfsub | selfwild | krb5-self | ms-self | krb5-subdomain | ms-subdomain | tcp-self | 6to4-self | zonesub | external ) [ ] ; ... }; use-alt-transfer-source ; zero-no-soa-ttl ; zone-statistics ; }; bind9-9.9.5.dfsg/doc/misc/roadmap0000644000470500017500000000376512271526120016115 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2000, 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id: roadmap,v 1.2 2004/03/05 05:04:54 marka Exp $ Road Map to the BIND 9 Source Tree bin/named The name server. This relies heavily on the libraries in lib/isc and lib/dns. client.c Handling of incoming client requests query.c Query processing bin/rndc The remote name daemon control program bin/dig The "dig" program bin/dnssec The DNSSEC signer and other DNSSEC tools bin/nsupdate The "nsupdate" program bin/tests Test suites and miscellaneous test programs bin/tests/system System tests; see bin/tests/system/README lib/dns The DNS library resolver.c The "full resolver" (performs recursive lookups) validator.c The DNSSEC validator db.c The database interface sdb.c The simple database interface rbtdb.c The red-black tree database lib/dns/rdata Routines for handling the various RR types lib/dns/sec Cryptographic libraries for DNSSEC lib/isc The ISC library task.c Task library unix/socket.c Unix implementation of socket library lib/isccfg Routines for reading and writing ISC-style configuration files like named.conf and rndc.conf lib/isccc The command channel library, used by rndc. lib/tests Support code for the test suites. lib/lwres The lightweight resolver library. doc/draft Current internet-drafts pertaining to the DNS doc/rfc RFCs pertaining to the DNS doc/misc Miscellaneous documentation doc/arm The BIND 9 Administrator Reference Manual doc/man Man pages contrib Contributed and other auxiliary code contrib/idn/mdnkit The multilingual domain name evaluation kit contrib/sdb Sample drivers for the simple database interface make Makefile fragments, used by configure The library interfaces are mainly documented in the form of comments in the header files. For example, the task subsystem is documented in lib/isc/include/isc/task.h bind9-9.9.5.dfsg/doc/misc/rfc-compliance0000644000470500017500000000325012271526120017341 0ustar lamontlamontCopyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2001 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id: rfc-compliance,v 1.4 2004/03/05 05:04:53 marka Exp $ BIND 9 is striving for strict compliance with IETF standards. We believe this release of BIND 9 complies with the following RFCs, with the caveats and exceptions listed in the numbered notes below. Note that a number of these RFCs do not have the status of Internet standards but are proposed or draft standards, experimental RFCs, or Best Current Practice (BCP) documents. RFC1034 RFC1035 [1] [2] RFC1123 RFC1183 RFC1535 RFC1536 RFC1706 RFC1712 RFC1750 RFC1876 RFC1982 RFC1995 RFC1996 RFC2136 RFC2163 RFC2181 RFC2230 RFC2308 RFC2535 [3] [4] RFC2536 RFC2537 RFC2538 RFC2539 RFC2671 RFC2672 RFC2673 RFC2782 RFC2915 RFC2930 RFC2931 [5] RFC3007 [1] Queries to zones that have failed to load return SERVFAIL rather than a non-authoritative response. This is considered a feature. [2] CLASS ANY queries are not supported. This is considered a feature. [3] Wildcard records are not supported in DNSSEC secure zones. [4] Servers authoritative for secure zones being resolved by BIND 9 must support EDNS0 (RFC2671), and must return all relevant SIGs and NXTs in responses rather than relying on the resolving server to perform separate queries for missing SIGs and NXTs. [5] When receiving a query signed with a SIG(0), the server will only be able to verify the signature if it has the key in its local authoritative data; it will not do recursion or validation to retrieve unknown keys. bind9-9.9.5.dfsg/README0000644000470500017500000003214112271526120013715 0ustar lamontlamontBIND 9 BIND version 9 is a major rewrite of nearly all aspects of the underlying BIND architecture. Some of the important features of BIND 9 are: - DNS Security DNSSEC (signed zones) TSIG (signed DNS requests) - IP version 6 Answers DNS queries on IPv6 sockets IPv6 resource records (AAAA) Experimental IPv6 Resolver Library - DNS Protocol Enhancements IXFR, DDNS, Notify, EDNS0 Improved standards conformance - Views One server process can provide multiple "views" of the DNS namespace, e.g. an "inside" view to certain clients, and an "outside" view to others. - Multiprocessor Support - Improved Portability Architecture BIND version 9 development has been underwritten by the following organizations: Sun Microsystems, Inc. Hewlett Packard Compaq Computer Corporation IBM Process Software Corporation Silicon Graphics, Inc. Network Associates, Inc. U.S. Defense Information Systems Agency USENIX Association Stichting NLnet - NLnet Foundation Nominum, Inc. For a summary of functional enhancements in previous releases, see the HISTORY file. For a detailed list of user-visible changes from previous releases, see the CHANGES file. For up-to-date release notes and errata, see http://www.isc.org/software/bind9/releasenotes BIND 9.9.5 BIND 9.9.5 is a maintenance release, and patches the security flaws described in CVE-2013-6320 and CVE-2014-0591. It also includes the following functional enhancements: - "named" now preserves the capitalization of names when responding to queries. - new "dnssec-importkey" command allows the use of offline DNSSEC keys with automatic DNSKEY management. - When re-signing a zone, the new "dnssec-signzone -Q" option drops signatures from keys that are still published but are no longer active. - "named-checkconf -px" will print the contents of configuration files with the shared secrets obscured, making it easier to share configuration (e.g. when submitting a bug report) without revealing private information. BIND 9.9.4 BIND 9.9.4 is a maintenance release, and patches the security flaws described in CVE-2013-3919 and CVE-2013-4854. It also introduces DNS Response Rate Limiting (DNS RRL) as a compile-time option. To use this feature, configure with the "--enable-rrl" option. BIND 9.9.3 BIND 9.9.3 is a maintenance release and patches the security flaws described in CVE-2012-5688, CVE-2012-5689 and CVE-2013-2266. BIND 9.9.2 BIND 9.9.2 is a maintenance release and patches the security flaw described in CVE-2012-4244. BIND 9.9.1 BIND 9.9.1 is a maintenance release. BIND 9.9.0 BIND 9.9.0 includes a number of changes from BIND 9.8 and earlier releases. New features include: - Inline signing, allowing automatic DNSSEC signing of master zones without modification of the zonefile, or "bump in the wire" signing in slaves. - NXDOMAIN redirection. - New 'rndc flushtree' command clears all data under a given name from the DNS cache. - New 'rndc sync' command dumps pending changes in a dynamic zone to disk without a freeze/thaw cycle. - New 'rndc signing' command displays or clears signing status records in 'auto-dnssec' zones. - NSEC3 parameters for 'auto-dnssec' zones can now be set prior to signing, eliminating the need to initially sign with NSEC. - Startup time improvements on large authoritative servers. - Slave zones are now saved in raw format by default. - Several improvements to response policy zones (RPZ). - Improved hardware scalability by using multiple threads to listen for queries and using finer-grained client locking - The 'also-notify' option now takes the same syntax as 'masters', so it can used named masterlists and TSIG keys. - 'dnssec-signzone -D' writes an output file containing only DNSSEC data, which can be included by the primary zone file. - 'dnssec-signzone -R' forces removal of signatures that are not expired but were created by a key which no longer exists. - 'dnssec-signzone -X' allows a separate expiration date to be specified for DNSKEY signatures from other signatures. - New '-L' option to dnssec-keygen, dnssec-settime, and dnssec-keyfromlabel sets the default TTL for the key. - dnssec-dsfromkey now supports reading from standard input, to make it easier to convert DNSKEY to DS. - RFC 1918 reverse zones have been added to the empty-zones table per RFC 6303. - Dynamic updates can now optionally set the zone's SOA serial number to the current UNIX time. - DLZ modules can now retrieve the source IP address of the querying client. - 'request-ixfr' option can now be set at the per-zone level. - 'dig +rrcomments' turns on comments about DNSKEY records, indicating their key ID, algorithm and function - Simplified nsupdate syntax and added readline support Building BIND 9 currently requires a UNIX system with an ANSI C compiler, basic POSIX support, and a 64 bit integer type. We've had successful builds and tests on the following systems: COMPAQ Tru64 UNIX 5.1B Fedora Core 6 FreeBSD 4.10, 5.2.1, 6.2 HP-UX 11.11 Mac OS X 10.5 NetBSD 3.x, 4.0-beta, 5.0-beta OpenBSD 3.3 and up Solaris 8, 9, 9 (x86), 10 Ubuntu 7.04, 7.10 Windows XP/2003/2008 NOTE: As of BIND 9.5.1, 9.4.3, and 9.3.6, older versions of Windows, including Windows NT and Windows 2000, are no longer supported. We have recent reports from the user community that a supported version of BIND will build and run on the following systems: AIX 4.3, 5L CentOS 4, 4.5, 5 Darwin 9.0.0d1/ARM Debian 4, 5, 6 Fedora Core 5, 7, 8 FreeBSD 6, 7, 8 HP-UX 11.23 PA MacOS X 10.5, 10.6, 10.7 Red Hat Enterprise Linux 4, 5, 6 SCO OpenServer 5.0.6 Slackware 9, 10 SuSE 9, 10 To build, just ./configure make Do not use a parallel "make". Several environment variables that can be set before running configure will affect compilation: CC The C compiler to use. configure tries to figure out the right one for supported systems. CFLAGS C compiler flags. Defaults to include -g and/or -O2 as supported by the compiler. Please include '-g' if you need to set CFLAGS. STD_CINCLUDES System header file directories. Can be used to specify where add-on thread or IPv6 support is, for example. Defaults to empty string. STD_CDEFINES Any additional preprocessor symbols you want defined. Defaults to empty string. Possible settings: Change the default syslog facility of named/lwresd. -DISC_FACILITY=LOG_LOCAL0 Enable DNSSEC signature chasing support in dig. -DDIG_SIGCHASE=1 (sets -DDIG_SIGCHASE_TD=1 and -DDIG_SIGCHASE_BU=1) Disable dropping queries from particular well known ports. -DNS_CLIENT_DROPPORT=0 Sibling glue checking in named-checkzone is enabled by default. To disable the default check set. -DCHECK_SIBLING=0 named-checkzone checks out-of-zone addresses by default. To disable this default set. -DCHECK_LOCAL=0 To create the default pid files in ${localstatedir}/run rather than ${localstatedir}/run/{named,lwresd}/ set. -DNS_RUN_PID_DIR=0 Enable workaround for Solaris kernel bug about /dev/poll -DISC_SOCKET_USE_POLLWATCH=1 The watch timeout is also configurable, e.g., -DISC_SOCKET_POLLWATCH_TIMEOUT=20 LDFLAGS Linker flags. Defaults to empty string. The following need to be set when cross compiling. BUILD_CC The native C compiler. BUILD_CFLAGS (optional) BUILD_CPPFLAGS (optional) Possible Settings: -DNEED_OPTARG=1 (optarg is not declared in ) BUILD_LDFLAGS (optional) BUILD_LIBS (optional) To build shared libraries, specify "--with-libtool" on the configure command line. For the server to support DNSSEC, you need to build it with crypto support. You must have OpenSSL 0.9.5a or newer installed and specify "--with-openssl" on the configure command line. If OpenSSL is installed under a nonstandard prefix, you can tell configure where to look for it using "--with-openssl=/prefix". On some platforms it is necessary to explictly request large file support to handle files bigger than 2GB. This can be done by "--enable-largefile" on the configure command line. On some platforms, BIND 9 can be built with multithreading support, allowing it to take advantage of multiple CPUs. You can specify whether to build a multithreaded BIND 9 by specifying "--enable-threads" or "--disable-threads" on the configure command line. The default is operating system dependent. Support for the "fixed" rrset-order option can be enabled or disabled by specifying "--enable-fixed-rrset" or "--disable-fixed-rrset" on the configure command line. The default is "disabled", to reduce memory footprint. If your operating system has integrated support for IPv6, it will be used automatically. If you have installed KAME IPv6 separately, use "--with-kame[=PATH]" to specify its location. "make install" will install "named" and the various BIND 9 libraries. By default, installation is into /usr/local, but this can be changed with the "--prefix" option when running "configure". You may specify the option "--sysconfdir" to set the directory where configuration files like "named.conf" go by default, and "--localstatedir" to set the default parent directory of "run/named.pid". For backwards compatibility with BIND 8, --sysconfdir defaults to "/etc" and --localstatedir defaults to "/var" if no --prefix option is given. If there is a --prefix option, sysconfdir defaults to "$prefix/etc" and localstatedir defaults to "$prefix/var". To see additional configure options, run "configure --help". Note that the help message does not reflect the BIND 8 compatibility defaults for sysconfdir and localstatedir. If you're planning on making changes to the BIND 9 source, you should also "make depend". If you're using Emacs, you might find "make tags" helpful. If you need to re-run configure please run "make distclean" first. This will ensure that all the option changes take. Building with gcc is not supported, unless gcc is the vendor's usual compiler (e.g. the various BSD systems, Linux). Known compiler issues: * gcc-3.2.1 and gcc-3.1.1 is known to cause problems with solaris-x86. * gcc prior to gcc-3.2.3 ultrasparc generates incorrect code at -02. * gcc-3.3.5 powerpc generates incorrect code at -02. * Irix, MipsPRO 7.4.1m is known to cause problems. A limited test suite can be run with "make test". Many of the tests require you to configure a set of virtual IP addresses on your system, and some require Perl; see bin/tests/system/README for details. SunOS 4 requires "printf" to be installed to make the shared libraries. sh-utils-1.16 provides a "printf" which compiles on SunOS 4. Known limitations Linux requires kernel build 2.6.39 or later to get the performance benefits from using multiple sockets. Documentation The BIND 9 Administrator Reference Manual is included with the source distribution in DocBook XML and HTML format, in the doc/arm directory. Some of the programs in the BIND 9 distribution have man pages in their directories. In particular, the command line options of "named" are documented in /bin/named/named.8. There is now also a set of man pages for the lwres library. If you are upgrading from BIND 8, please read the migration notes in doc/misc/migration. If you are upgrading from BIND 4, read doc/misc/migration-4to9. Frequently asked questions and their answers can be found in FAQ. Additional information on various subjects can be found in the other README files. Change Log A detailed list of all changes to BIND 9 is included in the file CHANGES, with the most recent changes listed first. Change notes include tags indicating the category of the change that was made; these categories are: [func] New feature [bug] General bug fix [security] Fix for a significant security flaw [experimental] Used for new features when the syntax or other aspects of the design are still in flux and may change [port] Portability enhancement [maint] Updates to built-in data such as root server addresses and keys [tuning] Changes to built-in configuration defaults and constants to improve performanceo [protocol] Updates to the DNS protocol such as new RR types [test] Changes to the automatic tests, not affecting server functionality [cleanup] Minor corrections and refactoring [doc] Documentation In general, [func] and [experimental] tags will only appear in new-feature releases (i.e., those with version numbers ending in zero). Some new functionality may be backported to older releases on a case-by-case basis. All other change types may be applied to all currently-supported releases. Bug Reports and Mailing Lists Bugs reports should be sent to bind9-bugs@isc.org To join the BIND Users mailing list, send mail to bind-users-request@isc.org archives of which can be found via http://www.isc.org/ops/lists/ If you're planning on making changes to the BIND 9 source code, you might want to join the BIND Workers mailing list. Send mail to bind-workers-request@isc.org bind9-9.9.5.dfsg/win32utils/0002755000470500017500000000000012271527124015066 5ustar lamontlamontbind9-9.9.5.dfsg/win32utils/bind9.sln.in0000644000470500017500000015771112271526120017223 0ustar lamontlamont Microsoft Visual Studio Solution File, Format Version 11.00 # Visual C++ Express 2010 # BINDInstall must be the first project Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BINDInstall", "..\bin\win32\BINDInstall\BINDInstall.vcxproj", "{190CC424-E8CC-46F2-9013-3152D6905118}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0} = {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0} @IF TESTS {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} @END TESTS {723C65DA-A96C-4BA3-A34E-44F11CA346F9} = {723C65DA-A96C-4BA3-A34E-44F11CA346F9} {7C8681A1-E3A8-470E-9EEF-16054D111A19} = {7C8681A1-E3A8-470E-9EEF-16054D111A19} {39721F26-8B80-4AA9-9826-2AEF7322C3D5} = {39721F26-8B80-4AA9-9826-2AEF7322C3D5} {140DE800-E552-43CC-B0C7-A33A92E368CA} = {140DE800-E552-43CC-B0C7-A33A92E368CA} {F938F9B8-D395-4A40-BEC7-0122D289C692} = {F938F9B8-D395-4A40-BEC7-0122D289C692} {BA1048A8-6961-4A20-BE12-08BE20611C9D} = {BA1048A8-6961-4A20-BE12-08BE20611C9D} {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5} = {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} {0BF11E21-168C-4CAA-B784-429D126BBAE5} = {0BF11E21-168C-4CAA-B784-429D126BBAE5} {205ED8A9-2E4C-41CC-9385-F3613402AA90} = {205ED8A9-2E4C-41CC-9385-F3613402AA90} {17455DC6-5FBB-47C3-8F44-7DB574A188D3} = {17455DC6-5FBB-47C3-8F44-7DB574A188D3} {6E6297F4-69D7-4533-85E1-BD17C30017C8} = {6E6297F4-69D7-4533-85E1-BD17C30017C8} {D171F185-D3C2-4463-9CF3-ED1D0B1D6832} = {D171F185-D3C2-4463-9CF3-ED1D0B1D6832} {03FB7588-C5A7-4572-968F-14F1206BC69C} = {03FB7588-C5A7-4572-968F-14F1206BC69C} {FD653434-F1A8-44A9-85B2-A7468491DA6D} = {FD653434-F1A8-44A9-85B2-A7468491DA6D} {91E60FDA-E48C-4DA0-92A2-97F963348E00} = {91E60FDA-E48C-4DA0-92A2-97F963348E00} {B19042CE-D3D9-469B-BCD2-C3140150939A} = {B19042CE-D3D9-469B-BCD2-C3140150939A} {4EE91023-94C3-48C0-B71C-5333B726C2EE} = {4EE91023-94C3-48C0-B71C-5333B726C2EE} {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7} = {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7} {70F2F0DF-665D-4444-A982-AEA31A861A22} = {70F2F0DF-665D-4444-A982-AEA31A861A22} {C41266C7-E27E-4D60-9815-82D3B32BF82F} = {C41266C7-E27E-4D60-9815-82D3B32BF82F} {2C1F7096-C5B5-48D4-846F-A7ACA454335D} = {2C1F7096-C5B5-48D4-846F-A7ACA454335D} {03A96113-CB14-43AA-AEB2-48950E3915C5} = {03A96113-CB14-43AA-AEB2-48950E3915C5} {66028555-7DD5-4016-B601-9EF9A1EE8BFA} = {66028555-7DD5-4016-B601-9EF9A1EE8BFA} {64964B03-4815-41F0-9057-E766A94AF197} = {64964B03-4815-41F0-9057-E766A94AF197} {1E2C1635-3093-4D59-80E7-4743AC10F22F} = {1E2C1635-3093-4D59-80E7-4743AC10F22F} {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1} = {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1} @IF PKCS11 {5042D371-0402-4FA3-A52A-769708694422} = {5042D371-0402-4FA3-A52A-769708694422} {C663B088-F7BC-4C8C-8D06-A76636EED651} = {C663B088-F7BC-4C8C-8D06-A76636EED651} {5B3137E5-7E1F-49AA-8810-A09AA417D326} = {5B3137E5-7E1F-49AA-8810-A09AA417D326} @END PKCS11 @IF TESTS @IF ATOMIC {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9} = {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9} @END ATOMIC {E6338E67-3224-4E66-9463-7AD719DA9346} = {E6338E67-3224-4E66-9463-7AD719DA9346} {EE9B94CF-7C33-4F3B-A674-FB756D422C54} = {EE9B94CF-7C33-4F3B-A674-FB756D422C54} {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E} = {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E} {627F32A9-267F-41CA-827C-1FD04DE20A56} = {627F32A9-267F-41CA-827C-1FD04DE20A56} {14071120-84F6-4A6F-BF23-90EC5D0372CE} = {14071120-84F6-4A6F-BF23-90EC5D0372CE} {124DC0D3-3096-41D2-B490-CE85E890FF33} = {124DC0D3-3096-41D2-B490-CE85E890FF33} {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5} = {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5} {66E58849-A764-44E4-8D32-7C1107246A26} = {66E58849-A764-44E4-8D32-7C1107246A26} {351D3872-707B-46AD-8BC0-5A668B8C745B} = {351D3872-707B-46AD-8BC0-5A668B8C745B} {2CB7B128-5954-4FAF-B5EA-501B23BB8054} = {2CB7B128-5954-4FAF-B5EA-501B23BB8054} {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F} = {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F} @END TESTS @IF XTESTS {14751171-C40E-40EE-A2F0-37FFC3CCD4A2} = {14751171-C40E-40EE-A2F0-37FFC3CCD4A2} {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1} = {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1} {7705EEF6-6980-48F9-A045-699DAFE860C9} = {7705EEF6-6980-48F9-A045-699DAFE860C9} {551561F6-4A2A-4824-8A34-A4AF0EB7C179} = {551561F6-4A2A-4824-8A34-A4AF0EB7C179} {6200ED9D-CAB1-4C00-8D79-478F64A19B8F} = {6200ED9D-CAB1-4C00-8D79-478F64A19B8F} {CC7340C1-CBAF-4145-969A-73AE960401D6} = {CC7340C1-CBAF-4145-969A-73AE960401D6} {E55653C8-5501-4871-A97C-C926631F40F9} = {E55653C8-5501-4871-A97C-C926631F40F9} @END XTESTS EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gen", "..\lib\dns\win32\gen.vcxproj", "{A3F71D12-F38A-4C77-8D87-8E8854CA74A1}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libisc", "..\lib\isc\win32\libisc.vcxproj", "{3840E563-D180-4761-AA9C-E6155F02EAFF}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libisccc", "..\lib\isccc\win32\libisccc.vcxproj", "{B556705F-1920-4400-878A-B259D3556047}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdns", "..\lib\dns\win32\libdns.vcxproj", "{5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libisccfg", "..\lib\isccfg\win32\libisccfg.vcxproj", "{B2DFA58C-6347-478E-81E8-01E06999D4F1}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbind9", "..\lib\bind9\win32\libbind9.vcxproj", "{E741C10B-B075-4206-9596-46765B665E03}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblwres", "..\lib\lwres\win32\liblwres.vcxproj", "{EBDB30A3-E8EB-4E1D-915E-06720600A84E}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bindevt", "..\lib\win32\bindevt\bindevt.vcxproj", "{0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject @IF TESTS Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtests", "..\lib\tests\win32\libtests.vcxproj", "{F6F08940-7597-4FEE-9CE0-E09A009C45A3}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject @END TESTS Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "named", "..\bin\named\win32\named.vcxproj", "{723C65DA-A96C-4BA3-A34E-44F11CA346F9}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rndcutil", "..\bin\rndc\win32\rndcutil.vcxproj", "{7C8681A1-E3A8-470E-9EEF-16054D111A19}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rndc", "..\bin\rndc\win32\rndc.vcxproj", "{39721F26-8B80-4AA9-9826-2AEF7322C3D5}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {7C8681A1-E3A8-470E-9EEF-16054D111A19} = {7C8681A1-E3A8-470E-9EEF-16054D111A19} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dighost", "..\bin\dig\win32\dighost.vcxproj", "{140DE800-E552-43CC-B0C7-A33A92E368CA}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dig", "..\bin\dig\win32\dig.vcxproj", "{F938F9B8-D395-4A40-BEC7-0122D289C692}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} {140DE800-E552-43CC-B0C7-A33A92E368CA} = {140DE800-E552-43CC-B0C7-A33A92E368CA} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "host", "..\bin\dig\win32\host.vcxproj", "{BA1048A8-6961-4A20-BE12-08BE20611C9D}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} {140DE800-E552-43CC-B0C7-A33A92E368CA} = {140DE800-E552-43CC-B0C7-A33A92E368CA} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nslookup", "..\bin\dig\win32\nslookup.vcxproj", "{C15A6E1A-94CE-4686-99F9-6BC5FD623EB5}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} {140DE800-E552-43CC-B0C7-A33A92E368CA} = {140DE800-E552-43CC-B0C7-A33A92E368CA} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dnssectool", "..\bin\dnssec\win32\dnssectool.vcxproj", "{2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keygen", "..\bin\dnssec\win32\keygen.vcxproj", "{0BF11E21-168C-4CAA-B784-429D126BBAE5}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "signzone", "..\bin\dnssec\win32\signzone.vcxproj", "{205ED8A9-2E4C-41CC-9385-F3613402AA90}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyfromlabel", "..\bin\dnssec\win32\keyfromlabel.vcxproj", "{17455DC6-5FBB-47C3-8F44-7DB574A188D3}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dsfromkey", "..\bin\dnssec\win32\dsfromkey.vcxproj", "{6E6297F4-69D7-4533-85E1-BD17C30017C8}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "revoke", "..\bin\dnssec\win32\revoke.vcxproj", "{D171F185-D3C2-4463-9CF3-ED1D0B1D6832}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settime", "..\bin\dnssec\win32\settime.vcxproj", "{03FB7588-C5A7-4572-968F-14F1206BC69C}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "verify", "..\bin\dnssec\win32\verify.vcxproj", "{FD653434-F1A8-44A9-85B2-A7468491DA6D}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} = {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arpaname", "..\bin\tools\win32\arpaname.vcxproj", "{91E60FDA-E48C-4DA0-92A2-97F963348E00}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "journalprint", "..\bin\tools\win32\journalprint.vcxproj", "{B19042CE-D3D9-469B-BCD2-C3140150939A}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsec3hash", "..\bin\tools\win32\nsec3hash.vcxproj", "{4EE91023-94C3-48C0-B71C-5333B726C2EE}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrandom", "..\bin\tools\win32\genrandom.vcxproj", "{B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ischmacfixup", "..\bin\tools\win32\ischmacfixup.vcxproj", "{70F2F0DF-665D-4444-A982-AEA31A861A22}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nsupdate", "..\bin\nsupdate\win32\nsupdate.vcxproj", "{C41266C7-E27E-4D60-9815-82D3B32BF82F}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {EBDB30A3-E8EB-4E1D-915E-06720600A84E} = {EBDB30A3-E8EB-4E1D-915E-06720600A84E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "checktool", "..\bin\check\win32\checktool.vcxproj", "{2C1F7096-C5B5-48D4-846F-A7ACA454335D}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "checkconf", "..\bin\check\win32\checkconf.vcxproj", "{03A96113-CB14-43AA-AEB2-48950E3915C5}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {E741C10B-B075-4206-9596-46765B665E03} = {E741C10B-B075-4206-9596-46765B665E03} {2C1F7096-C5B5-48D4-846F-A7ACA454335D} = {2C1F7096-C5B5-48D4-846F-A7ACA454335D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "checkzone", "..\bin\check\win32\checkzone.vcxproj", "{66028555-7DD5-4016-B601-9EF9A1EE8BFA}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {2C1F7096-C5B5-48D4-846F-A7ACA454335D} = {2C1F7096-C5B5-48D4-846F-A7ACA454335D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "confgentool", "..\bin\confgen\win32\confgentool.vcxproj", "{64964B03-4815-41F0-9057-E766A94AF197}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rndcconfgen", "..\bin\confgen\win32\rndcconfgen.vcxproj", "{1E2C1635-3093-4D59-80E7-4743AC10F22F}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {64964B03-4815-41F0-9057-E766A94AF197} = {64964B03-4815-41F0-9057-E766A94AF197} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ddnsconfgen", "..\bin\confgen\win32\ddnsconfgen.vcxproj", "{1EA4FC64-F33B-4A50-970A-EA052BBE9CF1}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {B556705F-1920-4400-878A-B259D3556047} = {B556705F-1920-4400-878A-B259D3556047} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} {64964B03-4815-41F0-9057-E766A94AF197} = {64964B03-4815-41F0-9057-E766A94AF197} EndProjectSection EndProject @IF PKCS11 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pk11keygen", "..\bin\pkcs11\win32\pk11keygen.vcxproj", "{5042D371-0402-4FA3-A52A-769708694422}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pk11list", "..\bin\pkcs11\win32\pk11list.vcxproj", "{C663B088-F7BC-4C8C-8D06-A76636EED651}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pk11destroy", "..\bin\pkcs11\win32\pk11destroy.vcxproj", "{5B3137E5-7E1F-49AA-8810-A09AA417D326}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject @END PKCS11 @IF TESTS @IF ATOMIC Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_atomic", "..\bin\tests\atomic\win32\t_atomic.vcxproj", "{EC6ECB35-58C0-48EC-BAC9-9A652D9406C9}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject @END ATOMIC Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_db", "..\bin\tests\db\win32\t_db.vcxproj", "{E6338E67-3224-4E66-9463-7AD719DA9346}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {B2DFA58C-6347-478E-81E8-01E06999D4F1} = {B2DFA58C-6347-478E-81E8-01E06999D4F1} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_dst", "..\bin\tests\dst\win32\t_dst.vcxproj", "{EE9B94CF-7C33-4F3B-A674-FB756D422C54}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7} = {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_master", "..\bin\tests\master\win32\t_master.vcxproj", "{5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_mem", "..\bin\tests\mem\win32\t_mem.vcxproj", "{627F32A9-267F-41CA-827C-1FD04DE20A56}" ProjectSection(ProjectDependencies) = postProject {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_hashes", "..\bin\tests\hashes\win32\t_hashes.vcxproj", "{14071120-84F6-4A6F-BF23-90EC5D0372CE}" ProjectSection(ProjectDependencies) = postProject {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_names", "..\bin\tests\names\win32\t_names.vcxproj", "{124DC0D3-3096-41D2-B490-CE85E890FF33}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_rbt", "..\bin\tests\rbt\win32\t_rbt.vcxproj", "{39F714D4-FEFB-4E23-91DB-1F6FC80A98B5}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_resolver", "..\bin\tests\resolver\win32\t_resolver.vcxproj", "{66E58849-A764-44E4-8D32-7C1107246A26}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} = {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_sockaddr", "..\bin\tests\sockaddr\win32\t_sockaddr.vcxproj", "{351D3872-707B-46AD-8BC0-5A668B8C745B}" ProjectSection(ProjectDependencies) = postProject {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_tasks", "..\bin\tests\tasks\win32\t_tasks.vcxproj", "{2CB7B128-5954-4FAF-B5EA-501B23BB8054}" ProjectSection(ProjectDependencies) = postProject {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_timers", "..\bin\tests\timers\win32\t_timers.vcxproj", "{4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}" ProjectSection(ProjectDependencies) = postProject {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3} EndProjectSection EndProject @END TESTS @IF XTESTS Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "backtrace_test", "..\bin\tests\win32\backtrace_test.vcxproj", "{14751171-C40E-40EE-A2F0-37FFC3CCD4A2}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "inter_test", "..\bin\tests\win32\inter_test.vcxproj", "{06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rwlock_test", "..\bin\tests\win32\rwlock_test.vcxproj", "{7705EEF6-6980-48F9-A045-699DAFE860C9}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shutdown_test", "..\bin\tests\win32\shutdown_test.vcxproj", "{551561F6-4A2A-4824-8A34-A4AF0EB7C179}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sock_test", "..\bin\tests\win32\sock_test.vcxproj", "{6200ED9D-CAB1-4C00-8D79-478F64A19B8F}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "task_test", "..\bin\tests\win32\task_test.vcxproj", "{CC7340C1-CBAF-4145-969A-73AE960401D6}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timer_test", "..\bin\tests\win32\timer_test.vcxproj", "{E55653C8-5501-4871-A97C-C926631F40F9}" ProjectSection(ProjectDependencies) = postProject {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} = {A3F71D12-F38A-4C77-8D87-8E8854CA74A1} {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF} EndProjectSection EndProject @END XTESTS Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|@PLATFORM@ = Debug|@PLATFORM@ Release|@PLATFORM@ = Release|@PLATFORM@ EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {190CC424-E8CC-46F2-9013-3152D6905118}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {190CC424-E8CC-46F2-9013-3152D6905118}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {190CC424-E8CC-46F2-9013-3152D6905118}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {190CC424-E8CC-46F2-9013-3152D6905118}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {A3F71D12-F38A-4C77-8D87-8E8854CA74A1}.Debug|@BUILD_PLATFORM@.ActiveCfg = Debug|@BUILD_PLATFORM@ {A3F71D12-F38A-4C77-8D87-8E8854CA74A1}.Debug|@BUILD_PLATFORM@.Build.0 = Debug|@BUILD_PLATFORM@ {A3F71D12-F38A-4C77-8D87-8E8854CA74A1}.Release|@BUILD_PLATFORM@.ActiveCfg = Release|@BUILD_PLATFORM@ {A3F71D12-F38A-4C77-8D87-8E8854CA74A1}.Release|@BUILD_PLATFORM@.Build.0 = Release|@BUILD_PLATFORM@ {3840E563-D180-4761-AA9C-E6155F02EAFF}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {3840E563-D180-4761-AA9C-E6155F02EAFF}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {3840E563-D180-4761-AA9C-E6155F02EAFF}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {3840E563-D180-4761-AA9C-E6155F02EAFF}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {B556705F-1920-4400-878A-B259D3556047}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {B556705F-1920-4400-878A-B259D3556047}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {B556705F-1920-4400-878A-B259D3556047}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {B556705F-1920-4400-878A-B259D3556047}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {5FEBFD4E-CCB0-48B9-B733-E15EEB85C16A}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {B2DFA58C-6347-478E-81E8-01E06999D4F1}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {B2DFA58C-6347-478E-81E8-01E06999D4F1}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {B2DFA58C-6347-478E-81E8-01E06999D4F1}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {B2DFA58C-6347-478E-81E8-01E06999D4F1}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {E741C10B-B075-4206-9596-46765B665E03}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {E741C10B-B075-4206-9596-46765B665E03}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {E741C10B-B075-4206-9596-46765B665E03}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {E741C10B-B075-4206-9596-46765B665E03}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {EBDB30A3-E8EB-4E1D-915E-06720600A84E}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {EBDB30A3-E8EB-4E1D-915E-06720600A84E}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {EBDB30A3-E8EB-4E1D-915E-06720600A84E}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {EBDB30A3-E8EB-4E1D-915E-06720600A84E}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {0D745CD9-FC3B-49DC-99BE-1E6DF85593F0}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @IF TESTS {F6F08940-7597-4FEE-9CE0-E09A009C45A3}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {F6F08940-7597-4FEE-9CE0-E09A009C45A3}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {F6F08940-7597-4FEE-9CE0-E09A009C45A3}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {F6F08940-7597-4FEE-9CE0-E09A009C45A3}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @END TESTS {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {723C65DA-A96C-4BA3-A34E-44F11CA346F9}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {7C8681A1-E3A8-470E-9EEF-16054D111A19}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {7C8681A1-E3A8-470E-9EEF-16054D111A19}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {7C8681A1-E3A8-470E-9EEF-16054D111A19}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {7C8681A1-E3A8-470E-9EEF-16054D111A19}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {39721F26-8B80-4AA9-9826-2AEF7322C3D5}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {39721F26-8B80-4AA9-9826-2AEF7322C3D5}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {39721F26-8B80-4AA9-9826-2AEF7322C3D5}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {39721F26-8B80-4AA9-9826-2AEF7322C3D5}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {140DE800-E552-43CC-B0C7-A33A92E368CA}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {140DE800-E552-43CC-B0C7-A33A92E368CA}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {140DE800-E552-43CC-B0C7-A33A92E368CA}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {140DE800-E552-43CC-B0C7-A33A92E368CA}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {F938F9B8-D395-4A40-BEC7-0122D289C692}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {F938F9B8-D395-4A40-BEC7-0122D289C692}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {F938F9B8-D395-4A40-BEC7-0122D289C692}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {F938F9B8-D395-4A40-BEC7-0122D289C692}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {BA1048A8-6961-4A20-BE12-08BE20611C9D}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {BA1048A8-6961-4A20-BE12-08BE20611C9D}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {BA1048A8-6961-4A20-BE12-08BE20611C9D}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {BA1048A8-6961-4A20-BE12-08BE20611C9D}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {C15A6E1A-94CE-4686-99F9-6BC5FD623EB5}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {2CB7DC75-023B-4AA3-AF3A-AE5046A4EE70}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {0BF11E21-168C-4CAA-B784-429D126BBAE5}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {0BF11E21-168C-4CAA-B784-429D126BBAE5}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {0BF11E21-168C-4CAA-B784-429D126BBAE5}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {0BF11E21-168C-4CAA-B784-429D126BBAE5}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {205ED8A9-2E4C-41CC-9385-F3613402AA90}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {205ED8A9-2E4C-41CC-9385-F3613402AA90}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {205ED8A9-2E4C-41CC-9385-F3613402AA90}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {205ED8A9-2E4C-41CC-9385-F3613402AA90}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {17455DC6-5FBB-47C3-8F44-7DB574A188D3}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {17455DC6-5FBB-47C3-8F44-7DB574A188D3}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {17455DC6-5FBB-47C3-8F44-7DB574A188D3}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {17455DC6-5FBB-47C3-8F44-7DB574A188D3}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {6E6297F4-69D7-4533-85E1-BD17C30017C8}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {6E6297F4-69D7-4533-85E1-BD17C30017C8}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {6E6297F4-69D7-4533-85E1-BD17C30017C8}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {6E6297F4-69D7-4533-85E1-BD17C30017C8}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {D171F185-D3C2-4463-9CF3-ED1D0B1D6832}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {D171F185-D3C2-4463-9CF3-ED1D0B1D6832}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {D171F185-D3C2-4463-9CF3-ED1D0B1D6832}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {D171F185-D3C2-4463-9CF3-ED1D0B1D6832}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {03FB7588-C5A7-4572-968F-14F1206BC69C}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {03FB7588-C5A7-4572-968F-14F1206BC69C}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {03FB7588-C5A7-4572-968F-14F1206BC69C}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {03FB7588-C5A7-4572-968F-14F1206BC69C}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {FD653434-F1A8-44A9-85B2-A7468491DA6D}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {FD653434-F1A8-44A9-85B2-A7468491DA6D}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {FD653434-F1A8-44A9-85B2-A7468491DA6D}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {FD653434-F1A8-44A9-85B2-A7468491DA6D}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {91E60FDA-E48C-4DA0-92A2-97F963348E00}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {91E60FDA-E48C-4DA0-92A2-97F963348E00}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {91E60FDA-E48C-4DA0-92A2-97F963348E00}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {91E60FDA-E48C-4DA0-92A2-97F963348E00}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {B19042CE-D3D9-469B-BCD2-C3140150939A}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {B19042CE-D3D9-469B-BCD2-C3140150939A}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {B19042CE-D3D9-469B-BCD2-C3140150939A}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {B19042CE-D3D9-469B-BCD2-C3140150939A}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {4EE91023-94C3-48C0-B71C-5333B726C2EE}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {4EE91023-94C3-48C0-B71C-5333B726C2EE}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {4EE91023-94C3-48C0-B71C-5333B726C2EE}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {4EE91023-94C3-48C0-B71C-5333B726C2EE}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {70F2F0DF-665D-4444-A982-AEA31A861A22}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {70F2F0DF-665D-4444-A982-AEA31A861A22}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {70F2F0DF-665D-4444-A982-AEA31A861A22}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {70F2F0DF-665D-4444-A982-AEA31A861A22}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {C41266C7-E27E-4D60-9815-82D3B32BF82F}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {C41266C7-E27E-4D60-9815-82D3B32BF82F}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {C41266C7-E27E-4D60-9815-82D3B32BF82F}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {C41266C7-E27E-4D60-9815-82D3B32BF82F}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {2C1F7096-C5B5-48D4-846F-A7ACA454335D}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {2C1F7096-C5B5-48D4-846F-A7ACA454335D}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {2C1F7096-C5B5-48D4-846F-A7ACA454335D}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {2C1F7096-C5B5-48D4-846F-A7ACA454335D}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {03A96113-CB14-43AA-AEB2-48950E3915C5}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {03A96113-CB14-43AA-AEB2-48950E3915C5}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {03A96113-CB14-43AA-AEB2-48950E3915C5}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {03A96113-CB14-43AA-AEB2-48950E3915C5}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {66028555-7DD5-4016-B601-9EF9A1EE8BFA}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {66028555-7DD5-4016-B601-9EF9A1EE8BFA}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {66028555-7DD5-4016-B601-9EF9A1EE8BFA}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {66028555-7DD5-4016-B601-9EF9A1EE8BFA}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {64964B03-4815-41F0-9057-E766A94AF197}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {64964B03-4815-41F0-9057-E766A94AF197}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {64964B03-4815-41F0-9057-E766A94AF197}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {64964B03-4815-41F0-9057-E766A94AF197}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {1E2C1635-3093-4D59-80E7-4743AC10F22F}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {1E2C1635-3093-4D59-80E7-4743AC10F22F}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {1E2C1635-3093-4D59-80E7-4743AC10F22F}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {1E2C1635-3093-4D59-80E7-4743AC10F22F}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @IF PKCS11 {5042D371-0402-4FA3-A52A-769708694422}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {5042D371-0402-4FA3-A52A-769708694422}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {5042D371-0402-4FA3-A52A-769708694422}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {5042D371-0402-4FA3-A52A-769708694422}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {C663B088-F7BC-4C8C-8D06-A76636EED651}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {C663B088-F7BC-4C8C-8D06-A76636EED651}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {C663B088-F7BC-4C8C-8D06-A76636EED651}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {C663B088-F7BC-4C8C-8D06-A76636EED651}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {5B3137E5-7E1F-49AA-8810-A09AA417D326}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {5B3137E5-7E1F-49AA-8810-A09AA417D326}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {5B3137E5-7E1F-49AA-8810-A09AA417D326}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {5B3137E5-7E1F-49AA-8810-A09AA417D326}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @END PKCS11 @IF TESTS @IF ATOMIC {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @END ATOMIC {E6338E67-3224-4E66-9463-7AD719DA9346}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {E6338E67-3224-4E66-9463-7AD719DA9346}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {E6338E67-3224-4E66-9463-7AD719DA9346}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {E6338E67-3224-4E66-9463-7AD719DA9346}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {EE9B94CF-7C33-4F3B-A674-FB756D422C54}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {EE9B94CF-7C33-4F3B-A674-FB756D422C54}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {EE9B94CF-7C33-4F3B-A674-FB756D422C54}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {EE9B94CF-7C33-4F3B-A674-FB756D422C54}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {627F32A9-267F-41CA-827C-1FD04DE20A56}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {627F32A9-267F-41CA-827C-1FD04DE20A56}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {627F32A9-267F-41CA-827C-1FD04DE20A56}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {627F32A9-267F-41CA-827C-1FD04DE20A56}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {14071120-84F6-4A6F-BF23-90EC5D0372CE}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {14071120-84F6-4A6F-BF23-90EC5D0372CE}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {14071120-84F6-4A6F-BF23-90EC5D0372CE}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {14071120-84F6-4A6F-BF23-90EC5D0372CE}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {124DC0D3-3096-41D2-B490-CE85E890FF33}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {124DC0D3-3096-41D2-B490-CE85E890FF33}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {124DC0D3-3096-41D2-B490-CE85E890FF33}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {124DC0D3-3096-41D2-B490-CE85E890FF33}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {39F714D4-FEFB-4E23-91DB-1F6FC80A98B5}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {66E58849-A764-44E4-8D32-7C1107246A26}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {66E58849-A764-44E4-8D32-7C1107246A26}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {66E58849-A764-44E4-8D32-7C1107246A26}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {66E58849-A764-44E4-8D32-7C1107246A26}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {351D3872-707B-46AD-8BC0-5A668B8C745B}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {351D3872-707B-46AD-8BC0-5A668B8C745B}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {351D3872-707B-46AD-8BC0-5A668B8C745B}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {351D3872-707B-46AD-8BC0-5A668B8C745B}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {2CB7B128-5954-4FAF-B5EA-501B23BB8054}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {2CB7B128-5954-4FAF-B5EA-501B23BB8054}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {2CB7B128-5954-4FAF-B5EA-501B23BB8054}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {2CB7B128-5954-4FAF-B5EA-501B23BB8054}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @END TESTS @IF XTESTS {14751171-C40E-40EE-A2F0-37FFC3CCD4A2}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {14751171-C40E-40EE-A2F0-37FFC3CCD4A2}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {14751171-C40E-40EE-A2F0-37FFC3CCD4A2}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {14751171-C40E-40EE-A2F0-37FFC3CCD4A2}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {06AA5F16-7121-4C3A-91EF-AFC3BF3B8CE1}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {7705EEF6-6980-48F9-A045-699DAFE860C9}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {7705EEF6-6980-48F9-A045-699DAFE860C9}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {7705EEF6-6980-48F9-A045-699DAFE860C9}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {7705EEF6-6980-48F9-A045-699DAFE860C9}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {551561F6-4A2A-4824-8A34-A4AF0EB7C179}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {551561F6-4A2A-4824-8A34-A4AF0EB7C179}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {551561F6-4A2A-4824-8A34-A4AF0EB7C179}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {551561F6-4A2A-4824-8A34-A4AF0EB7C179}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {6200ED9D-CAB1-4C00-8D79-478F64A19B8F}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {6200ED9D-CAB1-4C00-8D79-478F64A19B8F}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {6200ED9D-CAB1-4C00-8D79-478F64A19B8F}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {6200ED9D-CAB1-4C00-8D79-478F64A19B8F}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {CC7340C1-CBAF-4145-969A-73AE960401D6}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {CC7340C1-CBAF-4145-969A-73AE960401D6}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {CC7340C1-CBAF-4145-969A-73AE960401D6}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {CC7340C1-CBAF-4145-969A-73AE960401D6}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ {E55653C8-5501-4871-A97C-C926631F40F9}.Debug|@PLATFORM@.ActiveCfg = Debug|@PLATFORM@ {E55653C8-5501-4871-A97C-C926631F40F9}.Debug|@PLATFORM@.Build.0 = Debug|@PLATFORM@ {E55653C8-5501-4871-A97C-C926631F40F9}.Release|@PLATFORM@.ActiveCfg = Release|@PLATFORM@ {E55653C8-5501-4871-A97C-C926631F40F9}.Release|@PLATFORM@.Build.0 = Release|@PLATFORM@ @END XTESTS EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bind9-9.9.5.dfsg/win32utils/index.html0000644000470500017500000000465412271526120017065 0ustar lamontlamont Bind9 docs index Bind 9.x documents BIND tools: bind9-9.9.5.dfsg/win32utils/build.txt0000644000470500017500000001634412271526120016727 0ustar lamontlamontCopyright (C) 2013, 2014 Internet Systems Consortium, Inc. ("ISC") See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. BIND 9.10 for Win32 Source Build Instructions. 11-Jul-2013 Building BIND 9.10 on Windows XP/Vista/7/8 or server 2003/2008/2008R2 has the following prerequisites: 1) You need to install Perl for Windows. ActivePerl (http://www.activestate.com/) and Strawberry Perl (http://www.strawberryperl.com) have both been tested and found to work. 2) OpenSSL (http://www.openssl.org) must be downloaded and built on the system on which you are building BIND. 3) If you wish to use the statistics channel, LibXML2 (ftp://xmlsoft.org/libxml2) must be downloaded and built on the system on which you are building BIND. 4) Optional external packages (not used by default) If you wish to use IP geolocation, GeoIP API and database must be downloaded, patched and built on the system on which you are building BIND. If you wish to use readline, the readline library must be downloaded and built on the system on which you are building BIND. 5) The BIND Installer (BINDInstall) includes a copy of the redistributable runtime object vcredist_x86.exe (or vcredist_x64.exe), which is included with Visual Studio and can be downloaded from Microsoft. This file must be in place prior to running the build setup script. Step 1: Download and build OpenSSL OpenSSL is required for DNSSEC. If you wish to build BIND 9 without DNSSEC support, skip to step 2. Download and untar the OpenSSL sources from http://www.openssl.org/. Extract them at in the same directory in which you extracted the BIND 9 source: If BIND 9 is in \build\bind-9.10.0, for instance, OpenSSL should be in \build\openssl-1.0.1f (subject to version number changes). Note: Building OpenSSL requires that you install Perl as it uses it during its build process. The following commands work as of openssl-1.0.1f, but you should check the OpenSSL distribution to see if the build instructions in the INSTALL.W32 (or INSTALL.W64) file have changed, in particular for the assembler options: cd openssl-1.0.1f perl Configure --prefix=c:/openssl enable-static-engine VC-WIN32 ms\do_ms nmake /f ms\ntdll.mak For 64 bit build, replace VC-WIN32 by VC-WIN64A. The enable-static-engine is needed when an OpenSSL engine will be used, so with GOST support (configured by default) and/or PKCS #11 support. If you wish to use PKCS #11 to control a cryptographic hardware service module, please see "PKCS #11 (Cryptoki) support" in chapter 4 of the BIND 9 Administrator Reference Guide. You will need to apply the patch in bind9\bin\pkcs11\openssl-1.0.1f-patch (this can be done using the Cygwin 'patch' utility) and add --pk11-libname and --pk11-flavor to the Configure command above. Step 2: Download and build LibXML2 LibXML2 is required to use the statistics channel. If you wish to build BIND 9 without support for this feature, skip to step 3. Download and untar the libxml2 sources from ftp://xmlsoft.org/libxml2. Extract them in the same directory in which you extracted the BIND 9 source: If BIND 9 is in \build\bind-9.10.0, for instance, libxml2 should be in \build\libxml2-2.9.1 (subject to version number changes). Now build libxml2, and copy the resulting files into the include and lib directories: cd libxml2-2.9.1\win32 cscript configure.js compiler=msvc vcmanifest=yes static=yes \ debug=no iconv=no nmake /f Makefile.msvc libxml Step 3: Download and build optional external packages (GeoIP, readline) 3a) GeoIP is required to use IP geolocation. If you wish to build BIND 9 without support for this feature, skip to step 3b. The URL is: http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.5.1.tar.gz The current (version 1.5.1) GeoIP does not build a suitable DLL with safe threading. The GeoIP.diff file: - fixes WIN32 building support - makes pread() safe in a multi-threaded system - changes the Makefile.vc to build a DLL in place of a static library (BTW this is required by the previous point) 3b) The readline library adds command-line editing in nslookup and nsupdate. If you wish to build BIND 9 without support for this feature, skip to step 4. Because the original GNU source for the readline library has no WIN32 support, it will be necessary to download a version of the static readline library source that is ready to be built by Visual Studio. One such version is available at: http://gpsim.sourceforge.net/gpsimWin32/packages/readline-5.2-20061112-src.zip Step 4: Make the redistributable runtime object available Check that the Microsoft redistributable object (vcredist_x86.exe or vcredist_x64.exe) is available to the build. The file may be placed in the directory in which the BIND 9 source was extracted (for instance, if BIND 9 is in \build\bind-9.10.0, the redistributable may be placed in \build\vcredist_x86.exe). Or, the path to the file can be specified via the VCREDIST_PATH environment variable, or via the "with-vcredist=PATH" option to the configuration script (see step 4). Step 5: Configuring the BIND build From the command prompt, cd to the win32utils directory under the BIND 9 root: cd bind-9.10.0\win32utils In this directory, you can prepare the Windows build by running: perl Configure win32 For 64 bit: perl Configure x64 This will set up all the files needed for building BIND 9 according to the given options. To see the available options, run: perl Configure help To remove all files generated by Configure, run: perl Configure clean Step 5: Building BIND To build using 'nmake' or older versions of Visual Studio (e.g. VS 2005 and 2008), go to the legacy subdirectory: cd legacy and follow the instructions in win32-build.txt. Note that only 32 bit builds are supported in this mode. To build using the Visual Studio GUI (VS 2010 and 2012): open the bind9.sln solution file; this will load the project files for all of the BIND 9 libraries and applications. Select "Build->Batch Build", click "Select All", then click "Build". To build using MSBuild (VS 2010 and 2012): call MSBuild on the bind9.sln solution file: msbuild /t:Build /p:Configuration=Release && \ msbuild /t:Build /p:Configuration=Debug Step 6: Install Installation is accomplished by running the BINDInstall program. All DLL's are copied to the system32 area and all applications (including BINDInstall which may be necessary for uninstalling BIND 9) to the dns/bin directory. If BIND 8 has previously been installed on the system it must be uninstalled first by running it's own BINDInstall program. The BIND 9 installer does not yet do this. Note: BINDInstall.exe requires the MFC (Microsoft Foundation Class). This is only distributed with non-free (i.e., not "Express") versions of Visual Studio. The other BIND 9 libraries and applications do not have this dependency. Please report bugs, whether in the process of building the application or in BIND 9 itself, to bind9-bugs@isc.org. bind9-9.9.5.dfsg/win32utils/Configure0000644000470500017500000024162712271526120016737 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2013, 2014 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # Configure # # This script builds nmake and visual studio build files # require 5.000; use strict; use File::Spec; # files to configure my $configfilein = "..\\config.h.win32"; my $configfileout = ">..\\config.h"; my $platformfile = "..\\lib\\isc\\win32\\include\\isc\\platform.h"; my @filelist = ("..\\bin\\check\\win32\\checktool.dsp", "..\\bin\\check\\win32\\checkconf.dsp", "..\\bin\\check\\win32\\checkconf.mak", "..\\bin\\check\\win32\\checkzone.dsp", "..\\bin\\check\\win32\\checkzone.mak", "..\\bin\\confgen\\win32\\confgentool.dsp", "..\\bin\\confgen\\win32\\ddnsconfgen.dsp", "..\\bin\\confgen\\win32\\ddnsconfgen.mak", "..\\bin\\confgen\\win32\\rndcconfgen.dsp", "..\\bin\\confgen\\win32\\rndcconfgen.mak", "..\\bin\\dig\\win32\\dig.dsp", "..\\bin\\dig\\win32\\dig.mak", "..\\bin\\dig\\win32\\dighost.dsp", "..\\bin\\dig\\win32\\host.dsp", "..\\bin\\dig\\win32\\host.mak", "..\\bin\\dig\\win32\\nslookup.dsp", "..\\bin\\dig\\win32\\nslookup.mak", "..\\bin\\dnssec\\win32\\dnssectool.dsp", "..\\bin\\dnssec\\win32\\dsfromkey.dsp", "..\\bin\\dnssec\\win32\\dsfromkey.mak", "..\\bin\\dnssec\\win32\\importkey.dsp", "..\\bin\\dnssec\\win32\\importkey.mak", "..\\bin\\dnssec\\win32\\keyfromlabel.dsp", "..\\bin\\dnssec\\win32\\keyfromlabel.mak", "..\\bin\\dnssec\\win32\\keygen.dsp", "..\\bin\\dnssec\\win32\\keygen.mak", "..\\bin\\dnssec\\win32\\revoke.dsp", "..\\bin\\dnssec\\win32\\revoke.mak", "..\\bin\\dnssec\\win32\\settime.dsp", "..\\bin\\dnssec\\win32\\settime.mak", "..\\bin\\dnssec\\win32\\signzone.dsp", "..\\bin\\dnssec\\win32\\signzone.mak", "..\\bin\\dnssec\\win32\\verify.dsp", "..\\bin\\dnssec\\win32\\verify.mak", "..\\bin\\named\\win32\\named.dsp", "..\\bin\\named\\win32\\named.mak", "..\\bin\\nsupdate\\win32\\nsupdate.dsp", "..\\bin\\nsupdate\\win32\\nsupdate.mak", "..\\bin\\pkcs11\\win32\\pk11destroy.dsp", "..\\bin\\pkcs11\\win32\\pk11destroy.mak", "..\\bin\\pkcs11\\win32\\pk11keygen.dsp", "..\\bin\\pkcs11\\win32\\pk11keygen.mak", "..\\bin\\pkcs11\\win32\\pk11list.dsp", "..\\bin\\pkcs11\\win32\\pk11list.mak", "..\\bin\\python\\dnssec-checkds.py", "..\\bin\\python\\dnssec-coverage.py", "..\\bin\\rndc\\win32\\rndc.dsp", "..\\bin\\rndc\\win32\\rndc.mak", "..\\bin\\rndc\\win32\\rndcutil.dsp", "..\\bin\\tools\\win32\\arpaname.dsp", "..\\bin\\tools\\win32\\arpaname.mak", "..\\bin\\tools\\win32\\genrandom.dsp", "..\\bin\\tools\\win32\\genrandom.mak", "..\\bin\\tools\\win32\\ischmacfixup.dsp", "..\\bin\\tools\\win32\\ischmacfixup.mak", "..\\bin\\tools\\win32\\journalprint.dsp", "..\\bin\\tools\\win32\\journalprint.mak", "..\\bin\\tools\\win32\\nsec3hash.dsp", "..\\bin\\tools\\win32\\nsec3hash.mak", "..\\bin\\tests\\atomic\\win32\\t_atomic.dsp", "..\\bin\\tests\\atomic\\win32\\t_atomic.mak", "..\\bin\\tests\\db\\win32\\t_db.dsp", "..\\bin\\tests\\db\\win32\\t_db.mak", "..\\bin\\tests\\dst\\win32\\t_dst.dsp", "..\\bin\\tests\\dst\\win32\\t_dst.mak", "..\\bin\\tests\\master\\win32\\t_master.dsp", "..\\bin\\tests\\master\\win32\\t_master.mak", "..\\bin\\tests\\mem\\win32\\t_mem.dsp", "..\\bin\\tests\\mem\\win32\\t_mem.mak", "..\\bin\\tests\\hashes\\win32\\t_hashes.dsp", "..\\bin\\tests\\hashes\\win32\\t_hashes.mak", "..\\bin\\tests\\names\\win32\\t_names.dsp", "..\\bin\\tests\\names\\win32\\t_names.mak", "..\\bin\\tests\\rbt\\win32\\t_rbt.dsp", "..\\bin\\tests\\rbt\\win32\\t_rbt.mak", "..\\bin\\tests\\resolver\\win32\\t_resolver.dsp", "..\\bin\\tests\\resolver\\win32\\t_resolver.mak", "..\\bin\\tests\\sockaddr\\win32\\t_sockaddr.dsp", "..\\bin\\tests\\sockaddr\\win32\\t_sockaddr.mak", "..\\bin\\tests\\tasks\\win32\\t_tasks.dsp", "..\\bin\\tests\\tasks\\win32\\t_tasks.mak", "..\\bin\\tests\\timers\\win32\\t_timers.dsp", "..\\bin\\tests\\timers\\win32\\t_timers.mak", "..\\bin\\tests\\win32\\backtrace_test.dsp", "..\\bin\\tests\\win32\\backtrace_test.mak", "..\\bin\\tests\\win32\\inter_test.dsp", "..\\bin\\tests\\win32\\inter_test.mak", "..\\bin\\tests\\win32\\rwlock_test.dsp", "..\\bin\\tests\\win32\\rwlock_test.mak", "..\\bin\\tests\\win32\\shutdown_test.dsp", "..\\bin\\tests\\win32\\shutdown_test.mak", "..\\bin\\tests\\win32\\sock_test.dsp", "..\\bin\\tests\\win32\\sock_test.mak", "..\\bin\\tests\\win32\\task_test.dsp", "..\\bin\\tests\\win32\\task_test.mak", "..\\bin\\tests\\win32\\timer_test.dsp", "..\\bin\\tests\\win32\\timer_test.mak", "..\\bin\\tests\\win32\\inter_test.dsp", "..\\bin\\tests\\win32\\inter_test.mak", "..\\bin\\tests\\win32\\rwlock_test.dsp", "..\\bin\\tests\\win32\\rwlock_test.mak", "..\\bin\\tests\\win32\\shutdown_test.dsp", "..\\bin\\tests\\win32\\shutdown_test.mak", "..\\bin\\tests\\win32\\sock_test.dsp", "..\\bin\\tests\\win32\\sock_test.mak", "..\\bin\\tests\\win32\\task_test.dsp", "..\\bin\\tests\\win32\\task_test.mak", "..\\bin\\tests\\win32\\timer_test.dsp", "..\\bin\\tests\\win32\\timer_test.mak", "..\\bin\\win32\\BINDInstall\\BINDInstall.dsp", "..\\bin\\win32\\BINDInstall\\BINDInstall.mak", "..\\lib\\bind9\\win32\\libbind9.dsp", "..\\lib\\bind9\\win32\\libbind9.mak", "..\\lib\\dns\\win32\\gen.dsp", "..\\lib\\dns\\win32\\gen.mak", "..\\lib\\dns\\win32\\libdns.def", "..\\lib\\dns\\win32\\libdns.dsp", "..\\lib\\dns\\win32\\libdns.mak", "..\\lib\\isc\\win32\\libisc.def", "..\\lib\\isc\\win32\\libisc.dsp", "..\\lib\\isc\\win32\\libisc.mak", "..\\lib\\isccc\\win32\\libisccc.dsp", "..\\lib\\isccc\\win32\\libisccc.mak", "..\\lib\\isccfg\\win32\\libisccfg.dsp", "..\\lib\\isccfg\\win32\\libisccfg.mak", "..\\lib\\lwres\\win32\\liblwres.dsp", "..\\lib\\lwres\\win32\\liblwres.mak", "..\\lib\\tests\\win32\\libtests.dsp", "..\\lib\\tests\\win32\\libtests.mak", "..\\lib\\win32\\bindevt\\bindevt.dsp", "..\\lib\\win32\\bindevt\\bindevt.mak", "legacy\\BINDBuild.dsw", "legacy\\BuildAll.bat", "legacy\\BuildPost.bat", "legacy\\BuildSetup.bat"); my @projectlist = ("..\\bin\\check\\win32\\checkconf.vcxproj", "..\\bin\\check\\win32\\checkconf.vcxproj.filters", "..\\bin\\check\\win32\\checktool.vcxproj", "..\\bin\\check\\win32\\checktool.vcxproj.filters", "..\\bin\\check\\win32\\checkzone.vcxproj", "..\\bin\\check\\win32\\checkzone.vcxproj.filters", "..\\bin\\confgen\\win32\\confgentool.vcxproj", "..\\bin\\confgen\\win32\\confgentool.vcxproj.filters", "..\\bin\\confgen\\win32\\ddnsconfgen.vcxproj", "..\\bin\\confgen\\win32\\ddnsconfgen.vcxproj.filters", "..\\bin\\confgen\\win32\\rndcconfgen.vcxproj", "..\\bin\\confgen\\win32\\rndcconfgen.vcxproj.filters", "..\\bin\\dig\\win32\\dig.vcxproj", "..\\bin\\dig\\win32\\dig.vcxproj.filters", "..\\bin\\dig\\win32\\dighost.vcxproj", "..\\bin\\dig\\win32\\dighost.vcxproj.filters", "..\\bin\\dig\\win32\\host.vcxproj", "..\\bin\\dig\\win32\\host.vcxproj.filters", "..\\bin\\dig\\win32\\nslookup.vcxproj", "..\\bin\\dig\\win32\\nslookup.vcxproj.filters", "..\\bin\\dnssec\\win32\\dnssectool.vcxproj", "..\\bin\\dnssec\\win32\\dnssectool.vcxproj.filters", "..\\bin\\dnssec\\win32\\dsfromkey.vcxproj", "..\\bin\\dnssec\\win32\\dsfromkey.vcxproj.filters", "..\\bin\\dnssec\\win32\\importkey.vcxproj", "..\\bin\\dnssec\\win32\\importkey.vcxproj.filters", "..\\bin\\dnssec\\win32\\keyfromlabel.vcxproj", "..\\bin\\dnssec\\win32\\keyfromlabel.vcxproj.filters", "..\\bin\\dnssec\\win32\\keygen.vcxproj", "..\\bin\\dnssec\\win32\\keygen.vcxproj.filters", "..\\bin\\dnssec\\win32\\revoke.vcxproj", "..\\bin\\dnssec\\win32\\revoke.vcxproj.filters", "..\\bin\\dnssec\\win32\\settime.vcxproj", "..\\bin\\dnssec\\win32\\settime.vcxproj.filters", "..\\bin\\dnssec\\win32\\signzone.vcxproj", "..\\bin\\dnssec\\win32\\signzone.vcxproj.filters", "..\\bin\\dnssec\\win32\\verify.vcxproj", "..\\bin\\dnssec\\win32\\verify.vcxproj.filters", "..\\bin\\named\\win32\\named.vcxproj", "..\\bin\\named\\win32\\named.vcxproj.filters", "..\\bin\\nsupdate\\win32\\nsupdate.vcxproj", "..\\bin\\nsupdate\\win32\\nsupdate.vcxproj.filters", "..\\bin\\pkcs11\\win32\\pk11destroy.vcxproj", "..\\bin\\pkcs11\\win32\\pk11destroy.vcxproj.filters", "..\\bin\\pkcs11\\win32\\pk11keygen.vcxproj", "..\\bin\\pkcs11\\win32\\pk11keygen.vcxproj.filters", "..\\bin\\pkcs11\\win32\\pk11list.vcxproj", "..\\bin\\pkcs11\\win32\\pk11list.vcxproj.filters", "..\\bin\\rndc\\win32\\rndc.vcxproj", "..\\bin\\rndc\\win32\\rndc.vcxproj.filters", "..\\bin\\rndc\\win32\\rndcutil.vcxproj", "..\\bin\\rndc\\win32\\rndcutil.vcxproj.filters", "..\\bin\\tools\\win32\\arpaname.vcxproj", "..\\bin\\tools\\win32\\arpaname.vcxproj.filters", "..\\bin\\tools\\win32\\genrandom.vcxproj", "..\\bin\\tools\\win32\\genrandom.vcxproj.filters", "..\\bin\\tools\\win32\\ischmacfixup.vcxproj", "..\\bin\\tools\\win32\\ischmacfixup.vcxproj.filters", "..\\bin\\tools\\win32\\journalprint.vcxproj", "..\\bin\\tools\\win32\\journalprint.vcxproj.filters", "..\\bin\\tools\\win32\\nsec3hash.vcxproj", "..\\bin\\tools\\win32\\nsec3hash.vcxproj.filters", "..\\bin\\tests\\atomic\\win32\\t_atomic.vcxproj", "..\\bin\\tests\\atomic\\win32\\t_atomic.vcxproj.filters", "..\\bin\\tests\\db\\win32\\t_db.vcxproj", "..\\bin\\tests\\db\\win32\\t_db.vcxproj.filters", "..\\bin\\tests\\dst\\win32\\t_dst.vcxproj", "..\\bin\\tests\\dst\\win32\\t_dst.vcxproj.filters", "..\\bin\\tests\\master\\win32\\t_master.vcxproj", "..\\bin\\tests\\master\\win32\\t_master.vcxproj.filters", "..\\bin\\tests\\mem\\win32\\t_mem.vcxproj", "..\\bin\\tests\\mem\\win32\\t_mem.vcxproj.filters", "..\\bin\\tests\\hashes\\win32\\t_hashes.vcxproj", "..\\bin\\tests\\hashes\\win32\\t_hashes.vcxproj.filters", "..\\bin\\tests\\names\\win32\\t_names.vcxproj", "..\\bin\\tests\\names\\win32\\t_names.vcxproj.filters", "..\\bin\\tests\\rbt\\win32\\t_rbt.vcxproj", "..\\bin\\tests\\rbt\\win32\\t_rbt.vcxproj.filters", "..\\bin\\tests\\resolver\\win32\\t_resolver.vcxproj", "..\\bin\\tests\\resolver\\win32\\t_resolver.vcxproj.filters", "..\\bin\\tests\\sockaddr\\win32\\t_sockaddr.vcxproj", "..\\bin\\tests\\sockaddr\\win32\\t_sockaddr.vcxproj.filters", "..\\bin\\tests\\tasks\\win32\\t_tasks.vcxproj", "..\\bin\\tests\\tasks\\win32\\t_tasks.vcxproj.filters", "..\\bin\\tests\\timers\\win32\\t_timers.vcxproj", "..\\bin\\tests\\timers\\win32\\t_timers.vcxproj.filters", "..\\bin\\tests\\win32\\backtrace_test.vcxproj", "..\\bin\\tests\\win32\\backtrace_test.vcxproj.filters", "..\\bin\\tests\\win32\\inter_test.vcxproj", "..\\bin\\tests\\win32\\inter_test.vcxproj.filters", "..\\bin\\tests\\win32\\rwlock_test.vcxproj", "..\\bin\\tests\\win32\\rwlock_test.vcxproj.filters", "..\\bin\\tests\\win32\\shutdown_test.vcxproj", "..\\bin\\tests\\win32\\shutdown_test.vcxproj.filters", "..\\bin\\tests\\win32\\sock_test.vcxproj", "..\\bin\\tests\\win32\\sock_test.vcxproj.filters", "..\\bin\\tests\\win32\\task_test.vcxproj", "..\\bin\\tests\\win32\\task_test.vcxproj.filters", "..\\bin\\tests\\win32\\timer_test.vcxproj", "..\\bin\\tests\\win32\\timer_test.vcxproj.filters", "..\\bin\\tests\\win32\\inter_test.vcxproj", "..\\bin\\tests\\win32\\inter_test.vcxproj.filters", "..\\bin\\tests\\win32\\rwlock_test.vcxproj", "..\\bin\\tests\\win32\\rwlock_test.vcxproj.filters", "..\\bin\\tests\\win32\\shutdown_test.vcxproj", "..\\bin\\tests\\win32\\shutdown_test.vcxproj.filters", "..\\bin\\tests\\win32\\sock_test.vcxproj", "..\\bin\\tests\\win32\\sock_test.vcxproj.filters", "..\\bin\\tests\\win32\\task_test.vcxproj", "..\\bin\\tests\\win32\\task_test.vcxproj.filters", "..\\bin\\tests\\win32\\timer_test.vcxproj", "..\\bin\\tests\\win32\\timer_test.vcxproj.filters", "..\\bin\\win32\\BINDInstall\\BINDInstall.vcxproj", "..\\bin\\win32\\BINDInstall\\BINDInstall.vcxproj.filters", "..\\lib\\bind9\\win32\\libbind9.vcxproj", "..\\lib\\bind9\\win32\\libbind9.vcxproj.filters", "..\\lib\\dns\\win32\\gen.vcxproj", "..\\lib\\dns\\win32\\gen.vcxproj.filters", "..\\lib\\dns\\win32\\libdns.vcxproj", "..\\lib\\dns\\win32\\libdns.vcxproj.filters", "..\\lib\\isc\\win32\\libisc.vcxproj", "..\\lib\\isc\\win32\\libisc.vcxproj.filters", "..\\lib\\isccc\\win32\\libisccc.vcxproj", "..\\lib\\isccc\\win32\\libisccc.vcxproj.filters", "..\\lib\\isccfg\\win32\\libisccfg.vcxproj", "..\\lib\\isccfg\\win32\\libisccfg.vcxproj.filters", "..\\lib\\lwres\\win32\\liblwres.vcxproj", "..\\lib\\lwres\\win32\\liblwres.vcxproj.filters", "..\\lib\\tests\\win32\\libtests.vcxproj", "..\\lib\\tests\\win32\\libtests.vcxproj.filters", "..\\lib\\win32\\bindevt\\bindevt.vcxproj", "..\\lib\\win32\\bindevt\\bindevt.vcxproj.filters", "bind9.sln"); # for config.h my %configdefh; my @substdefh = ("ALLOW_FILTER_AAAA", "CONFIGARGS", "DNS_RDATASET_FIXED", "ENABLE_RPZ_NSDNAME", "ENABLE_RPZ_NSIP", "HAVE_EVP_SHA256", "HAVE_EVP_SHA384", "HAVE_EVP_SHA512", "HAVE_GEOIP", "HAVE_GEOIP_V6", "HAVE_GEOIP_CITY_V6", "HAVE_LIBXML2", "HAVE_OPENSSL_DSA", "HAVE_OPENSSL_ECDSA", "HAVE_OPENSSL_GOST", "HAVE_READLINE", "ISC_LIST_CHECKINIT", "WITH_IDN"); # for platform.h my %configdefp; my @substdefp = ("ISC_PLATFORM_HAVEATOMICSTORE", "ISC_PLATFORM_HAVECMPXCHG", "ISC_PLATFORM_HAVEXADD", "ISC_PLATFORM_HAVEXADDQ", "ISC_PLATFORM_NEEDSTRCASESTR", "ISC_PLATFORM_OPENSSLHASH", "ISC_PLATFORM_USEBACKTRACE"); # includes my %configinc; my @substinc = ("GSSAPI_INC", "GEOIP_INC", "IDN_INC", "LIBXML2_INC", "OPENSSL_INC", "READLINE_INC"); # libraries my %configlib; my @substlib = ("GSSAPI_LIB", "GEOIP_LIB", "IDN_LIB", "KRB5_LIB", "LIBXML2_LIB", "OPENSSL_LIB", "READLINE_LIB", "READLINE_LIBD"); # DLLs my %configdll; my @substdll = ("COMERR_DLL", "GSSAPI_DLL", "GEOIP_DLL", "ICONV_DLL", "IDN_DLL", "KRB5_DLL", "K5SPRT_DLL", "LIBXML2_DLL", "OPENSSL_DLL", "WSHELP_DLL"); # variables my %configvar; my @substvar = ("BUILD_MACHINE", "BUILD_PLATFORM", "COPTI", "COPTML", "COPTMLD", "COPTX", "COPTY", "INTRINSIC", "MACHINE", "OPENSSL_PATH", "PLATFORM", "PKCS11_TOOLS", "prefix", "PYTHON", "VCREDIST_PATH"), # defines my %configdefd; my @substdefd = ("PK11_LIB_LOCATION", "USE_GSSAPI", "USE_OPENSSL", "USE_PKCS11", "USE_PYTHON", "USE_ISC_SPNEGO"); # conditions my %configcond; my @substcond = ("ATOMIC", "GSSAPI", "GEOIP", "IDNKIT", "LIBXML2", "OPENSSL", "PKCS11", "PYTHON", "TESTS", "XTESTS"); # arguments # enable-xxx/disable-xxx my @enablelist = ("developer", "fixed-rrset", "intrinsics", "isc-spnego", "openssl-hash", "filter-aaaa", "rpz-nsdname", "rpz-nsip"); # with-xxx/without-xxx my @withlist = ("cross-compile", "ecdsa", "extra-tests", "gssapi", "geoip", "gost", "iconv", "idn", "openssl", "libxml2", "pkcs11", "python", "readline", "tests", "vcredist"); # general arguments my @optionlist = ("help", "verbose", "legacy", "win32", "x64", "clean"); # usage my @usage = ("Usage: perl Configure help\n", " perl Configure options* win32|x64\n", " perl Configure clean\n"); # help my @help = ( "'Configure' configures BIND9 build files.\n\n", @usage, "\nGeneral Options and Commands:\n", " verbose (options) print messages\n", " help (command) print this help\n", " legacy (options) process only files for legacy build\n", " win32 (command) configure for Win32 platform\n", " x64 (command) configure for x64 platform\n", " clean (command) clean up generated files\n", " (command) print a summary of the configuration\n", "\nOptional Features:\n", " enable-intrinsics enable instrinsic/atomic functions [default=yes]\n", " enable-openssl-hash use OpenSSL for hash functions [default=no]\n", " enable-isc-spnego use SPNEGO from lib/dns [default=yes]\n", " enable-filter-aaaa enable filtering of AAAA records [default=no]\n", " enable-fixed-rrset enable fixed rrset ordering [default=no]\n", " enable-developer enable developer build settings [default=no]\n", " enable-rpz-nsip enable rpz-nsip rules [default=yes]\n", " enable-rpz-nsdname enable rpz-nsdname rules [default=yes]\n", "\nOptional Packages:\n", " with-tests build with test suite\n", " with-extra-tests build with extra test suite\n", " with-openssl[=PATH] build with OpenSSL yes|no|path\n", " with-pkcs11[=PATH] build with PKCS#11 support yes|no|provider-path\n", " with-ecdsa crypto ECDSA\n", " with-gost crypto GOST\n", " with-gssapi[=PATH] build with MIT KfW GSSAPI yes|no|path\n", " with-libxml2[=PATH] build with libxml2 library yes|no|path\n", " with-geoip[=PATH] build with GeoIP support yes|no|path\n", " with-python[=COMMAND] specify python interpreter python|command\n", " with-readline[=PATH] build with readline library support yes|no|path\n", " with-idn[=PATH] build with IDN kit support yes|no|path\n", " with-iconv[=PATH] path of the iconv DLL [default=same than idn]\n", " with-vcredist[=PATH] visual C++ redistributable package yes|path\n\n", " with-cross-compile 32 / 64 bit build / host plaforms\n"); # Parse arguments my $verbose = 0; my $legacy_only = 0; my $want_help = "no"; my $want_win32 = "no"; my $want_x64 = "no"; my $want_clean = "no"; my $want_unknown = "no"; my $unknown_value; my $enable_intrinsics = "yes"; my $enable_openssl_hash = "no"; my $enable_filter_aaaa = "no"; my $enable_isc_spnego = "yes"; my $enable_fixed_rrset = "no"; my $enable_developer = "no"; my $enable_rpz_nsip = "yes"; my $enable_rpz_nsdname = "yes"; my $use_tests = "no"; my $use_xtests = "no"; my $use_openssl = "auto"; my $openssl_path = "..\\..\\"; my $use_pkcs11 = "no"; my $pkcs11_path = "unknown"; my $use_ecdsa = "auto"; my $use_gost = "auto"; my $use_gssapi = "no"; my $gssapi_path = "C:\\Program\ Files\\MIT\\Kerberos\\"; my $use_geoip = "no"; my $geoip_path = ""; my $use_libxml2 = "auto"; my $libxml2_path = "..\\..\\"; my $use_python = "auto"; my $python_command = "python"; my $use_readline = "no"; my $readline_path = "..\\..\\"; my $use_idn = "no"; my $idn_path = "..\\..\\"; my $iconv_path = " --idn-- "; my $use_vcredist = "yes"; my $vcredist_path = " --infer-- "; my $cross_compile = "no"; # no arguments -> usage if ($#ARGV < 0) { foreach (@usage) { print $_; } exit 1; } # parse arguments foreach (@ARGV) { if (/^verbose$/i) { $verbose = 1; } elsif (/^help$/i) { $want_help = "yes"; } elsif (/^disable-(.*)$/i) { appargs($_); myenable($1, "no"); } elsif (/^enable-(.*)$/i) { appargs($_); myenable($1, "yes"); } elsif (/^without-(.*)$/i) { appargs($_); mywith($1, "no"); } elsif (/^with-(.*)=(.*)$/i) { appargs($_); mywith($1, $2); } elsif (/^with-(.*)$/i) { appargs($_); mywith($1, "yes"); } elsif (/^legacy$/i) { $legacy_only = 1; } elsif (/^win32$/i) { $want_win32 = "yes"; } elsif (/^x64$/i) { appargs($_); $want_x64 = "yes"; } elsif (/^clean$/i) { $want_clean = "yes"; } else { $want_unknown = "yes"; $unknown_value = $_; } } # legacy default to win32 if ($legacy_only && ($want_x64 ne "yes")) { $want_win32 = "yes"; } # configure the platform if (($want_win32 eq "yes") && ($want_x64 eq "yes")) { die "can't ask for both Win32 and x64 platforms\n"; } elsif ($want_win32 eq "yes") { $configvar{"PLATFORM"} = "Win32"; $configvar{"BUILD_PLATFORM"} = "Win32"; $configvar{"MACHINE"} = "/machine:X86"; $configvar{"BUILD_MACHINE"} = "/machine:X86"; } elsif ($want_x64 eq "yes") { $configvar{"PLATFORM"} = "x64"; $configvar{"BUILD_PLATFORM"} = "x64"; $configvar{"MACHINE"} = "/machine:X64"; $configvar{"BUILD_MACHINE"} = "/machine:X64"; } # append seen args to CONFIGARGS define sub appargs { my $arg = $_[0]; # escape backslashes, spaces and double quotes $arg =~ s/([\\ "])/\\$1/g; if (defined($configdefh{"CONFIGARGS"})) { $configdefh{"CONFIGARGS"} .= " " . $arg; } else { $configdefh{"CONFIGARGS"} = $arg; } } if (!$configdefh{"CONFIGARGS"}) { # CONFIGARGS default is "default" $configdefh{"CONFIGARGS"} = "\"default\""; } else { my $val = $configdefh{"CONFIGARGS"}; $configdefh{"CONFIGARGS"} = "\"'$val'\""; } # parse enable/disable sub myenable { my $key = $_[0]; my $val = $_[1]; if ($key =~ /^intrinsics$/i) { if ($val =~ /^no$/i) { $enable_intrinsics = "no"; } } elsif ($key =~ /^openssl-hash$/i) { if ($val =~ /^yes$/i) { $enable_openssl_hash = "yes"; } } elsif ($key =~ /^isc-spnego$/i) { if ($val =~ /^no$/i) { $enable_isc_spnego = "no"; } } elsif ($key =~ /^filter-aaaa$/i) { if ($val =~ /^yes$/i) { $enable_filter_aaaa = "yes"; } } elsif ($key =~ /^fixed-rrset$/i) { if ($val =~ /^yes$/i) { $enable_fixed_rrset = "yes"; } } elsif ($key =~ /^developer$/i) { if ($val =~ /^yes$/i) { $enable_developer = "yes"; } } elsif ($key =~ /^rpz-nsip$/i) { if ($val =~ /^no$/i) { $enable_rpz_nsip = "no"; } } elsif ($key =~ /^rpz-nsdname$/i) { if ($val =~ /^no$/i) { $enable_rpz_nsdname = "no"; } } else { $want_unknown = "yes"; if ($val eq "no") { $unknown_value = "disable-" . $key; } else { $unknown_value = "enable-". $key; } } } # enable-developer expansion now if ($enable_developer eq "yes") { $configdefh{"ISC_LIST_CHECKINIT"} = 1; $enable_filter_aaaa = "yes"; # no atf on WIN32 $enable_fixed_rrset = "yes"; # TODO: dlz filesystem $use_tests = "yes"; } # parse with/without sub mywith { my $key = $_[0]; my $val = $_[1]; if ($key =~ /^tests$/i) { if ($val =~ /^yes$/i) { $use_tests = "yes"; } } elsif ($key =~ /^extra-tests$/i) { if ($val =~ /^yes$/i) { $use_tests = "yes"; $use_xtests = "yes"; } } elsif ($key =~ /^openssl$/i) { if ($val =~ /^no$/i) { $use_openssl = "no"; } elsif ($val !~ /^yes$/i) { $use_openssl = "yes"; $openssl_path = $val; } } elsif ($key =~ /^pkcs11$/i) { if ($val =~ /^yes$/i) { $use_pkcs11 = "yes"; } elsif ($val !~ /^no$/i) { $use_pkcs11= "yes"; $pkcs11_path = $val; $pkcs11_path =~ s/\.dll$//i; } } elsif ($key =~ /^ecdsa$/i) { if ($val =~ /^no$/i) { $use_ecdsa = "no"; } elsif ($val =~ /^yes$/i) { $use_ecdsa = "yes"; } } elsif ($key =~ /^gost$/i) { if ($val =~ /^no$/i) { $use_gost = "no"; } elsif ($val =~ /^yes$/i) { $use_gost = "yes"; } } elsif ($key =~ /^gssapi$/i) { if ($val !~ /^no$/i) { $use_gssapi = "yes"; if ($val !~ /^yes$/i) { $gssapi_path = $val; } } } elsif ($key =~ /^libxml2$/i) { if ($val =~ /^no$/i) { $use_libxml2 = "no"; } elsif ($val !~ /^yes$/i) { $use_libxml2 = "yes"; $libxml2_path = $val; } } elsif ($key =~ /^geoip$/i) { if ($val !~ /^no$/i) { $use_geoip = "yes"; if ($val !~ /^yes$/i) { $geoip_path = $val; } } } elsif ($key =~ /^readline$/i) { if ($val !~ /^no$/i) { $use_readline = "yes"; if ($val !~ /^yes$/i) { $readline_path = $val; } } } elsif ($key =~ /^idn$/i) { if ($val !~ /^no$/i) { $use_idn = "yes"; if ($val !~ /^yes$/i) { $idn_path = $val; } } } elsif ($key =~ /^iconv$/i) { if ($val =~ /^no$/i) { $want_unknown = "yes"; $unknown_value = "without-iconv doesn't make sense)"; } elsif ($val !~ /^yes$/i) { $iconv_path = $val; } } elsif ($key =~ /^python$/i) { if ($val =~ /^no$/i) { $use_python = "no"; } else { $use_python = "yes"; if ($val !~ /^yes$/i) { $python_command = $val; } } } elsif ($key =~ /^vcredist$/i) { if ($val =~ /^no$/i) { $want_unknown = "yes"; $unknown_value = "without-vcredist (vcredist is required)"; } elsif ($val !~ /^yes$/i) { $vcredist_path = $val; } } elsif ($key =~ /^cross-compile$/i) { if ($val =~ /^yes$/i) { $cross_compile = "yes"; } } else { $want_unknown = "yes"; if ($val eq "no") { $unknown_value = "without-" . $key; } else { $unknown_value = "with-" . $key; } } } if ($want_help ne "no") { foreach (@help) { print $_; } exit 1; } # clean up and exit if requested if ($want_clean eq "yes") { my $file; foreach $file (@filelist) { unlink($file); } foreach $file (@projectlist) { unlink($file); } exit 0; } if ($want_unknown ne "no") { print STDERR "can't parse $unknown_value\n"; exit 1; } if ($verbose) { if ($want_win32 eq "yes") { print "configure for win32\n"; } if ($want_x64 eq "yes") { print "configure for x64\n"; } if ($cross_compile eq "yes") { print "cross compiling"; if ($want_x64 eq "yes") { print ": build on win32 for x64 host\n"; } elsif ($want_win32 eq "yes") { print ": build on x64 for win32 host\n"; } else { print "\n"; } } if ($enable_intrinsics eq "yes") { print "intrinsics: enabled\n"; } else { print "intrinsics: disabled\n"; } if ($enable_openssl_hash eq "yes") { print "openssl-hash: enabled\n"; } else { print "openssl-hash: disabled\n"; } if ($enable_isc_spnego eq "yes") { print "isc-spnego: enabled\n"; } else { print "isc-spnego: disabled\n"; } if ($enable_filter_aaaa eq "yes") { print "filter-aaaa: enabled\n"; } else { print "filter-aaaa: disabled\n"; } if ($enable_fixed_rrset eq "yes") { print "fixed-rrset: enabled\n"; } else { print "fixed-rrset: disabled\n"; } if ($enable_developer eq "yes") { print "developer: enabled\n"; } else { print "developer: disabled\n"; } if ($enable_rpz_nsip eq "yes") { print "rpz-nsip: enabled\n"; } else { print "rpz-nsip: disabled\n"; } if ($enable_rpz_nsdname eq "yes") { print "rpz-nsdname: enabled\n"; } else { print "rpz-nsdname: disabled\n"; } if ($use_openssl eq "no") { print "openssl: disabled\n"; } else { print "openssl-path: $openssl_path\n"; } if ($use_tests eq "yes") { print "tests: enabled\n"; } if ($use_xtests eq "yes") { print "extra tests: enabled\n"; } if ($use_pkcs11 eq "no") { print "pkcs11: disabled\n"; } else { print "pkcs11-provider-path: $pkcs11_path\n"; } if ($use_ecdsa eq "no") { print "ecdsa: disabled\n"; } else { print "ecdsa: enabled\n"; } if ($use_gost eq "no") { print "gost: disabled\n"; } else { print "gost: enabled\n"; } if ($use_gssapi eq "no") { print "gssapi: disabled\n"; } else { print "gssapi-path: $gssapi_path\n"; } if ($use_libxml2 eq "no") { print "libxml2: disabled\n"; } else { print "libxml2-path: $libxml2_path\n"; } if ($use_geoip eq "no") { print "geoip: disabled\n"; } else { print "geoip-path: $geoip_path\n"; } if ($use_readline eq "no") { print "readline: disabled\n"; } else { print "readline-path: $readline_path\n"; } if ($use_idn eq "no") { print "idn: disabled\n"; } else { print "idn-path: $idn_path\n"; if ($iconv_path ne " --idn-- ") { print "iconv-path: $iconv_path\n"; } } if ($use_python eq "no") { print "python: disabled\n"; } else { print "python-command: $python_command\n"; } print "vcredist-path: $vcredist_path\n"; } # Check environment # infer vcredist when not given if ($vcredist_path eq " --infer-- ") { if ($verbose) { print "trying to infer vcredist path from build environment\n"; } if ($ENV{"VCRedistPath"} ne "") { $vcredist_path = $ENV{"VCRedistPath"}; } elsif ($ENV{"FrameworkSDKDir"} ne "") { if (($want_win32 eq "yes") && (-f File::Spec->catfile($ENV{"FrameworkSDKDir"}, "BootStrapper", "Packages", "vcredist_x86", "vcredist_x86.exe"))) { $vcredist_path = File::Spec->catfile($ENV{"FrameworkSDKDir"}, "BootStrapper", "Packages", "vcredist_x86", "vcredist_x86.exe"); } elsif (($want_x64 eq "yes") && (-f File::Spec->catfile($ENV{"FrameworkSDKDir"}, "BootStrapper", "Packages", "vcredist_x64", "vcredist_x64.exe"))) { $vcredist_path = File::Spec->catfile($ENV{"FrameworkSDKDir"}, "BootStrapper", "Packages", "vcredist_x64", "vcredist_x64.exe"); } } elsif ($ENV{"VCINSTALLDIR"} ne "") { if (($want_win32 eq "yes") && (-f File::Spec->catfile($ENV{"VCINSTALLDIR"}, "redist", "1033", "vcredist_x86.exe"))) { $vcredist_path = File::Spec->catfile($ENV{"VCINSTALLDIR"}, "redist", "1033", "vcredist_x86.exe"); } elsif (($want_x64 eq "yes") && (-f File::Spec->catfile($ENV{"VCINSTALLDIR"}, "redist", "1033", "vcredist_x64.exe"))) { $vcredist_path = File::Spec->catfile($ENV{"VCINSTALLDIR"}, "redist", "1033", "vcredist_x64.exe"); } } else { die "with-vcredist is REQUIRED\n"; } } my $msc_ver = 0; open F, ">mscver.c" || die $!; print F << 'EOF'; #include #include int main(void) { printf("%d\n", _MSC_VER); return(0); } EOF close F; my $compret = `cl /nologo /MD mscver.c`; if (grep { -f and -x } ".\\mscver.exe") { $msc_ver = `.\\mscver.exe`; } else { die "can't get _MSC_VER value: $compret\n"; } if ($verbose) { print "_MSV_VER == $msc_ver\n"; } if ($msc_ver < 1600) { print STDERR "warning: old version of C++ compiler/Visual Studio\n"; print STDERR "only the legacy (cf legacy\\win32-build.txt) will work\n"; } # gen single threaded for < VS 2005 if ($msc_ver < 1400) { $configvar{"COPTML"} = "/ML"; $configvar{"COPTMLD"} = "/MLD"; } # /GX deprecated in VS 2005 if ($msc_ver < 1400) { $configvar{"COPTX"} = "/GX"; } else { $configvar{"COPTX"} = "/EHsc"; } # /YX for < VS 2005 if ($msc_ver < 1400) { $configvar{"COPTY"} = "/YX"; } # backtrace for >= VS 2012 if ($msc_ver >= 1700) { $configdefp{"ISC_PLATFORM_USEBACKTRACE"} = 1; } # no version of MSVS supports strcasestr() yet $configdefp{"ISC_PLATFORM_NEEDSTRCASESTR"} = 1; # warn when cross compiling if ($cross_compile eq "yes") { if ($want_x64 eq "yes") { $configvar{"BUILD_PLATFORM"} = "Win32"; $configvar{"BUILD_MACHINE"} = "/machine:X86"; } if ($want_win32 eq "yes") { $configvar{"BUILD_PLATFORM"} = "x64"; $configvar{"BUILD_MACHINE"} = "/machine:X64"; } } elsif ($want_win32 eq "yes") { open F, ">cross.c" || die $!; print F << 'EOF'; #include #include int main(void) { #ifdef _WIN64 fprintf(stderr, "compiling for x64 when win32 was asked?!\n"); #endif return(0); } EOF close F; my $compret = `cl /nologo /MD cross.c`; if (grep { -f and -x } ".\\cross.exe") { my $cross = `.\\cross.exe`; if ($cross) { print STDERR $cross; } } else { print STDERR "can't check cross compile: $compret\n"; } } else { open F, ">cross.c" || die $!; print F << 'EOF'; #include #include int main(void) { #ifndef _WIN64 fprintf(stderr, "compiling in 32 bits when x64 was asked?!\n"); #endif return(0); } EOF close F; my $compret = `cl /nologo /MD cross.c`; if (grep { -f and -x } ".\\cross.exe") { my $cross = `.\\cross.exe`; if ($cross) { print STDERR $cross; } } else { print STDERR "can't check cross compile: $compret\n"; } } # Process arguments # enable-intrinsics if ($enable_intrinsics eq "yes") { $configcond{"ATOMIC"} = 1; $configvar{"INTRINSIC"} = "true"; $configvar{"COPTI"} = "/Oi"; $configdefp{"ISC_PLATFORM_HAVEXADD"} = 1; if ($want_x64 eq "yes") { $configdefp{"ISC_PLATFORM_HAVEXADDQ"} = 1; } $configdefp{"ISC_PLATFORM_HAVEATOMICSTORE"} = 1; $configdefp{"ISC_PLATFORM_HAVECMPXCHG"} = 1; } else { $configvar{"INTRINSIC"} = "false"; } # enable-filter-aaaa if ($enable_filter_aaaa eq "yes") { $configdefh{"ALLOW_FILTER_AAAA"} = 1; } # enable-fixed-rrset if ($enable_fixed_rrset eq "yes") { $configdefh{"DNS_RDATASET_FIXED"} = 1; } # enable-rpz-nsip if ($enable_rpz_nsip ne "no") { $configdefh{"ENABLE_RPZ_NSIP"} = 1; } # enable-rpz-nsdname if ($enable_rpz_nsdname ne "no") { $configdefh{"ENABLE_RPZ_NSDNAME"} = 1; } # with-tests if ($use_tests eq "yes") { $configcond{"TESTS"} = 1; } # with-extra-tests if ($use_xtests eq "yes") { $configcond{"XTESTS"} = 1; } # with-openssl if ($use_openssl eq "no") { if ($verbose) { print "OpenSSL library is disabled\n"; } } elsif ($use_openssl eq "auto") { if ($verbose) { print "checking for an OpenSSL built directory at sibling root\n"; } opendir DIR, $openssl_path || die "No Directory: $!\n"; my @dirlist = grep (/^openssl-[0-9]+\.[0-9]+\.[0-9]+[a-z]{0,1}$/i, readdir(DIR)); closedir(DIR); # Make sure we have something if (scalar(@dirlist) == 0) { die "can't find an OpenSSL at sibling root\n"; } # Now see if we have a directory or just a file. # Make sure we are case insensitive my $file; foreach $file (sort {uc($b) cmp uc($a)} @dirlist) { if (-f File::Spec->catfile($openssl_path, $file, "inc32\\openssl", "opensslv.h")) { $openssl_path = File::Spec->catdir($openssl_path, $file); $use_openssl = "yes"; last; } } # If we have one use it otherwise report the error if ($use_openssl eq "auto") { die "can't find an OpenSSL built directory at sibling root\n"; } } # falls into (so no else) if ($use_openssl eq "yes") { $openssl_path = File::Spec->rel2abs($openssl_path); if ($verbose) { print "checking for OpenSSL built directory at \"$openssl_path\"\n"; } if (!-f File::Spec->catfile($openssl_path, "inc32\\openssl", "opensslv.h")) { die "can't find OpenSSL opensslv.h include\n"; } if (!-f File::Spec->catfile($openssl_path, "out32dll", "libeay32.lib")) { die "can't find OpenSSL libeay32.lib library\n"; } if (!-f File::Spec->catfile($openssl_path, "out32dll", "libeay32.dll")) { die "can't find OpenSSL libeay32.dll DLL\n"; } my $openssl_inc = File::Spec->catdir($openssl_path, "inc32"); my $openssl_libdir = File::Spec->catdir($openssl_path, "out32dll"); my $openssl_lib = File::Spec->catfile($openssl_libdir, "libeay32.lib"); my $openssl_dll = File::Spec->catfile($openssl_libdir, "libeay32.dll"); $configcond{"OPENSSL"} = 1; $configdefd{"USE_OPENSSL"} = "OPENSSL"; $configvar{"OPENSSL_PATH"} = "$openssl_path"; $configinc{"OPENSSL_INC"} = "$openssl_inc"; $configlib{"OPENSSL_LIB"} = "$openssl_lib"; $configdll{"OPENSSL_DLL"} = "$openssl_dll"; if (-f File::Spec->catfile($openssl_inc, "openssl", "dsa.h")) { $configdefh{"HAVE_OPENSSL_DSA"} = 1; } elsif ($verbose) { print "OpenSSL DSA support is disabled\n"; } } # check OpenSSL if ($use_openssl eq "yes") { if ($verbose) { print "checking whether linking with OpenSSL works\n"; } my $dll = $configdll{"OPENSSL_DLL"}; my $ret = `copy "$dll" .`; if ($? != 0) { die "Can't copy OpenSSL DLL to working directory: $ret\n"; } open F, ">testossl.c" || die $!; print F << 'EOF'; #include int main(void) { ERR_clear_error(); return(0); } EOF close F; my $include = $configinc{"OPENSSL_INC"}; my $library = $configlib{"OPENSSL_LIB"}; $compret = `cl /nologo /MD /I "$include" testossl.c "$library"`; if (grep { -f and -x } ".\\testossl.exe") { `.\\testossl.exe`; if ($? != 0) { die "OpenSSL test failed\n"; } } else { die "can't compile OpenSSL test: $compret\n"; } } # check OpenSSL version if ($use_openssl eq "yes") { if ($verbose) { printf "checking OpenSSL library version\n"; } open F, ">testosslv.c" || die $!; print F << 'EOF'; #include #include int main() { if ((OPENSSL_VERSION_NUMBER >= 0x009070cfL && OPENSSL_VERSION_NUMBER < 0x00908000L) || OPENSSL_VERSION_NUMBER >= 0x0090804fL) return (0); printf("\n\nFound OPENSSL_VERSION_NUMBER %#010x\n", OPENSSL_VERSION_NUMBER); printf("Require OPENSSL_VERSION_NUMBER 0x009070cf or greater (0.9.7l)\n" "Require OPENSSL_VERSION_NUMBER 0x0090804f or greater (0.9.8d)\n\n"); return (1); } EOF close F; my $include = $configinc{"OPENSSL_INC"}; my $library = $configlib{"OPENSSL_LIB"}; $compret = `cl /nologo /MD /I "$include" testosslv.c "$library"`; if (grep { -f and -x } ".\\testosslv.exe") { `.\\testosslv.exe`; if ($? != 0) { die "OpenSSL version test failed\n"; } } else { die "can't compile OpenSSL version test: $compret\n"; } } # check EVP_sha256 / EVP_sha384 / EVP_sha512 if ($use_openssl eq "yes") { if ($verbose) { printf "checking for EVP_sha256\n"; } open F, ">testsha256.c" || die $!; print F << 'EOF'; extern void *EVP_sha256(); int main() { return EVP_sha256() != 0; } EOF close F; my $library = $configlib{"OPENSSL_LIB"}; $compret = `cl /nologo /MD testsha256.c "$library"`; if (grep { -f and -x } ".\\testsha256.exe") { `.\\testsha256.exe`; if ($? == 0) { if ($verbose) { print "EVP_sha256 test failed: disabling EVP_sha256\n"; } $use_ecdsa = "no"; } else { $configdefh{"HAVE_EVP_SHA256"} = 1; } } else { if ($verbose) { print "can't compile EVP_sha256 test: $compret\n"; print "disabling EVP_sha256\n"; } $use_ecdsa = "no"; } if ($verbose) { printf "checking for EVP_sha384\n"; } open F, ">testsha384.c" || die $!; print F << 'EOF'; extern void *EVP_sha384(); int main() { return EVP_sha384() != 0; } EOF close F; $compret = `cl /nologo /MD testsha384.c "$library"`; if (grep { -f and -x } ".\\testsha384.exe") { `.\\testsha384.exe`; if ($? == 0) { if ($verbose) { print "EVP_sha384 test failed: disabling EVP_sha384\n"; } $use_ecdsa = "no"; } else { $configdefh{"HAVE_EVP_SHA384"} = 1; } } else { if ($verbose) { print "can't compile EVP_sha384 test: $compret\n"; print "disabling EVP_sha384\n"; } $use_ecdsa = "no"; } if ($verbose) { printf "checking for EVP_sha512\n"; } open F, ">testsha512.c" || die $!; print F << 'EOF'; extern void *EVP_sha512(); int main() { return EVP_sha512() != 0; } EOF close F; $compret = `cl /nologo /MD testsha512.c "$library"`; if (grep { -f and -x } ".\\testsha512.exe") { `.\\testsha512.exe`; if ($? == 0) { if ($verbose) { print "EVP_sha512 test failed: disabling EVP_sha512\n"; } } else { $configdefh{"HAVE_EVP_SHA512"} = 1; } } else { if ($verbose) { print "can't compile EVP_sha512 test: $compret\n"; print "disabling EVP_sha512\n"; } } } # with-ecdsa if ($use_openssl eq "no") { $use_ecdsa = "no"; } if ($use_ecdsa eq "auto") { if ($verbose) { print "checking for OpenSSL ECDSA support\n"; } open F, ">testecdsa.c" || die $!; print F << 'EOF'; #include #include int main(void) { EC_KEY *ec256, *ec384; ec256 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); ec384 = EC_KEY_new_by_curve_name(NID_secp384r1); if (ec256 == NULL || ec384 == NULL) return (2); return (0); } EOF close F; my $include = $configinc{"OPENSSL_INC"}; my $library = $configlib{"OPENSSL_LIB"}; $compret = `cl /nologo /MD /I "$include" testecdsa.c "$library"`; if (grep { -f and -x } ".\\testecdsa.exe") { `.\\testecdsa.exe`; if ($? != 0) { if ($verbose) { print "ECDSA test failed: disabling ECDSA\n"; } $use_ecdsa = "no"; } } else { if ($verbose) { print "can't compile ECDSA test: $compret\n"; print "disabling ECDSA\n"; } $use_ecdsa = "no"; } } if ($use_ecdsa ne "no") { $use_ecdsa = "yes"; $configdefh{"HAVE_OPENSSL_ECDSA"} = 1; } # with-gost if ($use_openssl eq "no") { $use_gost = "no"; } if ($use_gost eq "auto") { if ($verbose) { print "checking for OpenSSL GOST support\n"; } open F, ">testgost.c" || die $!; print F << 'EOF'; #include #include int main(void) { #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) ENGINE *e; EC_KEY *ek; ek = NULL; OPENSSL_config(NULL); e = ENGINE_by_id("gost"); if (e == NULL) return (1); if (ENGINE_init(e) <= 0) return (1); return (0); #else return (1); #endif } EOF close F; my $include = $configinc{"OPENSSL_INC"}; my $library = $configlib{"OPENSSL_LIB"}; $compret = `cl /nologo /MD /I "$include" testgost.c "$library"`; if (grep { -f and -x } ".\\testgost.exe") { `.\\testgost.exe`; if ($? != 0) { if ($verbose) { print "GOST test failed: disabling GOST\n"; } $use_gost = "no"; } } else { if ($verbose) { print "can't compile GOST test: $compret\n"; print "disabling GOST\n"; } $use_gost = "no"; } } if ($use_gost ne "no") { $use_gost = "yes"; $configdefh{"HAVE_OPENSSL_GOST"} = 1; } # enable-openssl-hash if ($enable_openssl_hash eq "yes") { if ($use_openssl eq "no") { die "No OpenSSL for hash functions\n"; } $configdefp{"ISC_PLATFORM_OPENSSLHASH"} = 1; } # with-pkcs11 if ($use_pkcs11 ne "no") { $configcond{"PKCS11"} = 1; $configdefd{"USE_PKCS11"} = "USE_PKCS11"; $configvar{"PKCS11_TOOLS"} = "pkcs11"; $configdefd{"PK11_LIB_LOCATION"} = "PK11_LIB_LOCATION=\"$pkcs11_path\""; } # with-gssapi if ($use_gssapi eq "no") { if ($verbose) { print "gssapi library is disabled\n"; } } else { $gssapi_path = File::Spec->rel2abs($gssapi_path); if ($verbose) { print "checking for gssapi directory at \"$gssapi_path\"\n"; } $configcond{"GSSAPI"} = 1; $configdefd{"USE_GSSAPI"} = "GSSAPI"; if (!-f File::Spec->catfile($gssapi_path, "include", "gssapi", "gssapi.h")) { die "can't find gssapi.h include\n"; } if (!-f File::Spec->catfile($gssapi_path, "include", "gssapi", "gssapi_krb5.h")) { die "can't find gssapi_krb5.h include\n"; } if (!-f File::Spec->catfile($gssapi_path, "include", "krb5", "krb5.h")) { die "can't find krb5.h include\n"; } $configinc{"GSSAPI_INC"} = File::Spec->catdir($gssapi_path, "include"); my $bits = "32"; my $gssapi_lib; my $krb5_lib; if ($want_win32 eq "yes") { $bits = "32"; if (!-f File::Spec->catfile($gssapi_path, "lib", "i386", "gssapi${bits}.lib")) { die "can't find gssapi${bits}.lib library\n"; } $gssapi_lib = File::Spec->catfile($gssapi_path, "lib", "i386", "gssapi${bits}.lib"); if (!-f File::Spec->catfile($gssapi_path, "lib", "i386", "krb5_${bits}.lib")) { die "can't find krb5_${bits}.lib library\n"; } $krb5_lib = File::Spec->catfile($gssapi_path, "lib", "i386", "krb5_${bits}.lib"); } elsif ($want_x64 eq "yes") { $bits = "64"; if (!-f File::Spec->catfile($gssapi_path, "lib", "amd64", "gssapi${bits}.lib")) { die "can't find gssapi${bits}.lib library\n"; } $gssapi_lib = File::Spec->catfile($gssapi_path, "lib", "amd64", "gssapi${bits}.lib"); if (!-f File::Spec->catfile($gssapi_path, "lib", "amd64", "krb5_${bits}.lib")) { die "can't find krb5_${bits}.lib library\n"; } $krb5_lib = File::Spec->catfile($gssapi_path, "lib", "amd64", "krb5_${bits}.lib"); } else { die "can't happen: no choice between Win32 and x64\n"; } if (!-f File::Spec->catfile($gssapi_path, "bin", "gssapi${bits}.dll")) { die "can't find gssapi${bits}.dll DLL\n"; } if (!-f File::Spec->catfile($gssapi_path, "bin", "krb5_${bits}.dll")) { die "can't find krb5_${bits}.dll DLL\n"; } if (!-f File::Spec->catfile($gssapi_path, "bin", "comerr${bits}.dll")) { die "can't find comerr${bits}.dll DLL\n"; } if (!-f File::Spec->catfile($gssapi_path, "bin", "k5sprt${bits}.dll")) { die "can't find k5sprt${bits}.dll DLL\n"; } if (!-f File::Spec->catfile($gssapi_path, "bin", "wshelp${bits}.dll")) { die "can't find wshelp${bits}.dll DLL\n"; } $configlib{"GSSAPI_LIB"} = "$gssapi_lib"; $configlib{"KRB5_LIB"} = "$krb5_lib"; my $gssapi_dll = File::Spec->catfile($gssapi_path, "bin", "gssapi${bits}.dll"); $configdll{"GSSAPI_DLL"} = "$gssapi_dll"; my $krb5_dll = File::Spec->catfile($gssapi_path, "bin", "krb5_${bits}.dll"); $configdll{"KRB5_DLL"} = "$krb5_dll"; my $comerr_dll = File::Spec->catfile($gssapi_path, "bin", "comerr${bits}.dll"); $configdll{"COMERR_DLL"} = "$comerr_dll"; my $k5sprt_dll = File::Spec->catfile($gssapi_path, "bin", "k5sprt${bits}.dll"); $configdll{"K5SPRT_DLL"} = "$k5sprt_dll"; my $wshelp_dll = File::Spec->catfile($gssapi_path, "bin", "wshelp${bits}.dll"); $configdll{"WSHELP_DLL"} = "$wshelp_dll"; } # enable-isc-spnego if ($use_gssapi ne "yes") { $enable_isc_spnego = "no"; } elsif ($enable_isc_spnego eq "yes") { if ($use_gssapi eq "no") { die "No GSSAPI for SPNEGO\n"; } $configdefd{"USE_ISC_SPNEGO"} = "USE_ISC_SPNEGO"; } # with-geoip if ($use_geoip eq "no") { if ($verbose) { print "geoip library is disabled\n"; } } else { $configcond{"GEOIP"} = 1; $geoip_path = File::Spec->rel2abs($geoip_path); if ($verbose) { print "checking for geoip directory at \"$geoip_path\"\n"; } if (!-f File::Spec->catfile($geoip_path, "GeoIP.h")) { die "can't find GeoIP.h include\n"; } if (!-f File::Spec->catfile($geoip_path, "GeoIP.lib")) { die "can't find Geoip.lib library\n"; } if (!-f File::Spec->catfile($geoip_path, "GeoIP.dll")) { die "can't find Geoip.dll DLL\n"; } $configinc{"GEOIP_INC"} = "$geoip_path"; my $geoip_lib = File::Spec->catfile($geoip_path, "GeoIP.lib"); $configlib{"GEOIP_LIB"} = "$geoip_lib"; my $geoip_dll = File::Spec->catfile($geoip_path, "GeoIP.dll"); $configdll{"GEOIP_DLL"} = "$geoip_dll"; if ($verbose) { print "checking for GeoIP support\n"; } my $ret = `copy "$geoip_dll" .`; if ($? != 0) { die "Can't copy GeoIP DLL to working directory: $ret\n"; } open F, ">testgeoip.c" || die $!; print F << 'EOF'; extern void *GeoIP_open(); int main() { return GeoIP_open != 0; } EOF close F; $compret = `cl /nologo /MD testgeoip.c "$geoip_lib"`; if (grep { -f and -x } ".\\testgeoip.exe") { `.\\testgeoip.exe`; if ($? == 0) { die "GeoIP test failed\n"; } } else { die "can't compile GeoIP test: $compret\n"; } $configdefh{"HAVE_GEOIP"} = 1; if ($verbose) { print "checking for GeoIP Country IPv6 support\n"; } my $geoip_inc = qq(/I "$geoip_path"); my $geoip_libs = qq("$geoip_lib" ws2_32.lib); open F, ">testgeoip1.c" || die $!; print F << 'EOF'; #include struct in6_addr in6; int flag = 1; int main() { if (flag) return 1; return GeoIP_country_name_by_ipnum_v6(NULL, in6) != NULL; } EOF close F; $compret = `cl /nologo $geoip_inc /MD testgeoip1.c $geoip_libs`; if (grep { -f and -x } ".\\testgeoip1.exe") { `.\\testgeoip1.exe`; if ($? == 0) { die "GeoIP Country IPv6 test failed\n"; } } else { die "can't compile GeoIP Country IPv6 test: $compret\n"; } $configdefh{"HAVE_GEOIP_V6"} = 1; if ($verbose) { print "checking for GeoIP City IPv6 support\n"; } open F, ">testgeoip2.c" || die $!; print F << 'EOF'; #include #include struct in6_addr in6; int i = GEOIP_CITY_EDITION_REV0_V6; int flag = 1; int main() { if (flag) return 1; return GeoIP_record_by_ipnum_v6(NULL, in6) != NULL; } EOF close F; $compret = `cl /nologo $geoip_inc /MD testgeoip2.c $geoip_libs`; if (grep { -f and -x } ".\\testgeoip2.exe") { `.\\testgeoip2.exe`; if ($? == 0) { die "GeoIP City IPv6 test failed\n"; } } else { die "can't compile GeoIP City IPv6 test: $compret\n"; } $configdefh{"HAVE_GEOIP_CITY_V6"} = 1; } # with-readline if ($use_readline eq "no") { if ($verbose) { print "readline library is disabled\n"; } } else { $readline_path = File::Spec->rel2abs($readline_path); if ($verbose) { print "checking for readline directory at \"$readline_path\"\n"; } if (!-f File::Spec->catfile($readline_path, "readline", "readline.h")) { die "can't find readline.h include\n"; } if (!-f File::Spec->catfile($readline_path, "readline", "readline.lib")) { die "can't find readline.lib library\n"; } $configdefh{"HAVE_READLINE"} = 1; $configinc{"READLINE_INC"} = "$readline_path"; my $readline_lib = File::Spec->catfile($readline_path, "readline", "readline.lib"); $configlib{"READLINE_LIB"} = "$readline_lib"; if (-f File::Spec->catfile($readline_path, "readline", "readlineD.lib")) { my $readline_libd = File::Spec->catfile($readline_path, "readline", "readlineD.lib"); $configlib{"READLINE_LIBD"} = "$readline_libd"; } else { $configlib{"READLINE_LIBD"} = "$readline_lib"; } } # with-idn (including with-iconv) if ($use_idn eq "no") { if ($verbose) { print "IDN kit is disabled\n"; } } else { $idn_path = File::Spec->rel2abs($idn_path); if ($verbose) { print "checking for IDN kit directory at \"$idn_path\"\n"; } if (!-f File::Spec->catfile($idn_path, "idn", "api.h")) { die "can't find idn\\api.h include\n"; } if (!-f File::Spec->catfile($idn_path, "idn", "idnkit.lib")) { die "can't find idnkit.lib library\n"; } if (!-f File::Spec->catfile($idn_path, "idn", "idnkit.dll")) { die "can't find idnkit.dll DLL\n"; } $configcond{"IDNKIT"} = 1; $configdefh{"WITH_IDN"} = 1; $configinc{"IDN_INC"} = "$idn_path"; my $idn_lib = File::Spec->catfile($idn_path, "idn", "idnkit.lib"); $configlib{"IDN_LIB"} = "$idn_lib"; my $idn_dll = File::Spec->catfile($idn_path, "idn", "idnkit.dll"); $configdll{"IDN_DLL"} = "$idn_dll"; if ($iconv_path eq " --idn-- ") { my $iconv_dll = File::Spec->catfile($idn_path, "idn", "iconv.dll"); $configdll{"ICONV_DLL"} = "$iconv_dll"; } else { my $iconv_dll =File::Spec->catfile($iconv_path, "iconv.dll"); $configdll{"ICONV_DLL"} = "$iconv_dll"; } } # with-libxml2 if ($use_libxml2 eq "no") { if ($verbose) { print "libxml2 library is disabled\n"; } } elsif ($use_libxml2 eq "auto") { if ($verbose) { print "checking for a libxml2 built directory at sibling root\n"; } opendir DIR, $libxml2_path || die "No Directory: $!\n"; my @dirlist = grep (/^libxml2-[0-9]+\.[0-9]+\.[0-9]+[a-z]*/i, readdir(DIR)); closedir(DIR); # Make sure we have something if (scalar(@dirlist) == 0) { die "can't find a libxml2 at sibling root\n"; } # Now see if we have a directory or just a file. # Make sure we are case insensitive my $file; foreach $file (sort {uc($b) cmp uc($a)} @dirlist) { if (-f File::Spec->catfile($libxml2_path, $file, "include\\libxml", "xmlversion.h")) { $libxml2_path = File::Spec->catdir($libxml2_path, $file); $use_libxml2 = "yes"; last; } } # If we have one use it otherwise report the error if ($use_libxml2 eq "auto") { die "can't find a libxml2 built directory at sibling root\n"; } } # falls into (so no else) if ($use_libxml2 eq "yes") { $libxml2_path = File::Spec->rel2abs($libxml2_path); if ($verbose) { print "checking for libxml2 built directory at \"$libxml2_path\"\n"; } if (!-f File::Spec->catfile($libxml2_path, "include\\libxml", "xmlversion.h")) { die "can't find libxml2 xmlversion.h include\n"; } if (!-f File::Spec->catfile($libxml2_path, "win32\\bin.msvc", "libxml2.lib")) { die "can't find Libxml2 libxml2.lib library\n"; } if (!-f File::Spec->catfile($libxml2_path, "win32\\bin.msvc", "libxml2.dll")) { die "can't find Libxml2 DLL\n"; } $configcond{"LIBXML2"} = 1; $configdefh{"HAVE_LIBXML2"} = 1; my $libxml2_inc = File::Spec->catdir($libxml2_path, "include"); $configinc{"LIBXML2_INC"} = "$libxml2_inc"; my $libxml2_libdir = File::Spec->catdir($libxml2_path, "win32\\bin.msvc"); my $libxml2_lib = File::Spec->catfile($libxml2_libdir, "libxml2.lib"); $configlib{"LIBXML2_LIB"} = "$libxml2_lib"; my $libxml2_dll = File::Spec->catfile($libxml2_libdir, "libxml2.dll"); $configdll{"LIBXML2_DLL"} = "$libxml2_dll"; } # with-python if ($use_python eq "no") { if ($verbose) { print "python is disabled\n"; } } elsif ($use_python eq "auto") { if ($verbose) { print "checking for python in path\n"; } my $pythonret = `python -c "quit()" 2>&1`; if ($? != 0) { die "can't launch the python interpreter: $pythonret\n"; } $use_python = "yes"; } if ($use_python ne "no") { if ($verbose) { my $pythonret = `"$python_command" -c "quit()" 2>&1`; if ($? != 0) { print STDERR "can't lanch the local python interpreter: $pythonret\n"; } } $configcond{"PYTHON"} = 1; $configdefd{"USE_PYTHON"} = "USE_PYTHON"; $configvar{"PYTHON"} = "$python_command"; $configvar{"prefix"} = "C:\\Windows\\system32\\dns"; } # with-vcredist $vcredist_path = File::Spec->rel2abs($vcredist_path); if (!grep { -f and -x } $vcredist_path) { die "$vcredist_path is not correct\n"; } else { $configvar{"VCREDIST_PATH"} = "$vcredist_path"; } # setup config.h with %configdefh sub setupconfigh { my $line; my @Lines; open F, $configfilein || die $!; @Lines = ; close F; foreach $line (@Lines) { chomp $line; if ($line =~ /^@([^@]+)\@$/) { if (defined($configdefh{$1})) { $line = "#define $1 $configdefh{$1}"; } else { $line = "/* #undef $1 */"; } } } open F, $configfileout || die $!; if ($verbose) { print "Setting up config.h\n"; } foreach $line (@Lines) { print F $line . "\n"; } close F; } # setup platform.h with %configdefp sub setupplatformh { my $line; my @Lines; open F, $platformfile . ".in" || die $!; @Lines = ; close F; foreach $line (@Lines) { chomp $line; if ($line =~ /^@([^@]+)\@$/) { if (defined($configdefp{$1})) { $line = "#define $1 $configdefp{$1}"; } else { $line = "/* #undef $1 */"; } } } open F, ">" . $platformfile || die $!; if ($verbose) { print "Setting up platform.h\n"; } foreach $line (@Lines) { print F $line . "\n"; } close F; } # escape spaces sub kw { if ($_[0] =~ / /) { return "\"$_[0]\""; } else { return "$_[0]"; } } # setup a file with %configcond stack and %config{var,defd,inc,lib,dll} sub setupfile { my $line; my @Linesin; my @Linesout; my $filename = $_[0]; my $cond; my @conds; my $pass = 1; my @passes; my $val; open F, $filename . ".in" || die $!; @Linesin = ; close F; foreach $line (@Linesin) { chomp $line; if ($line =~ /^\@IF (.*)$/) { if (defined($cond)) { unshift(@conds, $cond); unshift(@passes, $pass); } $cond = $1; if (defined($configcond{$cond})) { # do nothing } else { $pass = 0; } next; } elsif ($line =~ /^\@ELSE (.*)$/) { if ($cond ne $1) { die "\@ELSE $1 mismatch in $filename\n"; } if (defined($configcond{$cond})) { $pass = 0; } else { if (scalar(@conds) > 0) { $pass = $passes[0]; } else { $pass = 1; } } next; } elsif ($line =~ /^\@END (.*)$/) { if ($cond ne $1) { die "\@END $1 mismatch in $filename\n"; } $cond = shift(@conds); if (scalar(@passes) > 0) { $pass = shift(@passes); } else { $pass = 1; } next; } if ($pass == 0) { next; } while ($line =~ /@([^@ ]*)@/) { if ($1 ~~ @substvar) { if (defined($configvar{$1})) { $val = kw($configvar{$1}); $line = "$`$val$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substdefd) { if (defined($configdefd{$1})) { my $def = $configdefd{$1}; $def =~ s/([\\ "])/\\$1/g; $line = qq($`/D "$def"$'); } else { $line = "$`$'"; } } elsif ($1 ~~ @substinc) { if (defined($configinc{$1})) { $line = qq($`/I "$configinc{$1}"$'); } else { $line = "$`$'"; } } elsif ($1 ~~ @substlib) { if (defined($configlib{$1})) { $val = kw($configlib{$1}); $line = "$`$val$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substdll) { if (defined($configdll{$1})) { $val = kw($configdll{$1}); $line = "$`$val$'"; } else { $line = "$`$'"; } } else { die "unknown control $& in $filename\n"; } } push @Linesout, $line; } open F, ">" . $filename || die $!; if ($verbose) { print "Setting up $filename\n"; } foreach $line (@Linesout) { print F $line . "\n"; } close F; } # setup a project with %configcond stack and %config{var,defd,inc,lib,dll} sub setupproject { my $line; my @Linesin; my @Linesout; my $projectname = $_[0]; my $cond; my @conds; my $pass = 1; my @passes; my $val; open F, $projectname . ".in" || die $!; @Linesin = ; close F; foreach $line (@Linesin) { chomp $line; if ($line =~ /^\@IF (.*)$/) { if (defined($cond)) { unshift(@conds, $cond); unshift(@passes, $pass); } $cond = $1; if (defined($configcond{$cond})) { # do nothing } else { $pass = 0; } next; } elsif ($line =~ /^\@ELSE (.*)$/) { if ($cond ne $1) { die "\@ELSE $1 mismatch in $projectname\n"; } if (defined($configcond{$cond})) { $pass = 0; } else { if (scalar(@conds) > 0) { $pass = $passes[0]; } else { $pass = 1; } } next; } elsif ($line =~ /^\@END (.*)$/) { if ($cond ne $1) { die "\@END $1 mismatch in $projectname\n"; } $cond = shift(@conds); if (scalar(@passes) > 0) { $pass = shift(@passes); } else { $pass = 1; } next; } if ($pass == 0) { next; } while ($line =~ /@([^@ ]*)@/) { if ($1 ~~ @substvar) { if (defined($configvar{$1})) { $val = kw($configvar{$1}); $line = "$`$val$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substdefd) { if (defined($configdefd{$1})) { $val = kw($configdefd{$1}); $line = "$`$val;$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substinc) { if (defined($configinc{$1})) { $val = kw($configinc{$1}); $line = "$`$val;$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substlib) { if (defined($configlib{$1})) { $val = kw($configlib{$1}); $line = "$`$val;$'"; } else { $line = "$`$'"; } } elsif ($1 ~~ @substdll) { if (defined($configdll{$1})) { $val = kw($configdll{$1}); $line = "$`$val$'"; } else { $line = "$`$'"; } } else { die "unknown control $& in $projectname\n"; } } push @Linesout, $line; } open F, ">" . $projectname || die $!; if ($verbose) { print "Setting up $projectname\n"; } foreach $line (@Linesout) { print F $line . "\n"; } close F; } # make versions.h sub makeversion { # List of directories with version files my @dirlist = ("isc", "dns", "isccc", "isccfg", "lwres", "bind9"); my %LibMacros = ( "isc" => "LIBISC_EXPORTS", "dns" => "LIBDNS_EXPORTS", "isccc" => "LIBISCCC_EXPORTS", "isccfg" => "LIBISCCFG_EXPORTS", "lwres" => "LIBLWRES_EXPORTS", "bind9" => "LIBBIND9_EXPORTS"); my @VersionNames = ("LIBINTERFACE", "LIBREVISION", "LIBAGE"); my %Versions; my $Version; my %ApiVersions; my $Mapapi; my $versionfile = "versions.h"; my $versionpath = "..\\$versionfile"; my $data; my $name; my $value; # First get the version information open V, "..\\version" || die $!; while () { chomp; ($data) = split(/\#/); if ($data) { ($name, $value) = split(/=/, $data); ($name) = split(/\s+/, $name); if ($name eq 'PRODUCT' || $name eq 'DESCRIPTION') { ($value) =~ s/^["\s]+//; ($value) =~ s/["\s]+$//; } else { ($value) = split(/\s+/, $value); } $Versions{$name} = $value; } } close V; # And the mapapi one open M, "..\\lib\\dns\\mapapi" || die $!; while () { chomp; ($data) = split(/\#/); if ($data) { ($name, $value) = split(/=/, $data); ($name) = split(/\s+/, $name); if ($name eq 'MAPAPI') { ($value) =~ s/^["\s]+//; ($value) =~ s/["\s]+$//; } else { ($value) = split(/\s+/, $value); } $Mapapi = $value; } } close M; # Now set up the output version file my $ThisDate = scalar localtime(); open O, ">$versionpath" || die "Can't open output file $versionpath: $!\n"; # Standard Header print O '/* * Copyright (C) 2001 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ '; print O "/*\n"; print O " * $versionfile."; print O " Generated automatically by Configure.pl.\n"; print O " * Date generated: $ThisDate\n"; print O " */\n\n"; print O ' #ifndef VERSIONS_H #define VERSIONS_H 1 '; $Version = "$Versions{'MAJORVER'}.$Versions{'MINORVER'}"; if ($Versions{'PATCHVER'} != "") { $Version = "$Version.$Versions{'PATCHVER'}"; } $Version = "$Version$Versions{'RELEASETYPE'}$Versions{'RELEASEVER'}"; $Version = "$Version$Versions{'EXTENSIONS'}"; if ($verbose) { print "BIND Version: $Version\n"; } print O "#define VERSION \"$Version\"\n"; print O "#define PRODUCT \"$Versions{'PRODUCT'}\"\n\n"; print O "#define DESCRIPTION \"$Versions{'DESCRIPTION'}\"\n\n"; print O "#define MAJOR \"$Versions{'MAJORVER'}.$Versions{'MINORVER'}\"\n\n"; print O "#define MAPAPI \"$Mapapi\"\n\n"; my $dir; my $apifile; foreach $dir (@dirlist) { $apifile = "..\\lib\\$dir\\api"; open A, $apifile || die $!; while () { chomp; ($data) = split(/\#/); if ($data) { ($name, $value) = split(/=/, $data); $name =~ s/\s+//; $value =~ s/\s+//; $ApiVersions{$name} = $value; } } close A; print O "\n#ifdef $LibMacros{$dir}\n"; foreach $name (@VersionNames) { print O "#define $name\t$ApiVersions{$name}\n"; } print O "#endif\n\n"; } print O "#endif /* VERSIONS_H */\n"; close O; } # make srcid.h sub makesrcid { my $data; my $name; my $value; my $srcid = "unset"; open SOUT, ">..\\srcid.h" || die "cannot open srcid.h: $!\n"; if (open (SIN, "..\\srcid")) { LOOP: while () { chomp; ($data) = split(/\#/); if ($data) { ($name, $value) = split(/=/, $data); ($name) = split(/\s+/, $name); ($value) = split(/\s+/, $value); next LOOP if ($name != "SRCID"); $srcid = $value; } } close SIN; } # Now set up the output version file my $ThisDate = scalar localtime(); # Standard Header print SOUT '/* * Copyright (C) 2012 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ '; print SOUT "/*\n"; print SOUT " * srcid.h"; print SOUT " * Generated automatically by Configure.pl.\n"; print SOUT " * Date generated: $ThisDate\n"; print SOUT " */\n\n"; print SOUT ' #ifndef SRCID_H #define SRCID_H 1 '; if ($verbose) { print "BIND SRCID: $srcid\n"; } print SOUT "#define SRCID\t\"$srcid\"\n"; print SOUT "#endif /* SRCID_H */\n"; close SOUT; } # Status if ($verbose) { my $name; print "Configuration Status\n"; print "\tconfig.h:\n"; foreach $name (@substdefh) { if (defined($configdefh{$name})) { print qq(\t\t$name defined to "$configdefh{$name}"\n); } else { printf qq(\t\t$name undefined\n); } } print "\tplatform.h:\n"; foreach $name (@substdefp) { if (defined($configdefp{$name})) { print qq(\t\t$name defined to "$configdefp{$name}"\n); } else { printf qq(\t\t$name undefined\n); } } print "\tconditions:\n"; foreach $name (@substcond) { if (defined($configcond{$name})) { print "\t\t$name is true\n"; } else { print "\t\t$name is false\n"; } } print "\tsubstitutions:\n"; foreach $name (@substvar) { if (defined($configvar{$name})) { print qq(\t\t$name -> "$configvar{$name}"\n); } } print "\tdefines:\n"; foreach $name (@substdefd) { if (defined($configdefd{$name})) { print qq(\t\t/D "$configdefd{$name}"\n); } } print "\tincludes:\n"; foreach $name (@substinc) { if (defined($configinc{$name})) { print qq(\t\t/I "$configinc{$name}"\n); } } print "\tlibraries:\n"; foreach $name (@substlib) { if (defined($configlib{$name})) { print "\t\t$configlib{$name}\n"; } } print "\tDLLs:\n"; foreach $name (@substdll) { if (defined($configdll{$name})) { print "\t\t$configdll{$name}\n"; } } print "\n"; } # Setup if (($want_win32 eq "yes") || ($want_x64 eq "yes")) { setupconfigh(); setupplatformh(); my $file; foreach $file (@filelist) { setupfile($file); } if (!$legacy_only) { foreach $file (@projectlist) { setupproject($file); } } makeversion(); makesrcid(); print "Configured.\n"; } else { print "add win32 or x64 to commit configuration to build files\n"; } exit 0; # Notes: Unix configure.in options # --enable-developer partially supported # --enable-newstats (9.9/9.9sub only) # --enable-openssl-version-check included without a way to disable it # --enable-openssl-hash supported # --enable-threads included without a way to disable it # --enable-backtrace backtrace included without a way to disable it # --enable-symtable incompatible with DLLs (or libtool) # --enable-exportlib TODO (obsolete) # --enable-ipv6 included without a way to disable it # --enable-atomic supported (renamed intrinsic) # --enable-spnego support (part of GSSAPI) # --enable-fixed-rrset supported # --disable-rpz-nsip supported # --disable-rpz-nsdname supported # --enable-filter-aaaa supported # --with-python supported # --with-openssl supported # --with-ecdsa supported # --with-gost supported # --with-pkcs11 supported # --with-geoip supported # --with-gssapi supported with MIT (K)erberos (f)or (W)indows # --with-libxml2 supported # --with-libjson not supported on WIN32 (package not available on WIN32) # --with-purify ? (package available on WIN32 but for free?) # --with-libtool not supported on WIN32 (never) # --with-readline supported # --with-idn support # --with-[lib]iconv (part of IDN) # --with-atf not supported on WIN32 (package not available on WIN32) # --with-dlopen included without a way to disable it # --with-dlz-* ? # # Notes: MSVC versions # MSVC 12.0 _MSC_VER == 1800 (VS 2013) # MSVC 11.0 _MSC_VER == 1700 (VS 2012) # MSVC 10.0 _MSC_VER == 1600 (VS 2010) # MSVC 9.0 _MSC_VER == 1500 (VS 2008) # MSVC 8.0 _MSC_VER == 1400 (VS 2005) # MSVC 7.1 _MSC_VER == 1310 (VS .NET 2003) # MSVC 7.0 _MSC_VER == 1300 (VS .NET (2002)) # MSVC 6.0 _MSC_VER == 1200 (VS 6.0 (1998)) # MSVC 5.0 _MSC_VER == 1100 (VS 97) bind9-9.9.5.dfsg/win32utils/legacy/0002755000470500017500000000000012276444014016333 5ustar lamontlamontbind9-9.9.5.dfsg/win32utils/legacy/makedefs.pl0000644000470500017500000001000712271526120020435 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2004, 2007, 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # makedefs.pl # This script goes through all of the lib header files and creates a .def file # for each DLL for Win32. It recurses as necessary through the subdirectories # # This program should only be run if it is necessary to regenerate # the .def files. Normally these files should be updated by hand, adding # new functions to the end and removing obsolete ones. # If you do regenerate them you will also need to modify them by hand to # to pick up those routines not detected by this program (like openlog). # # Search String: ^(([_a-z0-9])*( ))*prefix_[_a-z0-9]+_[a-z0-9]+( )*\( # List of directories @prefixlist = ("isc", "isccfg","dns", "isccc", "libres"); @prefixlist = ("isccc"); @iscdirlist = ("isc/include/isc","isc/win32/include/isc"); @iscprefixlist = ("isc", "isc", "cfg"); @isccfgdirlist = ("isccfg/include/isccfg"); @isccfgprefixlist = ("cfg"); @iscccdirlist = ("isccc/include/isccc"); @iscccprefixlist = ("isccc"); @dnsdirlist = ("dns/include/dns","dns/sec/dst/include/dst"); @dnsprefixlist = ("dns", "dst"); @lwresdirlist = ("lwres/include/lwres"); @lwresprefixlist = ("lwres"); # Run the changes for each directory in the directory list $ind = 0; createoutfile($iscprefixlist[0]); foreach $dir (@iscdirlist) { createdeffile($dir, $iscprefixlist[$ind]); $ind++; } close OUTDEFFILE; $ind = 0; createoutfile($isccfgprefixlist[0]); foreach $dir (@isccfgdirlist) { createdeffile($dir, $isccfgprefixlist[$ind]); $ind++; } close OUTDEFFILE; $ind = 0; createoutfile($dnsprefixlist[0]); foreach $dir (@dnsdirlist) { createdeffile($dir, $dnsprefixlist[$ind]); $ind++; } close OUTDEFFILE; $ind = 0; createoutfile($iscccprefixlist[0]); foreach $dir (@iscccdirlist) { createdeffile($dir, $iscccprefixlist[$ind]); $ind++; } close OUTDEFFILE; $ind = 0; createoutfile($lwresprefixlist[0]); foreach $dir (@lwresdirlist) { createdeffile($dir, $lwresprefixlist[$ind]); $ind++; } close OUTDEFFILE; exit; # # Subroutines # sub createdeffile { $xdir = $_[0]; # # Get the List of files in the directory to be processed. # #^(([_a-z0-9])*( ))*prefix_[_a-z]+_[a-z]+( )*\( $prefix = $_[1]; $pattern = "\^\(\(\[\_a\-z0\-9\]\)\*\( \)\)\*\(\\*\( \)\+\)\*$prefix"; $pattern = "$pattern\_\[\_a\-z0\-9\]\+_\[a\-z0\-9\]\+\( \)\*\\\("; opendir(DIR,$xdir) || die "No Directory: $!"; @files = grep(/\.h$/i, readdir(DIR)); closedir(DIR); foreach $filename (sort @files) { # # Open the file and locate the pattern. # open (HFILE, "$xdir/$filename") || die "Can't open file $filename : $!"; while () { if(/$pattern/) { $func = $&; chop($func); $space = rindex($func, " ") + 1; if($space >= 0) { # strip out return values $func = substr($func, $space, 100); } print OUTDEFFILE "$func\n"; } } # Set up the Patterns close(HFILE); } } # This is the routine that applies the changes # output the result to the platform specific directory. sub createoutfile { $outfile = "lib$_[0].def"; open (OUTDEFFILE, ">$outfile") || die "Can't open output file $outfile: $!"; print OUTDEFFILE "LIBRARY lib$_[0]\n"; print OUTDEFFILE "\n"; print OUTDEFFILE "; Exported Functions\n"; print OUTDEFFILE "EXPORTS\n"; print OUTDEFFILE "\n"; } bind9-9.9.5.dfsg/win32utils/legacy/BuildAll.bat.in0000644000470500017500000001661012271526120021114 0ustar lamontlamontecho off rem rem Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") rem Copyright (C) 2001-2002 Internet Software Consortium. rem rem Permission to use, copy, modify, and distribute this software for any rem purpose with or without fee is hereby granted, provided that the above rem copyright notice and this permission notice appear in all copies. rem rem THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH rem REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY rem AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, rem INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM rem LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE rem OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR rem PERFORMANCE OF THIS SOFTWARE. rem BuildAll.bat rem This script sets up the files necessary ready to build BIND 9 rem and then builds all of the binaries that make up the installation kit. rem This requires perl to be installed on the system. rem IMPORTANT NOTE: rem OpenSSL is a prerequisite for building and running this release of rem BIND 9. You must fetch the OpenSSL sources yourself from rem http://www.OpenSSL.org/ and compile it yourself. The code must reside rem at the same level as the bind 9.2.0 source tree and it's top-level rem directory be named openssl-0.9.6k. This restriction will be lifted in rem a future release of BIND 9 for Windows NT/2000/XP. echo Setting up the BIND files required for the build rem Setup the files call BuildSetup.bat echo Build all of the Library files cd ..\..\lib cd isc\win32 nmake /nologo -f libisc.mak CFG="libisc - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd dns\win32 nmake /nologo -f libdns.mak CFG="libdns - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd isccfg\win32 nmake /nologo -f libisccfg.mak CFG="libisccfg - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd isccc\win32 nmake /nologo -f libisccc.mak CFG="libisccc - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd bind9\win32 nmake /nologo -f libbind9.mak CFG="libbind9 - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd lwres\win32 nmake /nologo -f liblwres.mak CFG="liblwres - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @IF TESTS cd tests\win32 nmake /nologo -f libtests.mak CFG="libtests - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @END TESTS rem This is the DLL required for the event Viewer cd win32\bindevt nmake /nologo -f bindevt.mak CFG="bindevt - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd .. echo Now build the apps cd bin cd named\win32 nmake /nologo -f named.mak CFG="named - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd rndc\win32 nmake /nologo -f rndc.mak CFG="rndc - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd confgen\win32 nmake /nologo -f rndcconfgen.mak CFG="rndcconfgen - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f ddnsconfgen.mak CFG="ddnsconfgen - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd dig\win32 nmake /nologo -f dig.mak CFG="dig - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo /nologo -f host.mak CFG="host - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f nslookup.mak CFG="nslookup - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd nsupdate\win32 nmake /nologo -f nsupdate.mak CFG="nsupdate - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd check\win32 nmake /nologo -f checkconf.mak CFG="checkconf - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f checkzone.mak CFG="checkzone - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd dnssec\win32 nmake /nologo -f keygen.mak CFG="keygen - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f signzone.mak CFG="signzone - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f dsfromkey.mak CFG="dsfromkey - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f keyfromlabel.mak CFG="keyfromlabel - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f revoke.mak CFG="revoke - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f settime.mak CFG="settime - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f verify.mak CFG="verify - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f importkey.mak CFG="importkey - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @IF PKCS11 cd pkcs11\win32 nmake /nologo -f pk11keygen.mak CFG="pk11keygen - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f pk11list.mak CFG="pk11list - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f pk11destroy.mak CFG="pk11destroy - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @END PKCS11 cd tools\win32 nmake /nologo -f arpaname.mak CFG="arpaname - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f genrandom.mak CFG="genrandom - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f nsec3hash.mak CFG="nsec3hash - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f journalprint.mak CFG="journalprint - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f ischmacfixup.mak CFG="ischmacfixup - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @IF TESTS cd tests @IF ATOMIC cd atomic\win32 nmake /nologo -f t_atomic.mak CFG="t_atomic - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @END ATOMIC cd db\win32 nmake /nologo -f t_db.mak CFG="t_db - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd dst\win32 nmake /nologo -f t_dst.mak CFG="t_dst - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd master\win32 nmake /nologo -f t_master.mak CFG="t_master - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd mem\win32 nmake /nologo -f t_mem.mak CFG="t_mem - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd hashes\win32 nmake /nologo -f t_hashes.mak CFG="t_hashes - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd names\win32 nmake /nologo -f t_names.mak CFG="t_names - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd rbt\win32 nmake /nologo -f t_rbt.mak CFG="t_rbt - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd resolver\win32 nmake /nologo -f t_resolver.mak CFG="t_resolver - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd sockaddr\win32 nmake /nologo -f t_sockaddr.mak CFG="t_sockaddr - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd tasks\win32 nmake /nologo -f t_tasks.mak CFG="t_tasks - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd timers\win32 nmake /nologo -f t_timers.mak CFG="t_timers - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd .. @END TESTS @IF XTESTS cd tests\win32 nmake /nologo -f backtrace_test.mak CFG="backtrace_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f inter_test.mak CFG="inter_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f rwlock_test.mak CFG="rwlock_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f shutdown_test.mak CFG="shutdown_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f sock_test.mak CFG="sock_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f task_test.mak CFG="task_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" nmake /nologo -f timer_test.mak CFG="timer_test - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. @END XTESTS rem This is the BIND 9 Installer cd win32\BINDInstall nmake /nologo -f BINDInstall.mak CFG="BINDInstall - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd ..\.. cd .. cd win32utils\legacy call BuildPost.bat echo Done. rem exit here. bind9-9.9.5.dfsg/win32utils/legacy/BuildPost.bat.in0000644000470500017500000000326012271526120021326 0ustar lamontlamontecho off rem rem Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC") rem rem Permission to use, copy, modify, and distribute this software for any rem purpose with or without fee is hereby granted, provided that the above rem copyright notice and this permission notice appear in all copies. rem rem THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH rem REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY rem AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, rem INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM rem LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE rem OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR rem PERFORMANCE OF THIS SOFTWARE. rem BuildPost.bat rem This script does the final stages if BINDBuild.dsw is used. echo Copying named-checkzone.exe to named-compilezone.exe copy /Y ..\..\Build\Release\named-checkzone.exe ..\..\Build\Release\named-compilezone.exe if exist ..\..\Build\Debug\named-checkzone.exe copy /Y ..\..\Build\Debug\named-checkzone.exe ..\..\Build\Debug\named-compilezone.exe if exist ..\..\Build\Debug\named-checkzone.ilk copy /Y ..\..\Build\Debug\named-checkzone.ilk ..\..\Build\Debug\named-compilezone.ilk @IF PYTHON echo Copying python scripts copy /Y ..\..\bin\python\dnssec-checkds.py ..\..\Build\Release\dnssec-checkds.py copy /Y ..\..\bin\python\dnssec-checkds.py ..\..\Build\Debug\dnssec-checkds.py copy /Y ..\..\bin\python\dnssec-coverage.py ..\..\Build\Release\dnssec-coverage.py copy /Y ..\..\bin\python\dnssec-coverage.py ..\..\Build\Debug\dnssec-coverage.py @END PYTHON echo Done. rem exit here. bind9-9.9.5.dfsg/win32utils/legacy/BuildSetup.bat.in0000644000470500017500000001247112271526120021505 0ustar lamontlamontecho off rem rem Copyright (C) 2004,2005 Internet Systems Consortium, Inc. ("ISC") rem Copyright (C) 2001-2002 Internet Software Consortium. rem rem Permission to use, copy, modify, and distribute this software for any rem purpose with or without fee is hereby granted, provided that the above rem copyright notice and this permission notice appear in all copies. rem rem THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH rem REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY rem AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, rem INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM rem LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE rem OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR rem PERFORMANCE OF THIS SOFTWARE. rem BuildSetup.bat rem This script sets up the files necessary ready to build BIND 9. rem This requires perl to be installed on the system. echo Generate header files for lib/dns cd ..\..\lib\dns cd win32 nmake /nologo /f gen.mak CFG="gen - @PLATFORM@ Release" NO_EXTERNAL_DEPS="1" cd .. gen -s . -t > include/dns/enumtype.h gen -s . -c > include/dns/enumclass.h gen -s . -i -P ./rdata/rdatastructpre.h -S ./rdata/rdatastructsuf.h > include/dns/rdatastruct.h gen -s . > code.h cd ..\..\win32utils\legacy rem Make sure that the Build directories are there. if NOT Exist ..\..\Build mkdir ..\..\Build if NOT Exist ..\..\Build\Release mkdir ..\..\Build\Release if NOT Exist ..\..\Build\Debug mkdir ..\..\Build\Debug echo Copying the ARM and the Installation Notes. copy ..\..\COPYRIGHT ..\..\Build\Release copy ..\..\README ..\..\Build\Release copy ..\..\HISTORY ..\..\Build\Release copy ..\readme1st.txt ..\..\Build\Release copy ..\index.html ..\..\Build\Release copy ..\..\doc\arm\*.html ..\..\Build\Release copy ..\..\doc\arm\Bv9ARM.pdf ..\..\Build\Release copy ..\..\CHANGES ..\..\Build\Release if Exist ..\CHANGES.SE copy ..\CHANGES.SE ..\Build\Release copy ..\..\FAQ ..\..\Build\Release echo Copying the standalone manual pages. copy ..\..\bin\named\named.html ..\..\Build\Release copy ..\..\bin\rndc\*.html ..\..\Build\Release copy ..\..\bin\confgen\*.html ..\..\Build\Release copy ..\..\bin\dig\*.html ..\..\Build\Release copy ..\..\bin\nsupdate\*.html ..\..\Build\Release copy ..\..\bin\check\*.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-keygen.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-signzone.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-dsfromkey.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-keyfromlabel.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-settime.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-revoke.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-verify.html ..\..\Build\Release copy ..\..\bin\dnssec\dnssec-importkey.html ..\..\Build\Release copy ..\..\bin\pkcs11\pkcs11-keygen.html ..\..\Build\Release copy ..\..\bin\pkcs11\pkcs11-list.html ..\..\Build\Release copy ..\..\bin\pkcs11\pkcs11-destroy.html ..\..\Build\Release echo Copying the migration notes. copy ..\..\doc\misc\migration ..\..\Build\Release copy ..\..\doc\misc\migration-4to9 ..\..\Build\Release @IF OPENSSL echo Copying the OpenSSL DLL and LICENSE. copy @OPENSSL_DLL@ ..\..\Build\Release\ copy @OPENSSL_DLL@ ..\..\Build\Debug\ copy @OPENSSL_PATH@\LICENSE ..\..\Build\Release\OpenSSL-LICENSE @END OPENSSL @IF LIBXML2 echo Copying the libxml DLL. copy @LIBXML2_DLL@ ..\..\Build\Release\ copy @LIBXML2_DLL@ ..\..\Build\Debug\ @END LIBXML2 @IF GSSAPI echo Copying the GSSAPI and KRB5 DLLs. copy @GSSAPI_DLL@ ..\..\Build\Release\ copy @GSSAPI_DLL@ ..\..\Build\Debug\ copy @KRB5_DLL@ ..\..\Build\Release\ copy @KRB5_DLL@ ..\..\Build\Debug\ copy @COMERR_DLL@ ..\..\Build\Release\ copy @COMERR_DLL@ ..\..\Build\Debug\ copy @K5SPRT_DLL@ ..\..\Build\Release\ copy @K5SPRT_DLL@ ..\..\Build\Debug\ copy @WSHELP_DLL@ ..\..\Build\Release\ copy @WSHELP_DLL@ ..\..\Build\Debug\ @END GSSAPI @IF GEOIP echo Copying the GeoIP DLL. copy @GEOIP_DLL@ ..\..\Build\Release\ copy @GEOIP_DLL@ ..\..\Build\Debug\ @END GEOIP @IF IDNKIT echo Copying the IDN kit DLL. copy @IDN_DLL@ ..\Build\Release\ copy @IDN_DLL@ ..\Build\Debug\ copy @ICONV_DLL@ ..\Build\Release\ copy @ICONV_DLL@ ..\Build\Debug\ @END IDNKIT echo Copying the redistributable runtime object. rem rem Use /Y so we always have the current version of the installer. rem copy /Y @VCREDIST_PATH@ ..\..\Build\Release\ copy /Y @VCREDIST_PATH@ ..\..\Build\Debug\ @IF TESTS cd ..\..\bin\tests\dst copy "Kdh.+002+18602.key.in" "Kdh.+002+18602.key" copy "Kdh.+002+18602.private.in" "Kdh.+002+18602.private" copy "Kdh.+002+48957.key.in" "Kdh.+002+48957.key" copy "Kdh.+002+48957.private.in" "Kdh.+002+48957.private" copy "Ktest.+001+00002.key.in" "Ktest.+001+00002.key" copy "Ktest.+001+54622.key.in" "Ktest.+001+54622.key" copy "Ktest.+001+54622.private.in" "Ktest.+001+54622.private" copy "Ktest.+003+23616.key.in" "Ktest.+003+23616.key" copy "Ktest.+003+23616.private.in" "Ktest.+003+23616.private" copy "Ktest.+003+49667.key.in" "Ktest.+003+49667.key" copy dst_2_data.in dst_2_data copy t2_data_1.in t2_data_1 copy t2_data_2.in t2_data_2 copy t2_dsasig.in t2_dsasig copy t2_rsasig.in t2_rsasig cd ..\..\..\win32utils\legacy @END TESTS echo Running Message Compiler cd ..\..\lib\win32\bindevt mc bindevt.mc cd ..\..\..\win32utils\legacy rem Done bind9-9.9.5.dfsg/win32utils/legacy/win32-build.txt0000644000470500017500000001035012271526120021122 0ustar lamontlamontCopyright (C) 2004, 2005, 2008, 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2001, 2002 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id$ *legacy* BIND 9.10 for Win32 Source Build Instructions. 24-June-2013 Building BIND 9.10 on Windows XP/Vista/7/8 or server 2003/2008/2008R2 has the following prerequisites: 1) Perl, 2) Visual C++ redistributable object, 3) OpenSSL, and optionally 4) LibXML2 and 5) GeoIP. See ..\build.txt for more details on these prerequisites. If you want to build using Visual C++ 6.0, you'll need some extra files that are to be found in the Platform SDK (which you will need to install), namely: iphlpapi.h iptypes.h ipexport.h iphlpapi.lib You'll also need an updated Iprtrmib.h - using the VC++6.0 one will get you some compilation errors. You can just overwrite the old one if you're not using it for any purposes, and maybe keep a backup of it. You can copy the header files under VC98\INCLUDE and the library file under VC98\LIB. I think you can also put them in a separate directory and add it to the include search list, but I don't know if that can be made persistent. For building on VC++ 7.0 or more recent, no extra files are required. The instructions assume a Visual C++ 6.0 compiler with Visual Studio and Visual Studio Service Pack 3 or later. It may build and work with earlier versions but it has not been tested. The binaries may be built and run on any of the following platforms: NT 4.0 Workstation (SP3 or later), NT 4.0 Server (SP3 or later), Windows 2000 Professional (SP1 or later), Windows 2000 Server or any kind (SP1 or later), Windows XP, Windows 2003 Server, Windows Vista, Windows 2008 Server, Windows 7, Windows 2008 R2 Server, Windows 8, Windows 2012 Server (untested), and further (untested as not yet available). It will NOT build or run on Windows 95, Windows 98, etc., or Windows RT platforms. Step 5: Building BIND From the command prompt cd to the win32utils\legacy directory under the BIND9 root: cd bind-9.10.0\win32utils\legacy If you wish to use nmake from VC++ 6.0 or more recent, run the BuildAll.bat file: BuildAll This will do the following: 1) Build the gen application in the lib/dns directory. 2) Run the gen application and build the required lib/dns header files. 3) Create the Build/Release subdirectory under the root of the BIND source tree which will hold the binaries being built. 4) Build the libraries, named, application tools like dig, rndc dnssec tools, installer, checkconf and checkzones programs, BIND 9 Installer. 5) Copies the release notes and the OpenSSL DLL to the BUILD/Release directory. 6) Copies the BIND 9 ARM HTML files and the application HTML files to the Build\Release area. If you wish to use the Visual Studio GUI for building, you can just run the BuildSetup.bat file: BuildSetup This will create or find and copy into place several files which are necessary for the build to proceed. It also locates and copies into place the DLLs for OpenSSL and libxml2. Use BINDBuild.dsw (also located in the win32utils\legacy directory) to open the workspace for all of the BIND9 libraries and applications. If needed Visual Studio will update the workspace (aka solution) and project files. Note it is known to give slightly incorrect files on VS 2010 or more recent, for instance BINDInstall is not compiled to use DLLs. Finally select "Build->Batch Build", click "Select All", then click "Build". After the build has completed, run the BuildPost.bat file: BuildPost ...which does post-build processing. Installation is accomplished by running the BINDInstall program. All DLL's are copied to the system32 area and all applications (including BINDInstall which may be necessary for uninstalling BIND 9) to the dns/bin directory. If BIND 8 has previously been installed on the system it must be uninstalled first by running it's own BINDInstall program. The BIND 9 installer does not yet do this. All bugs found, whether in the process of building the application or running BIND or the tools should be reported to the bind9 bugs email account at bind9-bugs@isc.org. bind9-9.9.5.dfsg/win32utils/legacy/BINDBuild.dsw.in0000644000470500017500000006206412271526120021153 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "BINDInstall"="..\..\bin\win32\BINDInstall\BINDInstall.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libisc"="..\..\lib\isc\win32\libisc.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "libisccc"="..\..\lib\isccc\win32\libisccc.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "libdns"="..\..\lib\dns\win32\libdns.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "libisccfg"="..\..\lib\isccfg\win32\libisccfg.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency }}} ############################################################################### Project: "libbind9"="..\..\lib\bind9\win32\libbind9.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency }}} ############################################################################### Project: "liblwres"="..\..\lib\lwres\win32\liblwres.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "bindevt"="..\..\lib\win32\bindevt\bindevt.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### @IF TESTS Project: "libtests"="..\..\lib\tests\win32\libtests.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} @END TESTS ############################################################################### Project: "named"="..\..\bin\named\win32\named.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name liblwres End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency }}} ############################################################################### Project: "rndcutil"="..\..\bin\rndc\win32\rndcutil.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "rndc"="..\..\bin\rndc\win32\rndc.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name rndcutil End Project Dependency }}} ############################################################################### Project: "dighost"="..\..\bin\dig\win32\dighost.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "dig"="..\..\bin\dig\win32\dig.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name liblwres End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name dighost End Project Dependency }}} ############################################################################### Project: "host"="..\..\bin\dig\win32\host.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name liblwres End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name dighost End Project Dependency }}} ############################################################################### Project: "nslookup"="..\..\bin\dig\win32\nslookup.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name liblwres End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name dighost End Project Dependency }}} ############################################################################### Project: "dnssectool"="..\..\bin\dnssec\win32\dnssectool.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "keygen"="..\..\bin\dnssec\win32\keygen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "signzone"="..\..\bin\dnssec\win32\signzone.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "importkey"="..\..\bin\dnssec\win32\importkey.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "keyfromlabel"="..\..\bin\dnssec\win32\keyfromlabel.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "dsfromkey"="..\..\bin\dnssec\win32\dsfromkey.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "revoke"="..\..\bin\dnssec\win32\revoke.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "settime"="..\..\bin\dnssec\win32\settime.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "verify"="..\..\bin\dnssec\win32\verify.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name dnssectool End Project Dependency }}} ############################################################################### Project: "arpaname"="..\..\bin\tools\win32\arpaname.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "journalprint"="..\..\bin\tools\win32\journalprint.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "nsec3hash"="..\..\bin\tools\win32\nsec3hash.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "genrandom"="..\..\bin\tools\win32\genrandom.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "ischmacfixup"="..\..\bin\tools\win32\ischmacfixup.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "nsupdate"="..\..\bin\nsupdate\win32\nsupdate.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name liblwres End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency }}} ############################################################################### Project: "checktool"="..\..\bin\check\win32\checktool.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "checkconf"="..\..\bin\check\win32\checkconf.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name checktool End Project Dependency }}} ############################################################################### Project: "checkzone"="..\..\bin\check\win32\checkzone.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name checktool End Project Dependency }}} ############################################################################### Project: "confgentool"="..\..\bin\confgen\win32\confgentool.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "rndcconfgen"="..\..\bin\confgen\win32\rndcconfgen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libisccc End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libbind9 End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name confgentool End Project Dependency }}} ############################################################################### Project: "ddnsconfgen"="..\..\bin\confgen\win32\ddnsconfgen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name confgentool End Project Dependency }}} ############################################################################### @IF PKCS11 Project: "pk11keygen"="..\..\bin\pkcs11\win32\pk11keygen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "pk11list"="..\..\bin\pkcs11\win32\pk11list.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "pk11destroy"="..\..\bin\pkcs11\win32\pk11destroy.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} @END PKCS11 ############################################################################### @IF TESTS @IF ATOMIC Project: "t_atomic"="..\..\bin\tests\atomic\win32\t_atomic.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} @END ATOMIC ############################################################################### Project: "t_db"="..\..\bin\tests\db\win32\t_db.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisccfg End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_dst"="..\..\bin\tests\dst\win32\t_dst.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_master"="..\..\bin\tests\master\win32\t_master.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_mem"="..\..\bin\tests\mem\win32\t_mem.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_hashes"="..\..\bin\tests\hashes\win32\t_hashes.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_names"="..\..\bin\tests\names\win32\t_names.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_rbt"="..\..\bin\tests\rbt\win32\t_rbt.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_resolver"="..\..\bin\tests\resolver\win32\t_resolver.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libdns End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_sockaddr"="..\..\bin\tests\sockaddr\win32\t_sockaddr.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_tasks"="..\..\bin\tests\tasks\win32\t_tasks.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "t_timers"="..\..\bin\tests\timers\win32\t_timers.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libtests End Project Dependency Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} @END TESTS ############################################################################### @IF XTESTS Project: "backtrace_test"="..\..\bin\tests\win32\backtrace_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "inter_test"="..\..\bin\tests\win32\inter_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "rwlock_test"="..\..\bin\tests\win32\rwlock_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "shutdown_test"="..\..\bin\tests\win32\shutdown_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "sock_test"="..\..\bin\tests\win32\sock_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### Project: "task_test"="..\..\bin\tests\win32\task_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} ############################################################################### <<<<<<< HEAD:win32utils/BINDBuild.dsw ======= Project: "timer_test"="..\..\bin\tests\win32\timer_test.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name libisc End Project Dependency }}} @END XTESTS ############################################################################### >>>>>>> c3c8823... 3681. [port] Update the Windows build system to support feature:win32utils/legacy/BINDBuild.dsw.in Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/win32utils/readme1st.txt0000644000470500017500000001532712271526120017515 0ustar lamontlamontCopyright (C) 2004, 2005, 2007-2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") Copyright (C) 2001, 2003 Internet Software Consortium. See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id$ Release of BIND 9.9 for Windows and later. This is a release of BIND 9.9 for Windows XP and later. Important Kit Installation Information As of release 9.3.0, BINDInstall requires that you install it under a account with restricted privileges. The installer will prompt you for an account name, the default is "named", and a password for that account. It will also check for the existence of that account. If it does not exist is will create it with only the privileges required to run BIND. If the account does exist it will check that it has only the one privilege required: "Log on as a service". If it has too many privileges it will prompt you if you want to continue. With BIND running under an account name it is necessary for all files and directories that BIND uses to have permissions set up for the named account if the files are on an NTFS disk. BIND requires that the account have read and write access to the directory for the pid file, any files that are maintained either for slave zones or for master zones supporting dynamic updates. The account will also need read access to the named.conf and any other file that it needs to read. "NT AUTHORITY\LocalService" is also an acceptable account. This account is built into Windows and no password is required. Appropriate file permissions will also need to be set for "NT AUTHORITY\LocalService" similar to those that would have been required for the "named" account. It is important that on Windows the directory directive is used in the options section to tell BIND where to find the files used in named.conf (default %WINDOWS%\system32\dns\etc\named.conf). e.g. options { directory "C:\WINDOWS\system32\dns\etc"; }; If you have previously installed BIND 8 or BIND 4 on the system that you wish to install this kit, you MUST use the BIND 8 or BIND 4 installer to uninstall the previous kit. For BIND 8.2.x, you can use the BINDInstall that comes with the BIND 8 kit to uninstall it. The BIND 9 installer will NOT uninstall the BIND 8 binaries. That will be fixed in a future release. Unpack the kit into any convenient directory and run the BINDInstall program. This will install the named and associated programs into the correct directories and set up the required registry keys. Messages are logged to the Application log in the EventViewer. Controlling BIND Windows uses the same rndc program as is used on Unix systems. The rndc.conf file must be configured for your system in order to work. You will need to generate a key for this. To do this use the rndc-confgen program. The program will be installed in the same directory as named: dns/bin/. From the DOS prompt, use the command this way: rndc-confgen -a which will create a rndc.key file in the dns/etc directory. This will allow you to run rndc without an explicit rndc.conf file or key and control entry in named.conf file. See section 3.4.1.2 of the ARM for details of this. An rndc.conf can also be generated by running: rndc-confgen > rndc.conf which will create the rndc.conf file in the current directory, but not copy it to the dns/etc directory where it needs to reside. If you create rndc.conf this way you will need to copy the same key statement into named.conf. The additions look like the following: key "rndc-key" { algorithm hmac-md5; secret "xxxxxxxxx=="; }; controls { inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; }; }; Note that the value of the secret must come from the key generated above for rndc and must be the same key value for both. Details of this may be found in section 3.4.1.2 of the ARM. If you have rndc on a Unix box you can use it to control BIND on the Windows box as well as using the Windows version of rndc to control a BIND 9 daemon on a Unix box. However you must have key statements valid for the servers you wish to control, specifically the IP address and key in both named.conf and rndc.conf. Again see section 3.4.1.2 of the ARM for details. In order to you rndc from a different system it is important to ensure that the clocks are synchronized. The clocks must be kept within 5 minutes of each other or the rndc commands will fail authentication. Use NTP or other time synchronization software to keep your clocks accurate. NTP can be found at http://www.ntp.org/. In addition BIND is installed as a win32 system service, can be started and stopped in the same way as any other service and automatically starts whenever the system is booted. Signals are not supported and are in fact ignored. Note: Unlike most Windows applications, named does not, change its working directory when started as a service. If you wish to use relative files in named.conf you will need to specify a working directory using the directory directive options. Documentation This kit includes Documentation in HTML format. The documentation is not copied during the installation process so you should move it to any convenient location for later reference. Of particular importance is the BIND 9 Administrator's Reference Manual (Bv9ARM*.html) which provides detailed information on BIND 9. In addition, there are HTML pages for each of the BIND 9 applications. DNS Tools The following tools have been built for Windows: dig, nslookup, host, nsupdate, rndc, rndc-confgen, named-checkconf, named-checkzone, ddns-confgen, dnssec-keygen, dnssec-signzone, dnssec-dsfromkey, dnssec-keyfromlabel, dnssec-revoke, dnssec-settime and dnssec-verify. The latter tools are for use with DNSSEC. All tools are installed in the dns/bin directory. IMPORTANT NOTE ON USING THE TOOLS: It is no longer necessary to create a resolv.conf file on Windows as the tools will look in the registry for the required nameserver information. However if you wish to create a resolv.conf file as follows it will use it in preference to the registry nameserver entries. To create a resolv.conf you need to place it in the System32\Drivers\etc directory and it needs to contain a list of nameserver addresses to use to find the nameserver authoritative for the zone. The format of this file is: nameserver 1.2.3.4 nameserver 5.6.7.8 Replace the IP addresses with your real addresses. 127.0.0.1 is a valid address if you are running a nameserver on the localhost. Problems Please report all problems to bind9-bugs@isc.org and not to me. All other questions should go to the bind-users@isc.org mailing list or the comp.protocol.dns.bind news group. Danny Mayer mayer@ntp.isc.org bind9-9.9.5.dfsg/win32utils/GeoIP.diff0000644000470500017500000003011612271526120016655 0ustar lamontlamontdiff -ruN dists/GeoIP-1.5.1/libGeoIP/GeoIP.c dev/GeoIP-1.5.1/libGeoIP/GeoIP.c --- dists/GeoIP-1.5.1/libGeoIP/GeoIP.c 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/GeoIP.c 2013-07-19 16:56:58.000000000 +0200 @@ -19,6 +19,7 @@ */ #include "GeoIP.h" +#include "GeoIP_internal.h" static geoipv6_t IPV6_NULL; @@ -44,6 +45,10 @@ #include /* For uint32_t */ #endif +#if defined(_WIN32) +#include "pread.h" +#endif + #ifdef _UNUSED #elif defined(__GNUC__) #define _UNUSED __attribute__ ((unused)) diff -ruN dists/GeoIP-1.5.1/libGeoIP/GeoIP.h dev/GeoIP-1.5.1/libGeoIP/GeoIP.h --- dists/GeoIP-1.5.1/libGeoIP/GeoIP.h 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/GeoIP.h 2013-07-19 16:53:33.000000000 +0200 @@ -154,31 +154,33 @@ GEOIP_CORPORATE_SPEED = 3, } GeoIPNetspeedValues; +#ifdef GEOIP_EXPORTS +#define GEOIP_API __declspec(dllexport) +#define GEOIP_DATA __declspec(dllexport) +#else +#define GEOIP_DATA __declspec(dllimport) +#define GEOIP_API +#endif /* GEOIP_EXPORTS */ + extern char **GeoIPDBFileName; -extern const char * GeoIPDBDescription[NUM_DB_TYPES]; -extern const char *GeoIPCountryDBFileName; -extern const char *GeoIPRegionDBFileName; -extern const char *GeoIPCityDBFileName; -extern const char *GeoIPOrgDBFileName; -extern const char *GeoIPISPDBFileName; -extern const char *GeoIPLocationADBFileName; -extern const char *GeoIPAccuracyRadiusFileName; -extern const char *GeoIPCityConfidenceFileName; +extern GEOIP_DATA const char * GeoIPDBDescription[NUM_DB_TYPES]; +extern GEOIP_DATA const char *GeoIPCountryDBFileName; +extern GEOIP_DATA const char *GeoIPRegionDBFileName; +extern GEOIP_DATA const char *GeoIPCityDBFileName; +extern GEOIP_DATA const char *GeoIPOrgDBFileName; +extern GEOIP_DATA const char *GeoIPISPDBFileName; +extern GEOIP_DATA const char *GeoIPLocationADBFileName; +extern GEOIP_DATA const char *GeoIPAccuracyRadiusFileName; +extern GEOIP_DATA const char *GeoIPCityConfidenceFileName; extern char * GeoIP_custom_directory; /* Warning: do not use those arrays as doing so may break your * program with newer GeoIP versions */ -extern const char GeoIP_country_code[255][3]; -extern const char GeoIP_country_code3[255][4]; -extern const char * GeoIP_country_name[255]; -extern const char * GeoIP_utf8_country_name[255]; -extern const char GeoIP_country_continent[255][3]; - -#ifdef DLL -#define GEOIP_API __declspec(dllexport) -#else -#define GEOIP_API -#endif /* DLL */ +extern GEOIP_DATA const char GeoIP_country_code[255][3]; +extern GEOIP_DATA const char GeoIP_country_code3[255][4]; +extern GEOIP_DATA const char * GeoIP_country_name[255]; +extern GEOIP_DATA const char * GeoIP_utf8_country_name[255]; +extern GEOIP_DATA const char GeoIP_country_continent[255][3]; GEOIP_API void GeoIP_setup_custom_directory(char *dir); GEOIP_API GeoIP* GeoIP_open_type (int type, int flags); diff -ruN dists/GeoIP-1.5.1/libGeoIP/GeoIPCity.c dev/GeoIP-1.5.1/libGeoIP/GeoIPCity.c --- dists/GeoIP-1.5.1/libGeoIP/GeoIPCity.c 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/GeoIPCity.c 2013-07-19 15:41:05.000000000 +0200 @@ -35,6 +35,10 @@ #include /* For uint32_t */ #endif +#if defined(_WIN32) +#include "pread.h" +#endif + #ifndef HAVE_PREAD #define pread(fd, buf, count, offset) \ ( \ diff -ruN dists/GeoIP-1.5.1/libGeoIP/GeoIPCity.h dev/GeoIP-1.5.1/libGeoIP/GeoIPCity.h --- dists/GeoIP-1.5.1/libGeoIP/GeoIPCity.h 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/GeoIPCity.h 2013-07-19 16:23:58.000000000 +0200 @@ -48,22 +48,22 @@ int netmask; } GeoIPRecord; -GeoIPRecord * GeoIP_record_by_ipnum (GeoIP* gi, unsigned long ipnum); -GeoIPRecord * GeoIP_record_by_addr (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name (GeoIP* gi, const char *host); - -GeoIPRecord * GeoIP_record_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GeoIPRecord * GeoIP_record_by_addr_v6 (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name_v6 (GeoIP* gi, const char *host); +GEOIP_API GeoIPRecord * GeoIP_record_by_ipnum (GeoIP* gi, unsigned long ipnum); +GEOIP_API GeoIPRecord * GeoIP_record_by_addr (GeoIP* gi, const char *addr); +GEOIP_API GeoIPRecord * GeoIP_record_by_name (GeoIP* gi, const char *host); + +GEOIP_API GeoIPRecord * GeoIP_record_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); +GEOIP_API GeoIPRecord * GeoIP_record_by_addr_v6 (GeoIP* gi, const char *addr); +GEOIP_API GeoIPRecord * GeoIP_record_by_name_v6 (GeoIP* gi, const char *host); -int GeoIP_record_id_by_addr (GeoIP* gi, const char *addr); -int GeoIP_record_id_by_addr_v6 (GeoIP* gi, const char *addr); +GEOIP_API int GeoIP_record_id_by_addr (GeoIP* gi, const char *addr); +GEOIP_API int GeoIP_record_id_by_addr_v6 (GeoIP* gi, const char *addr); -int GeoIP_init_record_iter (GeoIP* gi); +GEOIP_API int GeoIP_init_record_iter (GeoIP* gi); /* returns 0 on success, 1 on failure */ -int GeoIP_next_record (GeoIP* gi, GeoIPRecord **gir, int *record_iter); +GEOIP_API int GeoIP_next_record (GeoIP* gi, GeoIPRecord **gir, int *record_iter); -void GeoIPRecord_delete (GeoIPRecord *gir); +GEOIP_API void GeoIPRecord_delete (GeoIPRecord *gir); /* NULL on failure otherwise a malloced string in utf8 */ /* char * GeoIP_iso_8859_1__utf8(const char *); */ diff -ruN dists/GeoIP-1.5.1/libGeoIP/Makefile.vc dev/GeoIP-1.5.1/libGeoIP/Makefile.vc --- dists/GeoIP-1.5.1/libGeoIP/Makefile.vc 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/Makefile.vc 2013-07-19 16:47:45.000000000 +0200 @@ -1,29 +1,42 @@ #NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). +##Produces a static library (GeoIP.lib). +#Produces a DLL (GeoIP.dll) and library (GeoIP.lib). COMPILER=cl -CFLAGS=-DWIN32 -MD -nologo +CFLAGS=-DWIN32 -DGEOIP_EXPORTS -MD -nologo GEOIPINC = -I..\libGeoIP -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) -DGEOIPDATADIR=\"$(GEOIPDATADIR)\" +CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) -DGEOIPDATADIR=\"$(GEOIPDATADIR)\" -DPACKAGE_VERSION=\"1.5.1\" -OBJS=GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj +LINKER=link + +LDFLAGS=/DLL /nologo /subsystem:console + +LD1 = $(LINKER) $(LDFLAGS) + +OBJS=GeoIP.obj GeoIPCity.obj GeoIP_depreciated.obj regionName.obj md5.obj timeZone.obj pread.obj -EXTRA_LIBS= advapi32.lib wsock32.lib +EXTRA_LIBS= ws2_32.lib AR=lib -GeoIP.lib: GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj - $(AR) -nologo $(OBJS) $(EXTRA_LIBS) /OUT:GeoIP.lib +#GeoIP.lib: GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj pread.obj +# $(AR) -nologo $(OBJS) $(EXTRA_LIBS) /OUT:GeoIP.lib +GeoIP.dll GeoIP.lib: $(OBJS) + $(LD1) $(OBJS) $(EXTRA_LIBS) /out:GeoIP.dll /implib:GeoIP.lib + GeoIP.obj: GeoIP.c $(CC1) -c GeoIP.c $(GEOIPINC) GeoIPCity.obj: GeoIPCity.c $(CC1) -c GeoIPCity.c $(GEOIPINC) +GeoIP_depreciated.obj: GeoIP_depreciated.c + $(CC1) -c GeoIP_depreciated.c $(GEOIPINC) + regionName.obj: regionName.c $(CC1) -c regionName.c $(GEOIPINC) @@ -32,3 +45,6 @@ timeZone.obj: timeZone.c $(CC1) -c timeZone.c $(GEOIPINC) + +pread.obj: pread.c + $(CC1) -c pread.c $(GEOIPINC) diff -ruN dists/GeoIP-1.5.1/libGeoIP/pread.c dev/GeoIP-1.5.1/libGeoIP/pread.c --- dists/GeoIP-1.5.1/libGeoIP/pread.c 1970-01-01 01:00:00.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/pread.c 2013-07-19 15:37:44.000000000 +0200 @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#include "pread.h" + +CRITICAL_SECTION preadsc; + +#ifdef _WIN64 +int pread(int fd, void *buf, unsigned int nbyte, __int64 offset) +{ + int cc = -1; + __int64 prev = (__int64)-1L; + + EnterCriticalSection(&preadsc); + prev = _lseeki64(fd, 0L, SEEK_CUR); + if (prev == (__int64)-1L) + goto done; + if (_lseeki64(fd, offset, SEEK_SET) != offset) + goto done; + cc = _read(fd, buf, nbyte); + +done: + if (prev != (__int64)-1L) + (void)_lseeki64(fd, prev, SEEK_SET); + LeaveCriticalSection(&preadsc); + + return cc; +} +#else +int pread(int fd, void *buf, unsigned int nbyte, long offset) +{ + int cc = -1; + long prev = -1L; + + EnterCriticalSection(&preadsc); + prev = _lseek(fd, 0L, SEEK_CUR); + if (prev == -1L) + goto done; + if (_lseek(fd, offset, SEEK_SET) != offset) + goto done; + cc = _read(fd, buf, nbyte); + +done: + if (prev != -1L) + (void)_lseek(fd, prev, SEEK_SET); + LeaveCriticalSection(&preadsc); + + return cc; +} +#endif + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + InitializeCriticalSection(&preadsc); + return TRUE; +} diff -ruN dists/GeoIP-1.5.1/libGeoIP/pread.h dev/GeoIP-1.5.1/libGeoIP/pread.h --- dists/GeoIP-1.5.1/libGeoIP/pread.h 1970-01-01 01:00:00.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/pread.h 2013-07-19 15:39:01.000000000 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef _WIN64 +typedef __int64 ssize_t; + +int pread(int fd, void *buf, unsigned int nbyte, __int64 offset); +#else +typedef int ssize_t; + +int pread(int fd, void *buf, unsigned int nbyte, long offset); +#endif + +#define HAVE_PREAD + +extern CRITICAL_SECTION preadsc; diff -ruN dists/GeoIP-1.5.1/libGeoIP/regionName.c dev/GeoIP-1.5.1/libGeoIP/regionName.c --- dists/GeoIP-1.5.1/libGeoIP/regionName.c 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/regionName.c 2013-07-19 16:37:56.000000000 +0200 @@ -1,3 +1,5 @@ +#include "GeoIP.h" + #include #include diff -ruN dists/GeoIP-1.5.1/libGeoIP/timeZone.c dev/GeoIP-1.5.1/libGeoIP/timeZone.c --- dists/GeoIP-1.5.1/libGeoIP/timeZone.c 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/libGeoIP/timeZone.c 2013-07-19 17:22:44.000000000 +0200 @@ -1,4 +1,7 @@ +#include "GeoIP.h" + #include + const char* GeoIP_time_zone_by_country_and_region(const char * country,const char * region) { const char* timezone = NULL; if (country == NULL) { diff -ruN dists/GeoIP-1.5.1/test/Makefile.vc dev/GeoIP-1.5.1/test/Makefile.vc --- dists/GeoIP-1.5.1/test/Makefile.vc 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/test/Makefile.vc 2013-07-19 16:48:55.000000000 +0200 @@ -9,7 +9,7 @@ GEOIPINC = -I..\libGeoIP -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) +CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) -DSRCDIR=\"../\" GEOIPLIB = ..\libGeoIP\GeoIP.lib diff -ruN dists/GeoIP-1.5.1/test/benchmark.c dev/GeoIP-1.5.1/test/benchmark.c --- dists/GeoIP-1.5.1/test/benchmark.c 2013-03-23 03:26:09.000000000 +0100 +++ dev/GeoIP-1.5.1/test/benchmark.c 2013-07-19 16:26:23.000000000 +0200 @@ -81,7 +81,7 @@ void testgeoiporg(int flags, const char *msg, int numlookups) { GeoIP *i = NULL; - GeoIPRegion *i3 = NULL; + char *i3 = NULL; int i4 = 0; int i2 = 0; double t = 0; bind9-9.9.5.dfsg/isc-config.sh.html0000644000470500017500000001043612271526120016360 0ustar lamontlamont isc-config.sh

    Name

    isc-config.sh — Get information about the installed version of ISC BIND

    Synopsis

    isc-config.sh [--cflags] [--exec-prefix] [--libs] [--prefix] [--version] [libraries...]

    DESCRIPTION

    isc-config.sh prints information related to the installed version of ISC BIND, such as the compiler and linker flags required to compile and link programs that use ISC BIND libraries.

    The optional libraries are used to report specific details for compiling and linking for the listed libraries. The allowed choices are: isc, isccc, isccfg, dns, lwres, and bind9. Multiple libraries may be listed on the command line. (Some libraries require other libraries, so are implied.)

    OPTIONS

    --cflags

    Prints the compiler command line options required to compile files that use ISC BIND. Use the libraries command line argument(s) to print additional specific flags to pass to the C compiler.

    --exec-prefix

    Prints the directory prefix used in the ISC BIND installation for architecture dependent files to standard output.

    --libs

    Prints the linker command line options used to link with the ISC BIND libraries. Use the libraries command line argument(s) to print additional specific flags.

    --prefix

    Prints the directory prefix used in the ISC BIND installation for architecture independent files to standard output.

    --version

    Prints the version of the installed ISC BIND suite.

    RETURN VALUES

    isc-config.sh returns an exit status of 1 if invoked with invalid arguments or no arguments at all. It returns 0 if information was successfully printed.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/0002755000470500017500000000000012276444014013614 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tools/0002755000470500017500000000000012276444014014754 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tools/genrandom.docbook0000644000470500017500000000717012271526120020265 0ustar lamontlamont]> Feb 19, 2009 genrandom 8 BIND9 genrandom generate a file containing random data 2009 2010 2011 Internet Systems Consortium, Inc. ("ISC") genrandom size filename DESCRIPTION genrandom generates a file or a set of files containing a specified quantity of pseudo-random data, which can be used as a source of entropy for other commands on systems with no random device. ARGUMENTS -n number In place of generating one file, generates (from 2 to 9) files, appending to the name. size The size of the file, in kilobytes, to generate. filename The file name into which random data should be written. SEE ALSO rand3 , arc4random3 AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/tools/genrandom.c0000644000470500017500000000613612271526120017070 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: genrandom.c,v 1.7 2010/05/17 23:51:04 tbox Exp $ */ /*! \file */ #include #include #include #include #include #include #include const char *program = "genrandom"; ISC_PLATFORM_NORETURN_PRE static void usage(void) ISC_PLATFORM_NORETURN_POST; static void usage(void) { fprintf(stderr, "usage: %s [-n 2..9] k file\n", program); exit(1); } static void generate(char *filename, unsigned int bytes) { FILE *fp; fp = fopen(filename, "w"); if (fp == NULL) { printf("failed to open %s\n", filename); exit(1); } while (bytes > 0) { #ifndef HAVE_ARC4RANDOM unsigned short int x = (rand() & 0xFFFF); #else unsigned short int x = (arc4random() & 0xFFFF); #endif unsigned char c = x & 0xFF; if (putc(c, fp) == EOF) { printf("error writing to %s\n", filename); exit(1); } c = x >> 8; if (putc(c, fp) == EOF) { printf("error writing to %s\n", filename); exit(1); } bytes -= 2; } fclose(fp); } int main(int argc, char **argv) { unsigned int bytes; unsigned int k; char *endp; int c, i, n = 1; size_t len; char *name; isc_commandline_errprint = ISC_FALSE; while ((c = isc_commandline_parse(argc, argv, "hn:")) != EOF) { switch (c) { case 'n': n = strtol(isc_commandline_argument, &endp, 10); if ((*endp != 0) || (n <= 1) || (n > 9)) usage(); break; case '?': if (isc_commandline_option != '?') fprintf(stderr, "%s: invalid argument -%c\n", program, isc_commandline_option); /* FALLTHROUGH */ case 'h': usage(); default: fprintf(stderr, "%s: unhandled option -%c\n", program, isc_commandline_option); exit(1); } } if (isc_commandline_index + 2 != argc) usage(); k = strtoul(argv[isc_commandline_index++], &endp, 10); if (*endp != 0) usage(); bytes = k << 10; #ifndef HAVE_ARC4RANDOM srand(0x12345678); #endif if (n == 1) { generate(argv[isc_commandline_index], bytes); return (0); } len = strlen(argv[isc_commandline_index]) + 2; name = (char *) malloc(len); if (name == NULL) { perror("malloc"); exit(1); } for (i = 1; i <= n; i++) { snprintf(name, len, "%s%d", argv[isc_commandline_index], i); generate(name, bytes); } free(name); return (0); } bind9-9.9.5.dfsg/bin/tools/named-journalprint.c0000644000470500017500000000473512271526120020732 0ustar lamontlamont/* * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named-journalprint.c,v 1.2 2009/12/04 21:59:23 marka Exp $ */ /*! \file */ #include #include #include #include #include #include #include #include #include /* * Setup logging to use stderr. */ static isc_result_t setup_logging(isc_mem_t *mctx, FILE *errout, isc_log_t **logp) { isc_logdestination_t destination; isc_logconfig_t *logconfig = NULL; isc_log_t *log = NULL; RUNTIME_CHECK(isc_log_create(mctx, &log, &logconfig) == ISC_R_SUCCESS); isc_log_setcontext(log); dns_log_init(log); dns_log_setcontext(log); destination.file.stream = errout; destination.file.name = NULL; destination.file.versions = ISC_LOG_ROLLNEVER; destination.file.maximum_size = 0; RUNTIME_CHECK(isc_log_createchannel(logconfig, "stderr", ISC_LOG_TOFILEDESC, ISC_LOG_DYNAMIC, &destination, 0) == ISC_R_SUCCESS); RUNTIME_CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL) == ISC_R_SUCCESS); *logp = log; return (ISC_R_SUCCESS); } int main(int argc, char **argv) { char *file; isc_mem_t *mctx = NULL; isc_result_t result; isc_log_t *lctx = NULL; if (argc != 2) { printf("usage: %s journal\n", argv[0]); return(1); } file = argv[1]; RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); RUNTIME_CHECK(setup_logging(mctx, stderr, &lctx) == ISC_R_SUCCESS); result = dns_journal_print(mctx, file, stdout); if (result == DNS_R_NOJOURNAL) fprintf(stderr, "%s\n", dns_result_totext(result)); isc_log_destroy(&lctx); isc_mem_detach(&mctx); return(result != ISC_R_SUCCESS ? 1 : 0); } bind9-9.9.5.dfsg/bin/tools/win32/0002755000470500017500000000000012276444014015716 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.vcxproj.user0000644000470500017500000000021712271526120022763 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.vcxproj.filters.in0000644000470500017500000000140412271526120024061 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tools/win32/genrandom.mak.in0000644000470500017500000001705212271526120020764 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on genrandom.dsp !IF "$(CFG)" == "" CFG=genrandom - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to genrandom - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "genrandom - @PLATFORM@ Release" && "$(CFG)" != "genrandom - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "genrandom.mak" CFG="genrandom - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "genrandom - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "genrandom - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "genrandom - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "genrandom - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\genrandom.exe" CLEAN : -@erase "$(INTDIR)\genrandom.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\genrandom.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\genrandom.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\genrandom.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\genrandom.pdb" @MACHINE@ /out:"../../../Build/Release/genrandom.exe" LINK32_OBJS= \ "$(INTDIR)\genrandom.obj" \ "..\..\..\Build\Release\genrandom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "genrandom - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\genrandom.exe" "$(OUTDIR)\genrandom.bsc" CLEAN : -@erase "$(INTDIR)\genrandom.obj" -@erase "$(INTDIR)\genrandom.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\genrandom.pdb" -@erase "$(OUTDIR)\genrandom.bsc" -@erase "..\..\..\Build\Debug\genrandom.exe" -@erase "..\..\..\Build\Debug\genrandom.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\genrandom.bsc" BSC32_SBRS= \ "$(INTDIR)\genrandom.sbr" "$(OUTDIR)\genrandom.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\genrandom.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/genrandom.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\genrandom.obj" "..\..\..\Build\Debug\genrandom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("genrandom.dep") !INCLUDE "genrandom.dep" !ELSE !MESSAGE Warning: cannot find "genrandom.dep" !ENDIF !ENDIF !IF "$(CFG)" == "genrandom - @PLATFORM@ Release" || "$(CFG)" == "genrandom - @PLATFORM@ Debug" SOURCE="..\genrandom.c" !IF "$(CFG)" == "genrandom - @PLATFORM@ Release" "$(INTDIR)\genrandom.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "genrandom - @PLATFORM@ Debug" "$(INTDIR)\genrandom.obj" "$(INTDIR)\genrandom.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tools/win32/genrandom.vcxproj.user0000644000470500017500000000021712271526120022252 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.dsw0000644000470500017500000000104512271526120021110 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ischmacfixup"=".\ischmacfixup.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tools/win32/journalprint.vcxproj.filters.in0000644000470500017500000000141012271526120024122 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.mak.in0000644000470500017500000001726512271526120020677 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on nsec3hash.dsp !IF "$(CFG)" == "" CFG=nsec3hash - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to nsec3hash - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "nsec3hash - @PLATFORM@ Release" && "$(CFG)" != "nsec3hash - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "nsec3hash.mak" CFG="nsec3hash - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "nsec3hash - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "nsec3hash - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "nsec3hash - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "nsec3hash - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\nsec3hash.exe" CLEAN : -@erase "$(INTDIR)\nsec3hash.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\nsec3hash.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\nsec3hash.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\nsec3hash.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\nsec3hash.pdb" @MACHINE@ /out:"../../../Build/Release/nsec3hash.exe" LINK32_OBJS= \ "$(INTDIR)\nsec3hash.obj" "..\..\..\Build\Release\nsec3hash.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "nsec3hash - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\nsec3hash.exe" "$(OUTDIR)\nsec3hash.bsc" CLEAN : -@erase "$(INTDIR)\nsec3hash.obj" -@erase "$(INTDIR)\nsec3hash.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\nsec3hash.pdb" -@erase "$(OUTDIR)\nsec3hash.bsc" -@erase "..\..\..\Build\Debug\nsec3hash.exe" -@erase "..\..\..\Build\Debug\nsec3hash.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\nsec3hash.bsc" BSC32_SBRS= \ "$(INTDIR)\nsec3hash.sbr" "$(OUTDIR)\nsec3hash.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\nsec3hash.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/nsec3hash.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\nsec3hash.obj" "..\..\..\Build\Debug\nsec3hash.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("nsec3hash.dep") !INCLUDE "nsec3hash.dep" !ELSE !MESSAGE Warning: cannot find "nsec3hash.dep" !ENDIF !ENDIF !IF "$(CFG)" == "nsec3hash - @PLATFORM@ Release" || "$(CFG)" == "nsec3hash - @PLATFORM@ Debug" SOURCE="..\nsec3hash.c" !IF "$(CFG)" == "nsec3hash - @PLATFORM@ Release" "$(INTDIR)\nsec3hash.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "nsec3hash - @PLATFORM@ Debug" "$(INTDIR)\nsec3hash.obj" "$(INTDIR)\nsec3hash.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.vcxproj.in0000644000470500017500000001433212271526120022416 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {70F2F0DF-665D-4444-A982-AEA31A861A22} Win32Proj ischmacfixup Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ isc-hmac-fixup false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ isc-hmac-fixup Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tools/win32/genrandom.dsp.in0000644000470500017500000001037112271526120020777 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="genrandom" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=genrandom - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "genrandom.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "genrandom.mak" CFG="genrandom - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "genrandom - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "genrandom - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "genrandom - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/genrandom.exe" !ELSEIF "$(CFG)" == "genrandom - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/genrandom.exe" /pdbtype:sept !ENDIF # Begin Target # Name "genrandom - @PLATFORM@ Release" # Name "genrandom - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\genrandom.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tools/win32/journalprint.vcxproj.user0000644000470500017500000000021712271526120023027 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.vcxproj.in0000644000470500017500000001441612271526120021615 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {4EE91023-94C3-48C0-B71C-5333B726C2EE} Win32Proj nsec3hash Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;libdns.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;libdns.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.dsp.in0000644000470500017500000001060712271526120020706 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="nsec3hash" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=nsec3hash - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "nsec3hash.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "nsec3hash.mak" CFG="nsec3hash - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "nsec3hash - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "nsec3hash - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "nsec3hash - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/nsec3hash.exe" !ELSEIF "$(CFG)" == "nsec3hash - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/nsec3hash.exe" /pdbtype:sept !ENDIF # Begin Target # Name "nsec3hash - @PLATFORM@ Release" # Name "nsec3hash - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\nsec3hash.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tools/win32/genrandom.vcxproj.in0000644000470500017500000001416612271526120021712 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {B4AC7F81-E3DC-43E9-B339-4FA5149FA8F7} Win32Proj genrandom Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tools/win32/journalprint.mak.in0000644000470500017500000001770712271526120021550 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on journalprint.dsp !IF "$(CFG)" == "" CFG=journalprint - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to journalprint - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "journalprint - @PLATFORM@ Release" && "$(CFG)" != "journalprint - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "journalprint.mak" CFG="journalprint - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "journalprint - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "journalprint - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "journalprint - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "journalprint - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\named-journalprint.exe" CLEAN : -@erase "$(INTDIR)\named-journalprint.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\named-journalprint.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\journalprint.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\journalprint.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\named-journalprint.pdb" @MACHINE@ /out:"../../../Build/Release/named-journalprint.exe" LINK32_OBJS= \ "$(INTDIR)\named-journalprint.obj" "..\..\..\Build\Release\named-journalprint.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "journalprint - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\named-journalprint.exe" "$(OUTDIR)\journalprint.bsc" CLEAN : -@erase "$(INTDIR)\named-journalprint.obj" -@erase "$(INTDIR)\named-journalprint.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\named-journalprint.pdb" -@erase "$(OUTDIR)\journalprint.bsc" -@erase "..\..\..\Build\Debug\named-journalprint.exe" -@erase "..\..\..\Build\Debug\named-journalprint.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\journalprint.bsc" BSC32_SBRS= \ "$(INTDIR)\named-journalprint.sbr" "$(OUTDIR)\journalprint.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\named-journalprint.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/named-journalprint.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\named-journalprint.obj" "..\..\..\Build\Debug\named-journalprint.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("journalprint.dep") !INCLUDE "journalprint.dep" !ELSE !MESSAGE Warning: cannot find "journalprint.dep" !ENDIF !ENDIF !IF "$(CFG)" == "journalprint - @PLATFORM@ Release" || "$(CFG)" == "journalprint - @PLATFORM@ Debug" SOURCE="..\named-journalprint.c" !IF "$(CFG)" == "journalprint - @PLATFORM@ Release" "$(INTDIR)\named-journalprint.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "journalprint - @PLATFORM@ Debug" "$(INTDIR)\named-journalprint.obj" "$(INTDIR)\named-journalprint.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.dsw0000644000470500017500000000103712271526120020305 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "nsec3hash"=".\nsec3hash.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tools/win32/arpaname.mak.in0000644000470500017500000001677012271526120020604 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on arpaname.dsp !IF "$(CFG)" == "" CFG=arpaname - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to arpaname - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "arpaname - @PLATFORM@ Release" && "$(CFG)" != "arpaname - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "arpaname.mak" CFG="arpaname - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "arpaname - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "arpaname - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "arpaname - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "arpaname - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\arpaname.exe" CLEAN : -@erase "$(INTDIR)\arpaname.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\arpaname.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\arpaname.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\arpaname.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\arpaname.pdb" @MACHINE@ /out:"../../../Build/Release/arpaname.exe" LINK32_OBJS= \ "$(INTDIR)\arpaname.obj" "..\..\..\Build\Release\arpaname.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "arpaname - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\arpaname.exe" "$(OUTDIR)\arpaname.bsc" CLEAN : -@erase "$(INTDIR)\arpaname.obj" -@erase "$(INTDIR)\arpaname.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\arpaname.pdb" -@erase "$(OUTDIR)\arpaname.bsc" -@erase "..\..\..\Build\Debug\arpaname.exe" -@erase "..\..\..\Build\Debug\arpaname.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\arpaname.bsc" BSC32_SBRS= \ "$(INTDIR)\arpaname.sbr" "$(OUTDIR)\arpaname.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\arpaname.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/arpaname.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\arpaname.obj" "..\..\..\Build\Debug\arpaname.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("arpaname.dep") !INCLUDE "arpaname.dep" !ELSE !MESSAGE Warning: cannot find "arpaname.dep" !ENDIF !ENDIF !IF "$(CFG)" == "arpaname - @PLATFORM@ Release" || "$(CFG)" == "arpaname - @PLATFORM@ Debug" SOURCE="..\arpaname.c" !IF "$(CFG)" == "arpaname - @PLATFORM@ Release" "$(INTDIR)\arpaname.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "arpaname - @PLATFORM@ Debug" "$(INTDIR)\arpaname.obj" "$(INTDIR)\arpaname.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.mak.in0000755000470500017500000001736212271526120021504 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on ischmacfixup.dsp !IF "$(CFG)" == "" CFG=ischmacfixup - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to ischmacfixup - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "ischmacfixup - @PLATFORM@ Release" && "$(CFG)" != "ischmacfixup - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ischmacfixup.mak" CFG="ischmacfixup - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ischmacfixup - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "ischmacfixup - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "ischmacfixup - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "ischmacfixup - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\isc-hmac-fixup.exe" CLEAN : -@erase "$(INTDIR)\isc-hmac-fixup.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\isc-hmac-fixup.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\isc-hmac-fixup.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\isc-hmac-fixup.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\isc-hmac-fixup.pdb" @MACHINE@ /out:"../../../Build/Release/isc-hmac-fixup.exe" LINK32_OBJS= \ "$(INTDIR)\isc-hmac-fixup.obj" "..\..\..\Build\Release\isc-hmac-fixup.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "ischmacfixup - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\isc-hmac-fixup.exe" "$(OUTDIR)\isc-hmac-fixup.bsc" CLEAN : -@erase "$(INTDIR)\isc-hmac-fixup.obj" -@erase "$(INTDIR)\isc-hmac-fixup.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\isc-hmac-fixup.pdb" -@erase "$(OUTDIR)\isc-hmac-fixup.bsc" -@erase "..\..\..\Build\Debug\isc-hmac-fixup.exe" -@erase "..\..\..\Build\Debug\isc-hmac-fixup.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\isc-hmac-fixup.bsc" BSC32_SBRS= \ "$(INTDIR)\isc-hmac-fixup.sbr" "$(OUTDIR)\isc-hmac-fixup.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\isc-hmac-fixup.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/isc-hmac-fixup.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\isc-hmac-fixup.obj" "..\..\..\Build\Debug\isc-hmac-fixup.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("isc-hmac-fixup.dep") !INCLUDE "isc-hmac-fixup.dep" !ELSE !MESSAGE Warning: cannot find "isc-hmac-fixup.dep" !ENDIF !ENDIF !IF "$(CFG)" == "ischmacfixup - @PLATFORM@ Release" || "$(CFG)" == "ischmacfixup - @PLATFORM@ Debug" SOURCE="..\isc-hmac-fixup.c" !IF "$(CFG)" == "ischmacfixup - @PLATFORM@ Release" "$(INTDIR)\isc-hmac-fixup.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ischmacfixup - @PLATFORM@ Debug" "$(INTDIR)\isc-hmac-fixup.obj" "$(INTDIR)\isc-hmac-fixup.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tools/win32/arpaname.vcxproj.filters.in0000644000470500017500000000167612271526120023175 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.vcxproj.filters.in0000644000470500017500000000137712271526120023266 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tools/win32/nsec3hash.vcxproj.user0000644000470500017500000000021712271526120022157 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tools/win32/genrandom.vcxproj.filters.in0000644000470500017500000000137712271526120023361 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tools/win32/ischmacfixup.dsp.in0000755000470500017500000001045112271526120021512 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="ischmacfixup" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=ischmacfixup - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ischmacfixup.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ischmacfixup.mak" CFG="ischmacfixup - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ischmacfixup - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "ischmacfixup - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ischmacfixup - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/isc-hmac-fixup.exe" !ELSEIF "$(CFG)" == "ischmacfixup - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/isc-hmac-fixup.exe" /pdbtype:sept !ENDIF # Begin Target # Name "ischmacfixup - @PLATFORM@ Release" # Name "ischmacfixup - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\isc-hmac-fixup.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tools/win32/journalprint.vcxproj.in0000644000470500017500000001460212271526120022462 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {B19042CE-D3D9-469B-BCD2-C3140150939A} Win32Proj journalprint Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ named-$(ProjectName) false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ named-$(ProjectName) Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;libdns.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;libdns.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tools/win32/journalprint.dsw0000644000470500017500000000104512271526120021154 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "journalprint"=".\journalprint.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tools/win32/arpaname.vcxproj.user0000644000470500017500000000021712271526120022064 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tools/win32/journalprint.dsp.in0000644000470500017500000001070312271526120021553 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="journalprint" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=journalprint - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "journalprint.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "journalprint.mak" CFG="journalprint - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "journalprint - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "journalprint - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "journalprint - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/named-journalprint.exe" !ELSEIF "$(CFG)" == "journalprint - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/named-journalprint.exe" /pdbtype:sept !ENDIF # Begin Target # Name "journalprint - @PLATFORM@ Release" # Name "journalprint - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\named-journalprint.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tools/win32/genrandom.dsw0000644000470500017500000000103712271526120020400 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "genrandom"=".\genrandom.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tools/win32/arpaname.dsw0000644000470500017500000000103512271526120020210 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "arpaname"=".\arpaname.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tools/win32/arpaname.dsp.in0000644000470500017500000001035312271526120020611 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="arpaname" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=arpaname - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "arpaname.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "arpaname.mak" CFG="arpaname - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "arpaname - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "arpaname - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "arpaname - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "NDEBUG" /D "__STDC__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Release/libisc.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/arpaname.exe" !ELSEIF "$(CFG)" == "arpaname - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /D "_DEBUG" /D "WIN32" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ../../../lib/isc/win32/Debug/libisc.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/arpaname.exe" /pdbtype:sept !ENDIF # Begin Target # Name "arpaname - @PLATFORM@ Release" # Name "arpaname - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\arpaname.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tools/win32/arpaname.vcxproj.in0000644000470500017500000001416412271526120021522 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {91E60FDA-E48C-4DA0-92A2-97F963348E00} Win32Proj arpaname Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) false .\$(Configuration)\$(TargetName).pch true .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) .\;..\..\..\;@LIBXML2_INC@..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;%(AdditionalIncludeDirectories) OnlyExplicitInline true .\$(Configuration)\$(TargetName).pch false .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\lib\isc\win32\$(Configuration);%(AdditionalLibraryDirectories) libisc.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tools/genrandom.80000644000470500017500000000377312271526120017021 0ustar lamontlamont.\" Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: genrandom .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: Feb 19, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "GENRANDOM" "8" "Feb 19, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" genrandom \- generate a file containing random data .SH "SYNOPSIS" .HP 10 \fBgenrandom\fR [\fB\-n\ \fR\fB\fInumber\fR\fR] {\fIsize\fR} {\fIfilename\fR} .SH "DESCRIPTION" .PP \fBgenrandom\fR generates a file or a set of files containing a specified quantity of pseudo\-random data, which can be used as a source of entropy for other commands on systems with no random device. .SH "ARGUMENTS" .PP \-n \fInumber\fR .RS 4 In place of generating one file, generates \fBnumber\fR (from 2 to 9) files, appending \fBnumber\fR to the name. .RE .PP size .RS 4 The size of the file, in kilobytes, to generate. .RE .PP filename .RS 4 The file name into which random data should be written. .RE .SH "SEE ALSO" .PP \fBrand\fR(3), \fBarc4random\fR(3) .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2009\-2011 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/tools/isc-hmac-fixup.80000644000470500017500000000552512271526120017661 0ustar lamontlamont.\" Copyright (C) 2010, 2013 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: isc\-hmac\-fixup .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: January 5, 2010 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "ISC\-HMAC\-FIXUP" "8" "January 5, 2010" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" isc\-hmac\-fixup \- fixes HMAC keys generated by older versions of BIND .SH "SYNOPSIS" .HP 15 \fBisc\-hmac\-fixup\fR {\fIalgorithm\fR} {\fIsecret\fR} .SH "DESCRIPTION" .PP Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC\-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations. .PP This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys. \fBisc\-hmac\-fixup\fR modifies those keys to restore compatibility. .PP To modify a key, run \fBisc\-hmac\-fixup\fR and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.) .SH "SECURITY CONSIDERATIONS" .PP Secrets that have been converted by \fBisc\-hmac\-fixup\fR are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength." .SH "SEE ALSO" .PP BIND 9 Administrator Reference Manual, RFC 2104. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2010, 2013 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/tools/arpaname.docbook0000644000470500017500000000451012271526120020072 0ustar lamontlamont]> March 4, 2009 arpaname 1 BIND9 arpaname translate IP addresses to the corresponding ARPA names 2009 Internet Systems Consortium, Inc. ("ISC") arpaname ipaddress DESCRIPTION arpaname translates IP addresses (IPv4 and IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names. SEE ALSO BIND 9 Administrator Reference Manual. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/tools/named-journalprint.docbook0000644000470500017500000000665712271526120022135 0ustar lamontlamont]> Feb 18, 2009 named-journalprint 8 BIND9 named-journalprint print zone journal in human-readable form 2009 Internet Systems Consortium, Inc. ("ISC") named-journalprint journal DESCRIPTION named-journalprint prints the contents of a zone journal file in a human-readable form. Journal files are automatically created by named when changes are made to dynamic zones (e.g., by nsupdate). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension .jnl to the name of the corresponding zone file. named-journalprint converts the contents of a given journal file into a human-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master-file format. SEE ALSO named8 , nsupdate8 , BIND 9 Administrator Reference Manual. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/tools/Makefile.in0000644000470500017500000000742612271526120017022 0ustar lamontlamont# Copyright (C) 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.13 2010/01/07 23:48:53 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES} \ ${LWRES_INCLUDES} ${OMAPI_INCLUDES} CDEFINES = CWARNINGS = DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ ISCLIBS = ../../lib/isc/libisc.@A@ @DNS_CRYPTO_LIBS@ ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@ ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ LWRESLIBS = ../../lib/lwres/liblwres.@A@ DNSDEPLIBS = ../../lib/dns/libdns.@A@ ISCDEPLIBS = ../../lib/isc/libisc.@A@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@ LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@ LIBS = ${ISCLIBS} @LIBS@ NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@ SUBDIRS = TARGETS = arpaname@EXEEXT@ named-journalprint@EXEEXT@ nsec3hash@EXEEXT@ \ genrandom@EXEEXT@ isc-hmac-fixup@EXEEXT@ SRCS = arpaname.c named-journalprint.c nsec3hash.c genrandom.c \ isc-hmac-fixup.c MANPAGES = arpaname.1 named-journalprint.8 nsec3hash.8 genrandom.8 \ isc-hmac-fixup.8 HTMLPAGES = arpaname.html named-journalprint.html nsec3hash.html \ genrandom.html isc-hmac-fixup.html MANOBJS = ${MANPAGES} ${HTMLPAGES} @BIND9_MAKE_RULES@ arpaname@EXEEXT@: arpaname.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ arpaname.@O@ \ ${ISCLIBS} ${LIBS} named-journalprint@EXEEXT@: named-journalprint.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} export BASEOBJS="named-journalprint.@O@"; \ export LIBS0="${DNSLIBS}"; \ ${FINALBUILDCMD} nsec3hash@EXEEXT@: nsec3hash.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} export BASEOBJS="nsec3hash.@O@"; \ export LIBS0="${DNSLIBS}"; \ ${FINALBUILDCMD} isc-hmac-fixup@EXEEXT@: isc-hmac-fixup.@O@ ${ISCDEPLIBS} export BASEOBJS="isc-hmac-fixup.@O@"; \ export LIBS0="${ISCLIBS}"; \ ${FINALBUILDCMD} genrandom@EXEEXT@: genrandom.@O@ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ genrandom.@O@ @GENRANDOMLIB@ ${LIBS} doc man:: ${MANOBJS} docclean manclean maintainer-clean:: rm -f ${MANOBJS} installdirs: $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 install:: ${TARGETS} installdirs ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} arpaname@EXEEXT@ ${DESTDIR}${sbindir} ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-journalprint@EXEEXT@ ${DESTDIR}${sbindir} ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} nsec3hash@EXEEXT@ ${DESTDIR}${sbindir} ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} genrandom@EXEEXT@ ${DESTDIR}${sbindir} ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} isc-hmac-fixup@EXEEXT@ ${DESTDIR}${sbindir} ${INSTALL_DATA} ${srcdir}/arpaname.1 ${DESTDIR}${mandir}/man1 ${INSTALL_DATA} ${srcdir}/isc-hmac-fixup.8 ${DESTDIR}${mandir}/man8 ${INSTALL_DATA} ${srcdir}/named-journalprint.8 ${DESTDIR}${mandir}/man8 ${INSTALL_DATA} ${srcdir}/nsec3hash.8 ${DESTDIR}${mandir}/man8 ${INSTALL_DATA} ${srcdir}/genrandom.8 ${DESTDIR}${mandir}/man8 clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tools/named-journalprint.html0000644000470500017500000000626412271526120021453 0ustar lamontlamont named-journalprint

    Name

    named-journalprint — print zone journal in human-readable form

    Synopsis

    named-journalprint {journal}

    DESCRIPTION

    named-journalprint prints the contents of a zone journal file in a human-readable form.

    Journal files are automatically created by named when changes are made to dynamic zones (e.g., by nsupdate). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension .jnl to the name of the corresponding zone file.

    named-journalprint converts the contents of a given journal file into a human-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master-file format.

    SEE ALSO

    named(8), nsupdate(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/tools/isc-hmac-fixup.docbook0000644000470500017500000000765612271526120021141 0ustar lamontlamont]> January 5, 2010 isc-hmac-fixup 8 BIND9 isc-hmac-fixup fixes HMAC keys generated by older versions of BIND 2010 2013 Internet Systems Consortium, Inc. ("ISC") isc-hmac-fixup algorithm secret DESCRIPTION Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations. This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys. isc-hmac-fixup modifies those keys to restore compatibility. To modify a key, run isc-hmac-fixup and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.) SECURITY CONSIDERATIONS Secrets that have been converted by isc-hmac-fixup are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength." SEE ALSO BIND 9 Administrator Reference Manual, RFC 2104. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/tools/genrandom.html0000644000470500017500000000606512271526120017613 0ustar lamontlamont genrandom

    Name

    genrandom — generate a file containing random data

    Synopsis

    genrandom [-n number] {size} {filename}

    DESCRIPTION

    genrandom generates a file or a set of files containing a specified quantity of pseudo-random data, which can be used as a source of entropy for other commands on systems with no random device.

    ARGUMENTS

    -n number

    In place of generating one file, generates number (from 2 to 9) files, appending number to the name.

    size

    The size of the file, in kilobytes, to generate.

    filename

    The file name into which random data should be written.

    SEE ALSO

    rand(3), arc4random(3)

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/tools/arpaname.10000644000470500017500000000311312271526120016610 0ustar lamontlamont.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: arpaname .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: March 4, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "ARPANAME" "1" "March 4, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" arpaname \- translate IP addresses to the corresponding ARPA names .SH "SYNOPSIS" .HP 9 \fBarpaname\fR {\fIipaddress\ \fR...} .SH "DESCRIPTION" .PP \fBarpaname\fR translates IP addresses (IPv4 and IPv6) to the corresponding IN\-ADDR.ARPA or IP6.ARPA names. .SH "SEE ALSO" .PP BIND 9 Administrator Reference Manual. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/tools/arpaname.c0000644000470500017500000000271012271526120016674 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: arpaname.c,v 1.4 2009/10/27 03:05:33 marka Exp $ */ #include "config.h" #include #include #define UNUSED(x) (void)(x) int main(int argc, char *argv[]) { unsigned char buf[16]; int i; UNUSED(argc); while (argv[1]) { if (inet_pton(AF_INET6, argv[1], buf) == 1) { for (i = 15; i >= 0; i--) fprintf(stdout, "%X.%X.", buf[i] & 0xf, (buf[i] >> 4) & 0xf); fprintf(stdout, "IP6.ARPA\n"); argv++; continue; } if (inet_pton(AF_INET, argv[1], buf) == 1) { fprintf(stdout, "%u.%u.%u.%u.IN-ADDR.ARPA\n", buf[3], buf[2], buf[1], buf[0]); argv++; continue; } return (1); } fflush(stdout); return(ferror(stdout)); } bind9-9.9.5.dfsg/bin/tools/nsec3hash.c0000644000470500017500000000666412271526120017003 0ustar lamontlamont/* * Copyright (C) 2006, 2008, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: nsec3hash.c,v 1.8 2011/11/02 23:46:24 tbox Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const char *program = "nsec3hash"; ISC_PLATFORM_NORETURN_PRE static void fatal(const char *format, ...) ISC_PLATFORM_NORETURN_POST; static void fatal(const char *format, ...) { va_list args; fprintf(stderr, "%s: ", program); va_start(args, format); vfprintf(stderr, format, args); va_end(args); fprintf(stderr, "\n"); exit(1); } static void check_result(isc_result_t result, const char *message) { if (result != ISC_R_SUCCESS) fatal("%s: %s", message, isc_result_totext(result)); } static void usage() { printf("Usage: %s salt algorithm iterations domain\n", program); exit(1); } int main(int argc, char **argv) { dns_fixedname_t fixed; dns_name_t *name; isc_buffer_t buffer; isc_region_t region; isc_result_t result; unsigned char hash[NSEC3_MAX_HASH_LENGTH]; unsigned char salt[DNS_NSEC3_SALTSIZE]; unsigned char text[1024]; unsigned int hash_alg; unsigned int length; unsigned int iterations; unsigned int salt_length; if (argc != 5) usage(); if (strcmp(argv[1], "-") == 0) { salt_length = 0; salt[0] = 0; } else { isc_buffer_init(&buffer, salt, sizeof(salt)); result = isc_hex_decodestring(argv[1], &buffer); check_result(result, "isc_hex_decodestring(salt)"); salt_length = isc_buffer_usedlength(&buffer); if (salt_length > DNS_NSEC3_SALTSIZE) fatal("salt too long"); } hash_alg = atoi(argv[2]); if (hash_alg > 255U) fatal("hash algorithm too large"); iterations = atoi(argv[3]); if (iterations > 0xffffU) fatal("iterations to large"); dns_fixedname_init(&fixed); name = dns_fixedname_name(&fixed); isc_buffer_init(&buffer, argv[4], strlen(argv[4])); isc_buffer_add(&buffer, strlen(argv[4])); result = dns_name_fromtext(name, &buffer, dns_rootname, 0, NULL); check_result(result, "dns_name_fromtext() failed"); dns_name_downcase(name, name, NULL); length = isc_iterated_hash(hash, hash_alg, iterations, salt, salt_length, name->ndata, name->length); if (length == 0) fatal("isc_iterated_hash failed"); region.base = hash; region.length = length; isc_buffer_init(&buffer, text, sizeof(text)); isc_base32hex_totext(®ion, 1, "", &buffer); fprintf(stdout, "%.*s (salt=%s, hash=%u, iterations=%u)\n", (int)isc_buffer_usedlength(&buffer), text, argv[1], hash_alg, iterations); return(0); } bind9-9.9.5.dfsg/bin/tools/nsec3hash.80000644000470500017500000000407712271526120016724 0ustar lamontlamont.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: nsec3hash .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: Feb 18, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "NSEC3HASH" "8" "Feb 18, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" nsec3hash \- generate NSEC3 hash .SH "SYNOPSIS" .HP 10 \fBnsec3hash\fR {\fIsalt\fR} {\fIalgorithm\fR} {\fIiterations\fR} {\fIdomain\fR} .SH "DESCRIPTION" .PP \fBnsec3hash\fR generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone. .SH "ARGUMENTS" .PP salt .RS 4 The salt provided to the hash algorithm. .RE .PP algorithm .RS 4 A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA\-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument. .RE .PP iterations .RS 4 The number of additional times the hash should be performed. .RE .PP domain .RS 4 The domain name to be hashed. .RE .SH "SEE ALSO" .PP BIND 9 Administrator Reference Manual, RFC 5155. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/tools/nsec3hash.html0000644000470500017500000000611712271526120017516 0ustar lamontlamont nsec3hash

    Name

    nsec3hash — generate NSEC3 hash

    Synopsis

    nsec3hash {salt} {algorithm} {iterations} {domain}

    DESCRIPTION

    nsec3hash generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone.

    ARGUMENTS

    salt

    The salt provided to the hash algorithm.

    algorithm

    A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument.

    iterations

    The number of additional times the hash should be performed.

    domain

    The domain name to be hashed.

    SEE ALSO

    BIND 9 Administrator Reference Manual, RFC 5155.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/tools/isc-hmac-fixup.html0000644000470500017500000000724612271526120020460 0ustar lamontlamont isc-hmac-fixup

    Name

    isc-hmac-fixup — fixes HMAC keys generated by older versions of BIND

    Synopsis

    isc-hmac-fixup {algorithm} {secret}

    DESCRIPTION

    Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations.

    This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys. isc-hmac-fixup modifies those keys to restore compatibility.

    To modify a key, run isc-hmac-fixup and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.)

    SECURITY CONSIDERATIONS

    Secrets that have been converted by isc-hmac-fixup are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength."

    SEE ALSO

    BIND 9 Administrator Reference Manual, RFC 2104.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/tools/isc-hmac-fixup.c0000644000470500017500000000775712271526120017745 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: isc-hmac-fixup.c,v 1.4 2010/03/10 02:17:52 marka Exp $ */ #include #include #include #include #include #include #include #include #include #include #define HMAC_LEN 64 int main(int argc, char **argv) { isc_buffer_t buf; unsigned char key[1024]; char secret[1024]; char base64[(1024*4)/3]; isc_region_t r; isc_result_t result; if (argc != 3) { fprintf(stderr, "Usage:\t%s algorithm secret\n", argv[0]); fprintf(stderr, "\talgorithm: (MD5 | SHA1 | SHA224 | " "SHA256 | SHA384 | SHA512)\n"); return (1); } isc_buffer_init(&buf, secret, sizeof(secret)); result = isc_base64_decodestring(argv[2], &buf); if (result != ISC_R_SUCCESS) { fprintf(stderr, "error: %s\n", isc_result_totext(result)); return (1); } isc__buffer_usedregion(&buf, &r); if (!strcasecmp(argv[1], "md5") || !strcasecmp(argv[1], "hmac-md5")) { if (r.length > HMAC_LEN) { isc_md5_t md5ctx; isc_md5_init(&md5ctx); isc_md5_update(&md5ctx, r.base, r.length); isc_md5_final(&md5ctx, key); r.base = key; r.length = ISC_MD5_DIGESTLENGTH; } } else if (!strcasecmp(argv[1], "sha1") || !strcasecmp(argv[1], "hmac-sha1")) { if (r.length > ISC_SHA1_DIGESTLENGTH) { isc_sha1_t sha1ctx; isc_sha1_init(&sha1ctx); isc_sha1_update(&sha1ctx, r.base, r.length); isc_sha1_final(&sha1ctx, key); r.base = key; r.length = ISC_SHA1_DIGESTLENGTH; } } else if (!strcasecmp(argv[1], "sha224") || !strcasecmp(argv[1], "hmac-sha224")) { if (r.length > ISC_SHA224_DIGESTLENGTH) { isc_sha224_t sha224ctx; isc_sha224_init(&sha224ctx); isc_sha224_update(&sha224ctx, r.base, r.length); isc_sha224_final(key, &sha224ctx); r.base = key; r.length = ISC_SHA224_DIGESTLENGTH; } } else if (!strcasecmp(argv[1], "sha256") || !strcasecmp(argv[1], "hmac-sha256")) { if (r.length > ISC_SHA256_DIGESTLENGTH) { isc_sha256_t sha256ctx; isc_sha256_init(&sha256ctx); isc_sha256_update(&sha256ctx, r.base, r.length); isc_sha256_final(key, &sha256ctx); r.base = key; r.length = ISC_SHA256_DIGESTLENGTH; } } else if (!strcasecmp(argv[1], "sha384") || !strcasecmp(argv[1], "hmac-sha384")) { if (r.length > ISC_SHA384_DIGESTLENGTH) { isc_sha384_t sha384ctx; isc_sha384_init(&sha384ctx); isc_sha384_update(&sha384ctx, r.base, r.length); isc_sha384_final(key, &sha384ctx); r.base = key; r.length = ISC_SHA384_DIGESTLENGTH; } } else if (!strcasecmp(argv[1], "sha512") || !strcasecmp(argv[1], "hmac-sha512")) { if (r.length > ISC_SHA512_DIGESTLENGTH) { isc_sha512_t sha512ctx; isc_sha512_init(&sha512ctx); isc_sha512_update(&sha512ctx, r.base, r.length); isc_sha512_final(key, &sha512ctx); r.base = key; r.length = ISC_SHA512_DIGESTLENGTH; } } else { fprintf(stderr, "unknown hmac/digest algorithm: %s\n", argv[1]); return (1); } isc_buffer_init(&buf, base64, sizeof(base64)); result = isc_base64_totext(&r, 0, "", &buf); if (result != ISC_R_SUCCESS) { fprintf(stderr, "error: %s\n", isc_result_totext(result)); return (1); } fprintf(stdout, "%.*s\n", (int)isc_buffer_usedlength(&buf), base64); return (0); } bind9-9.9.5.dfsg/bin/tools/nsec3hash.docbook0000644000470500017500000000727012271526120020173 0ustar lamontlamont]> Feb 18, 2009 nsec3hash 8 BIND9 nsec3hash generate NSEC3 hash 2009 Internet Systems Consortium, Inc. ("ISC") nsec3hash salt algorithm iterations domain DESCRIPTION nsec3hash generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone. ARGUMENTS salt The salt provided to the hash algorithm. algorithm A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument. iterations The number of additional times the hash should be performed. domain The domain name to be hashed. SEE ALSO BIND 9 Administrator Reference Manual, RFC 5155. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/tools/named-journalprint.80000644000470500017500000000447612271526120020661 0ustar lamontlamont.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: named\-journalprint .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: Feb 18, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "NAMED\-JOURNALPRINT" "8" "Feb 18, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" named\-journalprint \- print zone journal in human\-readable form .SH "SYNOPSIS" .HP 19 \fBnamed\-journalprint\fR {\fIjournal\fR} .SH "DESCRIPTION" .PP \fBnamed\-journalprint\fR prints the contents of a zone journal file in a human\-readable form. .PP Journal files are automatically created by \fBnamed\fR when changes are made to dynamic zones (e.g., by \fBnsupdate\fR). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re\-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension \fI.jnl\fR to the name of the corresponding zone file. .PP \fBnamed\-journalprint\fR converts the contents of a given journal file into a human\-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master\-file format. .SH "SEE ALSO" .PP \fBnamed\fR(8), \fBnsupdate\fR(8), BIND 9 Administrator Reference Manual. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/tools/arpaname.html0000644000470500017500000000407612271526120017425 0ustar lamontlamont arpaname

    Name

    arpaname — translate IP addresses to the corresponding ARPA names

    Synopsis

    arpaname {ipaddress ...}

    DESCRIPTION

    arpaname translates IP addresses (IPv4 and IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.

    SEE ALSO

    BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/confgen/0002755000470500017500000000000012276444015015234 5ustar lamontlamontbind9-9.9.5.dfsg/bin/confgen/unix/0002755000470500017500000000000012276444015016217 5ustar lamontlamontbind9-9.9.5.dfsg/bin/confgen/unix/os.c0000644000470500017500000000232312271526120016773 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: os.c,v 1.3 2009/06/11 23:47:55 tbox Exp $ */ /*! \file */ #include #include #include #include #include #include #include #include #include int set_user(FILE *fd, const char *user) { struct passwd *pw; pw = getpwnam(user); if (pw == NULL) { errno = EINVAL; return (-1); } return (fchown(fileno(fd), pw->pw_uid, -1)); } bind9-9.9.5.dfsg/bin/confgen/unix/Makefile.in0000644000470500017500000000212112271526120020247 0ustar lamontlamont# Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.3 2009/06/11 23:47:55 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = -I${srcdir}/include -I${srcdir}/../include \ ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = OBJS = os.@O@ SRCS = os.c TARGETS = ${OBJS} @BIND9_MAKE_RULES@ bind9-9.9.5.dfsg/bin/confgen/include/0002755000470500017500000000000012276444015016657 5ustar lamontlamontbind9-9.9.5.dfsg/bin/confgen/include/confgen/0002755000470500017500000000000012271526120020267 5ustar lamontlamontbind9-9.9.5.dfsg/bin/confgen/include/confgen/os.h0000644000470500017500000000224512271526120021062 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: os.h,v 1.3 2009/06/11 23:47:55 tbox Exp $ */ /*! \file */ #ifndef RNDC_OS_H #define RNDC_OS_H 1 #include #include ISC_LANG_BEGINDECLS int set_user(FILE *fd, const char *user); /*%< * Set the owner of the file referenced by 'fd' to 'user'. * Returns: * 0 success * -1 insufficient permissions, or 'user' does not exist. */ ISC_LANG_ENDDECLS #endif bind9-9.9.5.dfsg/bin/confgen/rndc-confgen.html0000644000470500017500000002337512271526120020466 0ustar lamontlamont rndc-confgen

    Name

    rndc-confgen — rndc key generation tool

    Synopsis

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

    DESCRIPTION

    rndc-confgen generates configuration files for rndc. It can be used as a convenient alternative to writing the rndc.conf file and the corresponding controls and key statements in named.conf by hand. Alternatively, it can be run with the -a option to set up a rndc.key file and avoid the need for a rndc.conf file and a controls statement altogether.

    OPTIONS

    -a

    Do automatic rndc configuration. This creates a file rndc.key in /etc (or whatever sysconfdir was specified as when BIND was built) that is read by both rndc and named on startup. The rndc.key file defines a default command channel and authentication key allowing rndc to communicate with named on the local host with no further configuration.

    Running rndc-confgen -a allows BIND 9 and rndc to be used as drop-in replacements for BIND 8 and ndc, with no changes to the existing BIND 8 named.conf file.

    If a more elaborate configuration than that generated by rndc-confgen -a is required, for example if rndc is to be used remotely, you should run rndc-confgen without the -a option and set up a rndc.conf and named.conf as directed.

    -b keysize

    Specifies the size of the authentication key in bits. Must be between 1 and 512 bits; the default is 128.

    -c keyfile

    Used with the -a option to specify an alternate location for rndc.key.

    -h

    Prints a short summary of the options and arguments to rndc-confgen.

    -k keyname

    Specifies the key name of the rndc authentication key. This must be a valid domain name. The default is rndc-key.

    -p port

    Specifies the command channel port where named listens for connections from rndc. The default is 953.

    -r randomfile

    Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -s address

    Specifies the IP address where named listens for command channel connections from rndc. The default is the loopback address 127.0.0.1.

    -t chrootdir

    Used with the -a option to specify a directory where named will run chrooted. An additional copy of the rndc.key will be written relative to this directory so that it will be found by the chrooted named.

    -u user

    Used with the -a option to set the owner of the rndc.key file generated. If -t is also specified only the file in the chroot area has its owner changed.

    EXAMPLES

    To allow rndc to be used with no manual configuration, run

    rndc-confgen -a

    To print a sample rndc.conf file and corresponding controls and key statements to be manually inserted into named.conf, run

    rndc-confgen

    SEE ALSO

    rndc(8), rndc.conf(5), named(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/confgen/rndc-confgen.docbook0000644000470500017500000002410212271526120021127 0ustar lamontlamont]> Aug 27, 2001 rndc-confgen 8 BIND9 rndc-confgen rndc key generation tool 2004 2005 2007 2009 Internet Systems Consortium, Inc. ("ISC") 2001 2003 Internet Software Consortium. rndc-confgen DESCRIPTION rndc-confgen generates configuration files for rndc. It can be used as a convenient alternative to writing the rndc.conf file and the corresponding controls and key statements in named.conf by hand. Alternatively, it can be run with the -a option to set up a rndc.key file and avoid the need for a rndc.conf file and a controls statement altogether. OPTIONS -a Do automatic rndc configuration. This creates a file rndc.key in /etc (or whatever sysconfdir was specified as when BIND was built) that is read by both rndc and named on startup. The rndc.key file defines a default command channel and authentication key allowing rndc to communicate with named on the local host with no further configuration. Running rndc-confgen -a allows BIND 9 and rndc to be used as drop-in replacements for BIND 8 and ndc, with no changes to the existing BIND 8 named.conf file. If a more elaborate configuration than that generated by rndc-confgen -a is required, for example if rndc is to be used remotely, you should run rndc-confgen without the -a option and set up a rndc.conf and named.conf as directed. -b keysize Specifies the size of the authentication key in bits. Must be between 1 and 512 bits; the default is 128. -c keyfile Used with the -a option to specify an alternate location for rndc.key. -h Prints a short summary of the options and arguments to rndc-confgen. -k keyname Specifies the key name of the rndc authentication key. This must be a valid domain name. The default is rndc-key. -p port Specifies the command channel port where named listens for connections from rndc. The default is 953. -r randomfile Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used. -s address Specifies the IP address where named listens for command channel connections from rndc. The default is the loopback address 127.0.0.1. -t chrootdir Used with the -a option to specify a directory where named will run chrooted. An additional copy of the rndc.key will be written relative to this directory so that it will be found by the chrooted named. -u user Used with the -a option to set the owner of the rndc.key file generated. If -t is also specified only the file in the chroot area has its owner changed. EXAMPLES To allow rndc to be used with no manual configuration, run rndc-confgen -a To print a sample rndc.conf file and corresponding controls and key statements to be manually inserted into named.conf, run rndc-confgen SEE ALSO rndc8 , rndc.conf5 , named8 , BIND 9 Administrator Reference Manual. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/confgen/ddns-confgen.c0000644000470500017500000001516212271526120017741 0ustar lamontlamont/* * Copyright (C) 2009, 2011, 2014 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: ddns-confgen.c,v 1.11 2011/03/12 04:59:46 tbox Exp $ */ /*! \file */ /** * ddns-confgen generates configuration files for dynamic DNS. It can * be used as a convenient alternative to writing the ddns.key file * and the corresponding key and update-policy statements in named.conf. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "util.h" #include "keygen.h" #define DEFAULT_KEYNAME "ddns-key" static char program[256]; const char *progname; isc_boolean_t verbose = ISC_FALSE; ISC_PLATFORM_NORETURN_PRE static void usage(int status) ISC_PLATFORM_NORETURN_POST; static void usage(int status) { fprintf(stderr, "\ Usage:\n\ %s [-a alg] [-k keyname] [-r randomfile] [-q] [-s name | -z zone]\n\ -a alg: algorithm (default hmac-sha256)\n\ -k keyname: name of the key as it will be used in named.conf\n\ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\ -s name: domain name to be updated using the created key\n\ -z zone: name of the zone as it will be used in named.conf\n\ -q: quiet mode: print the key, with no explanatory text\n", progname); exit (status); } int main(int argc, char **argv) { isc_boolean_t show_final_mem = ISC_FALSE; isc_boolean_t quiet = ISC_FALSE; isc_buffer_t key_txtbuffer; char key_txtsecret[256]; isc_mem_t *mctx = NULL; isc_result_t result = ISC_R_SUCCESS; const char *randomfile = NULL; const char *keyname = NULL; const char *zone = NULL; const char *self_domain = NULL; char *keybuf = NULL; dns_secalg_t alg = DST_ALG_HMACSHA256; const char *algname = alg_totext(alg); int keysize = 256; int len = 0; int ch; result = isc_file_progname(*argv, program, sizeof(program)); if (result != ISC_R_SUCCESS) memmove(program, "ddns-confgen", 13); progname = program; isc_commandline_errprint = ISC_FALSE; while ((ch = isc_commandline_parse(argc, argv, "a:hk:Mmr:qs:Vy:z:")) != -1) { switch (ch) { case 'a': algname = isc_commandline_argument; alg = alg_fromtext(algname); if (alg == DST_ALG_UNKNOWN) fatal("Unsupported algorithm '%s'", algname); keysize = alg_bits(alg); break; case 'h': usage(0); case 'k': case 'y': keyname = isc_commandline_argument; break; case 'M': isc_mem_debugging = ISC_MEM_DEBUGTRACE; break; case 'm': show_final_mem = ISC_TRUE; break; case 'q': quiet = ISC_TRUE; break; case 'r': randomfile = isc_commandline_argument; break; case 's': self_domain = isc_commandline_argument; break; case 'V': verbose = ISC_TRUE; break; case 'z': zone = isc_commandline_argument; break; case '?': if (isc_commandline_option != '?') { fprintf(stderr, "%s: invalid argument -%c\n", program, isc_commandline_option); usage(1); } else usage(0); break; default: fprintf(stderr, "%s: unhandled option -%c\n", program, isc_commandline_option); exit(1); } } argc -= isc_commandline_index; argv += isc_commandline_index; POST(argv); if (self_domain != NULL && zone != NULL) usage(1); /* -s and -z cannot coexist */ if (argc > 0) usage(1); DO("create memory context", isc_mem_create(0, 0, &mctx)); if (keyname == NULL) { const char *suffix = NULL; keyname = DEFAULT_KEYNAME; if (self_domain != NULL) suffix = self_domain; else if (zone != NULL) suffix = zone; if (suffix != NULL) { len = strlen(keyname) + strlen(suffix) + 2; keybuf = isc_mem_get(mctx, len); if (keybuf == NULL) fatal("failed to allocate memory for keyname"); snprintf(keybuf, len, "%s.%s", keyname, suffix); keyname = (const char *) keybuf; } } isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret)); generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer); if (!quiet) printf("\ # To activate this key, place the following in named.conf, and\n\ # in a separate keyfile on the system or systems from which nsupdate\n\ # will be run:\n"); printf("\ key \"%s\" {\n\ algorithm %s;\n\ secret \"%.*s\";\n\ };\n", keyname, algname, (int)isc_buffer_usedlength(&key_txtbuffer), (char *)isc_buffer_base(&key_txtbuffer)); if (!quiet) { if (self_domain != NULL) { printf("\n\ # Then, in the \"zone\" statement for the zone containing the\n\ # name \"%s\", place an \"update-policy\" statement\n\ # like this one, adjusted as needed for your preferred permissions:\n\ update-policy {\n\ grant %s name %s ANY;\n\ };\n", self_domain, keyname, self_domain); } else if (zone != NULL) { printf("\n\ # Then, in the \"zone\" definition statement for \"%s\",\n\ # place an \"update-policy\" statement like this one, adjusted as \n\ # needed for your preferred permissions:\n\ update-policy {\n\ grant %s zonesub ANY;\n\ };\n", zone, keyname); } else { printf("\n\ # Then, in the \"zone\" statement for each zone you wish to dynamically\n\ # update, place an \"update-policy\" statement granting update permission\n\ # to this key. For example, the following statement grants this key\n\ # permission to update any name within the zone:\n\ update-policy {\n\ grant %s zonesub ANY;\n\ };\n", keyname); } printf("\n\ # After the keyfile has been placed, the following command will\n\ # execute nsupdate using this key:\n\ nsupdate -k \n"); } if (keybuf != NULL) isc_mem_put(mctx, keybuf, len); if (show_final_mem) isc_mem_stats(mctx, stderr); isc_mem_destroy(&mctx); return (0); } bind9-9.9.5.dfsg/bin/confgen/util.c0000644000470500017500000000257612271526120016356 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: util.c,v 1.3 2009/06/11 23:47:55 tbox Exp $ */ /*! \file */ #include #include #include #include #include #include "util.h" extern isc_boolean_t verbose; extern const char *progname; void notify(const char *fmt, ...) { va_list ap; if (verbose) { va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fputs("\n", stderr); } } void fatal(const char *format, ...) { va_list args; fprintf(stderr, "%s: ", progname); va_start(args, format); vfprintf(stderr, format, args); va_end(args); fprintf(stderr, "\n"); exit(1); } bind9-9.9.5.dfsg/bin/confgen/keygen.h0000644000470500017500000000254412271526120016663 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: keygen.h,v 1.3 2009/06/11 23:47:55 tbox Exp $ */ #ifndef RNDC_KEYGEN_H #define RNDC_KEYGEN_H 1 /*! \file */ #include ISC_LANG_BEGINDECLS void generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg, int keysize, isc_buffer_t *key_txtbuffer); void write_key_file(const char *keyfile, const char *user, const char *keyname, isc_buffer_t *secret, dns_secalg_t alg); const char *alg_totext(dns_secalg_t alg); dns_secalg_t alg_fromtext(const char *name); int alg_bits(dns_secalg_t alg); ISC_LANG_ENDDECLS #endif /* RNDC_KEYGEN_H */ bind9-9.9.5.dfsg/bin/confgen/win32/0002755000470500017500000000000012271527124016174 5ustar lamontlamontbind9-9.9.5.dfsg/bin/confgen/win32/confgentool.vcxproj.user0000644000470500017500000000021712271526120023074 0ustar lamontlamont bind9-9.9.5.dfsg/bin/confgen/win32/os.c0000644000470500017500000000210112271526120016744 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: os.c,v 1.3 2009/06/11 23:47:55 tbox Exp $ */ #include #include #include #include #include #include #include #include #include int set_user(FILE *fd, const char *user) { return (0); } bind9-9.9.5.dfsg/bin/confgen/win32/confgentool.dsp.in0000644000470500017500000001027312271526120021622 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="confgentool" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Static-Link Library" 0x0104 CFG=confgentool - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "confgentool.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "confgentool.mak" CFG="confgentool - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "confgentool - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Static-Link Library") !MESSAGE "confgentool - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Static-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "confgentool - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__STDC__" /D "_MBCS" @COPTY@ /FD /c /Fdconfgentool # SUBTRACT CPP /X # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 # ADD LINK32 /out:"Release/confgentool.lib" LIB32=lib.exe # ADD BASE LIB32 # ADD LIB32 /out:"Release/confgentool.lib" !ELSEIF "$(CFG)" == "confgentool - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__STDC__" /D "_MBCS" /FR @COPTY@ /FD /GZ /c /Fdconfgentool # SUBTRACT CPP /X # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 # ADD LINK32 /debug /out:"Debug/confgentool.lib" LIB32=lib.exe # ADD BASE LIB32 # ADD LIB32 /out:"Debug/confgentool.lib" !ENDIF # Begin Target # Name "confgentool - @PLATFORM@ Release" # Name "confgentool - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\keygen.h # End Source File # Begin Source File SOURCE=..\util.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Group "Main Dns Lib" # PROP Default_Filter "c" # Begin Source File SOURCE=..\keygen.c # End Source File # Begin Source File SOURCE=..\util.c # End Source File # Begin Source File SOURCE=.\os.c # End Source File # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.mak.in0000644000470500017500000002226012271526120021556 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on ddnsconfgen.dsp !IF "$(CFG)" == "" CFG=ddnsconfgen - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to ddnsconfgen - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "ddnsconfgen - @PLATFORM@ Release" && "$(CFG)" != "ddnsconfgen - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ddnsconfgen.mak" CFG="ddnsconfgen - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ddnsconfgen - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "ddnsconfgen - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\ddns-confgen.exe" CLEAN : -@erase "$(INTDIR)\os.obj" -@erase "$(INTDIR)\ddns-confgen.obj" -@erase "$(INTDIR)\keygen.obj" -@erase "$(INTDIR)\util.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\ddns-confgen.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\ddnsconfgen.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\ddnsconfgen.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ws2_32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib ../../../lib/isccfg/win32/Release/libisccfg.lib ../../../lib/isccc/win32/Release/libisccc.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\ddns-confgen.pdb" @MACHINE@ /out:"../../../Build/Release/ddns-confgen.exe" LINK32_OBJS= \ "$(INTDIR)\os.obj" \ "$(INTDIR)\ddns-confgen.obj" \ "$(INTDIR)\keygen.obj" \ "$(INTDIR)\util.obj" "..\..\..\Build\Release\ddns-confgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\ddns-confgen.exe" "$(OUTDIR)\ddnsconfgen.bsc" CLEAN : -@erase "$(INTDIR)\os.obj" -@erase "$(INTDIR)\os.sbr" -@erase "$(INTDIR)\ddns-confgen.obj" -@erase "$(INTDIR)\ddns-confgen.sbr" -@erase "$(INTDIR)\keygen.obj" -@erase "$(INTDIR)\keygen.sbr" -@erase "$(INTDIR)\util.obj" -@erase "$(INTDIR)\util.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\ddnsconfgen.bsc" -@erase "$(OUTDIR)\ddns-confgen.pdb" -@erase "..\..\..\Build\Debug\ddns-confgen.exe" -@erase "..\..\..\Build\Debug\ddns-confgen.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\ddnsconfgen.bsc" BSC32_SBRS= \ "$(INTDIR)\os.sbr" \ "$(INTDIR)\ddns-confgen.sbr" \ "$(INTDIR)\keygen.sbr" \ "$(INTDIR)\util.sbr" "$(OUTDIR)\ddnsconfgen.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ws2_32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib ../../../lib/isccfg/win32/Debug/libisccfg.lib ../../../lib/isccc/win32/Debug/libisccc.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\ddns-confgen.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/ddns-confgen.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\os.obj" \ "$(INTDIR)\ddns-confgen.obj" \ "$(INTDIR)\keygen.obj" \ "$(INTDIR)\util.obj" "..\..\..\Build\Debug\ddns-confgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("ddnsconfgen.dep") !INCLUDE "ddnsconfgen.dep" !ELSE !MESSAGE Warning: cannot find "ddnsconfgen.dep" !ENDIF !ENDIF !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" || "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" SOURCE=.\os.c !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" "$(INTDIR)\os.obj" : $(SOURCE) "$(INTDIR)" !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" "$(INTDIR)\os.obj" "$(INTDIR)\os.sbr" : $(SOURCE) "$(INTDIR)" !ENDIF SOURCE="..\ddns-confgen.c" !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" "$(INTDIR)\ddns-confgen.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" "$(INTDIR)\ddns-confgen.obj" "$(INTDIR)\ddns-confgen.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\keygen.c !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" "$(INTDIR)\keygen.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" "$(INTDIR)\keygen.obj" "$(INTDIR)\keygen.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\util.c !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" "$(INTDIR)\util.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" "$(INTDIR)\util.obj" "$(INTDIR)\util.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.vcxproj.in0000644000470500017500000001544712271526120022512 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {1EA4FC64-F33B-4A50-970A-EA052BBE9CF1} Win32Proj ddnsconfgen Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ ddns-confgen false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ ddns-confgen Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) $(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);%(AdditionalLibraryDirectories) confgentool.lib;libisc.lib;libdns.lib;libisccfg.lib;libisccc.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default $(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);%(AdditionalLibraryDirectories) confgentool.lib;libisc.lib;libdns.lib;libisccfg.lib;libisccc.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/confgen/win32/confgentool.vcxproj.filters.in0000644000470500017500000000266212271526120024201 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Header Files Header Files Header Files Source Files Source Files Source Files bind9-9.9.5.dfsg/bin/confgen/win32/confgentool.dsw0000644000470500017500000000104312271526120021217 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "confgentool"=".\confgentool.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.vcxproj.user0000644000470500017500000000021712271526120023047 0ustar lamontlamont bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.vcxproj.filters.in0000644000470500017500000000140212271526120024141 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.dsw0000644000470500017500000000104112271526120021166 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "rndconfgen"=".\rndconfgen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/confgen/win32/confgentool.vcxproj.in0000644000470500017500000001341312271526120022526 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {64964B03-4815-41F0-9057-E766A94AF197} Win32Proj confgentool StaticLibrary true MultiByte StaticLibrary false true MultiByte true .\$(Configuration)\ .\$(Configuration)\ false .\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console true Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;%(AdditionalIncludeDirectories) Console true true true false bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.dsw0000644000470500017500000000104312271526120021172 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ddnsconfgen"=".\ddnsconfgen.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.mak.in0000644000470500017500000002220712271526120021555 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on confgen.dsp !IF "$(CFG)" == "" CFG=rndcconfgen - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to rndcconfgen - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "rndcconfgen - @PLATFORM@ Release" && "$(CFG)" != "rndcconfgen - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "rndcconfgen.mak" CFG="rndcconfgen - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "rndcconfgen - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "rndcconfgen - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release ALL : "..\..\..\Build\Release\rndc-confgen.exe" CLEAN : -@erase "$(INTDIR)\os.obj" -@erase "$(INTDIR)\rndc-confgen.obj" -@erase "$(INTDIR)\keygen.obj" -@erase "$(INTDIR)\util.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\Build\Release\rndc-confgen.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\confgen.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\confgen.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ws2_32.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib ../../../lib/isccfg/win32/Release/libisccfg.lib ../../../lib/isccc/win32/Release/libisccc.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\rndc-confgen.pdb" @MACHINE@ /out:"../../../Build/Release/rndc-confgen.exe" LINK32_OBJS= \ "$(INTDIR)\os.obj" \ "$(INTDIR)\rndc-confgen.obj" \ "$(INTDIR)\keygen.obj" \ "$(INTDIR)\util.obj" "..\..\..\Build\Release\rndc-confgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros ALL : "..\..\..\Build\Debug\rndc-confgen.exe" "$(OUTDIR)\confgen.bsc" CLEAN : -@erase "$(INTDIR)\os.obj" -@erase "$(INTDIR)\os.sbr" -@erase "$(INTDIR)\rndc-confgen.obj" -@erase "$(INTDIR)\rndc-confgen.sbr" -@erase "$(INTDIR)\keygen.obj" -@erase "$(INTDIR)\keygen.sbr" -@erase "$(INTDIR)\util.obj" -@erase "$(INTDIR)\util.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\confgen.bsc" -@erase "$(OUTDIR)\rndc-confgen.pdb" -@erase "..\..\..\Build\Debug\rndc-confgen.exe" -@erase "..\..\..\Build\Debug\rndc-confgen.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\confgen.bsc" BSC32_SBRS= \ "$(INTDIR)\os.sbr" \ "$(INTDIR)\rndc-confgen.sbr" \ "$(INTDIR)\keygen.sbr" \ "$(INTDIR)\util.sbr" "$(OUTDIR)\confgen.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib ws2_32.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib ../../../lib/isccfg/win32/Debug/libisccfg.lib ../../../lib/isccc/win32/Debug/libisccc.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\rndc-confgen.pdb" /debug @MACHINE@ /out:"../../../Build/Debug/rndc-confgen.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\os.obj" \ "$(INTDIR)\rndc-confgen.obj" \ "$(INTDIR)\keygen.obj" \ "$(INTDIR)\util.obj" "..\..\..\Build\Debug\rndc-confgen.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("confgen.dep") !INCLUDE "confgen.dep" !ELSE !MESSAGE Warning: cannot find "confgen.dep" !ENDIF !ENDIF !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" || "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" SOURCE=.\os.c !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" "$(INTDIR)\os.obj" : $(SOURCE) "$(INTDIR)" !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" "$(INTDIR)\os.obj" "$(INTDIR)\os.sbr" : $(SOURCE) "$(INTDIR)" !ENDIF SOURCE="..\rndc-confgen.c" !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" "$(INTDIR)\rndc-confgen.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" "$(INTDIR)\rndc-confgen.obj" "$(INTDIR)\rndc-confgen.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\keygen.c !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" "$(INTDIR)\keygen.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" "$(INTDIR)\keygen.obj" "$(INTDIR)\keygen.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\util.c !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" "$(INTDIR)\util.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" "$(INTDIR)\util.obj" "$(INTDIR)\util.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.vcxproj.user0000644000470500017500000000021712271526120023045 0ustar lamontlamont bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.dsp.in0000644000470500017500000001157612271526120021602 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="rndcconfgen" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=rndcconfgen - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "rndcconfgen.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "rndcconfgen.mak" CFG="rndcconfgen - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "rndcconfgen - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "rndcconfgen - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "rndcconfgen - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ws2_32.lib Release/confgentool.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib ../../../lib/isccfg/win32/Release/libisccfg.lib ../../../lib/isccc/win32/Release/libisccc.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/rndc-confgen.exe" !ELSEIF "$(CFG)" == "rndcconfgen - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ws2_32.lib Debug/confgentool.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib ../../../lib/isccfg/win32/Debug/libisccfg.lib ../../../lib/isccc/win32/Debug/libisccc.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/rndc-confgen.exe" /pdbtype:sept !ENDIF # Begin Target # Name "rndcconfgen - @PLATFORM@ Release" # Name "rndcconfgen - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\rndc-confgen.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.dsp.in0000644000470500017500000001157612271526120021604 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="ddnsconfgen" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=ddnsconfgen - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ddnsconfgen.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ddnsconfgen.mak" CFG="ddnsconfgen - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ddnsconfgen - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "ddnsconfgen - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 user32.lib advapi32.lib ws2_32.lib Release/confgentool.lib ../../../lib/isc/win32/Release/libisc.lib ../../../lib/dns/win32/Release/libdns.lib ../../../lib/isccfg/win32/Release/libisccfg.lib ../../../lib/isccc/win32/Release/libisccc.lib /nologo /subsystem:console @MACHINE@ /out:"../../../Build/Release/ddns-confgen.exe" !ELSEIF "$(CFG)" == "ddnsconfgen - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../" @LIBXML2_INC@ /I "../include" /I "../../../lib/isc/win32" /I "../../../lib/isc/win32/include" /I "../../../lib/isc/include" /I "../../../lib/dns/win32/include" /I "../../../lib/dns/include" /I "../../../lib/isccc/include" /I "../../../lib/isccfg/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 user32.lib advapi32.lib ws2_32.lib Debug/confgentool.lib ../../../lib/isc/win32/Debug/libisc.lib ../../../lib/dns/win32/Debug/libdns.lib ../../../lib/isccfg/win32/Debug/libisccfg.lib ../../../lib/isccc/win32/Debug/libisccc.lib /nologo /subsystem:console /debug @MACHINE@ /out:"../../../Build/Debug/ddns-confgen.exe" /pdbtype:sept !ENDIF # Begin Target # Name "ddnsconfgen - @PLATFORM@ Release" # Name "ddnsconfgen - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\ddns-confgen.c" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/confgen/win32/rndcconfgen.vcxproj.in0000644000470500017500000001544712271526120022510 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {1E2C1635-3093-4D59-80E7-4743AC10F22F} Win32Proj rndcconfgen Application true MultiByte Application false true MultiByte true ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ rndc-confgen false ..\..\..\Build\$(Configuration)\ .\$(Configuration)\ rndc-confgen Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;%(AdditionalIncludeDirectories) Console true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) $(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);%(AdditionalLibraryDirectories) confgentool.lib;libisc.lib;libdns.lib;libisccfg.lib;libisccc.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(ProjectName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\;@LIBXML2_INC@..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default $(Configuration);..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);%(AdditionalLibraryDirectories) confgentool.lib;libisc.lib;libdns.lib;libisccfg.lib;libisccc.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/confgen/win32/ddnsconfgen.vcxproj.filters.in0000644000470500017500000000140212271526120024143 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/confgen/ddns-confgen.docbook0000644000470500017500000001701612271526120021137 0ustar lamontlamont]> Jan 29, 2009 ddns-confgen 8 BIND9 ddns-confgen ddns key generation tool 2009 Internet Systems Consortium, Inc. ("ISC") ddns-confgen -s name -z zone name DESCRIPTION ddns-confgen generates a key for use by nsupdate and named. It simplifies configuration of dynamic zones by generating a key and providing the nsupdate and named.conf syntax that will be needed to use it, including an example update-policy statement. If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample named.conf syntax. For example, ddns-confgen example.com would generate a key called "ddns-key.example.com", and sample named.conf command that could be used in the zone definition for "example.com". Note that named itself can configure a local DDNS key for use with nsupdate -l. ddns-confgen is only needed when a more elaborate configuration is required: for instance, if nsupdate is to be used from a remote system. OPTIONS -a algorithm Specifies the algorithm to use for the TSIG key. Available choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512. The default is hmac-sha256. -h Prints a short summary of the options and arguments to ddns-confgen. -k keyname Specifies the key name of the DDNS authentication key. The default is ddns-key when neither the nor option is specified; otherwise, the default is ddns-key as a separate label followed by the argument of the option, e.g., ddns-key.example.com. The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods. -q Quiet mode: Print only the key, with no explanatory text or usage examples. -r randomfile Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used. -s name Single host mode: The example named.conf text shows how to set an update policy for the specified name using the "name" nametype. The default key name is ddns-key.name. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the option. -z zone zone mode: The example named.conf text shows how to set an update policy for the specified zone using the "zonesub" nametype, allowing updates to all subdomain names within that zone. This option cannot be used with the option. SEE ALSO nsupdate1 , named.conf5 , named8 , BIND 9 Administrator Reference Manual. AUTHOR Internet Systems Consortium bind9-9.9.5.dfsg/bin/confgen/ddns-confgen.html0000644000470500017500000001635512271526120020470 0ustar lamontlamont ddns-confgen

    Name

    ddns-confgen — ddns key generation tool

    Synopsis

    ddns-confgen [-a algorithm] [-h] [-k keyname] [-r randomfile] [ -s name | -z zone ] [-q] [name]

    DESCRIPTION

    ddns-confgen generates a key for use by nsupdate and named. It simplifies configuration of dynamic zones by generating a key and providing the nsupdate and named.conf syntax that will be needed to use it, including an example update-policy statement.

    If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample named.conf syntax. For example, ddns-confgen example.com would generate a key called "ddns-key.example.com", and sample named.conf command that could be used in the zone definition for "example.com".

    Note that named itself can configure a local DDNS key for use with nsupdate -l. ddns-confgen is only needed when a more elaborate configuration is required: for instance, if nsupdate is to be used from a remote system.

    OPTIONS

    -a algorithm

    Specifies the algorithm to use for the TSIG key. Available choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512. The default is hmac-sha256.

    -h

    Prints a short summary of the options and arguments to ddns-confgen.

    -k keyname

    Specifies the key name of the DDNS authentication key. The default is ddns-key when neither the -s nor -z option is specified; otherwise, the default is ddns-key as a separate label followed by the argument of the option, e.g., ddns-key.example.com. The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods.

    -q

    Quiet mode: Print only the key, with no explanatory text or usage examples.

    -r randomfile

    Specifies a source of random data for generating the authorization. If the operating system does not provide a /dev/random or equivalent device, the default source of randomness is keyboard input. randomdev specifies the name of a character device or file containing random data to be used instead of the default. The special value keyboard indicates that keyboard input should be used.

    -s name

    Single host mode: The example named.conf text shows how to set an update policy for the specified name using the "name" nametype. The default key name is ddns-key.name. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the -z option.

    -z zone

    zone mode: The example named.conf text shows how to set an update policy for the specified zone using the "zonesub" nametype, allowing updates to all subdomain names within that zone. This option cannot be used with the -s option.

    SEE ALSO

    nsupdate(1), named.conf(5), named(8), BIND 9 Administrator Reference Manual.

    AUTHOR

    Internet Systems Consortium

    bind9-9.9.5.dfsg/bin/confgen/Makefile.in0000644000470500017500000000646512271526120017303 0ustar lamontlamont# Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.8 2009/12/05 23:31:40 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = -I${srcdir}/include ${ISC_INCLUDES} ${ISCCC_INCLUDES} \ ${ISCCFG_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} CDEFINES = CWARNINGS = ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCCLIBS = ../../lib/isccc/libisccc.@A@ ISCLIBS = ../../lib/isc/libisc.@A@ ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@ DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ BIND9LIBS = ../../lib/bind9/libbind9.@A@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@ ISCDEPLIBS = ../../lib/isc/libisc.@A@ DNSDEPLIBS = ../../lib/dns/libdns.@A@ BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@ RNDCLIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS} ${ISCLIBS} @LIBS@ RNDCDEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${BIND9DEPLIBS} ${DNSDEPLIBS} ${ISCDEPLIBS} LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@ CONFDEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} SRCS= rndc-confgen.c ddns-confgen.c SUBDIRS = unix TARGETS = rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ MANPAGES = rndc-confgen.8 ddns-confgen.8 HTMLPAGES = rndc-confgen.html ddns-confgen.html MANOBJS = ${MANPAGES} ${HTMLPAGES} UOBJS = unix/os.@O@ @BIND9_MAKE_RULES@ rndc-confgen.@O@: rndc-confgen.c ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \ -DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \ -c ${srcdir}/rndc-confgen.c ddns-confgen.@O@: ddns-confgen.c ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${srcdir}/ddns-confgen.c rndc-confgen@EXEEXT@: rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS} export BASEOBJS="rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \ ${FINALBUILDCMD} ddns-confgen@EXEEXT@: ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS} export BASEOBJS="ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \ ${FINALBUILDCMD} doc man:: ${MANOBJS} docclean manclean maintainer-clean:: rm -f ${MANOBJS} installdirs: $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 install:: rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ installdirs ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir} ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} ddns-confgen@EXEEXT@ ${DESTDIR}${sbindir} ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8 ${INSTALL_DATA} ${srcdir}/ddns-confgen.8 ${DESTDIR}${mandir}/man8 clean distclean maintainer-clean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/confgen/rndc-confgen.c0000644000470500017500000001615612271526120017743 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007-2009, 2011, 2013, 2014 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: rndc-confgen.c,v 1.7 2011/03/12 04:59:46 tbox Exp $ */ /*! \file */ /** * rndc-confgen generates configuration files for rndc. It can be used * as a convenient alternative to writing the rndc.conf file and the * corresponding controls and key statements in named.conf by hand. * Alternatively, it can be run with the -a option to set up a * rndc.key file and avoid the need for a rndc.conf file and a * controls statement altogether. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "util.h" #include "keygen.h" #define DEFAULT_KEYLENGTH 128 /*% Bits. */ #define DEFAULT_KEYNAME "rndc-key" #define DEFAULT_SERVER "127.0.0.1" #define DEFAULT_PORT 953 static char program[256]; const char *progname; isc_boolean_t verbose = ISC_FALSE; const char *keyfile, *keydef; ISC_PLATFORM_NORETURN_PRE static void usage(int status) ISC_PLATFORM_NORETURN_POST; static void usage(int status) { fprintf(stderr, "\ Usage:\n\ %s [-a] [-b bits] [-c keyfile] [-k keyname] [-p port] [-r randomfile] \ [-s addr] [-t chrootdir] [-u user]\n\ -a: generate just the key clause and write it to keyfile (%s)\n\ -b bits: from 1 through 512, default %d; total length of the secret\n\ -c keyfile: specify an alternate key file (requires -a)\n\ -k keyname: the name as it will be used in named.conf and rndc.conf\n\ -p port: the port named will listen on and rndc will connect to\n\ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\ -s addr: the address to which rndc should connect\n\ -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\ -u user: set the keyfile owner to \"user\" (requires -a)\n", progname, keydef, DEFAULT_KEYLENGTH); exit (status); } int main(int argc, char **argv) { isc_boolean_t show_final_mem = ISC_FALSE; isc_buffer_t key_txtbuffer; char key_txtsecret[256]; isc_mem_t *mctx = NULL; isc_result_t result = ISC_R_SUCCESS; const char *keyname = NULL; const char *randomfile = NULL; const char *serveraddr = NULL; dns_secalg_t alg = DST_ALG_HMACMD5; const char *algname = alg_totext(alg); char *p; int ch; int port; int keysize; struct in_addr addr4_dummy; struct in6_addr addr6_dummy; char *chrootdir = NULL; char *user = NULL; isc_boolean_t keyonly = ISC_FALSE; int len; keydef = keyfile = RNDC_KEYFILE; result = isc_file_progname(*argv, program, sizeof(program)); if (result != ISC_R_SUCCESS) memmove(program, "rndc-confgen", 13); progname = program; keyname = DEFAULT_KEYNAME; keysize = DEFAULT_KEYLENGTH; serveraddr = DEFAULT_SERVER; port = DEFAULT_PORT; isc_commandline_errprint = ISC_FALSE; while ((ch = isc_commandline_parse(argc, argv, "ab:c:hk:Mmp:r:s:t:u:Vy")) != -1) { switch (ch) { case 'a': keyonly = ISC_TRUE; break; case 'b': keysize = strtol(isc_commandline_argument, &p, 10); if (*p != '\0' || keysize < 0) fatal("-b requires a non-negative number"); break; case 'c': keyfile = isc_commandline_argument; break; case 'h': usage(0); case 'k': case 'y': /* Compatible with rndc -y. */ keyname = isc_commandline_argument; break; case 'M': isc_mem_debugging = ISC_MEM_DEBUGTRACE; break; case 'm': show_final_mem = ISC_TRUE; break; case 'p': port = strtol(isc_commandline_argument, &p, 10); if (*p != '\0' || port < 0 || port > 65535) fatal("port '%s' out of range", isc_commandline_argument); break; case 'r': randomfile = isc_commandline_argument; break; case 's': serveraddr = isc_commandline_argument; if (inet_pton(AF_INET, serveraddr, &addr4_dummy) != 1 && inet_pton(AF_INET6, serveraddr, &addr6_dummy) != 1) fatal("-s should be an IPv4 or IPv6 address"); break; case 't': chrootdir = isc_commandline_argument; break; case 'u': user = isc_commandline_argument; break; case 'V': verbose = ISC_TRUE; break; case '?': if (isc_commandline_option != '?') { fprintf(stderr, "%s: invalid argument -%c\n", program, isc_commandline_option); usage(1); } else usage(0); break; default: fprintf(stderr, "%s: unhandled option -%c\n", program, isc_commandline_option); exit(1); } } argc -= isc_commandline_index; argv += isc_commandline_index; POST(argv); if (argc > 0) usage(1); DO("create memory context", isc_mem_create(0, 0, &mctx)); isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret)); generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer); if (keyonly) { write_key_file(keyfile, chrootdir == NULL ? user : NULL, keyname, &key_txtbuffer, alg); if (chrootdir != NULL) { char *buf; len = strlen(chrootdir) + strlen(keyfile) + 2; buf = isc_mem_get(mctx, len); if (buf == NULL) fatal("isc_mem_get(%d) failed\n", len); snprintf(buf, len, "%s%s%s", chrootdir, (*keyfile != '/') ? "/" : "", keyfile); write_key_file(buf, user, keyname, &key_txtbuffer, alg); isc_mem_put(mctx, buf, len); } } else { printf("\ # Start of rndc.conf\n\ key \"%s\" {\n\ algorithm %s;\n\ secret \"%.*s\";\n\ };\n\ \n\ options {\n\ default-key \"%s\";\n\ default-server %s;\n\ default-port %d;\n\ };\n\ # End of rndc.conf\n\ \n\ # Use with the following in named.conf, adjusting the allow list as needed:\n\ # key \"%s\" {\n\ # algorithm %s;\n\ # secret \"%.*s\";\n\ # };\n\ # \n\ # controls {\n\ # inet %s port %d\n\ # allow { %s; } keys { \"%s\"; };\n\ # };\n\ # End of named.conf\n", keyname, algname, (int)isc_buffer_usedlength(&key_txtbuffer), (char *)isc_buffer_base(&key_txtbuffer), keyname, serveraddr, port, keyname, algname, (int)isc_buffer_usedlength(&key_txtbuffer), (char *)isc_buffer_base(&key_txtbuffer), serveraddr, port, serveraddr, keyname); } if (show_final_mem) isc_mem_stats(mctx, stderr); isc_mem_destroy(&mctx); return (0); } bind9-9.9.5.dfsg/bin/confgen/ddns-confgen.80000644000470500017500000001065212271526120017665 0ustar lamontlamont.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: ddns\-confgen .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: Jan 29, 2009 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "DDNS\-CONFGEN" "8" "Jan 29, 2009" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" ddns\-confgen \- ddns key generation tool .SH "SYNOPSIS" .HP 13 \fBddns\-confgen\fR [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkeyname\fR\fR] [\fB\-r\ \fR\fB\fIrandomfile\fR\fR] [\-s\ \fIname\fR | \-z\ \fIzone\fR] [\fB\-q\fR] [name] .SH "DESCRIPTION" .PP \fBddns\-confgen\fR generates a key for use by \fBnsupdate\fR and \fBnamed\fR. It simplifies configuration of dynamic zones by generating a key and providing the \fBnsupdate\fR and \fBnamed.conf\fR syntax that will be needed to use it, including an example \fBupdate\-policy\fR statement. .PP If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample \fBnamed.conf\fR syntax. For example, \fBddns\-confgen example.com\fR would generate a key called "ddns\-key.example.com", and sample \fBnamed.conf\fR command that could be used in the zone definition for "example.com". .PP Note that \fBnamed\fR itself can configure a local DDNS key for use with \fBnsupdate \-l\fR. \fBddns\-confgen\fR is only needed when a more elaborate configuration is required: for instance, if \fBnsupdate\fR is to be used from a remote system. .SH "OPTIONS" .PP \-a \fIalgorithm\fR .RS 4 Specifies the algorithm to use for the TSIG key. Available choices are: hmac\-md5, hmac\-sha1, hmac\-sha224, hmac\-sha256, hmac\-sha384 and hmac\-sha512. The default is hmac\-sha256. .RE .PP \-h .RS 4 Prints a short summary of the options and arguments to \fBddns\-confgen\fR. .RE .PP \-k \fIkeyname\fR .RS 4 Specifies the key name of the DDNS authentication key. The default is \fBddns\-key\fR when neither the \fB\-s\fR nor \fB\-z\fR option is specified; otherwise, the default is \fBddns\-key\fR as a separate label followed by the argument of the option, e.g., \fBddns\-key.example.com.\fR The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods. .RE .PP \-q .RS 4 Quiet mode: Print only the key, with no explanatory text or usage examples. .RE .PP \-r \fIrandomfile\fR .RS 4 Specifies a source of random data for generating the authorization. If the operating system does not provide a \fI/dev/random\fR or equivalent device, the default source of randomness is keyboard input. \fIrandomdev\fR specifies the name of a character device or file containing random data to be used instead of the default. The special value \fIkeyboard\fR indicates that keyboard input should be used. .RE .PP \-s \fIname\fR .RS 4 Single host mode: The example \fBnamed.conf\fR text shows how to set an update policy for the specified \fIname\fR using the "name" nametype. The default key name is ddns\-key.\fIname\fR. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the \fB\-z\fR option. .RE .PP \-z \fIzone\fR .RS 4 zone mode: The example \fBnamed.conf\fR text shows how to set an update policy for the specified \fIzone\fR using the "zonesub" nametype, allowing updates to all subdomain names within that \fIzone\fR. This option cannot be used with the \fB\-s\fR option. .RE .SH "SEE ALSO" .PP \fBnsupdate\fR(1), \fBnamed.conf\fR(5), \fBnamed\fR(8), BIND 9 Administrator Reference Manual. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC") .br bind9-9.9.5.dfsg/bin/confgen/util.h0000644000470500017500000000266712271526120016364 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: util.h,v 1.4 2009/09/29 15:06:05 fdupont Exp $ */ #ifndef RNDC_UTIL_H #define RNDC_UTIL_H 1 /*! \file */ #include #include #include #define NS_CONTROL_PORT 953 #undef DO #define DO(name, function) \ do { \ result = function; \ if (result != ISC_R_SUCCESS) \ fatal("%s: %s", name, isc_result_totext(result)); \ else \ notify("%s", name); \ } while (0) ISC_LANG_BEGINDECLS void notify(const char *fmt, ...) ISC_FORMAT_PRINTF(1, 2); ISC_PLATFORM_NORETURN_PRE void fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST; ISC_LANG_ENDDECLS #endif /* RNDC_UTIL_H */ bind9-9.9.5.dfsg/bin/confgen/keygen.c0000644000470500017500000001324012271526120016651 0ustar lamontlamont/* * Copyright (C) 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: keygen.c,v 1.4 2009/11/12 14:02:38 marka Exp $ */ /*! \file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "util.h" #include "keygen.h" /*% * Convert algorithm type to string. */ const char * alg_totext(dns_secalg_t alg) { switch (alg) { case DST_ALG_HMACMD5: return "hmac-md5"; case DST_ALG_HMACSHA1: return "hmac-sha1"; case DST_ALG_HMACSHA224: return "hmac-sha224"; case DST_ALG_HMACSHA256: return "hmac-sha256"; case DST_ALG_HMACSHA384: return "hmac-sha384"; case DST_ALG_HMACSHA512: return "hmac-sha512"; default: return "(unknown)"; } } /*% * Convert string to algorithm type. */ dns_secalg_t alg_fromtext(const char *name) { if (strcmp(name, "hmac-md5") == 0) return DST_ALG_HMACMD5; if (strcmp(name, "hmac-sha1") == 0) return DST_ALG_HMACSHA1; if (strcmp(name, "hmac-sha224") == 0) return DST_ALG_HMACSHA224; if (strcmp(name, "hmac-sha256") == 0) return DST_ALG_HMACSHA256; if (strcmp(name, "hmac-sha384") == 0) return DST_ALG_HMACSHA384; if (strcmp(name, "hmac-sha512") == 0) return DST_ALG_HMACSHA512; return DST_ALG_UNKNOWN; } /*% * Return default keysize for a given algorithm type. */ int alg_bits(dns_secalg_t alg) { switch (alg) { case DST_ALG_HMACMD5: return 128; case DST_ALG_HMACSHA1: return 160; case DST_ALG_HMACSHA224: return 224; case DST_ALG_HMACSHA256: return 256; case DST_ALG_HMACSHA384: return 384; case DST_ALG_HMACSHA512: return 512; default: return 0; } } /*% * Generate a key of size 'keysize' using entropy source 'randomfile', * and place it in 'key_txtbuffer' */ void generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg, int keysize, isc_buffer_t *key_txtbuffer) { isc_result_t result = ISC_R_SUCCESS; isc_entropysource_t *entropy_source = NULL; int open_keyboard = ISC_ENTROPY_KEYBOARDMAYBE; int entropy_flags = 0; isc_entropy_t *ectx = NULL; isc_buffer_t key_rawbuffer; isc_region_t key_rawregion; char key_rawsecret[64]; dst_key_t *key = NULL; switch (alg) { case DST_ALG_HMACMD5: case DST_ALG_HMACSHA1: case DST_ALG_HMACSHA224: case DST_ALG_HMACSHA256: if (keysize < 1 || keysize > 512) fatal("keysize %d out of range (must be 1-512)\n", keysize); break; case DST_ALG_HMACSHA384: case DST_ALG_HMACSHA512: if (keysize < 1 || keysize > 1024) fatal("keysize %d out of range (must be 1-1024)\n", keysize); break; default: fatal("unsupported algorithm %d\n", alg); } DO("create entropy context", isc_entropy_create(mctx, &ectx)); if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) { randomfile = NULL; open_keyboard = ISC_ENTROPY_KEYBOARDYES; } DO("start entropy source", isc_entropy_usebestsource(ectx, &entropy_source, randomfile, open_keyboard)); entropy_flags = ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY; DO("initialize dst library", dst_lib_init(mctx, ectx, entropy_flags)); DO("generate key", dst_key_generate(dns_rootname, alg, keysize, 0, 0, DNS_KEYPROTO_ANY, dns_rdataclass_in, mctx, &key)); isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret)); DO("dump key to buffer", dst_key_tobuffer(key, &key_rawbuffer)); isc_buffer_usedregion(&key_rawbuffer, &key_rawregion); DO("bsse64 encode secret", isc_base64_totext(&key_rawregion, -1, "", key_txtbuffer)); /* * Shut down the entropy source now so the "stop typing" message * does not muck with the output. */ if (entropy_source != NULL) isc_entropy_destroysource(&entropy_source); if (key != NULL) dst_key_free(&key); isc_entropy_detach(&ectx); dst_lib_destroy(); } /*% * Write a key file to 'keyfile'. If 'user' is non-NULL, * make that user the owner of the file. The key will have * the name 'keyname' and the secret in the buffer 'secret'. */ void write_key_file(const char *keyfile, const char *user, const char *keyname, isc_buffer_t *secret, dns_secalg_t alg) { isc_result_t result; const char *algname = alg_totext(alg); FILE *fd = NULL; DO("create keyfile", isc_file_safecreate(keyfile, &fd)); if (user != NULL) { if (set_user(fd, user) == -1) fatal("unable to set file owner\n"); } fprintf(fd, "key \"%s\" {\n\talgorithm %s;\n" "\tsecret \"%.*s\";\n};\n", keyname, algname, (int)isc_buffer_usedlength(secret), (char *)isc_buffer_base(secret)); fflush(fd); if (ferror(fd)) fatal("write to %s failed\n", keyfile); if (fclose(fd)) fatal("fclose(%s) failed\n", keyfile); fprintf(stderr, "wrote key file \"%s\"\n", keyfile); } bind9-9.9.5.dfsg/bin/confgen/rndc-confgen.80000644000470500017500000001223512271526120017662 0ustar lamontlamont.\" Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") .\" Copyright (C) 2001, 2003 Internet Software Consortium. .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH .\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY .\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, .\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM .\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" .\" $Id$ .\" .hy 0 .ad l .\" Title: rndc\-confgen .\" Author: .\" Generator: DocBook XSL Stylesheets v1.71.1 .\" Date: Aug 27, 2001 .\" Manual: BIND9 .\" Source: BIND9 .\" .TH "RNDC\-CONFGEN" "8" "Aug 27, 2001" "BIND9" "BIND9" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" rndc\-confgen \- rndc key generation tool .SH "SYNOPSIS" .HP 13 \fBrndc\-confgen\fR [\fB\-a\fR] [\fB\-b\ \fR\fB\fIkeysize\fR\fR] [\fB\-c\ \fR\fB\fIkeyfile\fR\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkeyname\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-r\ \fR\fB\fIrandomfile\fR\fR] [\fB\-s\ \fR\fB\fIaddress\fR\fR] [\fB\-t\ \fR\fB\fIchrootdir\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] .SH "DESCRIPTION" .PP \fBrndc\-confgen\fR generates configuration files for \fBrndc\fR. It can be used as a convenient alternative to writing the \fIrndc.conf\fR file and the corresponding \fBcontrols\fR and \fBkey\fR statements in \fInamed.conf\fR by hand. Alternatively, it can be run with the \fB\-a\fR option to set up a \fIrndc.key\fR file and avoid the need for a \fIrndc.conf\fR file and a \fBcontrols\fR statement altogether. .SH "OPTIONS" .PP \-a .RS 4 Do automatic \fBrndc\fR configuration. This creates a file \fIrndc.key\fR in \fI/etc\fR (or whatever \fIsysconfdir\fR was specified as when BIND was built) that is read by both \fBrndc\fR and \fBnamed\fR on startup. The \fIrndc.key\fR file defines a default command channel and authentication key allowing \fBrndc\fR to communicate with \fBnamed\fR on the local host with no further configuration. .sp Running \fBrndc\-confgen \-a\fR allows BIND 9 and \fBrndc\fR to be used as drop\-in replacements for BIND 8 and \fBndc\fR, with no changes to the existing BIND 8 \fInamed.conf\fR file. .sp If a more elaborate configuration than that generated by \fBrndc\-confgen \-a\fR is required, for example if rndc is to be used remotely, you should run \fBrndc\-confgen\fR without the \fB\-a\fR option and set up a \fIrndc.conf\fR and \fInamed.conf\fR as directed. .RE .PP \-b \fIkeysize\fR .RS 4 Specifies the size of the authentication key in bits. Must be between 1 and 512 bits; the default is 128. .RE .PP \-c \fIkeyfile\fR .RS 4 Used with the \fB\-a\fR option to specify an alternate location for \fIrndc.key\fR. .RE .PP \-h .RS 4 Prints a short summary of the options and arguments to \fBrndc\-confgen\fR. .RE .PP \-k \fIkeyname\fR .RS 4 Specifies the key name of the rndc authentication key. This must be a valid domain name. The default is \fBrndc\-key\fR. .RE .PP \-p \fIport\fR .RS 4 Specifies the command channel port where \fBnamed\fR listens for connections from \fBrndc\fR. The default is 953. .RE .PP \-r \fIrandomfile\fR .RS 4 Specifies a source of random data for generating the authorization. If the operating system does not provide a \fI/dev/random\fR or equivalent device, the default source of randomness is keyboard input. \fIrandomdev\fR specifies the name of a character device or file containing random data to be used instead of the default. The special value \fIkeyboard\fR indicates that keyboard input should be used. .RE .PP \-s \fIaddress\fR .RS 4 Specifies the IP address where \fBnamed\fR listens for command channel connections from \fBrndc\fR. The default is the loopback address 127.0.0.1. .RE .PP \-t \fIchrootdir\fR .RS 4 Used with the \fB\-a\fR option to specify a directory where \fBnamed\fR will run chrooted. An additional copy of the \fIrndc.key\fR will be written relative to this directory so that it will be found by the chrooted \fBnamed\fR. .RE .PP \-u \fIuser\fR .RS 4 Used with the \fB\-a\fR option to set the owner of the \fIrndc.key\fR file generated. If \fB\-t\fR is also specified only the file in the chroot area has its owner changed. .RE .SH "EXAMPLES" .PP To allow \fBrndc\fR to be used with no manual configuration, run .PP \fBrndc\-confgen \-a\fR .PP To print a sample \fIrndc.conf\fR file and corresponding \fBcontrols\fR and \fBkey\fR statements to be manually inserted into \fInamed.conf\fR, run .PP \fBrndc\-confgen\fR .SH "SEE ALSO" .PP \fBrndc\fR(8), \fBrndc.conf\fR(5), \fBnamed\fR(8), BIND 9 Administrator Reference Manual. .SH "AUTHOR" .PP Internet Systems Consortium .SH "COPYRIGHT" Copyright \(co 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") .br Copyright \(co 2001, 2003 Internet Software Consortium. .br bind9-9.9.5.dfsg/bin/tests/0002755000470500017500000000000012276444014014756 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/rbt_test.out0000644000470500017500000002267312271526120017337 0ustar lamontlamontadding name a.vix.com adding name b.vix.com adding name c.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (RED from b) NULL NULL c (RED from b) NULL NULL -- END down from vix.com. NULL NULL adding name a.b.c.d.e.f.vix.com adding name b.b.c.d.e.f.vix.com adding name c.b.c.d.e.f.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) NULL NULL c (black from b) NULL b.c.d.e.f (RED from c) ++ BEG down from b.c.d.e.f b (black) a (RED from b) NULL NULL c (RED from b) NULL NULL -- END down from b.c.d.e.f NULL NULL -- END down from vix.com. NULL NULL adding name a.d.e.f.vix.com adding name q.d.e.f.vix.com adding name d.e.f.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) NULL NULL c (black from b) NULL d.e.f (RED from c) ++ BEG down from d.e.f b.c (black) ++ BEG down from b.c b (black) a (RED from b) NULL NULL c (RED from b) NULL NULL -- END down from b.c a (RED from b.c) NULL NULL q (RED from b.c) NULL NULL -- END down from d.e.f NULL NULL -- END down from vix.com. NULL NULL adding name g.h.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) NULL NULL d.e.f (black from b) ++ BEG down from d.e.f b.c (black) ++ BEG down from b.c b (black) a (RED from b) NULL NULL c (RED from b) NULL NULL -- END down from b.c a (RED from b.c) NULL NULL q (RED from b.c) NULL NULL -- END down from d.e.f c (RED from d.e.f) NULL NULL g.h (RED from d.e.f) NULL NULL -- END down from vix.com. NULL NULL searching for name q.d.e.f.vix.com ... found exact: q.d.e.f.vix.com. searching for name just-parent.a.vix.com ... found parent: a.vix.com. (foundname: a.vix.com.) searching for name no-real-parent.vix.com ... NOT FOUND! searching for name does.not.exist.at.all ... NOT FOUND! iterating forward new origin: . vix.com new origin: vix.com. a b c d.e.f new origin: d.e.f.vix.com. a b.c new origin: b.c.d.e.f.vix.com. a b c new origin: d.e.f.vix.com. q new origin: vix.com. g.h iterating backward new origin: vix.com. g.h new origin: d.e.f.vix.com. q new origin: b.c.d.e.f.vix.com. c b a new origin: d.e.f.vix.com. b.c a new origin: vix.com. d.e.f c b a new origin: . vix.com checking chain information for vix.com. found exact. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: vix.com. (foundname = vix.com, origin = .) level_matches = 0, level_count = 0 checking chain information for zzz.com. name not found. no data at node. name from dns_rbtnodechain_current: g.h.vix.com. (foundname = g.h, origin = vix.com.) level_matches = 0, level_count = 1 checking chain information for 0.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: vix.com. (foundname = vix.com, origin = .) level_matches = 0, level_count = 0 checking chain information for d.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: c.vix.com. (foundname = c, origin = vix.com.) level_matches = 0, level_count = 1 checking chain information for f.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: c.vix.com. (foundname = c, origin = vix.com.) level_matches = 0, level_count = 1 checking chain information for a.e.f.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: c.vix.com. (foundname = c, origin = vix.com.) level_matches = 0, level_count = 1 checking chain information for z.e.f.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: q.d.e.f.vix.com. (foundname = q, origin = d.e.f.vix.com.) level_matches = 0, level_count = 2 checking chain information for g.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: q.d.e.f.vix.com. (foundname = q, origin = d.e.f.vix.com.) level_matches = 0, level_count = 2 checking chain information for i.vix.com. found parent. no data at node. name from dns_rbt_findnode: vix.com. name from dns_rbtnodechain_current: g.h.vix.com. (foundname = g.h, origin = vix.com.) level_matches = 0, level_count = 1 checking chain information for b.c.vix.com. found parent. data at node: c.vix.com. name from dns_rbt_findnode: c.vix.com. name from dns_rbtnodechain_current: c.vix.com. (foundname = c, origin = vix.com.) level_matches = 1, level_count = 1 nuking name d.e.f.vix.com and its descendants vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) NULL NULL g.h (black from b) c (RED from g.h) NULL NULL NULL -- END down from vix.com. NULL NULL adding name x.a.vix.com adding name y.x.a.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) ++ BEG down from a x (black) ++ BEG down from x y (black) NULL NULL -- END down from x NULL NULL -- END down from a NULL NULL g.h (black from b) c (RED from g.h) NULL NULL NULL -- END down from vix.com. NULL NULL deleting name a.vix.com deleting name x.a.vix.com vix.com. (black) ++ BEG down from vix.com. b (black) a (black from b) ++ BEG down from a x (black) ++ BEG down from x y (black) NULL NULL -- END down from x NULL NULL -- END down from a NULL NULL g.h (black from b) c (RED from g.h) NULL NULL NULL -- END down from vix.com. NULL NULL deleting name b.vix.com deleting name c.vix.com vix.com. (black) ++ BEG down from vix.com. g.h (black) a (RED from g.h) ++ BEG down from a x (black) ++ BEG down from x y (black) NULL NULL -- END down from x NULL NULL -- END down from a NULL NULL NULL -- END down from vix.com. NULL NULL deleting name y.x.a.vix.com vix.com. (black) ++ BEG down from vix.com. g.h (black) a (RED from g.h) ++ BEG down from a x (black) NULL NULL -- END down from a NULL NULL NULL -- END down from vix.com. NULL NULL deleting name g.h.vix.com. adding name \[b100000].vix.com. adding name \[b010000].vix.com. adding name \[b001000].vix.com. adding name \[b000100].vix.com. adding name \[b000010].vix.com. adding name \[b000001].vix.com. vix.com. (black) ++ BEG down from vix.com. \[x80/6] (black) \[x0/1] (RED from \[x80/6]) ++ BEG down from \[x0/1] \[x80/5] (black) \[x0/1] (RED from \[x80/5]) ++ BEG down from \[x0/1] \[x8/4] (black) \[x0/1] (RED from \[x8/4]) ++ BEG down from \[x0/1] \[x8/3] (black) \[x0/1] (RED from \[x8/3]) ++ BEG down from \[x0/1] \[x8/2] (black) \[x4/2] (RED from \[x8/2]) NULL NULL NULL -- END down from \[x0/1] NULL NULL NULL -- END down from \[x0/1] NULL NULL NULL -- END down from \[x0/1] NULL NULL NULL -- END down from \[x0/1] NULL NULL a (RED from \[x80/6]) ++ BEG down from a x (black) NULL NULL -- END down from a NULL NULL -- END down from vix.com. NULL NULL searching for name \[b000100].vix.com. ... found exact: \[x10/6].vix.com. adding name vix.com. nuking name vix.com. and its descendants adding name a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. adding name b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. (black) ++ BEG down from b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. a (black) NULL NULL -- END down from b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w. NULL NULL adding name . nuking name . and its descendants adding name \[xFFFF/16].\[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/256].com adding name \[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/128].com \[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/128].com. (black) ++ BEG down from \[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/128].com. \[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/144] (black) NULL NULL -- END down from \[xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/128].com. NULL NULL bind9-9.9.5.dfsg/bin/tests/master/0002755000470500017500000000000012276444015016252 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/master/master6.data0000644000470500017500000000210312271526120020451 0ustar lamontlamont $TTL 1000 @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum secure1 3600 IN DNSKEY ( FLAG2|FLAG4|FLAG5|NTYP3|FLAG8|FLAG9|FLAG10|FLAG11|SIG15 3 3 ArT0a8FtOZWEONG2YQVl9+RA34op30JPz4NPEroCxm2yImT2 2OYggnPIzrgayyepgKU1PfTTypnJDTwrSrtISyEsj7tjM7/n 03DP8VWSn0aLwpUuc7Sx9vtM1Wi+YeiA4Bv2Oz1VB9de4qql sIq+KLn8J4wz95bGnJ0mHUB7oTDJ3Hl1zeaCMdX69Kr46yAY AvGJJdGGDYxYgxzx2zNdzypkYSkxpdsNqUt38tabSfdvCn12 pnmSWjlVJsjHhsaYnrPhouN5acOXMNbxNVbGU5LZ8Es6EYbV /7YMt8VUkA8/8UCszBBT7XAJ3OFjiMO8mvxrZZFzvwJlPBQ1 oFq/TNZlSe+N ) secure2 3600 in DNSKEY ( flag2|flag4|flag5|ntyp3|flag8|flag9|flag10|flag11|sig15 3 3 ArT0a8FtOZWEONG2YQVl9+RA34op30JPz4NPEroCxm2yImT2 2OYggnPIzrgayyepgKU1PfTTypnJDTwrSrtISyEsj7tjM7/n 03DP8VWSn0aLwpUuc7Sx9vtM1Wi+YeiA4Bv2Oz1VB9de4qql sIq+KLn8J4wz95bGnJ0mHUB7oTDJ3Hl1zeaCMdX69Kr46yAY AvGJJdGGDYxYgxzx2zNdzypkYSkxpdsNqUt38tabSfdvCn12 pnmSWjlVJsjHhsaYnrPhouN5acOXMNbxNVbGU5LZ8Es6EYbV /7YMt8VUkA8/8UCszBBT7XAJ3OFjiMO8mvxrZZFzvwJlPBQ1 oFq/TNZlSe+N ) bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_11_data0000644000470500017500000000050112271526120022610 0ustar lamontlamont# # test data for dns_master_load test 11 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master11.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/master/master8.data0000644000470500017500000000010312271526120020451 0ustar lamontlamont; ; master7.data contains a good zone file ; $include master7.data bind9-9.9.5.dfsg/bin/tests/master/master4.data0000644000470500017500000000034512271526120020455 0ustar lamontlamont @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum a in ns ns.vix.com. a in ns ns2vix.com. a in ns ns3vix.com. b in a 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/master/master11.data0000644000470500017500000000031112271526120020524 0ustar lamontlamont; ; The following serial number contains a leading 0 and a 9 so the ; we can catch cases where it is incorrectly treated as a octal ; number. ; @ 300 IN SOA ns hostmaster 00090000 1200 3600 604800 300 bind9-9.9.5.dfsg/bin/tests/master/master9.data0000644000470500017500000000006012271526120020454 0ustar lamontlamont; ; master5.data is bad ; $include master5.data bind9-9.9.5.dfsg/bin/tests/master/win32/0002755000470500017500000000000012271527124017212 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/master/win32/t_master.vcxproj.filters.in0000644000470500017500000000167612271526120024524 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tests/master/win32/t_master.dsw0000644000470500017500000000103512271526120021537 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "t_master"=".\t_master.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tests/master/win32/t_master.mak.in0000644000470500017500000002650212271526120022125 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on t_master.dsp !IF "$(CFG)" == "" CFG=t_master - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to t_master - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "t_master - @PLATFORM@ Release" && "$(CFG)" != "t_master - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_master.mak" CFG="t_master - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_master - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_master - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe LIBXML=@LIBXML2_LIB@ !IF "$(CFG)" == "t_master - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "t_master - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Release\t_master.exe" !ELSE ALL : "libtests - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" "..\..\..\..\Build\Release\t_master.exe" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ ReleaseCLEAN" "libisc - @PLATFORM@ ReleaseCLEAN" "libtests - @PLATFORM@ ReleaseCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_master.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\..\Build\Release\t_master.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\t_master.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_master.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\t_master.pdb" @MACHINE@ /out:"../../../../Build/Release/t_master.exe" LINK32_OBJS= \ "$(INTDIR)\t_master.obj" \ "..\..\..\..\lib\dns\win32\Release\libdns.lib" \ "..\..\..\..\lib\isc\win32\Release\libisc.lib" \ "..\..\..\..\lib\tests\win32\Release\libtests.lib" "..\..\..\..\Build\Release\t_master.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Debug\t_master.exe" "$(OUTDIR)\t_master.bsc" !ELSE ALL : "libtests - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" "..\..\..\..\Build\Debug\t_master.exe" "$(OUTDIR)\t_master.bsc" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ DebugCLEAN" "libisc - @PLATFORM@ DebugCLEAN" "libtests - @PLATFORM@ DebugCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_master.obj" -@erase "$(INTDIR)\t_master.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\t_master.bsc" -@erase "$(OUTDIR)\t_master.map" -@erase "$(OUTDIR)\t_master.pdb" -@erase "..\..\..\..\Build\Debug\t_master.exe" -@erase "..\..\..\..\Build\Debug\t_master.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_master.bsc" BSC32_SBRS= \ "$(INTDIR)\t_master.sbr" "$(OUTDIR)\t_master.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\t_master.pdb" /map:"$(INTDIR)\t_master.map" /debug @MACHINE@ /out:"../../../../Build/Debug/t_master.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\t_master.obj" \ "..\..\..\..\lib\dns\win32\Debug\libdns.lib" \ "..\..\..\..\lib\isc\win32\Debug\libisc.lib" \ "..\..\..\..\lib\tests\win32\Debug\libtests.lib" "..\..\..\..\Build\Debug\t_master.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("t_master.dep") !INCLUDE "t_master.dep" !ELSE !MESSAGE Warning: cannot find "t_master.dep" !ENDIF !ENDIF !IF "$(CFG)" == "t_master - @PLATFORM@ Release" || "$(CFG)" == "t_master - @PLATFORM@ Debug" SOURCE=..\t_master.c !IF "$(CFG)" == "t_master - @PLATFORM@ Release" "$(INTDIR)\t_master.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" "$(INTDIR)\t_master.obj" "$(INTDIR)\t_master.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !IF "$(CFG)" == "t_master - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" cd "..\..\..\bin\tests\master\win32" "libdns - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" cd "..\..\..\bin\tests\master\win32" "libdns - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ENDIF !IF "$(CFG)" == "t_master - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" cd "..\..\..\bin\tests\master\win32" "libisc - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" cd "..\..\..\bin\tests\master\win32" "libisc - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ENDIF !IF "$(CFG)" == "t_master - @PLATFORM@ Release" "libtests - @PLATFORM@ Release" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" cd "..\..\..\bin\tests\master\win32" "libtests - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" "libtests - @PLATFORM@ Debug" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" cd "..\..\..\bin\tests\master\win32" "libtests - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\master\win32" !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tests/master/win32/t_master.dsp.in0000644000470500017500000001110312271526120022132 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="t_master" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=t_master - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "t_master.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_master.mak" CFG="t_master - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_master - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_master - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "t_master - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib /nologo /subsystem:console @MACHINE@ /out:"../../../../Build/Release/t_master.exe" !ELSEIF "$(CFG)" == "t_master - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /I "../../../../lib/bind9/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib /nologo /subsystem:console /map /debug @MACHINE@ /out:"../../../../Build/Debug/t_master.exe" /pdbtype:sept !ENDIF # Begin Target # Name "t_master - @PLATFORM@ Release" # Name "t_master - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\t_master.c # End Source File # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tests/master/win32/t_master.vcxproj.in0000644000470500017500000001504212271526120023045 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {5DC2F8D3-9373-41BB-B3AB-78F2E12F1E5E} Win32Proj t_master Application true MultiByte Application false true MultiByte true ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tests/master/win32/t_master.vcxproj.user0000644000470500017500000000021712271526120023413 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tests/master/master3.data0000644000470500017500000000035212271526120020452 0ustar lamontlamont$TTL 1000 in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum in ns ns.vix.com in ns ns2vix.com. a in ns ns3vix.com. b in a 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_8_data0000644000470500017500000000050312271526120022540 0ustar lamontlamont# # test data for dns_master_load test 8 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master8.data test in DNS_R_SEENINCLUDE bind9-9.9.5.dfsg/bin/tests/master/t_master.c0000644000470500017500000001761112271526120020231 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: t_master.c,v 1.41 2011/03/12 04:59:46 tbox Exp $ */ #include #include #include #include #include #include /* Required for HP/UX (and others?) */ #include #include #include #include #include #include #include #include #define BUFLEN 255 #define BIGBUFLEN (64 * 1024) static isc_result_t t1_add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset); isc_mem_t *T1_mctx; char *Tokens[T_MAXTOKS + 1]; static isc_result_t t1_add_callback(void *arg, dns_name_t *owner, dns_rdataset_t *dataset) { char buf[BIGBUFLEN]; isc_buffer_t target; isc_result_t result; UNUSED(arg); isc_buffer_init(&target, buf, BIGBUFLEN); result = dns_rdataset_totext(dataset, owner, ISC_FALSE, ISC_FALSE, &target); if (result != ISC_R_SUCCESS) t_info("dns_rdataset_totext: %s\n", dns_result_totext(result)); return(result); } static int test_master(char *testfile, char *origin, char *class, isc_result_t exp_result) { int result; int len; isc_result_t isc_result; isc_result_t dns_result; dns_name_t dns_origin; isc_buffer_t source; isc_buffer_t target; unsigned char name_buf[BUFLEN]; dns_rdatacallbacks_t callbacks; dns_rdataclass_t rdataclass; isc_textregion_t textregion; if (T1_mctx == NULL) isc_result = isc_mem_create(0, 0, &T1_mctx); else isc_result = ISC_R_SUCCESS; if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %d\n", isc_result); return(T_UNRESOLVED); } len = strlen(origin); isc_buffer_init(&source, origin, len); isc_buffer_add(&source, len); isc_buffer_setactive(&source, len); isc_buffer_init(&target, name_buf, BUFLEN); dns_name_init(&dns_origin, NULL); dns_result = dns_name_fromtext(&dns_origin, &source, dns_rootname, 0, &target); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); return(T_UNRESOLVED); } dns_rdatacallbacks_init_stdio(&callbacks); callbacks.add = t1_add_callback; textregion.base = class; textregion.length = strlen(class); dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdataclass_fromtext failed %s\n", dns_result_totext(dns_result)); return(T_UNRESOLVED); } dns_result = dns_master_loadfile( testfile, &dns_origin, &dns_origin, rdataclass, ISC_TRUE, &callbacks, T1_mctx); if (dns_result == exp_result) result = T_PASS; else { t_info("dns_master_loadfile: got %s, expected %s\n", dns_result_totext(dns_result), dns_result_totext(exp_result)); result = T_FAIL; } return(result); } static int test_master_x(const char *filename) { FILE *fp; char *p; int line; int cnt; int result; result = T_UNRESOLVED; fp = fopen(filename, "r"); if (fp != NULL) { line = 0; while ((p = t_fgetbs(fp)) != NULL) { ++line; /* * Skip comment lines. */ if ((isspace(*p & 0xff)) || (*p == '#')) { (void)free(p); continue; } /* * Name of data file, origin, zclass, expected result. */ cnt = t_bustline(p, Tokens); if (cnt == 4) { result = test_master(Tokens[0], Tokens[1], Tokens[2], t_dns_result_fromtext(Tokens[3])); } else { t_info("bad format in %s at line %d\n", filename, line); } (void)free(p); } (void)fclose(fp); } else { t_info("Missing datafile %s\n", filename); } return(result); } static const char *a1 = "dns_master_loadfile loads a valid master file and " "returns ISC_R_SUCCESS"; static void t1(void) { int result; t_assert("dns_master_loadfile", 1, T_REQUIRED, "%s", a1); result = test_master_x("dns_master_load_1_data"); t_result(result); } static const char *a2 = "dns_master_loadfile returns ISC_R_UNEXPECTEDEND when the " "masterfile input ends unexpectedly"; static void t2(void) { int result; t_assert("dns_master_loadfile", 2, T_REQUIRED, "%s", a2); result = test_master_x("dns_master_load_2_data"); t_result(result); } static const char *a3 = "dns_master_loadfile returns DNS_R_NOOWNER when the " "an ownername is not specified"; static void t3() { int result; t_assert("dns_master_loadfile", 3, T_REQUIRED, "%s", a3); result = test_master_x("dns_master_load_3_data"); t_result(result); } static const char *a4 = "dns_master_loadfile accepts broken zone files " "where the first record has an undefined TTL, " "as long as it is a SOA"; static void t4() { int result; t_assert("dns_master_loadfile", 4, T_REQUIRED, "%s", a4); result = test_master_x("dns_master_load_4_data"); t_result(result); } static const char *a5 = "dns_master_loadfile returns DNS_R_BADCLASS when the " "the record class did not match the zone class"; static void t5() { int result; t_assert("dns_master_loadfile", 5, T_REQUIRED, "%s", a5); result = test_master_x("dns_master_load_5_data"); t_result(result); } static const char *a6 = "dns_master_loadfile understands DNSKEY RR specifications " "containing key material"; static void t6() { int result; t_assert("dns_master_loadfile", 6, T_REQUIRED, "%s", a6); result = test_master_x("dns_master_load_6_data"); t_result(result); } static const char *a7 = "dns_master_loadfile understands DNSKEY RR specifications " "containing no key material"; static void t7() { int result; t_assert("dns_master_loadfile", 7, T_REQUIRED, "%s", a7); result = test_master_x("dns_master_load_7_data"); t_result(result); } static const char *a8 = "dns_master_loadfile understands $INCLUDE"; static void t8() { int result; t_assert("dns_master_loadfile", 8, T_REQUIRED, "%s", a8); result = test_master_x("dns_master_load_8_data"); t_result(result); } static const char *a9 = "dns_master_loadfile understands $INCLUDE with failure"; static void t9() { int result; t_assert("dns_master_loadfile", 9, T_REQUIRED, "%s", a9); result = test_master_x("dns_master_load_9_data"); t_result(result); } static const char *a10 = "dns_master_loadfile non-empty blank lines"; static void t10() { int result; t_assert("dns_master_loadfile", 10, T_REQUIRED, "%s", a10); result = test_master_x("dns_master_load_10_data"); t_result(result); } static const char *a11 = "dns_master_loadfile allow leading zeros in SOA"; static void t11() { int result; t_assert("dns_master_loadfile", 11, T_REQUIRED, "%s", a11); result = test_master_x("dns_master_load_11_data"); t_result(result); } testspec_t T_testlist[] = { { (PFV) t1, "ISC_R_SUCCESS" }, { (PFV) t2, "ISC_R_UNEXPECTEDEND" }, { (PFV) t3, "DNS_NOOWNER" }, { (PFV) t4, "DNS_NOTTL" }, { (PFV) t5, "DNS_BADCLASS" }, { (PFV) t6, "DNSKEY RR 1" }, { (PFV) t7, "DNSKEY RR 2" }, { (PFV) t8, "$INCLUDE" }, { (PFV) t9, "$INCLUDE w/ DNS_BADCLASS" }, { (PFV) t10, "non empty blank lines" }, { (PFV) t11, "leading zeros in serial" }, { (PFV) 0, NULL } }; #ifdef WIN32 int main(int argc, char **argv) { t_settests(T_testlist); return (t_main(argc, argv)); } #endif bind9-9.9.5.dfsg/bin/tests/master/Makefile.in0000644000470500017500000000341012271526120020304 0ustar lamontlamont# Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1999-2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.31 2009/12/05 23:31:40 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${TEST_INCLUDES} ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = # Note that we do not want to use libtool for libt_api DNSLIBS = ../../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ ISCLIBS = ../../../lib/isc/libisc.@A@ DNSDEPLIBS = ../../../lib/dns/libdns.@A@ ISCDEPLIBS = ../../../lib/isc/libisc.@A@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ TLIB = ../../../lib/tests/libt_api.@A@ TARGETS = t_master@EXEEXT@ SRCS = t_master.c @BIND9_MAKE_RULES@ t_master@EXEEXT@: t_master.@O@ ${DEPLIBS} ${TLIB} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_master.@O@ ${TLIB} ${LIBS} test: t_master@EXEEXT@ -@ ./t_master@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -a testhelp: @ ./t_master@EXEEXT@ -h clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_4_data0000644000470500017500000000047712271526120022546 0ustar lamontlamont# # test data for dns_master_load test 4 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master4.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/master/master2.data0000644000470500017500000000034212271526120020450 0ustar lamontlamont$TTL 1000 @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum a in ns a in ns ns2vix.com. a in ns ns3vix.com. b in a 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_9_data0000644000470500017500000000050012271526120022536 0ustar lamontlamont# # test data for dns_master_load test 9 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master9.data test in DNS_R_BADCLASS bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_1_data0000644000470500017500000000047712271526120022543 0ustar lamontlamont# # test data for dns_master_load test 1 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master1.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/master/master5.data0000644000470500017500000000035712271526120020461 0ustar lamontlamont$TTL 1000 @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum a any ns ns.vix.com. a in ns ns2vix.com. a in ns ns3vix.com. b in a 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_3_data0000644000470500017500000000047712271526120022545 0ustar lamontlamont# # test data for dns_master_load test 3 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master3.data test in DNS_R_NOOWNER bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_10_data0000644000470500017500000000050012271526120022606 0ustar lamontlamont# # test data for dns_master_load test 9 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master10.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_7_data0000644000470500017500000000047712271526120022551 0ustar lamontlamont# # test data for dns_master_load test 7 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master7.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_2_data0000644000470500017500000000050512271526120022534 0ustar lamontlamont# # test data for dns_master_load test 2 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master2.data test in ISC_R_UNEXPECTEDEND bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_5_data0000644000470500017500000000050012271526120022532 0ustar lamontlamont# # test data for dns_master_load test 5 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master5.data test in DNS_R_BADCLASS bind9-9.9.5.dfsg/bin/tests/master/master10.data0000644000470500017500000000011112271526120020521 0ustar lamontlamont; ; the following black line contains spaces ; @ 300 IN A 10.0.0.1 ; ; bind9-9.9.5.dfsg/bin/tests/master/master7.data0000644000470500017500000000054712271526120020464 0ustar lamontlamont $TTL 1000 @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum secure1 3600 IN DNSKEY ( NOKEY|FLAG2|FLAG4|FLAG5|NTYP3|FLAG8|FLAG9|FLAG10|FLAG11|SIG15 3 3 ) secure2 3600 in DNSKEY ( nokey|flag2|flag4|flag5|ntyp3|flag8|flag9|flag10|flag11|sig15 3 3 ) bind9-9.9.5.dfsg/bin/tests/master/master1.data0000644000470500017500000000035612271526120020454 0ustar lamontlamont$TTL 1000 @ in soa localhost. postmaster.localhost. ( 1993050801 ;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum a in ns ns.vix.com. a in ns ns2vix.com. a in ns ns3vix.com. b in a 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/master/dns_master_load_6_data0000644000470500017500000000047712271526120022550 0ustar lamontlamont# # test data for dns_master_load test 6 # # format is: # masterfile origin class expected_result # where # masterfile name is the name of a file containing master data # origin is the origin # class is the zone's class # expected_result is a text representation of a dns_result_t # master6.data test in ISC_R_SUCCESS bind9-9.9.5.dfsg/bin/tests/resolver/0002755000470500017500000000000012276444015016620 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/resolver/win32/0002755000470500017500000000000012271527124017560 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.mak.in0000644000470500017500000002674612271526120023053 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on t_resolver.dsp !IF "$(CFG)" == "" CFG=t_resolver - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to t_resolver - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "t_resolver - @PLATFORM@ Release" && "$(CFG)" != "t_resolver - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_resolver.mak" CFG="t_resolver - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_resolver - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_resolver - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe LIBXML=@LIBXML2_LIB@ !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Release\t_resolver.exe" !ELSE ALL : "libtests - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" "..\..\..\..\Build\Release\t_resolver.exe" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ ReleaseCLEAN" "libisc - @PLATFORM@ ReleaseCLEAN" "libtests - @PLATFORM@ ReleaseCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_resolver.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\..\Build\Release\t_resolver.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ @GEOIP_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\t_resolver.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_resolver.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\t_resolver.pdb" @MACHINE@ /out:"../../../../Build/Release/t_resolver.exe" LINK32_OBJS= \ "$(INTDIR)\t_resolver.obj" \ "..\..\..\..\lib\dns\win32\Release\libdns.lib" \ "..\..\..\..\lib\isc\win32\Release\libisc.lib" \ "..\..\..\..\lib\tests\win32\Release\libtests.lib" "..\..\..\..\Build\Release\t_resolver.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Debug\t_resolver.exe" "$(OUTDIR)\t_resolver.bsc" !ELSE ALL : "libtests - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" "..\..\..\..\Build\Debug\t_resolver.exe" "$(OUTDIR)\t_resolver.bsc" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ DebugCLEAN" "libisc - @PLATFORM@ DebugCLEAN" "libtests - @PLATFORM@ DebugCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_resolver.obj" -@erase "$(INTDIR)\t_resolver.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\t_resolver.bsc" -@erase "$(OUTDIR)\t_resolver.map" -@erase "$(OUTDIR)\t_resolver.pdb" -@erase "..\..\..\..\Build\Debug\t_resolver.exe" -@erase "..\..\..\..\Build\Debug\t_resolver.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ @GEOIP_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_resolver.bsc" BSC32_SBRS= \ "$(INTDIR)\t_resolver.sbr" "$(OUTDIR)\t_resolver.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\t_resolver.pdb" /map:"$(INTDIR)\t_resolver.map" /debug @MACHINE@ /out:"../../../../Build/Debug/t_resolver.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\t_resolver.obj" \ "..\..\..\..\lib\dns\win32\Debug\libdns.lib" \ "..\..\..\..\lib\isc\win32\Debug\libisc.lib" \ "..\..\..\..\lib\tests\win32\Debug\libtests.lib" "..\..\..\..\Build\Debug\t_resolver.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("t_resolver.dep") !INCLUDE "t_resolver.dep" !ELSE !MESSAGE Warning: cannot find "t_resolver.dep" !ENDIF !ENDIF !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" || "$(CFG)" == "t_resolver - @PLATFORM@ Debug" SOURCE=..\t_resolver.c !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" "$(INTDIR)\t_resolver.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" "$(INTDIR)\t_resolver.obj" "$(INTDIR)\t_resolver.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" cd "..\..\..\bin\tests\resolver\win32" "libdns - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" cd "..\..\..\bin\tests\resolver\win32" "libdns - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ENDIF !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" cd "..\..\..\bin\tests\resolver\win32" "libisc - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" cd "..\..\..\bin\tests\resolver\win32" "libisc - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ENDIF !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" "libtests - @PLATFORM@ Release" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" cd "..\..\..\bin\tests\resolver\win32" "libtests - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" "libtests - @PLATFORM@ Debug" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" cd "..\..\..\bin\tests\resolver\win32" "libtests - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\resolver\win32" !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.vcxproj.in0000644000470500017500000001507412271526120023766 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {66E58849-A764-44E4-8D32-7C1107246A26} Win32Proj t_resolver Application true MultiByte Application false true MultiByte true ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\..\;@LIBXML2_INC@@GEOIP_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\..\;@LIBXML2_INC@@GEOIP_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.dsw0000644000470500017500000000104112271526120022450 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "t_resolver"=".\t_resolver.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.dsp.in0000644000470500017500000001116712271526120023060 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="t_resolver" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=t_resolver - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "t_resolver.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_resolver.mak" CFG="t_resolver - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_resolver - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_resolver - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "t_resolver - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ @GEOIP_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib /nologo /subsystem:console @MACHINE@ /out:"../../../../Build/Release/t_resolver.exe" !ELSEIF "$(CFG)" == "t_resolver - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ @GEOIP_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /I "../../../../lib/bind9/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib /nologo /subsystem:console /map /debug @MACHINE@ /out:"../../../../Build/Debug/t_resolver.exe" /pdbtype:sept !ENDIF # Begin Target # Name "t_resolver - @PLATFORM@ Release" # Name "t_resolver - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\t_resolver.c # End Source File # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.vcxproj.user0000644000470500017500000000021712271526120024327 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tests/resolver/win32/t_resolver.vcxproj.filters.in0000644000470500017500000000170012271526120025424 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tests/resolver/Makefile.in0000644000470500017500000000332012271526120020652 0ustar lamontlamont# Copyright (C) 2011, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.3 2011/02/03 12:18:10 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${TEST_INCLUDES} ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = # Note that we do not want to use libtool for libt_api DNSLIBS = ../../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ ISCLIBS = ../../../lib/isc/libisc.@A@ DNSDEPLIBS = ../../../lib/dns/libdns.@A@ ISCDEPLIBS = ../../../lib/isc/libisc.@A@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ TLIB = ../../../lib/tests/libt_api.@A@ TARGETS = t_resolver@EXEEXT@ SRCS = t_resolver.c @BIND9_MAKE_RULES@ t_resolver@EXEEXT@: t_resolver.@O@ ${DEPLIBS} ${TLIB} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_resolver.@O@ ${TLIB} ${LIBS} test: t_resolver@EXEEXT@ -@./t_resolver@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -a testhelp: @./t_resolver@EXEEXT@ -h clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/resolver/t_resolver.c0000644000470500017500000001532312271526120021143 0ustar lamontlamont/* * Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: t_resolver.c,v 1.3 2011/02/03 12:18:11 tbox Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include char *progname; #define CHECK(x) RUNTIME_CHECK(ISC_R_SUCCESS == (x)) isc_mem_t *mctx = NULL; isc_timermgr_t *timer_manager = NULL; isc_socketmgr_t *socket_manager = NULL; isc_taskmgr_t *task_manager = NULL; dns_dispatchmgr_t *dispatch_manager = NULL; dns_view_t *view = NULL; dns_dispatch_t *dispatch_v4 = NULL; static void setup_create_dispatch_v4(void) { isc_sockaddr_t local_address; isc_sockaddr_any(&local_address); CHECK(dns_dispatch_getudp(dispatch_manager, socket_manager, task_manager, &local_address, 4096, 100, 100, 100, 500, 0, 0, /* unsigned int attributes, unsigned int mask, */ &dispatch_v4)); } static void setup(void) { /* 1 */ CHECK(isc_mem_create(0, 0, &mctx)); /* 2 */ CHECK(isc_timermgr_create(mctx, &timer_manager)); /* 3 */ CHECK(isc_taskmgr_create(mctx, 1, 0, &task_manager)); /* 4 */ CHECK(isc_socketmgr_create(mctx, &socket_manager)); /* 5 */ CHECK(dns_dispatchmgr_create(mctx, NULL, &dispatch_manager)); /* 6 */ CHECK(dns_view_create(mctx, dns_rdataclass_in, "testview", &view)); /* 7 */ setup_create_dispatch_v4(); } static void teardown(void) { /* 7 */ dns_dispatch_detach(&dispatch_v4); /* 6 */ dns_view_detach(&view); /* 5 */ dns_dispatchmgr_destroy(&dispatch_manager); /* 4 */ isc_socketmgr_destroy(&socket_manager); /* 3 */ isc_taskmgr_destroy(&task_manager); /* 2 */ isc_timermgr_destroy(&timer_manager); /* 1 */ isc_mem_destroy(&mctx); } static isc_result_t make_resolver(dns_resolver_t **resolverp) { isc_result_t result; result = dns_resolver_create(view, task_manager, 1, 1, socket_manager, timer_manager, 0, /* unsigned int options, */ dispatch_manager, dispatch_v4, NULL, /* dns_dispatch_t *dispatchv6, */ resolverp); return (result); } static void destroy_resolver(dns_resolver_t **resolverp) { dns_resolver_shutdown(*resolverp); dns_resolver_detach(resolverp); } static void test_dns_resolver_create() { dns_resolver_t *resolver = NULL; t_assert("test_dns_resolver_create", 1, T_REQUIRED, "%s", "a resolver can be created successfully"); setup(); CHECK(make_resolver(&resolver)); destroy_resolver(&resolver); teardown(); t_result(T_PASS); } static void test_dns_resolver_gettimeout(void) { dns_resolver_t *resolver = NULL; int test_result; unsigned int timeout; t_assert("test_dns_resolver_gettimeout", 1, T_REQUIRED, "%s", "The default timeout is returned from _gettimeout()"); setup(); CHECK(make_resolver(&resolver)); timeout = dns_resolver_gettimeout(resolver); t_info("The default timeout is %d second%s\n", timeout, (timeout == 1 ? "" : "s")); test_result = (timeout > 0) ? T_PASS : T_FAIL; destroy_resolver(&resolver); teardown(); t_result(test_result); } static void test_dns_resolver_settimeout(void) { dns_resolver_t *resolver = NULL; int test_result; unsigned int default_timeout, timeout; t_assert("test_dns_resolver_settimeout", 1, T_REQUIRED, "%s", "_settimeout() can change the timeout to a non-default"); setup(); CHECK(make_resolver(&resolver)); default_timeout = dns_resolver_gettimeout(resolver); t_info("The default timeout is %d second%s\n", default_timeout, (default_timeout == 1 ? "" : "s")); dns_resolver_settimeout(resolver, default_timeout + 1); timeout = dns_resolver_gettimeout(resolver); t_info("The new timeout is %d second%s\n", timeout, (timeout == 1 ? "" : "s")); test_result = (timeout == default_timeout + 1) ? T_PASS : T_FAIL; destroy_resolver(&resolver); teardown(); t_result(test_result); } static void test_dns_resolver_settimeout_to_default(void) { dns_resolver_t *resolver = NULL; int test_result; unsigned int default_timeout, timeout; t_assert("test_dns_resolver_settimeout_to_default", 1, T_REQUIRED, "%s", "_settimeout() can change the timeout back to a default value" " by specifying 0 as the timeout."); setup(); CHECK(make_resolver(&resolver)); default_timeout = dns_resolver_gettimeout(resolver); t_info("The default timeout is %d second%s\n", default_timeout, (default_timeout == 1 ? "" : "s")); dns_resolver_settimeout(resolver, default_timeout - 1); timeout = dns_resolver_gettimeout(resolver); t_info("The new timeout is %d second%s\n", timeout, (timeout == 1 ? "" : "s")); dns_resolver_settimeout(resolver, 0); timeout = dns_resolver_gettimeout(resolver); test_result = (timeout == default_timeout) ? T_PASS : T_FAIL; destroy_resolver(&resolver); teardown(); t_result(test_result); } static void test_dns_resolver_settimeout_over_maximum(void) { dns_resolver_t *resolver = NULL; int test_result; unsigned int timeout; t_assert("test_dns_resolver_settimeout_over_maximum", 1, T_REQUIRED, "%s", "_settimeout() cannot set the value larger than the maximum."); setup(); CHECK(make_resolver(&resolver)); dns_resolver_settimeout(resolver, 4000000); timeout = dns_resolver_gettimeout(resolver); t_info("The new timeout is %d second%s\n", timeout, (timeout == 1 ? "" : "s")); test_result = (timeout < 4000000 && timeout > 0) ? T_PASS : T_FAIL; destroy_resolver(&resolver); teardown(); t_result(test_result); } testspec_t T_testlist[] = { { (PFV) test_dns_resolver_create, "dns_resolver_create" }, { (PFV) test_dns_resolver_settimeout, "dns_resolver_settimeout" }, { (PFV) test_dns_resolver_gettimeout, "dns_resolver_gettimeout" }, { (PFV) test_dns_resolver_settimeout_to_default, "test_dns_resolver_settimeout_to_default" }, { (PFV) test_dns_resolver_settimeout_over_maximum, "test_dns_resolver_settimeout_over_maximum" }, { (PFV) 0, NULL } }; #ifdef WIN32 int main(int argc, char **argv) { t_settests(T_testlist); return (t_main(argc, argv)); } #endif bind9-9.9.5.dfsg/bin/tests/ndc.conf-include0000644000470500017500000000201212271526120017775 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: ndc.conf-include,v 1.6 2007/06/19 23:46:59 tbox Exp $ */ key "another-key" { algorithm "al-gore-rhythm"; secret "R29yZSBpbiAyMDA0IQo"; # "Gore in 2004!" }; bind9-9.9.5.dfsg/bin/tests/sig0_test.c0000644000470500017500000002072212271526120017016 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007-2009, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: sig0_test.c,v 1.19 2009/09/02 23:48:01 tbox Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CHECK(str, x) { \ if ((x) != ISC_R_SUCCESS) { \ printf("%s: %s\n", (str), isc_result_totext(x)); \ exit(-1); \ } \ } isc_mutex_t lock; dst_key_t *key; isc_mem_t *mctx; unsigned char qdata[1024], rdata[1024]; isc_buffer_t qbuffer, rbuffer; isc_taskmgr_t *taskmgr; isc_entropy_t *ent = NULL; isc_task_t *task1; isc_log_t *lctx = NULL; isc_logconfig_t *logconfig = NULL; isc_socket_t *s; isc_sockaddr_t address; char output[10 * 1024]; isc_buffer_t outbuf; static const dns_master_style_t *style = &dns_master_style_debug; static void senddone(isc_task_t *task, isc_event_t *event) { isc_socketevent_t *sevent = (isc_socketevent_t *)event; REQUIRE(sevent != NULL); REQUIRE(sevent->ev_type == ISC_SOCKEVENT_SENDDONE); REQUIRE(task == task1); printf("senddone\n"); isc_event_free(&event); } static void recvdone(isc_task_t *task, isc_event_t *event) { isc_socketevent_t *sevent = (isc_socketevent_t *)event; isc_buffer_t source; isc_result_t result; dns_message_t *response; REQUIRE(sevent != NULL); REQUIRE(sevent->ev_type == ISC_SOCKEVENT_RECVDONE); REQUIRE(task == task1); printf("recvdone\n"); if (sevent->result != ISC_R_SUCCESS) { printf("failed\n"); exit(-1); } isc_buffer_init(&source, sevent->region.base, sevent->region.length); isc_buffer_add(&source, sevent->n); response = NULL; result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &response); CHECK("dns_message_create", result); result = dns_message_parse(response, &source, 0); CHECK("dns_message_parse", result); isc_buffer_init(&outbuf, output, sizeof(output)); result = dns_message_totext(response, style, 0, &outbuf); CHECK("dns_message_totext", result); printf("%.*s\n", (int)isc_buffer_usedlength(&outbuf), (char *)isc_buffer_base(&outbuf)); dns_message_destroy(&response); isc_event_free(&event); isc_app_shutdown(); } static void buildquery(void) { isc_result_t result; dns_rdataset_t *question = NULL; dns_name_t *qname = NULL; isc_region_t r, inr; dns_message_t *query; char nametext[] = "host.example"; isc_buffer_t namesrc, namedst; unsigned char namedata[256]; isc_sockaddr_t sa; dns_compress_t cctx; query = NULL; result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &query); CHECK("dns_message_create", result); result = dns_message_setsig0key(query, key); CHECK("dns_message_setsig0key", result); result = dns_message_gettemprdataset(query, &question); CHECK("dns_message_gettemprdataset", result); dns_rdataset_init(question); dns_rdataset_makequestion(question, dns_rdataclass_in, dns_rdatatype_a); result = dns_message_gettempname(query, &qname); CHECK("dns_message_gettempname", result); isc_buffer_init(&namesrc, nametext, strlen(nametext)); isc_buffer_add(&namesrc, strlen(nametext)); isc_buffer_init(&namedst, namedata, sizeof(namedata)); dns_name_init(qname, NULL); result = dns_name_fromtext(qname, &namesrc, dns_rootname, 0, &namedst); CHECK("dns_name_fromtext", result); ISC_LIST_APPEND(qname->list, question, link); dns_message_addname(query, qname, DNS_SECTION_QUESTION); isc_buffer_init(&qbuffer, qdata, sizeof(qdata)); result = dns_compress_init(&cctx, -1, mctx); CHECK("dns_compress_init", result); result = dns_message_renderbegin(query, &cctx, &qbuffer); CHECK("dns_message_renderbegin", result); result = dns_message_rendersection(query, DNS_SECTION_QUESTION, 0); CHECK("dns_message_rendersection(question)", result); result = dns_message_rendersection(query, DNS_SECTION_ANSWER, 0); CHECK("dns_message_rendersection(answer)", result); result = dns_message_rendersection(query, DNS_SECTION_AUTHORITY, 0); CHECK("dns_message_rendersection(auth)", result); result = dns_message_rendersection(query, DNS_SECTION_ADDITIONAL, 0); CHECK("dns_message_rendersection(add)", result); result = dns_message_renderend(query); CHECK("dns_message_renderend", result); dns_compress_invalidate(&cctx); isc_buffer_init(&outbuf, output, sizeof(output)); result = dns_message_totext(query, style, 0, &outbuf); CHECK("dns_message_totext", result); printf("%.*s\n", (int)isc_buffer_usedlength(&outbuf), (char *)isc_buffer_base(&outbuf)); isc_buffer_usedregion(&qbuffer, &r); isc_sockaddr_any(&sa); result = isc_socket_bind(s, &sa, 0); CHECK("isc_socket_bind", result); result = isc_socket_sendto(s, &r, task1, senddone, NULL, &address, NULL); CHECK("isc_socket_sendto", result); inr.base = rdata; inr.length = sizeof(rdata); result = isc_socket_recv(s, &inr, 1, task1, recvdone, NULL); CHECK("isc_socket_recv", result); dns_message_destroy(&query); } int main(int argc, char *argv[]) { isc_boolean_t verbose = ISC_FALSE; isc_socketmgr_t *socketmgr; isc_timermgr_t *timermgr; struct in_addr inaddr; dns_fixedname_t fname; dns_name_t *name; isc_buffer_t b; int ch; isc_result_t result; in_port_t port = 53; RUNTIME_CHECK(isc_app_start() == ISC_R_SUCCESS); RUNTIME_CHECK(isc_mutex_init(&lock) == ISC_R_SUCCESS); mctx = NULL; RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); while ((ch = isc_commandline_parse(argc, argv, "vp:")) != -1) { switch (ch) { case 'v': verbose = ISC_TRUE; break; case 'p': port = (unsigned int)atoi(isc_commandline_argument); break; } } RUNTIME_CHECK(isc_entropy_create(mctx, &ent) == ISC_R_SUCCESS); RUNTIME_CHECK(dst_lib_init(mctx, ent, 0) == ISC_R_SUCCESS); dns_result_register(); dst_result_register(); taskmgr = NULL; RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, &taskmgr) == ISC_R_SUCCESS); task1 = NULL; RUNTIME_CHECK(isc_task_create(taskmgr, 0, &task1) == ISC_R_SUCCESS); timermgr = NULL; RUNTIME_CHECK(isc_timermgr_create(mctx, &timermgr) == ISC_R_SUCCESS); socketmgr = NULL; RUNTIME_CHECK(isc_socketmgr_create(mctx, &socketmgr) == ISC_R_SUCCESS); RUNTIME_CHECK(isc_log_create(mctx, &lctx, &logconfig) == ISC_R_SUCCESS); s = NULL; RUNTIME_CHECK(isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s) == ISC_R_SUCCESS); inaddr.s_addr = htonl(INADDR_LOOPBACK); isc_sockaddr_fromin(&address, &inaddr, port); dns_fixedname_init(&fname); name = dns_fixedname_name(&fname); isc_buffer_constinit(&b, "child.example.", strlen("child.example.")); isc_buffer_add(&b, strlen("child.example.")); result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL); CHECK("dns_name_fromtext", result); key = NULL; result = dst_key_fromfile(name, 4017, DNS_KEYALG_DSA, DST_TYPE_PUBLIC | DST_TYPE_PRIVATE, NULL, mctx, &key); CHECK("dst_key_fromfile", result); buildquery(); (void)isc_app_run(); isc_task_shutdown(task1); isc_task_detach(&task1); isc_taskmgr_destroy(&taskmgr); isc_socket_detach(&s); isc_socketmgr_destroy(&socketmgr); isc_timermgr_destroy(&timermgr); dst_key_free(&key); dst_lib_destroy(); isc_entropy_detach(&ent); isc_log_destroy(&lctx); if (verbose) isc_mem_stats(mctx, stdout); isc_mem_destroy(&mctx); DESTROYLOCK(&lock); isc_app_finish(); return (0); } bind9-9.9.5.dfsg/bin/tests/wire_test.data20000644000470500017500000000146412271526120017675 0ustar lamontlamont1707 8180 0001 0005 0002 0002 027a 6202 6d78 0361 6f6c 0363 6f6d 0000 0100 01c0 0c00 0100 0100 000b a100 04c6 5110 21c0 0c00 0100 0100 000b a100 04c6 5110 22c0 0c00 0100 0100 000b a100 04c6 5110 23c0 0c00 0100 0100 000b a100 04c6 5110 24c0 0c00 0100 0100 000b a100 04c6 5110 2502 6d78 0341 4f4c 0363 6f6d 0000 0200 0100 000d 9900 0c06 646e 732d 3031 026e 73c0 72c0 6f00 0200 0100 000d 9900 0906 646e 732d 3032 c08c c085 0001 0001 0000 0d99 0004 c651 11e8 c09d 0001 0001 0000 0d99 0004 cdbc 9de8 bind9-9.9.5.dfsg/bin/tests/gxbn_test.c0000644000470500017500000000435012271526120017111 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: gxbn_test.c,v 1.16 2007/06/19 23:46:59 tbox Exp $ */ /*! \file */ #include #include #include #include static void print_he(struct hostent *he, int error, const char *fun, const char *name) { char **c; int i; if (he != NULL) { printf("%s(%s):\n", fun, name); printf("\tname = %s\n", he->h_name); printf("\taddrtype = %d\n", he->h_addrtype); printf("\tlength = %d\n", he->h_length); c = he->h_aliases; i = 1; while (*c != NULL) { printf("\talias[%d] = %s\n", i, *c); i++; c++; } c = he->h_addr_list; i = 1; while (*c != NULL) { char buf[128]; inet_ntop(he->h_addrtype, *c, buf, sizeof(buf)); printf("\taddress[%d] = %s\n", i, buf); c++; i++; } } else { printf("%s(%s): error = %d (%s)\n", fun, name, error, hstrerror(error)); } } int main(int argc, char **argv) { struct hostent *he; int error; (void)argc; while (argv[1] != NULL) { he = gethostbyname(argv[1]); print_he(he, h_errno, "gethostbyname", argv[1]); he = getipnodebyname(argv[1], AF_INET6, AI_DEFAULT|AI_ALL, &error); print_he(he, error, "getipnodebyname", argv[1]); if (he != NULL) freehostent(he); he = getipnodebyname(argv[1], AF_INET6, AI_DEFAULT, &error); print_he(he, error, "getipnodebyname", argv[1]); if (he != NULL) freehostent(he); argv++; } return (0); } bind9-9.9.5.dfsg/bin/tests/b9t.mk0000644000470500017500000000412312271526120015775 0ustar lamontlamont# Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1999-2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: b9t.mk,v 1.13 2007/06/19 23:46:59 tbox Exp $ # # makefile to configure, build and test bind9 # this is run by cron (user wpk) on aa, sol, irix, hp and aix # $PLATFORM is set in the environment by cron # BASE = /build BDIR = $(BASE) MODULE = bind9 SDIR = $(HOME)/b9t/src # as it says CVSROOT = /proj/cvs/isc # where the config, build and test output goes RDIR = /proj/build-reports/$(MODULE)/hosts/$(PLATFORM) all: clobber populate config build test clobber: @echo "CLOBBBER `date`" @if test ! -d $(BDIR) ; then mkdir -p $(BDIR) > /dev/null 2>&1 ; fi @( cd $(BDIR) && rm -fr $(MODULE) ) @echo "DONE `date`" populate: @echo "POPULATE `date`" @( cd $(BDIR) && tar -xvf $(SDIR)/$(MODULE).tar ) > $(RDIR)/.populate 2>&1 @echo "DONE `date`" config: @echo "CONFIG `date`" @( cd $(BDIR)/$(MODULE) && ./configure ) > $(RDIR)/.config 2>&1 @echo "DONE `date`" build: @echo "BUILD `date`" @( cd $(BDIR)/$(MODULE) && $(MAKE) -k all ) > $(RDIR)/.build 2>&1 @echo "DONE `date`" test: @echo "TEST `date`" -@( cd $(BDIR)/$(MODULE)/bin/tests && $(MAKE) test ) > $(RDIR)/.test 2>&1 @echo "DONE `date`" tarsrc: @echo "TARSRC `date`" @rm -fr $(SDIR)/$(MODULE) @( cd $(SDIR) && cvs -d $(CVSROOT) checkout $(MODULE) && tar -cvf $(MODULE).tar $(MODULE) ) @echo "DONE `date`" bind9-9.9.5.dfsg/bin/tests/t_api.pl0000644000470500017500000001212212271526120016375 0ustar lamontlamont#!/usr/local/bin/perl # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1999-2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: t_api.pl,v 1.10 2007/06/19 23:46:59 tbox Exp $ require "getopts.pl"; # # a minimalistic test api in perl compatable with the C api # used for the bind 9 regression tests # sub t_info { package t_api; local($format, @rest) = @_; printf("I:${format}%s", @rest); } sub t_result { package t_api; local($result) = @_; $T_inresult = 1; printf("R:$result\n"); } sub t_assert { package t_api; local($component, $anum, $class, $what, @rest) = @_; printf("A:%s:%d:%s:$what\n", $component, $anum, $class, @rest); } sub t_getenv { package t_api; local($name) = @_; return($T_env{$name}) if (defined($T_env{$name})); } package t_api; $| = 1; sub t_on_abort { $T_aborted = 1; &t_info("got abort\n"); die; } sub t_on_alarm { $T_timedout = 1; &t_info("got alarm\n"); die; } sub t_on_int { $T_terminated = 1; &t_info("got int\n"); die; } # initialize the test environment sub t_initconf { local($cfile) = @_; local($name, $value); if ((-f $cfile) && (-s _)) { open(XXX, "< $cfile"); while () { next if (/^\#/); next unless (/=/); chop; ($name, $value) = split(/=/, $_, 2); $T_env{$name} = $value; } close(XXX); } } # dump the configuration to the journal sub t_dumpconf { local($name, $value); foreach $name (sort keys %T_env) { &main't_info("%s\t%s\n", $name, $T_env{$name}); } } # run a test sub doTestN { package main; local($testnumber) = @_; local($status); if (defined($T_testlist[$testnumber])) { $t_api'T_inresult = 0; $t_api'T_aborted = 0; $t_api'T_timedout = 0; $t_api'T_terminated = 0; $t_api'T_unresolved = 0; alarm($t_api'T_timeout); $status = eval($T_testlist[$testnumber]); alarm(0); if (! defined($status)) { &t_info("The test case timed out\n") if ($t_api'T_timedout); &t_info("The test case was terminated\n") if ($t_api'T_terminated); &t_info("The test case was aborted\n") if ($t_api'T_aborted); &t_result("UNRESOLVED"); } elsif (! $t_api'T_inresult) { &t_result("NORESULT"); } } else { &t_info("Test %d is not defined\n", $testnumber); &t_result("UNTESTED"); } } $T_usage = "Usage: a : run all tests b : cd to dir before running tests c : use configfile instead of t_config d : set debug level to level h : print test info (not implemented) u : print usage info n : run test number testnumber t : run test named testname (not implemented) q : use seconds as the timeout value x : don't execute tests in a subproc (n/a) "; # get command line args &main'Getopts('ab:c:d:hun:t:q:x'); # if -u, print usage and exit if (defined($main'opt_u)) { print $T_usage; exit(0); } # implement -h and -t after we add test descriptions to T_testlist ZZZ if (defined($main'opt_h)) { print "the -h option is not implemented\n"; exit(0); } if (defined($main'opt_t)) { print "the -t option is not implemented\n"; exit(0); } # # silently ignore the -x option # this exists in the C version of the api # to facilitate exception debugging with gdb # and is not meaningful here # $T_configfile = "t_config"; $T_debug = 0; $T_timeout = 10; $T_testnum = -1; $T_dir = $main'opt_b if (defined($main'opt_b)); $T_debug = $main'opt_d if (defined($main'opt_d)); $T_configfile = $main'opt_c if (defined($main'opt_c)); $T_testnum = $main'opt_n if (defined($main'opt_n)); $T_timeout = $main'opt_q if (defined($main'opt_q)); $SIG{'ABRT'} = 't_api\'t_on_abort'; $SIG{'ALRM'} = 't_api\'t_on_alarm'; $SIG{'INT'} = 't_api\'t_on_int'; $SIG{'QUIT'} = 't_api\'t_on_int'; # print the start line $date = `date`; chop $date; ($cmd = $0) =~ s/\.\///g; printf("S:$cmd:$date\n"); # initialize the test environment &t_initconf($T_configfile); &t_dumpconf() if ($T_debug); # establish working directory if requested chdir("$T_dir") if (defined($T_dir) && (-d "$T_dir")); # run the tests if ($T_testnum == -1) { # run all tests $T_ntests = $#main'T_testlist + 1; for ($T_cnt = 0; $T_cnt < $T_ntests; ++$T_cnt) { &doTestN($T_cnt); } } else { # otherwise run the specified test &doTest($T_testnum); } # print the end line $date = `date`; chop $date; printf("E:$cmd:$date\n"); 1; bind9-9.9.5.dfsg/bin/tests/atomic/0002755000470500017500000000000012276444015016233 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/atomic/t_atomic.c0000644000470500017500000001151312271526120020166 0ustar lamontlamont/* * Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: t_atomic.c,v 1.2 2011/01/11 23:47:12 tbox Exp $ */ #include #include #include #include #include #include #include #include #include #include #include char *progname; #define CHECK(x) RUNTIME_CHECK(ISC_R_SUCCESS == (x)) isc_mem_t *mctx = NULL; isc_taskmgr_t *task_manager = NULL; #if defined(ISC_PLATFORM_HAVEXADD) || defined(ISC_PLATFORM_HAVEXADDQ) static void setup(void) { /* 1 */ CHECK(isc_mem_create(0, 0, &mctx)); /* 2 */ CHECK(isc_taskmgr_create(mctx, 32, 0, &task_manager)); } static void teardown(void) { /* 2 */ isc_taskmgr_destroy(&task_manager); /* 1 */ isc_mem_destroy(&mctx); } #endif #define TASKS 32 #define ITERATIONS 10000 #define COUNTS_PER_ITERATION 1000 #define INCREMENT_64 (isc_int64_t)0x0000000010000000 #define EXPECTED_COUNT_32 (TASKS * ITERATIONS * COUNTS_PER_ITERATION) #define EXPECTED_COUNT_64 (TASKS * ITERATIONS * COUNTS_PER_ITERATION * INCREMENT_64) typedef struct { isc_uint32_t iteration; } counter_t; counter_t counters[TASKS]; void do_xaddq(isc_task_t *task, isc_event_t *ev); #if defined(ISC_PLATFORM_HAVEXADD) isc_int32_t counter_32; void do_xadd(isc_task_t *task, isc_event_t *ev); void do_xadd(isc_task_t *task, isc_event_t *ev) { counter_t *state = (counter_t *)ev->ev_arg; int i; for (i = 0 ; i < COUNTS_PER_ITERATION ; i++) { isc_atomic_xadd(&counter_32, 1); } state->iteration++; if (state->iteration < ITERATIONS) { isc_task_send(task, &ev); } else { isc_event_free(&ev); } } static void test_atomic_xadd() { int test_result; isc_task_t *tasks[TASKS]; isc_event_t *event; int i; t_assert("test_atomic_xadd", 1, T_REQUIRED, "%s", "ensure that isc_atomic_xadd() works."); setup(); memset(counters, 0, sizeof(counters)); counter_32 = 0; /* * Create our tasks, and allocate an event to get the counters going. */ for (i = 0 ; i < TASKS ; i++) { tasks[i] = NULL; CHECK(isc_task_create(task_manager, 0, &tasks[i])); event = isc_event_allocate(mctx, NULL, 1000, do_xadd, &counters[i], sizeof(struct isc_event)); isc_task_sendanddetach(&tasks[i], &event); } teardown(); test_result = T_PASS; t_info("32-bit counter %d, expected %d\n", counter_32, EXPECTED_COUNT_32); if (counter_32 != EXPECTED_COUNT_32) test_result = T_FAIL; t_result(test_result); counter_32 = 0; } #endif #if defined(ISC_PLATFORM_HAVEXADDQ) isc_int64_t counter_64; void do_xaddq(isc_task_t *task, isc_event_t *ev); void do_xaddq(isc_task_t *task, isc_event_t *ev) { counter_t *state = (counter_t *)ev->ev_arg; int i; for (i = 0 ; i < COUNTS_PER_ITERATION ; i++) { isc_atomic_xaddq(&counter_64, INCREMENT_64); } state->iteration++; if (state->iteration < ITERATIONS) { isc_task_send(task, &ev); } else { isc_event_free(&ev); } } static void test_atomic_xaddq() { int test_result; isc_task_t *tasks[TASKS]; isc_event_t *event; int i; t_assert("test_atomic_xaddq", 1, T_REQUIRED, "%s", "ensure that isc_atomic_xaddq() works."); setup(); memset(counters, 0, sizeof(counters)); counter_64 = 0; /* * Create our tasks, and allocate an event to get the counters going. */ for (i = 0 ; i < TASKS ; i++) { tasks[i] = NULL; CHECK(isc_task_create(task_manager, 0, &tasks[i])); event = isc_event_allocate(mctx, NULL, 1000, do_xaddq, &counters[i], sizeof(struct isc_event)); isc_task_sendanddetach(&tasks[i], &event); } teardown(); test_result = T_PASS; t_info("64-bit counter %"ISC_PRINT_QUADFORMAT"d, expected %"ISC_PRINT_QUADFORMAT"d\n", counter_64, EXPECTED_COUNT_64); if (counter_64 != EXPECTED_COUNT_64) test_result = T_FAIL; t_result(test_result); counter_64 = 0; } #endif testspec_t T_testlist[] = { #if defined(ISC_PLATFORM_HAVEXADD) { (PFV) test_atomic_xadd, "test_atomic_xadd" }, #endif #if defined(ISC_PLATFORM_HAVEXADDQ) { (PFV) test_atomic_xaddq, "test_atomic_xaddq" }, #endif { (PFV) 0, NULL } }; #ifdef WIN32 int main(int argc, char **argv) { t_settests(T_testlist); return (t_main(argc, argv)); } #endif bind9-9.9.5.dfsg/bin/tests/atomic/win32/0002755000470500017500000000000012271527124017173 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.vcxproj.user0000644000470500017500000000021712271526120023355 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.dsp.in0000644000470500017500000001110312271526120022074 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="t_atomic" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=t_atomic - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "t_atomic.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_atomic.mak" CFG="t_atomic - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_atomic - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_atomic - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib /nologo /subsystem:console @MACHINE@ /out:"../../../../Build/Release/t_atomic.exe" !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /I "../../../../lib/bind9/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib /nologo /subsystem:console /map /debug @MACHINE@ /out:"../../../../Build/Debug/t_atomic.exe" /pdbtype:sept !ENDIF # Begin Target # Name "t_atomic - @PLATFORM@ Release" # Name "t_atomic - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\t_atomic.c # End Source File # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.mak.in0000644000470500017500000002650212271526120022067 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on t_atomic.dsp !IF "$(CFG)" == "" CFG=t_atomic - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to t_atomic - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "t_atomic - @PLATFORM@ Release" && "$(CFG)" != "t_atomic - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_atomic.mak" CFG="t_atomic - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_atomic - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_atomic - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe LIBXML=@LIBXML2_LIB@ !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Release\t_atomic.exe" !ELSE ALL : "libtests - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" "..\..\..\..\Build\Release\t_atomic.exe" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ ReleaseCLEAN" "libisc - @PLATFORM@ ReleaseCLEAN" "libtests - @PLATFORM@ ReleaseCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_atomic.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\..\Build\Release\t_atomic.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\t_atomic.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_atomic.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/dns/win32/Release/libdns.lib ../../../../lib/tests/win32/Release/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\t_atomic.pdb" @MACHINE@ /out:"../../../../Build/Release/t_atomic.exe" LINK32_OBJS= \ "$(INTDIR)\t_atomic.obj" \ "..\..\..\..\lib\dns\win32\Release\libdns.lib" \ "..\..\..\..\lib\isc\win32\Release\libisc.lib" \ "..\..\..\..\lib\tests\win32\Release\libtests.lib" "..\..\..\..\Build\Release\t_atomic.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Debug\t_atomic.exe" "$(OUTDIR)\t_atomic.bsc" !ELSE ALL : "libtests - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" "..\..\..\..\Build\Debug\t_atomic.exe" "$(OUTDIR)\t_atomic.bsc" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libdns - @PLATFORM@ DebugCLEAN" "libisc - @PLATFORM@ DebugCLEAN" "libtests - @PLATFORM@ DebugCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_atomic.obj" -@erase "$(INTDIR)\t_atomic.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\t_atomic.bsc" -@erase "$(OUTDIR)\t_atomic.map" -@erase "$(OUTDIR)\t_atomic.pdb" -@erase "..\..\..\..\Build\Debug\t_atomic.exe" -@erase "..\..\..\..\Build\Debug\t_atomic.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/dns/win32/include" /I "../../../../lib/dns/include" /I "../../../../lib/tests/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_atomic.bsc" BSC32_SBRS= \ "$(INTDIR)\t_atomic.sbr" "$(OUTDIR)\t_atomic.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/dns/win32/Debug/libdns.lib ../../../../lib/tests/win32/Debug/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\t_atomic.pdb" /map:"$(INTDIR)\t_atomic.map" /debug @MACHINE@ /out:"../../../../Build/Debug/t_atomic.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\t_atomic.obj" \ "..\..\..\..\lib\dns\win32\Debug\libdns.lib" \ "..\..\..\..\lib\isc\win32\Debug\libisc.lib" \ "..\..\..\..\lib\tests\win32\Debug\libtests.lib" "..\..\..\..\Build\Debug\t_atomic.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("t_atomic.dep") !INCLUDE "t_atomic.dep" !ELSE !MESSAGE Warning: cannot find "t_atomic.dep" !ENDIF !ENDIF !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" || "$(CFG)" == "t_atomic - @PLATFORM@ Debug" SOURCE=..\t_atomic.c !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" "$(INTDIR)\t_atomic.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" "$(INTDIR)\t_atomic.obj" "$(INTDIR)\t_atomic.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" "libdns - @PLATFORM@ Release" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" cd "..\..\..\bin\tests\atomic\win32" "libdns - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" "libdns - @PLATFORM@ Debug" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" cd "..\..\..\bin\tests\atomic\win32" "libdns - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\dns\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libdns.mak" CFG="libdns - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ENDIF !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" cd "..\..\..\bin\tests\atomic\win32" "libisc - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" cd "..\..\..\bin\tests\atomic\win32" "libisc - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ENDIF !IF "$(CFG)" == "t_atomic - @PLATFORM@ Release" "libtests - @PLATFORM@ Release" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" cd "..\..\..\bin\tests\atomic\win32" "libtests - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ELSEIF "$(CFG)" == "t_atomic - @PLATFORM@ Debug" "libtests - @PLATFORM@ Debug" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" cd "..\..\..\bin\tests\atomic\win32" "libtests - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\atomic\win32" !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.vcxproj.filters.in0000644000470500017500000000167612271526120024466 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.dsw0000644000470500017500000000103512271526120021501 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "t_atomic"=".\t_atomic.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tests/atomic/win32/t_atomic.vcxproj.in0000644000470500017500000001504212271526120023007 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {EC6ECB35-58C0-48EC-BAC9-9A652D9406C9} Win32Proj t_atomic Application true MultiByte Application false true MultiByte true ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\dns\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\dns\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libdns.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tests/atomic/Makefile.in0000644000470500017500000000330012271526120020263 0ustar lamontlamont# Copyright (C) 2011, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.2 2011/01/11 23:47:12 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${TEST_INCLUDES} ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = # Note that we do not want to use libtool for libt_api DNSLIBS = ../../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ ISCLIBS = ../../../lib/isc/libisc.@A@ DNSDEPLIBS = ../../../lib/dns/libdns.@A@ ISCDEPLIBS = ../../../lib/isc/libisc.@A@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ TLIB = ../../../lib/tests/libt_api.@A@ TARGETS = t_atomic@EXEEXT@ SRCS = t_atomic.c @BIND9_MAKE_RULES@ t_atomic@EXEEXT@: t_atomic.@O@ ${DEPLIBS} ${TLIB} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_atomic.@O@ ${TLIB} ${LIBS} test: t_atomic@EXEEXT@ -@./t_atomic@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -a testhelp: @./t_atomic@EXEEXT@ -h clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/entropy2_test.c0000644000470500017500000001005112271526120017730 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: entropy2_test.c,v 1.16 2007/06/19 23:46:59 tbox Exp $ */ /*! \file */ #include #include #include #include #include #include #include #include #include static void hex_dump(const char *msg, void *data, unsigned int length) { unsigned int len; unsigned char *base; isc_boolean_t first = ISC_TRUE; base = data; printf("DUMP of %d bytes: %s\n\t", length, msg); for (len = 0; len < length; len++) { if (len % 16 == 0 && !first) printf("\n\t"); printf("%02x ", base[len]); first = ISC_FALSE; } printf("\n"); } static void CHECK(const char *msg, isc_result_t result) { if (result != ISC_R_SUCCESS) { printf("FAILURE: %s: %s\n", msg, isc_result_totext(result)); exit(1); } } static isc_result_t start(isc_entropysource_t *source, void *arg, isc_boolean_t blocking) { isc_keyboard_t *kbd = (isc_keyboard_t *)arg; UNUSED(source); if (blocking) printf("start called, blocking mode.\n"); else printf("start called, non-blocking mode.\n"); return (isc_keyboard_open(kbd)); } static void stop(isc_entropysource_t *source, void *arg) { isc_keyboard_t *kbd = (isc_keyboard_t *)arg; UNUSED(source); printf("ENOUGH! Stop typing, please.\r\n"); (void)isc_keyboard_close(kbd, 3); printf("stop called\n"); } static isc_result_t get(isc_entropysource_t *source, void *arg, isc_boolean_t blocking) { isc_keyboard_t *kbd = (isc_keyboard_t *)arg; isc_result_t result; isc_time_t t; isc_uint32_t sample; isc_uint32_t extra; unsigned char c; if (!blocking) return (ISC_R_NOENTROPY); result = isc_keyboard_getchar(kbd, &c); if (result != ISC_R_SUCCESS) return (result); TIME_NOW(&t); sample = isc_time_nanoseconds(&t); extra = c; result = isc_entropy_addcallbacksample(source, sample, extra); if (result != ISC_R_SUCCESS) { printf("\r\n"); return (result); } printf("."); fflush(stdout); return (result); } int main(int argc, char **argv) { isc_mem_t *mctx; unsigned char buffer[512]; isc_entropy_t *ent; isc_entropysource_t *source; unsigned int returned; unsigned int flags; isc_result_t result; isc_keyboard_t kbd; UNUSED(argc); UNUSED(argv); mctx = NULL; CHECK("isc_mem_create()", isc_mem_create(0, 0, &mctx)); ent = NULL; CHECK("isc_entropy_create()", isc_entropy_create(mctx, &ent)); isc_entropy_stats(ent, stderr); source = NULL; result = isc_entropy_createcallbacksource(ent, start, get, stop, &kbd, &source); CHECK("isc_entropy_createcallbacksource()", result); fprintf(stderr, "Reading 32 bytes of GOOD random data only, partial OK\n"); flags = 0; flags |= ISC_ENTROPY_GOODONLY; flags |= ISC_ENTROPY_PARTIAL; flags |= ISC_ENTROPY_BLOCKING; returned = 0; result = isc_entropy_getdata(ent, buffer, 32, &returned, flags); if (result == ISC_R_NOENTROPY) { fprintf(stderr, "No entropy.\r\n"); } isc_entropy_stopcallbacksources(ent); hex_dump("good data only:", buffer, returned); isc_entropy_stats(ent, stderr); isc_entropy_destroysource(&source); isc_entropy_detach(&ent); isc_mem_stats(mctx, stderr); isc_mem_destroy(&mctx); return (0); } bind9-9.9.5.dfsg/bin/tests/fsaccess_test.c0000644000470500017500000000377712271526120017761 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: fsaccess_test.c,v 1.13 2007/06/19 23:46:59 tbox Exp $ */ /*! \file */ #include #include #include #include #include /* Non-portable. */ #include /* Non-portable. */ #include #include #define PATH "/tmp/fsaccess" int main(void) { isc_fsaccess_t access; isc_result_t result; FILE *fp; int n; n = remove(PATH); if (n != 0 && errno != ENOENT) { fprintf(stderr, "unable to remove(%s)\n", PATH); exit(1); } fp = fopen(PATH, "w"); if (fp == NULL) { fprintf(stderr, "unable to fopen(%s)\n", PATH); exit(1); } n = chmod(PATH, 0); if (n != 0) { fprintf(stderr, "unable chmod(%s, 0)\n", PATH); exit(1); } access = 0; isc_fsaccess_add(ISC_FSACCESS_OWNER | ISC_FSACCESS_GROUP, ISC_FSACCESS_READ | ISC_FSACCESS_WRITE, &access); printf("fsaccess=%d\n", access); isc_fsaccess_add(ISC_FSACCESS_OTHER, ISC_FSACCESS_READ, &access); printf("fsaccess=%d\n", access); result = isc_fsaccess_set(PATH, access); if (result != ISC_R_SUCCESS) fprintf(stderr, "result = %s\n", isc_result_totext(result)); (void)fclose(fp); return (0); } bind9-9.9.5.dfsg/bin/tests/wire_test.data0000644000470500017500000000066412271526120017614 0ustar lamontlamont000a 8580 0001 0003 0000 0003 # message header 0376697803636f6d00 0002 0001 # question section: vix.com IN NS c00c 0002 0001 00000e10 # vix.com IN NS 3600 000b 056973727631027061c00c # rdlen=0xb isrv1.pa.vix.com c00c 0002 0001 00000e10 0009 066e732d657874c00c c00c 0002 0001 00000e10 000e 036e733104676e616303636f6d00 c025 0001 0001 00000e10 0004 cc98b886 c03c 0001 0001 00000e10 0004 cc98b840 c051 0001 0001 0002a14a 0004 c697f8f6 bind9-9.9.5.dfsg/bin/tests/wire_test.data30000644000470500017500000000146412271526120017676 0ustar lamontlamont1706 8180 0001 0005 0002 0002 027a 6102 6d78 0361 6f6c 0363 6f6d 0000 0100 01c0 0c00 0100 0100 000b a100 04c6 5110 05c0 0c00 0100 0100 000b a100 04c6 5110 01c0 0c00 0100 0100 000b a100 04c6 5110 02c0 0c00 0100 0100 000b a100 04c6 5110 03c0 0c00 0100 0100 000b a100 04c6 5110 0402 6d78 0341 4f4c 0363 6f6d 0000 0200 0100 000d 9900 0c06 646e 732d 3031 026e 73c0 72c0 6f00 0200 0100 000d 9900 0906 646e 732d 3032 c08c c085 0001 0001 0000 0d99 0004 c651 11e8 c09d 0001 0001 0000 0d99 0004 cdbc 9de8 bind9-9.9.5.dfsg/bin/tests/adb_test.c0000644000470500017500000002605112271526120016703 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: adb_test.c,v 1.73 2011/08/30 23:46:51 tbox Exp $ */ /*! \file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct client client_t; struct client { dns_name_t name; const char *target; ISC_LINK(client_t) link; dns_adbfind_t *find; }; static isc_mem_t *mctx = NULL; static isc_entropy_t *ectx = NULL; static isc_mempool_t *cmp; static isc_log_t *lctx; static isc_logconfig_t *lcfg; static isc_taskmgr_t *taskmgr; static isc_socketmgr_t *socketmgr; static isc_timermgr_t *timermgr; static dns_dispatchmgr_t *dispatchmgr; static isc_task_t *t1, *t2; static dns_view_t *view; static dns_db_t *rootdb; static ISC_LIST(client_t) clients; static isc_mutex_t client_lock; static isc_stdtime_t now; static dns_adb_t *adb; static void check_result(isc_result_t result, const char *format, ...) ISC_FORMAT_PRINTF(2, 3); static void check_result(isc_result_t result, const char *format, ...) { va_list args; if (result == ISC_R_SUCCESS) return; va_start(args, format); vfprintf(stderr, format, args); va_end(args); fprintf(stderr, ": %s\n", isc_result_totext(result)); exit(1); } static client_t * new_client(void) { client_t *client; client = isc_mempool_get(cmp); INSIST(client != NULL); dns_name_init(&client->name, NULL); ISC_LINK_INIT(client, link); client->find = NULL; return (client); } static void free_client(client_t **c) { client_t *client; INSIST(c != NULL); client = *c; *c = NULL; INSIST(client != NULL); dns_name_free(&client->name, mctx); INSIST(!ISC_LINK_LINKED(client, link)); INSIST(client->find == NULL); isc_mempool_put(cmp, client); } static inline void CLOCK(void) { RUNTIME_CHECK(isc_mutex_lock(&client_lock) == ISC_R_SUCCESS); } static inline void CUNLOCK(void) { RUNTIME_CHECK(isc_mutex_unlock(&client_lock) == ISC_R_SUCCESS); } static void lookup_callback(isc_task_t *task, isc_event_t *ev) { client_t *client; client = ev->ev_arg; INSIST(client->find == ev->ev_sender); printf("NAME %s:\n\tTask %p got event %p type %08x from %p, client %p\n\terr4: %s err6: %s\n", client->target, task, ev, ev->ev_type, client->find, client, isc_result_totext(client->find->result_v4), isc_result_totext(client->find->result_v6)); isc_event_free(&ev); ev = NULL; CLOCK(); dns_adb_dumpfind(client->find, stderr); dns_adb_destroyfind(&client->find); ISC_LIST_UNLINK(clients, client, link); free_client(&client); CUNLOCK(); } static void create_managers(void) { isc_result_t result; taskmgr = NULL; result = isc_taskmgr_create(mctx, 5, 0, &taskmgr); check_result(result, "isc_taskmgr_create"); timermgr = NULL; result = isc_timermgr_create(mctx, &timermgr); check_result(result, "isc_timermgr_create"); socketmgr = NULL; result = isc_socketmgr_create(mctx, &socketmgr); check_result(result, "isc_socketmgr_create"); dispatchmgr = NULL; result = dns_dispatchmgr_create(mctx, NULL, &dispatchmgr); check_result(result, "dns_dispatchmgr_create"); } static void create_view(void) { dns_cache_t *cache; isc_result_t result; /* * View. */ view = NULL; result = dns_view_create(mctx, dns_rdataclass_in, "_default", &view); check_result(result, "dns_view_create"); /* * Cache. */ cache = NULL; result = dns_cache_create(mctx, taskmgr, timermgr, dns_rdataclass_in, "rbt", 0, NULL, &cache); check_result(result, "dns_cache_create"); dns_view_setcache(view, cache); dns_cache_detach(&cache); { unsigned int attrs; isc_sockaddr_t any4, any6; dns_dispatch_t *disp4 = NULL; dns_dispatch_t *disp6 = NULL; isc_sockaddr_any(&any4); isc_sockaddr_any6(&any6); attrs = DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_UDP; RUNTIME_CHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &any4, 512, 6, 1024, 17, 19, attrs, attrs, &disp4) == ISC_R_SUCCESS); INSIST(disp4 != NULL); attrs = DNS_DISPATCHATTR_IPV6 | DNS_DISPATCHATTR_UDP; RUNTIME_CHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr, &any6, 512, 6, 1024, 17, 19, attrs, attrs, &disp6) == ISC_R_SUCCESS); INSIST(disp6 != NULL); RUNTIME_CHECK(dns_view_createresolver(view, taskmgr, 10, 1, socketmgr, timermgr, 0, dispatchmgr, disp4, disp6) == ISC_R_SUCCESS); } rootdb = NULL; result = dns_rootns_create(mctx, dns_rdataclass_in, NULL, &rootdb); check_result(result, "dns_rootns_create()"); dns_view_sethints(view, rootdb); dns_db_detach(&rootdb); dns_view_freeze(view); } static void lookup(const char *target) { dns_name_t name; unsigned char namedata[256]; client_t *client; isc_buffer_t t, namebuf; isc_result_t result; unsigned int options; INSIST(target != NULL); client = new_client(); isc_buffer_constinit(&t, target, strlen(target)); isc_buffer_add(&t, strlen(target)); isc_buffer_init(&namebuf, namedata, sizeof(namedata)); dns_name_init(&name, NULL); result = dns_name_fromtext(&name, &t, dns_rootname, 0, &namebuf); check_result(result, "dns_name_fromtext %s", target); result = dns_name_dup(&name, mctx, &client->name); check_result(result, "dns_name_dup %s", target); options = 0; options |= DNS_ADBFIND_INET; options |= DNS_ADBFIND_INET6; options |= DNS_ADBFIND_WANTEVENT; options |= DNS_ADBFIND_HINTOK; options |= DNS_ADBFIND_GLUEOK; result = dns_adb_createfind(adb, t2, lookup_callback, client, &client->name, dns_rootname, 0, options, now, NULL, view->dstport, &client->find); if (result != ISC_R_SUCCESS) printf("DNS_ADB_CREATEFIND -> %s\n", dns_result_totext(result)); dns_adb_dumpfind(client->find, stderr); if ((client->find->options & DNS_ADBFIND_WANTEVENT) != 0) { client->target = target; ISC_LIST_APPEND(clients, client, link); } else { printf("NAME %s: err4 %s, err6 %s\n", target, isc_result_totext(client->find->result_v4), isc_result_totext(client->find->result_v6)); dns_adb_destroyfind(&client->find); free_client(&client); } } int main(int argc, char **argv) { isc_result_t result; isc_logdestination_t destination; UNUSED(argc); UNUSED(argv); dns_result_register(); result = isc_app_start(); check_result(result, "isc_app_start()"); isc_stdtime_get(&now); result = isc_mutex_init(&client_lock); check_result(result, "isc_mutex_init(&client_lock)"); ISC_LIST_INIT(clients); /* * EVERYTHING needs a memory context. */ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); cmp = NULL; RUNTIME_CHECK(isc_mempool_create(mctx, sizeof(client_t), &cmp) == ISC_R_SUCCESS); isc_mempool_setname(cmp, "adb test clients"); result = isc_entropy_create(mctx, &ectx); check_result(result, "isc_entropy_create()"); result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); check_result(result, "isc_hash_create()"); result = isc_log_create(mctx, &lctx, &lcfg); check_result(result, "isc_log_create()"); isc_log_setcontext(lctx); dns_log_init(lctx); dns_log_setcontext(lctx); /* * Create and install the default channel. */ destination.file.stream = stderr; destination.file.name = NULL; destination.file.versions = ISC_LOG_ROLLNEVER; destination.file.maximum_size = 0; result = isc_log_createchannel(lcfg, "_default", ISC_LOG_TOFILEDESC, ISC_LOG_DYNAMIC, &destination, ISC_LOG_PRINTTIME); check_result(result, "isc_log_createchannel()"); result = isc_log_usechannel(lcfg, "_default", NULL, NULL); check_result(result, "isc_log_usechannel()"); /* * Set the initial debug level. */ isc_log_setdebuglevel(lctx, 2); create_managers(); t1 = NULL; result = isc_task_create(taskmgr, 0, &t1); check_result(result, "isc_task_create t1"); t2 = NULL; result = isc_task_create(taskmgr, 0, &t2); check_result(result, "isc_task_create t2"); printf("task 1 = %p\n", t1); printf("task 2 = %p\n", t2); create_view(); adb = view->adb; /* * Lock the entire client list here. This will cause all events * for found names to block as well. */ CLOCK(); lookup("f.root-servers.net."); /* Should be in hints */ lookup("www.iengines.com"); /* should fetch */ lookup("www.isc.org"); /* should fetch */ lookup("www.flame.org"); /* should fetch */ lookup("kechara.flame.org."); /* should fetch */ lookup("moghedien.flame.org."); /* should fetch */ lookup("mailrelay.flame.org."); /* should fetch */ lookup("ipv4v6.flame.org."); /* should fetch */ lookup("nonexistant.flame.org."); /* should fail to be found */ lookup("foobar.badns.flame.org."); /* should fail utterly (NS) */ lookup("i.root-servers.net."); /* Should be in hints */ lookup("www.firstcard.com."); lookup("dns04.flame.org."); CUNLOCK(); sleep(10); dns_adb_dump(adb, stderr); sleep(10); CLOCK(); lookup("f.root-servers.net."); /* Should be in hints */ lookup("www.iengines.com"); /* should fetch */ lookup("www.isc.org"); /* should fetch */ lookup("www.flame.org"); /* should fetch */ lookup("kechara.flame.org."); /* should fetch */ lookup("moghedien.flame.org."); /* should fetch */ lookup("mailrelay.flame.org."); /* should fetch */ lookup("ipv4v6.flame.org."); /* should fetch */ lookup("nonexistant.flame.org."); /* should fail to be found */ lookup("foobar.badns.flame.org."); /* should fail utterly (NS) */ lookup("i.root-servers.net."); /* Should be in hints */ CUNLOCK(); sleep(20); dns_adb_dump(adb, stderr); isc_task_detach(&t1); isc_task_detach(&t2); isc_mem_stats(mctx, stdout); dns_adb_dump(adb, stderr); isc_app_run(); dns_adb_dump(adb, stderr); dns_view_detach(&view); adb = NULL; fprintf(stderr, "Destroying socket manager\n"); isc_socketmgr_destroy(&socketmgr); fprintf(stderr, "Destroying timer manager\n"); isc_timermgr_destroy(&timermgr); fprintf(stderr, "Destroying task manager\n"); isc_taskmgr_destroy(&taskmgr); isc_log_destroy(&lctx); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mempool_destroy(&cmp); isc_mem_stats(mctx, stdout); isc_mem_destroy(&mctx); isc_app_finish(); return (0); } bind9-9.9.5.dfsg/bin/tests/lex_test.c0000644000470500017500000001006112271526120016737 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: lex_test.c,v 1.23 2007/06/19 23:46:59 tbox Exp $ */ /*! \file */ #include #include #include #include #include isc_mem_t *mctx; isc_lex_t *lex; isc_lexspecials_t specials; static void print_token(isc_token_t *tokenp, FILE *stream) { switch (tokenp->type) { case isc_tokentype_unknown: fprintf(stream, "UNKNOWN"); break; case isc_tokentype_string: fprintf(stream, "STRING %.*s", (int)tokenp->value.as_region.length, tokenp->value.as_region.base); break; case isc_tokentype_number: fprintf(stream, "NUMBER %lu", tokenp->value.as_ulong); break; case isc_tokentype_qstring: fprintf(stream, "QSTRING \"%.*s\"", (int)tokenp->value.as_region.length, tokenp->value.as_region.base); break; case isc_tokentype_eol: fprintf(stream, "EOL"); break; case isc_tokentype_eof: fprintf(stream, "EOF"); break; case isc_tokentype_initialws: fprintf(stream, "INITIALWS"); break; case isc_tokentype_special: fprintf(stream, "SPECIAL %c", tokenp->value.as_char); break; case isc_tokentype_nomore: fprintf(stream, "NOMORE"); break; default: FATAL_ERROR(__FILE__, __LINE__, "Unexpected type %d", tokenp->type); } } int main(int argc, char *argv[]) { isc_token_t token; isc_result_t result; int quiet = 0; int c; int masterfile = 1; int stats = 0; unsigned int options = 0; int done = 0; while ((c = isc_commandline_parse(argc, argv, "qmcs")) != -1) { switch (c) { case 'q': quiet = 1; break; case 'm': masterfile = 1; break; case 'c': masterfile = 0; break; case 's': stats = 1; break; } } RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS); if (masterfile) { /* Set up to lex DNS master file. */ specials['('] = 1; specials[')'] = 1; specials['"'] = 1; isc_lex_setspecials(lex, specials); options = ISC_LEXOPT_DNSMULTILINE | ISC_LEXOPT_ESCAPE | ISC_LEXOPT_EOF | ISC_LEXOPT_QSTRING | ISC_LEXOPT_NOMORE; isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE); } else { /* Set up to lex DNS config file. */ specials['{'] = 1; specials['}'] = 1; specials[';'] = 1; specials['/'] = 1; specials['"'] = 1; specials['!'] = 1; specials['*'] = 1; isc_lex_setspecials(lex, specials); options = ISC_LEXOPT_EOF | ISC_LEXOPT_QSTRING | ISC_LEXOPT_NUMBER | ISC_LEXOPT_NOMORE; isc_lex_setcomments(lex, (ISC_LEXCOMMENT_C| ISC_LEXCOMMENT_CPLUSPLUS| ISC_LEXCOMMENT_SHELL)); } RUNTIME_CHECK(isc_lex_openstream(lex, stdin) == ISC_R_SUCCESS); while ((result = isc_lex_gettoken(lex, options, &token)) == ISC_R_SUCCESS && !done) { if (!quiet) { char *name = isc_lex_getsourcename(lex); print_token(&token, stdout); printf(" line = %lu file = %s\n", isc_lex_getsourceline(lex), (name == NULL) ? "" : name); } if (token.type == isc_tokentype_eof) isc_lex_close(lex); if (token.type == isc_tokentype_nomore) done = 1; } if (result != ISC_R_SUCCESS) printf("Result: %s\n", isc_result_totext(result)); isc_lex_close(lex); isc_lex_destroy(&lex); if (!quiet && stats) isc_mem_stats(mctx, stdout); isc_mem_destroy(&mctx); return (0); } bind9-9.9.5.dfsg/bin/tests/rbt_test.c0000644000470500017500000002523112271526120016743 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: rbt_test.c,v 1.52 2011/08/28 23:46:41 tbox Exp $ */ #include #include #include #include #include #include #include #include #include char *progname; isc_mem_t *mctx; #define DNSNAMELEN 255 static dns_name_t * create_name(char *s) { int length; isc_result_t result; isc_buffer_t source, target; static dns_name_t *name; if (s == NULL || *s == '\0') { printf("missing name argument\n"); return (NULL); } length = strlen(s); isc_buffer_init(&source, s, length); isc_buffer_add(&source, length); /* * It isn't really necessary in this program to create individual * memory spaces for each name structure and its associated character * string. It is done here to provide a relatively easy way to test * the callback from dns_rbt_deletename that is supposed to free the * data associated with a node. * * The buffer for the actual name will immediately follow the * name structure. */ name = isc_mem_get(mctx, sizeof(*name) + DNSNAMELEN); if (name == NULL) { printf("out of memory!\n"); return (NULL); } dns_name_init(name, NULL); isc_buffer_init(&target, name + 1, DNSNAMELEN); result = dns_name_fromtext(name, &source, dns_rootname, 0, &target); if (result != ISC_R_SUCCESS) { printf("dns_name_fromtext(%s) failed: %s\n", s, dns_result_totext(result)); return (NULL); } return (name); } static void delete_name(void *data, void *arg) { dns_name_t *name; UNUSED(arg); name = data; isc_mem_put(mctx, name, sizeof(*name) + DNSNAMELEN); } static void print_name(dns_name_t *name) { isc_buffer_t target; char buffer[1024]; isc_buffer_init(&target, buffer, sizeof(buffer)); /* * ISC_FALSE means absolute names have the final dot added. */ dns_name_totext(name, ISC_FALSE, &target); printf("%.*s", (int)target.used, (char *)target.base); } static void detail(dns_rbt_t *rbt, dns_name_t *name) { dns_name_t *foundname, *origin, *fullname; dns_fixedname_t fixedfoundname, fixedorigin, fixedfullname; dns_rbtnode_t *node1, *node2; dns_rbtnodechain_t chain; isc_result_t result; isc_boolean_t nodes_should_match = ISC_FALSE; dns_rbtnodechain_init(&chain, mctx); dns_fixedname_init(&fixedorigin); dns_fixedname_init(&fixedfullname); dns_fixedname_init(&fixedfoundname); origin = dns_fixedname_name(&fixedorigin); fullname = dns_fixedname_name(&fixedfullname); foundname = dns_fixedname_name(&fixedfoundname); node1 = node2 = NULL; printf("checking chain information for "); print_name(name); printf("\n"); result = dns_rbt_findnode(rbt, name, foundname, &node1, &chain, DNS_RBTFIND_EMPTYDATA, NULL, NULL); switch (result) { case ISC_R_SUCCESS: printf(" found exact."); nodes_should_match = ISC_TRUE; break; case DNS_R_PARTIALMATCH: printf(" found parent."); break; case ISC_R_NOTFOUND: printf(" name not found."); break; default: printf(" unexpected result: %s\n", dns_result_totext(result)); return; } if (node1 != NULL && node1->data != NULL) { printf(" data at node: "); print_name(node1->data); } else printf(" no data at node."); if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { printf("\n name from dns_rbt_findnode: "); print_name(foundname); } result = dns_rbtnodechain_current(&chain, foundname, origin, &node2); if (result == ISC_R_SUCCESS) { printf("\n name from dns_rbtnodechain_current: "); result = dns_name_concatenate(foundname, origin, fullname, NULL); if (result == ISC_R_SUCCESS) print_name(fullname); else printf("%s\n", dns_result_totext(result)); printf("\n (foundname = "); print_name(foundname); printf(", origin = "); print_name(origin); printf(")\n"); if (nodes_should_match && node1 != node2) printf(" nodes returned from each function " "DO NOT match!\n"); } else printf("\n result from dns_rbtnodechain_current: %s\n", dns_result_totext(result)); printf(" level_matches = %d, level_count = %d\n", chain.level_matches, chain.level_count); } static void iterate(dns_rbt_t *rbt, isc_boolean_t forward) { dns_name_t foundname, *origin; dns_rbtnodechain_t chain; dns_fixedname_t fixedorigin; isc_result_t result; isc_result_t (*move)(dns_rbtnodechain_t *chain, dns_name_t *name, dns_name_t *origin); dns_rbtnodechain_init(&chain, mctx); dns_name_init(&foundname, NULL); dns_fixedname_init(&fixedorigin); origin = dns_fixedname_name(&fixedorigin); if (forward) { printf("iterating forward\n" ); move = dns_rbtnodechain_next; result = dns_rbtnodechain_first(&chain, rbt, &foundname, origin); } else { printf("iterating backward\n" ); move = dns_rbtnodechain_prev; result = dns_rbtnodechain_last(&chain, rbt, &foundname, origin); } if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) printf("start not found!\n"); else { for (;;) { if (result == DNS_R_NEWORIGIN) { printf(" new origin: "); print_name(origin); printf("\n"); } if (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN) { print_name(&foundname); printf("\n"); } else { if (result != ISC_R_NOMORE) printf("UNEXEPCTED ITERATION ERROR: %s", dns_result_totext(result)); break; } result = move(&chain, &foundname, origin); } } } #define CMDCHECK(s) (strncasecmp(command, (s), length) == 0) #define PRINTERR(r) if (r != ISC_R_SUCCESS) \ printf("... %s\n", dns_result_totext(r)); int main(int argc, char **argv) { char *command, *arg, buffer[1024]; const char *whitespace; dns_name_t *name, *foundname; dns_fixedname_t fixedname; dns_rbt_t *rbt = NULL; int length, ch; isc_boolean_t show_final_mem = ISC_FALSE; isc_result_t result; void *data; progname = strrchr(*argv, '/'); if (progname != NULL) progname++; else progname = *argv; while ((ch = isc_commandline_parse(argc, argv, "m")) != -1) { switch (ch) { case 'm': show_final_mem = ISC_TRUE; break; } } argc -= isc_commandline_index; argv += isc_commandline_index; POST(argv); if (argc > 1) { printf("Usage: %s [-m]\n", progname); exit(1); } setbuf(stdout, NULL); /* * So isc_mem_stats() can report any allocation leaks. */ isc_mem_debugging = ISC_MEM_DEBUGRECORD; result = isc_mem_create(0, 0, &mctx); if (result != ISC_R_SUCCESS) { printf("isc_mem_create: %s: exiting\n", dns_result_totext(result)); exit(1); } result = dns_rbt_create(mctx, delete_name, NULL, &rbt); if (result != ISC_R_SUCCESS) { printf("dns_rbt_create: %s: exiting\n", dns_result_totext(result)); exit(1); } whitespace = " \t"; while (fgets(buffer, sizeof(buffer), stdin) != NULL) { length = strlen(buffer); if (buffer[length - 1] != '\n') { printf("line to long (%lu max), ignored\n", (unsigned long)sizeof(buffer) - 2); continue; } buffer[length - 1] = '\0'; command = buffer + strspn(buffer, whitespace); if (*command == '#') continue; arg = strpbrk(command, whitespace); if (arg != NULL) { *arg++ = '\0'; arg += strspn(arg, whitespace); } length = strlen(command); if (*command != '\0') { if (CMDCHECK("add")) { name = create_name(arg); if (name != NULL) { printf("adding name %s\n", arg); result = dns_rbt_addname(rbt, name, name); PRINTERR(result); } } else if (CMDCHECK("delete")) { name = create_name(arg); if (name != NULL) { printf("deleting name %s\n", arg); result = dns_rbt_deletename(rbt, name, ISC_FALSE); PRINTERR(result); delete_name(name, NULL); } } else if (CMDCHECK("nuke")) { name = create_name(arg); if (name != NULL) { printf("nuking name %s " "and its descendants\n", arg); result = dns_rbt_deletename(rbt, name, ISC_TRUE); PRINTERR(result); delete_name(name, NULL); } } else if (CMDCHECK("search")) { name = create_name(arg); if (name != NULL) { printf("searching for name %s ... ", arg); dns_fixedname_init(&fixedname); foundname = dns_fixedname_name(&fixedname); data = NULL; result = dns_rbt_findname(rbt, name, 0, foundname, &data); switch (result) { case ISC_R_SUCCESS: printf("found exact: "); print_name(data); putchar('\n'); break; case DNS_R_PARTIALMATCH: printf("found parent: "); print_name(data); printf("\n\t(foundname: "); print_name(foundname); printf(")\n"); break; case ISC_R_NOTFOUND: printf("NOT FOUND!\n"); break; case ISC_R_NOMEMORY: printf("OUT OF MEMORY!\n"); break; default: printf("UNEXPECTED RESULT\n"); } delete_name(name, NULL); } } else if (CMDCHECK("check")) { /* * Or "chain". I know, I know. Lame name. * I was having a hard time thinking of a * name (especially one that did not have * a conflicting first letter with another * command) that would differentiate this * from the search command. * * But it is just a test program, eh? */ name = create_name(arg); if (name != NULL) { detail(rbt, name); delete_name(name, NULL); } } else if (CMDCHECK("forward")) { iterate(rbt, ISC_TRUE); } else if (CMDCHECK("backward")) { iterate(rbt, ISC_FALSE); } else if (CMDCHECK("print")) { if (arg == NULL || *arg == '\0') dns_rbt_printall(rbt); else printf("usage: print\n"); } else if (CMDCHECK("quit")) { if (arg == NULL || *arg == '\0') break; else printf("usage: quit\n"); } else { printf("a(dd) NAME, d(elete) NAME, " "s(earch) NAME, p(rint), or q(uit)\n"); } } } dns_rbt_destroy(&rbt); if (show_final_mem) isc_mem_stats(mctx, stderr); return (0); } bind9-9.9.5.dfsg/bin/tests/tasks/0002755000470500017500000000000012276444014016103 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/tasks/win32/0002755000470500017500000000000012271527124017044 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.vcxproj.user0000644000470500017500000000021712271526120023077 0ustar lamontlamont bind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.dsp.in0000644000470500017500000001051512271526120021624 0ustar lamontlamont# Microsoft Developer Studio Project File - Name="t_tasks" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "@PLATFORM@ (x86) Console Application" 0x0103 CFG=t_tasks - @PLATFORM@ Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "t_tasks.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_tasks.mak" CFG="t_tasks - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_tasks - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_tasks - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 @COPTX@ @COPTI@ /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD CPP /nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console @MACHINE@ # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/tests/win32/Release/libtests.lib /nologo /subsystem:console @MACHINE@ /out:"../../../../Build/Release/t_tasks.exe" !ELSEIF "$(CFG)" == "t_tasks - @PLATFORM@ Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" @COPTY@ /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/tests/include" /I "../../../../lib/bind9/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR /FD /GZ /c # SUBTRACT CPP /X @COPTY@ # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug @MACHINE@ /pdbtype:sept # ADD LINK32 @LIBXML2_LIB@ user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/tests/win32/Debug/libtests.lib /nologo /subsystem:console /map /debug @MACHINE@ /out:"../../../../Build/Debug/t_tasks.exe" /pdbtype:sept !ENDIF # Begin Target # Name "t_tasks - @PLATFORM@ Release" # Name "t_tasks - @PLATFORM@ Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\t_tasks.c # End Source File # End Group # End Target # End Project bind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.vcxproj.in0000644000470500017500000001457412271526120022542 0ustar lamontlamont Debug @PLATFORM@ Release @PLATFORM@ {2CB7B128-5954-4FAF-B5EA-501B23BB8054} Win32Proj t_tasks Application true MultiByte Application false true MultiByte true ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ false ..\..\..\..\Build\$(Configuration)\ .\$(Configuration)\ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb true .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) Level3 MaxSpeed true @INTRINSIC@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) OnlyExplicitInline false true .\$(Configuration)\$(TargetName).pch .\$(Configuration)\ .\$(Configuration)\ $(OutDir)$(TargetName).pdb .\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories) Console false true true ..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt) Default ..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories) @LIBXML2_LIB@libisc.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies) bind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.vcxproj.filters.in0000644000470500017500000000167512271526120024207 0ustar lamontlamont {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files bind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.mak.in0000644000470500017500000002370112271526120021607 0ustar lamontlamont# Microsoft Developer Studio Generated NMAKE File, Based on t_tasks.dsp !IF "$(CFG)" == "" CFG=t_tasks - @PLATFORM@ Debug !MESSAGE No configuration specified. Defaulting to t_tasks - @PLATFORM@ Debug. !ENDIF !IF "$(CFG)" != "t_tasks - @PLATFORM@ Release" && "$(CFG)" != "t_tasks - @PLATFORM@ Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "t_tasks.mak" CFG="t_tasks - @PLATFORM@ Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "t_tasks - @PLATFORM@ Release" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE "t_tasks - @PLATFORM@ Debug" (based on "@PLATFORM@ (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe LIBXML=@LIBXML2_LIB@ !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" _VC_MANIFEST_INC=0 _VC_MANIFEST_BASENAME=__VC80 !ELSE _VC_MANIFEST_INC=1 _VC_MANIFEST_BASENAME=__VC80.Debug !ENDIF #################################################### # Specifying name of temporary resource file used only in incremental builds: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res !else _VC_MANIFEST_AUTO_RES= !endif #################################################### # _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1 !endif #################################################### # _VC_MANIFEST_EMBED_DLL - command to embed manifest in DLL: !if "$(_VC_MANIFEST_INC)" == "1" #MT_SPECIAL_RETURN=1090650113 #MT_SPECIAL_SWITCH=-notify_resource_update MT_SPECIAL_RETURN=0 MT_SPECIAL_SWITCH= _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \ if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \ rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \ link $** /out:$@ $(LFLAGS) !else _VC_MANIFEST_EMBED_EXE= \ if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;2 !endif #################################################### # _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily: !if "$(_VC_MANIFEST_INC)" == "1" _VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \ $(_VC_MANIFEST_BASENAME).auto.rc \ $(_VC_MANIFEST_BASENAME).auto.manifest !else _VC_MANIFEST_CLEAN= !endif !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" OUTDIR=.\Release INTDIR=.\Release !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Release\t_tasks.exe" !ELSE ALL : "libtests - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" "..\..\..\..\Build\Release\t_tasks.exe" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libisc - @PLATFORM@ ReleaseCLEAN" "libtests - @PLATFORM@ ReleaseCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_tasks.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "..\..\..\..\Build\Release\t_tasks.exe" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MD /W3 @COPTX@ @COPTI@ /O2 /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/tests/include" /D "WIN32" /D "NDEBUG" /D "__STDC__" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\t_tasks.pch" @COPTY@ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_tasks.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Release/libisc.lib ../../../../lib/tests/win32/Release/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\t_tasks.pdb" @MACHINE@ /out:"../../../../Build/Release/t_tasks.exe" LINK32_OBJS= \ "$(INTDIR)\t_tasks.obj" \ "..\..\..\..\lib\isc\win32\Release\libisc.lib" \ "..\..\..\..\lib\tests\win32\Release\libtests.lib" "..\..\..\..\Build\Release\t_tasks.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ELSEIF "$(CFG)" == "t_tasks - @PLATFORM@ Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "..\..\..\..\Build\Debug\t_tasks.exe" "$(OUTDIR)\t_tasks.bsc" !ELSE ALL : "libtests - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" "..\..\..\..\Build\Debug\t_tasks.exe" "$(OUTDIR)\t_tasks.bsc" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"libisc - @PLATFORM@ DebugCLEAN" "libtests - @PLATFORM@ DebugCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\t_tasks.obj" -@erase "$(INTDIR)\t_tasks.sbr" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" -@erase "$(OUTDIR)\t_tasks.bsc" -@erase "$(OUTDIR)\t_tasks.map" -@erase "$(OUTDIR)\t_tasks.pdb" -@erase "..\..\..\..\Build\Debug\t_tasks.exe" -@erase "..\..\..\..\Build\Debug\t_tasks.ilk" -@$(_VC_MANIFEST_CLEAN) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=/nologo /MDd /W3 /Gm @COPTX@ @COPTI@ /ZI /Od /I "./" /I "../../../../" @LIBXML2_INC@ /I "../../../../lib/isc/win32" /I "../../../../lib/isc/win32/include" /I "../../../../lib/isc/include" /I "../../../../lib/tests/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "i386" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\t_tasks.bsc" BSC32_SBRS= \ "$(INTDIR)\t_tasks.sbr" "$(OUTDIR)\t_tasks.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=user32.lib advapi32.lib kernel32.lib ws2_32.lib ../../../../lib/isc/win32/Debug/libisc.lib ../../../../lib/tests/win32/Debug/libtests.lib $(LIBXML) /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\t_tasks.pdb" /map:"$(INTDIR)\t_tasks.map" /debug @MACHINE@ /out:"../../../../Build/Debug/t_tasks.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\t_tasks.obj" \ "..\..\..\..\lib\isc\win32\Debug\libisc.lib" \ "..\..\..\..\lib\tests\win32\Debug\libtests.lib" "..\..\..\..\Build\Debug\t_tasks.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << $(_VC_MANIFEST_EMBED_EXE) !ENDIF .c{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << !IF "$(NO_EXTERNAL_DEPS)" != "1" !IF EXISTS("t_tasks.dep") !INCLUDE "t_tasks.dep" !ELSE !MESSAGE Warning: cannot find "t_tasks.dep" !ENDIF !ENDIF !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" || "$(CFG)" == "t_tasks - @PLATFORM@ Debug" SOURCE=..\t_tasks.c !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" "$(INTDIR)\t_tasks.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "t_tasks - @PLATFORM@ Debug" "$(INTDIR)\t_tasks.obj" "$(INTDIR)\t_tasks.sbr" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" "libisc - @PLATFORM@ Release" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" cd "..\..\..\bin\tests\tasks\win32" "libisc - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\tasks\win32" !ELSEIF "$(CFG)" == "t_tasks - @PLATFORM@ Debug" "libisc - @PLATFORM@ Debug" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" cd "..\..\..\bin\tests\tasks\win32" "libisc - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\isc\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libisc.mak" CFG="libisc - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\tasks\win32" !ENDIF !IF "$(CFG)" == "t_tasks - @PLATFORM@ Release" "libtests - @PLATFORM@ Release" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" cd "..\..\..\bin\tests\tasks\win32" "libtests - @PLATFORM@ ReleaseCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Release" RECURSE=1 CLEAN cd "..\..\..\bin\tests\tasks\win32" !ELSEIF "$(CFG)" == "t_tasks - @PLATFORM@ Debug" "libtests - @PLATFORM@ Debug" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" cd "..\..\..\bin\tests\tasks\win32" "libtests - @PLATFORM@ DebugCLEAN" : cd "..\..\..\..\lib\tests\win32" $(MAKE) /$(MAKEFLAGS) /F ".\libtests.mak" CFG="libtests - @PLATFORM@ Debug" RECURSE=1 CLEAN cd "..\..\..\bin\tests\tasks\win32" !ENDIF !ENDIF #################################################### # Commands to generate initial empty manifest file and the RC file # that references it, and for generating the .res file: $(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc $(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest type <<$@ #include 1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest" << KEEP $(_VC_MANIFEST_BASENAME).auto.manifest : type <<$@ << KEEP bind9-9.9.5.dfsg/bin/tests/tasks/win32/t_tasks.dsw0000644000470500017500000000103312271526120021221 0ustar lamontlamontMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "t_tasks"=".\t_tasks.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### bind9-9.9.5.dfsg/bin/tests/tasks/Makefile.in0000644000470500017500000000321212271526120020136 0ustar lamontlamont# Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.34 2009/12/05 23:31:40 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${TEST_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = ISCLIBS = ../../../lib/isc/libisc.@A@ @DNS_CRYPTO_LIBS@ TAPIDEPLIBS = ../../../lib/tests/libt_api.@A@ ISCDEPLIBS = ../../../lib/isc/libisc.@A@ TAPILIBS = ../../../lib/tests/libt_api.@A@ DEPLIBS = ${TAPIDEPLIBS} ${ISCDEPLIBS} LIBS = ${TAPILIBS} ${ISCLIBS} @LIBS@ TARGETS = t_tasks@EXEEXT@ SRCS = t_tasks.c @BIND9_MAKE_RULES@ t_tasks@EXEEXT@: t_tasks.@O@ ${DEPLIBS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_tasks.@O@ ${LIBS} test: t_tasks@EXEEXT@ -@./t_tasks@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -a testhelp: @./t_tasks@EXEEXT@ -h clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/tasks/t_tasks.c0000644000470500017500000015324212271526120017716 0ustar lamontlamont/* * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: t_tasks.c,v 1.49 2011/07/27 07:45:55 marka Exp $ */ #include #include #include #ifdef HAVE_INTTYPES_H #include /* uintptr_t */ #endif #include #include #include #include #include #include #include #include #ifdef ISC_PLATFORM_USETHREADS isc_boolean_t threaded = ISC_TRUE; #else isc_boolean_t threaded = ISC_FALSE; #endif static int senders[4]; static void require_threads(void) { t_info("This test requires threads\n"); t_result(T_THREADONLY); return; } static void t1_callback(isc_task_t *task, isc_event_t *event) { int i; int j; UNUSED(task); j = 0; for (i = 0; i < 1000000; i++) j += 100; t_info("task %s\n", (char *)event->ev_arg); isc_event_free(&event); } static void t1_shutdown(isc_task_t *task, isc_event_t *event) { UNUSED(task); t_info("shutdown %s\n", (char *)event->ev_arg); isc_event_free(&event); } static void my_tick(isc_task_t *task, isc_event_t *event) { UNUSED(task); t_info("%s\n", (char *)event->ev_arg); isc_event_free(&event); } /* * Adapted from RTH's original task_test program */ static int t_tasks1(void) { char *p; isc_mem_t *mctx; isc_taskmgr_t *manager; isc_task_t *task1; isc_task_t *task2; isc_task_t *task3; isc_task_t *task4; isc_event_t *event; unsigned int workers; isc_timermgr_t *timgr; isc_timer_t *ti1; isc_timer_t *ti2; isc_result_t isc_result; isc_time_t absolute; isc_interval_t interval; manager = NULL; task1 = NULL; task2 = NULL; task3 = NULL; task4 = NULL; mctx = NULL; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); if (workers < 1) { t_info("Bad config value for ISC_TASK_WORKERS, %d\n", workers); return(T_UNRESOLVED); } isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %d\n", isc_result); return(T_UNRESOLVED); } isc_result = isc_taskmgr_create(mctx, workers, 0, &manager); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_create(manager, 0, &task1); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_create(manager, 0, &task2); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_create(manager, 0, &task3); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_create(manager, 0, &task4); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_onshutdown(task1, t1_shutdown, "1"); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_onshutdown(task2, t1_shutdown, "2"); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_onshutdown(task3, t1_shutdown, "3"); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown failed %d\n", isc_result); return(T_FAIL); } isc_result = isc_task_onshutdown(task4, t1_shutdown, "4"); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown failed %d\n", isc_result); return(T_FAIL); } timgr = NULL; isc_result = isc_timermgr_create(mctx, &timgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_timermgr_create %d\n", isc_result); return(T_UNRESOLVED); } ti1 = NULL; isc_time_settoepoch(&absolute); isc_interval_set(&interval, 1, 0); isc_result = isc_timer_create(timgr, isc_timertype_ticker, &absolute, &interval, task1, my_tick, "tick", &ti1); if (isc_result != ISC_R_SUCCESS) { t_info("isc_timer_create %d\n", isc_result); return(T_UNRESOLVED); } ti2 = NULL; isc_time_settoepoch(&absolute); isc_interval_set(&interval, 1, 0); isc_result = isc_timer_create(timgr, isc_timertype_ticker, &absolute, &interval, task2, my_tick, "tock", &ti2); if (isc_result != ISC_R_SUCCESS) { t_info("isc_timer_create %d\n", isc_result); return(T_UNRESOLVED); } #ifndef WIN32 sleep(2); #else Sleep(2000); #endif /* * Note: (void *)1 is used as a sender here, since some compilers * don't like casting a function pointer to a (void *). * * In a real use, it is more likely the sender would be a * structure (socket, timer, task, etc) but this is just a test * program. */ event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "1", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task1, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "2", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task2, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "3", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task3, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "4", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task4, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "2", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task2, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "3", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task3, &event); event = isc_event_allocate(mctx, (void *)1, 1, t1_callback, "4", sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(task4, &event); (void)isc_task_purge(task3, NULL, 0, 0); isc_task_detach(&task1); isc_task_detach(&task2); isc_task_detach(&task3); isc_task_detach(&task4); #ifndef WIN32 sleep(10); #else Sleep(10000); #endif isc_timer_detach(&ti1); isc_timer_detach(&ti2); isc_timermgr_destroy(&timgr); isc_taskmgr_destroy(&manager); isc_mem_destroy(&mctx); return(T_PASS); } static const char *a1 = "The task subsystem can create and manage tasks"; static void t1(void) { int result; t_assert("tasks", 1, T_REQUIRED, "%s", a1); result = t_tasks1(); t_result(result); } #define T2_NTASKS 10000 static isc_event_t *T2_event; static isc_taskmgr_t *T2_manager; static isc_mem_t *T2_mctx; static isc_condition_t T2_cv; static isc_mutex_t T2_mx; static int T2_done; static int T2_nprobs; static int T2_nfails; static int T2_ntasks; static void t2_shutdown(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); if (event->ev_arg != NULL) { isc_task_destroy((isc_task_t**) &event->ev_arg); } else { isc_result = isc_mutex_lock(&T2_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %d\n", isc_result); ++T2_nprobs; } T2_done = 1; isc_result = isc_condition_signal(&T2_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %d\n", isc_result); ++T2_nprobs; } isc_result = isc_mutex_unlock(&T2_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %d\n", isc_result); ++T2_nprobs; } isc_event_free(&T2_event); isc_taskmgr_destroy(&T2_manager); isc_mem_destroy(&T2_mctx); } } static void t2_callback(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; isc_task_t *newtask; ++T2_ntasks; if (T_debug && ((T2_ntasks % 100) == 0)) { t_info("T2_ntasks %d\n", T2_ntasks); } if (event->ev_arg) { event->ev_arg = (void *)(((uintptr_t) event->ev_arg) - 1); /* * Create a new task and forward the message. */ newtask = NULL; isc_result = isc_task_create(T2_manager, 0, &newtask); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); ++T2_nfails; return; } isc_result = isc_task_onshutdown(newtask, t2_shutdown, (void *)task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown failed %d\n", isc_result); ++T2_nfails; return; } isc_task_send(newtask, &event); } else { /* * Time to unwind, shutdown should perc back up. */ isc_task_destroy(&task); } } static int t_tasks2(void) { uintptr_t ntasks; int result; char *p; isc_event_t *event; unsigned int workers; isc_result_t isc_result; T2_manager = NULL; T2_done = 0; T2_nprobs = 0; T2_nfails = 0; T2_ntasks = 0; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); if (workers < 1) { t_info("Bad config value for ISC_TASK_WORKERS, %d\n", workers); return(T_UNRESOLVED); } p = t_getenv("ISC_TASKS_MIN"); if (p != NULL) ntasks = atoi(p); else ntasks = T2_NTASKS; if (ntasks == 0U) { t_info("Bad config value for ISC_TASKS_MIN, %lu\n", (unsigned long)ntasks); return(T_UNRESOLVED); } t_info("Testing with %lu tasks\n", (unsigned long)ntasks); isc_result = isc_mutex_init(&T2_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %d\n", isc_result); return(T_UNRESOLVED); } isc_result = isc_condition_init(&T2_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %d\n", isc_result); return(T_UNRESOLVED); } isc_result = isc_mem_create(0, 0, &T2_mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %d\n", isc_result); return(T_UNRESOLVED); } isc_result = isc_taskmgr_create(T2_mctx, workers, 0, &T2_manager); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %d\n", isc_result); return(T_FAIL); } T2_event = isc_event_allocate(T2_mctx, (void *)1, 1, t2_callback, (void *)ntasks, sizeof(*event)); if (T2_event == NULL) { t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_result = isc_mutex_lock(&T2_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %d\n", isc_result); return(T_UNRESOLVED); } t2_callback(NULL, T2_event); while (T2_done == 0) { isc_result = isc_condition_wait(&T2_cv, &T2_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_wait failed %d\n", isc_result); return(T_UNRESOLVED); } } result = T_UNRESOLVED; if ((T2_nfails == 0) && (T2_nprobs == 0)) result = T_PASS; else if (T2_nfails != 0) result = T_FAIL; return(result); } static const char *a2 = "The task subsystem can create ISC_TASKS_MIN tasks"; static void t2(void) { t_assert("tasks", 2, T_REQUIRED, "%s", a2); if (threaded) t_result(t_tasks2()); else require_threads(); } #define T3_NEVENTS 256 static int T3_flag; static int T3_nevents; static int T3_nsdevents; static isc_mutex_t T3_mx; static isc_condition_t T3_cv; static int T3_nfails; static int T3_nprobs; static void t3_sde1(isc_task_t *task, isc_event_t *event) { UNUSED(task); if (T3_nevents != T3_NEVENTS) { t_info("Some events were not processed\n"); ++T3_nprobs; } if (T3_nsdevents == 1) { ++T3_nsdevents; } else { t_info("Shutdown events not processed in LIFO order\n"); ++T3_nfails; } isc_event_free(&event); } static void t3_sde2(isc_task_t *task, isc_event_t *event) { UNUSED(task); if (T3_nevents != T3_NEVENTS) { t_info("Some events were not processed\n"); ++T3_nprobs; } if (T3_nsdevents == 0) { ++T3_nsdevents; } else { t_info("Shutdown events not processed in LIFO order\n"); ++T3_nfails; } isc_event_free(&event); } static void t3_event1(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T3_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T3_nprobs; } while (T3_flag != 1) { (void) isc_condition_wait(&T3_cv, &T3_mx); } isc_result = isc_mutex_unlock(&T3_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T3_nprobs; } isc_event_free(&event); } static void t3_event2(isc_task_t *task, isc_event_t *event) { UNUSED(task); ++T3_nevents; isc_event_free(&event); } static int t_tasks3(void) { int cnt; int result; char *p; isc_mem_t *mctx; isc_taskmgr_t *tmgr; isc_task_t *task; unsigned int workers; isc_event_t *event; isc_result_t isc_result; isc_eventtype_t event_type; T3_flag = 0; T3_nevents = 0; T3_nsdevents = 0; T3_nfails = 0; T3_nprobs = 0; event_type = 3; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_mutex_init(&T3_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_condition_init(&T3_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } tmgr = NULL; isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_mutex_lock(&T3_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } task = NULL; isc_result = isc_task_create(tmgr, 0, &task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %s\n", isc_result_totext(isc_result)); (void) isc_mutex_unlock(&T3_mx); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * This event causes the task to wait on T3_cv. */ event = isc_event_allocate(mctx, &senders[1], event_type, t3_event1, NULL, sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); (void) isc_mutex_unlock(&T3_mx); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_task_send(task, &event); /* * Now we fill up the task's event queue with some events. */ for (cnt = 0; cnt < T3_NEVENTS; ++cnt) { event = isc_event_allocate(mctx, &senders[1], event_type, t3_event2, NULL, sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); (void) isc_mutex_unlock(&T3_mx); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_task_send(task, &event); } /* * Now we register two shutdown events. */ isc_result = isc_task_onshutdown(task, t3_sde1, NULL); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_send failed %s\n", isc_result_totext(isc_result)); (void) isc_mutex_unlock(&T3_mx); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_task_onshutdown(task, t3_sde2, NULL); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_send failed %s\n", isc_result_totext(isc_result)); (void) isc_mutex_unlock(&T3_mx); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_task_shutdown(task); /* * Now we free the task by signaling T3_cv. */ T3_flag = 1; isc_result = isc_condition_signal(&T3_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T3_nprobs; } isc_result = isc_mutex_unlock(&T3_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T3_nprobs; } isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); if (T3_nsdevents != 2) { t_info("T3_nsdevents == %d, expected 2\n", T3_nsdevents); ++T3_nfails; } result = T_UNRESOLVED; if (T3_nfails != 0) result = T_FAIL; else if ((T3_nfails == 0) && (T3_nprobs == 0)) result = T_PASS; return(result); } static const char *a3 = "When isc_task_shutdown() is called, any shutdown " "events that have been requested via prior " "isc_task_onshutdown() calls are posted in " "LIFO order."; static void t3(void) { t_assert("tasks", 3, T_REQUIRED, "%s", a3); if (threaded) t_result(t_tasks3()); else require_threads(); } static isc_mutex_t T4_mx; static isc_condition_t T4_cv; static int T4_flag; static int T4_nprobs; static int T4_nfails; static void t4_event1(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T4_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T4_nprobs; } while (T4_flag != 1) { (void) isc_condition_wait(&T4_cv, &T4_mx); } isc_result = isc_mutex_unlock(&T4_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T4_nprobs; } isc_event_free(&event); } static void t4_sde(isc_task_t *task, isc_event_t *event) { UNUSED(task); /* * No-op. */ isc_event_free(&event); } static int t_tasks4(void) { int result; char *p; isc_mem_t *mctx; isc_taskmgr_t *tmgr; isc_task_t *task; unsigned int workers; isc_result_t isc_result; isc_eventtype_t event_type; isc_event_t *event; T4_nprobs = 0; T4_nfails = 0; T4_flag = 0; event_type = 4; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_mutex_init(&T4_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_condition_init(&T4_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T4_mx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } tmgr = NULL; isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T4_mx); (void) isc_condition_destroy(&T4_cv); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_mutex_lock(&T4_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T4_mx); (void) isc_condition_destroy(&T4_cv); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } task = NULL; isc_result = isc_task_create(tmgr, 0, &task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T4_mx); (void) isc_condition_destroy(&T4_cv); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * This event causes the task to wait on T4_cv. */ event = isc_event_allocate(mctx, &senders[1], event_type, t4_event1, NULL, sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); DESTROYLOCK(&T4_mx); isc_task_destroy(&task); (void) isc_condition_destroy(&T4_cv); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_task_send(task, &event); isc_task_shutdown(task); isc_result = isc_task_onshutdown(task, t4_sde, NULL); if (isc_result != ISC_R_SHUTTINGDOWN) { t_info("isc_task_onshutdown returned %s\n", isc_result_totext(isc_result)); ++T4_nfails; } /* * Release the task. */ T4_flag = 1; isc_result = isc_condition_signal(&T4_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T4_nprobs; } isc_result = isc_mutex_unlock(&T4_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T4_nprobs; } isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); (void) isc_condition_destroy(&T4_cv); DESTROYLOCK(&T4_mx); result = T_UNRESOLVED; if (T4_nfails != 0) result = T_FAIL; else if ((T4_nfails == 0) && (T4_nprobs == 0)) result = T_PASS; return(result); } static const char *a4 = "After isc_task_shutdown() has been called, any call to " "isc_task_onshutdown() will return ISC_R_SHUTTINGDOWN."; static void t4(void) { t_assert("tasks", 4, T_REQUIRED, "%s", a4); if (threaded) t_result(t_tasks4()); else require_threads(); } static int T7_nprobs; static int T7_eflag; static int T7_sdflag; static isc_mutex_t T7_mx; static isc_condition_t T7_cv; static int T7_nfails; static void t7_event1(isc_task_t *task, isc_event_t *event) { UNUSED(task); ++T7_eflag; isc_event_free(&event); } static void t7_sde(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T7_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T7_nprobs; } ++T7_sdflag; isc_result = isc_condition_signal(&T7_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T7_nprobs; } isc_result = isc_mutex_unlock(&T7_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T7_nprobs; } isc_event_free(&event); } static int t_tasks7(void) { int result; char *p; isc_mem_t *mctx; isc_taskmgr_t *tmgr; isc_task_t *task; unsigned int workers; isc_result_t isc_result; isc_eventtype_t event_type; isc_event_t *event; isc_time_t now; isc_interval_t interval; T7_nprobs = 0; T7_nfails = 0; T7_sdflag = 0; T7_eflag = 0; event_type = 7; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_mutex_init(&T7_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_condition_init(&T7_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } tmgr = NULL; isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_mutex_lock(&T7_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_FAIL); } task = NULL; isc_result = isc_task_create(tmgr, 0, &task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_FAIL); } isc_result = isc_task_onshutdown(task, t7_sde, NULL); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown returned %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } event = isc_event_allocate(mctx, &senders[1], event_type, t7_event1, NULL, sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_task_send(task, &event); isc_task_shutdown(task); isc_interval_set(&interval, 5, 0); while (T7_sdflag == 0) { isc_result = isc_time_nowplusinterval(&now, &interval); if (isc_result != ISC_R_SUCCESS) { t_info("isc_time_nowplusinterval failed %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_condition_waituntil(&T7_cv, &T7_mx, &now); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_waituntil returned %s\n", isc_result_totext(isc_result)); DESTROYLOCK(&T7_mx); (void) isc_condition_destroy(&T7_cv); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); return(T_FAIL); } } isc_result = isc_mutex_unlock(&T7_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T7_nprobs; } isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); (void) isc_condition_destroy(&T7_cv); DESTROYLOCK(&T7_mx); result = T_UNRESOLVED; if (T7_eflag == 0) ++T7_nfails; if (T7_nfails != 0) result = T_FAIL; else if ((T7_nfails == 0) && (T7_nprobs == 0)) result = T_PASS; return(result); } static const char *a7 = "A call to isc_task_create() creates a task that can " "receive events."; static void t7(void) { t_assert("tasks", 7, T_REQUIRED, "%s", a7); if (threaded) t_result(t_tasks7()); else require_threads(); } #define T10_SENDERCNT 3 #define T10_TYPECNT 4 #define T10_TAGCNT 5 #define T10_NEVENTS (T10_SENDERCNT*T10_TYPECNT*T10_TAGCNT) #define T_CONTROL 99999 static int T10_nprobs; static int T10_nfails; static int T10_startflag; static int T10_shutdownflag; static int T10_eventcnt; static isc_mutex_t T10_mx; static isc_condition_t T10_cv; static void *T10_purge_sender; static isc_eventtype_t T10_purge_type_first; static isc_eventtype_t T10_purge_type_last; static void *T10_purge_tag; static int T10_testrange; static void t10_event1(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } while (T10_startflag == 0) { isc_result = isc_condition_wait(&T10_cv, &T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } } isc_result = isc_mutex_unlock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } isc_event_free(&event); } static void t10_event2(isc_task_t *task, isc_event_t *event) { int sender_match; int type_match; int tag_match; UNUSED(task); sender_match = 0; type_match = 0; tag_match = 0; if (T_debug) { t_info("Event %p,%d,%p,%s\n", event->ev_sender, (int)event->ev_type, event->ev_tag, event->ev_attributes & ISC_EVENTATTR_NOPURGE ? "NP" : "P"); } if ((T10_purge_sender == NULL) || (T10_purge_sender == event->ev_sender)) { sender_match = 1; } if (T10_testrange == 0) { if (T10_purge_type_first == event->ev_type) { type_match = 1; } } else { if ((T10_purge_type_first <= event->ev_type) && (event->ev_type <= T10_purge_type_last)) { type_match = 1; } } if ((T10_purge_tag == NULL) || (T10_purge_tag == event->ev_tag)) { tag_match = 1; } if (sender_match && type_match && tag_match) { if (event->ev_attributes & ISC_EVENTATTR_NOPURGE) { t_info("event %p,%d,%p matched but was not purgable\n", event->ev_sender, (int)event->ev_type, event->ev_tag); ++T10_eventcnt; } else { t_info("*** event %p,%d,%p not purged\n", event->ev_sender, (int)event->ev_type, event->ev_tag); } } else { ++T10_eventcnt; } isc_event_free(&event); } static void t10_sde(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } ++T10_shutdownflag; isc_result = isc_condition_signal(&T10_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } isc_result = isc_mutex_unlock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T10_nprobs; } isc_event_free(&event); } static void t_taskpurge_x(int sender, int type, int tag, void *purge_sender, int purge_type_first, int purge_type_last, void *purge_tag, int exp_nevents, int *nfails, int *nprobs, int testrange) { char *p; isc_mem_t *mctx; isc_taskmgr_t *tmgr; isc_task_t *task; unsigned int workers; isc_result_t isc_result; isc_event_t *event; isc_time_t now; isc_interval_t interval; int sender_cnt; int type_cnt; int tag_cnt; int event_cnt; int cnt; int nevents; isc_event_t *eventtab[T10_NEVENTS]; T10_startflag = 0; T10_shutdownflag = 0; T10_eventcnt = 0; T10_purge_sender = purge_sender; T10_purge_type_first = (isc_eventtype_t) purge_type_first; T10_purge_type_last = (isc_eventtype_t) purge_type_last; T10_purge_tag = purge_tag; T10_testrange = testrange; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); ++*nprobs; return; } isc_result = isc_mutex_init(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); ++*nprobs; return; } isc_result = isc_condition_init(&T10_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); ++*nprobs; return; } tmgr = NULL; isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } task = NULL; isc_result = isc_task_create(tmgr, 0, &task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %s\n", isc_result_totext(isc_result)); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } isc_result = isc_task_onshutdown(task, t10_sde, NULL); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown returned %s\n", isc_result_totext(isc_result)); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } /* * Block the task on T10_cv. */ event = isc_event_allocate(mctx, (void *)1, (isc_eventtype_t)T_CONTROL, t10_event1, NULL, sizeof(*event)); if (event == NULL) { t_info("isc_event_allocate failed\n"); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } isc_task_send(task, &event); /* * Fill the task's queue with some messages with varying * sender, type, tag, and purgable attribute values. */ event_cnt = 0; for (sender_cnt = 0; sender_cnt < T10_SENDERCNT; ++sender_cnt) { for (type_cnt = 0; type_cnt < T10_TYPECNT; ++type_cnt) { for (tag_cnt = 0; tag_cnt < T10_TAGCNT; ++tag_cnt) { eventtab[event_cnt] = isc_event_allocate(mctx, &senders[sender + sender_cnt], (isc_eventtype_t)(type + type_cnt), t10_event2, NULL, sizeof(*event)); if (eventtab[event_cnt] == NULL) { t_info("isc_event_allocate failed\n"); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } eventtab[event_cnt]->ev_tag = (void *)((uintptr_t)tag + tag_cnt); /* * Make all odd message non-purgable. */ if ((sender_cnt % 2) && (type_cnt %2) && (tag_cnt %2)) eventtab[event_cnt]->ev_attributes |= ISC_EVENTATTR_NOPURGE; ++event_cnt; } } } for (cnt = 0; cnt < event_cnt; ++cnt) isc_task_send(task, &eventtab[cnt]); if (T_debug) t_info("%d events queued\n", cnt); if (testrange == 0) { /* * We're testing isc_task_purge. */ nevents = isc_task_purge(task, purge_sender, (isc_eventtype_t)purge_type_first, purge_tag); if (nevents != exp_nevents) { t_info("*** isc_task_purge returned %d, expected %d\n", nevents, exp_nevents); ++*nfails; } else if (T_debug) t_info("isc_task_purge returned %d\n", nevents); } else { /* * We're testing isc_task_purgerange. */ nevents = isc_task_purgerange(task, purge_sender, (isc_eventtype_t)purge_type_first, (isc_eventtype_t)purge_type_last, purge_tag); if (nevents != exp_nevents) { t_info("*** isc_task_purgerange returned %d, " "expected %d\n", nevents, exp_nevents); ++*nfails; } else if (T_debug) t_info("isc_task_purgerange returned %d\n", nevents); } isc_result = isc_mutex_lock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } /* * Unblock the task, allowing event processing. */ T10_startflag = 1; isc_result = isc_condition_signal(&T10_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++*nprobs; } isc_task_shutdown(task); isc_interval_set(&interval, 5, 0); /* * Wait for shutdown processing to complete. */ while (T10_shutdownflag == 0) { isc_result = isc_time_nowplusinterval(&now, &interval); if (isc_result != ISC_R_SUCCESS) { t_info("isc_time_nowplusinterval failed %s\n", isc_result_totext(isc_result)); isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nprobs; return; } isc_result = isc_condition_waituntil(&T10_cv, &T10_mx, &now); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_waituntil returned %s\n", isc_result_totext(isc_result)); isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); ++*nfails; return; } } isc_result = isc_mutex_unlock(&T10_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++*nprobs; } isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T10_mx); (void) isc_condition_destroy(&T10_cv); if (T_debug) t_info("task processed %d events\n", T10_eventcnt); if ((T10_eventcnt + nevents) != event_cnt) { t_info("*** processed %d, purged %d, total %d\n", T10_eventcnt, nevents, event_cnt); ++*nfails; } } static int t_tasks10(void) { int result; T10_nprobs = 0; T10_nfails = 0; /* * Try purging on a specific sender. */ t_info("testing purge on 2,4,8 expecting 1\n"); t_taskpurge_x(1, 4, 7, &senders[2], 4, 4, (void *)8, 1, &T10_nfails, &T10_nprobs, 0); /* * Try purging on all senders. */ t_info("testing purge on 0,4,8 expecting 3\n"); t_taskpurge_x(1, 4, 7, NULL, 4, 4, (void *)8, 3, &T10_nfails, &T10_nprobs, 0); /* * Try purging on all senders, specified type, all tags. */ t_info("testing purge on 0,4,0 expecting 15\n"); t_taskpurge_x(1, 4, 7, NULL, 4, 4, NULL, 15, &T10_nfails, &T10_nprobs, 0); /* * Try purging on a specified tag, no such type. */ t_info("testing purge on 0,99,8 expecting 0\n"); t_taskpurge_x(1, 4, 7, NULL, 99, 99, (void *)8, 0, &T10_nfails, &T10_nprobs, 0); /* * Try purging on specified sender, type, all tags. */ t_info("testing purge on 0,5,0 expecting 5\n"); t_taskpurge_x(1, 4, 7, &senders[3], 5, 5, NULL, 5, &T10_nfails, &T10_nprobs, 0); result = T_UNRESOLVED; if ((T10_nfails == 0) && (T10_nprobs == 0)) result = T_PASS; else if (T10_nfails != 0) result = T_FAIL; return(result); } static const char *a10 = "A call to isc_task_purge(task, sender, type, tag) " "purges all events of type 'type' and with tag 'tag' " "not marked as unpurgable from sender from the task's " "queue and returns the number of events purged."; static void t10(void) { t_assert("tasks", 10, T_REQUIRED, "%s", a10); if (threaded) t_result(t_tasks10()); else require_threads(); } static int T11_nprobs; static int T11_nfails; static int T11_startflag; static int T11_shutdownflag; static int T11_eventcnt; static isc_mutex_t T11_mx; static isc_condition_t T11_cv; static void t11_event1(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } while (T11_startflag == 0) { isc_result = isc_condition_wait(&T11_cv, &T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } } isc_result = isc_mutex_unlock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_event_free(&event); } static void t11_event2(isc_task_t *task, isc_event_t *event) { UNUSED(task); ++T11_eventcnt; isc_event_free(&event); } static void t11_sde(isc_task_t *task, isc_event_t *event) { isc_result_t isc_result; UNUSED(task); isc_result = isc_mutex_lock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } ++T11_shutdownflag; isc_result = isc_condition_signal(&T11_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_result = isc_mutex_unlock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_event_free(&event); } static int t_tasks11(int purgable) { char *p; isc_mem_t *mctx; isc_taskmgr_t *tmgr; isc_task_t *task; isc_boolean_t rval; unsigned int workers; isc_result_t isc_result; isc_event_t *event1; isc_event_t *event2, *event2_clone; isc_time_t now; isc_interval_t interval; int result; T11_startflag = 0; T11_shutdownflag = 0; T11_eventcnt = 0; workers = 2; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_mutex_init(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_condition_init(&T11_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_init failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); return(T_UNRESOLVED); } tmgr = NULL; isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); return(T_UNRESOLVED); } task = NULL; isc_result = isc_task_create(tmgr, 0, &task); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %s\n", isc_result_totext(isc_result)); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); return(T_UNRESOLVED); } isc_result = isc_task_onshutdown(task, t11_sde, NULL); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_onshutdown returned %s\n", isc_result_totext(isc_result)); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); return(T_UNRESOLVED); } /* * Block the task on T11_cv. */ event1 = isc_event_allocate(mctx, (void *)1, (isc_eventtype_t)1, t11_event1, NULL, sizeof(*event1)); if (event1 == NULL) { t_info("isc_event_allocate failed\n"); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); return(T_UNRESOLVED); } isc_task_send(task, &event1); event2 = isc_event_allocate(mctx, (void *)1, (isc_eventtype_t)1, t11_event2, NULL, sizeof(*event2)); if (event2 == NULL) { t_info("isc_event_allocate failed\n"); isc_task_destroy(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); return(T_UNRESOLVED); } event2_clone = event2; if (purgable) event2->ev_attributes &= ~ISC_EVENTATTR_NOPURGE; else event2->ev_attributes |= ISC_EVENTATTR_NOPURGE; isc_task_send(task, &event2); rval = isc_task_purgeevent(task, event2_clone); if (rval != (purgable ? ISC_TRUE : ISC_FALSE)) { t_info("isc_task_purgeevent returned %s, expected %s\n", (rval ? "ISC_TRUE" : "ISC_FALSE"), (purgable ? "ISC_TRUE" : "ISC_FALSE")); ++T11_nfails; } isc_result = isc_mutex_lock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_lock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } /* * Unblock the task, allowing event processing. */ T11_startflag = 1; isc_result = isc_condition_signal(&T11_cv); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_signal failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_task_shutdown(task); isc_interval_set(&interval, 5, 0); /* * Wait for shutdown processing to complete. */ while (T11_shutdownflag == 0) { isc_result = isc_time_nowplusinterval(&now, &interval); if (isc_result != ISC_R_SUCCESS) { t_info("isc_time_nowplusinterval failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_result = isc_condition_waituntil(&T11_cv, &T11_mx, &now); if (isc_result != ISC_R_SUCCESS) { t_info("isc_condition_waituntil returned %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } } isc_result = isc_mutex_unlock(&T11_mx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mutex_unlock failed %s\n", isc_result_totext(isc_result)); ++T11_nprobs; } isc_task_detach(&task); isc_taskmgr_destroy(&tmgr); isc_mem_destroy(&mctx); DESTROYLOCK(&T11_mx); (void) isc_condition_destroy(&T11_cv); if (T11_eventcnt != (purgable ? 0 : 1)) { t_info("Event was %s purged\n", (purgable ? "not" : "unexpectedly")); ++T11_nfails; } result = T_UNRESOLVED; if ((T11_nfails == 0) && (T11_nprobs == 0)) result = T_PASS; else if (T11_nfails) result = T_FAIL; return(result); } static const char *a11 = "When the event is marked as purgable, a call to " "isc_task_purgeevent(task, event) purges the event 'event' " "from the task's queue and returns ISC_TRUE."; static void t11(void) { t_assert("tasks", 11, T_REQUIRED, "%s", a11); if (threaded) t_result(t_tasks11(1)); else require_threads(); } static const char *a12 = "When the event is not marked as purgable, a call to " "isc_task_purgeevent(task, event) does not purge the " "event 'event' from the task's queue and returns " "ISC_FALSE."; static int t_tasks12(void) { return(t_tasks11(0)); } static void t12(void) { t_assert("tasks", 12, T_REQUIRED, "%s", a12); if (threaded) t_result(t_tasks12()); else require_threads(); } static int T13_nfails; static int T13_nprobs; static const char *a13 = "A call to " "isc_event_purgerange(task, sender, first, last, tag) " "purges all events not marked unpurgable from " "sender 'sender' and of type within the range 'first' " "to 'last' inclusive from the task's event queue and " "returns the number of tasks purged."; static int t_tasks13(void) { int result; T13_nfails = 0; T13_nprobs = 0; /* * First let's try the same cases we used in t10. */ /* * Try purging on a specific sender. */ t_info("testing purge on 2,4,8 expecting 1\n"); t_taskpurge_x(1, 4, 7, &senders[2], 4, 4, (void *)8, 1, &T13_nfails, &T13_nprobs, 1); /* * Try purging on all senders. */ t_info("testing purge on 0,4,8 expecting 3\n"); t_taskpurge_x(1, 4, 7, NULL, 4, 4, (void *)8, 3, &T13_nfails, &T13_nprobs, 1); /* * Try purging on all senders, specified type, all tags. */ t_info("testing purge on 0,4,0 expecting 15\n"); t_taskpurge_x(1, 4, 7, NULL, 4, 4, NULL, 15, &T13_nfails, &T13_nprobs, 1); /* * Try purging on a specified tag, no such type. */ t_info("testing purge on 0,99,8 expecting 0\n"); t_taskpurge_x(1, 4, 7, NULL, 99, 99, (void *)8, 0, &T13_nfails, &T13_nprobs, 1); /* * Try purging on specified sender, type, all tags. */ t_info("testing purge on 3,5,0 expecting 5\n"); t_taskpurge_x(1, 4, 7, &senders[3], 5, 5, 0, 5, &T13_nfails, &T13_nprobs, 1); /* * Now let's try some ranges. */ t_info("testing purgerange on 2,4-5,8 expecting 2\n"); t_taskpurge_x(1, 4, 7, &senders[2], 4, 5, (void *)8, 1, &T13_nfails, &T13_nprobs, 1); /* * Try purging on all senders. */ t_info("testing purge on 0,4-5,8 expecting 5\n"); t_taskpurge_x(1, 4, 7, NULL, 4, 5, (void *)8, 5, &T13_nfails, &T13_nprobs, 1); /* * Try purging on all senders, specified type, all tags. */ t_info("testing purge on 0,5-6,0 expecting 28\n"); t_taskpurge_x(1, 4, 7, NULL, 5, 6, NULL, 28, &T13_nfails, &T13_nprobs, 1); /* * Try purging on a specified tag, no such type. */ t_info("testing purge on 0,99-101,8 expecting 0\n"); t_taskpurge_x(1, 4, 7, NULL, 99, 101, (void *)8, 0, &T13_nfails, &T13_nprobs, 1); /* * Try purging on specified sender, type, all tags. */ t_info("testing purge on 3,5-6,0 expecting 10\n"); t_taskpurge_x(1, 4, 7, &senders[3], 5, 6, NULL, 10, &T13_nfails, &T13_nprobs, 1); result = T_UNRESOLVED; if ((T13_nfails == 0) && (T13_nprobs == 0)) result = T_PASS; else if (T13_nfails) result = T_FAIL; return (result); } static void t13(void) { t_assert("tasks", 13, T_REQUIRED, "%s", a13); if (threaded) t_result(t_tasks13()); else require_threads(); } #define T14_NTASKS 10 #define T14_EXCLTASK 6 int t14_exclusiveerror = ISC_R_SUCCESS; int t14_error = 0; int t14_done = 0; int spin(int n); int t14_active[T14_NTASKS]; static void t14_callback(isc_task_t *task, isc_event_t *event) { int taskno = *(int *)(event->ev_arg); t_info("task enter %d\n", taskno); if (taskno == T14_EXCLTASK) { int i; t14_exclusiveerror = isc_task_beginexclusive(task); if (t14_exclusiveerror == ISC_R_SUCCESS) t_info("task %d got exclusive access\n", taskno); else t_info("task %d failed to got exclusive access: %d\n", taskno, t14_exclusiveerror); for (i = 0; i < T14_NTASKS; i++) { t_info("task %d state %d\n", i , t14_active[i]); if (t14_active[i]) t14_error++; } isc_task_endexclusive(task); t14_done = 1; } else { t14_active[taskno]++; (void) spin(10000000); t14_active[taskno]--; } t_info("task exit %d\n", taskno); if (t14_done) { isc_mem_put(event->ev_destroy_arg, event->ev_arg, sizeof (int)); isc_event_free(&event); } else { isc_task_send(task, &event); } } int spin(int n) { int i; int r = 0; for (i = 0; i < n; i++) { r += i; if (r > 1000000) r = 0; } return (r); } static int t_tasks14(void) { char *p; isc_mem_t *mctx; isc_taskmgr_t *manager; isc_task_t *tasks[T14_NTASKS]; unsigned int workers; isc_result_t isc_result; int i; manager = NULL; mctx = NULL; for (i = 0; i < T14_NTASKS; i++) tasks[i] = NULL; workers = 4; p = t_getenv("ISC_TASK_WORKERS"); if (p != NULL) workers = atoi(p); if (workers < 1) { t_info("Bad config value for ISC_TASK_WORKERS, %d\n", workers); return(T_UNRESOLVED); } isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %d\n", isc_result); return(T_UNRESOLVED); } isc_result = isc_taskmgr_create(mctx, workers, 0, &manager); if (isc_result != ISC_R_SUCCESS) { t_info("isc_taskmgr_create failed %d\n", isc_result); return(T_FAIL); } for (i = 0; i < T14_NTASKS; i++) { isc_event_t *event; int *v; isc_result = isc_task_create(manager, 0, &tasks[i]); if (isc_result != ISC_R_SUCCESS) { t_info("isc_task_create failed %d\n", isc_result); return(T_FAIL); } v = isc_mem_get(mctx, sizeof *v); if (v == NULL) { isc_task_detach(&tasks[i]); t_info("isc_mem_get failed\n"); return(T_FAIL); } *v = i; event = isc_event_allocate(mctx, NULL, 1, t14_callback, v, sizeof(*event)); if (event == NULL) { isc_mem_put(mctx, v, sizeof *v); t_info("isc_event_allocate failed\n"); return(T_UNRESOLVED); } isc_task_send(tasks[i], &event); } for (i = 0; i < T14_NTASKS; i++) { isc_task_detach(&tasks[i]); } isc_taskmgr_destroy(&manager); if (t14_exclusiveerror != ISC_R_SUCCESS || t14_error) { if (t14_exclusiveerror != ISC_R_SUCCESS) t_info("isc_task_beginexclusive() failed\n"); if (t14_error) t_info("mutual access occurred\n"); return(T_FAIL); } isc_mem_destroy(&mctx); return(T_PASS); } static void t14(void) { int result; t_assert("tasks", 14, T_REQUIRED, "%s", "isc_task_beginexclusive() gets exclusive access"); result = t_tasks14(); t_result(result); } testspec_t T_testlist[] = { { (PFV) t1, "basic task subsystem" }, { (PFV) t2, "maxtasks" }, { (PFV) t3, "isc_task_shutdown" }, { (PFV) t4, "isc_task_shutdown" }, { (PFV) t7, "isc_task_create" }, { (PFV) t10, "isc_task_purge" }, { (PFV) t11, "isc_task_purgeevent" }, { (PFV) t12, "isc_task_purgeevent" }, { (PFV) t13, "isc_task_purgerange" }, { (PFV) t14, "isc_task_beginexclusive" }, { (PFV) 0, NULL } }; #ifdef WIN32 int main(int argc, char **argv) { t_settests(T_testlist); return (t_main(argc, argv)); } #endif bind9-9.9.5.dfsg/bin/tests/net/0002755000470500017500000000000012276444015015545 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/net/sockaddr_multicast.c0000644000470500017500000000217512271526120021564 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: sockaddr_multicast.c,v 1.8 2007/06/19 23:47:00 tbox Exp $ */ #include #include #include #include #include #include "driver.h" TESTDECL(sockaddr_multicast); test_result_t sockaddr_multicast(void) { return (PASSED); } bind9-9.9.5.dfsg/bin/tests/net/netaddr_multicast.c0000644000470500017500000000550312271526120021411 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: netaddr_multicast.c,v 1.12 2007/06/19 23:47:00 tbox Exp $ */ #include #include #include #include #include #include #include #include #include "driver.h" TESTDECL(netaddr_multicast); typedef struct { int family; const char *addr; isc_boolean_t is_multicast; } t_addr_t; static t_addr_t addrs[] = { { AF_INET, "1.2.3.4", ISC_FALSE }, { AF_INET, "4.3.2.1", ISC_FALSE }, { AF_INET, "224.1.1.1", ISC_TRUE }, { AF_INET, "1.1.1.244", ISC_FALSE }, { AF_INET6, "::1", ISC_FALSE }, { AF_INET6, "ff02::1", ISC_TRUE } }; #define NADDRS (sizeof(addrs) / sizeof(t_addr_t)) static isc_result_t to_netaddr(t_addr_t *, isc_netaddr_t *); static isc_result_t to_netaddr(t_addr_t *addr, isc_netaddr_t *na) { int r; struct in_addr in; struct in6_addr in6; switch (addr->family) { case AF_INET: r = inet_pton(AF_INET, addr->addr, (unsigned char *)&in); if (r != 1) return (ISC_R_FAILURE); isc_netaddr_fromin(na, &in); break; case AF_INET6: r = inet_pton(AF_INET6, addr->addr, (unsigned char *)&in6); if (r != 1) return (ISC_R_FAILURE); isc_netaddr_fromin6(na, &in6); break; default: return (ISC_R_UNEXPECTED); } return (ISC_R_SUCCESS); } test_result_t netaddr_multicast(void) { isc_netaddr_t na; unsigned int n_fail; t_addr_t *addr; unsigned int i; isc_result_t result; isc_boolean_t tf; n_fail = 0; for (i = 0; i < NADDRS; i++) { addr = &addrs[i]; result = to_netaddr(addr, &na); if (result != ISC_R_SUCCESS) { printf("I:to_netaddr() returned %s on item %u\n", isc_result_totext(result), i); return (UNKNOWN); } tf = isc_netaddr_ismulticast(&na); if (tf == addr->is_multicast) { printf("I:%s is%s multicast (PASSED)\n", (addr->addr), (tf ? "" : " not")); } else { printf("I:%s is%s multicast (FAILED)\n", (addr->addr), (tf ? "" : " not")); n_fail++; } } if (n_fail > 0) return (FAILED); return (PASSED); } bind9-9.9.5.dfsg/bin/tests/net/Makefile.in0000644000470500017500000000310212271526120017575 0ustar lamontlamont# Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000-2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.19 2009/12/05 23:31:40 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${TEST_INCLUDES} ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = ISCLIBS = ../../../lib/isc/libisc.@A@ ISCDEPLIBS = ../../../lib/isc/libisc.@A@ DEPLIBS = ${ISCDEPLIBS} LIBS = ${ISCLIBS} @LIBS@ TARGETS = t_net@EXEEXT@ SRCS = driver.c netaddr_multicast.c sockaddr_multicast.c OBJS = driver.@O@ netaddr_multicast.@O@ sockaddr_multicast.@O@ @BIND9_MAKE_RULES@ t_net@EXEEXT@: ${OBJS} ${DEPLIBS} ${TLIB} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS} ${TLIB} ${LIBS} test: t_net@EXEEXT@ -@./t_net@EXEEXT@ clean distclean:: rm -f ${TARGETS} rm -f ${OBJS} bind9-9.9.5.dfsg/bin/tests/net/driver.h0000644000470500017500000000322012271526120017175 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: driver.h,v 1.8 2007/06/19 23:47:00 tbox Exp $ */ /* * PASSED and FAILED mean the particular test passed or failed. * * UNKNOWN means that for one reason or another, the test process itself * failed. For instance, missing files, error when parsing files or * IP addresses, etc. That is, the test itself is broken, not what is * being tested. * * UNTESTED means the test was unable to be run because a prerequisite test * failed, the test is disabled, or the test needs a system component * (for instance, Perl) and cannot run. */ typedef enum { PASSED = 0, FAILED = 1, UNKNOWN = 2, UNTESTED = 3 } test_result_t; typedef test_result_t (*test_func_t)(void); typedef struct { const char *tag; const char *description; test_func_t func; } test_t; #define TESTDECL(name) test_result_t name(void) bind9-9.9.5.dfsg/bin/tests/net/testsuite.h0000644000470500017500000000237512271526120017745 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: testsuite.h,v 1.7 2007/06/19 23:47:00 tbox Exp $ */ #define SUITENAME "net" TESTDECL(netaddr_multicast); TESTDECL(sockaddr_multicast); static test_t tests[] = { { "isc_netaddr_ismulticast", "Checking to see if multicast addresses are detected properly", netaddr_multicast }, { "isc_sockaddr_ismulticast", "Checking to see if multicast addresses are detected properly", sockaddr_multicast }, }; bind9-9.9.5.dfsg/bin/tests/net/driver.c0000644000470500017500000000434112271526120017175 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: driver.c,v 1.11 2007/06/19 23:47:00 tbox Exp $ */ #include #include #include #include #include #include #include "driver.h" #include "testsuite.h" #define NTESTS (sizeof(tests) / sizeof(test_t)) const char *gettime(void); const char *test_result_totext(test_result_t); /* * Not thread safe. */ const char * gettime(void) { static char now[512]; time_t t; (void)time(&t); strftime(now, sizeof(now) - 1, "%A %d %B %H:%M:%S %Y", localtime(&t)); return (now); } const char * test_result_totext(test_result_t result) { const char *s; switch (result) { case PASSED: s = "PASS"; break; case FAILED: s = "FAIL"; break; case UNTESTED: s = "UNTESTED"; break; case UNKNOWN: default: s = "UNKNOWN"; break; } return (s); } int main(int argc, char **argv) { test_t *test; test_result_t result; unsigned int n_failed; unsigned int testno; UNUSED(argc); UNUSED(argv); printf("S:%s:%s\n", SUITENAME, gettime()); n_failed = 0; for (testno = 0; testno < NTESTS; testno++) { test = &tests[testno]; printf("T:%s:%u:A\n", test->tag, testno + 1); printf("A:%s\n", test->description); result = test->func(); printf("R:%s\n", test_result_totext(result)); if (result != PASSED) n_failed++; } printf("E:%s:%s\n", SUITENAME, gettime()); if (n_failed > 0) exit(1); return (0); } bind9-9.9.5.dfsg/bin/tests/Kchild.example.+003+04017.key0000644000470500017500000000050012271526120021326 0ustar lamontlamontchild.example. IN KEY 256 3 3 ALeiYGFXbil6PgHnkm5ZE67ygEVDvGT/gqZmLH7tGboofcPSfyhh1hpw dxZgJ26d/gynWMGVSYzaXfzsxpPoNeYn+qeevQoJOaxXXlfcy8Ik52Rm eW0J9mWlf9hsD7ShIhh1+0kRYGCOCaU25wIe3SLVkN3HgqiCBDYnBY0u nMkqRadiUnoEa3Tcvc9kJx9r9gDstR2A9A5sBhFLI/XQ0gViHHLVpQ4x hz+rTLb/xrBoAb5sQJT3xUjhhdNo9HuL6kwdLdSu//PCl1QnY9NpYPVV SKUo bind9-9.9.5.dfsg/bin/tests/named.conf0000644000470500017500000003750612271526120016714 0ustar lamontlamont/* * Copyright (C) 2004, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.60 2011/03/03 23:47:31 tbox Exp $ */ /* * This is a worthless, nonrunnable example of a named.conf file that has * every conceivable syntax element in use. We use it to test the parser. * It could also be used as a conceptual template for users of new features. */ /* * C-style comments are OK */ // So are C++-style comments # So are shell-style comments // watch out for ";" -- it's important! options { additional-from-auth true; additional-from-cache false; version "my version string"; random-device "/dev/random"; directory "/tmp"; port 666; sig-validity-interval 33; # Obsolete named-xfer "/usr/libexec/named-xfer"; // _PATH_XFER dump-file "named_dump.db"; // _PATH_DUMPFILE pid-file "/var/run/named.pid"; // _PATH_PIDFILE statistics-file "named.stats"; // _PATH_STATS memstatistics-file "named.memstats"; // _PATH_MEMSTATS max-cache-ttl 999; auth-nxdomain yes; // always set AA on NXDOMAIN. // don't set this to 'no' unless // you know what you're doing -- older // servers won't like it. # Obsolete deallocate-on-exit no; dialup yes; # Obsolete fake-iquery no; fetch-glue yes; has-old-clients yes; host-statistics no; # Obsolete multiple-cnames no; // if yes, then a name my have more // than one CNAME RR. This use // is non-standard and is not // recommended, but it is available // because previous releases supported // it and it was used by large sites // for load balancing. notify yes; // send NOTIFY messages. You can set // notify on a zone-by-zone // basis in the "zone" statement // see (below) recursion yes; rfc2308-type1 no; # Obsolete use-id-pool yes; # Obsolete treat-cr-as-space yes; also-notify { 10.0.2.3; }; // The "forward" option is only meaningful if you've defined // forwarders. "first" gives the normal BIND // forwarding behavior, i.e. ask the forwarders first, and if that // doesn't work then do the full lookup. You can also say // "forward only;" which is what used to be specified with // "slave" or "options forward-only". "only" will never attempt // a full lookup; only the forwarders will be used. forward first; forwarders { 1.2.3.4; 5.6.7.8; }; check-names master fail; check-names slave warn; check-names response ignore; allow-query { any; }; allow-transfer { any; }; allow-recursion { !any; }; blackhole { 45/24; }; listen-on { 10/24; 10.0.0.3; }; listen-on port 53 { any; }; listen-on { 5.6.7.8; }; listen-on port 1234 { !1.2.3.4; 1.2.3/24; }; listen-on-v6 { 1:1:1:1:1:1:1:1; }; listen-on-v6 port 777 { 2:2:2:2:2:2:2:2; }; query-source-v6 address 8:7:6:5:4:3:2:1 port *; query-source port * address 10.0.0.54 ; lame-ttl 444; max-transfer-time-in 300; max-transfer-time-out 10; max-transfer-idle-in 100; max-transfer-idle-out 11; max-retry-time 1234; min-retry-time 1111; max-refresh-time 888; min-refresh-time 777; max-ncache-ttl 333; min-roots 15; serial-queries 34; transfer-format one-answer; transfers-in 10; transfers-per-ns 2; transfers-out 0; transfer-source 10.0.0.5; transfer-source-v6 4:3:2:1:5:6:7:8; request-ixfr yes; provide-ixfr yes; # Now called 'provide-ixfr' # maintain-ixfr-base no; // If yes, keep transaction log file for IXFR max-ixfr-log-size 20m; coresize 100; datasize 101; files 230; max-cache-size 1m; stacksize 231; cleaning-interval 1000; heartbeat-interval 1001; interface-interval 1002; statistics-interval 1003; topology { 10/8; !1.2.3/24; { 1.2/16; 3/8; }; }; sortlist { 10/8; 11/8; }; tkey-domain "foo.com"; tkey-dhkey "xyz" 666 ; rrset-order { class IN type A name "foo" order random; order cyclic; }; }; /* * Control listeners, for "ndc". Every nameserver needs at least one. */ controls { // 'inet' lines without a 'port' defaults to 'port 953' // 'keys' must be used and the list must have at least one entry inet * port 52 allow { any; } keys { "key2"; }; unix "/var/run/ndc" perm 0600 owner 0 group 0; // ignored by named. inet 10.0.0.1 allow { any; key foo; } keys { "key4";}; inet 10.0.0.2 allow { none; } keys { "key-1"; "key-2"; }; inet 10.0.0.2 allow { none; }; }; zone "master.demo.zone" { type master; // what used to be called "primary" database "somedb -option1 -option2 arg1 arg2 arg3"; file "master.demo.zone"; check-names fail; allow-update { none; }; allow-update-forwarding { 10.0.0.5; !any; }; allow-transfer { any; }; allow-query { any; }; sig-validity-interval 990; notify explicit; also-notify { 1.0.0.1; }; // don't notify any nameservers other // than those on the NS list for this // zone forward first; forwarders { 10.0.0.3; 1:2:3:4:5:6:7:8; }; }; zone "slave.demo.zone" { type slave; // what used to be called "secondary" file "slave.demo.zone"; ixfr-base "slave.demo.zone.ixfr"; // File name for IXFR transaction log file masters { 1.2.3.4 port 10 key "foo"; // where to zone transfer from 5.6.7.8; 6.7.8.9 key "zippo"; }; transfer-source 10.0.0.53; // fixes multihoming problems check-names warn; allow-update { none; }; allow-transfer { any; }; allow-update-forwarding { any; }; allow-query { any; }; max-transfer-time-in 120; // if not set, global option is used. max-transfer-time-out 1; // if not set, global option is used. max-transfer-idle-in 2; // if not set, global option is used. max-transfer-idle-out 3; // if not set, global option is used. also-notify { 1.0.0.2; }; forward only; forwarders { 10.45.45.45; 10.0.0.3; 1:2:3:4:5:6:7:8; }; }; key "non-viewkey" { secret "YWFh" ; algorithm "zzz" ; }; view "test-view" in { key "viewkey" { algorithm "xxx" ; secret "eXl5" ; }; also-notify { 10.2.2.3; }; trusted-keys { foo.com. 4 3 2 "abdefghijklmnopqrstuvwxyz"; }; sig-validity-interval 45; max-cache-size 100000; allow-query { 10.0.0.30;}; additional-from-cache false; additional-from-auth no; match-clients { 10.0.0.1 ; }; check-names master warn; check-names slave ignore; check-names response fail; auth-nxdomain false; recursion true; provide-ixfr false; request-ixfr true; fetch-glue true; notify false; rfc2308-type1 false; transfer-source 10.0.0.55; transfer-source-v6 4:3:8:1:5:6:7:8; query-source port * address 10.0.0.54 ; query-source-v6 address 6:6:6:6:6:6:6:6 port *; max-transfer-time-out 45; max-transfer-idle-out 55; cleaning-interval 100; min-roots 3; lame-ttl 477; max-ncache-ttl 333; max-cache-ttl 777; transfer-format many-answers; max-retry-time 7; min-retry-time 4; max-refresh-time 999; min-refresh-time 111; zone "view-zone.com" { type master; allow-update-forwarding { 10.0.0.34;}; file "view-zone-master"; }; server 5.6.7.8 { keys "viewkey"; }; server 10.9.8.7 { keys "non-viewkey"; }; dialup yes; }; zone "stub.demo.zone" { type stub; // stub zones are like slave zones, // except that only the NS records // are transferred. dialup yes; file "stub.demo.zone"; masters { 1.2.3.4 ; // where to zone transfer from 5.6.7.8 port 999; }; check-names warn; allow-update { none; }; allow-transfer { any; }; allow-query { any; }; max-retry-time 10; min-retry-time 11; max-refresh-time 12; min-refresh-time 13; max-transfer-time-in 120; // if not set, global option is used. pubkey 257 255 1 "a useless key"; pubkey 257 255 1 "another useless key"; }; zone "." { type hint; // used to be specified w/ "cache" file "cache.db"; // pubkey 257 255 1 "AQP2fHpZ4VMpKo/jc9Fod821uyfY5p8j5h/Am0V/KpBTMZjdXmp9QJe6yFRoIIzkaNCgTIftASdpXGgCwFB2j2KXP/rick6gvEer5VcDEkLR5Q=="; }; trusted-keys { "." 257 255 1 "AQP2fHpZ4VMpKo/jc9Fod821uyfY5p8j5h/Am0V/KpBTMZjdXmp9QJe6yFRoIIzkaNCgTIftASdpXGgCwFB2j2KXP/rick6gvEer5VcDEkLR5Q=="; }; acl can_query { !1.2.3/24; any; }; // network 1.2.3.0 mask 255.255.255.0 // is disallowed; rest are OK acl can_axfr { 1.2.3.4; can_query; }; // host 1.2.3.4 and any host allowed // by can_query are OK zone "disabled-zone.com" { type master; file "bar"; max-retry-time 100; min-retry-time 110; max-refresh-time 120; min-refresh-time 130; }; zone "non-default-acl.demo.zone" { type master; file "foo"; allow-query { can_query; }; allow-transfer { can_axfr; }; allow-update { 1.2.3.4; 5.6.7.8; }; pubkey 666 665 664 "key of the beast"; // Errors trapped by parser: // identity or name not absolute // 'wildcard' match type and no wildcard character in name // // issues: // - certain rdatatype values (such as "key") are config file keywords and // must be quoted or a syntax error will occur. // update-policy { grant root.domain. subdomain host.domain. A MX CNAME; grant sub.root.domain. wildcard *.host.domain. A; grant root.domain. name host.domain. a ns md mf cname soa mb mg mr "null" wks ptr hinfo minfo mx txt rp afsdb x25 isdn rt nsap sig "key" px gpos aaaa loc nxt srv naptr kx cert a6 dname opt unspec uri tkey tsig ; grant foo.bar.com. self foo.bar.com. a; }; }; key sample_key { // for TSIG; supported by parser algorithm hmac-md5; // but not yet implemented in the secret "eW91ciBzZWNyZXQgaGVyZQ=="; // rest of the server }; key key2 { algorithm hmac-md5; secret "ZXJlaCB0ZXJjZXMgcm91eQ=="; }; acl key_acl { key sample_key; }; // a request signed with sample_key server 1.2.3.4 { request-ixfr no; provide-ixfr no; bogus no; // if yes, we won't query or listen // to this server transfer-format one-answer; // set transfer format for this // server (see the description of // 'transfer-format' above) // if not specified, the global option // will be used transfers 0; // not implemented keys { "sample_key" }; // for TSIG; supported by the parser // but not yet implemented in the // rest of the server # Now called 'request-ixfr' # support-ixfr yes; // for IXFR supported by server // if yes, the listed server talks IXFR }; logging { /* * All log output goes to one or more "channels"; you can make as * many of them as you want. */ channel syslog_errors { // this channel will send errors or syslog user; // or worse to syslog (user facility) severity error; }; channel stderr_errors { stderr; }; /* * Channels have a severity level. Messages at severity levels * greater than or equal to the channel's level will be logged on * the channel. In order of decreasing severity, the levels are: * * critical a fatal error * error * warning * notice a normal, but significant event * info an informational message * debug 1 the least detailed debugging info * ... * debug 99 the most detailed debugging info */ /* * Here are the built-in channels: * * channel default_syslog { * syslog daemon; * severity info; * }; * * channel default_debug { * file "named.run"; // note: stderr is used instead * // of "named.run" if the server * // is started with the "-f" * // option. * severity dynamic; // this means log debugging * // at whatever debugging level * // the server is at, and don't * // log anything if not * // debugging. * }; * * channel null { // this is the bit bucket; * file "/dev/null"; // any logging to this channel * // is discarded. * }; * * channel default_stderr { // writes to stderr * file ""; // this is illustrative only; * // there's currently no way * // of saying "stderr" in the * // configuration language. * // i.e. don't try this at home. * severity info; * }; * * default_stderr only works before the server daemonizes (i.e. * during initial startup) or when it is running in foreground * mode (-f command line option). */ /* * There are many categories, so you can send the logs * you want to see wherever you want, without seeing logs you * don't want. Right now the categories are * * default the catch-all. many things still * aren't classified into categories, and * they all end up here. also, if you * don't specify any channels for a * category, the default category is used * instead. * config high-level configuration file * processing * parser low-level configuration file processing * queries what used to be called "query logging" * lame-servers messages like "Lame server on ..." * statistics * panic if the server has to shut itself * down due to an internal problem, it * logs the problem here (as well as * in the problem's native category) * update dynamic update * ncache negative caching * xfer-in zone transfers we're receiving * xfer-out zone transfers we're sending * db all database operations * eventlib debugging info from the event system * (see below) * packet dumps of packets received and sent * (see below) * notify the NOTIFY protocol * cname messages like "XX points to a CNAME" * security approved/unapproved requests * os operating system problems * insist consistency check failures * maintenance periodic maintenance * load zone loading * response-checks messages like * "Malformed response ..." * "wrong ans. name ..." * "unrelated additional info ..." * "invalid RR type ..." * "bad referral ..." */ category parser { syslog_errors; // you can log to as many channels default_syslog; // as you want }; category lame-servers { null; }; // don't log these at all channel moderate_debug { file "foo"; // foo severity debug 3; // level 3 debugging to file print-time yes; // timestamp log entries print-category yes; // print category name print-severity yes; // print severity level /* * Note that debugging must have been turned on either * on the command line or with a signal to get debugging * output (non-debugging output will still be written to * this channel). */ }; channel another { file "bar" versions 99 size 10M; severity info; }; channel third { file "bar" size 100000 versions unlimited; severity debug; // use default debug level }; /* * If you don't want to see "zone XXXX loaded" messages but do * want to see any problems, you could do the following. */ channel no_info_messages { syslog; severity notice; }; category load { no_info_messages; }; /* * You can also define category "default"; it gets used when no * "category" statement has been given for a category. */ category default { default_syslog; moderate_debug; }; /* * If you don't define category default yourself, the default * default category will be used. It is * * category default { default_syslog; default_debug; }; */ /* * If you don't define category panic yourself, the default * panic category will be used. It is * * category panic { default_syslog; default_stderr; }; */ /* * Two categories, 'packet' and 'eventlib', are special. Only one * channel may be assigned to each of them, and it must be a * file channel. If you don't define them yourself, they default to * * category eventlib { default_debug; }; * * category packet { default_debug; }; */ }; #include "filename"; // can't do within a statement bind9-9.9.5.dfsg/bin/tests/system/0002755000470500017500000000000012276444015016303 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/addzone/0002755000470500017500000000000012276444015017727 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/addzone/tests.sh0000755000470500017500000002562712271526120021433 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.6 2011/06/17 23:47:49 tbox Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh DIGOPTS="+tcp +nosea +nostat +nocmd +norec +noques +noauth +noadd +nostats +dnssec -p 5300" status=0 n=0 echo "I:checking normally loaded zone ($n)" ret=0 $DIG $DIGOPTS @10.53.0.2 a.normal.example a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.normal.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking previously added zone ($n)" ret=0 $DIG $DIGOPTS @10.53.0.2 a.previous.example a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.previous.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:adding new zone ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'added.example { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 a.added.example a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.added.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:adding a zone that requires quotes ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone '"32/1.0.0.127-in-addr.added.example" { check-names ignore; type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 "a.32/1.0.0.127-in-addr.added.example" a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.32/1.0.0.127-in-addr.added.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:adding a zone with a quote in the name ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone '"foo\"bar.example" { check-names ignore; type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 "a.foo\"bar.example" a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.foo\\"bar.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:adding new zone with missing master file ($n)" ret=0 $DIG $DIGOPTS +all @10.53.0.2 a.missing.example a > dig.out.ns2.pre.$n || ret=1 grep "status: REFUSED" dig.out.ns2.pre.$n > /dev/null || ret=1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'missing.example { type master; file "missing.db"; };' 2> rndc.out.ns2.$n grep "file not found" rndc.out.ns2.$n > /dev/null || ret=1 $DIG $DIGOPTS +all @10.53.0.2 a.missing.example a > dig.out.ns2.post.$n || ret=1 grep "status: REFUSED" dig.out.ns2.post.$n > /dev/null || ret=1 $PERL ../digcomp.pl dig.out.ns2.pre.$n dig.out.ns2.post.$n || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:verifying no comments in nzf file ($n)" ret=0 hcount=`grep "^# New zone file for view: _default" ns2/3bf305731dd26307.nzf | wc -l` [ $hcount -eq 0 ] || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:deleting previously added zone ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 delzone previous.example 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 a.previous.example a > dig.out.ns2.$n grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.previous.example' dig.out.ns2.$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking nzf file now has comment ($n)" ret=0 hcount=`grep "^# New zone file for view: _default" ns2/3bf305731dd26307.nzf | wc -l` [ $hcount -eq 1 ] || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:deleting newly added zone ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 delzone added.example 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 a.added.example a > dig.out.ns2.$n grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:deleting newly added zone with escaped quote ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 delzone "foo\\\"bar.example" 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.2 "a.foo\"bar.example" a > dig.out.ns2.$n grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 grep "^a.foo\"bar.example" dig.out.ns2.$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:attempt to delete a normally-loaded zone ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 delzone normal.example 2> rndc.out.ns2.$n grep "permission denied" rndc.out.ns2.$n > /dev/null || ret=1 $DIG $DIGOPTS @10.53.0.2 a.normal.example a > dig.out.ns2.$n grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.normal.example' dig.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:attempting to add master zone with inline signing ($n)" $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'inline.example { type master; file "inline.db"; inline-signing yes; };' 2>&1 | sed 's/^/I:ns2 /' for i in 1 2 3 4 5 do ret=0 $DIG $DIGOPTS @10.53.0.2 a.inline.example a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.inline.example' dig.out.ns2.$n > /dev/null || ret=1 [ $ret = 0 ] && break sleep 1 done n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:attempting to add master zone with inline signing and missing master ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'inlinemissing.example { type master; file "missing.db"; inline-signing yes; };' 2> rndc.out.ns2.$n grep "file not found" rndc.out.ns2.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:attempting to add slave zone with inline signing ($n)" $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'inlineslave.example { type slave; masters { 10.53.0.1; }; file "inlineslave.bk"; inline-signing yes; };' 2>&1 | sed 's/^/I:ns2 /' for i in 1 2 3 4 5 do ret=0 $DIG $DIGOPTS @10.53.0.2 a.inlineslave.example a > dig.out.ns2.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.inlineslave.example' dig.out.ns2.$n > /dev/null || ret=1 [ $ret = 0 ] && break sleep 1 done n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:reconfiguring server with multiple views" rm -f ns2/named.conf cp -f ns2/named2.conf ns2/named.conf $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig 2>&1 | sed 's/^/I:ns2 /' sleep 5 echo "I:adding new zone to external view ($n)" # NOTE: The internal view has "recursion yes" set, and so queries for # nonexistent zones should return NOERROR. The external view is # "recursion no", so queries for nonexistent zones should return # REFUSED. This behavior should be the same regardless of whether # the zone does not exist because a) it has not yet been loaded, b) # it failed to load, or c) it has been deleted. ret=0 $DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.intpre.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.intpre.$n > /dev/null || ret=1 $DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.extpre.$n || ret=1 grep 'status: REFUSED' dig.out.ns2.extpre.$n > /dev/null || ret=1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'added.example in external { type master; file "added.db"; };' 2>&1 | sed 's/^/I:ns2 /' $DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1 $DIG +norec $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.ext.$n > /dev/null || ret=1 grep '^a.added.example' dig.out.ns2.ext.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking new nzf file has comment ($n)" ret=0 hcount=`grep "^# New zone file for view: external" ns2/3c4623849a49a539.nzf | wc -l` [ $hcount -eq 1 ] || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:deleting newly added zone ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 delzone 'added.example in external' 2>&1 | sed 's/^/I:ns2 /' $DIG $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.$n || ret=1 grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 grep '^a.added.example' dig.out.ns2.$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:attempting to add zone to internal view ($n)" ret=0 $DIG +norec $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.pre.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.pre.$n > /dev/null || ret=1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 addzone 'added.example in internal { type master; file "added.db"; };' 2> rndc.out.ns2.$n grep "permission denied" rndc.out.ns2.$n > /dev/null || ret=1 $DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 a.added.example a > dig.out.ns2.int.$n || ret=1 grep 'status: NOERROR' dig.out.ns2.int.$n > /dev/null || ret=1 $DIG $DIGOPTS @10.53.0.4 -b 10.53.0.4 a.added.example a > dig.out.ns2.ext.$n || ret=1 grep 'status: REFUSED' dig.out.ns2.ext.$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:ensure the configuration context is cleaned up correctly ($n)" ret=0 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > /dev/null 2>&1 || ret=1 sleep 5 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 status > /dev/null 2>&1 || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/addzone/ns1/0002755000470500017500000000000012276444015020430 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/addzone/ns1/named.conf0000644000470500017500000000217412271526120022356 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named1.conf,v 1.2 2010/08/11 18:14:19 each Exp $ */ controls { /* empty */ }; options { port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; allow-query { any; }; recursion no; }; zone "." { type hint; file "../../common/root.hint"; }; zone "inlineslave.example" { type master; file "inlineslave.db"; }; bind9-9.9.5.dfsg/bin/tests/system/addzone/ns1/inlineslave.db0000644000470500017500000000213112271526120023234 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. $ORIGIN inlineslave.example. $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 1 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 MX 10 mail a A 10.0.0.1 mail A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/addzone/clean.sh0000644000470500017500000000201512271526120021332 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.3 2010/09/15 03:32:34 marka Exp $ rm -f dig.out.* rm -f rndc.out.* rm -f ns2/named.conf rm -f */named.memstats rm -f ns2/*.nzf rm -f ns2/core* rm -f ns2/inline.db.jbk rm -f ns2/inline.db.signed rm -f ns2/inlineslave.bk* bind9-9.9.5.dfsg/bin/tests/system/addzone/setup.sh0000644000470500017500000000166712271526120021424 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.3 2010/08/12 01:31:36 marka Exp $ sh clean.sh cp -f ns2/named1.conf ns2/named.conf cp -f ns2/default.nzf.in ns2/3bf305731dd26307.nzf bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/0002755000470500017500000000000012276444015020431 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/inline.db0000644000470500017500000000212412271526120022204 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. $ORIGIN inline.example. $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 1 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 MX 10 mail a A 10.0.0.1 mail A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/default.nzf.in0000644000470500017500000000007412271526120023171 0ustar lamontlamontzone previous.example { type master; file "previous.db"; }; bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/named1.conf0000644000470500017500000000227512271526120022442 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named1.conf,v 1.2 2010/08/11 18:14:19 each Exp $ */ controls { /* empty */ }; options { port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; allow-query { any; }; recursion no; allow-new-zones yes; }; include "../../common/controls.conf"; zone "." { type hint; file "../../common/root.hint"; }; zone "normal.example" { type master; file "normal.db"; }; bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/added.db0000644000470500017500000000222012271526120021764 0ustar lamontlamont; Copyright (C) 2010, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: added.db,v 1.2 2010/08/11 18:14:18 each Exp $ ;$ORIGIN added.example. $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 1 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 MX 10 mail a A 10.0.0.1 mail A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/normal.db0000644000470500017500000000221312271526120022215 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: normal.db,v 1.2 2010/08/11 18:14:19 each Exp $ $ORIGIN normal.example. $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 1 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 MX 10 mail a A 10.0.0.1 mail A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/previous.db0000644000470500017500000000221712271526120022605 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: previous.db,v 1.2 2010/08/11 18:14:19 each Exp $ $ORIGIN previous.example. $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 1 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 MX 10 mail a A 10.0.0.1 mail A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/addzone/ns2/named2.conf0000644000470500017500000000326512271526120022443 0ustar lamontlamont/* * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named2.conf,v 1.5 2011/06/17 23:47:49 tbox Exp $ */ controls { /* empty */ }; include "../../common/controls.conf"; options { port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; 10.53.0.4; }; listen-on-v6 { none; }; recursion no; }; view internal { match-clients { 10.53.0.2; }; allow-new-zones no; recursion yes; zone "." { type hint; file "../../common/root.hint"; }; }; view external { match-clients { any; }; allow-new-zones yes; zone "." { type hint; file "../../common/root.hint"; }; }; # This view is only here to test that configuration context is cleaned # up correctly when using multiple named ACLs (regression test for RT #22739) acl match { none; }; acl nobody { none; }; view extra { match-clients { match; }; allow-new-zones yes; allow-transfer { nobody; }; allow-query { nobody; }; allow-recursion { nobody; }; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/0002755000470500017500000000000012276444015021333 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/tests.sh0000644000470500017500000000353412271526120023025 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 rm -f dig.out.* DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p 5300" for f in conf/good*.conf do echo "I:checking '$f'" ret=0 $CHECKCONF $f > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done for f in conf/bad*.conf do echo "I:checking '$f'" ret=0 $CHECKCONF $f > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done echo "I:checking that RSA big exponent keys can't be loaded" ret=0 grep "out of range" ns2/signer.err > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking that RSA big exponent signature can't validate" ret=0 $DIG $DIGOPTS a.example @10.53.0.2 > dig.out.ns2 || ret=1 $DIG $DIGOPTS a.example @10.53.0.3 > dig.out.ns3 || ret=1 grep "status: NOERROR" dig.out.ns2 > /dev/null || ret=1 grep "status: SERVFAIL" dig.out.ns3 > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns1/0002755000470500017500000000000012276444015022034 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns1/named.conf0000644000470500017500000000223012271526120023753 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ // NS1 controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; dnssec-enable yes; dnssec-validation yes; }; zone "." { type master; file "root.db.signed"; }; include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns1/root.db.in0000644000470500017500000000203512271526120023722 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 300 . IN SOA gson.nominum.com. a.root.servers.nil. ( 2012050600 ; serial 3600 ; refresh 1200 ; retry 604800 ; expire 60 ; minimum ) @ NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 ; example. NS ns2.example. ns2.example. A 10.53.0.2 bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns1/sign.sh0000755000470500017500000000273612271526120023332 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=. infile=root.db.in zonefile=root.db cp ../ns2/dsset-example.in dsset-example. keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 1024 -n zone $zone` cat $infile $keyname.key > $zonefile $SIGNER -P -g -r $RANDFILE -o $zone $zonefile > /dev/null # Configure the resolving server with a trusted key. cat $keyname.key | grep -v '^; ' | $PERL -n -e ' local ($dn, $class, $type, $flags, $proto, $alg, @rest) = split; local $key = join("", @rest); print < trusted.conf cp trusted.conf ../ns2/trusted.conf cp trusted.conf ../ns3/trusted.conf cd ../ns2 && sh -e ./sign.sh bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/bigkey.c0000644000470500017500000001567512271526120022756 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ #ifdef OPENSSL #include #include #include #include #include #include #include #include #include #include #define DST_KEY_INTERNAL #include #include #include #include #include #include #include #include #include #include #include #if OPENSSL_VERSION_NUMBER <= 0x00908000L /* * Use a fixed key file pair if OpenSSL doesn't support > 32 bit exponents. */ int main(int argc, char **argv) { FILE *fp; UNUSED(argc); UNUSED(argv); fp = fopen("Kexample.+005+10264.private", "w"); if (fp == NULL) { perror("fopen(Kexample.+005+10264.private)"); exit(1); } fputs("Private-key-format: v1.3\n", fp); fputs("Algorithm: 5 (RSASHA1)\n", fp); fputs("Modulus: yhNbLRPA7VpLCXcgMvBwsfe7taVaTvLPY3AI+YolKwqD6" "/3nLlCcz4kBOTOkQBf9bmO98WnKuOWoxuEOgudoDvQOzXNl9RJtt61" "IRMscAlsVtTIfAjPLhcGy32l2s5VYWWVXx/qkcf+i/JC38YXIuVdiA" "MtbgQV40ffM4lAbZ7M=\n", fp); fputs("PublicExponent: AQAAAAAAAQ==\n", fp); fputs("PrivateExponent: gfXvioazoFIJp3/H2kJncrRZaqjIf9+21CL1i" "XecBOof03er8ym5AKopZQM8ie+qxvhDkIJ8YDrB7UbDxmFpPceHWYM" "X0vDWQCIiEiKzRfCsBOjgJu6HS15G/oZDqDwKat+yegtzxhg48BCPq" "zfHLXXUvBTA/HK/u8L1LwggqHk=\n", fp); fputs("Prime1: 7xAPHsNnS0w7CoEnIQiu+SrmHsy86HKJOEm9FiQybRVCwf" "h4ZRQl+Z9mUbb9skjPvkM6ZeuzXTFkOjdck2y1NQ==\n", fp); fputs("Prime2: 2GRzzqyRR2gfITPug8Rddxt647/2DrAuKricX/AXyGcuHM" "vTZ+v+mfgJn6TFqSn4SBF2zHJ876lWbQ+12aNORw==\n", fp); fputs("Exponent1: PnGTwxiT59N/Rq/FSAwcwoAudiF/X3iK0X09j9Dl8cY" "DYAJ0bhB9es1LIaSsgLSER2b1kHbCp+FQXGVHJeZ07Q==\n", fp); fputs("Exponent2: Ui+zxA/zbnUSYnz+wdbrfBD2aTeKytZG4ASI3oPDZag" "V9YC0eZRPjI82KQcFXoj1b/fV/HzT9/9rhU4mvCGjLw==\n", fp); fputs("Coefficient: sdCL6AdOaCr9c+RO8NCA492MOT9w7K9d/HauC+fif" "2iWN36dA+BCKaeldS/+6ZTnV2ZVyVFQTeLJM8hplxDBwQ==\n", fp); if (fclose(fp) != 0) { perror("fclose(Kexample.+005+10264.private)"); exit(1); } fp = fopen("Kexample.+005+10264.key", "w"); if (fp == NULL) { perror("fopen(Kexample.+005+10264.key)"); exit(1); } fputs("; This is a zone-signing key, keyid 10264, for example.\n", fp); fputs("example. IN DNSKEY 256 3 5 BwEAAAAAAAHKE1stE8DtWksJdyA" "y8HCx97u1pVpO8s9jcAj5iiUrCoPr /ecuUJzPiQE5M6RAF/1uY73x" "acq45ajG4Q6C52gO9A7Nc2X1Em23rUhE yxwCWxW1Mh8CM8uFwbLfaX" "azlVhZZVfH+qRx/6L8kLfxhci5V2IAy1uB BXjR98ziUBtnsw==\n", fp); if (fclose(fp) != 0) { perror("close(Kexample.+005+10264.key)"); exit(1); } exit(0); } #else #include #include #include #include #include dst_key_t *key; dns_fixedname_t fname; dns_name_t *name; unsigned int bits = 1024U; isc_entropy_t *ectx; isc_entropysource_t *source; isc_mem_t *mctx; isc_log_t *log_; isc_logconfig_t *logconfig; int level = ISC_LOG_WARNING; isc_logdestination_t destination; char filename[255]; isc_result_t result; isc_buffer_t buf; RSA *rsa; BIGNUM *e; EVP_PKEY *pkey; #define CHECK(op, msg) \ do { result = (op); \ if (result != ISC_R_SUCCESS) { \ fprintf(stderr, \ "fatal error: %s returns %s at file %s line %d\n", \ msg, isc_result_totext(result), __FILE__, __LINE__); \ exit(1); \ } \ } while (0) int main(int argc, char **argv) { UNUSED(argc); UNUSED(argv); rsa = RSA_new(); e = BN_new(); pkey = EVP_PKEY_new(); if ((rsa == NULL) || (e == NULL) || (pkey == NULL) || !EVP_PKEY_set1_RSA(pkey, rsa)) { fprintf(stderr, "fatal error: basic OpenSSL failure\n"); exit(1); } /* e = 0x1000000000001 */ BN_set_bit(e, 0); BN_set_bit(e, 48); if (RSA_generate_key_ex(rsa, bits, e, NULL)) { BN_free(e); RSA_free(rsa); } else { fprintf(stderr, "fatal error: RSA_generate_key_ex() fails " "at file %s line %d\n", __FILE__, __LINE__); exit(1); } dns_result_register(); CHECK(isc_mem_create(0, 0, &mctx), "isc_mem_create()"); CHECK(isc_entropy_create(mctx, &ectx), "isc_entropy_create()"); CHECK(isc_entropy_usebestsource(ectx, &source, "random.data", ISC_ENTROPY_KEYBOARDNO), "isc_entropy_usebestsource(\"random.data\")"); CHECK(dst_lib_init2(mctx, ectx, NULL, 0), "dst_lib_init2()"); CHECK(isc_log_create(mctx, &log_, &logconfig), "isc_log_create()"); isc_log_setcontext(log_); dns_log_init(log_); dns_log_setcontext(log_); CHECK(isc_log_settag(logconfig, "bigkey"), "isc_log_settag()"); destination.file.stream = stderr; destination.file.name = NULL; destination.file.versions = ISC_LOG_ROLLNEVER; destination.file.maximum_size = 0; CHECK(isc_log_createchannel(logconfig, "stderr", ISC_LOG_TOFILEDESC, level, &destination, ISC_LOG_PRINTTAG | ISC_LOG_PRINTLEVEL), "isc_log_createchannel()"); CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL), "isc_log_usechannel()"); dns_fixedname_init(&fname); name = dns_fixedname_name(&fname); isc_buffer_constinit(&buf, "example.", strlen("example.")); isc_buffer_add(&buf, strlen("example.")); CHECK(dns_name_fromtext(name, &buf, dns_rootname, 0, NULL), "dns_name_fromtext(\"example.\")"); CHECK(dst_key_buildinternal(name, DNS_KEYALG_RSASHA1, bits, DNS_KEYOWNER_ZONE, DNS_KEYPROTO_DNSSEC, dns_rdataclass_in, pkey, mctx, &key), "dst_key_buildinternal(...)"); CHECK(dst_key_tofile(key, DST_TYPE_PRIVATE | DST_TYPE_PUBLIC, NULL), "dst_key_tofile()"); isc_buffer_init(&buf, filename, sizeof(filename) - 1); isc_buffer_clear(&buf); CHECK(dst_key_buildfilename(key, 0, NULL, &buf), "dst_key_buildfilename()"); printf("%s\n", filename); dst_key_free(&key); isc_log_destroy(&log_); isc_log_setcontext(NULL); dns_log_setcontext(NULL); if (source != NULL) isc_entropy_destroysource(&source); isc_entropy_detach(&ectx); dst_lib_destroy(); dns_name_destroy(); isc_mem_destroy(&mctx); return (0); } #endif #else /* OPENSSL */ #include #include int main(int argc, char **argv) { fprintf(stderr, "Compiled without OpenSSL\n"); exit(1); } #endif /* OPENSSL */ /*! \file */ bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/clean.sh0000644000470500017500000000171012271526120022737 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ rm -f K* */K* */dsset-*. */*.signed */trusted.conf */tmp* rm -f random.data rm -f ns*/named.run rm -f ns*/named.memstats rm -f ns1/root.db rm -f ns2/signer.err rm -f dig.out.* bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns3/0002755000470500017500000000000012276444015022036 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns3/named.conf0000644000470500017500000000227212271526120023763 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ // NS3 controls { /* empty */ }; options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; pid-file "named.pid"; listen-on { 10.53.0.3; }; listen-on-v6 { none; }; recursion yes; notify yes; dnssec-enable yes; dnssec-validation yes; max-rsa-exponent-size 35; }; zone "." { type hint; file "../../common/root.hint"; }; include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/setup.sh0000644000470500017500000000154712271526120023025 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ sh clean.sh ../../../tools/genrandom 400 random.data cd ns1 && sh -e sign.sh bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/Makefile.in0000644000470500017500000000274612271526120023400 0ustar lamontlamont# Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} @DST_OPENSSL_INC@ CDEFINES = @USE_OPENSSL@ CWARNINGS = DNSLIBS = ../../../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ ISCLIBS = ../../../../lib/isc/libisc.@A@ DNSDEPLIBS = ../../../../lib/dns/libdns.@A@ ISCDEPLIBS = ../../../../lib/isc/libisc.@A@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ TARGETS = bigkey@EXEEXT@ OBJS = bigkey.@O@ SRCS = bigkey.c @BIND9_MAKE_RULES@ all: bigkey@EXEEXT@ bigkey@EXEEXT@: ${OBJS} ${DEPLIBS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS} ${LIBS} clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/0002755000470500017500000000000012276444015022260 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/bad02.conf0000644000470500017500000000151412271526120024007 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 34; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/good03.conf0000644000470500017500000000151612271526120024214 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 4096; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/bad01.conf0000644000470500017500000000151312271526120024005 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 1; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/good01.conf0000644000470500017500000000151312271526120024207 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 0; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/bad03.conf0000644000470500017500000000151612271526120024012 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 4097; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/conf/good02.conf0000644000470500017500000000151412271526120024211 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ options { max-rsa-exponent-size 35; }; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/0002755000470500017500000000000012276444015022035 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/example.db.in0000644000470500017500000000171612271526120024400 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 300 ; 5 minutes @ IN SOA mname1. . ( 2012050601 ; serial 3600 ; refresh 600 ; retry 604800 ; expire 3600 ; minimum ) NS ns2 ns2 A 10.53.0.2 a A 10.0.0.1 bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/Xexample.+005+05896.private0000644000470500017500000000324512271526120026254 0ustar lamontlamontPrivate-key-format: v1.3 Algorithm: 5 (RSASHA1) Modulus: os1uAx8f9dTBkL0MFUbg6lhVRXILJkQGqGTeTpbOIgBj7Z/sw3cv0KhlH0ap+oz79zqDyB+QhplnZg/9hRRo3vfEf+fG0diSs/lGp793Duo42exXC9/ccnwe9REbfCNo6s+h7bTv4ek1M2F7+xPa6wqGiRJTzIoHQMqWespC+n29JywgH9GwjE5daZiA4yRJe2kjeVDTuXWLZO/pSd5wP2zyu6R+X+A9tEGR60tgAKuqlvaP/V/tyJC/6vPUac32ZrxcrVjDzXvf+GtUvVL9mpMZzPB14DcBXKIdOE5nXkQ+FK4vuNom6wc6LjcBrxl8IwJ6KZPvcXl6mS0aiYDEVQ== PublicExponent: AQAB PrivateExponent: K9juX1LbtccmlwgDoBtl6lf+J2UO0bCSpnn8UehV/lxijZZ8Gy0XqLgh/Cl5EG02U6Dj61ts/oOEkL2Px272y86pktVm/A+7e1ORDw8HTvIQe8kmrKEPa5o4cEK6R1X2JP/lGfOYhBzeYkdIMBhp5tH/6B0Sis1GJNIrc0jUf0g+JvOH/j1SpLoKoDpHUwOWnAt92AZsYhyJgeDXgw+xTBcOVvRfmh3Zmoi6x58lmQsU3loloqQ2V2V3xw1qEhTwBtFiguqeUV/FZl+RerT+lld7v2KkuxchyxlCCavgq6bZSUpn3TxcmnK6pj42oTy11hG9PHvIS8VNpGLr0p6mpQ== Prime1: 2KZlb2BXJHEJJv2iuJoddNuDlDStG77cA7FR84Dsarbc5rHj1BjwOPDec235LQOzNAAVMTh3B8/8kcAkx/U0F2FPfgAS/ZK2dOBKcJFU4bmUQDsLMXJn67Pf7d1HeDYfVPSFp1Ib/G91dXuo11+nRZJRfKUW19aFYXybSLVmifM= Prime2: wF9HHnv17f1L3VLBJ+qndiPcp/l24fVk5xWrbZlivK+WFrZkHFbmN+WRIkjKbe1mBf4z2fMp1JZKt8wViJVG9Bkk2wSCQA74MrejPFlD9AEMC/TrV7F/l89DryG9YeLAk6td38opGiAmRHzSdrjstUF+iv7IAW+fghPQ3O4ogpc= Exponent1: Nmtlo1phyUeTcvXW/+PGbmoNXRb2PLfucAcEfNPvjsasKk6Y2dgBz2vBlOEU7Be31eIHcLusOowl9z56fre7A/xviUjffE50AluslyYKWkDRWmj6YMtKC0y9fPROVYXSzPY29FaNrRUaPg531NG0JKeiTFrzp/e8vUYdg1/9h70= Exponent2: r5+MNwlmaQJBG2psivuQLKvqy7NU1E8K8mj3G1TYLniCpnOXC8RN4yQDDvCzVg5QgRIk1kpHmxwmVIvN8OaPY1P9MLJ6Eu9Xqj26meLIxd+a1uOfY2zZloeTPDSqR84Sj/338tIGGiLVrNrj7Z1ABO4pD84wXBdC4SckHD6U3zs= Coefficient: c1jE021ke1G/1+C/mqhVtXF9/+ivfw9Ae6na3PofQREs3wiBJH7kpbLmTqc1ovXrHA3BbD1CfWUBhrFK/n5MvsU59VGmz5mD+HGsHC1eoaS4JCG5EWFUP8MStiv+JJGyfuK8MUGsEXQorfQmzGXhe5N2S+4dEYDfksSVd9Wg9d0= bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/named.conf0000644000470500017500000000230112271526120023753 0ustar lamontlamont/* * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ // NS2 controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion no; notify yes; dnssec-enable yes; }; zone "." { type hint; file "../../common/root.hint"; }; zone "example" { type master; file "example.db.bad"; }; include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/example.db.bad0000644000470500017500000001113212271526120024511 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ example. 300 IN SOA mname1. . ( 2012050601 ; serial 3600 ; refresh (1 hour) 600 ; retry (10 minutes) 604800 ; expire (1 week) 3600 ; minimum (1 hour) ) 300 RRSIG SOA 5 1 300 ( 20361231235959 20000101000000 51829 example. HW8O/KHJEObWSYtQD14+3MRtD6rasy/AeIAo 1HmtELxeUoMvVcQzm7z1RoeV6S7+r/SrUjAz PwtlE4TpyTEj9sfTr4mJhU0DwrNW6dN6qHCw vB3nuURVOKzU8V26PdFcjJB+/HnJT2LyLUqr KAzHwU1tAXkgx0FOwfyOs2rxooo= ) 300 NS ns2.example. 300 RRSIG NS 5 1 300 ( 20361231235959 20000101000000 51829 example. EO8/KzfhppvhD2b0hGCdEN8/WTNexK6zkC1Z oW3vu0cFVvac+wrV9Vox90lHI0jTce/R+bvT T9RbpZiZcBKLVyBuHIdFPOdc3ogHMPwaPNkD pvVvLfV6auHCvINiVw+jWinBpTjqoROH/yTC 03BQ41vewKsz3fYZ03XUr2xga5Q= ) 3600 NSEC a.example. NS SOA RRSIG NSEC DNSKEY 3600 RRSIG NSEC 5 1 3600 ( 20361231235959 20000101000000 51829 example. FiUyrwO7MV9Lhg6yu0XN/hLZPOiDg/NqIIUc HfA9Yix90Z9G/yzn8NBC92Yp5EPiI4HiE24T t1p4YwHe6n/IJA4KZUIpCxEY5xhQL/mVMeuj dlFA2LaiDwbOh//42zdocaeGPrcV+u6OmXoU xkQIuWeJ1QCaD5FXJdN6zELZsnw= ) 300 DNSKEY 256 3 5 ( BwEAAAAAAAGfDKVFak/2o446xOsi39QnfZmR idaRyg3LaCxDBM6kVqCHQKI3a2lEf4FWVSbp +dYjGavsqWJ/Z7poMRy9JJol2bMLhtsZhESK 5EYRaR/2dLw5H10SR+wb/qRVVYovWlk67sql 7XYc3x5cjc4XaMVziBBrQMiWqkQS2oGQLwKC Lw== ) ; ZSK; alg = RSASHA1; key id = 51829 300 DNSKEY 257 3 5 ( AwEAAaLNbgMfH/XUwZC9DBVG4OpYVUVyCyZE Bqhk3k6WziIAY+2f7MN3L9CoZR9GqfqM+/c6 g8gfkIaZZ2YP/YUUaN73xH/nxtHYkrP5Rqe/ dw7qONnsVwvf3HJ8HvURG3wjaOrPoe207+Hp NTNhe/sT2usKhokSU8yKB0DKlnrKQvp9vScs IB/RsIxOXWmYgOMkSXtpI3lQ07l1i2Tv6Une cD9s8rukfl/gPbRBketLYACrqpb2j/1f7ciQ v+rz1GnN9ma8XK1Yw8173/hrVL1S/ZqTGczw deA3AVyiHThOZ15EPhSuL7jaJusHOi43Aa8Z fCMCeimT73F5epktGomAxFU= ) ; KSK; alg = RSASHA1; key id = 5896 300 RRSIG DNSKEY 5 1 300 ( 20361231235959 20000101000000 5896 example. b07impYEH+uW8iPCVE0QXqYSs6Yyu7Nb8q1f rXv+NgE5wbsIvdo4PDdSfScP41WgVKdLPipH gaTyk4CKAuGSvIBMzlc3yib03zdvzBDgn3Yi lONpl2yH47vhvn5iXYcVV4kbuYE9+SFVoVO8 m6xvihm1D17m8emivnG6DuJSpJJM09v0toSd 3yGI3bgUtki85ehOPU0ZkvA20InVgP5kKUgw /M4vP4VkcwenNO7koMZOorI02KFOH3vvZSI4 hzuwJVaQZ35IBBVmSSMAD+0LTBk6sMPSpcmP Pff75NLhU+4+UflWie6mzWIvm3ovcG3fveq0 W4G3TCriTIKSjY3Jqg== ) 300 RRSIG DNSKEY 5 1 300 ( 20361231235959 20000101000000 51829 example. a7WU2WcHEpDfM5NBUzN7t4WXEwldn1EM/HkH XEo9NnZhFV16414qbuwWMlUsc5MTii+T4OFZ p2+XHj9M8glM1d98o+EDSYT7LdrrE7AqdtSO gcXdeY6WRI9R5wkLP3cP6kADp5WIOcQ78IPb pRJ4jhxqMPFV3cqCWH/Lp8JPghY= ) a.example. 300 IN A 10.0.0.1 300 RRSIG A 5 2 300 ( 20361231235959 20000101000000 51829 example. h4WyY0hUkZobUbt2xWC4lJLEbGvzxGczH/mN WHZBpgg+1tuoTAdVbt6a2TfQcJV/iPQGAHte Vu/U6tD8KzP08krlqrcefwvR5LDAQygWRdjt Rx105w9F0GiL6kpDH6S9T8xCw3aF5Rl1lu/u 8eiUzDIMIBTijhXmM96Nde18RdA= ) 3600 NSEC ns2.example. A RRSIG NSEC 3600 RRSIG NSEC 5 2 3600 ( 20361231235959 20000101000000 51829 example. LbzeWbk9r119I95TVCebEPfnCCk9zBRq4nAR swliQVQ84bCjwVJfakvlD4mgilSPtypxpyXC DQaiOQWOz9LFzro5u71VuSS5fY7U4elp/lq6 5BJB6o/dmk5xASAHHbOO6e5dcoQ5vRxcnJaE 0vE1jGppo2FiQzkVi7Zbrghoolg= ) ns2.example. 300 IN A 10.53.0.2 300 RRSIG A 5 2 300 ( 20361231235959 20000101000000 51829 example. Jfp3xzrym5GksbZ+a2rjOXzV/Ct+eX2DCo8a lSbriEhuK9OR3WUnXoDqp1X/d7adNL2lI9c+ B3UVL+EOCyvNxt9kECcN8KgQdXKExZEQUwnN UB51QESM9pW6akavhXJu98sjnhtpdTwrtKbg nMJkfYe5Mw3e/8RFY+wpEq/8cHw= ) 3600 NSEC example. A RRSIG NSEC 3600 RRSIG NSEC 5 2 3600 ( 20361231235959 20000101000000 51829 example. Wxkz4nY5rty6O90QhFZguyqbaz9njnJKUs7m qYF9u7dDk8vUf3yS97fw3e0N13X5zGZa7hTr +65U4NKEOqYDBbvWaXSVFxrzVfSVXqY6l4jX kWjA6q4q5TTgcjOUJ0MfvcjtgxcaKUiPGmPJ RWdOV7t9YMWnf7QAbPI55QN9sfY= ) bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/dsset-example.in0000644000470500017500000000023512271526120025127 0ustar lamontlamontexample. IN DS 5896 5 1 07766192DA7BDE32F6DC719B9F5A3476686F8758 example. IN DS 5896 5 2 CFBFD9C06EA15B0A984566573A18ACEC234FDC9C09103C0C53E75989 088A8FB4 bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/Xexample.+005+51829.private0000644000470500017500000000166112271526120026251 0ustar lamontlamontPrivate-key-format: v1.3 Algorithm: 5 (RSASHA1) Modulus: nwylRWpP9qOOOsTrIt/UJ32ZkYnWkcoNy2gsQwTOpFagh0CiN2tpRH+BVlUm6fnWIxmr7Klif2e6aDEcvSSaJdmzC4bbGYREiuRGEWkf9nS8OR9dEkfsG/6kVVWKL1pZOu7Kpe12HN8eXI3OF2jFc4gQa0DIlqpEEtqBkC8Cgi8= PublicExponent: AQAAAAAAAQ== PrivateExponent: Aidz1Ah0WnUxdjZQ5J2bkXXOvP7ZhxtrmNvaQkQpEOjc5EW0mh+8f6rmp19CZHVwjk1nRfTgSnPk/y+xsyfroBRf5RH+6bjvB3mk+uSor6+xibdTy+HlEyd5YPdGzHmqFUe7pcL25kO0QSqdEVjvBP9SCgscDBhrTHURYsPxudE= Prime1: 0nuP62sq8a1OyjGqmsqhf6XrpwRXSKYVjdJEdRzogi/fnU/AWDZdc2W8JOC1nxdbfVC68b8G+Vc+5GOsuUw56Q== Prime2: wXG1f8INIsNLGtEhAuqw320onFrqBEgs+EkEZeUxHP5hUkchoUSnqTZrfRUA+UuOD2sI0NtA3OYCXaihgWu0Vw== Exponent1: QooxjUxTEcn9N5ehnpK0VD3gKwoW3C2NIv/2GeKVpL+ZcsD6iMzmHou/WVOAt0oz+RdWDLxpEzakwUhslPN6+Q== Exponent2: PP9JlJFaGEs3ckmvj53NXKz0fkbjtIOJvWwnkT7WrVpTgaUISjuSxLOfUDrrFC9JGAIAmoWDrI76QrTanbLiyw== Coefficient: u4jEvCVMxzmDBCjw8MLuTZtuBqs0ScAT7NkceBrjhdpCV1DtzVGJgbwI2GEHqEcSlcVAQCM92vPz76lL4Q94zw== bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/Xexample.+005+51829.key0000644000470500017500000000041712271526120025365 0ustar lamontlamont; This is a zone-signing key, keyid 51829, for example. example. IN DNSKEY 256 3 5 BwEAAAAAAAGfDKVFak/2o446xOsi39QnfZmRidaRyg3LaCxDBM6kVqCH QKI3a2lEf4FWVSbp+dYjGavsqWJ/Z7poMRy9JJol2bMLhtsZhESK5EYR aR/2dLw5H10SR+wb/qRVVYovWlk67sql7XYc3x5cjc4XaMVziBBrQMiW qkQS2oGQLwKCLw== bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/sign.sh0000755000470500017500000000236712271526120023333 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.3 2011/05/26 23:47:28 tbox Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=example. infile=example.db.in outfile=example.db.bad for i in Xexample.+005+51829.key Xexample.+005+51829.private \ Xexample.+005+05896.key Xexample.+005+05896.private do cp $i `echo $i | sed s/X/K/` done $SIGNER -r $RANDFILE -g -s 20000101000000 -e 20361231235959 -o $zone \ $infile Kexample.+005+51829 Kexample.+005+51829 \ > /dev/null 2> signer.err bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/ns2/Xexample.+005+05896.key0000644000470500017500000000066412271526120025374 0ustar lamontlamont; This is a key-signing key, keyid 5896, for example. example. IN DNSKEY 257 3 5 AwEAAaLNbgMfH/XUwZC9DBVG4OpYVUVyCyZEBqhk3k6WziIAY+2f7MN3 L9CoZR9GqfqM+/c6g8gfkIaZZ2YP/YUUaN73xH/nxtHYkrP5Rqe/dw7q ONnsVwvf3HJ8HvURG3wjaOrPoe207+HpNTNhe/sT2usKhokSU8yKB0DK lnrKQvp9vScsIB/RsIxOXWmYgOMkSXtpI3lQ07l1i2Tv6UnecD9s8ruk fl/gPbRBketLYACrqpb2j/1f7ciQv+rz1GnN9ma8XK1Yw8173/hrVL1S /ZqTGczwdeA3AVyiHThOZ15EPhSuL7jaJusHOi43Aa8ZfCMCeimT73F5 epktGomAxFU= bind9-9.9.5.dfsg/bin/tests/system/rsabigexponent/prereq.sh0000644000470500017500000000171612271526120023161 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ ../../../tools/genrandom 400 random.data if ./bigkey > /dev/null 2>&1 then rm -f Kexample.* else echo "I:This test requires that --with-openssl was used." >&2 exit 1 fi bind9-9.9.5.dfsg/bin/tests/system/start.sh0000644000470500017500000000165512271526120017772 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: start.sh,v 1.42 2007/06/18 23:47:27 tbox Exp $ . ./conf.sh $PERL start.pl "$@" bind9-9.9.5.dfsg/bin/tests/system/gost/0002755000470500017500000000000012276444015017257 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/gost/tests.sh0000644000470500017500000000266512271526120020755 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.2 2010/12/23 04:08:00 marka Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 n=0 rm -f dig.out.* DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p 5300" # Check the example. domain echo "I:checking that positive validation works ($n)" ret=0 $DIG $DIGOPTS . @10.53.0.1 soa > dig.out.ns1.test$n || ret=1 $DIG $DIGOPTS . @10.53.0.2 soa > dig.out.ns2.test$n || ret=1 $PERL ../digcomp.pl dig.out.ns1.test$n dig.out.ns2.test$n || ret=1 grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/gost/ns1/0002755000470500017500000000000012276444015017760 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/gost/ns1/named.conf0000644000470500017500000000231112271526120021677 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/12/23 04:08:00 marka Exp $ */ // NS1 controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; dnssec-enable yes; dnssec-validation yes; }; zone "." { type master; file "root.db.signed"; }; include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/gost/ns1/root.db.in0000644000470500017500000000206612271526120021652 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db.in,v 1.2 2010/12/23 04:08:00 marka Exp $ $TTL 300 . IN SOA marka.isc.org. a.root.servers.nil. ( 2010121600 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/gost/ns1/sign.sh0000644000470500017500000000305212271526120021243 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.2 2010/12/23 04:08:00 marka Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=. infile=root.db.in zonefile=root.db key1=`$KEYGEN -q -r $RANDFILE -a ECCGOST -n zone $zone` key2=`$KEYGEN -q -r $RANDFILE -a ECCGOST -n zone -f KSK $zone` $DSFROMKEY -a gost $key2.key > dsset-gost cat $infile $key1.key $key2.key > $zonefile $SIGNER -P -g -r $RANDFILE -o $zone $zonefile > /dev/null 2> signer.err || cat signer.err # Configure the resolving server with a trusted key. cat $key1.key | grep -v '^; ' | $PERL -n -e ' local ($dn, $class, $type, $flags, $proto, $alg, @rest) = split; local $key = join("", @rest); print < trusted.conf cp trusted.conf ../ns2/trusted.conf bind9-9.9.5.dfsg/bin/tests/system/gost/clean.sh0000644000470500017500000000175512271526120020674 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.2 2010/12/23 04:07:59 marka Exp $ rm -f */K* */dsset-* */*.signed */trusted.conf rm -f ns1/root.db rm -f ns1/signer.err rm -f dig.out* rm -f random.data rm -f */named.run rm -f */named.memstats bind9-9.9.5.dfsg/bin/tests/system/gost/prereq.sh.in0000644000470500017500000000175312271526120021513 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: prereq.sh.in,v 1.4 2010/12/27 13:38:43 marka Exp $ OPENSSL_GOST="@OPENSSL_GOST@" if test -z "$OPENSSL_GOST" then echo "I:This test requires a openssl version with gost support." >&2 exit 255 fi bind9-9.9.5.dfsg/bin/tests/system/gost/setup.sh0000644000470500017500000000161712271526120020747 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.2 2010/12/23 04:08:00 marka Exp $ ../../../tools/genrandom 400 random.data cd ns1 && sh sign.sh bind9-9.9.5.dfsg/bin/tests/system/gost/ns2/0002755000470500017500000000000012276444015017761 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/gost/ns2/named.conf0000644000470500017500000000232012271526120021700 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/12/23 04:08:00 marka Exp $ */ // NS2 controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion yes; notify yes; dnssec-enable yes; dnssec-validation yes; }; zone "." { type hint; file "../../common/root.hint"; }; include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/sortlist/0002755000470500017500000000000012276444015020166 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/sortlist/tests.sh0000644000470500017500000000447312271526120021663 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.9 2007/09/14 01:46:05 marka Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 echo "I:test 2-element sortlist statement" cat <test1.good a.example. 300 IN A 192.168.3.1 a.example. 300 IN A 192.168.1.1 a.example. 300 IN A 1.1.1.5 a.example. 300 IN A 1.1.1.1 a.example. 300 IN A 1.1.1.3 a.example. 300 IN A 1.1.1.2 a.example. 300 IN A 1.1.1.4 EOF $DIG +tcp +noadd +nosea +nostat +noquest +noauth +nocomm +nocmd a.example. \ @10.53.0.1 -b 10.53.0.1 -p 5300 >test1.dig # Note that this can't use digcomp.pl because here, the ordering of the # result RRs is significant. diff test1.dig test1.good || status=1 echo "I:test 1-element sortlist statement and undocumented BIND 8 features" cat <test2.good b.example. 300 IN A 10.53.0.$n EOF $DIG +tcp +noadd +nosea +nostat +noquest +noauth +nocomm +nocmd \ b.example. @10.53.0.1 -b 10.53.0.2 -p 5300 | sed 1q | \ egrep '10.53.0.(2|3)$' > test2.out && $DIG +tcp +noadd +nosea +nostat +noquest +noauth +nocomm +nocmd \ b.example. @10.53.0.1 -b 10.53.0.3 -p 5300 | sed 1q | \ egrep '10.53.0.(2|3)$' >> test2.out && $DIG +tcp +noadd +nosea +nostat +noquest +noauth +nocomm +nocmd \ b.example. @10.53.0.1 -b 10.53.0.4 -p 5300 | sed 1q | \ egrep '10.53.0.4$' >> test2.out && $DIG +tcp +noadd +nosea +nostat +noquest +noauth +nocomm +nocmd \ b.example. @10.53.0.1 -b 10.53.0.5 -p 5300 | sed 1q | \ egrep '10.53.0.5$' >> test2.out || status=1 echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/sortlist/ns1/0002755000470500017500000000000012276444015020667 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/sortlist/ns1/example.db0000644000470500017500000000261712271526120022626 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.db,v 1.7 2007/06/19 23:47:05 tbox Exp $ $TTL 300 ; 5 minutes @ IN SOA ns1.example. hostmaster.example. ( 2000042795 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) example. NS ns1.example. ns1.example. A 10.53.0.1 ; Let's see what the sortlist picks out of this... a A 1.1.1.1 a A 1.1.1.5 a A 1.1.1.2 a A 192.168.3.1 a A 1.1.1.3 a A 192.168.1.1 a A 1.1.1.4 b A 10.53.0.1 b A 10.53.0.2 b A 10.53.0.3 b A 10.53.0.4 b A 10.53.0.5 bind9-9.9.5.dfsg/bin/tests/system/sortlist/ns1/named.conf0000644000470500017500000000317112271526120022613 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.10 2007/06/19 23:47:05 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; sortlist { { 10.53.0.1; // IF 10.53.0.1 { !1.1.1.4; !1.1.1.2; !1.1.1.3; !1.1.1.1; // sort these last, 192.168.3/24; // this first { 192.168.2/24; 192.168.1/24; }; }; }; // and these next { { 10.53.0.2; 10.53.0.3; }; }; // Prefer self 10.53.0.4; // BIND 8 compat { 10.53.0.5; 10.53.0.5; }; // BIND 8 compat }; }; zone "." { type master; file "root.db"; }; zone "example" { type master; file "example.db"; }; bind9-9.9.5.dfsg/bin/tests/system/sortlist/ns1/root.db0000644000470500017500000000225212271526120022151 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.5 2007/06/19 23:47:05 tbox Exp $ $TTL 300 . IN SOA gson.nominum.com. a.root.servers.nil. ( 2000042100 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 example. NS ns2.example. ns2.example. A 10.53.0.2 bind9-9.9.5.dfsg/bin/tests/system/sortlist/clean.sh0000644000470500017500000000170212271526120021573 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.9 2009/12/06 23:48:29 tbox Exp $ rm -f *.dig *.good *.out rm -f */named.memstats bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/0002755000470500017500000000000012276444015020451 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/tests.sh0000644000470500017500000007334212271526120022147 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 n=0 rm -f dig.out.* DIGOPTS="+tcp +noadd +nosea +nostat +nocmd -p 5300" for conf in conf/good*.conf do n=`expr $n + 1` echo "I:checking that $conf is accepted ($n)" ret=0 $CHECKCONF "$conf" || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done for conf in conf/bad*.conf do n=`expr $n + 1` echo "I:checking that $conf is rejected ($n)" ret=0 $CHECKCONF "$conf" >/dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done # # Authoritative tests against: # filter-aaaa-on-v4 yes; # filter-aaaa { 10.53.0.1; }; # n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, signed ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.signed -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep ::2 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, unsigned ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep ::5 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "ANSWER: 0" dig.out.ns1.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "ANSWER: 0" dig.out.ns1.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist, signed and DO set ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed +dnssec -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep ::3 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned and DO set ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "ANSWER: 0" dig.out.ns1.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist and query source does not match acl ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.2 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep ::6 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed and qtype=ANY ($n)" ret=0 $DIG $DIGOPTS any dual.signed -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns1.test$n > /dev/null || ret=1 grep "::3" dig.out.ns1.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned and qtype=ANY ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns1.test$n > /dev/null || ret=1 grep "::6" dig.out.ns1.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, signed, qtype=ANY and DO is set ($n)" ret=0 $DIG $DIGOPTS any dual.signed +dnssec -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep ::3 dig.out.ns1.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned, qtype=ANY and DO is set ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned +dnssec -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns1.test$n > /dev/null || ret=1 grep "::6" dig.out.ns1.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, qtype=ANY and query source does not match acl ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.2 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep 1.0.0.6 dig.out.ns1.test$n > /dev/null || ret=1 grep ::6 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A record exists, unsigned over IPv6 ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::1 then ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b fd92:7065:b8e:ffff::1 @fd92:7065:b8e:ffff::1 > dig.out.ns1.test$n || ret=1 grep 2001:db8::6 dig.out.ns1.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=NS ($n)" ret=0 $DIG $DIGOPTS +add ns unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep AAAA dig.out.ns1.test$n > /dev/null 2>&1 && ret=1 grep "ADDITIONAL: 2" dig.out.ns1.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, unsigned ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns1.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, signed ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx signed -b 10.53.0.1 @10.53.0.1 > dig.out.ns1.test$n || ret=1 grep "^mx.signed.*AAAA" dig.out.ns1.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, unsigned, over IPV6 ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::1 then ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b fd92:7065:b8e:ffff::1 @fd92:7065:b8e:ffff::1 > dig.out.ns1.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns1.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi # # Authoritative tests against: # filter-aaaa-on-v4 break-dnssec; # filter-aaaa { 10.53.0.4; }; # n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, signed with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.signed -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep ::2 dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, unsigned with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep ::5 dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed and DO set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed +dnssec -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned and DO set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist and query source does not match acl with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.2 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep ::6 dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed and qtype=ANY with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.signed -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns4.test$n > /dev/null || ret=1 grep "::3" dig.out.ns4.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned and qtype=ANY with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns4.test$n > /dev/null || ret=1 grep "::6" dig.out.ns4.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed, qtype=ANY and DO is set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.signed +dnssec -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns4.test$n > /dev/null || ret=1 grep ::3 dig.out.ns4.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned, qtype=ANY and DO is set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned +dnssec -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns4.test$n > /dev/null || ret=1 grep "::6" dig.out.ns4.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, qtype=ANY and query source does not match acl with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.2 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep 1.0.0.6 dig.out.ns4.test$n > /dev/null || ret=1 grep ::6 dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A record exists, unsigned over IPv6 with break-dnssec ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::4 then ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b fd92:7065:b8e:ffff::4 @fd92:7065:b8e:ffff::4 > dig.out.ns4.test$n || ret=1 grep 2001:db8::6 dig.out.ns4.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=NS, with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add ns unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep AAAA dig.out.ns4.test$n > /dev/null 2>&1 && ret=1 grep "ADDITIONAL: 2" dig.out.ns4.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, unsigned, with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns4.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, signed, with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx signed -b 10.53.0.4 @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "^mx.signed.*AAAA" dig.out.ns4.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, unsigned, over IPV6, with break-dnssec ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::4 then ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b fd92:7065:b8e:ffff::4 @fd92:7065:b8e:ffff::4 > dig.out.ns4.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns4.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi # # Recursive tests against: # filter-aaaa-on-v4 yes; # filter-aaaa { 10.53.0.2; }; # n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, signed, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.signed -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep ::2 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, unsigned, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.unsigned -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep ::5 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "ANSWER: 0" dig.out.ns2.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "ANSWER: 0" dig.out.ns2.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist, signed and DO set, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed +dnssec -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep ::3 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned and DO set, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned +dnssec -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "ANSWER: 0" dig.out.ns2.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist and query source does not match acl, recursive ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.1 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep ::6 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed and qtype=ANY recursive ($n)" ret=0 $DIG $DIGOPTS any dual.signed -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns2.test$n > /dev/null || ret=1 grep "::3" dig.out.ns2.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned and qtype=ANY recursive ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns2.test$n > /dev/null || ret=1 grep "::6" dig.out.ns2.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, signed, qtype=ANY and DO is set, recursive ($n)" ret=0 $DIG $DIGOPTS any dual.signed +dnssec -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep ::3 dig.out.ns2.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned, qtype=ANY and DO is set, recursive ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned +dnssec -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns2.test$n > /dev/null || ret=1 grep "::6" dig.out.ns2.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, qtype=ANY and query source does not match acl, recursive ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.1 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep 1.0.0.6 dig.out.ns2.test$n > /dev/null || ret=1 grep ::6 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A record exists, unsigned over IPv6, recursive ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::2 then ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b fd92:7065:b8e:ffff::2 @fd92:7065:b8e:ffff::2 > dig.out.ns2.test$n || ret=1 grep 2001:db8::6 dig.out.ns2.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=NS ($n)" ret=0 $DIG $DIGOPTS +add ns unsigned -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep AAAA dig.out.ns2.test$n > /dev/null 2>&1 && ret=1 grep "ADDITIONAL: 2" dig.out.ns2.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, unsigned ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns2.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, signed ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx signed -b 10.53.0.2 @10.53.0.2 > dig.out.ns2.test$n || ret=1 grep "^mx.signed.*AAAA" dig.out.ns2.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, unsigned, over IPV6 ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::2 then ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b fd92:7065:b8e:ffff::2 @fd92:7065:b8e:ffff::2 > dig.out.ns2.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns2.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi # # Recursive tests against: # filter-aaaa-on-v4 break-dnssec; # filter-aaaa { 10.53.0.3; }; # n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, signed, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.signed -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep ::2 dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when only AAAA record exists, unsigned, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa aaaa-only.unsigned -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep ::5 dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "ANSWER: 0" dig.out.ns3.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "ANSWER: 0" dig.out.ns3.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, signed and DO set, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.signed +dnssec -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "ANSWER: 0" dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that NODATA/NOERROR is returned when both AAAA and A records exist, unsigned and DO set, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned +dnssec -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "ANSWER: 0" dig.out.ns3.test$n > /dev/null || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A records exist and query source does not match acl, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b 10.53.0.1 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep ::6 dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed and qtype=ANY with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.signed -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns3.test$n > /dev/null || ret=1 grep "::3" dig.out.ns3.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned and qtype=ANY with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns3.test$n > /dev/null || ret=1 grep "::6" dig.out.ns3.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, signed, qtype=ANY and DO is set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.signed +dnssec -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep "1.0.0.3" dig.out.ns3.test$n > /dev/null || ret=1 grep ::3 dig.out.ns3.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that A and not AAAA is returned when both AAAA and A records exist, unsigned, qtype=ANY and DO is set with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned +dnssec -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep "1.0.0.6" dig.out.ns3.test$n > /dev/null || ret=1 grep "::6" dig.out.ns3.test$n > /dev/null && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that both A and AAAA are returned when both AAAA and A records exist, qtype=ANY and query source does not match acl, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS any dual.unsigned -b 10.53.0.1 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1 grep 1.0.0.6 dig.out.ns3.test$n > /dev/null || ret=1 grep ::6 dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is returned when both AAAA and A record exists, unsigned over IPv6, recursive with break-dnssec ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::3 then ret=0 $DIG $DIGOPTS aaaa dual.unsigned -b fd92:7065:b8e:ffff::3 @fd92:7065:b8e:ffff::3 > dig.out.ns3.test$n || ret=1 grep 2001:db8::6 dig.out.ns3.test$n > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=NS, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add ns unsigned -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep AAAA dig.out.ns3.test$n > /dev/null 2>&1 && ret=1 grep "ADDITIONAL: 2" dig.out.ns3.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, unsigned, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns3.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is omitted from additional section, qtype=MX, signed, recursive with break-dnssec ($n)" ret=0 $DIG $DIGOPTS +add +dnssec mx signed -b 10.53.0.3 @10.53.0.3 > dig.out.ns3.test$n || ret=1 grep "^mx.signed.*AAAA" dig.out.ns3.test$n > /dev/null 2>&1 && ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that AAAA is included in additional section, qtype=MX, unsigned, over IPV6, recursive with break-dnssec ($n)" if $TESTSOCK6 fd92:7065:b8e:ffff::3 then ret=0 $DIG $DIGOPTS +add +dnssec mx unsigned -b fd92:7065:b8e:ffff::3 @fd92:7065:b8e:ffff::3 > dig.out.ns3.test$n || ret=1 grep "^mx.unsigned.*AAAA" dig.out.ns3.test$n > /dev/null 2>&1 || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` else echo "I: skipped." fi echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/0002755000470500017500000000000012276444015021152 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/named.conf0000644000470500017500000000245012271526120023075 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { fd92:7065:b8e:ffff::1; }; recursion no; notify yes; filter-aaaa-on-v4 yes; filter-aaaa { 10.53.0.1; }; }; zone "." { type master; file "root.db"; }; zone "signed" { type master; file "signed.db.signed"; }; zone "unsigned" { type master; file "unsigned.db"; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/root.db0000644000470500017500000000170712271526120022440 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld hostmaster.ns.utld ( 1 3600 1200 604800 60 ) @ NS ns.utld ns.utld A 10.53.0.1 ns.utld AAAA fd92:7065:b8e:ffff::1 ; signed NS ns.utld unsigned NS ns.utld bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/signed.db.in0000644000470500017500000000175612271526120023337 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld. hostmaster.ns.utld. ( 1 3600 1200 604800 60 ) @ NS ns.utld. @ MX 0 mx a-only NS 1.0.0.1 aaaa-only AAAA 2001:db8::2 dual A 1.0.0.3 dual AAAA 2001:db8::3 mx A 1.0.0.3 mx AAAA 2001:db8::3 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/unsigned.db0000644000470500017500000000175612271526120023275 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld. hostmaster.ns.utld. ( 1 3600 1200 604800 60 ) @ NS ns.utld. @ MX 0 mx a-only NS 1.0.0.4 aaaa-only AAAA 2001:db8::5 dual A 1.0.0.6 dual AAAA 2001:db8::6 mx A 1.0.0.3 mx AAAA 2001:db8::3 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns1/sign.sh0000755000470500017500000000246612271526120022450 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.2 2010/06/22 03:58:37 marka Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data dlvsets= zone=signed. infile=signed.db.in zonefile=signed.db.signed outfile=signed.db.signed keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` cat $infile $keyname1.key $keyname2.key >$zonefile $SIGNER -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err echo "I: signed $zone" bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/0002755000470500017500000000000012276444015021155 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/named.conf0000644000470500017500000000246112271526120023102 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/06/22 03:58:38 marka Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.4; notify-source 10.53.0.4; transfer-source 10.53.0.4; port 5300; pid-file "named.pid"; listen-on { 10.53.0.4; }; listen-on-v6 { fd92:7065:b8e:ffff::4; }; recursion no; notify yes; filter-aaaa-on-v4 break-dnssec; filter-aaaa { 10.53.0.4; }; }; zone "." { type master; file "root.db"; }; zone "signed" { type master; file "signed.db.signed"; }; zone "unsigned" { type master; file "unsigned.db"; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/root.db0000644000470500017500000000170712271526120022443 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld hostmaster.ns.utld ( 1 3600 1200 604800 60 ) @ NS ns.utld ns.utld A 10.53.0.1 ns.utld AAAA fd92:7065:b8e:ffff::1 ; signed NS ns.utld unsigned NS ns.utld bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/signed.db.in0000644000470500017500000000175612271526120023342 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld. hostmaster.ns.utld. ( 1 3600 1200 604800 60 ) @ NS ns.utld. @ MX 0 mx a-only NS 1.0.0.1 aaaa-only AAAA 2001:db8::2 dual A 1.0.0.3 dual AAAA 2001:db8::3 mx A 1.0.0.3 mx AAAA 2001:db8::3 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/unsigned.db0000644000470500017500000000174312271526120023274 0ustar lamontlamont; Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 @ SOA ns.utld. hostmaster.ns.utld. ( 1 3600 1200 604800 60 ) @ NS ns.utld. a-only NS 1.0.0.4 aaaa-only AAAA 2001:db8::5 dual A 1.0.0.6 dual AAAA 2001:db8::6 mx A 1.0.0.3 mx AAAA 2001:db8::3 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns4/sign.sh0000755000470500017500000000246612271526120022453 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.2 2010/06/22 03:58:38 marka Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data dlvsets= zone=signed. infile=signed.db.in zonefile=signed.db.signed outfile=signed.db.signed keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` cat $infile $keyname1.key $keyname2.key >$zonefile $SIGNER -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err echo "I: signed $zone" bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/clean.sh0000644000470500017500000000226512271526120022063 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.2 2010/06/22 03:58:36 marka Exp $ rm -f ns1/K* rm -f ns1/*.signed rm -f ns1/signer.err rm -f ns1/dsset-* rm -f ns1/named.run rm -f ns1/named.memstats rm -f ns2/named.run rm -f ns2/named.memstats rm -f ns3/named.run rm -f ns3/named.memstats rm -f ns4/K* rm -f ns4/*.signed rm -f ns4/signer.err rm -f ns4/dsset-* rm -f ns4/named.run rm -f ns4/named.memstats rm -f random.data rm -f dig.out.* bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns3/0002755000470500017500000000000012276444015021154 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns3/named.conf0000644000470500017500000000231512271526120023077 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/06/22 03:58:38 marka Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; pid-file "named.pid"; listen-on { 10.53.0.3; }; listen-on-v6 { fd92:7065:b8e:ffff::3; }; recursion yes; notify yes; filter-aaaa-on-v4 break-dnssec; filter-aaaa { 10.53.0.3; }; }; zone "." { type hint; file "hints"; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns3/hints0000644000470500017500000000156712271526120022224 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: hints,v 1.2 2010/06/22 03:58:38 marka Exp $ . 0 NS ns.rootservers.utld. ns.rootservers.utld. 0 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/setup.sh0000644000470500017500000000167012271526120022140 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.2 2010/06/22 03:58:36 marka Exp $ sh clean.sh ../../../tools/genrandom 400 random.data (cd ns1 && sh -e sign.sh) (cd ns4 && sh -e sign.sh) bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/Makefile.in0000644000470500017500000000251612271526120022511 0ustar lamontlamont# Copyright (C) 2010-2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: Makefile.in,v 1.4 2011/07/28 23:47:58 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${ISC_INCLUDES} CDEFINES = CWARNINGS = DNSLIBS = ISCLIBS = . DNSDEPLIBS = ISCDEPLIBS = DEPLIBS = LIBS = @LIBS@ TARGETS = filter-aaaa@EXEEXT@ FILTEROBJS = filter-aaaa.@O@ SRCS = filter-aaaa.c @BIND9_MAKE_RULES@ all: filter-aaaa@EXEEXT@ filter-aaaa@EXEEXT@: ${FILTEROBJS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${FILTEROBJS} ${LIBS} clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/filter-aaaa.c0000644000470500017500000000202212271526120022746 0ustar lamontlamont/* * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: filter-aaaa.c,v 1.4 2011/07/28 23:47:58 tbox Exp $ */ #include #include int main(int argc, char **argv) { UNUSED(argc); UNUSED(argv); #ifdef ALLOW_FILTER_AAAA_ON_V4 return (0); #else return (1); #endif } bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/0002755000470500017500000000000012276444015021376 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good7.conf0000644000470500017500000000165112271526120023256 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good7.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { }; view myview { filter-aaaa { 1.0.0.0/8; }; filter-aaaa-on-v4 yes; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad3.conf0000644000470500017500000000164112271526120023047 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad3.conf,v 1.2 2010/06/22 03:58:36 marka Exp $ */ options { filter-aaaa-on-v4 no; }; view myview { filter-aaaa { any; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad6.conf0000644000470500017500000000164312271526120023054 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad6.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 yes; }; view myview { filter-aaaa { none; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good2.conf0000644000470500017500000000160312271526120023246 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good2.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 break-dnssec; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad2.conf0000644000470500017500000000236412271526120023051 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad2.conf,v 1.2 2010/06/22 03:58:36 marka Exp $ */ options { /* * While this matches the defaults, it is not a good configuration * to have in named.conf as the two options contradict each other * indicating a error on behalf of the operator. * * The default is to have filter-aaaa-on-v4 off, but if it is turned * on then it applies to all IPv4 queries. This results in * contradictory defaults. */ filter-aaaa-on-v4 no; filter-aaaa { any; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad5.conf0000644000470500017500000000164312271526120023053 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad5.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa { none; }; }; view myview { filter-aaaa-on-v4 yes; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad1.conf0000644000470500017500000000162112271526120023043 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad1.conf,v 1.2 2010/06/22 03:58:36 marka Exp $ */ options { filter-aaaa-on-v4 yes; filter-aaaa { none; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/bad4.conf0000644000470500017500000000164112271526120023050 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad4.conf,v 1.2 2010/06/22 03:58:36 marka Exp $ */ options { filter-aaaa { any; }; }; view myview { filter-aaaa-on-v4 no; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good5.conf0000644000470500017500000000165112271526120023254 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good5.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 yes; }; view myview { filter-aaaa { 1.0.0.0/8; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good4.conf0000644000470500017500000000162712271526120023256 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good4.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 yes; filter-aaaa { 1.0.0.0/8; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good6.conf0000644000470500017500000000165112271526120023255 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good6.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa { 1.0.0.0/8; }; }; view myview { filter-aaaa-on-v4 yes; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good8.conf0000644000470500017500000000170012271526120023252 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good8.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 no; }; view myview { filter-aaaa { 1.0.0.0/8; }; filter-aaaa-on-v4 yes; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good3.conf0000644000470500017500000000164012271526120023250 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good3.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 break-dnssec; filter-aaaa { 1.0.0.0/8; }; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/conf/good1.conf0000644000470500017500000000157212271526120023252 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good1.conf,v 1.2 2010/06/22 03:58:37 marka Exp $ */ options { filter-aaaa-on-v4 yes; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns2/0002755000470500017500000000000012276444015021153 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns2/named.conf0000644000470500017500000000230412271526120023074 0ustar lamontlamont/* * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2010/06/22 03:58:38 marka Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { fd92:7065:b8e:ffff::2; }; recursion yes; notify yes; filter-aaaa-on-v4 yes; filter-aaaa { 10.53.0.2; }; }; zone "." { type hint; file "hints"; }; bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/ns2/hints0000644000470500017500000000156712271526120022223 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: hints,v 1.2 2010/06/22 03:58:37 marka Exp $ . 0 NS ns.rootservers.utld. ns.rootservers.utld. 0 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/filter-aaaa/prereq.sh0000644000470500017500000000170712271526120022277 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: prereq.sh,v 1.2 2010/06/22 03:58:36 marka Exp $ if ./filter-aaaa then : else echo "I:This test requires --enable-filter-aaaa at compile time." >&2 exit 1 fi bind9-9.9.5.dfsg/bin/tests/system/resolver/0002755000470500017500000000000012276444015020144 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/tests.sh0000755000470500017500000003772012271526120021645 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2009-2013 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 n=0 echo "I:checking non-cachable NXDOMAIN response handling" ret=0 $DIG +tcp nxdomain.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NXDOMAIN" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking non-cachable NXDOMAIN response handling using dns_client" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 nxdomain.example.net 2> sample.out || ret=1 grep "resolution failed: ncache nxdomain" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking non-cachable NODATA response handling" ret=0 $DIG +tcp nodata.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking non-cachable NODATA response handling using dns_client" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 nodata.example.net 2> sample.out || ret=1 grep "resolution failed: ncache nxrrset" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking handling of bogus referrals" # If the server has the "INSIST(!external)" bug, this query will kill it. $DIG +tcp www.example.com. a @10.53.0.1 -p 5300 >/dev/null || status=1 if [ -x ${SAMPLE} ] ; then echo "I:checking handling of bogus referrals using dns_client" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 www.example.com 2> sample.out || ret=1 grep "resolution failed: failure" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:check handling of cname + other data / 1" $DIG +tcp cname1.example.com. a @10.53.0.1 -p 5300 >/dev/null || status=1 echo "I:check handling of cname + other data / 2" $DIG +tcp cname2.example.com. a @10.53.0.1 -p 5300 >/dev/null || status=1 echo "I:check that server is still running" $DIG +tcp www.example.com. a @10.53.0.1 -p 5300 >/dev/null || status=1 echo "I:checking answer IPv4 address filtering (deny)" ret=0 $DIG +tcp www.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: SERVFAIL" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking answer IPv6 address filtering (deny)" ret=0 $DIG +tcp www.example.net @10.53.0.1 aaaa -p 5300 > dig.out || ret=1 grep "status: SERVFAIL" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking answer IPv4 address filtering (accept)" ret=0 $DIG +tcp www.example.org @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking answer IPv4 address filtering using dns_client (accept)" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 www.example.org > sample.out || ret=1 grep "www.example.org..*.192.0.2.1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking answer IPv6 address filtering (accept)" ret=0 $DIG +tcp www.example.org @10.53.0.1 aaaa -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking answer IPv6 address filtering using dns_client (accept)" ret=0 ${SAMPLE} -p 5300 -t aaaa 10.53.0.1 www.example.org > sample.out || ret=1 grep "www.example.org..*.2001:db8:beef::1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking CNAME target filtering (deny)" ret=0 $DIG +tcp badcname.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: SERVFAIL" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking CNAME target filtering (accept)" ret=0 $DIG +tcp goodcname.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking CNAME target filtering using dns_client (accept)" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 goodcname.example.net > sample.out || ret=1 grep "goodcname.example.net..*.goodcname.example.org." sample.out > /dev/null || ret=1 grep "goodcname.example.org..*.192.0.2.1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking CNAME target filtering (accept due to subdomain)" ret=0 $DIG +tcp cname.sub.example.org @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking CNAME target filtering using dns_client (accept due to subdomain)" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 cname.sub.example.org > sample.out || ret=1 grep "cname.sub.example.org..*.ok.sub.example.org." sample.out > /dev/null || ret=1 grep "ok.sub.example.org..*.192.0.2.1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking DNAME target filtering (deny)" ret=0 $DIG +tcp foo.baddname.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: SERVFAIL" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking DNAME target filtering (accept)" ret=0 $DIG +tcp foo.gooddname.example.net @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking DNAME target filtering using dns_client (accept)" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 foo.gooddname.example.net > sample.out || ret=1 grep "foo.gooddname.example.net..*.gooddname.example.org" sample.out > /dev/null || ret=1 grep "foo.gooddname.example.org..*.192.0.2.1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi echo "I:checking DNAME target filtering (accept due to subdomain)" ret=0 $DIG +tcp www.dname.sub.example.org @10.53.0.1 a -p 5300 > dig.out || ret=1 grep "status: NOERROR" dig.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` if [ -x ${SAMPLE} ] ; then echo "I:checking DNAME target filtering using dns_client (accept due to subdomain)" ret=0 ${SAMPLE} -p 5300 -t a 10.53.0.1 www.dname.sub.example.org > sample.out || ret=1 grep "www.dname.sub.example.org..*.ok.sub.example.org." sample.out > /dev/null || ret=1 grep "www.ok.sub.example.org..*.192.0.2.1" sample.out > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` fi n=`expr $n + 1` echo "I: RT21594 regression test check setup ($n)" ret=0 # Check that "aa" is not being set by the authoritative server. $DIG +tcp . @10.53.0.4 soa -p 5300 > dig.ns4.out.${n} || ret=1 grep 'flags: qr rd;' dig.ns4.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I: RT21594 regression test positive answers ($n)" ret=0 # Check that resolver accepts the non-authoritative positive answers. $DIG +tcp . @10.53.0.5 soa -p 5300 > dig.ns5.out.${n} || ret=1 grep "status: NOERROR" dig.ns5.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I: RT21594 regression test NODATA answers ($n)" ret=0 # Check that resolver accepts the non-authoritative nodata answers. $DIG +tcp . @10.53.0.5 txt -p 5300 > dig.ns5.out.${n} || ret=1 grep "status: NOERROR" dig.ns5.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I: RT21594 regression test NXDOMAIN answers ($n)" ret=0 # Check that resolver accepts the non-authoritative positive answers. $DIG +tcp noexistant @10.53.0.5 txt -p 5300 > dig.ns5.out.${n} || ret=1 grep "status: NXDOMAIN" dig.ns5.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:check that replacement of additional data by a negative cache no data entry clears the additional RRSIGs ($n)" ret=0 $DIG +tcp mx example.net @10.53.0.7 -p 5300 > dig.ns7.out.${n} || ret=1 grep "status: NOERROR" dig.ns7.out.${n} > /dev/null || ret=1 if [ $ret = 1 ]; then echo "I:mx priming failed"; fi $NSUPDATE << EOF server 10.53.0.6 5300 zone example.net update delete mail.example.net A update add mail.example.net 0 AAAA ::1 send EOF $DIG +tcp a mail.example.net @10.53.0.7 -p 5300 > dig.ns7.out.${n} || ret=2 grep "status: NOERROR" dig.ns7.out.${n} > /dev/null || ret=2 grep "ANSWER: 0" dig.ns7.out.${n} > /dev/null || ret=2 if [ $ret = 2 ]; then echo "I:ncache priming failed"; fi $DIG +tcp mx example.net @10.53.0.7 -p 5300 > dig.ns7.out.${n} || ret=3 grep "status: NOERROR" dig.ns7.out.${n} > /dev/null || ret=3 $DIG +tcp rrsig mail.example.net +norec @10.53.0.7 -p 5300 > dig.ns7.out.${n} || ret=4 grep "status: NOERROR" dig.ns7.out.${n} > /dev/null || ret=4 grep "ANSWER: 0" dig.ns7.out.${n} > /dev/null || ret=4 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi status=`expr $status + $ret` if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi status=`expr $status + $ret` n=`expr $n + 1` echo "I:checking that update a nameservers address has immediate effects ($n)" ret=0 $DIG +tcp TXT foo.moves @10.53.0.7 -p 5300 > dig.ns7.foo.${n} || ret=1 grep "From NS 5" dig.ns7.foo.${n} > /dev/null || ret=1 $NSUPDATE << EOF server 10.53.0.7 5300 zone server update delete ns.server A update add ns.server 300 A 10.53.0.4 send EOF sleep 1 $DIG +tcp TXT bar.moves @10.53.0.7 -p 5300 > dig.ns7.bar.${n} || ret=1 grep "From NS 4" dig.ns7.bar.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; status=1; fi n=`expr $n + 1` echo "I:checking that update a nameservers glue has immediate effects ($n)" ret=0 $DIG +tcp TXT foo.child.server @10.53.0.7 -p 5300 > dig.ns7.foo.${n} || ret=1 grep "From NS 5" dig.ns7.foo.${n} > /dev/null || ret=1 $NSUPDATE << EOF server 10.53.0.7 5300 zone server update delete ns.child.server A update add ns.child.server 300 A 10.53.0.4 send EOF sleep 1 $DIG +tcp TXT bar.child.server @10.53.0.7 -p 5300 > dig.ns7.bar.${n} || ret=1 grep "From NS 4" dig.ns7.bar.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; status=1; fi n=`expr $n + 1` echo "I:checking empty RFC 1918 reverse zones ($n)" ret=0 # Check that "aa" is being set by the resolver for RFC 1918 zones # except the one that has been deliberately disabled $DIG @10.53.0.7 -p 5300 -x 10.1.1.1 > dig.ns4.out.1.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.1.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 192.168.1.1 > dig.ns4.out.2.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.2.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.16.1.1 > dig.ns4.out.3.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.3.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.17.1.1 > dig.ns4.out.4.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.4.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.18.1.1 > dig.ns4.out.5.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.5.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.19.1.1 > dig.ns4.out.6.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.6.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.21.1.1 > dig.ns4.out.7.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.7.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.22.1.1 > dig.ns4.out.8.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.8.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.23.1.1 > dig.ns4.out.9.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.9.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.24.1.1 > dig.ns4.out.11.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.11.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.25.1.1 > dig.ns4.out.12.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.12.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.26.1.1 > dig.ns4.out.13.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.13.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.27.1.1 > dig.ns4.out.14.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.14.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.28.1.1 > dig.ns4.out.15.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.15.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.29.1.1 > dig.ns4.out.16.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.16.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.30.1.1 > dig.ns4.out.17.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.17.${n} > /dev/null || ret=1 $DIG @10.53.0.7 -p 5300 -x 172.31.1.1 > dig.ns4.out.18.${n} || ret=1 grep 'flags: qr aa rd ra;' dig.ns4.out.18.${n} > /dev/null || ret=1 # but this one should NOT be authoritative $DIG @10.53.0.7 -p 5300 -x 172.20.1.1 > dig.ns4.out.19.${n} || ret=1 grep 'flags: qr rd ra;' dig.ns4.out.19.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; status=1; fi n=`expr $n + 1` echo "I:checking that removal of a delegation is honoured ($n)" ret=0 $DIG -p 5300 @10.53.0.5 www.to-be-removed.tld A > dig.ns5.prime.${n} grep "status: NOERROR" dig.ns5.prime.${n} > /dev/null || { ret=1; echo "I: priming failed"; } cp ns4/tld2.db ns4/tld.db ($RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 reload tld 2>&1 ) | sed -e '/reload queued/d' -e 's/^/I:ns4 /' old= for i in 0 1 2 3 4 5 6 7 8 9 do foo=0 $DIG -p 5300 @10.53.0.5 ns$i.to-be-removed.tld A > /dev/null $DIG -p 5300 @10.53.0.5 www.to-be-removed.tld A > dig.ns5.out.${n} grep "status: NXDOMAIN" dig.ns5.out.${n} > /dev/null || foo=1 [ $foo = 0 ] && break $NSUPDATE << EOF server 10.53.0.6 5300 zone to-be-removed.tld update add to-be-removed.tld 100 NS ns${i}.to-be-removed.tld update delete to-be-removed.tld NS ns${old}.to-be-removed.tld send EOF old=$i sleep 1 done [ $ret = 0 ] && ret=$foo; if [ $ret != 0 ]; then echo "I:failed"; status=1; fi n=`expr $n + 1` echo "I:check for improved error message with SOA mismatch ($n)" ret=0 $DIG @10.53.0.1 -p 5300 www.sub.broken aaaa > dig.out.${n} || ret=1 grep "not subdomain of zone" ns1/named.run > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` #HERE <<< cp ns7/named2.conf ns7/named.conf $RNDC -c ../common/rndc.conf -s 10.53.0.7 -p 9953 reconfig 2>&1 | sed 's/^/I:ns7 /' n=`expr $n + 1` echo "I:check resolution on the listening port ($n)" ret=0 $DIG +tcp +tries=2 +time=5 mx example.net @10.53.0.7 -p 5300 > dig.ns7.out.${n} || ret=2 grep "status: NOERROR" dig.ns7.out.${n} > /dev/null || ret=1 grep "ANSWER: 1" dig.ns7.out.${n} > /dev/null || ret=1 if [ $ret != 0 ]; then echo "I:failed"; ret=1; fi status=`expr $status + $ret` #HERE >>> echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/resolver/ns1/0002755000470500017500000000000012276444015020645 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ns1/named.conf0000644000470500017500000000270312271526120022571 0ustar lamontlamont/* * Copyright (C) 2004, 2007, 2009, 2013 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.15 2009/05/29 23:47:49 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion yes; acache-enable yes; deny-answer-addresses { 192.0.2.0/24; 2001:db8:beef::/48; } except-from { "example.org"; }; deny-answer-aliases { "example.org"; } except-from { "goodcname.example.net"; "gooddname.example.net"; }; allow-query {!10.53.0.8; any; }; }; zone "." { type hint; file "root.hint"; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/ns1/root.hint0000644000470500017500000000171212271526120022504 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.hint,v 1.7 2007/06/19 23:47:05 tbox Exp $ $TTL 999999 . IN NS a.root-servers.nil. a.root-servers.nil. IN A 10.53.0.2 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/0002755000470500017500000000000012276444015020650 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/moves.db0000644000470500017500000000204712271526120022302 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: moves.db,v 1.3 2011/03/13 23:47:35 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.server. foo TXT "From NS 4" bar TXT "From NS 4" bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/tld2.db0000644000470500017500000000173412271526120022020 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.tld. ns A 10.53.0.4 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/named.conf0000644000470500017500000000273012271526120022574 0ustar lamontlamont/* * Copyright (C) 2010-2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ // NS4 controls { /* empty */ }; options { query-source address 10.53.0.4; notify-source 10.53.0.4; transfer-source 10.53.0.4; port 5300; pid-file "named.pid"; listen-on { 10.53.0.4; }; listen-on-v6 { none; }; recursion no; // minimal-responses yes; }; zone "." { type master; file "root.db"; }; zone "moves" { type master; file "moves.db"; }; zone "child.server" { type master; file "child.server.db"; }; zone "tld" { type master; file "tld.db"; }; zone "broken" { type master; file "broken.db"; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.4 port 9953 allow { any; } keys { rndc_key; }; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/root.db0000644000470500017500000000205512271526120022133 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.2 2010/09/15 12:07:56 marka Exp $ $TTL 300 . IN SOA marka.isc.org. a.root.servers.nil. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.4 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/named.noaa0000644000470500017500000000032012271526120022556 0ustar lamontlamontCopyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") See COPYRIGHT in the source root or http://isc.org/copyright.html for terms. $Id: named.noaa,v 1.2 2010/09/15 12:07:56 marka Exp $ Add -T noaa. bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/broken.db0000644000470500017500000000211412271526120022424 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: tld1.db,v 1.3 2012/02/09 23:47:18 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.tld. ns A 10.53.0.4 $TTL 5 sub.broken. NS ns.sub.broken. ns.sub.broken. A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/child.server.db0000644000470500017500000000206712271526120023543 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: child.server.db,v 1.3 2011/03/13 23:47:35 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns ns A 10.53.0.4 foo TXT "From NS 4" bar TXT "From NS 4" bind9-9.9.5.dfsg/bin/tests/system/resolver/ns4/tld1.db0000644000470500017500000000204412271526120022012 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.tld. ns A 10.53.0.4 $TTL 5 to-be-removed NS ns.to-be-removed ns.to-be-removed A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/clean.sh0000644000470500017500000000231312271526120021550 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2008-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # # Clean up after resolver tests. # rm -f */named.memstats rm -f dig.out dig.*.out.* rm -f dig.*.foo.* rm -f dig.*.bar.* rm -f dig.*.prime.* rm -f ns4/tld.db rm -f ns6/K* rm -f ns6/example.net.db.signed ns6/example.net.db rm -f ns6/dsset-example.net. ns6/example.net.db.signed.jnl rm -f ns6/to-be-removed.tld.db ns6/to-be-removed.tld.db.jnl rm -f ns7/server.db ns7/server.db.jnl ns7/named.conf rm -f random.data rm -f sample.out bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/0002755000470500017500000000000012276444015020652 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/moves.db0000644000470500017500000000204712271526120022304 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: moves.db,v 1.3 2011/03/13 23:47:36 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.server. foo TXT "From NS 6" bar TXT "From NS 6" bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/keygen.sh0000644000470500017500000000223512271526120022461 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: keygen.sh,v 1.2 2010/11/16 06:46:44 marka Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=example.net zonefile="${zone}.db" infile="${zonefile}.in" cp $infile $zonefile ksk=`$KEYGEN -q -3 -r $RANDFILE -fk $zone` zsk=`$KEYGEN -q -3 -r $RANDFILE $zone` cat $ksk.key $zsk.key >> $zonefile $SIGNER -P -r $RANDFILE -o $zone $zonefile > /dev/null 2>&1 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/named.conf0000644000470500017500000000255612271526120022604 0ustar lamontlamont/* * Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ // NS4 controls { /* empty */ }; options { query-source address 10.53.0.6; notify-source 10.53.0.6; transfer-source 10.53.0.6; port 5300; pid-file "named.pid"; listen-on { 10.53.0.6; }; listen-on-v6 { none; }; recursion no; // minimal-responses yes; }; zone "." { type master; file "root.db"; }; zone "example.net" { type master; file "example.net.db.signed"; allow-update { any; }; }; zone "to-be-removed.tld" { type master; file "to-be-removed.tld.db"; allow-update { any; }; }; zone "broken" { type master; file "broken.db"; allow-update { any; }; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/root.db0000644000470500017500000000217312271526120022136 0ustar lamontlamont; Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.4 2011/03/13 23:47:36 tbox Exp $ $TTL 300 . IN SOA marka.isc.org. a.root.servers.nil. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.6 moves. NS ns.server. server. NS ns7.server. ns7.server. A 10.53.0.7 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/to-be-removed.tld.db.in0000644000470500017500000000211012271526120024776 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 600 @ IN SOA ns hostmaster 1 1800 900 604800 600 @ IN NS ns ns IN A 10.53.0.6 ns0 IN A 10.53.0.6 ns1 IN A 10.53.0.6 ns2 IN A 10.53.0.6 ns3 IN A 10.53.0.6 ns4 IN A 10.53.0.6 ns5 IN A 10.53.0.6 ns6 IN A 10.53.0.6 ns7 IN A 10.53.0.6 ns8 IN A 10.53.0.6 ns9 IN A 10.53.0.6 $TTL 1 @ IN A 10.53.0.6 www IN A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/broken.db0000644000470500017500000000221112271526120022424 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: to-be-removed.tld.db.in,v 1.3 2012/02/09 23:47:18 tbox Exp $ $TTL 600 @ IN SOA ns hostmaster 1 1800 900 604800 600 @ IN NS ns ns IN A 10.53.0.6 ns0 IN A 10.53.0.6 ns1 IN A 10.53.0.6 ns2 IN A 10.53.0.6 ns3 IN A 10.53.0.6 ns4 IN A 10.53.0.6 ns5 IN A 10.53.0.6 ns6 IN A 10.53.0.6 ns7 IN A 10.53.0.6 ns8 IN A 10.53.0.6 ns9 IN A 10.53.0.6 $TTL 1 @ IN A 10.53.0.6 www.sub IN A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns6/example.net.db.in0000644000470500017500000000167112271526120024002 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.net.db.in,v 1.3 2010/11/17 23:47:08 tbox Exp $ $TTL 600 @ IN SOA ns hostmaster 1 1800 900 604800 600 @ IN NS ns @ IN MX 0 mail ns IN A 10.53.0.6 mail IN A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns5/0002755000470500017500000000000012276444015020651 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ns5/moves.db0000644000470500017500000000204712271526120022303 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: moves.db,v 1.3 2011/03/13 23:47:36 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns.server. foo TXT "From NS 5" bar TXT "From NS 5" bind9-9.9.5.dfsg/bin/tests/system/resolver/ns5/named.conf0000644000470500017500000000235212271526120022575 0ustar lamontlamont/* * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.4 2011/03/13 23:47:36 tbox Exp $ */ // NS4 controls { /* empty */ }; options { query-source address 10.53.0.5; notify-source 10.53.0.5; transfer-source 10.53.0.5; port 5300; pid-file "named.pid"; listen-on { 10.53.0.5; }; listen-on-v6 { none; }; recursion yes; }; zone "." { type hint; file "root.hint"; }; zone "moves" { type master; file "moves.db"; }; zone "child.server" { type master; file "child.server.db"; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/ns5/root.hint0000644000470500017500000000161312271526120022510 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.hint,v 1.2 2010/09/15 12:07:56 marka Exp $ $TTL 999999 . IN NS a.root-servers.nil. a.root-servers.nil. IN A 10.53.0.4 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns5/child.server.db0000644000470500017500000000206712271526120023544 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: child.server.db,v 1.3 2011/03/13 23:47:36 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. ns.server. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns ns A 10.53.0.5 foo TXT "From NS 5" bar TXT "From NS 5" bind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/0002755000470500017500000000000012276444015020653 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/named1.conf0000644000470500017500000000253312271526120022661 0ustar lamontlamont/* * Copyright (C) 2010, 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ // NS4 controls { /* empty */ }; options { query-source address 10.53.0.7; notify-source 10.53.0.7; transfer-source 10.53.0.7; port 5300; pid-file "named.pid"; listen-on { 10.53.0.7; }; listen-on-v6 { none; }; recursion yes; empty-zones-enable yes; disable-empty-zone 20.172.in-addr.arpa; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.7 port 9953 allow { any; } keys { rndc_key; }; }; zone "." { type hint; file "root.hint"; }; zone "server" { type master; file "server.db"; allow-update { any; }; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/named.args0000644000470500017500000000015412271526120022604 0ustar lamontlamont# this server runs named with the "-T clienttest" option omitted -m record,size,mctx -c named.conf -d 99 -g bind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/server.db.in0000644000470500017500000000211612271526120023064 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: server.db.in,v 1.3 2011/03/13 23:47:36 tbox Exp $ $TTL 300 @ IN SOA marka.isc.org. a.root.servers.nil. ( 2010 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) @ NS ns7 ns7 A 10.53.0.7 ns A 10.53.0.5 child NS ns.child ns.child A 10.53.0.5 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/root.hint0000644000470500017500000000161312271526120022512 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.hint,v 1.2 2010/11/16 06:46:44 marka Exp $ $TTL 999999 . IN NS a.root-servers.nil. a.root-servers.nil. IN A 10.53.0.6 bind9-9.9.5.dfsg/bin/tests/system/resolver/ns7/named2.conf0000644000470500017500000000241412271526120022660 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ // NS4 controls { /* empty */ }; options { query-source address 10.53.0.7 port 5300; notify-source 10.53.0.7; transfer-source 10.53.0.7; port 5300; pid-file "named.pid"; listen-on { 10.53.0.7; }; listen-on-v6 { none; }; recursion yes; empty-zones-enable yes; disable-empty-zone 20.172.in-addr.arpa; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.7 port 9953 allow { any; } keys { rndc_key; }; }; zone "." { type hint; file "root.hint"; }; bind9-9.9.5.dfsg/bin/tests/system/resolver/setup.sh0000644000470500017500000000177112271526120021635 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2010-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ ../../../tools/genrandom 400 random.data cp ns4/tld1.db ns4/tld.db cp ns6/to-be-removed.tld.db.in ns6/to-be-removed.tld.db cp ns7/server.db.in ns7/server.db cp ns7/named1.conf ns7/named.conf (cd ns6 && sh keygen.sh) bind9-9.9.5.dfsg/bin/tests/system/resolver/ans2/0002755000470500017500000000000012276444015021007 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ans2/ans.pl0000644000470500017500000001057512271526120022124 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2004, 2007, 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: ans.pl,v 1.15 2010/05/19 09:33:50 tbox Exp $ # # Ad hoc name server # use IO::File; use IO::Socket; use Net::DNS; use Net::DNS::Packet; my $sock = IO::Socket::INET->new(LocalAddr => "10.53.0.2", LocalPort => 5300, Proto => "udp") or die "$!"; my $pidf = new IO::File "ans.pid", "w" or die "cannot open pid file: $!"; print $pidf "$$\n" or die "cannot write pid file: $!"; $pidf->close or die "cannot close pid file: $!"; sub rmpid { unlink "ans.pid"; exit 1; }; $SIG{INT} = \&rmpid; $SIG{TERM} = \&rmpid; for (;;) { $sock->recv($buf, 512); print "**** request from " , $sock->peerhost, " port ", $sock->peerport, "\n"; my $packet; if ($Net::DNS::VERSION > 0.68) { $packet = new Net::DNS::Packet(\$buf, 0); $@ and die $@; } else { my $err; ($packet, $err) = new Net::DNS::Packet(\$buf, 0); $err and die $err; } print "REQUEST:\n"; $packet->print; $packet->header->qr(1); my @questions = $packet->question; my $qname = $questions[0]->qname; my $qtype = $questions[0]->qtype; if ($qname eq "cname1.example.com") { # Data for the "cname + other data / 1" test $packet->push("answer", new Net::DNS::RR("cname1.example.com 300 CNAME cname1.example.com")); $packet->push("answer", new Net::DNS::RR("cname1.example.com 300 A 1.2.3.4")); } elsif ($qname eq "cname2.example.com") { # Data for the "cname + other data / 2" test: same RRs in opposite order $packet->push("answer", new Net::DNS::RR("cname2.example.com 300 A 1.2.3.4")); $packet->push("answer", new Net::DNS::RR("cname2.example.com 300 CNAME cname2.example.com")); } elsif ($qname eq "www.example.org" || $qname eq "www.example.net" || $qname eq "badcname.example.org" || $qname eq "goodcname.example.org" || $qname eq "foo.baddname.example.org" || $qname eq "foo.gooddname.example.org") { # Data for address/alias filtering. $packet->header->aa(1); if ($qtype eq "A") { $packet->push("answer", new Net::DNS::RR($qname . " 300 A 192.0.2.1")); } elsif ($qtype eq "AAAA") { $packet->push("answer", new Net::DNS::RR($qname . " 300 AAAA 2001:db8:beef::1")); } } elsif ($qname eq "badcname.example.net" || $qname eq "goodcname.example.net") { # Data for CNAME/DNAME filtering. We need to make one-level # delegation to avoid automatic acceptance for subdomain aliases $packet->push("authority", new Net::DNS::RR("example.net 300 NS ns.example.net")); $packet->push("additional", new Net::DNS::RR("ns.example.net 300 A 10.53.0.3")); } elsif ($qname =~ /^nodata\.example\.net$/i) { $packet->header->aa(1); } elsif ($qname =~ /^nxdomain\.example\.net$/i) { $packet->header->aa(1); $packet->header->rcode(NXDOMAIN); } elsif ($qname =~ /sub\.example\.org/) { # Data for CNAME/DNAME filtering. The final answers are # expected to be accepted regardless of the filter setting. $packet->push("authority", new Net::DNS::RR("sub.example.org 300 NS ns.sub.example.org")); $packet->push("additional", new Net::DNS::RR("ns.sub.example.org 300 A 10.53.0.3")); } elsif ($qname =~ /\.broken/) { # Delegation to broken TLD. $packet->push("authority", new Net::DNS::RR("broken 300 NS ns.broken")); $packet->push("additional", new Net::DNS::RR("ns.broken 300 A 10.53.0.4")); } else { # Data for the "bogus referrals" test $packet->push("authority", new Net::DNS::RR("below.www.example.com 300 NS ns.below.www.example.com")); $packet->push("additional", new Net::DNS::RR("ns.below.www.example.com 300 A 10.53.0.3")); } $sock->send($packet->data); print "RESPONSE:\n"; $packet->print; print "\n"; } bind9-9.9.5.dfsg/bin/tests/system/resolver/ans3/0002755000470500017500000000000012276444015021010 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/resolver/ans3/ans.pl0000644000470500017500000000634212271526120022122 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2004, 2007, 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: ans.pl,v 1.12 2009/11/04 02:15:30 marka Exp $ # # Ad hoc name server # use IO::File; use IO::Socket; use Net::DNS; use Net::DNS::Packet; my $sock = IO::Socket::INET->new(LocalAddr => "10.53.0.3", LocalPort => 5300, Proto => "udp") or die "$!"; my $pidf = new IO::File "ans.pid", "w" or die "cannot open pid file: $!"; print $pidf "$$\n" or die "cannot write pid file: $!"; $pidf->close or die "cannot close pid file: $!"; sub rmpid { unlink "ans.pid"; exit 1; }; $SIG{INT} = \&rmpid; $SIG{TERM} = \&rmpid; for (;;) { $sock->recv($buf, 512); print "**** request from " , $sock->peerhost, " port ", $sock->peerport, "\n"; my $packet; if ($Net::DNS::VERSION > 0.68) { $packet = new Net::DNS::Packet(\$buf, 0); $@ and die $@; } else { my $err; ($packet, $err) = new Net::DNS::Packet(\$buf, 0); $err and die $err; } print "REQUEST:\n"; $packet->print; $packet->header->qr(1); $packet->header->aa(1); my @questions = $packet->question; my $qname = $questions[0]->qname; if ($qname eq "badcname.example.net") { $packet->push("answer", new Net::DNS::RR($qname . " 300 CNAME badcname.example.org")); } elsif ($qname eq "foo.baddname.example.net") { $packet->push("answer", new Net::DNS::RR("baddname.example.net" . " 300 DNAME baddname.example.org")); } elsif ($qname eq "foo.gooddname.example.net") { $packet->push("answer", new Net::DNS::RR("gooddname.example.net" . " 300 DNAME gooddname.example.org")); } elsif ($qname eq "goodcname.example.net") { $packet->push("answer", new Net::DNS::RR($qname . " 300 CNAME goodcname.example.org")); } elsif ($qname eq "cname.sub.example.org") { $packet->push("answer", new Net::DNS::RR($qname . " 300 CNAME ok.sub.example.org")); } elsif ($qname eq "ok.sub.example.org") { $packet->push("answer", new Net::DNS::RR($qname . " 300 A 192.0.2.1")); } elsif ($qname eq "www.dname.sub.example.org") { $packet->push("answer", new Net::DNS::RR("dname.sub.example.org" . " 300 DNAME ok.sub.example.org")); } elsif ($qname eq "www.ok.sub.example.org") { $packet->push("answer", new Net::DNS::RR($qname . " 300 A 192.0.2.1")); } else { $packet->push("answer", new Net::DNS::RR("www.example.com 300 A 1.2.3.4")); } $sock->send($packet->data); print "RESPONSE:\n"; $packet->print; print "\n"; } bind9-9.9.5.dfsg/bin/tests/system/resolver/prereq.sh0000644000470500017500000000201512271526120021763 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: prereq.sh,v 1.7 2007/06/19 23:47:05 tbox Exp $ if $PERL -e 'use Net::DNS;' 2>/dev/null then : else echo "I:This test requires the Net::DNS library." >&2 exit 1 fi bind9-9.9.5.dfsg/bin/tests/system/xferquota/0002755000470500017500000000000012276444015020321 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/xferquota/tests.sh0000644000470500017500000000417212271526120022012 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.25 2007/06/19 23:47:07 tbox Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh # # Perform tests # count=0 ticks=0 while [ $count != 300 ]; do if [ $ticks = 1 ]; then echo "I:Changing test zone..." cp -f ns1/changing2.db ns1/changing.db kill -HUP `cat ns1/named.pid` fi sleep 1 ticks=`expr $ticks + 1` seconds=`expr $ticks \* 1` if [ $ticks = 360 ]; then echo "I:Took too long to load zones" exit 1 fi count=`cat ns2/zone*.bk | grep xyzzy | wc -l` echo "I:Have $count zones up in $seconds seconds" done status=0 $DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd \ zone000099.example. @10.53.0.1 axfr -p 5300 > dig.out.ns1 || status=1 grep ";" dig.out.ns1 $DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd \ zone000099.example. @10.53.0.2 axfr -p 5300 > dig.out.ns2 || status=1 grep ";" dig.out.ns2 $PERL ../digcomp.pl dig.out.ns1 dig.out.ns2 || status=1 sleep 15 $DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd \ a.changing. @10.53.0.1 a -p 5300 > dig.out.ns1 || status=1 grep ";" dig.out.ns1 $DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd \ a.changing. @10.53.0.2 a -p 5300 > dig.out.ns2 || status=1 grep ";" dig.out.ns2 $PERL ../digcomp.pl dig.out.ns1 dig.out.ns2 || status=1 echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns1/0002755000470500017500000000000012276444015021022 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/xferquota/ns1/changing1.db0000644000470500017500000000252212271526120023160 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: changing1.db,v 1.10 2007/06/19 23:47:07 tbox Exp $ $TTL 600 @ IN SOA dns1.changing. postmaster.changing. ( 1 ;; serial 3600 ;; refresh period 1800 ;; retry interval 604800 ;; expire time 600 ) ;; default TTL IN NS dns1.changing. NS dns2.changing. dns1 IN A 10.53.0.1 dns2 IN A 10.53.0.2 a IN A 10.0.0.1 bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns1/changing2.db0000644000470500017500000000252212271526120023161 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: changing2.db,v 1.10 2007/06/19 23:47:07 tbox Exp $ $TTL 600 @ IN SOA dns1.changing. postmaster.changing. ( 2 ;; serial 3600 ;; refresh period 1800 ;; retry interval 604800 ;; expire time 600 ) ;; default TTL IN NS dns1.changing. NS dns2.changing. dns1 IN A 10.53.0.1 dns2 IN A 10.53.0.2 a IN A 10.0.0.2 bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns1/named.conf0000644000470500017500000000240712271526120022747 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.21 2007/06/19 23:47:07 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; }; zone "." { type master; file "root.db"; }; zone "changing." { type master; file "changing.db"; }; include "zones.conf"; bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns1/root.db0000644000470500017500000000237412271526120022311 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.10 2007/06/19 23:47:07 tbox Exp $ $TTL 300 . IN SOA gson.nominum.com. a.root.servers.nil. ( 2000042100 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 example. NS ns2.example. ns2.example. A 10.53.0.2 changing. NS dns1.changing. A 10.53.0.1 NS dns2.changing. A 10.53.0.2 bind9-9.9.5.dfsg/bin/tests/system/xferquota/setup.pl0000644000470500017500000000324712271526120022013 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2004, 2007, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.pl,v 1.16 2011/10/26 23:46:15 tbox Exp $ # # Set up test data for zone transfer quota tests. # use FileHandle; my $masterconf = new FileHandle("ns1/zones.conf", "w") or die; my $slaveconf = new FileHandle("ns2/zones.conf", "w") or die; for ($z = 0; $z < 300; $z++) { my $zn = sprintf("zone%06d.example", $z); print $masterconf "zone \"$zn\" { type master; file \"$zn.db\"; };\n"; print $slaveconf "zone \"$zn\" { type slave; file \"$zn.bk\"; masterfile-format text; masters { 10.53.0.1; }; };\n"; my $fn = "ns1/$zn.db"; my $f = new FileHandle($fn, "w") or die "open: $fn: $!"; print $f "\$TTL 300 \@ IN SOA ns1 . 1 300 120 3600 86400 NS ns1 NS ns2 ns1 A 10.53.0.1 ns2 A 10.53.0.2 MX 10 mail1.isp.example. MX 20 mail2.isp.example. www A 10.0.0.1 xyzzy A 10.0.0.2 "; $f->close; } bind9-9.9.5.dfsg/bin/tests/system/xferquota/clean.sh0000644000470500017500000000214012271526120021723 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.14 2007/09/26 03:22:44 marka Exp $ # # Clean up after zone transfer quota tests. # rm -f ns1/zone*.example.db ns1/zones.conf rm -f ns2/zone*.example.bk ns2/zones.conf rm -f dig.out.* ns2/changing.bk rm -f ns1/changing.db rm -f */named.memstats bind9-9.9.5.dfsg/bin/tests/system/xferquota/setup.sh0000644000470500017500000000177312271526120022014 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.15 2007/06/19 23:47:07 tbox Exp $ # # Set up test data for zone transfer quota tests. # $PERL setup.pl cp -f ns1/changing1.db ns1/changing.db bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns2/0002755000470500017500000000000012276444015021023 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/xferquota/ns2/example.db0000644000470500017500000001053412271526120022757 0ustar lamontlamont; Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000-2003 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.db,v 1.14 2009/01/21 23:47:27 tbox Exp $ $ORIGIN . $TTL 300 ; 5 minutes example IN SOA mname1. . ( 2000042795 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) example. NS ns2.example. ns2.example. A 10.53.0.2 example. NS ns3.example. ns3.example. A 10.53.0.3 $ORIGIN example. * MX 10 mail a TXT "foo foo foo" PTR foo.net. $TTL 3600 ; 1 hour a01 A 0.0.0.0 a02 A 255.255.255.255 a601 AAAA ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff afsdb01 AFSDB 0 hostname afsdb02 AFSDB 65535 . $TTL 300 ; 5 minutes b CNAME foo.net. c A 73.80.65.49 $TTL 3600 ; 1 hour cert01 CERT 65534 65535 PRIVATEOID ( MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45IkskceFGgi WCn/GxHhai6VAuHAoNUz4YoU1tVfSCSqQYn6//11U6Nl d80jEeC8aTrO+KKmCaY= ) cname01 CNAME cname-target. cname02 CNAME cname-target cname03 CNAME . $TTL 300 ; 5 minutes d A 73.80.65.49 $TTL 3600 ; 1 hour dname01 DNAME dname-target. dname02 DNAME dname-target dname03 DNAME . $TTL 300 ; 5 minutes e MX 10 mail TXT "one" TXT "three" TXT "two" A 73.80.65.49 A 73.80.65.50 A 73.80.65.52 A 73.80.65.51 f A 73.80.65.52 $TTL 3600 ; 1 hour gpos01 GPOS "-22.6882" "116.8652" "250.0" gpos02 GPOS "" "" "" hinfo01 HINFO "Generic PC clone" "NetBSD-1.4" hinfo02 HINFO "PC" "NetBSD" isdn01 ISDN "isdn-address" isdn02 ISDN "isdn-address" "subaddress" isdn03 ISDN "isdn-address" isdn04 ISDN "isdn-address" "subaddress" dnskey01 DNSKEY 512 255 1 ( AQMFD5raczCJHViKtLYhWGz8hMY9UGRuniJDBzC7w0aR yzWZriO6i2odGWWQVucZqKVsENW91IOW4vqudngPZsY3 GvQ/xVA8/7pyFj6b7Esga60zyGW6LFe9r8n6paHrlG5o jqf0BaqHT+8= ) kx01 KX 10 kdc kx02 KX 10 . loc01 LOC 60 9 0.000 N 24 39 0.000 E 10.00m 20m 2000m 20m loc02 LOC 60 9 0.000 N 24 39 0.000 E 10.00m 20m 2000m 20m mb01 MG madname mb02 MG . mg01 MG mgmname mg02 MG . minfo01 MINFO rmailbx emailbx minfo02 MINFO . . mr01 MR mrname mr02 MR . mx01 MX 10 mail mx02 MX 10 . naptr01 NAPTR 0 0 "" "" "" . naptr02 NAPTR 65535 65535 "blurgh" "blorf" ":(.*):\\1:" foo. nsap-ptr01 NSAP-PTR foo. NSAP-PTR . nsap01 NSAP 0x47000580005a0000000001e133ffffff00016100 nsap02 NSAP 0x47000580005a0000000001e133ffffff00016100 nsec01 NSEC a.secure ( NS SOA MX RRSIG DNSKEY LOC NSEC ) nsec02 NSEC . ( NSAP-PTR NSEC ) nsec03 NSEC . ( A ) nsec04 NSEC . ( 127 ) ptr01 PTR example. px01 PX 65535 foo. bar. px02 PX 65535 . . rp01 RP mbox-dname txt-dname rp02 RP . . rt01 RT 0 intermediate-host rt02 RT 65535 . $TTL 300 ; 5 minutes s NS ns.s $ORIGIN s.example. ns A 73.80.65.49 $ORIGIN example. $TTL 3600 ; 1 hour rrsig01 RRSIG NSEC 1 3 3600 20000102030405 ( 19961211100908 2143 foo MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45IkskceFGgi WCn/GxHhai6VAuHAoNUz4YoU1tVfSCSqQYn6//11U6Nl d80jEeC8aTrO+KKmCaY= ) srv01 SRV 0 0 0 . srv02 SRV 65535 65535 65535 old-slow-box.example.com. $TTL 301 ; 5 minutes 1 second t A 73.80.65.49 $TTL 3600 ; 1 hour txt01 TXT "foo" txt02 TXT "foo" "bar" txt03 TXT "foo" txt04 TXT "foo" "bar" txt05 TXT "foo bar" txt06 TXT "foo bar" txt07 TXT "foo bar" txt08 TXT "foo\010bar" txt09 TXT "foo\010bar" txt10 TXT "foo bar" txt11 TXT "\"foo\"" txt12 TXT "\"foo\"" $TTL 300 ; 5 minutes u TXT "txt-not-in-nsec" $ORIGIN u.example. a A 73.80.65.49 b A 73.80.65.49 $ORIGIN example. $TTL 3600 ; 1 hour wks01 WKS 10.0.0.1 6 ( 0 1 2 21 23 ) wks02 WKS 10.0.0.1 17 ( 0 1 2 53 ) wks03 WKS 10.0.0.2 6 ( 65535 ) x2501 X25 "123456789" bind9-9.9.5.dfsg/bin/tests/system/xferquota/ns2/named.conf0000644000470500017500000000252212271526120022746 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.22 2007/06/19 23:47:07 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion no; notify no; transfers-in 5; transfers-per-ns 5; }; zone "." { type hint; file "../../common/root.hint"; }; zone "changing." { type slave; masters { 10.53.0.1; }; file "changing.bk"; }; include "zones.conf"; bind9-9.9.5.dfsg/bin/tests/system/pending/0002755000470500017500000000000012276444015017727 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/pending/tests.sh0000644000470500017500000001417312271526120021422 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.7 2010/01/18 19:19:31 each Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh # replace_data dname RR old_data new_data replace_data() { if [ $# -ne 4 ]; then echo I:unexpected input for replace_data return 1 fi _dname=$1 _rr=$2 _olddata=$3 _newdata=$4 _ret=0 $NSUPDATE -d <> nsupdate.out.test 2>&1 || _ret=1 server 10.53.0.2 5300 update delete ${_dname} 30 ${_rr} ${_olddata} update add ${_dname} 30 ${_rr} ${_newdata} send END if [ $_ret != 0 ]; then echo I:failed to update the test data return 1 fi return 0 } status=0 n=0 DIGOPTS="+short +tcp -p 5300" DIGOPTS_CD="$DIGOPTS +cd" echo I:Priming cache. ret=0 expect="10 mail.example." ans=`$DIG $DIGOPTS_CD @10.53.0.4 hostile MX` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo I:Checking that bogus additional is not returned with +CD. ret=0 expect="10.0.0.2" ans=`$DIG $DIGOPTS_CD @10.53.0.4 mail.example A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` # # Prime cache with pending additional records. These should not be promoted # to answer. # echo "I:Priming cache (pending additional A and AAAA)" ret=0 expect="10 mail.example.com." ans=`$DIG $DIGOPTS @10.53.0.4 example.com MX` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo "I:Replacing pending A" ret=0 replace_data mail.example.com. A 192.0.2.2 192.0.2.3 || ret=1 status=`expr $status + $ret` echo "I:Replacing pending AAAA" ret=0 replace_data mail.example.com. AAAA 2001:db8::2 2001:db8::3 || ret=1 status=`expr $status + $ret` echo "I:Checking updated data to be returned (without CD)" ret=0 expect="192.0.2.3" ans=`$DIG $DIGOPTS @10.53.0.4 mail.example.com A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo "I:Checking updated data to be returned (with CD)" ret=0 expect="2001:db8::3" ans=`$DIG $DIGOPTS_CD @10.53.0.4 mail.example.com AAAA` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` # # Prime cache with a pending answer record. It can be returned (without # validation) with +CD. # echo "I:Priming cache (pending answer)" ret=0 expect="192.0.2.2" ans=`$DIG $DIGOPTS_CD @10.53.0.4 pending-ok.example.com A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo I:Replacing pending data ret=0 replace_data pending-ok.example.com. A 192.0.2.2 192.0.2.3 || ret=1 status=`expr $status + $ret` echo I:Confirming cached pending data to be returned with CD ret=0 expect="192.0.2.2" ans=`$DIG $DIGOPTS_CD @10.53.0.4 pending-ok.example.com A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` # # Prime cache with a pending answer record. It should not be returned # to no-DNSSEC clients. # echo "I:Priming cache (pending answer)" ret=0 expect="192.0.2.102" ans=`$DIG $DIGOPTS_CD @10.53.0.4 pending-ng.example.com A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo I:Replacing pending data ret=0 replace_data pending-ng.example.com. A 192.0.2.102 192.0.2.103 || ret=1 status=`expr $status + $ret` echo I:Confirming updated data returned, not the cached one, without CD ret=0 expect="192.0.2.103" ans=`$DIG $DIGOPTS @10.53.0.4 pending-ng.example.com A` || ret=1 test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` # # Try to fool the resolver with an out-of-bailiwick CNAME # echo I:Trying to Prime out-of-bailiwick pending answer with CD ret=0 expect="10.10.10.10" ans=`$DIG $DIGOPTS_CD @10.53.0.4 bad.example. A` || ret=1 ans=`echo $ans | awk '{print $NF}'` test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo I:Confirming the out-of-bailiwick answer is not cached or reused with CD ret=0 expect="10.10.10.10" ans=`$DIG $DIGOPTS_CD @10.53.0.4 nice.good. A` || ret=1 ans=`echo $ans | awk '{print $NF}'` test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` # # Make sure the resolver doesn't cache bogus NXDOMAIN # echo I:Trying to Prime bogus NXDOMAIN ret=0 expect="SERVFAIL" ans=`$DIG +tcp -p 5300 @10.53.0.4 removed.example.com. A` || ret=1 ans=`echo $ans | sed 's/^.*status: \([A-Z][A-Z]*\).*$/\1/'` test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo I:Confirming the bogus NXDOMAIN was not cached ret=0 expect="SERVFAIL" ans=`$DIG +tcp -p 5300 @10.53.0.4 removed.example.com. A` || ret=1 ans=`echo $ans | sed 's/^.*status: \([A-Z][A-Z]*\).*$/\1/'` test "$ans" = "$expect" || ret=1 test $ret = 0 || echo I:failed, got "'""$ans""'", expected "'""$expect""'" status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/pending/ns1/0002755000470500017500000000000012276444015020430 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/pending/ns1/named.conf0000644000470500017500000000221112271526120022346 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2009/11/17 23:55:18 marka Exp $ */ controls { /* empty */ }; include "trusted.conf"; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; }; zone "." { type master; file "root.db.signed"; }; bind9-9.9.5.dfsg/bin/tests/system/pending/ns1/root.db.in0000644000470500017500000000237412271526120022324 0ustar lamontlamont; Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db.in,v 1.6 2010/01/07 23:48:53 tbox Exp $ $TTL 30 . IN SOA marka.isc.org. a.root.servers.nil. ( 2000042100 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 example. NS ns2.example. ns2.example. A 10.53.0.2 example.com. NS ns2.example.com. ns2.example.com. A 10.53.0.2 hostile. NS ns3.hostile. ns3.hostile. A 10.53.0.3 nice.good. A 10.10.10.10 bind9-9.9.5.dfsg/bin/tests/system/pending/ns1/sign.sh0000644000470500017500000000325612271526120021721 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.5 2010/01/07 23:48:53 tbox Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=. infile=root.db.in zonefile=root.db (cd ../ns2 && sh -e sign.sh ) cp ../ns2/dsset-example. . cp ../ns2/dsset-example.com. . keyname1=`$KEYGEN -q -r $RANDFILE -a RSASHA256 -b 1024 -n zone $zone` keyname2=`$KEYGEN -q -r $RANDFILE -a RSASHA256 -b 2048 -f KSK -n zone $zone` cat $infile $keyname1.key $keyname2.key > $zonefile $SIGNER -g -r $RANDFILE -o $zone $zonefile > /dev/null 2>&1 # Configure the resolving server with a trusted key. cat $keyname2.key | grep -v '^; ' | $PERL -n -e ' local ($dn, $class, $type, $flags, $proto, $alg, @rest) = split; local $key = join("", @rest); print < trusted.conf cp trusted.conf ../ns2/trusted.conf cp trusted.conf ../ns3/trusted.conf cp trusted.conf ../ns4/trusted.conf bind9-9.9.5.dfsg/bin/tests/system/pending/ns4/0002755000470500017500000000000012276444015020433 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/pending/ns4/named.conf0000644000470500017500000000223512271526120022357 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.2 2009/11/17 23:55:18 marka Exp $ */ controls { /* empty */ }; include "trusted.conf"; options { query-source address 10.53.0.4; notify-source 10.53.0.4; transfer-source 10.53.0.4; port 5300; pid-file "named.pid"; listen-on { 10.53.0.4; }; listen-on-v6 { none; }; recursion yes; }; zone "." { type hint; file "../../common/root.hint"; }; bind9-9.9.5.dfsg/bin/tests/system/pending/clean.sh0000644000470500017500000000207412271526120021337 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.4 2009/12/30 08:02:22 jinmei Exp $ rm -rf */*.signed rm -rf */*.jnl rm -rf */K* rm -rf */dsset-* rm -rf */named.memstats rm -rf */named.run rm -rf */trusted.conf rm -rf ns1/root.db rm -rf ns2/example.db rm -rf ns2/example.com.db rm -rf random.data rm -rf nsupdate.out.test bind9-9.9.5.dfsg/bin/tests/system/pending/ns3/0002755000470500017500000000000012276444015020432 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/pending/ns3/hostile.db0000644000470500017500000000207312271526120022401 0ustar lamontlamont; Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: hostile.db,v 1.2 2009/11/17 23:55:18 marka Exp $ $TTL 30 @ IN SOA mname1. . ( 2009110500 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns3 MX 10 mail.example. ns3 A 10.53.0.3 bind9-9.9.5.dfsg/bin/tests/system/pending/ns3/mail.example.db0000644000470500017500000000214212271526120023303 0ustar lamontlamont; Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: mail.example.db,v 1.2 2009/11/17 23:55:18 marka Exp $ $TTL 30 @ IN SOA mname1. . ( 2009110300 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) @ NS ns3 ns3 A 10.53.0.3 ;mail A 10.0.0.2 // the correct record @ A 10.0.0.3 bind9-9.9.5.dfsg/bin/tests/system/pending/ns3/named.conf0000644000470500017500000000250512271526120022356 0ustar lamontlamont/* * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.3 2009/11/18 23:48:07 tbox Exp $ */ // NS2 controls { /* empty */ }; include "trusted.conf"; options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; pid-file "named.pid"; listen-on { 10.53.0.3; }; listen-on-v6 { none; }; recursion no; notify no; dnssec-enable yes; dnssec-validation yes; }; zone "." { type hint; file "../../common/root.hint"; }; zone "mail.example" { type master; file "mail.example.db"; }; zone "hostile" { type master; file "hostile.db"; }; bind9-9.9.5.dfsg/bin/tests/system/pending/setup.sh0000644000470500017500000000162212271526120021413 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.2 2009/11/17 23:55:18 marka Exp $ ../../../tools/genrandom 400 random.data cd ns1 && sh -e sign.sh bind9-9.9.5.dfsg/bin/tests/system/pending/ns2/0002755000470500017500000000000012276444015020431 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/pending/ns2/example.db.in0000644000470500017500000000223412271526120022770 0ustar lamontlamont; Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.db.in,v 1.4 2010/01/07 23:48:53 tbox Exp $ $TTL 30 $ORIGIN example. @ IN SOA mname1. . ( 2009110300 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 MX 10 mail ns2 A 10.53.0.2 mail A 10.0.0.2 bad CNAME nice.good. worse A 6.6.6.6 bind9-9.9.5.dfsg/bin/tests/system/pending/ns2/forgery.db0000644000470500017500000000212312271526120022402 0ustar lamontlamont; Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: forgery.db,v 1.3 2010/01/07 23:48:53 tbox Exp $ $TTL 30 $ORIGIN good. @ IN SOA mname1. . ( 2009110300 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 ns2 A 10.53.0.2 nice.good. CNAME worse.example. bind9-9.9.5.dfsg/bin/tests/system/pending/ns2/named.conf0000644000470500017500000000273012271526120022355 0ustar lamontlamont/* * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.6 2010/01/07 23:48:53 tbox Exp $ */ // NS2 controls { /* empty */ }; include "trusted.conf"; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion no; notify yes; dnssec-enable yes; dnssec-validation yes; }; zone "." { type hint; file "../../common/root.hint"; }; zone "example" { type master; file "example.db.signed"; }; zone "example.com" { type master; file "example.com.db.signed"; allow-update { 10.53.0.0/8; }; }; zone "good" { type master; file "forgery.db"; allow-query { any; }; }; bind9-9.9.5.dfsg/bin/tests/system/pending/ns2/example.com.db.in0000644000470500017500000000225412271526120023547 0ustar lamontlamont; Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.com.db.in,v 1.4 2010/01/18 23:48:40 tbox Exp $ $TTL 30 @ IN SOA mname1. . ( 2009110300 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) NS ns2 MX 10 mail ns2 A 10.53.0.2 mail A 192.0.2.2 AAAA 2001:db8::2 pending-ok A 192.0.2.2 pending-ng A 192.0.2.102 removed A 10.9.8.7 bind9-9.9.5.dfsg/bin/tests/system/pending/ns2/sign.sh0000644000470500017500000000301012271526120021706 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2009, 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.7 2010/01/18 19:19:31 each Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data for domain in example example.com; do zone=${domain}. infile=${domain}.db.in zonefile=${domain}.db keyname1=`$KEYGEN -q -r $RANDFILE -a NSEC3RSASHA1 -b 768 -n zone $zone` keyname2=`$KEYGEN -q -r $RANDFILE -a NSEC3RSASHA1 -b 1024 -f KSK -n zone $zone` cat $infile $keyname1.key $keyname2.key > $zonefile $SIGNER -3 bebe -r $RANDFILE -o $zone $zonefile > /dev/null 2>&1 done # remove "removed" record from example.com, causing the server to # send an apparently-invalid NXDOMAIN sed '/^removed/d' example.com.db.signed > example.com.db.new rm -f example.com.db.signed mv example.com.db.new example.com.db.signed bind9-9.9.5.dfsg/bin/tests/system/pending/prereq.sh0000644000470500017500000000205412271526120021551 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2009, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: prereq.sh,v 1.3 2009/11/18 23:48:06 tbox Exp $ ../../../tools/genrandom 400 random.data if $KEYGEN -q -a RSAMD5 -b 512 -n zone -r random.data foo > /dev/null 2>&1 then rm -f Kfoo* else echo "I:This test requires that --with-openssl was used." >&2 exit 1 fi bind9-9.9.5.dfsg/bin/tests/system/spf/0002755000470500017500000000000012276444015017073 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/spf/tests.sh0000644000470500017500000000345512271526120020567 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh n=1 status=0 echo "I:checking that SPF warnings have been correctly generated ($n)" ret=0 grep "zone spf/IN: loaded serial 0" ns1/named.run > /dev/null || ret=1 grep "'x.spf' found SPF/TXT" ns1/named.run > /dev/null || ret=1 grep "'y.spf' found SPF/SPF" ns1/named.run > /dev/null || ret=1 grep "'spf' found SPF/" ns1/named.run > /dev/null && ret=1 grep "zone warn/IN: loaded serial 0" ns1/named.run > /dev/null || ret=1 grep "'x.warn' found SPF/TXT" ns1/named.run > /dev/null || ret=1 grep "'y.warn' found SPF/SPF" ns1/named.run > /dev/null || ret=1 grep "'warn' found SPF/" ns1/named.run > /dev/null && ret=1 grep "zone nowarn/IN: loaded serial 0" ns1/named.run > /dev/null || ret=1 grep "'x.nowarn' found SPF/" ns1/named.run > /dev/null && ret=1 grep "'y.nowarn' found SPF/" ns1/named.run > /dev/null && ret=1 grep "'nowarn' found SPF/" ns1/named.run > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/spf/ns1/0002755000470500017500000000000012276444015017574 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/spf/ns1/named.conf0000644000470500017500000000233312271526120021517 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; ixfr-from-differences yes; }; zone "spf" { type master; file "spf.db"; }; zone "warn" { type master; file "spf.db"; check-spf warn; }; zone "nowarn" { type master; file "spf.db"; check-spf ignore; }; bind9-9.9.5.dfsg/bin/tests/system/spf/ns1/spf.db0000644000470500017500000000164112271526120020664 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. @ 0 IN SOA . . 0 0 0 0 0 @ 0 IN NS . @ 0 IN TXT "v=spf1 -all" @ 0 IN SPF "v=spf1 -all" x 0 IN TXT "v=spf1" y 0 IN SPF "v=spf1" y 0 IN TXT "a non spf record" bind9-9.9.5.dfsg/bin/tests/system/spf/clean.sh0000644000470500017500000000146112271526120020502 0ustar lamontlamont# Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. rm -f ns1/named.run rm -f ns1/named.memstats bind9-9.9.5.dfsg/bin/tests/system/redirect/0002755000470500017500000000000012276444015020104 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/redirect/tests.sh0000644000470500017500000003531012271526120021573 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.3 2011/03/01 23:48:06 tbox Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 n=1 rm -f dig.out.* DIGOPTS="+tcp +noadd +nosea +nostat +nocmd -p 5300" for conf in conf/good*.conf do echo "I:checking that $conf is accepted ($n)" ret=0 $CHECKCONF "$conf" || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done for conf in conf/bad*.conf do echo "I:checking that $conf is rejected ($n)" ret=0 $CHECKCONF "$conf" >/dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` done echo "I:checking A redirect works for nonexist ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect works for nonexist ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 aaaa > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect works for nonexist ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 any > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect doesn't work for acl miss ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.4 a > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect doesn't work for acl miss ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.4 aaaa > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect doesn't work for acl miss ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.4 any > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect works for signed nonexist, DO=0 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect works for signed nonexist, DO=0 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.2 -b 10.53.0.2 aaaa > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect works for signed nonexist, DO=0 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.2 -b 10.53.0.2 any > dig.out.ns2.test$n || ret=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect fails for signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect fails for signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.2 -b 10.53.0.2 aaaa > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect fails for signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.2 -b 10.53.0.2 any > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect fails for nsec3 signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect fails for nsec3 signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.2 -b 10.53.0.2 aaaa > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect fails for nsec3 signed nonexist, DO=1 ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.2 -b 10.53.0.2 any > dig.out.ns2.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns2.test$n > /dev/null || ret=1 grep "100.100.100.1" dig.out.ns2.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6401" dig.out.ns2.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns2.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect works for nonexist authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.1 a > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect works for nonexist authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.1 aaaa > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect works for nonexist authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.1 any > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect doesn't work for acl miss authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.4 a > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect doesn't work for acl miss authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.4 aaaa > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect doesn't work for acl miss authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist. @10.53.0.1 -b 10.53.0.4 any > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect works for signed nonexist, DO=0 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.1 -b 10.53.0.1 a > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect works for signed nonexist, DO=0 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.1 -b 10.53.0.1 aaaa > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect works for signed nonexist, DO=0 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. @10.53.0.1 -b 10.53.0.1 any > dig.out.ns1.test$n || ret=1 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect fails for signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.1 -b 10.53.0.1 a > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect fails for signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.1 -b 10.53.0.1 aaaa > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect fails for signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.signed. +dnssec @10.53.0.1 -b 10.53.0.1 any > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking A redirect fails for nsec3 signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.1 -b 10.53.0.1 a > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking AAAA redirect fails for nsec3 signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.1 -b 10.53.0.1 aaaa > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking ANY redirect fails for nsec3 signed nonexist, DO=1 authoritative ($n)" ret=0 $DIG $DIGOPTS nonexist.nsec3. +dnssec @10.53.0.1 -b 10.53.0.1 any > dig.out.ns1.test$n || ret=1 grep "status: NXDOMAIN" dig.out.ns1.test$n > /dev/null || ret=1 grep "100.100.100.2" dig.out.ns1.test$n > /dev/null && ret=1 grep "2001:ffff:ffff::6464:6402" dig.out.ns1.test$n > /dev/null && ret=1 grep "IN.NSEC3" dig.out.ns1.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:checking that redirect zones reload correctly" ret=0 sleep 1 # ensure file mtime will have changed sed -e 's/0 0 0 0 0/1 0 0 0 0/' < ns2/example.db.in > ns2/example.db sed -e 's/0 0 0 0 0/1 0 0 0 0/' -e 's/\.1$/.2/' < ns2/redirect.db.in > ns2/redirect.db $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reload > rndc.out || ret=1 sed 's/^/I:ns2 /' rndc.out for i in 1 2 3 4 5 6 7 8 9; do tmp=0 $DIG $DIGOPTS +short @10.53.0.2 soa example.nil > dig.out.ns1.test$n || tmp=1 set -- `cat dig.out.ns1.test$n` [ $3 = 1 ] || tmp=1 $DIG $DIGOPTS nonexist. @10.53.0.2 -b 10.53.0.2 a > dig.out.ns2.test$n || tmp=1 grep "status: NOERROR" dig.out.ns2.test$n > /dev/null || tmp=1 grep "100.100.100.2" dig.out.ns2.test$n > /dev/null || tmp=1 [ $tmp -eq 0 ] && break sleep 1 done [ $tmp -eq 1 ] && ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/0002755000470500017500000000000012276444015020605 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/example.db0000644000470500017500000000370212271526120022540 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.db,v 1.3 2011/03/01 23:48:06 tbox Exp $ $TTL 3600 @ SOA ns1 marka.isc.org. 0 0 0 0 1200 @ NS ns1 ns1 A 10.53.0.1 excluded-good-a AAAA 2001:eeee::1 A 1.2.3.4 excluded-bad-a AAAA 2001:eeee::2 A 10.0.0.1 excluded-only AAAA 2001:eeee::3 partially-excluded-good-a AAAA 2001:eeee::1 AAAA 2001::1 A 1.2.3.4 partially-excluded-bad-a AAAA 2001:eeee::2 AAAA 2001::2 A 10.0.0.1 partially-excluded-only AAAA 2001:eeee::3 AAAA 2001::3 a-only A 1.2.3.5 a-and-aaaa AAAA 2001::1 A 1.2.3.6 aaaa-only AAAA 2001::2 a-not-mapped A 10.0.0.2 mx-only MX 10 ns.example. cname-excluded-good-a CNAME excluded-good-a cname-excluded-bad-a CNAME excluded-bad-a cname-excluded-only CNAME excluded-only cname-partial-excluded-good-a CNAME partial-excluded-good-a cname-partial-excluded-bad-a CNAME partial-excluded-bad-a cname-partial-excluded-only CNAME partial-excluded-only cname-a-only CNAME a-only cname-a-and-aaaa CNAME a-and-aaaa cname-aaaa-only CNAME aaaa-only cname-a-not-mapped CNAME a-not-mapped cname-mx-only CNAME mx-only cname-non-existent CNAME non-existent ttl-less-than-600 500 A 5.6.7.8 ttl-more-than-600 700 A 5.6.7.8 ttl-less-than-minimum 1100 A 5.6.7.8 ttl-more-than-minimum 1300 A 5.6.7.8 bind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/named.conf0000644000470500017500000000302512271526120022527 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ // NS1 controls { /* empty */ }; acl rfc1918 { 10/8; 192.168/16; 172.16/12; }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; allow-recursion { 10.53.0.1; }; notify yes; dnssec-enable yes; dnssec-validation yes; }; zone "." { type master; file "root.db"; }; zone "example" { type master; file "example.db"; }; zone "signed" { type master; file "signed.db.signed"; }; zone "nsec3" { type master; file "nsec3.db.signed"; }; zone "." { type redirect; file "redirect.db"; allow-query { !10.53.0.2; !10.53.0.4; any; }; }; // include "trusted.conf"; bind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/root.db0000644000470500017500000000203212271526120022063 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.3 2011/03/01 23:48:06 tbox Exp $ $TTL 3600 @ SOA a.root-servers.nil. marka.isc.org. 0 0 0 0 0 @ NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 example NS ns1.example. ns1.example. A 10.53.0.1 signed NS ns1.example. ns1.signed. A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/sign.sh0000644000470500017500000000255712271526120022101 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2011, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: sign.sh,v 1.3 2011/03/01 23:48:06 tbox Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data zone=signed infile=example.db zonefile=signed.db key1=`$KEYGEN -q -r $RANDFILE $zone` key2=`$KEYGEN -q -r $RANDFILE -fk $zone` cat $infile $key1.key $key2.key > $zonefile $SIGNER -P -g -r $RANDFILE -o $zone $zonefile > /dev/null zone=nsec3 infile=example.db zonefile=nsec3.db key1=`$KEYGEN -q -r $RANDFILE -3 $zone` key2=`$KEYGEN -q -r $RANDFILE -3 -fk $zone` cat $infile $key1.key $key2.key > $zonefile $SIGNER -P -3 - -g -r $RANDFILE -o $zone $zonefile > /dev/null bind9-9.9.5.dfsg/bin/tests/system/redirect/ns1/redirect.db0000644000470500017500000000206712271526120022711 0ustar lamontlamont; Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: redirect.db,v 1.3 2011/03/01 23:48:06 tbox Exp $ $TTL 300 @ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0 @ IN NS ns.example.net ; ; NS records do not need address records in this zone as it is not in the ; normal namespace. ; *. IN A 100.100.100.2 *. IN AAAA 2001:ffff:ffff::100.100.100.2 bind9-9.9.5.dfsg/bin/tests/system/redirect/clean.sh0000644000470500017500000000202412271526120021507 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.3 2011/03/01 23:48:06 tbox Exp $ rm -f ns1/K* rm -f ns1/signed.db* rm -f ns1/nsec3.db* rm -f ns1/dsset-signed. rm -f ns1/dsset-nsec3. rm -f */named.memstats rm -f */named.run rm -f dig.out.* random.data rm -f ns2/*.db rm -f rndc.out bind9-9.9.5.dfsg/bin/tests/system/redirect/setup.sh0000644000470500017500000000174412271526120021575 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.3 2011/03/01 23:48:06 tbox Exp $ sh clean.sh ../../../tools/genrandom 400 random.data cp ns2/redirect.db.in ns2/redirect.db cp ns2/example.db.in ns2/example.db cd ns1 && sh sign.sh bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/0002755000470500017500000000000012276444015021031 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/redirect/conf/bad3.conf0000644000470500017500000000171612271526120022505 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad3.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type hint; file "hint.db"; }; zone "x" { type redirect; file "redirect.db"; allow-query { 10.0.1.0; }; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/good2.conf0000644000470500017500000000166712271526120022713 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good2.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type master; file "master.db"; }; zone "." { type redirect; file "redirect.db"; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/bad2.conf0000644000470500017500000000175112271526120022503 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad2.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type hint; file "hint.db"; }; zone "." { type redirect; file "redirect.db"; allow-query { 10.0.1.0; }; also-notify { 1.2.3.4; }; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/bad1.conf0000644000470500017500000000175012271526120022501 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: bad1.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type hint; file "hint.db"; }; zone "." { type redirect; file "redirect.db"; allow-query { 10.0.1.0; }; forwarders { 1.2.3.4; }; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/good4.conf0000644000470500017500000000171712271526120022711 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good4.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type hint; file "hint.db"; }; zone "." { type redirect; file "redirect.db"; allow-query { 10.0.1.0; }; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/good3.conf0000644000470500017500000000171412271526120022705 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good3.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type slave; file "slave.db"; masters { 1.2.3.4; }; }; zone "." { type redirect; file "redirect.db"; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/conf/good1.conf0000644000470500017500000000166312271526120022706 0ustar lamontlamont/* * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: good1.conf,v 1.3 2011/03/01 23:48:06 tbox Exp $ */ zone "." { type hint; file "hint.db"; }; zone "." { type redirect; file "redirect.db"; }; bind9-9.9.5.dfsg/bin/tests/system/redirect/ns2/0002755000470500017500000000000012276444015020606 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/redirect/ns2/example.db.in0000644000470500017500000000157712271526120023156 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. $TTL 300 ; 5 minutes @ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0 @ NS ns2 ns2 A 10.53.0.2 a A 10.53.0.2 bind9-9.9.5.dfsg/bin/tests/system/redirect/ns2/redirect.db.in0000644000470500017500000000200412271526120023306 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. $TTL 300 @ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0 @ IN NS ns.example.net ; ; NS records do not need address records in this zone as it is not in the ; normal namespace. ; *. IN A 100.100.100.1 *. IN AAAA 2001:ffff:ffff::100.100.100.1 bind9-9.9.5.dfsg/bin/tests/system/redirect/ns2/named.conf0000644000470500017500000000301512271526120022527 0ustar lamontlamont/* * Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.3 2011/03/01 23:48:07 tbox Exp $ */ // NS2 controls { /* empty */ }; acl rfc1918 { 10/8; 192.168/16; 172.16/12; }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion yes; notify yes; dnssec-enable yes; dnssec-validation yes; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-sha256; }; controls { inet 10.53.0.2 port 9953 allow { any; } keys { rndc_key; }; }; zone "." { type hint; file "../../common/root.hint"; }; zone "." { type redirect; file "redirect.db"; allow-query { !10.53.0.4; any; }; }; zone "example.nil" { type master; file "example.db"; }; bind9-9.9.5.dfsg/bin/tests/system/stub/0002755000470500017500000000000012276444015017260 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/stub/tests.sh0000644000470500017500000000450112271526120020745 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: tests.sh,v 1.16 2011/11/02 23:46:24 tbox Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh status=0 echo "I:check that the stub zone has been saved to disk" for i in 1 2 3 4 5 6 7 8 9 20 do [ -f ns3/child.example.st ] && break sleep 1 done [ -f ns3/child.example.st ] || { status=1; echo "I:failed"; } for pass in 1 2 do echo "I:trying an axfr that should be denied (NOTAUTH) (pass=$pass)" ret=0 $DIG +tcp child.example. @10.53.0.3 axfr -p 5300 > dig.out.ns3 || ret=1 grep "; Transfer failed." dig.out.ns3 > /dev/null || ret=1 [ $ret = 0 ] || { status=1; echo "I:failed"; } echo "I:look for stub zone data without recursion (should not be found) (pass=$pass)" for i in 1 2 3 4 5 6 7 8 9 do ret=0 $DIG +tcp +norec data.child.example. \ @10.53.0.3 txt -p 5300 > dig.out.ns3 || ret=1 grep "status: NOERROR" dig.out.ns3 > /dev/null || ret=1 [ $ret = 0 ] && break sleep 1 done $PERL ../digcomp.pl knowngood.dig.out.norec dig.out.ns3 || ret=1 [ $ret = 0 ] || { status=1; echo "I:failed"; } echo "I:look for stub zone data with recursion (should be found) (pass=$pass)" ret=0 $DIG +tcp data.child.example. @10.53.0.3 txt -p 5300 > dig.out.ns3 || ret=1 $PERL ../digcomp.pl knowngood.dig.out.rec dig.out.ns3 || ret=1 [ $ret = 0 ] || { status=1; echo "I:failed"; } [ $pass = 1 ] && { echo "I:stopping stub server" $PERL $SYSTEMTESTTOP/stop.pl . ns3 echo "I:re-starting stub server" $PERL $SYSTEMTESTTOP/start.pl --noclean --restart . ns3 } done echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/stub/ns1/0002755000470500017500000000000012276444015017761 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/stub/ns1/named.conf0000644000470500017500000000226612271526120021711 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.14 2007/06/19 23:47:05 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; recursion no; notify yes; }; zone "." { type master; file "root.db"; }; bind9-9.9.5.dfsg/bin/tests/system/stub/ns1/root.db0000644000470500017500000000225212271526120021243 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: root.db,v 1.9 2007/06/19 23:47:05 tbox Exp $ $TTL 300 . IN SOA gson.nominum.com. a.root.servers.nil. ( 2000042100 ; serial 600 ; refresh 600 ; retry 1200 ; expire 600 ; minimum ) . NS a.root-servers.nil. a.root-servers.nil. A 10.53.0.1 example. NS ns3.example. ns3.example. A 10.53.0.3 bind9-9.9.5.dfsg/bin/tests/system/stub/clean.sh0000644000470500017500000000175512271526120020675 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2004, 2007, 2012 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2000, 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: clean.sh,v 1.10 2007/09/26 03:22:44 marka Exp $ # # Clean up after stub tests. # rm -f dig.out.ns3 ns3/child.example.st rm -f */named.memstats bind9-9.9.5.dfsg/bin/tests/system/stub/ns3/0002755000470500017500000000000012276444015017763 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/stub/ns3/example.db0000644000470500017500000000225712271526120021722 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: example.db,v 1.9 2007/06/19 23:47:05 tbox Exp $ $ORIGIN . $TTL 300 ; 5 minutes example IN SOA ns3.example. hostmaster.example. ( 2000042795 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) example. NS ns3.example. ns3.example. A 10.53.0.3 bind9-9.9.5.dfsg/bin/tests/system/stub/ns3/named.conf0000644000470500017500000000255112271526120021710 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.16 2007/06/18 23:47:31 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; pid-file "named.pid"; listen-on { 10.53.0.3; }; listen-on-v6 { none; }; recursion yes; acache-enable yes; notify yes; }; zone "." { type hint; file "../../common/root.hint"; }; zone "example" { type master; file "example.db"; }; zone "child.example" { type stub; file "child.example.st"; masters { 10.53.0.2; }; }; bind9-9.9.5.dfsg/bin/tests/system/stub/knowngood.dig.out.rec0000644000470500017500000000122012271526120023312 0ustar lamontlamont ; <<>> DiG 8.2 <<>> -p @10.53.0.3 data.child.example txt ; (1 server found) ;; res options: init recurs defnam dnsrch ;; got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUERY SECTION: ;; data.child.example, type = TXT, class = IN ;; ANSWER SECTION: data.child.example. 5M IN TXT "some" "test" "data" ;; AUTHORITY SECTION: child.example. 5M IN NS ns2.child.example. ;; ADDITIONAL SECTION: ns2.child.example. 5M IN A 10.53.0.2 ;; Total query time: 8 msec ;; FROM: draco to SERVER: 10.53.0.3 ;; WHEN: Wed Jun 21 10:58:54 2000 ;; MSG SIZE sent: 36 rcvd: 97 bind9-9.9.5.dfsg/bin/tests/system/stub/ns2/0002755000470500017500000000000012276444015017762 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/stub/ns2/named.conf0000644000470500017500000000240612271526120021706 0ustar lamontlamont/* * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id: named.conf,v 1.14 2007/06/19 23:47:05 tbox Exp $ */ controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; recursion no; notify yes; }; zone "." { type hint; file "../../common/root.hint"; }; zone "child.example" { type master; file "child.example.db"; }; bind9-9.9.5.dfsg/bin/tests/system/stub/ns2/child.example.db0000644000470500017500000000235412271526120023001 0ustar lamontlamont; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") ; Copyright (C) 2000, 2001 Internet Software Consortium. ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id: child.example.db,v 1.9 2007/06/19 23:47:05 tbox Exp $ $TTL 300 ; 5 minutes child.example. IN SOA ns2.child.example. hostmaster.child.example. ( 2000042795 ; serial 20 ; refresh (20 seconds) 20 ; retry (20 seconds) 1814400 ; expire (3 weeks) 3600 ; minimum (1 hour) ) child.example. NS ns2.child.example. ns2.child.example. A 10.53.0.2 data TXT some test data bind9-9.9.5.dfsg/bin/tests/system/stub/knowngood.dig.out.norec0000644000470500017500000000111012271526120023645 0ustar lamontlamont ; <<>> DiG 8.2 <<>> -p @10.53.0.3 +norec data.child.example txt ; (1 server found) ;; res options: init defnam dnsrch ;; got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 216 ;; flags: qr ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; QUERY SECTION: ;; data.child.example, type = TXT, class = IN ;; AUTHORITY SECTION: child.example. 5M IN NS ns2.child.example. ;; ADDITIONAL SECTION: ns2.child.example. 5M IN A 10.53.0.2 ;; Total query time: 3 msec ;; FROM: draco to SERVER: 10.53.0.3 ;; WHEN: Wed Jun 21 10:58:37 2000 ;; MSG SIZE sent: 36 rcvd: 70 bind9-9.9.5.dfsg/bin/tests/system/cleanpkcs11.sh0000644000470500017500000000167612271526120020745 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: cleanpkcs11.sh,v 1.3 2010/06/08 23:50:24 tbox Exp $ if [ ! -x ../../pkcs11/pkcs11-destroy ]; then exit 1; fi ../../pkcs11/pkcs11-destroy -s ${SLOT:-0} -p 1234 bind9-9.9.5.dfsg/bin/tests/system/verify/0002755000470500017500000000000012276444015017607 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/verify/tests.sh0000644000470500017500000000461712271526120021304 0ustar lamontlamont# Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh failed () { cat verify.out.$n | sed 's/^/D:/'; echo "I:failed"; status=1; } n=0 status=0 for file in zones/*.good do n=`expr $n + 1` zone=`expr "$file" : 'zones/\(.*\).good'` echo "I:checking supposedly good zone: $zone ($n)" ret=0 case $zone in zsk-only.*) only=-z;; ksk-only.*) only=-z;; *) only=;; esac $VERIFY ${only} -o $zone $file > verify.out.$n 2>&1 || ret=1 [ $ret = 0 ] || failed done for file in zones/*.bad do n=`expr $n + 1` zone=`expr "$file" : 'zones/\(.*\).bad'` echo "I:checking supposedly bad zone: $zone ($n)" ret=0 dumpit=0 case $zone in zsk-only.*) only=-z;; ksk-only.*) only=-z;; *) only=;; esac expect1= expect2= case $zone in *.dnskeyonly) expect1="DNSKEY is not signed" ;; *.expired) expect1="signature has expired" expect2="No self-signed .*DNSKEY found" ;; *.ksk-expired) expect1="signature has expired" expect2="No self-signed .*DNSKEY found" ;; *.out-of-zone-nsec|*.below-bottom-of-zone-nsec) expect1="unexpected NSEC RRset at" ;; *.nsec.broken-chain) expect1="Bad NSEC record for.*, next name mismatch" ;; *.bad-bitmap) expect1="bit map mismatch" ;; *.missing-empty) expect1="Missing NSEC3 record for"; ;; unsigned) expect1="Zone contains no DNSSEC keys" ;; *.extra-nsec3) expect1="Expected and found NSEC3 chains not equal"; ;; *) dumpit=1 ;; esac $VERIFY ${only} -o $zone $file > verify.out.$n 2>&1 && ret=1 grep "${expect1:-.}" verify.out.$n > /dev/null || ret=1 grep "${expect2:-.}" verify.out.$n > /dev/null || ret=1 [ $ret = 0 ] || failed [ $dumpit = 1 ] && cat verify.out.$n done exit $status bind9-9.9.5.dfsg/bin/tests/system/verify/clean.sh0000644000470500017500000000167012271526120021220 0ustar lamontlamont# Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ rm -f zones/*.good rm -f zones/*.good.tmp rm -f zones/*.bad rm -f zones/*.bad.tmp rm -f zones/*.out* rm -f zones/dsset-* rm -f zones/K* rm -f random.data rm -f verify.out* bind9-9.9.5.dfsg/bin/tests/system/verify/setup.sh0000644000470500017500000000164012271526120021273 0ustar lamontlamont#!/bin/sh -e # # Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: setup.sh,v 1.20 2011/02/15 22:02:36 marka Exp $ sh clean.sh ../../../tools/genrandom 400 random.data (cd zones && sh genzones.sh) bind9-9.9.5.dfsg/bin/tests/system/verify/zones/0002755000470500017500000000000012271526120020736 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/verify/zones/genzones.sh0000644000470500017500000002201112271526120023114 0ustar lamontlamont# Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data dumpit () { echo "D:${debug}: dumping ${1}" cat "${1}" | sed 's/^/D:/' } setup () { echo "I:setting up $2 zone: $1" debug="$1" zone="$1" file="$1.$2" n=`expr ${n:-0} + 1` } # A unsigned zone should fail validation. setup unsigned bad cp unsigned.db unsigned.bad # A set of nsec zones. setup zsk-only.nsec good $KEYGEN -r $RANDFILE ${zone}> kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -SP -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk-only.nsec good $KEYGEN -r $RANDFILE -fK ${zone} > kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -SPz -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk+zsk.nsec good $KEYGEN -r $RANDFILE ${zone} > kg1.out$n 2>&1 || dumpit kg1.out$n $KEYGEN -r $RANDFILE -fK ${zone} > kg2.out$n 2>&1 || dumpit kg2.out$n $SIGNER -SPx -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n # A set of nsec3 zones. setup zsk-only.nsec3 good $KEYGEN -3 -r $RANDFILE ${zone}> kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -3 - -SP -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk-only.nsec3 good $KEYGEN -3 -r $RANDFILE -fK ${zone} > kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -3 - -SPz -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk+zsk.nsec3 good $KEYGEN -3 -r $RANDFILE ${zone} > kg1.out$n 2>&1 || dumpit kg1.out$n $KEYGEN -3 -r $RANDFILE -fK ${zone} > kg2.out$n 2>&1 || dumpit kg2.out$n $SIGNER -3 - -SPx -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk+zsk.outout good $KEYGEN -3 -r $RANDFILE ${zone} > kg1.out$n 2>&1 || dumpit kg1.out$n $KEYGEN -3 -r $RANDFILE -fK ${zone} > kg2.out$n 2>&1 || dumpit kg2.out$n $SIGNER -3 - -A -SPx -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n # A set of zones with only DNSKEY records. setup zsk-only.dnskeyonly bad key1=`$KEYGEN -r $RANDFILE ${zone} 2>kg.out` || dumpit kg.out$n cat unsigned.db $key1.key > ${file} setup ksk-only.dnskeyonly bad key1=`$KEYGEN -r $RANDFILE -fK ${zone} 2>kg.out` || dumpit kg.out$n cat unsigned.db $key1.key > ${file} setup ksk+zsk.dnskeyonly bad key1=`$KEYGEN -r $RANDFILE ${zone} 2>kg.out` || dumpit kg.out$n key2=`$KEYGEN -r $RANDFILE -fK ${zone} 2>kg.out` || dumpit kg.out$n cat unsigned.db $key1.key $key2.key > ${file} # A set of zones with expired records s="-s -2678400" setup zsk-only.nsec.expired bad $KEYGEN -r $RANDFILE ${zone}> kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -SP ${s} -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk-only.nsec.expired bad $KEYGEN -r $RANDFILE -fK ${zone} > kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -SPz ${s} -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk+zsk.nsec.expired bad $KEYGEN -r $RANDFILE ${zone} > kg1.out$n 2>&1 || dumpit kg1.out$n $KEYGEN -r $RANDFILE -fK ${zone} > kg2.out$n 2>&1 || dumpit kg2.out$n $SIGNER -SP ${s} -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup zsk-only.nsec3.expired bad $KEYGEN -3 -r $RANDFILE ${zone}> kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -3 - ${s} -SP -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk-only.nsec3.expired bad $KEYGEN -3 -r $RANDFILE -fK ${zone} > kg.out$n 2>&1 || dumpit kg.out$n $SIGNER -3 - ${s} -SPz -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n setup ksk+zsk.nsec3.expired bad $KEYGEN -3 -r $RANDFILE ${zone} > kg1.out$n 2>&1 || dumpit kg1.out$n $KEYGEN -3 -r $RANDFILE -fK ${zone} > kg2.out$n 2>&1 || dumpit kg2.out$n $SIGNER -3 - ${s} -SPx -o ${zone} -f ${file} unsigned.db > s.out$n 2>&1 || dumpit s.out$n # ksk expired setup ksk+zsk.nsec.ksk-expired bad zsk=`$KEYGEN -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -Px -o ${zone} -f ${file} ${file} $zsk > s.out$n 2>&1 || dumpit s.out$n $SIGNER ${s} -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n now=`date -u +%Y%m%d%H%M%S` exp=`awk '$4 == "RRSIG" && $5 == "DNSKEY" { print $9;}' ${file}` [ "${exp:-40001231246060}" -lt ${now:-0} ] || dumpit $file setup ksk+zsk.nsec3.ksk-expired bad zsk=`$KEYGEN -3 -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -3 -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -3 - -Px -o ${zone} -f ${file} ${file} $zsk > s.out$n 2>&1 || dumpit s.out$n $SIGNER -3 - ${s} -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n now=`date -u +%Y%m%d%H%M%S` exp=`awk '$4 == "RRSIG" && $5 == "DNSKEY" { print $9;}' ${file}` [ "${exp:-40001231246060}" -lt ${now:-0} ] || dumpit $file # broken nsec chain setup ksk+zsk.nsec.broken-chain bad zsk=`$KEYGEN -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n awk '$4 == "NSEC" { $5 = "'$zone'."; print } { print }' ${file} > ${file}.tmp $SIGNER -Px -Z nonsecify -o ${zone} -f ${file} ${file}.tmp $zsk > s.out$n 2>&1 || dumpit s.out$n # bad nsec bitmap setup ksk+zsk.nsec.bad-bitmap bad zsk=`$KEYGEN -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n awk '$4 == "NSEC" && /SOA/ { $6=""; print } { print }' ${file} > ${file}.tmp $SIGNER -Px -Z nonsecify -o ${zone} -f ${file} ${file}.tmp $zsk > s.out$n 2>&1 || dumpit s.out$n # extra NSEC record out side of zone setup ksk+zsk.nsec.out-of-zone-nsec bad zsk=`$KEYGEN -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n echo "out-of-zone. 3600 IN NSEC ${zone}. A" >> ${file} $SIGNER -Px -Z nonsecify -O full -o ${zone} -f ${file} ${file} $zsk > s.out$n 2>&1 || dumpit s.out$n # extra NSEC record below bottom of one setup ksk+zsk.nsec.below-bottom-of-zone-nsec bad zsk=`$KEYGEN -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n echo "ns.sub.${zone}. 3600 IN NSEC ${zone}. A AAAA" >> ${file} $SIGNER -Px -Z nonsecify -O full -o ${zone} -f ${file}.tmp ${file} $zsk > s.out$n 2>&1 || dumpit s.out$n # dnssec-signzone signs any node with a NSEC record. awk '$1 ~ /^ns.sub/ && $4 == "RRSIG" && $5 != "NSEC" { next; } { print; }' ${file}.tmp > ${file} # missing NSEC3 record at empty node # extract the hash fields from the empty node's NSEC 3 record then fix up # the NSEC3 chain to remove it setup ksk+zsk.nsec3.missing-empty bad zsk=`$KEYGEN -3 -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -3 -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -3 - -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n a=`awk '$4 == "NSEC3" && NF == 9 { split($1, a, "."); print a[1]; }' ${file}` b=`awk '$4 == "NSEC3" && NF == 9 { print $9; }' ${file}` awk ' $4 == "NSEC3" && $9 == "'$a'" { $9 = "'$b'"; print; next; } $4 == "NSEC3" && NF == 9 { next; } { print; }' ${file} > ${file}.tmp $SIGNER -3 - -Px -Z nonsecify -O full -o ${zone} -f ${file} ${file}.tmp $zsk > s.out$n 2>&1 || dumpit s.out$n # extra NSEC3 record setup ksk+zsk.nsec3.extra-nsec3 bad zsk=`$KEYGEN -3 -r $RANDFILE ${zone} 2> kg1.out$n` || dumpit kg1.out$n ksk=`$KEYGEN -3 -r $RANDFILE -fK ${zone} 2> kg2.out$n` || dumpit kg2.out$n cat unsigned.db $ksk.key $zsk.key > $file $SIGNER -3 - -P -O full -o ${zone} -f ${file} ${file} $ksk > s.out$n 2>&1 || dumpit s.out$n awk ' BEGIN { ZONE="'${zone}'."; } $4 == "NSEC3" && NF == 9 { $1 = "H9P7U7TR2U91D0V0LJS9L1GIDNP90U3H." ZONE; $9 = "H9P7U7TR2U91D0V0LJS9L1GIDNP90U3I"; print; }' ${file} >> ${file} $SIGNER -3 - -Px -Z nonsecify -O full -o ${zone} -f ${file} ${file} $zsk > s.out$n 2>&1 || dumpit s.out$n bind9-9.9.5.dfsg/bin/tests/system/verify/zones/unsigned.db0000644000470500017500000000226612271526120023065 0ustar lamontlamont; Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 3600 @ SOA . . 0 0 0 2419200 3600 ; 28 day expire @ NS . data A 1.2.3.4 dname DNAME data longttl 2419200 A 1.2.3.4 sub.dname TXT sub.dname sub.empty TXT sub.empty sub NS ns.sub ns.sub A 1.2.3.4 ns.sub AAAA 2002::1.2.3.4 other.sub TXT other.sub secure NS secure secure DS 1312 50 100 96EEB2FFD9B00CD4694E78278B5EFDAB0A80446567B69F634DA078F0 secure A 1.2.3.4 secure AAAA 2002::1.2.3.4 out-of-zone. A 1.2.3.4 bind9-9.9.5.dfsg/bin/tests/system/testsock6.pl0000644000470500017500000000460012271526120020554 0ustar lamontlamont#!/usr/bin/perl # # Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: testsock6.pl,v 1.5 2010/06/22 23:46:52 tbox Exp $ # Test whether the interfaces on 10.53.0.* are up. require 5.001; use IO::Socket::INET6; foreach $addr ($ARGV) { my $sock; $sock = IO::Socket::INET6->new(LocalAddr => $addr, LocalPort => 0, Proto => tcp) or die "Can't bind : $@\n"; close($sock); } #!/usr/bin/perl # # Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id: testsock6.pl,v 1.5 2010/06/22 23:46:52 tbox Exp $ # Test whether the interfaces on 10.53.0.* are up. require 5.001; use IO::Socket::INET6; foreach $addr ($ARGV) { my $sock; $sock = IO::Socket::INET6->new(LocalAddr => $addr, LocalPort => 0, Proto => tcp) or die "Can't bind : $@\n"; close($sock); } bind9-9.9.5.dfsg/bin/tests/system/rrl/0002755000470500017500000000000012276444015017102 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rrl/tests.sh0000644000470500017500000001552112271526120020573 0ustar lamontlamont# Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # test response rate limiting SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh #set -x ns1=10.53.0.1 # root, defining the others ns2=10.53.0.2 # test server ns3=10.53.0.3 # secondary test server ns7=10.53.0.7 # whitelisted client USAGE="$0: [-x]" while getopts "x" c; do case $c in x) set -x;; *) echo "$USAGE" 1>&2; exit 1;; esac done shift `expr $OPTIND - 1 || true` if test "$#" -ne 0; then echo "$USAGE" 1>&2 exit 1 fi # really quit on control-C trap 'exit 1' 1 2 15 ret=0 setret () { ret=1 echo "$*" } # Wait until soon after the start of a second to make results consistent. # The start of a second credits a rate limit. # This would be far easier in C or by assuming a modern version of perl. sec_start () { START=`date` while true; do NOW=`date` if test "$START" != "$NOW"; then return fi $PERL -e 'select(undef, undef, undef, 0.05)' || true done } # turn off ${HOME}/.digrc HOME=/dev/null; export HOME # $1=result name $2=domain name $3=dig options digcmd () { OFILE=$1; shift DIG_DOM=$1; shift ARGS="+nosearch +time=1 +tries=1 +ignore -p 5300 $* $DIG_DOM @$ns2" #echo I:dig $ARGS 1>&2 START=`date +%y%m%d%H%M.%S` RESULT=`$DIG $ARGS 2>&1 | tee $OFILE=TEMP \ | sed -n -e '/^;; AUTHORITY/,/^$/d' \ -e '/^;; ADDITIONAL/,/^$/d' \ -e 's/^[^;].* \([^ ]\{1,\}\)$/\1/p' \ -e 's/;; flags.* tc .*/TC/p' \ -e 's/;; .* status: NXDOMAIN.*/NXDOMAIN/p' \ -e 's/;; .* status: SERVFAIL.*/SERVFAIL/p' \ -e 's/;; connection timed out.*/drop/p' \ -e 's/;; communications error to.*/drop/p' \ | tr -d '\n'` mv "$OFILE=TEMP" "$OFILE=$RESULT" touch -t $START "$OFILE=$RESULT" } # $1=number of tests $2=target domain $3=dig options QNUM=1 burst () { BURST_LIMIT=$1; shift BURST_DOM_BASE="$1"; shift while test "$BURST_LIMIT" -ge 1; do CNT=`expr "00$QNUM" : '.*\(...\)'` eval BURST_DOM="$BURST_DOM_BASE" FILE="dig.out-$BURST_DOM-$CNT" digcmd $FILE $BURST_DOM $* & QNUM=`expr $QNUM + 1` BURST_LIMIT=`expr "$BURST_LIMIT" - 1` done } # $1=domain $2=IP address $3=# of IP addresses $4=TC $5=drop # $6=NXDOMAIN $7=SERVFAIL or other errors ck_result() { BAD= wait ADDRS=`ls dig.out-$1-*=$2 2>/dev/null | wc -l` # count simple truncated and truncated NXDOMAIN as TC TC=`ls dig.out-$1-*=TC dig.out-$1-*=NXDOMAINTC 2>/dev/null | wc -l` DROP=`ls dig.out-$1-*=drop 2>/dev/null | wc -l` # count NXDOMAIN and truncated NXDOMAIN as NXDOMAIN NXDOMAIN=`ls dig.out-$1-*=NXDOMAIN dig.out-$1-*=NXDOMAINTC 2>/dev/null \ | wc -l` SERVFAIL=`ls dig.out-$1-*=SERVFAIL 2>/dev/null | wc -l` if test $ADDRS -ne "$3"; then setret "I:"$ADDRS" instead of $3 '$2' responses for $1" BAD=yes fi if test $TC -ne "$4"; then setret "I:"$TC" instead of $4 truncation responses for $1" BAD=yes fi if test $DROP -ne "$5"; then setret "I:"$DROP" instead of $5 dropped responses for $1" BAD=yes fi if test $NXDOMAIN -ne "$6"; then setret "I:"$NXDOMAIN" instead of $6 NXDOMAIN responses for $1" BAD=yes fi if test $SERVFAIL -ne "$7"; then setret "I:"$SERVFAIL" instead of $7 error responses for $1" BAD=yes fi if test -z "$BAD"; then rm -f dig.out-$1-* fi } ckstats () { LABEL="$1"; shift TYPE="$1"; shift EXPECTED="$1"; shift C=`sed -n -e "s/[ ]*\([0-9]*\).responses $TYPE for rate limits.*/\1/p" \ ns2/named.stats | tail -1` C=`expr 0$C + 0` if test "$C" -ne $EXPECTED; then setret "I:wrong $LABEL $TYPE statistics of $C instead of $EXPECTED" fi } ######### sec_start # Tests of referrals to "." must be done before the hints are loaded # or with "additional-from-cache no" burst 5 a1.tld3 +norec # basic rate limiting burst 3 a1.tld2 # 1 second delay allows an additional response. sleep 1 burst 10 a1.tld2 # Request 30 different qnames to try a wildcard. burst 30 'x$CNT.a2.tld2' # These should be counted and limited but are not. See RT33138. burst 10 'y.x$CNT.a2.tld2' # IP TC drop NXDOMAIN SERVFAIL # referrals to "." ck_result a1.tld3 '' 2 1 2 0 0 # check 13 results including 1 second delay that allows an additional response ck_result a1.tld2 192.0.2.1 3 4 6 0 0 # Check the wild card answers. # The parent name of the 30 requests is counted. ck_result 'x*.a2.tld2' 192.0.2.2 2 10 18 0 0 # These should be limited but are not. See RT33138. ck_result 'y.x*.a2.tld2' 192.0.2.2 10 0 0 0 0 ######### sec_start burst 10 'x.a3.tld3' burst 10 'y$CNT.a3.tld3' burst 10 'z$CNT.a4.tld2' # 10 identical recursive responses are limited ck_result 'x.a3.tld3' 192.0.3.3 2 3 5 0 0 # 10 different recursive responses are not limited ck_result 'y*.a3.tld3' 192.0.3.3 10 0 0 0 0 # 10 different NXDOMAIN responses are limited based on the parent name. # We count 13 responses because we count truncated NXDOMAIN responses # as both truncated and NXDOMAIN. ck_result 'z*.a4.tld2' x 0 3 5 5 0 $RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats ckstats first dropped 36 ckstats first truncated 21 ######### sec_start burst 10 a5.tld2 +tcp burst 10 a6.tld2 -b $ns7 burst 10 a7.tld4 burst 2 a8.tld2 AAAA burst 2 a8.tld2 TXT burst 2 a8.tld2 SPF # IP TC drop NXDOMAIN SERVFAIL # TCP responses are not rate limited ck_result a5.tld2 192.0.2.5 10 0 0 0 0 # whitelisted client is not rate limited ck_result a6.tld2 192.0.2.6 10 0 0 0 0 # Errors such as SERVFAIL are rate limited. ck_result a7.tld4 x 0 0 8 0 2 # NODATA responses are counted as the same regardless of qtype. ck_result a8.tld2 '' 2 2 2 0 0 $RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats ckstats second dropped 46 ckstats second truncated 23 ######### sec_start # IP TC drop NXDOMAIN SERVFAIL # all-per-second # The qnames are all unique but the client IP address is constant. QNUM=101 burst 60 'all$CNT.a9.tld2' ck_result 'a*.a9.tld2' 192.0.2.8 50 0 10 0 0 $RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s $ns2 stats ckstats final dropped 56 ckstats final truncated 23 echo "I:exit status: $ret" # exit $ret [ $ret -ne 0 ] && echo "I:test failure overridden" exit 0 bind9-9.9.5.dfsg/bin/tests/system/rrl/ns1/0002755000470500017500000000000012276444015017603 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rrl/ns1/named.conf0000644000470500017500000000210512271526120021523 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; session-keyfile "session.key"; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; notify no; }; zone "." {type master; file "root.db";}; bind9-9.9.5.dfsg/bin/tests/system/rrl/ns1/root.db0000644000470500017500000000203412271526120021063 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. $TTL 120 @ SOA ns. hostmaster.ns. ( 1 3600 1200 604800 60 ) @ NS ns. ns. A 10.53.0.1 . A 10.53.0.1 ; limit responses from here tld2. NS ns.tld2. ns.tld2. A 10.53.0.2 ; limit recursion to here tld3. NS ns.tld3. ns.tld3. A 10.53.0.3 ; generate SERVFAIL tld4. NS ns.tld3. bind9-9.9.5.dfsg/bin/tests/system/rrl/clean.sh0000644000470500017500000000164412271526120020514 0ustar lamontlamont# Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # Clean up after rrl tests. rm -f dig.out* rm -f */named.memstats */named.run */named.stats */log-* */session.key rm -f ns3/bl*.db */*.jnl */*.core */*.pid bind9-9.9.5.dfsg/bin/tests/system/rrl/ns3/0002755000470500017500000000000012276444015017605 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rrl/ns3/tld3.db0000644000470500017500000000164312271526120020755 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; rate limit response from this zone $TTL 120 @ SOA tld3. hostmaster.ns.tld3. ( 1 3600 1200 604800 60 ) NS ns NS . ns A 10.53.0.3 *.a3 A 192.0.3.3 bind9-9.9.5.dfsg/bin/tests/system/rrl/ns3/named.conf0000644000470500017500000000275712271526120021542 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ controls { /* empty */ }; options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; session-keyfile "session.key"; pid-file "named.pid"; listen-on { 10.53.0.3; }; listen-on-v6 { none; }; notify no; // check that all of the options are parsed without limiting anything rate-limit { responses-per-second 200; referrals-per-second 220; nodata-per-second 230; nxdomains-per-second 240; errors-per-second 250; all-per-second 700; ipv4-prefix-length 24; ipv6-prefix-length 64; qps-scale 10; window 1; max-table-size 1000; }; }; zone "." { type hint; file "hints"; }; zone "tld3."{ type master; file "tld3.db"; }; bind9-9.9.5.dfsg/bin/tests/system/rrl/ns3/hints0000644000470500017500000000144512271526120020650 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. . 0 NS ns1. ns1. 0 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rrl/setup.sh0000644000470500017500000000151112271526120020563 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh . ./clean.sh bind9-9.9.5.dfsg/bin/tests/system/rrl/Makefile.in0000644000470500017500000000235012271526120021136 0ustar lamontlamont# Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = ${ISC_INCLUDES} CDEFINES = CWARNINGS = DNSLIBS = ISCLIBS = . DNSDEPLIBS = ISCDEPLIBS = DEPLIBS = LIBS = @LIBS@ TARGETS = rrl@EXEEXT@ FILTEROBJS = rrl.@O@ SRCS = rrl.c @BIND9_MAKE_RULES@ all: rrl@EXEEXT@ rrl@EXEEXT@: ${FILTEROBJS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${FILTEROBJS} ${LIBS} clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/system/rrl/rrl.c0000644000470500017500000000167512271526120020045 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #include #include int main(int argc, char **argv) { UNUSED(argc); UNUSED(argv); #ifdef USE_RRL return (0); #else return (1); #endif } bind9-9.9.5.dfsg/bin/tests/system/rrl/ns2/0002755000470500017500000000000012276444015017604 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rrl/ns2/tld2.db0000644000470500017500000000233312271526120020750 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; rate limit response from this zone $TTL 120 @ SOA tld2. hostmaster.ns.tld2. ( 1 3600 1200 604800 60 ) NS ns NS . ns A 10.53.0.2 ; basic rate limiting a1 A 192.0.2.1 ; wildcards *.a2 A 192.0.2.2 ; a3 is in tld3 ; a4 does not exist to give NXDOMAIN ; a5 for TCP requests a5 A 192.0.2.5 ; a6 for whitelisted clients a6 A 192.0.2.6 ; a7 for SERVFAIL ; a8 for NODATA a8 A 192.0.2.8 ; a9 for all-per-second limit $GENERATE 101-180 all$.a9 A 192.0.2.8 bind9-9.9.5.dfsg/bin/tests/system/rrl/ns2/named.conf0000644000470500017500000000361112271526120021527 0ustar lamontlamont/* * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; session-keyfile "session.key"; pid-file "named.pid"; statistics-file "named.stats"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; notify no; rate-limit { responses-per-second 2; all-per-second 50; slip 3; exempt-clients { 10.53.0.7; }; // small enough to force a table expansion min-table-size 75; }; additional-from-cache no; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.2 port 9953 allow { any; } keys { rndc_key; }; }; /* * These log settings have no effect unless "-g" is removed from ../../start.pl */ logging { channel debug { file "log-debug"; print-category yes; print-severity yes; severity debug 10; }; channel queries { file "log-queries"; print-category yes; print-severity yes; severity info; }; category rate-limit { debug; queries; }; category queries { debug; queries; }; }; zone "." { type hint; file "hints"; }; zone "tld2."{ type master; file "tld2.db"; }; bind9-9.9.5.dfsg/bin/tests/system/rrl/ns2/hints0000644000470500017500000000144512271526120020647 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. . 0 NS ns1. ns1. 0 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rrl/prereq.sh0000644000470500017500000000157312271526120020731 0ustar lamontlamont#!/bin/sh # # Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. if ./rrl then : else echo "I:This test requires --enable-rrl at compile time." >&2 exit 255 fi bind9-9.9.5.dfsg/bin/tests/system/rpz/0002755000470500017500000000000012276444015017116 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/tests.sh0000644000470500017500000003703512271526120020613 0ustar lamontlamont# Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # test response policy zones (RPZ) SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh ns=10.53.0 ns1=$ns.1 # root, defining the others ns2=$ns.2 # server whose answers are rewritten ns3=$ns.3 # resolve that does the rewriting ns4=$ns.4 # another server that is rewritten ns5=$ns.5 # check performance with this server HAVE_CORE= SAVE_RESULTS= NS3_STATS=47 USAGE="$0: [-x]" while getopts "x" c; do case $c in x) set -x;; *) echo "$USAGE" 1>&2; exit 1;; esac done shift `expr $OPTIND - 1 || true` if test "$#" -ne 0; then echo "$USAGE" 1>&2 exit 1 fi # really quit on control-C trap 'exit 1' 1 2 15 TS='%H:%M:%S ' TS= comment () { if test -n "$TS"; then date "+I:${TS}$*" fi } RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p 9953 -s" digcmd () { # Default to +noauth and @$ns3 # Also default to -bX where X is the @value so that OS X will choose # the right IP source address. digcmd_args=`echo "+noadd +time=1 +tries=1 -p 5300 $*" | \ sed -e "/@/!s/.*/& @$ns3/" \ -e '/-b/!s/@\([^ ]*\)/@\1 -b\1/' \ -e '/+n?o?auth/!s/.*/+noauth &/'` #echo I:dig $digcmd_args 1>&2 $DIG $digcmd_args } # set DIGNM=file name for dig output GROUP_NM= TEST_NUM=0 make_dignm () { TEST_NUM=`expr $TEST_NUM + 1` DIGNM=dig.out$GROUP_NM-$TEST_NUM while test -f $DIGNM; do TEST_NUM="$TEST_NUM+" DIGNM=dig.out$GROUP_NM-$TEST_NUM done } setret () { ret=1 status=`expr $status + 1` echo "$*" } # (re)load the reponse policy zones with the rules in the file $TEST_FILE load_db () { if test -n "$TEST_FILE"; then $NSUPDATE -v $TEST_FILE || { echo "I:failed to update policy zone with $TEST_FILE" exit 1 } fi } restart () { # try to ensure that the server really has stopped # and won't mess with ns$1/name.pid if test -z "$HAVE_CORE" -a -f ns$1/named.pid; then $RNDCCMD $ns$1 halt >/dev/null 2>&1 if test -f ns$1/named.pid; then sleep 1 PID=`cat ns$1/named.pid 2>/dev/null` if test -n "$PID"; then echo "I:killing ns$1 server $PID" kill -9 $PID fi fi fi rm -f ns$1/*.jnl if test -f ns$1/base.db; then for NM in ns$1/bl*.db; do cp -f ns$1/base.db $NM done fi $PERL $SYSTEMTESTTOP/start.pl --noclean --restart . ns$1 load_db } # $1=server and irrelevant args $2=error message ckalive () { CKALIVE_NS=`expr "$1" : '.*@ns\([1-9]\).*'` if test -z "$CKALIVE_NS"; then CKALIVE_NS=3 fi eval CKALIVE_IP=\$ns$CKALIVE_NS $RNDCCMD $CKALIVE_IP status >/dev/null 2>&1 && return 0 HAVE_CORE=yes setret "$2" # restart the server to avoid stalling waiting for it to stop restart $CKALIVE_NS return 1 } # check that statistics for $1 in $2 = $3 ckstats () { rm -f $2/named.stats $RNDCCMD $1 stats CNT=`sed -n -e 's/[ ]*\([0-9]*\).response policy.*/\1/p' \ $2/named.stats` CNT=`expr 0$CNT + 0` if test "$CNT" -ne $3; then setret "I:wrong $2 statistics of $CNT instead of $3" fi } # $1=message $2=optional test file name start_group () { ret=0 test -n "$1" && date "+I:${TS}checking $1" TEST_FILE=$2 if test -n "$TEST_FILE"; then GROUP_NM="-$TEST_FILE" load_db else GROUP_NM= fi TEST_NUM=0 } end_group () { if test -n "$TEST_FILE"; then # remove the previous set of test rules sed -e 's/[ ]add[ ]/ delete /' $TEST_FILE | $NSUPDATE TEST_FILE= fi ckalive $ns3 "I:failed; ns3 server crashed and restarted" GROUP_NM= } clean_result () { if test -z "$SAVE_RESULTS"; then rm -f $* fi } # $1=dig args $2=other dig output file ckresult () { #ckalive "$1" "I:server crashed by 'dig $1'" || return 1 if $PERL $SYSTEMTESTTOP/digcomp.pl $DIGNM $2 >/dev/null; then clean_result ${DIGNM}* return 0 fi setret "I:'dig $1' wrong; diff $DIGNM $2" return 1 } # check only that the server does not crash # $1=target domain $2=optional query type nocrash () { digcmd $* >/dev/null ckalive "$*" "I:server crashed by 'dig $*'" } # check rewrite to NXDOMAIN # $1=target domain $2=optional query type nxdomain () { make_dignm digcmd $* \ | sed -e 's/^[a-z].* IN CNAME /;xxx &/' \ -e 's/^[a-z].* IN RRSIG /;xxx &/' \ >$DIGNM ckresult "$*" proto.nxdomain } # check rewrite to NODATA # $1=target domain $2=optional query type nodata () { make_dignm digcmd $* \ | sed -e 's/^[a-z].* IN CNAME /;xxx &/' >$DIGNM ckresult "$*" proto.nodata } # check rewrite to an address # modify the output so that it is easily compared, but save the original line # $1=IPv4 address $2=digcmd args $3=optional TTL addr () { ADDR=$1 make_dignm digcmd $2 >$DIGNM #ckalive "$2" "I:server crashed by 'dig $2'" || return 1 ADDR_ESC=`echo "$ADDR" | sed -e 's/\./\\\\./g'` ADDR_TTL=`sed -n -e "s/^[-.a-z0-9]\{1,\} *\([0-9]*\) IN AA* ${ADDR_ESC}\$/\1/p" $DIGNM` if test -z "$ADDR_TTL"; then setret "I:'dig $2' wrong; no address $ADDR record in $DIGNM" return 1 fi if test -n "$3" && test "$ADDR_TTL" -ne "$3"; then setret "I:'dig $2' wrong; TTL=$ADDR_TTL instead of $3 in $DIGNM" return 1 fi clean_result ${DIGNM}* } # check that a response is not rewritten # $1=target domain $2=optional query type nochange () { make_dignm digcmd $* >$DIGNM digcmd $* @$ns2 >${DIGNM}_OK ckresult "$*" ${DIGNM}_OK && clean_result ${DIGNM}_OK } # check against a 'here document' here () { make_dignm sed -e 's/^[ ]*//' >${DIGNM}_OK digcmd $* >$DIGNM ckresult "$*" ${DIGNM}_OK } # make prototype files to check against rewritten results digcmd nonexistent @$ns2 >proto.nxdomain digcmd txt-only.tld2 @$ns2 >proto.nodata status=0 start_group "QNAME rewrites" test1 nochange . # 1 do not crash or rewrite root nxdomain a0-1.tld2 # 2 nodata a3-1.tld2 # 3 nodata a3-2.tld2 # 4 nodata at DNAME itself nochange sub.a3-2.tld2 # 5 miss where DNAME might work nxdomain a4-2.tld2 # 6 rewrite based on CNAME target nxdomain a4-2-cname.tld2 # 7 nodata a4-3-cname.tld2 # 8 addr 12.12.12.12 a4-1.sub1.tld2 # 9 A replacement addr 12.12.12.12 a4-1.sub2.tld2 # 10 A replacement with wildcard addr 12.12.12.12 nxc1.sub1.tld2 # 11 replace NXDOMAIN with CNAME addr 12.12.12.12 nxc2.sub1.tld2 # 12 replace NXDOMAIN with CNAME chain addr 127.4.4.1 a4-4.tld2 # 13 prefer 1st conflicting QNAME zone nochange a6-1.tld2 # 14 addr 127.6.2.1 a6-2.tld2 # 15 addr 56.56.56.56 a3-6.tld2 # 16 wildcard CNAME addr 57.57.57.57 a3-7.sub1.tld2 # 17 wildcard CNAME addr 127.0.0.16 a4-5-cname3.tld2 # 18 CNAME chain addr 127.0.0.17 a4-6-cname3.tld2 # 19 stop short in CNAME chain nochange a0-1.tld2 +norecurse # 20 check that RD=1 is required nochange a3-1.tld2 +norecurse # 21 nochange a3-2.tld2 +norecurse # 22 nochange sub.a3-2.tld2 +norecurse # 23 nxdomain c1.crash2.tld3 # 24 assert in rbtdb.c nxdomain a0-1.tld2 +dnssec # 25 simple DO=1 without signatures nxdomain a0-1.tld2s # 26 simple DO=0 with signatures nochange a0-1.tld2s +dnssec # 27 simple DO=1 with signatures nxdomain a0-1s-cname.tld2s +dnssec # 28 DNSSEC too early in CNAME chain nochange a0-1-scname.tld2 +dnssec # 29 DNSSEC on target in CNAME chain nochange a0-1.tld2s srv +auth +dnssec # 30 no write for +DNSSEC and no record nxdomain a0-1.tld2s srv # 31 end_group start_group "IP rewrites" test2 nodata a3-1.tld2 # 1 NODATA nochange a3-2.tld2 # 2 no policy record so no change nochange a4-1.tld2 # 3 obsolete PASSTHRU record style nxdomain a4-2.tld2 # 4 nochange a4-2.tld2 -taaaa # 5 no A => no policy rewrite nochange a4-2.tld2 -ttxt # 6 no A => no policy rewrite nxdomain a4-2.tld2 -tany # 7 no A => no policy rewrite nodata a4-3.tld2 # 8 nxdomain a3-1.tld2 -taaaa # 9 IPv6 policy nochange a4-1-aaaa.tld2 -taaaa # 10 addr 127.0.0.1 a5-1-2.tld2 # 11 prefer smallest policy address addr 127.0.0.1 a5-3.tld2 # 12 prefer first conflicting IP zone addr 14.14.14.14 a5-4.tld2 # 13 prefer QNAME to IP nochange a5-4.tld2 +norecurse # 14 check that RD=1 is required nochange a4-4.tld2 # 15 PASSTHRU nxdomain c2.crash2.tld3 # 16 assert in rbtdb.c ckstats $ns3 ns3 29 nxdomain a7-1.tld2 # 17 slave policy zone (RT34450) cp ns2/blv2.tld2.db.in ns2/bl.tld2.db $RNDCCMD 10.53.0.2 reload bl.tld2 goodsoa="rpz.tld2. hostmaster.ns.tld2. 2 3600 1200 604800 60" for i in 0 1 2 3 4 5 6 7 8 9 10 do soa=`$DIG -p 5300 +short soa bl.tld2 @10.53.0.3 -b10.53.0.3` test "$soa" = "$goodsoa" && break sleep 1 done nochange a7-1.tld2 # 18 PASSTHRU sleep 1 # ensure that a clock tick has occured so that the reload takes effect cp ns2/blv3.tld2.db.in ns2/bl.tld2.db goodsoa="rpz.tld2. hostmaster.ns.tld2. 3 3600 1200 604800 60" $RNDCCMD 10.53.0.2 reload bl.tld2 for i in 0 1 2 3 4 5 6 7 8 9 10 do soa=`$DIG -p 5300 +short soa bl.tld2 @10.53.0.3 -b10.53.0.3` test "$soa" = "$goodsoa" && break sleep 1 done nxdomain a7-1.tld2 # 19 slave policy zone (RT34450) ckstats $ns3 ns3 31 end_group # check that IP addresses for previous group were deleted from the radix tree start_group "radix tree deletions" nochange a3-1.tld2 nochange a3-2.tld2 nochange a4-1.tld2 nochange a4-2.tld2 nochange a4-2.tld2 -taaaa nochange a4-2.tld2 -ttxt nochange a4-2.tld2 -tany nochange a4-3.tld2 nochange a3-1.tld2 -tAAAA nochange a4-1-aaaa.tld2 -tAAAA nochange a5-1-2.tld2 end_group if ./rpz nsdname; then # these tests assume "min-ns-dots 0" start_group "NSDNAME rewrites" test3 nochange a3-1.tld2 # 1 nochange a3-1.tld2 +dnssec # 2 this once caused problems nxdomain a3-1.sub1.tld2 # 3 NXDOMAIN *.sub1.tld2 by NSDNAME nxdomain a3-1.subsub.sub1.tld2 nxdomain a3-1.subsub.sub1.tld2 -tany addr 12.12.12.12 a4-2.subsub.sub2.tld2 # 6 walled garden for *.sub2.tld2 nochange a3-2.tld2. # 7 exempt rewrite by name nochange a0-1.tld2. # 8 exempt rewrite by address block addr 12.12.12.12 a4-1.tld2 # 9 prefer QNAME policy to NSDNAME addr 127.0.0.1 a3-1.sub3.tld2 # 10 prefer policy for largest NSDNAME addr 127.0.0.2 a3-1.subsub.sub3.tld2 nxdomain xxx.crash1.tld2 # 12 dns_db_detachnode() crash end_group NS3_STATS=`expr $NS3_STATS + 7` else echo "I:NSDNAME not checked; named configured with --disable-rpz-nsdname" fi if ./rpz nsip; then # these tests assume "min-ns-dots 0" start_group "NSIP rewrites" test4 nxdomain a3-1.tld2 # 1 NXDOMAIN for all of tld2 nochange a3-2.tld2. # 2 exempt rewrite by name nochange a0-1.tld2. # 3 exempt rewrite by address block nochange a3-1.tld4 # 4 different NS IP address end_group # start_group "walled garden NSIP rewrites" test4a # addr 41.41.41.41 a3-1.tld2 # 1 walled garden for all of tld2 # addr 2041::41 'a3-1.tld2 AAAA' # 2 walled garden for all of tld2 # here a3-1.tld2 TXT <<'EOF' # 3 text message for all of tld2 # ;; status: NOERROR, x # a3-1.tld2. x IN TXT "NSIP walled garden" #EOF # end_group NS3_STATS=`expr $NS3_STATS + 1` else echo "I:NSIP not checked; named configured with --disable-rpz-nsip" fi # policies in ./test5 overridden by response-policy{} in ns3/named.conf # and in ns5/named.conf start_group "policy overrides" test5 addr 127.0.0.1 a3-1.tld2 # 1 bl-given nochange a3-2.tld2 # 2 bl-passthru nochange a3-3.tld2 # 3 bl-no-op obsolete for passthru nochange a3-4.tld2 # 4 bl-disabled nodata a3-5.tld2 # 5 bl-nodata nodata a3-5.tld2 +norecurse # 6 bl-nodata recursive-only no nodata a3-5.tld2 # 7 bl-nodata nodata a3-5.tld2 +norecurse @$ns5 # 8 bl-nodata recursive-only no nodata a3-5.tld2s @$ns5 # 9 bl-nodata nodata a3-5.tld2s +dnssec @$ns5 # 10 bl-nodata break-dnssec nxdomain a3-6.tld2 # 11 bl-nxdomain here a3-7.tld2 -tany <<'EOF' ;; status: NOERROR, x a3-7.tld2. x IN CNAME txt-only.tld2. txt-only.tld2. x IN TXT "txt-only-tld2" EOF addr 58.58.58.58 a3-8.tld2 # 13 bl_wildcname addr 59.59.59.59 a3-9.sub9.tld2 # 14 bl_wildcname addr 12.12.12.12 a3-15.tld2 # 15 bl-garden via CNAME to a12.tld2 addr 127.0.0.16 a3-16.tld2 100 # 16 bl max-policy-ttl 100 addr 17.17.17.17 "a3-17.tld2 @$ns5" 90 # 17 ns5 bl max-policy-ttl 90 end_group # check that miscellaneous bugs are still absent start_group "crashes" for Q in RRSIG SIG ANY 'ANY +dnssec'; do nocrash a3-1.tld2 -t$Q nocrash a3-2.tld2 -t$Q nocrash a3-5.tld2 -t$Q nocrash www.redirect -t$Q nocrash www.credirect -t$Q done # This is not a bug, because any data leaked by writing 24.4.3.2.10.rpz-ip # (or whatever) is available by publishing "foo A 10.2.3.4" and then # resolving foo. # nxdomain 32.3.2.1.127.rpz-ip end_group # superficial test for major performance bugs QPERF=`sh qperf.sh` if test -n "$QPERF"; then perf () { date "+I:${TS}checking performance $1" # Dry run to prime everything comment "before dry run $1" $QPERF -c -1 -l30 -d ns5/requests -s $ns5 -p 5300 >/dev/null comment "before real test $1" PFILE="ns5/$2.perf" $QPERF -c -1 -l30 -d ns5/requests -s $ns5 -p 5300 >$PFILE comment "after test $1" X=`sed -n -e 's/.*Returned *\([^ ]*:\) *\([0-9]*\) .*/\1\2/p' $PFILE \ | tr '\n' ' '` if test "$X" != "$3"; then setret "I:wrong results '$X' in $PFILE" fi ckalive $ns5 "I:failed; server #5 crashed" } trim () { sed -n -e 's/.*Queries per second: *\([0-9]*\).*/\1/p' ns5/$1.perf } # get qps with rpz perf 'with rpz' rpz 'NOERROR:2900 NXDOMAIN:100 ' RPZ=`trim rpz` # turn off rpz and measure qps again echo "# rpz off" >ns5/rpz-switch RNDCCMD_OUT=`$RNDCCMD $ns5 reload` perf 'without rpz' norpz 'NOERROR:3000 ' NORPZ=`trim norpz` PERCENT=`expr \( "$RPZ" \* 100 + \( $NORPZ / 2 \) \) / $NORPZ` echo "I:$RPZ qps with rpz is $PERCENT% of $NORPZ qps without rpz" MIN_PERCENT=30 if test "$PERCENT" -lt $MIN_PERCENT; then setret "I:$RPZ qps with rpz or $PERCENT% is below $MIN_PERCENT% of $NORPZ qps" fi if test "$PERCENT" -ge 100; then setret "I:$RPZ qps with RPZ or $PERCENT% of $NORPZ qps without RPZ is too high" fi ckstats $ns5 ns5 203 else echo "I:performance not checked; queryperf not available" fi ckstats $ns3 ns3 57 # restart the main test RPZ server to see if that creates a core file if test -z "$HAVE_CORE"; then $PERL $SYSTEMTESTTOP/stop.pl . ns3 restart 3 HAVE_CORE=`find ns* -name '*core*' -print` test -z "$HAVE_CORE" || setret "I:found $HAVE_CORE; memory leak?" fi # look for complaints from lib/dns/rpz.c and bin/name/query.c EMSGS=`egrep -l 'invalid rpz|rpz.*failed' ns*/named.run` if test -n "$EMSGS"; then setret "I:error messages in $EMSGS starting with:" egrep 'invalid rpz|rpz.*failed' ns*/named.run | sed -e '10,$d' -e 's/^/I: /' fi echo "I:checking that ttl values are not zeroed when qtype is '*'" $DIG +noall +answer -p 5300 @$ns3 any a3-2.tld2 > dig.out.any ttl=`awk '/a3-2 tld2 text/ {print $2}' dig.out.any` if test ${ttl:=0} -eq 0; then setret I:failed; fi echo "I:exit status: $status" exit $status bind9-9.9.5.dfsg/bin/tests/system/rpz/test30000644000470500017500000000330112271526120020067 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' ; NSDNAME tests server 10.53.0.3 5300 ; 3, 4, 5 ; NXDOMAIN for *.sub1.tld2 by NSDNAME update add *.sub1.tld2.rpz-nsdname.bl. 300 CNAME . ; ; 6 ; walled garden for *.sub2.tld2 update add *.sub2.tld2.rpz-nsdname.bl. 300 CNAME a12-cname.tld2. ; ; 7, 8 ; exempt a3-2.tld2 and anything in 192.168.0.0/24 ; also checks that IP policies are preferred over NSDNAME policies update add a3-2.tld2.bl 300 CNAME a3-2.tld2. update add 24.0.0.168.192.rpz-ip.bl 300 CNAME 24.0.0.168.192. ; ; 9 ; prefer QNAME policy to NSDNAME policy update add a4-1.tld2.bl. 300 A 12.12.12.12 ; 10 ; prefer policy for largest NS name update add ns.sub3.tld2.rpz-nsdname.bl. 300 A 127.0.0.1 update add ns.subsub.sub3.tld2.rpz-nsdname.bl. 300 A 127.0.0.2 send bind9-9.9.5.dfsg/bin/tests/system/rpz/ns1/0002755000470500017500000000000012276444015017617 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/ns1/named.conf0000644000470500017500000000212712271526120021543 0ustar lamontlamont/* * Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ controls { /* empty */ }; options { query-source address 10.53.0.1; notify-source 10.53.0.1; transfer-source 10.53.0.1; port 5300; session-keyfile "session.key"; pid-file "named.pid"; listen-on { 10.53.0.1; }; listen-on-v6 { none; }; notify no; }; zone "." {type master; file "root.db";}; bind9-9.9.5.dfsg/bin/tests/system/rpz/ns1/root.db0000644000470500017500000000233612271526120021104 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ $TTL 120 . SOA ns. hostmaster.ns. ( 1 3600 1200 604800 60 ) NS ns. ns. A 10.53.0.1 ; rewrite responses from this zone tld2. NS ns.tld2. ns.tld2. A 10.53.0.2 ; rewrite responses from this secure zone unless dnssec requested (DO=1) tld2s. NS ns.tld2. ; requests come from here tld3. NS ns.tld3. ns.tld3. A 10.53.0.3 ; rewrite responses from this zone tld4. NS ns.tld4. ns.tld4. A 10.53.0.4 ; performance test tld5. NS ns.tld5. ns.tld5. A 10.53.0.5 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns4/0002755000470500017500000000000012276444015017622 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/ns4/named.conf0000644000470500017500000000260612271526120021550 0ustar lamontlamont/* * Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ controls { /* empty */ }; options { query-source address 10.53.0.4; notify-source 10.53.0.4; transfer-source 10.53.0.4; port 5300; pid-file "named.pid"; session-keyfile "session.key"; listen-on { 10.53.0.4; }; listen-on-v6 { none; }; notify no; }; include "../trusted.conf"; zone "." { type hint; file "hints"; }; zone "tld4." {type master; file "tld4.db";}; zone "sub1.tld4." {type master; file "tld4.db";}; zone "subsub.sub1.tld4." {type master; file "tld4.db";}; zone "sub2.tld4." {type master; file "tld4.db";}; zone "subsub.sub2.tld4." {type master; file "tld4.db";}; bind9-9.9.5.dfsg/bin/tests/system/rpz/ns4/hints0000644000470500017500000000146412271526120020666 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ . 120 NS ns. ns. 120 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns4/tld4.db0000644000470500017500000000314212271526120020767 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; RPZ rewrite responses from this zone $TTL 120 @ SOA tld4. hostmaster.ns.tld4. ( 1 3600 1200 604800 60 ) NS ns ns A 10.53.0.4 txt-only TXT "txt-only-tld4" a14 A 14.14.14.14 AAAA 2001::14 TXT "a14 text" a14-cname CNAME a14 a0-1 A 192.168.0.1 AAAA 2001:2::1 TXT "a0-1 text" a3-1 A 192.168.3.1 AAAA 2001:2:3::1 TXT "a3-1 text" a3-2 A 192.168.3.2 AAAA 2001:2:3::2 TXT "a3-2 text" a4-1 A 192.168.4.1 AAAA 2001:2:4::1 TXT "a4-1 text" a4-1-aaaa AAAA 2001:2:4::1 a4-2 A 192.168.4.2 AAAA 2001:2:4::2 TXT "a4-2 text" a4-2-cname CNAME a4-2 a4-3 A 192.168.4.3 AAAA 2001:2:4::3 TXT "a4-3 text" a4-3-cname CNAME a4-3 a4-4 A 192.168.4.4 AAAA 2001:2:4::4 TXT "a4-4 text" a3-6.tld2 A 56.56.56.56 a3-7.sub1.tld2 A 57.57.57.57 a3-8.tld2 A 58.58.58.58 a3-9.sub9.tld2 A 59.59.59.59 a3-10.tld2 A 60.60.60.60 bind9-9.9.5.dfsg/bin/tests/system/rpz/rpz.c0000644000470500017500000000240112271526120020061 0ustar lamontlamont/* * Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ #include #include #include #include #define USAGE "usage: nsip | nsdname\n" int main(int argc, char **argv) { if (argc != 2) { fputs(USAGE, stderr); return (1); } if (!strcasecmp(argv[1], "nsip")) { #ifdef ENABLE_RPZ_NSIP return (0); #else return (1); #endif } if (!strcasecmp(argv[1], "nsdname")) { #ifdef ENABLE_RPZ_NSDNAME return (0); #else return (1); #endif } fputs(USAGE, stderr); return (1); } bind9-9.9.5.dfsg/bin/tests/system/rpz/test40000644000470500017500000000266712271526120020106 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' ; NSIP tests server 10.53.0.3 5300 ; NXDOMAIN for all of tld2 based on its server IP address update add 32.2.0.53.10.rpz-nsip.bl. 300 CNAME . ; ; exempt a3-2.tld2 and anything in 192.168.0.0/24 ; also checks that IP policies are preferred over NSIP policies update add a3-2.tld2.bl 300 CNAME a3-2.tld2. update add 24.0.0.168.192.rpz-ip.bl 300 CNAME 24.0.0.168.192. ; ; prefer NSIP policy to NSDNAME policy update add ns.tld2.rpz-nsdname.bl. 300 CNAME 10.0.0.1 send bind9-9.9.5.dfsg/bin/tests/system/rpz/clean.sh0000644000470500017500000000214412271526120020524 0ustar lamontlamont# Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # Clean up after rpz tests. rm -f proto.* dsset-* random.data trusted.conf dig.out* nsupdate.tmp ns*/*tmp rm -f ns*/*.key ns*/*.private ns2/tld2s.db ns2/bl.tld2.db rm -f ns3/bl*.db ns*/*switch ns5/requests ns5/example.db ns5/bl.db ns5/*.perf rm -f */named.memstats */named.run */named.stats */session.key rm -f */*.jnl */*.core */*.pid bind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/0002755000470500017500000000000012276444015017621 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/named.conf0000644000470500017500000000562612271526120021554 0ustar lamontlamont/* * Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ /* * Main rpz test DNS server. */ options { query-source address 10.53.0.3; notify-source 10.53.0.3; transfer-source 10.53.0.3; port 5300; pid-file "named.pid"; statistics-file "named.stats"; session-keyfile "session.key"; listen-on { 10.53.0.3; }; listen-on-v6 { none; }; notify no; response-policy { zone "bl" max-policy-ttl 100; zone "bl-2"; zone "bl-given" policy given recursive-only yes; zone "bl-passthru" policy passthru; zone "bl-no-op" policy no-op; # obsolete for passthru zone "bl-disabled" policy disabled; zone "bl-nodata" policy nodata recursive-only no; zone "bl-nxdomain" policy nxdomain; zone "bl-cname" policy cname txt-only.tld2.; zone "bl-wildcname" policy cname *.tld4.; zone "bl-garden" policy cname a12.tld2.; zone "bl.tld2"; } min-ns-dots 0; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.3 port 9953 allow { any; } keys { rndc_key; }; }; // include "../trusted.conf"; zone "." { type hint; file "hints"; }; zone "bl." {type master; file "bl.db"; allow-update {any;};}; zone "bl-2." {type master; file "bl-2.db"; allow-update {any;};}; zone "bl-given." {type master; file "bl-given.db"; allow-update {any;};}; zone "bl-passthru." {type master; file "bl-passthru.db"; allow-update {any;};}; zone "bl-no-op." {type master; file "bl-no-op.db"; allow-update {any;};}; zone "bl-disabled." {type master; file "bl-disabled.db"; allow-update {any;};}; zone "bl-nodata." {type master; file "bl-nodata.db"; allow-update {any;};}; zone "bl-nxdomain." {type master; file "bl-nxdomain.db"; allow-update {any;};}; zone "bl-cname." {type master; file "bl-cname.db"; allow-update {any;};}; zone "bl-wildcname." {type master; file "bl-wildcname.db"; allow-update {any;};}; zone "bl-garden." {type master; file "bl-garden.db"; allow-update {any;};}; zone "bl.tld2." {type slave; file "bl.tld2.db"; masters {10.53.0.2;}; request-ixfr no; masterfile-format text;}; zone "crash1.tld2" {type master; file "crash1";}; zone "crash2.tld3." {type master; file "crash2";}; bind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/crash10000644000470500017500000000165012271526120020716 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; a bad zone that caused a crash related to dns_rdataset_disassociate() $TTL 120 @ SOA crash1.tld2. hostmaster.ns.tld2. ( 1 3600 1200 604800 60 ) NS tld2. bind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/crash20000644000470500017500000000204512271526120020716 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; a valid zone containing records that caused crashes $TTL 120 @ SOA crash2.tld3. hostmaster.ns.tld3. ( 1 3600 1200 604800 60 ) NS ns ns A 10.53.0.3 ; #24 in test1, crashed new ASSERT() in rbtdb.c c1 A 172.16.1.24 ; #16 in test2, crashed new ASSERT() in rbtdb.c c2 A 172.16.1.16 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/hints0000644000470500017500000000146412271526120020665 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ . 120 NS ns. ns. 120 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns3/base.db0000644000470500017500000000345712271526120021042 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; RPZ test ; This basic file is copied to several zone files before being used. ; Its contents are also changed with nsupdate $TTL 120 @ SOA blx. hostmaster.ns.blx. ( 1 3600 1200 604800 60 ) NS ns ns A 10.53.0.3 ; Poke the radix tree a little. 128.1111.2222.3333.4444.5555.6666.7777.8888.rpz-ip CNAME . 128.1111.2222.3333.4444.5555.6666.zz.rpz-ip CNAME . 128.1111.2222.3333.4444.5555.zz.8888.rpz-ip CNAME . 128.1111.2222.3333.4444.zz.8888.rpz-ip CNAME . 128.zz.3333.4444.0.0.8888.rpz-ip CNAME . 128.zz.3333.4444.0.7777.8888.rpz-ip CNAME . 128.zz.3333.4444.0.8777.8888.rpz-ip CNAME . 127.zz.3333.4444.0.8777.8888.rpz-ip CNAME . ; regression testing for some old crashes redirect A 127.0.0.1 *.redirect A 127.0.0.1 *.credirect CNAME google.com. ; names in the RPZ TLDs that some say should not be rewritten. ; This is not a bug, because any data leaked by writing 24.4.3.2.10.rpz-ip ; (or whatever) is available by publishing "foo A 10.2.3.4" and then ; resolving foo. 32.3.2.1.127.rpz-ip CNAME walled.invalid. bind9-9.9.5.dfsg/bin/tests/system/rpz/ns5/0002755000470500017500000000000012276444015017623 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/ns5/tld5.db0000644000470500017500000000265612271526120021002 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; RPZ preformance test $TTL 120 @ SOA . hostmaster.ns.example.tld5. ( 1 3600 1200 604800 60 ) NS ns NS ns1 NS ns2 NS ns3 NS ns4 NS ns5 NS ns6 NS ns7 NS ns8 NS ns9 NS ns10 NS ns11 NS ns12 NS ns13 NS ns14 NS ns15 NS ns16 NS ns17 NS ns18 NS ns19 ns A 10.53.0.5 ns1 A 10.53.0.5 ns2 A 10.53.0.5 ns3 A 10.53.0.5 ns4 A 10.53.0.5 ns5 A 10.53.0.5 ns6 A 10.53.0.5 ns7 A 10.53.0.5 ns8 A 10.53.0.5 ns9 A 10.53.0.5 ns10 A 10.53.0.5 ns11 A 10.53.0.5 ns12 A 10.53.0.5 ns13 A 10.53.0.5 ns14 A 10.53.0.5 ns15 A 10.53.0.5 ns16 A 10.53.0.5 ns17 A 10.53.0.5 ns18 A 10.53.0.5 ns19 A 10.53.0.5 $ORIGIN example.tld5. example.tld5. NS ns NS ns1 ns A 10.53.0.5 ns1 A 10.53.0.5 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns5/named.conf0000644000470500017500000000307712271526120021554 0ustar lamontlamont/* * Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ /* * Test rpz performance. */ options { query-source address 10.53.0.5; notify-source 10.53.0.5; transfer-source 10.53.0.5; port 5300; pid-file "named.pid"; statistics-file "named.stats"; session-keyfile "session.key"; listen-on { 10.53.0.5; }; listen-on-v6 { none; }; notify no; # turn rpz on or off include "rpz-switch"; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-md5; }; controls { inet 10.53.0.5 port 9953 allow { any; } keys { rndc_key; }; }; include "../trusted.conf"; zone "." {type hint; file "hints"; }; zone "tld5." {type master; file "tld5.db"; }; zone "example.tld5." {type master; file "example.db"; }; zone "bl0." {type master; file "bl.db"; }; zone "bl1." {type master; file "bl.db"; }; zone "bl2." {type master; file "bl.db"; }; bind9-9.9.5.dfsg/bin/tests/system/rpz/ns5/hints0000644000470500017500000000146312271526120020666 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ . 120 NS ns. ns. 120 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns5/named.args0000644000470500017500000000007712271526120021560 0ustar lamontlamont# run the performace test close to real life -c named.conf -g bind9-9.9.5.dfsg/bin/tests/system/rpz/test20000644000470500017500000000452112271526120020073 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' ; CNAME targets are absolute even without trailing "." ; IP tests server 10.53.0.3 5300 ; NODATA a3-1.tld2 ; 1 update add 32.1.3.168.192.rpz-ip.bl 300 CNAME *. ; ; NXDOMAIN for 192.168.4.0/24, the network of a4-1.tld2 and a4-2.tld2 ; 4 update add 24.0.4.168.192.rpz-ip.bl 300 CNAME . ; ; old passthru in NXDOMAIN CIDR block to leave a4-1.tld2 unchanged ; 3 update add 32.1.4.168.192.rpz-ip.bl 300 CNAME 32.1.4.168.192 ; ; NODATA for a4-3.tld2 ; 8 update add 32.3.4.168.192.rpz-ip.bl 300 CNAME *. ; ; NXDOMAIN for IPv6 a3-1.tld2 ; 9 update add 128.1.zz.3.2.2001.rpz-ip.bl 300 CNAME . ; ; apply the policy with the lexically smaller trigger address of 192.168.5.1 ; to an RRset of more than one A RR ; 11 update add 32.1.5.168.192.rpz-ip.bl 300 A 127.0.0.1 update add 32.2.5.168.192.rpz-ip.bl 300 A 127.0.0.2 ; ; prefer first conflicting IP zone for a5-3.tld2 ; 12 update add 32.3.5.168.192.rpz-ip.bl 300 A 127.0.0.1 send update add 32.3.5.168.192.rpz-ip.bl-2 300 A 127.0.0.2 send ; prefer QNAME to IP for a5-4.tld2 ; 13 update add 32.4.5.168.192.rpz-ip.bl 300 CNAME a12.tld2. update add a5-4.tld2.bl 300 CNAME a14.tld4. ; ; poke hole in NXDOMAIN CIDR block to leave a4-4.tld2 unchanged ; 15 update add 32.4.4.168.192.rpz-ip.bl 300 CNAME rpz-passthru. ; ; assert in rbtdb.c ; 16 update add 32.16.1.16.172.rpz-ip.bl 300 CNAME . send update add c2.crash2.tld3.bl-2 300 A 127.0.0.16 send bind9-9.9.5.dfsg/bin/tests/system/rpz/setup.sh0000644000470500017500000000666512271526120020616 0ustar lamontlamont#! /bin/sh # # Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ set -e SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh QPERF=`sh qperf.sh` sh clean.sh # set up test policy zones. bl-2 is used to check competing zones. # bl-{given,disabled,passthru,no-data,nxdomain,cname,wildcard,garden} # are used to check policy overrides in named.conf. # NO-OP is an obsolete synonym for PASSHTRU for NM in '' -2 -given -disabled -passthru -no-op -nodata -nxdomain -cname -wildcname -garden; do sed -e "/SOA/s/blx/bl$NM/g" ns3/base.db >ns3/bl$NM.db done # sign the root and a zone in ns2 ../../../tools/genrandom 400 random.data # $1=directory, $2=domain name, $3=input zone file, $4=output file signzone () { KEYNAME=`$KEYGEN -q -r random.data -b 512 -K $1 $2` cat $1/$3 $1/$KEYNAME.key > $1/tmp $SIGNER -Pp -K $1 -o $2 -f $1/$4 $1/tmp >/dev/null sed -n -e 's/\(.*\) IN DNSKEY \([0-9]\{1,\} [0-9]\{1,\} [0-9]\{1,\}\) \(.*\)/trusted-keys {"\1" \2 "\3";};/p' $1/$KEYNAME.key >>trusted.conf rm dsset-$2 $1/tmp } signzone ns2 tld2s. base-tld2s.db tld2s.db # Performance checks. cat <ns5/rpz-switch response-policy { zone "bl0"; zone "bl1"; zone "bl2"; } recursive-only no max-policy-ttl 90 # min-ns-dots 0 break-dnssec yes; EOF cat <ns5/example.db \$TTL 120 @ SOA . hostmaster.ns.example.tld5. ( 1 3600 1200 604800 60 ) NS ns NS ns1 ns A 10.53.0.5 ns1 A 10.53.0.5 EOF cat <ns5/bl.db \$TTL 120 @ SOA . hostmaster.ns.blperf. ( 1 3600 1200 604800 60 ) NS ns ns A 10.53.0.5 ; used only in failure for "recursive-only no" in #8 test5 a3-5.tld2 CNAME *. ; for "break-dnssec" in #9 & #10 test5 a3-5.tld2s CNAME *. ; for "max-policy-ttl 90" in #17 test5 a3-17.tld2 500 A 17.17.17.17 ; dummy NSDNAME policy to trigger lookups ns1.x.rpz-nsdname CNAME . EOF if test -n "$QPERF"; then # do not build the full zones if we will not use them to avoid the long # time otherwise required to shut down the server $PERL -e 'for ($val = 1; $val <= 65535; ++$val) { printf("host-%05d\tA 192.168.%d.%d\n", $val, $val/256, $val%256); }' >>ns5/example.db echo >>ns5/bl.db echo "; rewrite some names" >>ns5/bl.db $PERL -e 'for ($val = 2; $val <= 65535; $val += 69) { printf("host-%05d.example.tld5\tCNAME\t.\n", $val); }' >>ns5/bl.db echo >>ns5/bl.db echo "; rewrite with some not entirely trivial patricia trees" >>ns5/bl.db $PERL -e 'for ($val = 3; $val <= 65535; $val += 69) { printf("32.%d.%d.168.192.rpz-ip \tCNAME\t.\n", $val%256, $val/256); }' >>ns5/bl.db fi # some psuedo-random queryperf requests $PERL -e 'for ($cnt = $val = 1; $cnt <= 3000; ++$cnt) { printf("host-%05d.example.tld5 A\n", $val); $val = ($val * 9 + 32771) % 65536; }' >ns5/requests cp ns2/bl.tld2.db.in ns2/bl.tld2.db bind9-9.9.5.dfsg/bin/tests/system/rpz/Makefile.in0000644000470500017500000000233412271526120021154 0ustar lamontlamont# Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ @BIND9_MAKE_INCLUDES@ CINCLUDES = CDEFINES = CWARNINGS = DNSLIBS = ISCLIBS = . DNSDEPLIBS = ISCDEPLIBS = DEPLIBS = LIBS = @LIBS@ TARGETS = rpz@EXEEXT@ RPZOBJS = rpz.@O@ SRCS = rpz.c @BIND9_MAKE_RULES@ all: rpz@EXEEXT@ rpz@EXEEXT@: ${RPZOBJS} ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${RPZOBJS} ${LIBS} clean distclean:: rm -f ${TARGETS} bind9-9.9.5.dfsg/bin/tests/system/rpz/test4a0000644000470500017500000000240212271526120020232 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' ; walled-garden NSIP tests server 10.53.0.3 5300 ; rewrite all of tld2 based on its server IP address update add 32.2.0.53.10.rpz-nsip.bl. 300 A 41.41.41.41 update add 32.2.0.53.10.rpz-nsip.bl. 300 AAAA 2041::41 update add 32.2.0.53.10.rpz-nsip.bl. 300 TXT "NSIP walled garden" send bind9-9.9.5.dfsg/bin/tests/system/rpz/test50000644000470500017500000000344212271526120020077 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' ; the policies or replacements specified in ns3/named.conf override these server 10.53.0.3 5300 ; 1 update add a3-1.tld2.bl-given. 300 A 127.0.0.1 send ; 2 update add a3-2.tld2.bl-passthru. 300 A 127.0.0.2 send ; 3 update add a3-3.tld2.bl-no-op. 300 A 127.0.0.3 send ; 4 update add a3-4.tld2.bl-disabled. 300 A 127.0.0.4 send ; 5 - 8 update add a3-5.tld2.bl-nodata. 300 A 127.0.0.5 ; 9 - 10 update add a3-5.tld2s.bl-nodata. 300 A 127.0.0.9 send ; 11 update add a3-6.tld2.bl-nxdomain. 300 A 127.0.0.11 send ; 12 update add a3-7.tld2.bl-cname. 300 A 127.0.0.12 send ; 13 update add a3-8.tld2.bl-wildcname. 300 A 127.0.0.13 ; 14 update add *.sub9.tld2.bl-wildcname. 300 A 127.0.1.14 send ; 15 update add a3-15.tld2.bl-garden. 300 A 127.0.0.15 send ; 16 update add a3-16.tld2.bl. 300 A 127.0.0.16 send bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/0002755000470500017500000000000012276444015017620 5ustar lamontlamontbind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/tld2.db0000644000470500017500000000506412271526120020770 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; RPZ rewrite responses from this zone $TTL 120 @ SOA tld2. hostmaster.ns.tld2. ( 1 3600 1200 604800 60 ) NS ns NS . ; check for RT 24985 ns A 10.53.0.2 txt-only TXT "txt-only-tld2" a12 A 12.12.12.12 AAAA 2001::12 TXT "a12 tld2 text" a12-cname CNAME a12 a0-1 A 192.168.0.1 AAAA 2001:2::1 TXT "a0-1 tld2 text" a0-1-scname CNAME a0-1.tld2s. a3-1 A 192.168.3.1 AAAA 2001:2:3::1 TXT "a3-1 tld2 text" a3-2 A 192.168.3.2 AAAA 2001:2:3::2 TXT "a3-2 tld2 text" a3-3 A 192.168.3.3 AAAA 2001:2:3::3 TXT "a3-3 tld2 text" a3-4 A 192.168.3.4 AAAA 2001:2:3::4 TXT "a3-4 tld2 text" a3-5 A 192.168.3.5 AAAA 2001:2:3::5 TXT "a3-5 tld2 text" a3-6 A 192.168.3.6 AAAA 2001:2:3::6 TXT "a3-6 tld2 text" a3-7 A 192.168.3.7 AAAA 2001:2:3::7 TXT "a3-7 tld2 text" a3-8 A 192.168.3.8 AAAA 2001:2:3::8 TXT "a3-8 tld2 text" a3-9 A 192.168.3.9 AAAA 2001:2:3::9 TXT "a3-9 tld2 text" a4-1 A 192.168.4.1 AAAA 2001:2:4::1 TXT "a4-1 tld2 text" a4-1-aaaa AAAA 2001:2:4::1 a4-2 A 192.168.4.2 AAAA 2001:2:4::2 TXT "a4-2 tld2 text" a4-2-cname CNAME a4-2 a4-3 A 192.168.4.3 AAAA 2001:2:4::3 TXT "a4-3 tld2 text" a4-3-cname CNAME a4-3 a4-4 A 192.168.4.4 AAAA 2001:2:4::4 TXT "a4-4 tld2 text" a4-5 A 192.168.4.5 AAAA 2001:2:4::5 TXT "a4-5 tld2 text" a4-5-cname CNAME a4-5 a4-5-cname2 CNAME a4-5-cname a4-5-cname3 CNAME a4-5-cname2 a4-6 A 192.168.4.6 AAAA 2001:2:4::6 TXT "a4-6 tld2 text" a4-6-cname CNAME a4-6 a4-6-cname2 CNAME a4-6-cname a4-6-cname3 CNAME a4-6-cname2 a5-1-2 A 192.168.5.1 A 192.168.5.2 TXT "a5-1-2 tld2 text" a5-3 A 192.168.5.3 TXT "a5-3 tld2 text" a5-4 A 192.168.5.4 TXT "a5-4 tld2 text" a6-1 A 192.168.6.1 TXT "a6-1 tld2 text" a6-2 A 192.168.6.2 TXT "a6-2 tld2 text" a7-1 A 192.168.7.1 TXT "a7-1 tld2 text" bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/bl.tld2.db.in0000644000470500017500000000171112271526120021764 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; master for slave RPZ zone $TTL 3600 @ SOA rpz.tld2. hostmaster.ns.tld2. ( 1 3600 1200 604800 60 ) NS ns2 NS ns3 ns2 A 10.53.0.2 ns3 A 10.53.0.3 32.1.7.168.192.rpz-ip CNAME . bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/named.conf0000644000470500017500000000342112271526120021542 0ustar lamontlamont/* * Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Id$ */ controls { /* empty */ }; options { query-source address 10.53.0.2; notify-source 10.53.0.2; transfer-source 10.53.0.2; port 5300; pid-file "named.pid"; session-keyfile "session.key"; listen-on { 10.53.0.2; }; listen-on-v6 { none; }; notify no; }; key rndc_key { secret "1234abcd8765"; algorithm hmac-sha256; }; controls { inet 10.53.0.2 port 9953 allow { any; } keys { rndc_key; }; }; include "../trusted.conf"; zone "." { type hint; file "hints"; }; zone "tld2." {type master; file "tld2.db";}; zone "sub1.tld2." {type master; file "tld2.db";}; zone "subsub.sub1.tld2." {type master; file "tld2.db";}; zone "sub2.tld2." {type master; file "tld2.db";}; zone "subsub.sub2.tld2." {type master; file "tld2.db";}; zone "sub3.tld2." {type master; file "tld2.db";}; zone "subsub.sub3.tld2." {type master; file "tld2.db";}; zone "tld2s." {type master; file "tld2s.db";}; zone "bl.tld2." {type master; file "bl.tld2.db"; notify yes; notify-delay 1;}; bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/base-tld2s.db0000644000470500017500000000201012271526120022047 0ustar lamontlamont; Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; RPZ rewrite responses from this signed zone $TTL 120 @ SOA tld2s. hostmaster.ns.tld2. ( 1 3600 1200 604800 60 ) NS ns NS . ; check for RT 24985 ns A 10.53.0.2 a0-1 A 192.168.0.1 a0-1-scname CNAME a0-1.tld2. a3-5 A 192.168.3.5 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/blv2.tld2.db.in0000644000470500017500000000165112271526120022237 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; master for slave RPZ zone $TTL 3600 @ SOA rpz.tld2. hostmaster.ns.tld2. ( 2 3600 1200 604800 60 ) NS ns2 NS ns3 ns2 A 10.53.0.2 ns3 A 10.53.0.3 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/hints0000644000470500017500000000146412271526120020664 0ustar lamontlamont; Copyright (C) 2011, 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ . 120 NS ns. ns. 120 A 10.53.0.1 bind9-9.9.5.dfsg/bin/tests/system/rpz/ns2/blv3.tld2.db.in0000644000470500017500000000171112271526120022235 0ustar lamontlamont; Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; $Id$ ; master for slave RPZ zone $TTL 3600 @ SOA rpz.tld2. hostmaster.ns.tld2. ( 3 3600 1200 604800 60 ) NS ns2 NS ns3 ns2 A 10.53.0.2 ns3 A 10.53.0.3 32.1.7.168.192.rpz-ip CNAME . bind9-9.9.5.dfsg/bin/tests/system/rpz/qperf.sh0000644000470500017500000000172412271526120020562 0ustar lamontlamont#! /bin/sh # # Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ for QDIR in `echo "$PATH" | tr : ' '` ../../../../contrib/queryperf; do QPERF=$QDIR/queryperf if test -f $QPERF -a -x $QPERF; then echo $QPERF exit 0 fi done exit 0 bind9-9.9.5.dfsg/bin/tests/system/rpz/test10000644000470500017500000000512012271526120020066 0ustar lamontlamont; Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC") ; ; Permission to use, copy, modify, and/or distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. ; Use comment lines instead of blank lines to combine update requests into ; single requests ; Separate update requests for distinct TLDs with blank lines or 'send' ; End the file with a blank line or 'send' server 10.53.0.3 5300 ; QNAME tests ; NXDOMAIN ; 2, 20, 25 update add a0-1.tld2.bl. 300 CNAME . ; NODATA ; 3, 21 update add a3-1.tld2.bl. 300 CNAME *. ; and no assert-botch ; 4, 5, 22, 23 update add a3-2.tld2.bl. 300 DNAME example.com. ; ; NXDOMAIN for a4-2-cname.tld2 via its target a4-2.tld2. ; 6 and 7 update add a4-2.tld2.bl 300 CNAME . ; 8 ; NODATA for a4-3-cname.tld2 via its target a4-3.tld2. update add a4-3.tld2.bl 300 CNAME *. ; ; replace the A for a4-1.sub1.tld2 with 12.12.12.12 ; 9 update add a4-1.sub1.tld2.bl. 300 A 12.12.12.12 ; ; replace the A for *.sub2.tld2 with 12.12.12.12 ; 10 update add a4-1.sub2.tld2.bl. 300 A 12.12.12.12 ; ; replace NXDOMAIN for {nxc1,nxc2}.sub1.tld2 with 12.12.12.12 using CNAMEs ; 11 update add nxc1.sub1.tld2.bl. 300 CNAME a12.tld2. ; 12 update add nxc2.sub1.tld2.bl. 300 CNAME a12-cname.tld2. ; ; prefer the first conflicting zone ; 13 update add a4-4.tld2.bl. 300 A 127.4.4.1 update add a6-1.tld2.bl. 300 CNAME a6-1.tld2. update add a6-2.tld2.bl. 300 A 127.6.2.1 update add a6-1.tld2.bl. 300 A 127.6.1.1 update add a6-2.tld2.bl. 300 CNAME a6-2.tld2. send update add a4-4.tld2.bl-2. 300 A 127.4.4.2 send ; wildcard CNAME ; 16 update add a3-6.tld2.bl. 300 CNAME *.tld4. ; 17 update add *.sub1.tld2.bl. 300 CNAME *.tld4. ; CNAME chain ; 18 update add a4-5.tld2.bl. 300 A 127.0.0.16 ; stop at first hit in CNAME chain ; 19 update add a4-6.tld2.bl. 300 CNAME . update add a4-6-cname.tld2.bl. 300 A 127.0.0.17 ; ; assert in rbtdb.c ; 24 update add c1.crash2.tld3.bl. 300 CNAME . ; DO=1 without signatures, DO=0 with signatures are rewritten ; 26 - 27 update add a0-1.tld2s.bl. 300 CNAME . send bind9-9.9.5.dfsg/bin/tests/system/start.pl0000644000470500017500000001610312271526120017765 0ustar lamontlamont#!/usr/bin/perl -w # # Copyright (C) 2004-2008, 2010-2013 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # $Id$ # Framework for starting test servers. # Based on the type of server specified, check for port availability, remove # temporary files, start the server, and verify that the server is running. # If a server is specified, start it. Otherwise, start all servers for test. use strict; use Cwd; use Cwd 'abs_path'; use Getopt::Long; # Option handling # --noclean test [server [options]] # # --noclean - Do not cleanup files in server directory # test - name of the test directory # server - name of the server directory # options - alternate options for the server # NOTE: options must be specified with '-- "

    6bD*'!fAD?+ND=3Mi9"?MgJ;EgS++6'Z\kah=\ZaKE %>qL]\o+SkL%Ve?e:dI!M3@W#_fab53O5pUM8``NiE/$+F;C4PJr2qhQ^T+uD %)F0k\QuIs63*=-u1]oLXrpGZ.?6)XV`8.3Q0ta@,lMOLJ9'STKoerGa>KM6RkNg"\?iT$(qQKo&B0t)rZ>Wthh&!`8lbQtiSd$%M %`(SLI=DZ2@3(X=XlK4/sl_q8rWK5$ihAb1CW`]'63$[\Ki%.J!=Yn?a?m+<.jJgo:#(#VmmI20)jHG(K,*aj#1l_Vmp %T0Q"c!\C2$/(WD9r+n3TT(t&UEmIt$YM-%E.)VqH96&3lIdA0de,5Cb[[ %KZpTOh-d4anYMoT>4f_oi8ku&^Xiqd]XXGu=X.2/Fs!hY1b^Et\;4-p!*n-PbQj_='QWZBOQ2Amk9L.,fhZj\jV0+f/*9g`5Pi>8 %Q4gXeo;DKT/CgL$\l9B2Qn0p@TW[N(Bk$2l59q(DH;K;Gb1pL;L!*]0?7K5m;O%jY\`:cqhs6;L6[o8EkiX";I=)5j4sqZ\4DM/& %ai!1^97Rj?cn]qZ<(b`H/WEq)kUunH>=SfHa;AmW]9gT8![[.!Vqa9`G+(%Zk0#4\/2u4:sX@+B:1B"hb,mGTG98 %#0jskP!,oRW+45qf'f/YLu7"dbL.P(_?Q81pEOQha75gC_?uc_Xd^V_E5t7pL$u"G%d$d4g28k(50;7OUf=AfkDF6T?DPE'1H'!S %oIequ$='3F"pK3co\dG^J0,?QYlKD%,@2OA?U8Mo;R_e'GC*4Ebor%5EQ=.fQPT+9cm@"&[nC,#^t8Pil3iDuJ_T7N"DC:(]AEuc4PtpRPU9VejD)1/CXMp/[%sIU'M#`aB)*Db@ZYGNd+Ikp=$%)VZHWGS7qgl%7XPY2$#s_7\fCWZnWS]9g$YWOc %@]@<`<10Ner3&.O(>OK&E,ON--Q;;!mD7Qb?p!<,(T\*$.9,&j"NQKYSh*+N)t'uuGFO:>/4ugdpXc40 %k9n33Gf+scf1un"5n!(kmHD?:$=7nB`dE3o06UaB7I(G,XoO+0cinr9_&h]8QrCDXS+\V,L$9;-+Qlcj-:^\RE7[Z'C[S#g3J]\]Mo)2RToM1PI'OiM"lf!]:d %/l6`_H4l+\ZNE1:WtrC#0SduI=Td8j`YmTU_ca)1>3r1F_=m=>Mb8Rg:39@g]6Bs0S,>kQ6$3Y_hc#"*i'2.n.8X< %:2"6^bcI+"GeL)cl^cN6G+T$LU.V-FJfO[[_n`QUFPc%,.b(9)_\'=JrV34!]G@A %3A[)]r$h&(du;-LYZV1m6HppQ!IJOjF%;a/Nbs:_H;J\C1sYZscX5(oYeAJq\r/,.BAF\\0)Y=6--*ae?#_r!PT[<9aQa^+?+8Cl %dUXQqZ-PdgCF(g!$WPt_(UG"$:knCq0SC:G-aZMKf9NeV$U\mP4Jd3-?fkMqe%>o5.c/u_cP5BI_rpVj^8dFjSpGt#'m"Tq;DpL9 %/JH0A[+!q*0^ORg4MD@^%fH[Y&aRm`; %^CQK?Dp,bCSWa<4k.!0mbeWPDri]-DYM=FU_90)=?!!`uGN;eV2l2$*n+d\l_&/HI]QPtqm3Vi];MV>\)(1;ejsge-E&/?E]@8Eq %5H[b7!QL,E">KcH#1&6Z?;lDb8BpE*;FQNFc5@kC*5GrJTP>:X=*OlDh#@@*jYF0e<0PR+"k?AeirH'#7,2^lF='EnGV_'b"aOa\ %iq0&M-)[d<=WYX:))T6AY"#V`Cc^4OD^;4>C(W4X_finOG;H1Lr %1)E&a/9,=6+NflhA`U-Jkb3F%!%@:g(F9etH-WU*d+j'@?H58>G@k`X[jaHnf?XjJ[`sU.m %n*Y\>_5t%UA!OlN%%OTs?UfY&I&u_(A[p?6P!fm!"3#X:4ZKV`)hH%SD[Po`pG_laX78rI&LMu?L?mhjFj^V(H>9'^=hF0rj.q(p %5;`n9I",$4k>>^P6#Op0pV$Eo?NRedS]QAq_5)Id3_=\5WG#"/.$6<^SGDf%Ca%/Ebn%gAl.*U;J@KC`k`1Lu;20&rT1).YeULqk9:>*%b %2-J\7VZ4q<&/JNVohuTka&VZubAfnbR9pEbg6\?fP[r.=k8.Bu(c+,IP`Cc_`aL07?Ic)?ZZI4s@Wnd6.GXsW?ch%0/5BQ3B3?I)85ZZ#?`\4:j\Pg9LpjuXIa$@R>mo;!/HqE`bW!JV6DoWW3[cV:J %%bsZGq;4*c_/LpHXabii0Mh@se;_/<:0epqp!=Ng;M]\S2').mQgPGcq<]#Has"FXIVD7YNm3<*n*@%V&*[6%`b/#p--Qg<4ZjcG %7:D':,N9X--bfJ(VJ#:u"5N^q&33&bA'Y^)Ag_KLG2LL%=jXKjcR99lIFY1PT0;U$UB4\d]V:he %@AD#)QE:a!gaZ:]530sfm?k\'$u31jmY6!=([H.Y/@"dBh7u'iBoTeMh4uMEkRP_h_;(S\hdE*>MO3&&A(X/5a(LcO$`^>m&P!R>Q6581K!o<%VF>E%.*oJdir?7unYaDucu)d$i>dl`05IUhmb.T6j;u %/']#\X!J4I!->>8GcBL/Sot3sOl&7k@+M`M-.ipm\!CpDiS&ROUAFcVlS]DHpCf8"FeTBL-=j?sJc_&=AfBhFnUT"bDMNp_^oBXOh;jl(m._hUoE'8)sE^)/)-K4WHj)U6\;'-Yk,qlM2S&2-`j]DD]f9,m&\r7 %Ip;6s]?`/EDH4W%6&f:T=o5D*DQ?brPf1[jV;6qb.;]o041*M1]Qc_PEc"9^ %37@cd0BM,S7F'.(;b7<2+3YFQ/*ui,;.^_a^YNPJD5_.7XX),&Fu&YD(ruj2"\F?30[M+>FT!`JL7;f^DAR*<I^oOOHP_sk? %I`9abp@]#:3Vd`M=gtf\ED(lU!*.\"9ps\b)e2!#=iUMoC[;`3MND %3Cij1-&'-,eqPgC_<[eX?Q4+u]@!LtdGUkhjerp%KMoGYf0r#O3/;"qQ %i;X'Z#qZ6>aJ-$#.=X"Al+j0RGm(S#pHXsi\*u;CjBW5=o0^?ggh:XJ5ZoqRK1fgs<#0MkRYBN^5;$FJgen$iO&d)DS?m"M+j@Rq9/h)>Q>9VJ#k\Q, %keL@H]J%&X_F7fS=iI_9E[K.]6GNc>5ipO-/`ijN.-QHFXRYeC/@o!G0H*I9&fq0hB&V`t(rN@6T*f2UVh1N3q)&Jg1,p](<&IE7 %a]-4b41D&!E]fc-nL^\r'j#DoQl-`BWbZ$JKlmbX8+0(9V__jJYAS9uJplKVA&oLm;.%BmZ;CbYinpot>hLe'I4%On;1SK9OF#EK %J.Y$9Jm%DF??OB>c6AkAiqU[*U0E=1N,'^OZkp'aX)L4ue[EALi!'LDN@TXF %hDIk7@4@2HGH9HoN@Ht<_\)arFP-aAd(U[PtF*,0AuBc,e]jt0&7^4CoC:\VE_ %1do@/CL;cRBY?ae/KK\O%?<&ACiEa"4/CZ(\=^r58O;$=O*#WMBsY>]fbWoF>^38d8FCkY:!M;qoD1fqWXE5L0b'5^0qHj*6F9\A %K.lRA*`+5f>uE0jRVJ\g:9nGU.T:dbO:,m8Rp>'QhK[kCq_qCi\XE6+cX@_3N=47(qNT+?5_T&c.d;@"Gh_,+R<^[,\FE4:XF6F( %^8-;%TTm+H$26$ZJO)#^kKG:Vn,U2N1?].*Oc0&i`$1VuM8f(AQuYcA5DnjmNf<._#r@!ZJI89;j,]G\m80po_P-i%0uJIAp6TV= %A$d0=_Mu3M>E$l@()*``)6PnA;NPcRie]/l#L;V:q1UbfMaJf54/* %P_dLT3L&/i\iJc2l1"[9-S_#efR\310ZM.&$=Gs7-\TuC`q4rNB8!<`ZWX_o':Q=mEgq)!6Xc&WL)1Z3HNF`hZ)NOaH#j)6-YmZ/25KUN_[Rb[J6I*!ob`JAe$%#rqbjJ89W7oqP50]"HCqq9?-C!TTHQE3S7jRnF&u)/$i>^Wl%]Q9\qNIAh\9P %C1=OkB\Q4hW4#4Q)mY,c:IZ,0ASX!$l0hM0EY]uq_IfiXE?46Dn&ec:UF.;$Vic)*nn>+,'1-/9dE)9Kc;& %=Sre"!IH,=5:jCa<'_3%%?N"pV\l/0:<$$'>aVh7A1ekHI2V8WS9L,]Se4s=+Muepa6I3l<$cTkUhOPARsAI`P6:A*1@^PoZ^,$2 %MH^?G:efKHn&W^oj;)OsAEh$VbU0)h]?i*VYbAA"2s"7D+A*$T9%keMF9Mq".g>69D(eGC0M8g_X=)Fj:Sn9mMEi6$:)jlfs/\oV9$.SP3qUD1+Wu\pm(6IOQ$[>T^KShpkS!XpbZEIRU2p\D.E=1oZGm6N<7-7So9QlHc)S+r %$o[nfaL7a3ZK7!N%%ECmE6H9!U72`.].d!E1Cd4*7.T#SZ"@JSB25FZ#Y[1Ia^c!@]4Te*.e-,u!VLnP"*9[p3?ph5Y,'#I!RB_OWEMiJ$p`tQ*[jmR2p7ZCNoUh/.)Tkd %/CAW.*]l`L88$F3L0ib$'%niFmQ=Y=ju<[q@%"tMP5G(`!Z7ATB=c^AMAqZ9.82?g,/,*W>[@/ADoE4_!X*R?!?FOZm/h]in1cJ?QB[T&IEKfso>bcneU!a1&aFGb3`#8O=/C^i/1hKb'# %jXC#%U(Uc*&"ml+rkMLTPnRG_[jV3Q;ElWS,d#%K5I`+-'GmoAd)`.:8o"&OaNlsT-o`TYK'.L[%mUJX?l=/r/j'86@*sqPYXeN2 %I),he?=_BJ\F=ic``@B9#K.E7La3pF(Z>L'q?6A.T-L\2:d'K'iNMqa1GgNGk4ldPEh?%5,KjP+(aRS+HDcr7cok[FL4$7P=O*$H %Q\\OaJRrj^C".3*I&4]QEqp)J@<@\,)K?YmRU4p[hNs1jo9`X(WB#/gJ;fsbl&2a+%_%,(#Y:T8HY=V=2 %!(Cd"Z'DrR,P`@s?Ys3%Y<1].od?#V1ft^;>^`jLg?sX`Y,u0*bJ/UI9(nnZ.Po6109RR_>h2&]Zf&6S+ua&0CUFi_56][S %r?d%_HnD-NbMWr%VtV*e*Mp&tMD&c$[sDm-lg;ZIT*JC1q_[6r>gj^Wa1I,7XBQ^.-kL*D5he"h"!b`G44``XljOKT&Df3)]>UV* %dG>]WA-"`j,".,YUK"ESK2Y>9pK+#6;;CVRT8W(gbm6c %')iUH!Y6Ar_*;;SQRiJ5cg1kgX>*L3&5g']Cfg,)N=9bboB'&5T4RaF.Z5f]BfHHC"2ca9G0QR)H9ASF!#8U3,"+u`87"G25H"^2WCiSQ$XWC?ZNFKYNedRRY$XjRg\62uU?T)_c %MIjn'?o3@fQd:C4GZnNX4O-O)Ziq_d9&1BCIN\GF3E](Ip6a_8i!g)j\LVduu&MV7&"_jX]%s_+gFHf+h'4[[Rp-bTf+P %gidRAR.c;%[q!!hjVt#?,LiI>mutC8:LoM2\p5KpL><$9e^XD)j1U>%e[;dg<@(SMX"p=rG1l>3#-Z?`+3CgQIDUpcTZh]B#'9+4 %=!5CU&k1T`fOY?hq"6AZ=`?/I^M7K.X@1,bT'Sbq7gr^r<30u]NP-mQ2%@"b8'8:M'^'QPK=.>8)mHaj'IV.dkSIM$IHkB$[C4/` %m,/eSLg+#D`HWi][1'R=>$buMSEdulr;)f>;4GDe]N*ejEd#sBU'D[TJn[A1&cCZ`ac]qVko(VMr-]RXehR=[.nO(rrr2j0uM,PQnr6fdaGS&?N.Fl]3GObgnn(0gXF_U6q8#@gSB %cl^4o,s6=P#6S9C0=f6e20a8M8!Q`l6L"8W163V)a==HlUTVT:i;=3Do4K<@/eV7ralUWr8$7Cm2e_U3*F9.ng %5m#d^G,(d4I%%`noG2g-GF25-&cuG0q4p62"i7AN$51^[V/f403(l-a<-kYupjK2n]7iCNr9>Xm_g&L[9!I=7>Fa\G^6bgX;$YZQ %j-/S@2L(I65Io4Qbl_KL2FWO$fQ3O_#_<(D<*iRLaWMWQ=58.O8N9,q&hU?0m@GXIK>S0g`B'46c=eY[`EEeXT"+%0?>[eCAb(=^ %\uA]CVH]0;6X/p_MQHF*m],e%rIfi180fe)\0N@f=cPs=J'l-h5ZSIgHH-lKA^EaL:2mZ %e#$fagY0t7N;&3XbN?lHji,*HA;;9T0$>&@fjKA@`Mp6fG7[9PulcsaZ6TNW3,]oT>?g&[8(g6*f\&jVN[?n.JNR@@`"`"<)%fFkn)Na]aOPI(6#o_^HS!QLUJ)t0E7atGOO %,>V*K"W*U#r1lhO:-2"aL2XU7kl`\W,k"M^rG;rWjudBd%W$_aGmmD=aX[\\S@sOOib^%>74\WtU/1VBBJ=4q %3Ol1*E)FEb+/d=X$Abp!^H@&!gQN%Hm)Vl0Z'k$r"K?Td*oSVG8'cjA\1UtCns,pGYU#1eQ4hP"%XD(beE2TtnKGI-)-+H]gJPqP %q#G\ho(U5+[&?hkTFP/T>URMYO2>XO,V6UEAUR7)[um'o"3#c8M!p!"Y3*,A7ZoOX5``1I-:p@pm%,:W0g %]OS[TdO:Nge\9KbbL+/t#q$Ou?_!(.J#VFDB*+*S_Cgb/:/)LZV-RRrlf+P^Dl`&d"^ap9`UBeI'"rpC!ao9"X\Vo,)),t\\#6fE %W#ob1R)^:9hXdE"m3M_D?F118r23DS!E#1_DI=B#I1_J!YQn`0Mfkkc/lo&\7emTVkN.I")o$0EBOo4c@ %`CsIUNb>^KB-t,U?"N@NHlYRd34f-H?fNCdPWA>j>j/^NPDH&Zs'SZR]?.o8@@ng!ZIcHI<4)jb?%%'N;J'OS-dkf\Wo`J03XsW2[EiZqG3Br%3M!!?Vg_5]' %q943Vi=uNII@;G?Q>(@f@h/b@!:GIjR5QFQps=QSO_2UJ@=,5EEr:OFf\\U%;bgtO5t&aFt:Ba`5f %?Fq3:Q9TC`G&gJ4ZnkfWnl4\kR6km>M;I80JLfQ2GIe^: %Ii$<[mWsj#]lb<4H?bLc+94mHlV:>rH?UB'8r]/a)$D5Iq)gF;HSE%Lq?$9R"o@=Bh6bRm?V>gV%8K*A,N?OXofEom9(P-u^)!D! %2@CRt?JOkh(Fa\_5lMfJ/,#76_6;\W.OA<#F[PoW-TtS:`_es"NN).P/F,gi!`MV"pa7aKt*:#*;;A!]t %Vo<4J0t6=9#G0]XWZlL="A&kaE=WpS=2m?AbsYg7$0,GE4j%jj'sUi4"nf)]171;mlTXn<[.r*6UMIP/J\"ru'&MR'8I5Sb?hFn+6pCa\o2o3g( %$`l"K";f2L$sV>]cU-[Jb)Fs\=\Ao'#X-\oQ@!^7_$nOjGZ-c<\)baj.^^sahGtXFdlrFO$gr)QD%`7e)A\k6pDug4LCie8 %[Y36_BAp?.WYs7R8hB*%-/sJIX56ReDV=b"u(ih42)_C&+kSbG]OMc2d %WJ=/!!UCs1j@\.cMKL"4NpaNr*9nmn!?c_SGQdh&p(E$UK5p.;-G)u7GOE0La9Y7g$2 %`EFI+]FNG<-rWa?%Ef3.*G<+fKCO\8s+V!D7KW)N@tk4*cl75V?o^KlO<@>uJUlG>^IqY^cO@7Pq+j+0odO/SDMGcN75fq*i1@S, %ap^&rn`t$u?+Q&k/s(Wj1UZ[sqYQ^u6 %k/PnBgI6[^3oIHAFU3r_7^1-YL-!ZbS.Wq6I@iB&7_6@1\#3Ql8.mi?%[L/$n=gQpjeb*e1^_5Io'b@*RAfJ*a_I#U=L:<0OtMuM %8`cY9K1SP[o2XTGr/dM9@2=Jhk*AGWA/oXZ!]]@N')rl/WFT0OIuh:iY`fp,p3]&R%Z@k3Yd*AD.'5H>c."dFlK02uZg_Njg#,_(e)c:(jbgt)9@,5+E#n`1HVR_*AhK04mZDBLE8.K@[t %d$IuaGmSmnd45PK%U-.C+Gu<21#]=8FL5Lfd2G>bh;rVeN.%f#u0nmN'%*$:dACPlC+:h.U*eF[2\5jr)l%2"peW`IQ>>/A8e%*%L6oEJ)&)Vn#\B>GoVbJ#9< %J!-_B5gNo7!7XtR;!0eZ"uZjc$-V>-%*0Z(n?_q,ulqcOuT3mSRpb&kCpPCYjGn(ed7[\2%mJ(korED[Z7gi5c0Wl45"-qiZhe!oGk?C\"Zc""uZ33a^^3$Wjk2'[/PU!d+d=F(bg5.[^EU %ml_j^Hk2Na4Vi*+qtugiRWdJK)dDlqnIrl)7Bh,JF-k7;>K=8lVZYOU2d+46P-H]20f5sKGaP2/[?VQ\T<+10E`:Et-KfaoR^rV,.2[bcf85>!`5gRIH %qNt^@HL"HBX<(VT-&Wh7j;YII0$4MO-p9O71r#ha^kP2`VuL6P[:&?C0^9@mmnC2>HbOqm49*ITEnpdI"E%DDMFD1gSXhs6,,1&IE\p"FosktFs%nu_?dFPKXXKo %mK,XV&0TYs\'dPaQ:`Pb^^.Sp2ATEJXY.MZFUZK]i>SAOCHj>:>N#9X!=OfR)7Z@/'9WMIi(b>A;N`o!$']%6$19H&@H:_6bVrr$ %=d"':JTQ#kYk?r/[X>8*[uLM %+9`ldh]KIK;d3(FpQg"O:ThdN'lY&=p5_f5'dW1o('.u9YTN_T'j$8P8c)l770krq<93HZan5tN[%\Z,./sTY,?9=n6\#oR3GFpO\:_0Edrd2!(,e4f=htNQ'WG;i %^B?O5'kIUHKh9Qc-H$Lf6'5?DoUt,*CF@3@)H\ZY+F?rYI;)mrP?1"S_Ya`E93Y#*i$=QhVP0Eo%2Hc!kZ([H='-\L]m!,bS[!lS %^n-c\CW=UU!T/J]p$6+BR,PC=nrg.8+q52$sa2>RL %nVT*YpBB!i>Fb3mgbL2EfuU=<=-V.>d2@#_&T6)%ggN^L!/-^PSj7V9YV6?@E6bdK`2h'Lq.9_S7P:I4aO'o@g0+hU;*M"/JP&]Yc*AGnHF;EKeiDkcd4KJ26E\N6K8-H555?T*6 %YscU+G*0l2F\1^FHAtb>SG<)fn?bCbbFl.s^^Ghqh"J%=!>hUc,afIO[15[OZ0g`0*D@Ou_j:UeI6e;LMh,feYTLIjm`>A):?;g_ %%:@iUN?4IAa>_kkm2;QV>?BTMeh$607"o%6dg0-^RVcI7G9n3Ac%$26&g2u$JLub'128-\mj(D&1j7+H4r421.2A`!SG@6%8)%P[cbaHHn50rj0mm)19E-kPf*#g`gPi^dgB7utg^Ftf&2&I=EkYL96m9'Alk@Cb@m:!H._riB %\Xj+,WQph%q9e/j[CUee9<,)R%V*b-&A(;rR_,Q,h6--ZgTc>@,('iH[NW]-r,Z_3;9?^D#*A0L$U;DG^9n^UCg1^>[Gh:9rAauh %!LA"Mko'69"Qt>Ni3Q\?gVX;k-05o$&.8TV3)Q-!5"[Yk%R[A_+;>rH1JsJ1@B!@C[fHCbolb!?fYqWMSeYlF!PSg%dWE3$!hlb=;JU@Tlf5C`T7W9.h4HV,$Km\[MniW-pVF\\52$XQRsBE60eUt1lAk7KSO_)NZeaB'7Nnu/f%^-H;et(k%)0/kSK>4lVaYDC$FV"?gm*oJ %)I'V\2"5*n^VX3Z3pBP2^_lPD5MlUj7^O%m-O%l<,bqc&OaS:hZ=r?tBjaM41KP'2Ra5T-L,K'@P5G*CiH*\LiS$lB<0O@eqII+Y %dO1[n:iML9:PVt3>Fu\h^]1J(,kp%7I/R>hq61'DcDbB^[A@TF[H/5T`emY7KakPK/;u53G2`-$mX:Qg9,XSfk:g7m9q=f/5Gh2L %ocMZZCoo:'nD(Wi]SW;t]a6+II-\`WP)qjF\,dXqU*&&)bY".<&&-(lPK6lb7Pb`HBdmoA9O^6,U[)$Y/s0#\%7p7:.) %RfIbf;TDcbNU5n2'RoAjV#$lt41\N>:*4T^=U`?$)c@=\a7YKk?-AiDPZLULp*RnUIN!>Eb4N3=(doIanhuA)'VXl>>Je'Xhgt)+ %oXiT?l]p\"]72Ocf"_H[4eQG0l@CogIfeq5LMdFKZ$]Z&Z(F;G6%0fSUG92il9RFilRT2N^;;W2LHW^kf6,!s]EDf,:X2I)I; %6+4+?qq$;.dUZh>IBsL-aQl+Zd]Fh(kT;ML<@F;E:+B/u-WdA!_E$NJ@`%_e#fm#IpbaXses>58FZsEaj""^BLrSYBI4')/#,jdh]KZfoDCm>akW1*/b1;!lB-j%9TTNF&Cq7j:m&Cn752hr'_'2(OUgD,rDKlJ;eKZZ&<#/*B478C$Oo(QeN0 %RWMUK9kqt0J/Xe*C+`5Y-fqcMOWA58-Qbc]c<+S+]1=BG]?;3Oe9u8GKCWtZ!7mW>.!6T(m0mmV[-2HmllSJHcHg-)'%-IDqA-`d %*;'hZdG$j#!R?ns,2Z`,[K:IjZra4%-*LN7T6.-L2M__'JCh/H+FA&DF/93tC[QFogSYNL:4pS)s#r[0aT9Q$4uJA+AFMEj00fW[ %2!(a>8?J1AiBH-%*4+=/P02keOG>J*LpU/9V5AFiB7[oDJ=t*f?$$S=nUJQqDf#e=W^#"V[3)Nj$ug'36PHGOWm1UI4`FeY[`1]2-tckQ[5mmLu#K\ %?"=B:$mUhh[W;ciP(PJF*_UmBh%bX2%:&W4jDnC%a.m>nO4)IA[Z,j:TZf;dN]RY4CKBn$L>*#pbe*q.;Ks@mf`^`aDKU1MSaM#f %^uA.RUmEu8!uJ6u-7P\.a0$PG[n->)g9E&6OK$*=DCRkq+g4EiMcW`"4$kG3n23Sk")6]4j?eKo8>FPBHJC/e0U&H=R$LPs"LO8\/)iSY,YO-[->((A %UkIKc_UTi.m\CcU1/*DW9?J^8@8qVlTV$V<]gF %q(>^X1D$Ci/X/+*f*tEN:ij@jQ>=uX+?$QgKgKcI^r[#-/)6()\W5`3[??6:fDcTh/(FJ3Wh,6$9gJBEWnCKb;9VgGICb'9_OSIT %'k@/<@.oef0]KiW,+U!"0\X\tULg]G442-4JY#.SA(4c,.`&9m*ElI=m:&39,:Vf0KLf$9taR5)RAeZpq %,j%jbA?-:KAh;,#*5L>p(t^'O!.L-4.cER$.j?cqN/[,5=R-PFO0WpYcho)ue@R2t5;#ddI %+^(XN+X7$"?qfr9d:8tIpO9c+?Gc/hDr>fhK]e+N2\N!2Pd7Q?KIa+Ceril2#E'19O?Ijep[ZBl9NYVfh5]asdOh6.fWVb*!<,iG %Ysef[Raue$0H"/c!!*[o8au?3Dq]XB^--6!_#[Vp#Gj'M6gT%E&ARBb5Wq0e^p5r@W$h*.L4,6HPp*u]mO3pr,n;p]pCJE9A^kR>-=FN#e9:3 %9SSu`Mu2/en"!*ZCaYg^O,Wks"Orbk'YICn%GkO/ln;a4XEbYQ/D>GP2(6oYYSC4W>>(rP$>(''IGL/(["^0K"G$$\^/T'`)MQeK %N#YmMM-A0ZR]KOr(OY06q(8d'se!Qj@?ET@9]YS1[k]0*b$t89I("OH^7Ee=*RhJN,X*Ag*j(XF(Ce=!7CoK1E:>Ye1aVKV(0MY^L2#.=(k7k4+LN5$ %g%L;iNnS=CR1OqWA19Rg;43\0^o*B<?U2#U/)eK[T!8?nJQLhW4\$jr6V$a__>"7;NGn3f7;"XCj1)F>V %+:3R$a4tABnhc.XKbhXTj">@D5/a_hm?QE,5RJo!a7.CFl;`O:#'ThKCg.$gnn$l4hI%huXEa,jPEo"Q"#G>$Z"#(Uh6WE\W"Km` %Rr-_7:mkTXMK";Mg4NaVa^"?.k:!>J`B#+VS#e6F(u]lnfY_@JLrRN$kaAsdCe,AD29BAu!Ke]`$"02k'"@NT35sXbPb0dp\+P1# %HduFF9DJoM5Snsf6Y2i(dP@`$=;Gk9Z!=1EmYgf$7)\ch7'QY!P*?"*-]H(+aOus%CqW07Xf!AV&kmVV0,TZnB/sChU)EsrPn__a %h$D;PDaEPri5?WM0C'@+4ENIJ/NPXKeIWI'<1)AnQWdI'_l\=JT9"r>BY%cW2"O<-#K0BW`!^u2HeT']#<6/K*36nmX88]s5" %jQg<1cNB*f6E*VOB[[iWQCN^b]@r2]aTn/cG]bJ_-P?U4Z?u":-g2\,iIOqt81IBn5h'j83=m;4*pZ!1C--23nu2KaR+n?AW972M %JTr6P[&9*n;?W5!EKNpn9\jRf`#_pi$+QpIr:JNC0J&sqEH%,r#ZB[`pc0@q7Z.o'S>nCQa># %"eH'5CAEC"9?\,"=*fCDK(^eD+>HS5C*?_Q#$C8[8rG]=t5=_QcQHD\95]s,+aqm"(e^PPJ %V"'d,"%s:kFGR9Q\6;C():/ajU066g2Q$A%4B>]KQ@ZqZRObpGJ_!k`];0<`mA*\-GP'CE5e9NJ3d:BOf6gWf8ThNJ3@8sfJl0F_ %K6bfmk_BrXG_CZ]6u6s5Z)j&kieqj>E>Ech3`8%tggFQ6e@*B4\@dHhS?W0ma;m`P`%lAC7`M7H8S:Zg\FW\T_*\MGRbTsN(0$k8 %mK)2'FlKsU,Q,\;n!=hh:q@ArU));]]s^DoZ^kG[;XV7$-L&^K".!Ch&hAb7LtP?ci[O; %g0j^fHsmH^,#N<0="ZrCUS=r)q`N&a+/**3[.]9#g\F_'OojoW.A1"JJIs%^$"2,;:'537HUL=Z-$_!EggEgUXWsTig-fJ):sSkJ %J?g$$d%jimb^(j3ecD>@J[NF32-VWV8[>nfLK#rf%on/Si9R/UK*A/6Qt*@qR)_#f#EIPH^l;_=%sU=D*AAu:,p8_=D`oKcPkFmW %f?SF(pXH<,WZcElaKfr$!fW,T[=cDYaZ;2_f[8?(K&I+-i$j'E4"PCH?FU!'SUjWbQ:QVNQ;o8l6mt])(n$kH4[L4_>/9t"0P"Cj %c@RR'V-UUsb8NDp$`@EL]rte,4>s'QYXU7@YI2mm#($G*Sr:.s]YLF9!-9s$7Cctt(A>7\a`,)-mh4]!<:KK1ZN,%\mKE>6F&gA+ %`f@1?H'm>(gWn_sMpVMdrOUB:05K6)#)G*Nd96_[X.7gD@%=3%k2KLL8[.%okp3N!L=KG0L>O[FMjC#tZcUAsZR>M0OU5b[NsThQ %NSsOe@b22!R`/pBN#dIQ:'KM)R>JW-Pom.'H^8X^1\(>i!0,%B,+;r6Kn %7bBePc,@Xg:RQbec0,c/'>K"P5lmTTER4gH`sDbl3O(:5.mRS`B9J]p*^'?Sa-l2:@">Y%k=SXBn/:;ij8En8-C#?K)b^@;B1T0t %Y'STe2/p+/_8.H5LoVr3B1)tUIIt1LXi,%)a[uISK&(6l]2$rtJqP#;]07Y41k@TAO9&7p0m41@D]n>R!2UXXi*>\oW@NmXHP;?1kl$97c>&b`0&#cT&/09d-%e8<+fkN?dWi4PI\$,s\YG]1%HYOek$^:YnF]r`O7 %-K;]^3HR^^lF+S&d^N.JLg/G/i#/?!d(j)/k2$:&_d9XWCNOu9o30Q9XIptN4^W2#j3eq<6> %2)/6XCRW:TATRq%6%pH$ouBe;RdV1<-,OA__(2G[5u0?*&Q+N2X7iJkKG%F2VA"IH2[ %,R`L/n(c=8)0S=?*eR[;'W#sf+")4!aNNTen(a!4rN>7+fU9L&D:\IZjDBCL)-a7B0V1Zcoj^g-47_ICMCf7MY1"-LN:G#8[S*fb %/>$onR(q/r=9n7..-7NTMn:#p(aajeUhWPeH_Kh)gO2`,!YNng8BUns@dJahQIm(js_@l3!g;3nH5BCc^4ClIB;u&!Cf7Z@/!uh&cN:h/(i=-\$>OIcf0,`"0hcA/d_F:(J@.,@n,5X[WT8"S>MTBs %,7,OT,N>Hf2,0jOrCbmcLeCD6l-%,,:k=Y/@)^^#%1i'n`sgE9h*="c)X)'O$G^@)h@l;GjeCVi)S`o]V84@K5R)BgYQ?n&Zm*'2 %.+l>A@>b'$+j>!bDcJA;Ts",.J"Ro)3";t!N8!ArohA57Ep1]/,7t(grO1t"?j-\Sq,X+\%a=dRZ5KYE9/]-TmFht!?7';cL9PcJ %=p"h(qk(ZK<%EjY@>;e/DQsG@R/fn]KCKK<`Z+.-5-E9@3\ERk@:`"to-/eP`P1j(LU+rLTQ3dK[)$7e9c*qd %^-;D/<^]>jmLA5PQ=+(@)QB+E8VT\-mrI+LFlWi!%4ZZj^<*c[%r6(OiMFL %U=n>1-jO^ed6G+'.CVj)h:$9mmX0H=X`upB]J=f;(.&gFnBM;/dU(SGQR&T,36p?a %73pA(-]stR2M3SsO)%#rAPQuWWN0Y7LMg?Ko\"-nLcS_\YT#M>`/5ZpV(Q=21rd<*1)MT0;rqk^.55nB4,3Ko(B#hkhBKq\Kp3[Q %K$kBu'$T4e0gP1+7()n%Q9g&J@TC9ra5gt?a28#;A^u,4qf6e>O=m?/?JmVPqFgY7u-9oQkPQKR! %U>if8gBPA7sMFCkMP3l2A %)bg=mIIg;U!tL=_JAIS8RFK&HjROur/>?)7*tYmT)T;4VE@5IZi5-s#Pt*1+eXBa/!DEX`nHtn15Y&qf*E"gcEG*3K1YKK+>'0Of %7"MGrer6+8;c"s_cU%7)Gp,kdMcW/!4s0JkUFDV)(F-Eo.p0T_b?nE9j=V[TJOm]3j7YnBb_Y''\@&D(2DY_KDV#7Yp>SYgh5MMU %_m0_ %SIUEV7U`#]Jh5sI0AWF!jIogo_2$WX[ %^Q1^KhNg%Q?Ca6'#]P,W:N(ncIKM30;S)Ydb,"[HVE&#t"t/OM6*r:e5?95iLg#$/4u9Tt7> %Y=kiZI.B0YG&2DGWle;(*[iG?RiH%oQ3!C7?:EDp:Xr@JjTN:dA'2-Hn]'%g?HTJXa;d"d/==Q/oK11m.UB92,+u_^C\T!YFfGE( %j4ccA]hP`f$VPtuh';CG[OXMrBgCDBbuSE1f`+r#pf_"D(h^AmIfaf*LVkJF^2)Pc]gsCVgu>R9/MqI`ihNeCe83$l_e2DQ$dbI*e %Q#BjKiHQOrE\dC%?nYFS9?eL/P/cOhM*!rXI9&H;iKn_5Y4o\CE!%2/)-1)%IZ$]3>glsQ4?[0>GL1]f?%KCD,?''1Err< %SVOudVtP2;h&j,)B/KDDUH]7X%,U/1K>K4j@<1)D_]$UV!Lu5p7=jItEA)GDnEp>?n0X/Zj/1h`$CD^dR12,+Ok;h/DC^@5W %>0+G2_$I5\e5@$l.a1`+2QGJg*oE\r-''P7q>Bu&8='[lVlu.!G*W)g8I&rg?tqTFBBcV(BC(]CG;9N%+=7P_lCo&i`X5nD\H;2/ %gH^d9'9G^aZ@8'#Zqm$W)G<+t'>9tk8,Uct)rYu`PM03PG;?jHn9G %c-+#6+GQ2_VOHA?d.GfU0jb3l"42;"/Ha"B"LHg[hFOAJ^HYn3R5!N.SD*qDWitt"C0:(-ot)cu=Yg/$o=?HM-?YuUfotfc]Ct;' %i#Y+8j%eHNW%\?'!3/n7q^om,!M$e1f8/a=5Hn#ajH,`SoTV)XN8;B1fH7CJH'mn/2FrRg000T1V&q\cDN$L %-i4`#'notHLmIXE+Ko#8^4BOr3aOSV/=GlfVe''N7.%9c5V9V![QosYTQ=GbdsdAco1+nCFqRWU4KQ?b<\)D %_0Xi;ZWddZ/#7;Q?hXd:-A,G$HWs+;CpRt"n:S2a?dhB>EZT`OjQ=noeE0[jZ5cN6ABP9m_.$r7Q5p"KHf&JOXkOX_W;bR5E)V'? %>n65BGqChhhIU`.?LH@2en8AqSor)PQJoPVqNWO/diY,bK8.kslL"o>NdYj60$ %A,q)BJ&.(HB`l-YAU@>\3@Xb%V/:'qFaKBJYLN`RBo,LMmuP":.26<)2iqf?DoJPCp-)jr%1Deh)+]?#Qlfo#MTm1RDEZA$^:'8a %]ukK-IE%mE0eJUiRjI7F?WTr0A]SQensIe4$>'e_o_84[T*T,dilJuI_Eh^Nn&T!RRna3&@;==6'[CG(AbBaQ+qET*r?(YJG*Kou4I1(Dn[raPN'Y>[<8'&?OAbr.8>d+`/cmA0BPu %ROt%7/X,U$Yc&cR;JNK^oP.&7Hm[!73T6narDG"JM[Lu;Pc/L8<$s`+J5?Sc!NBd67%kFQM-ePtZfNVO"NrHd`ue>Mm_`664:m;L5G&]Sck?\-phbQIL[L/9t4F %$'lrPSTNa/Wq,LpNo)lZooq'[m:jNk?fn/A:KMZ_j(YG=`U>VZL2+m"2`4%r*/)s;KL1A=F[\l1)KS;3"&!tRrb`I4m+FU:>2T#r %$R,5!I3UTOY1bJ4_7U=;:m=C`Ki8M6MlR`&;VT^Z&[M)+jbi><_0J[Q0Q2dTat5=_B%>2U4fu_oW]Sld%9d9uY:Xmp7>IWKabKH(4XU1qD=]toZ"KH^Fffsa`@hQN5 %XUQ%^SYT8%M`Qj4g;OFB^ES"T!ii^KMl>mqfH]1@'CidScB]OqUE;PVq3#e(cEFCT-&-tA)7an_m/l0&'$!($lHDFMo\",g;CQmd#Q,(XZ\$_)"cVhLYXbP5#V'#1I:+MiZ:;^(M+9ROGrVDo?lak`7'7NZEf*;)e;Dj'GA.Rh9j1;h8$=\b:CZO'GLQOQ@l'Vc/KE:#eF#c13JBo-j*d>#eXC6$4=p)6bKMIsY:[>rdUq%NR\gt9dM03)_3-96>tV\m?^:^oYl$R\._:l:H3Ge_J+_[L"I1nrs,PT>dchp/%a(rW %D:9@T'ta5J+X$B%lZFKo\A">0Uf51De1@S'OVSjAWkrS'@MY;V=-k0X>]Pu$ %O-%WrrsA]1muH[.LW&QO0$0>LWQ?/+>5'BJXIJ+:d.#OU(-G%S;aOqB./mbG8(T\j6+J<2@o]?2CW%>cDfZ'D+-h:mC:uPbN^H6E01Lshga7$P1r:9 %4c05:H1LIOhU\+Go^l$V>2'*W].1%uDTT$8Fr;N)pTACN_&tGbTB3N;"RoSH4b2*C^B/N$5GjWMFSaDeIK4d0Vd-5A<`J=WH3Bkb %9?fpPEs87L;no?@<67cLUS@ci[usWWka8T&T!jF2PN`e(qq(K;lbBL(cperY,OGk#N;J+qHF9Ws"PIl$01H/T!BA@Z<>*j=kFhD= %k?0(>O.%c+mISsWX#qa1eZaYs_q),Y.nOR^CQMB;Ru@WObu!gW[25hlWPLo__%!MtHrO;UeZm]6^q:@1kc827"'LNS$4UNQG:bVO %D0+mfhF\mX(ITb\*?3f7#=o$9hT?*MO9[7W>V0U't`!T %hr/om_(P`$JZ'b^O9354;BD;[!:e30nleBm3fHU]%S@6;i_c9O3+*JLtroABu?:*=e\2JecZu&;:&<`ki\%/pUlV#DNda*sk)lYX;3AFmrA?%%+F0.]O#ZC_I/Qj^`:=cn.otF\F&WiT!D(1Kj %Q()Z2?/4[Gf.BAflFK&6!Gn8)n%Ok((h?3,I>'6%W)Bt#,CAnd!@Rq>GSZCETIi=b+F9+p1DLEGPqadS6eH33b=i7TC>1;+fqf %N45*!>38=Xc>"PgpK\)8/3b2!EDOXN@(2TCmC9UT45%)Ye[:+;pXEnIPS++:G5_E%RR:d"gG,artW`s["9NnJu.+jAt.WQ?2:kRq6+CI3K6f, %HLf[l\"$Nc67TUgBhl$N2?9*P/H[0^Z9OLa[nJK'=I0A!!A+l=Yg@55,.&mAkQ(R$#\cKKTO46U"QB9*_$?oZbGBHD %j=`.K,6`J3-]-J0'p/F?a//>7V'GGDW5kJ/SO[R$Remcf5a(5N]E2K0MQ^f#]/-6"&-q$M<:\MN26Ve7f'1j-^%7NNEMc2;/1<)-_h$WeM\n-s$<0 %a5$/m5SE)).LJG0`@_d!:4a38moAG4Ceb^l7IUrlU5!LPDA0@L#!HMh<bT@OIA14/Dk'KpKmle\q`- %4,np^2:q4BAMosILaE(?`kC+tc>QV[RQg6h:aiJ"'J/OQX&TjIOi.^H8/&MOE0Z;rrA'- %dm4p=H>2;`Sm4[%9ZIMSV&(@^#3b`:GI_Fa*!@$2YGSjJ$)At+JSKu%tDi-AZ`AKb?]KAMamU<&\^],;FhIO0Kb^aS^, %'';6FVCWtG^0si3)rDEtiHt,Glm,"Q92sU(`+!8#fMhT#5@In$nZo`mdcgBffV4<=:4kpf%4aV260)V+8-rK?:R'`Ybo3LGOL0i/ %F['__h*@/^2SIf\.+e,I@n:QbLU1ica;RU58$`Yh+euHA,p_$.%]3%.$h1U>-_j1X.OD*o>b,WOOHM-p't8908*b0abkLD0";# %rqB&ki*?>pg'"4&8BheOM?!ghX<0$t.m5:JN^tb&;7j#IgUs_&9Mbt.pX.`9KijjGRH9e[IFMk+JK)jK;V%AiAog@o.1$5n+@Ah_ %3/PCXpL00+;8h!rit8MS3Cea5IsuK\Np4[l,g0Hj%O,b^h>7'5D4?Xn;;]%l85Nh-hG$cpTO(\h[U'^lD-u2/V==q#JI.l([#'d? %5)r`>b,3d&D1-Gm?U'&uBAEJV!B%X?/6Jdh+2HH[1/$aB;39q&B!%;?;lcTDI4eES[]8Et@fdGfpSkUq1A3Na]ejh11*AW:$j[#< %QFH0f#+'I"[%Ai(&>&WC"XVqpO!V&lQRP*SFS)MqoW7HiTS:-Uk.KQOj.\urPikF+PL9o/kC^p2A.PU@;1*-?X/+3O$D#PO9>>/V %l,cs[S`Zd+2$^`n^_q)lVDE[6Tb;K#(FXs(.R2DQ0>#DsML/7^#gL_@BC,D]!@A^nrVN?,4+UiBH(tjHcH_9">N2d$E9mq,hsDQ.N3T=d/-;]tZa7a4b=fr`$PT#(!D):9(E`OIXra %Vrn7LVla:k3^5?l=X5"u8er-d=W-^D5`B/=\@-,u:FotBPdX(rGp02K^'X.&2!q`o_$BZX>G]2hh6"W2D %em.GaM]*d#Lf.\O0&g.:7lK[bW)TbSd:$]..\I-haeN%%\bbAi%SeBL8U]sLEmpGBp!@9:'i/ptMh#&*>";"6q!u"=]s$uZ]k(6Y %OX4%n>\#RhJDYPnquf'Ki)fAu^Z0`;&'I#Q1,\E0p1'o4!]?h^*QqMpgDTX@ %5nm/"4KP?-"/oJO(VD&2].5XU.1[3<2O[D2l46sWe%m^)u5^3K%!,`lZc[B&:iE/=Pr>'34^h'EY\')1XK.pDrfl1E<^MOQo"o/"?!50U73-!c>MfJaLKV-ID?Vm+'U`Zg*,`PO.bc_] %pVZT[#(I^lhUtrsXkE8N!/l#u&^S7'c(]bt=H<bQ%//\UC@o`YC,j>$ %mfLKlQk^Dd=U*aFnEurpAXB\(L;hNtEuj;C/ZL/lQM5A8ARWF'2T!K]0MGaYFus6WmGPrUVI`"KE6ls/)1Q6PbE8S0cG4E/Jmkc# %?JY%\dtl&QJH#f^o4W_s%pI]hok_$+pZlEFHd#^Bk_gfWqrNj=*BFW9Z4AA'YAH3VA8XB*pp_4d*/ %"lJY;hY'7[VtR'EpV>W?BcAdO5CthtZ9J[=LjIT-\?At6BFYudNRtiiMe_`ofYEZ4P.&VL*n%WgE*o7n]5'?=.tMRIKAHLX[iVk? %V.5:m*8HG,I(<*X4psKN%*'B+p0Q[bmGO(uC/$%7'+V+(u7^/Ji$\`\&D<].Xp04q]NlZQV(29'a%f1S]lf(u5=/;BI, %^0h2?qi7k]t8tC:tp!MaM?"oi'^]$`rYB9Kr0oKYMA]VBG %d@u20i0_R3S9t/+p98JN,e'dK=?Uf$t\lD[!r?3t!IcUeG>SqUVH4b8A0[Q.X&DS["0]aS2!'QG0Q-XQ&@kMY(^SZRE: %Q$GLd>Q%eQ7!id7Vi!'ek`Q_$*\8d#i(8I]Gkngg6f:^%-GDQ/&q_)YqQ!%CpmbL2"uYuelAcCu61*sL$N %/)qq)M@<\UYFok.[_d3a>9t$BkJu@9=&Odtp29CtC:%ktDB/>R#2XtR%G?bV^h)u8*lre2O$ZM5?obm&"h4=\5RrKo=b%KEDqc%p %a-$dKE#us'OT.*b-Ykk]B_4/hpBRqhmS/49ZhmfpA%^%H:a5&0W%J%!lJ?[HP3'1dH\-^%raS3Vh,N5a2Z,r=A.N4[0ns6[X'lhI %\OC:ES0eOPGm8YC=%',)OgXr_8GVlX*Y4%U3O.nnb,WTWjGF[&3&ZJVnMlKP`\5CFn!Npq(+k:.]_AHWn+XAr=QdAg8psq^/)G"# %b':KsVj7#U;mtn8m-sQ#kIk6UcCWK'5l]g$*6.IX&/G$;YRLiaIi*)5E5+i;i9Q.g1D4Iuj/picWY>9n#f(iVm5mdsbHM$D#Ig2M %lZd-^4*^Z+a0i1_hqfnK+WTminT4K_1&N5'FH"Z``6Z&`+ff+S*ldePa!870p755u`5=e4i-=4YOb'as%FNYV2YmIK^S]J!?5YXbd:q&>4o[P&hj7\.X_@"qTrpc:Ak`*SWS0!tIG,;X&+*KYU/bI?#.d4@ %*ZK@WC)D(m552j*]Go2]dXI=uJl/KIf"gAQVhR2$7"W3ce?"X"A':C1)Gt)K1e73610PAF^n\fCO`1-W@bDAQltJa+6,>(-4c3)K %-T1VRkp&hZl38Zf9F"LT`Te0Fmpa,L]UiXe^ittbm*.#QhVE>aOG<:T)FKo[Nh]/PfN\">/I!WA4%iR:0ZBO/MgpVpD.R;9YGEtJ %fu!9c9NN,S)n9/m7Y\Ek`e^PMg=9t'_ji;?q#F917RFEp;=b&hC]7`H"O'Cn0CuX3U(boh-KiP3i>-'Y)T@.^.aZBD1bbe=ND>qI %=rks714@pbn22.UQ6aXmYo'CX2]n%2P#jgON(*CG4PFQ[ %FQ6u'6/XVinMhSL;\]q`W(H[5^hID&jY.l`r!-K]9&<(R=H"!f3c>JWCQd"`>\Q-TCB\r9]U>&>o[*.>+!/\I[AD4BA;kD+^%&CrB8$EC`pq-;MfChqJ>6Q_YDmd!o^'Ig-)bgF^7I2l]9u42,I,1e\g-R/6Y?t#X_r8?&.RMNmP)FnC*?[SJX5` %j,>2>NQX,(VZ^/s5!uPiCh0549JUh`S&U+&KuYJ3mj8"[L2APdJ21W^4S_!8"/)RF %,H1@nlEtir&]5?)1$XB>?5,J3MM-N&H9Chm)p@4L6d)mNl`3/j2iQA6!r,YmiN"ON6KuK(Q%VjT9W3(N(aefYh1jm#7e(%/pFuO" %LIX-EmWTmbo3tu!JGnLF\<^*ucYl:].Z"g=ho\Ln&@2ZO*2J/_[@e>k>BMEIR+!9siO/4L#Yp,!dI+]!@ie%Ik)ksW4G)$:hDL=% %M_A7F!t#W)hTSA'hDO/9&8%QWV\+lNqlSBCp=-ltD&?3SO2ced,>3]hOPI!%NS\D..//!E1:`I$#'fNP3R]Oi40Rg`i)i&KPU6ll %_7<*G62gZ=IP$pUT4-SG^'MTj7;t.?#p(`eSDu)r%W/a(FEI0tG^^=d+('\;c]3G.I^XDJC'p@:\8'I!`G]+8!DUP-s/c%p::OqDbD/Y,*l:fXEYJ0WueGbiGMd%I@[(PG#MBN-YP;&&S6lX?CE? %UU9%SYHE9'iks$uSke"L<:]IGWi4lMJ,aR7j?.Va*D!u*=VM$764Rq[CP.cpESkZ_<[pog'UC:H'h0ANUUKi;D&Bt:bC>n:'tr4O %+Sn4Xm*c%bUAG2#&qrNeHoE+KT#Ne]HtiWubl)-4j2eYq_"dW^n_.Mg?ROWM?pJ_4PA51rE$.fO;6cr>T!!3D.bY%5p?@;`h9^6K %VbSB0HHg4Jgu@7pj(5\bf_+o@.X,tin@Bj9l-LE0&('*WD)?Ppo)9./!1LN,94P3.:0[798K`1H\F>c;YN,VKZl\S9GfoWtnVEsA %k]f4NLRsRJGDiXB)rVYuNCEenH=+D=dG&>F,b+rIj7*P>q_U=jM9N,,%c$*c4m6GH %;/XD%TDgs-_nd:J:Nb#%i_%Q8^>;?)_/YReV65S<5E/93Hi*<9\FuSN`Im$GAFZg_CZAtJXi@$F2/o"P*dKOkq;YnS3B87&Z\)s) %=4Y_63SQ]q.dn4ZhpD/&XIdY+(`EWf-skmb0:C_`aJ"VCGd*Q1UGAD^Veb@U+86;gqmBl)2gZGFNSt^6ebEf=<;V%T\Vh0u %\>"$%D$3[lmJ`c'eSk1.n+Zr=NN'kiLPPC4H5[#394HLmr/^R67*WdDnWmSfkLeN3Sr_H2=*Uu*F0Jb4^&:dgjm"B#)>?T %GL>rrLCRar5a$#r@Y&-FY#mr"LX'l^GAb(2T8/Y-i3.q&OheG*.mC>]`Om0*.`#dTF#+;)ot*"%VV/]9R]=2rcce9Mab^V;>o+3U]GIPr([L %Rtq!rc05/IBiM;)!D5IBd12pQX?PF6>I!8)o'Y,HM`rUkhi(1j?ishLam7u!2^>pZ1TM&bBqlJe^\?ZZaLpjT+84Y*!%AsH %ZO\uO"F6&,#HH'4J.u=6m^,jO2]rU]I="(6Tdo'"gSlX7i1kk08DnJ#M98qUnaNZuB0QQZ&-)VgoYd0ZE;JT;OW7ml%Pl)(/["_% %gNhjV,;CMF@HWKdH$\Y)k><)Q,j.*dj@'ZqM<)->u=6s4u*gr4GRHKCTrU/9`fVUg,.[Za1(b4TYjLJkDQ2Xj7T(1Vt,Q5FtV %W()teR=kd/8u(k910^d1F[!@MM1*->:aa,`2.KXJ8ZnR9(>,o5^FjR?XiuiMjm/]sl1"Eli>&X?[gomPoRZ,1[EB;S7BNH0Y'*UUH+O#m%*o7]lHj#mnD/8kM]$%ur\*@SQ %bhfgarkj-P;`@n8j-;4H(bVR$h5"3D)B3T`Q]Q"VrkcsXm;d'm!!fAS;F#-^-Im=afG(*+0WMGj`]&j#h3EuQK&Aqaa?::G9iJr1e:))HUsbOIikem>[HQ7[HCr4Kb3bWm@@!?GLhXeK8Y$oI1XR[Z%"!Mb %?"VWI&`^95.Bcq3XIbq7A%so:XKg(l!CnlC.b9[s`XWlf=2]JYXRX@h_A(,Zobh?t]M?#tVN*E))J?Fj/LJg!.Tn]j.`q@MJ?9R-uuG)>OcFalC[b %nIC9YhiF0NVr.2]`(IrP_X'p`'X'5X*1";8X`,R*@)n:=04(@m[/71,`=)GR0gj9p0ODuNC(*K%i*e+,Nt@of2gao-m1K-1O2jC& %Qqj!XR=1P1j09CM/p^0Ln"6+r^j]=JNMOE=EYLBEZr:$r;in>KZJ?+^J@hW7kT)8(me;^#I@+Vh5S)+Ckd6J,$S&5f@ %r+I3:qR$[([eMRu@/Tl[^XnhB(8qC`CEfM^r`7i,UMdIi@4Tfo4$Pd?D]/ %2209c@W]#p4JCMY1NjbL@p,Og%<,`9c>pYSSZVa+GX!@k[5_WE^,mJ#ajYIpe+e$,Q/hAkJ+t\rh-^03Dh%L?s75i,s75J_rSqhr %nF=9-9`OV>?N9U5^VBb4-0co"=fVq8"bT5( %LW^L`QWnI6YX+%\]#2&F1r1NIH04XL)7O1?gl9d]\TqEHdqE3WKUKOT`&/]g[`PRi0Mg:6F-,g`XE8;G:[HkOPX4m9r*^[34C9[s %14Jb\YV-LQCOaDTYuVP?WAGO\^IVS.+!&IW]?(6\9%qf^WS6bsW:Qu%CdAABY`J%!5W?s,,&$N)))j!FWUnJ/P$8U=5Yde@?k1:5 %fsJpTj$;t28N\qO+q4\ofRstOe]EK%'A)J/q7QBQ=!^n`/(m<*EX/iiB_TXMgeQ42`*lr45m,,sHuNBZ)DV]'+&MAo>qe5GIsdD_ %'/-9U4-T\QTm6/U*Yt'fn\]*D#WJKMQZ:OOpl[8i>.i9=$*=L?XA""l"jZdPKKlHU5+defDD]aR_D'?J'l_ulqVYg6P:kDY`\D4N %b=!#WTN$p]0>%f%"f@!)#^+'%gB="-3%5k=8nX!#-FfMTfZ]ZK-P^Gt.R(p#VA43Z9lO3b>;ioi@@RVGFNo;''4\4d1nf:d],F"V %@]UNgKdD %+/kA^.c"Qb`B[Oe/!WM/>9Ik %Cn&%q@&1l]N=+^RHB5BK;`=_o_N)Q48LH1++d`L902#pk4U.3WNA4BPq]E_sr+\pHNK@OGBo>HQ@hMSC-!]f[4O;21>%Y3Mc"ph^ %N+TD]KObbFj?iP)b,`Rgd>%-5gYI,61h432[]WPd\^;KfMo&-G+D$(Ze9F_dA7+kD5p/nU?DA+eG<6@%dkdaR5p45RS2Vk&J %NQ@eHWo0Eg51+WAut*A%,6`)E8S@Lf-J<%:jUIaYjcIqDm59d>cShYaU*"p %42F$oBn@%gV[W63ifE6.,O+V$^\UBrr6(W,Vu1nun7B'-bImfj)?A@,4,O%l[0<.D#h[''eUj.a"u!=pXGM.c'4,E)4QnN4GnVj] %)uce]K@`c#-JfQ"GZL2.YhoELV..DZD2SW>N+h3:2rjLf+'ts`]W^/]ogKNIe3!Z>IL)Ef?f/l+!sSG>qpUkefM2afp>_RPQV)Bc_A4U4JZ22_XfCT!WUl7!"K)_/9q*K64G$,Q0)H(+j)H_EGq:SUtOa=Fr#OkX5OiM`1H7ccUJ1-Z&,#0Kp2R_Lp>ZD#=D"?I6cCZ+ebZfmT7RD$8YHlVXgCK(5LI` %N+dU8BiaM:eRmXl'PV+lU$1V)Q/OJsgQu/">-UOOaoNlYBULW,T$oJH=3QUS97Ih]:9/bZ.j3hGXFV@t=ca@EZKh@lZb"rFU$["s %]tjcO@M]gLkMq>@rnpkaQ0f*,>m]OP%UJYd$Jq^t>5,K9aU$9'.^3>Ae/=;`,XKPdUGKabqfjSgo2fhtX:s(JSEc`MT+IH-L5KZ"$4^lrE+g5"?RAor=ib7rP4fTA"]) %f4,IeHn=LQOXVd.D7O&qY2[<_L9B0j*U@A_D[pa'E?ZE;2l6H$jN>*MJ]E3$'(sT_HfAfS'=`m\^@MHQ!e3hK/;h%cs %rJt81MZ&`o,hK,r:<0@7Bi/eLjT*uN[c9GuJA3;J]q13F\P[,cZ&-+0p9LGKA]or-)!(34O?4je/%KrhKM3MI-q\UM`6updj`%#D %Y(OLohPlt5ZG+1C/I"-'Z?!iE2'*h(5suA>W^j_'1\"G.Jkc0"$5R9RMgJ;02Xn#(`lhO):N\\M`&gs]?Io!uWXZfl?<.\a=``Z' %5)D/eZC8lsF\eTDUf\9`/#p6\Hf_5%$_)BDe`CB@Q\Sa!d004o;HX3,2,Y;dh(^]4YJdQ$N>_m6Oi,onB]3-:$8+4Q6&^FBR$W5- %29rJHd=f2FX,k_S^XD\Kd>R-L(%#EC01u/T-jK=de.-(a[C/)4t]YG4-p.pkJR( %B%r^caI'pEC_%0=(l[&3qY92IXKiEa"Q`O?4Ya8Ad\qt#oR]:Q@sHjKGVeo&0Ld^ucS1Eg+-#+b;98%g\<9S)&'#,TiuAuC\Jn$g %rFf[(8P!P*`a9J@[B&8$E,CXdYAZA:;3W0rXQ0*7o@"5.+lQ]1^aCk3/1Wc+>WFBsm&>?K'\p@rnj^H7L/u:`ipP2:q4Uj,V&Q2E %1:kJ?#fLOP`8=!mDoS3I[YCN5,(p#o2+_W&P30_cC'!29.W@gSB1V18Fe;A:/p"o#:!.huUS?O5'-8hNd%#!VZqM)dqh:tbF]693 %P,XHn$fGMU=]kNhYXj(L'A#a&-jY&8Y9P2*eI8Ilr^`^BK!fD7O3oM9D_bt303l2*`o>*LMaaT+#@&/VJ<6HhoZCr$8ta0A`jBFO %PJ6sVl\5T\!6&4H3o8LY#*q2N:506gfa@J0%pBE]tu[B$XIM.5NP1QGsI?$j@6 %NX@DbQIRU#1m&_`ju%KeH/@oLLGT>-_DP/"UBc>A/iArKGG4UjRV6C:&-grYH_I91(&)!I=2IlF`dI,lnfVf.6',Fu7U9X8$oXLT %0hMq?)7>!C1i_o]r1Qfs:#hkEb*Xnj2j'P$ZbEWME5O)2AH:j9INH[3< %Ku5rY.(.u8sA+jHF/Qj`ugHVKCM6N!O)^[a]rjSH`4NQs;!f[os.d0,!+^dDWMd?u)\a%sG5>djc*Th$/^ %R7qM:9@h.O2N<"+#U5?0);H6ro`R>S_\JeJ9`Ok]1BlJS)6We1/D(EmB@qFbnA=?>(]R4?\'!D&F %8$":6kSDWrn9LSce3me!1h+!,<)dfbHI^b#jpYj/M\4!H"casiGu,BY7eBIro3F7l=A?\'N&)>D527%#$f73g_l4E?/MQ8%*)/:k %Fs;,n5c\m$ndDiCXU/DDR#k0)G/=b^e7+"teBY4i,-k.b5O%;,fkEiSU9*4TS5;o=5m<_"JC-@-._9/%@&sN?r\Wgc`>PT@M@t@X %X[;?Y^n;Ond>.T0CV70'^G#k%MX=#?*3QA)=lP9!jCO6V;)mKTA&3-I&VN1qJ:kB'uVUK(eWecsI`YOk:0_>V6BrEb/LfQC6 %o;BU6EMX_(@hbi*co(kY0jY7/2C%K5?aa!U$ena$!+H;ECVs`s=a/WZ'HZirXqbVn64+(QcFQErAjt[[=A\:_lhJ;TQuh^6LOf2- %]nuLbq:TC6OPYE#&qWrb18[++klabkY)Hp8BjCTiXJ$t(4,59.+,d1"jQ$hb_VU=lLE!RG]OIDO_(0MH'pW0*CJZ8Hft4BK\=%WT %Za4>JpEJ9"]1#cRKJ&6n9`?.a-(m^:HlW`L-U_;>k8-?nH8jNaXYjJ#n73][<22ZOpcmX,85Ka\*R(Y\N$?/K7%a."5@>2.jtU7i %f6'A]:0:sa]en\")27l+E_n/D>/1Z#ea[*>EeO;?enbcfRAdh7O-/V>bAsSeR"/6b"'-MRkmX-9iWA;!.hqLl^?qesH:/qf[-%7as-P-[d1LFEi!B<`g+S21b7WDg]_+< %Eu!.X\qq8F;?pu2g\G>6h;-T(B'`X&qk;:9kZhTd=$9b7apH4C) %$e[@P`qe,NHNbQ/#f.L]3cnnAB,[YK&c+=n]\GZKhC/?a[d?s7k@m-r??"$A]kc.(X"\tFj?Bb_TGe?hV)SkZDXH_DrUH,I;q3WZ %?9Se#bUngL$0-\RpBnQ*V49@uf$rrPlsXfg>OWf)5TlO\i.`#qIEslI9RojU%uMCF5FU)oKo=L4$h=,fHG2FY2F3s*N7?$4_Y!E:oo1,?V^aJV]qf',^6.*'052Z\1%fiijaZJ(4aR+Ps0Wl1/e+.nsNnWd(.IZ&#Lj9)i&$DHLR?/I2#>IK7?\ %2[cIM&S21DFXXUs2@X1,M/D?Y$^R.=5CCmeh)8O?O.M?A'j$kZc.f#bm3SQ#ldnJB.)E0JV:_8=$24G)$U$u?fL!_9 %\D"$CJ6QR_Qt-iPY>q.VqeSIus+f[tA^oM(pPkWPo\;ju70^rnd#/T/\EZ8p.t\]?>!lsm8l:7>Yf%D(5NijsJdc[SjmJW?O29I. %6jRu_Bp=d;5nJkp895,ia6WL+N4a`Z$It6[;KNA>^/,e2.U)OG$#$ti5.,&BSPj=E4p;$]k7BPO8,QmV&ui!kIkT/NqiQXr`E,!!j4oH"?i;0u@ap4HfqFbL?/]I6I$ %BE1Nh>FoN\KJQ"B+c&Nfk71k=Nl6sIEL%S%"-CCGr+O\T+,^qma+6dRsNgA<#*1Eo7f>9mp>`moLrG4ajNU>Ha'%lEQ*3?#Qls7mPN<_C33:mbnSu+188NH[6Be)Q,ZTX-BQVfa^CdPG7#I!!_^FXp> %%:=r(\^+_AA7(('WkiCEE\9c7/r6,no%&b:1J=E!2jteQ2ds),lNcJZ$1>2NmT3'&IWlj+8fS"6I!oQsCbt0p.K@,&RTU('d1rGhO25LIkZ;0!r:$2+:$eLugVG$V>0_;5R %7pV\Q?98:$JG8jdEoG]X-Efe&m5-7]<.3-[1*3+SRB/D7'\'"H?_(I)hJ8EOe%@E]@%8gEjqjpDON+b1R'@sW"eVI[o-ojA/k0Y- %F8/7#`g;(0isapD4K7q;.6a#mRFh>@Bj*\#R8Op-/bkEHjW.-V>X*1<85ed_NWV;VIGMA^&Mj/0)YHu$TK5j;*& %(;D"LS@o^:X'X;'r:"MbRdbL<:]DY@[o_t2pF[eN!$J:Z`X:d9-*Oq)J00Q=/qUI$K%S!0f*q-6U#IiFdhep^mGg2`$cRPp.91+F %)!aHB@Ak6'Yre,2GC-XKPY`32DH1bOfd,$42n`dDah%lL %&;+CU1HLJNoiR02^tBjVBL)i^5q*>bIfYc<:\m3QGDaB71&[:B*Z@rRE;[KN0O-*QB^/l7>\riNbaJs)kfdWP %;XMW>C&)3-@^#\sDtPl#H9rIDKk:2!iRA>pY4cgjd46T5d&b]kM9PH#lU#`&hj_gboeim)2Am %O2H33\aK0+<#ZRP>QmThk1L#/C@$`PQMc7XDg,Iu;8onU]@N+4DH-&1(c=q&-GZK[J0Z(F8;slLKFFh&,l4(?!o3s-._pu[V2#RX$bF1&ru"<:e6FG)j-;g4W+3STP]9=Kn'Gl4"r*$5dS`<"?T)`Fq,_B%/gTj%/*OSGoPdYW!C#`Ga!)HL"U5A[()ZJ&aZ_Z;`"P4ti-:Z@%FiTX.$G&2LHmbEb\-L,@[:%[G>WfTeeQ`[FlO9F %@WBD.9%;[_%'(!Ag=]?iNfi`LfB%1,\V\`G+I'),2/5f#e_d8E`VT(uhYm]euc[RHql.B%&VsBjBdGms+'V7Of*5QL(OogIU %AN?qFB+RW2N3):W0=c>uCC+9,$+l9hGbc2@G;:gG=FeL`M^Fag&`h\V.29dqS1q\RR)S?4'Y)YlB?!49@Td-q9b.'BOJBlnN(ol- %0O@,;MU_6(&2fnQq2KMt9"c*F.J5Bhh66k4-E?$Q+cK:c$K[ %iDWCJfb,")+Y_;sQN+=6?u>sb2/A^\f1DdY+o-^&o$IRR/#'KM@19Q:Rh5he+.HB+,V$EI6?91`hIs8ghtmP+11 %k&C]ro_Ia,&T>$j5n]$+>PqeY('O/tenE\m/NaD!)WkBlKC+lFT;![TU"1PWWE/?H61?Ju4hkt!NkAV]`SHrXj4]cB>)EHGqNJgR7=`0lL8Tu&$+ %Dp%nWA#\2_D+f;qnOOpfOht7=:0-1E7h`!qkTYhfYY#646SJ %I5,:I?LtKg[5@E'`sm0K.(cSJi[[MHO\1+B:OI+hFSn(c,57*%&7pq&$`[DG/.'DitBb6iRW"+IiVrbd7$3[oYdjbZTl6 %`mX.E+Br)8=O+#=26o.q#-P,-1@W>?-Y[B.7.fsP,DZRb_RiSSo(MPr18<2Xdc3^U`"93j?_4'-$RL>7Y)hK9i).u6&jpPZI(\92 %>3K[KI+a@OLX3K\2ufRS$qPi_:_BI"_o6'"tJ'&U"aY6Qn,Tc$t8`[Uto5&;oSG:)DWEkCe %4AV,tDp^hr&9]H2a(8b@%jf:nT(2H %cZ+Df-]QDirduYSR>r^UT7afT*F,X0Wd)*9,XhTrbM(?&NK":@09ef6?p.*1Iu>D[$eYUlP2+B"rjHU:7:CL$"sr>6e*quGnL@rR %20N`k^C\JQ0)igO25emC^\lhnrU/^(bMOAmqu/6cs1A=!=9%o:J,&_erq]._qd9BoTE""SYl*2/5CWLS5Q=c%rT>9Na1o4b %q[`_s_s]hNO+6hll_"4>qX;2t+Bc9K4D9uc)aimZ?Oj=@*$X5tANc2[1IYPe1T %-OV?QEA%onKU@/ZMoN4:\#5m%gPmRERYY$dh!?_h@rJR.mUms]DI;/tPP%.@s'&e,>qA/,)r;gbdh4g+G-sZ7lt;`\%kl1hbP;_r %jfs'CB0I9^'4r^ik-JtjC8pgn*N#Hn=q2#QDe>'dTS'(]/$eDA+"fdS;j0P)4[6YujMsJ^Hg]uCk>M167$p71C-]HRH;DGC5fM3V %rquCUb^iiZj`t=K4[)Zc\,b>+VsV\'rA7WoOaJ#$T:^QlVS]B*oDH&-?N4ZM<<&HFb5L1Gr;D,T)SN9(Ij#3nrtfHn'pp=8PYVci %hdC?5Z"p"A4(luPh6pmI*%%YZ,E/1s+&6f`2U0`UF07U.2ra&i%fd]jueH/1ouM<7oS&WV9pL(htLZD`OJU\:?]+cahE[8js4i*)WlCr5@$ %iRlU_;![n&kG6l@NQQK4.]EbGDHcn#pA_XG\/8F,.eu@A6O]`obX^?I*>!NAPag[+KR:&G_[E-b5!]q+6+^JC"64(f0V1E5o?gdE %6eV&/\Va3QbC4gDV3,mSQ7Edd=jf2@gnkf53>CtIG1J@0jCXBcMdRQCXjieicm)C=dV(.^Uff/+E*R`acXKdK=0%Rn4cJ,, %F"SamMcrkc*dZB=QV,!/1b-]u;OsS>;4L!`BS5JVRICo]o'G]([5p(.VjYN,32&\-83*$G]qLZYn39pnfZ,YHTU0;;KC4I._t09A %26kX9@lEVr_t2%X)f(1cHk0%Dac!hJo'VodaD!M-B9#s[f.LX+[p,ngna+)+m[ep)[5L^EBMmM`Z@MaV[M;Eq_#hKG_Q3gU.2n;m %V#1c6],Qfrj>9XCZ>,Q.I7;6FIF=AFbLH^p"u:n)/?Ls3:_KcF@RLW5B?tOZZ:C+dN\mZUcUO\'@a5+6+^0cC]obukn8os.F\kQ3 %\gnmupR^F(>#@-@i(0i1\J`R/\5KXcD*oC=(72$d-r%;::8lHAMCL&/6?n*S&S;o;/Jm?4eVOmbjnVlb$%G/H8th1/D#P>d').t4c\TJk.JG%C7V%=2*P %bAEoZjN+3H)!qcSJ1]rl.Yknc=N$U;j03hJech%?1>KPKt+)u0rHOn3hb^irWnk>#j.U]M^uV;XagQUOL,Jgi3W-*cH8 %I"9uc86g-"<9'9l_%8Pt?1t9*lrjpS"\NRYkqB7/-K'Tk,^s1p]!W2T!S$<Yod03]e,h6[.5`k9WZecDPBfM958/%*7h#a8Qd+9XqN2F&D(?k*/D"-YsW+KlmSdWA/3rW:sK %`JC9t5o)KMWK46$7`q/F/%s<):.P$KY/j37K)O&V,pVOgjN.I6g*/Iu8!1lF.;d8F;i813Ej#r5&:eX*UQS %q'[khEc]b[S,2["QQ4c*^<%.BQa]=HoRK$eMMUm%m/nd=)5R)f,_Kg:E15LPH%KgghOJ1BRI`"g]_QV)_Xq"j".j.e.k^jkhIt4, %4;[[Dp!D"uA8UUiBc:f^,j;B;fa);7r4-34)GuSqAQLA*-9XOiMWs6_A"465MLq%jJ6AnTmX$5o@^N?Jk2B@m?oMnBd6VHl;n018qfKp;:VIc?he*gJ%RN+1rWjOZ%.oQ(Sg%TAt(d5rh]6+6[s7MDCGeVZ[Dp %BTJoUr*j_MPEsDW85k*fq;QQ7Y<'6Fb*Zl[9`#F_P\YFp*nVcONAV_V.,`8R%`8EQ*D1bE;9)r4%2QaGf=0f;R%S](Rj8si^5lad %"leQS>_RdkDA:AnKBk:O!Gh(SGT`$]qKQOfFWGP%7KW[mScTmQe^^ %B5HBW.ZO]_5k+=bf]:G3A+&c"gAEmG8co\P6BYj'U:Lb_\3,G$0rn+rpV_=6N$GI(DjAb %jEF"H(khjJfT:,UIsuL\rqnk;6e9%s7>TTOmt_PnPP;\`7*]]Lq/IV,["!P#aBJAA=HPK2?-sj5id9ZRf"h#JN3%a%MA\R!io`^h %ls5'Agur0KrLCq@#K:o*Ni\*+MB:G%rN>o--i2/L+PFs9Sf!W5iHq:if"uXMOWNAsc\Wp0V=P_4,a'ao,FV"acZdB52Yc]9[r9DH-Y9:dU.F!F@R#Q+VVQU.k8-^+7K>9mfa4aaN?E)f+HFr;"_eH\h-J %2e`pY,#1f?pl:_?A?%dZ^Ycp-ZbbNilMJ-U\+S^,n8Gc)ZOq/+7B]N[qr,/+9"+[=8>S36?!&D^p?t6sDb2;MGZA^#It#=n]B.A" %=g8K%5A\@ljuWWgs*mRHpc#tdjY),VnZRE5Rid-*A&Ki3p(7Q/J&,q9%DQDM:`hnHe[&cB\]5"?Fr>9 %>d0;X&TP1X`E%_YJjR`RY6aTih%:)%MHs@<0:TE*Bj=.=_Q5d)M$7c>=sgWfcp6B$m8Skd['YF99gh %5RZ/CjtH<<6jOQ8\",Iq[8IQe)R\*cbd?h-3`P\?`Q'!_]cB9r`3ncqh8`Tak>:;#R$4XE2&a1sn#L3r[eL3"9Z8)45,/CNdQ"ni %FuJ8W7!)i3aep(j2"3=@Q$W(\-#:$'.4LT5s&^qPX)"TM20/F&MrZf2$iY!PM?`%ie:F0'PA/JpThF)e"5lnF?4]IVk/Gl[":agm %L<6O'Wcg/AEau#RM54k]REahjCX1[&'9Ik5]TVs7+]BR.V)ks>RZp7]>!*p-W.!3mR_us0F*+]tk7E$=(*$oFS!751=ZHAMYnBB.lr$$LkEN'R$''QC( %KoOOGeKSfFZ9^W-&Ig/EQY'3NP8DQ>?'%"rH0U*j-DeL*oSgL>p2;h#6or\jWt[(jSP+]!*TEu:B]Bt_<>LoHFTeP5f;k3rSNMZu %lq"?\^6t2n\P/1';m(\C4DV&j&Pe/A*Ed0C=mG!tZ\XB%BT*Ig-/^[0_`+GIX0CC;HIo8RFZ,oY+mF8!oIS?&,R6^\;Dlq77XpUlmZ_F=72NIg$3H(!lNk]<5"dOK]eLnMPt" %TWX!'_=I03+5?A:Vtk<*pK$?B,@bT>-Vc6<%QC2h'.7Rb-6BTh/Hoq)Kt@oGf:A\jW$tdFcI9BJjlOI\jTCo_V@83jD>pSlB>JS" %3?MJfK+o+Uca0:%;T07s0:OuYcX5Vt5?Wa*Ut!TmqImL'puN6*>`2&;.n_CKCKi@H->E>,etEgHAVmq!2HW`^Fd)L*5#<@:74aYD %gTdo5C9r?mOelWHe;o9:[!B3i&q7N=%T[A=)nFtq"2BLAR\F8.30PcAU?6'EBRT+@]-`k)*"ZPE7=1MsU6[QjA\W4.STQ#@E^#[9G8M2K*#+9RF\7YUJgoGXB_!(l,s,cp'.nTP)6r35)J_sA"``%nP#4D^sIKeC)[BE"/ %cd6bcAQT1q#MFHd&"BUK0.55"B'N3K@a?9_P#+H4I,OW$\Sdpm+i0sWPX)2aX@'nOF;I-7Chuc %50O$Ilt!_6`/HN3fU+$Z@R9>:"bdF$Oqrk2Ra'<,*6Gi`F1eCW"'`8ElF5b3S![=8-P9l(ZGK[DM;i %Gk9IMg([EN>^hkOhis*K=3fm?4hC&1/g>j[;ItI@"WtLJ]TjO"#A_(2X&Gob&q,P%aMl(O5d>Mj@PuEH/Es6L[8AR8/(P_Sr[8d@ %nO-=-5aZ7o>F!RNeceBLrirSANXbqB*hG/2*AQ!%It!4W1chJQV%TM]'?UeM&UlYD&LRVo7dqO2c=^)MagD'2f,4Y">d;nt,o"/V %=;J!Pd:MO5N]i>0U"cVt*a)!,27T63`5&46c'8MB)8\C$o[&Mo$0GND!:e]^FJ)dDQ4@0SX$:^!U?%!?!mmOg0*O>:tuC@54B`EhC)B5Tdn.(+%m %`tK#h'5h0PaRCV,=!!'@Q`8`TKe69di/.(>q50Og\U"$@R%miR:fcp>`/4NUog&NC,@'?O(!G'^'7"\Hfp@ZD/$pA81UT^MG-FU5 %>k'VXAKn-1&c6*<8_1%R"Q!Ufm&)M3E`7ld'\eQ(WYR4\gIbD5mP!V4`N$p^J5hu&1E`H;E4ff:OmT)!?$bR$B %92N3,9$G-ql$@\_1UJTUX6e_(*Ji)5W;=4V-84PD^@>Hujl4*,2BX[#e,4<#hN/bTI'3\CS&P-1Xi?tI#oTW:,pE[4u&*3XNU$bYbR"88,uU9UOF"&"N_/RhtTG^;nh %':i.&jG06rUeQ8KT&@5eCTVi7(t1Sn!&&8X9gGXOLN5`5#1b9'b()WN@L)-KU1kSf,MarSC]bsKiI\`r()r/S^U#[YY@4Wc46si. %ea_`^qI7]lE^\=<\5qh##/()=*2Q:gk*5?<7K]djEN_:AjZmt)qbUr>aS&de\J6\FCeXk'&'1#&UAPR`m!N9$Fn %(GM?*]si0#@1uEXJ4jmZNm/1A6Q#m#9opkG`2GT`FB%<9AQsieHd::[)ZHn'[_7Re3GU_D-C8m?/;pc4f'F@#ouK"M`/OS(Rp6W_;:\#VVd^94 %;O%f9@\b>^cT"(qQ=J_jd+?me1!7p?-\V/1_W7=qT?D&aH$,!kH/S09$;)VtgZjH\s$>$_H.MPXX(!a[V.9,>"a]8_g$jFS>eP6s?FXh&`!Zh=[4D%M628_(F!iIAH)`cmOLU(A4ShK;9;]P?(GZ?;O5<2n0r8O?Df!SL!=+`q.#'EALJodE7J98@#r.+shW/oVIen_OC!SM\!p@H`X%.UbTmMNG6;+i!M7$H]sOMr]baW7!:V=\+"YafW!D1SoY68Q=i5*7;_WrIT**R:J)@icT'AYIIX!ZM]AkLTUt9@<)kY2AY-%2M,3bDDGN/pcRe(C?YrW?@hRd2mAiB.TEqANAqiWdpE@4+Rc_--L,[lC0/4o>r>M\#i>Z/< %gcN6$TPPQ:"kG)f?q"(tFA_'"3L]cN`UHm9X$XI6esNnZgm0J-.BTBdm4&H*PS(WsTIH)Rc:Gk+=Q3L"0Rkp=i$UXkJUW$ %X;?$(MSGYcE)qTtP;+GcHtUs6`Bi+XFsm>3@,C4JOJFW!04`bWh#Fp7AlEK%mUE2q$F!h4opN`9Js:)Vr.6&s-G(l`ch/NO:g`)KPRIk]XVkB6eTITtTfCCT]iI:NS-dT;\seDEXVCLeV_maT0RoTeon+sESeGs1MV7-D/[J65 %gHU7#A8b>-$q!b.&QWadmDFm)qMK;blK24(9g*2!VIUtqI_rK]X&9EP/kJ)ZC>fFoVIF,D3YBj?>!IkWY$moqKfpY^97[HKi&H*T %VN"#*e4?0cAEEI7JLn\$OZ]]1S=/=Z8c,Bn_H]`b0DO8B_:8kUE>Q.CY0> %^e\J',g!=>=0/N=B`i,n>g5j^Iq\mc0=tFZi!Z\f]Z,t8-j_(eXJ3t>f`/m*Zge5<:)EK8XAYPmc.b#6JgS%nXh'Ic=01$XKleVP %8u8g.0'j3kZX+ASft)$CIfeUK3L2^#1b/_*$[Bg\;$.5mIj06M[6*^m/KBh)_Krnk<02O&_p6u$;U+&',;e#gdN;)_Bc*NQY^r7* %F0em$INq36M5R/o2IQekK\aX+h1H'7]_VcB,()ZmCk@I=TPkOah@MuOQ]pjnA`=#h5'`&o>0G2GZ/3[Ko!m5h`*5'+;BqrNq9.$# %7WMQBSB6/YCA]EJ,0R8He_AQK(gZL(%"OW#=?&a!L)Fm%`-8>2U6+"([$h?TG*8K%!#RPeSLF3SUo%DF1QT0Q4r^aFZW[A`26I?0 %%d[@Vl9n^KeasDoF)tb-+F/WNRGj@?/='CQm/(\loaRtM*"*(<8pg>lB#t6dZp9u.;%U:e$2Xg*EB[J^[)IuPD>:c$^N$YMaX7,Q %n@/i)Clf(uKZ;7Bm]!(D&>)3*Es7dT<\Qi-.Po%@nm"(E^oh`\L94a_)j8(;g>D>5!M[aPTH*$;eU6=p9KA!g?hS9\/PfMtnJd`"X?8-63)L=e:- %qmJ!kAqAL;$8813XU/@Y>Zn-@+_@.M8M*(`q8Fhs(I>/"TUP\o5us4W?@i3-p=FfnnLsq1GB*idph,(((r0MYprd%Cdrj7ApOE'! %G-_.Ss7+oD5U(Ahp$^GGs&>eVlJJ^@+WW4FLcuAcsd;;0_-1)'imq>_)4#aljS2b4K/4hPW3d)q4X_Ak(L^H>[gMlJu;RWt_uR %%!f`+$tio\+lNfcS%=FV1jhV(L.*R<3W@Q18C?+qWeg4Oq$"@#Y$mjUOgM.])odDWA=1!0`3]Zq4*0Ub3elu*Fa3j"?qY:_gLN/[ %e;-_!C2?j+#ShD8f=#A$NM@7C%(c^4m3#N94dpF:L\e3E#'L>WKn2YBC9S^Q,-]PS`o=WCV9(4.$FBQM$[Fln&*SmVl[QE7$;SLk %nJ02+.OT&5WGTb6oPDYn:J_8hH7_q\.X%5_=>eN^$Hu;OhK< %PdWi/X;[5Khec!"iIIu!2Z8LSAW[MSl(ko7%+Zf&hi`^@8Ot_$Q(B@O7TR$(XFI$[=14*qnB7upfJ'Y_/#6NA-Tr?VgPgqPW#HZ3 %RMBTPDf%(b$RLkL'cq=CY5)\_V$a]L;_,SED_I*K.@0,mi5GX!D.Xa>ibsiNAfkeI%U2EdWZfq9*o&Bl]3K3gnH]Ff3W0k^+OT=S %#[Lh`P$msam\spr1:71j'P#Gq#lqR*I)34#GN>H4B_7Ji1=mt#R,Mnk73U7EYuRo'\rf\+(bb,#>slEQ/*Y.8Qkn4!a/9l@5Vj!h)kS='P*sMAfk,6hX?c^WXO@h-`W%Lr@0)[9 %?7>be7TN8'[5PG?[Dl_.%XS@]9'u^jD^1t[F5,,)/Ea(V<1&P.4R,Fq*>Ejo'XT9a[e9#UT[jZ %70d[d+hX7[D6ekf3-R]WD_phH7A#+RlR"nu>rQD'j"u\%.h*(h,?[8e.2.c&SrP'aY)*m^d8;WE$q3,A[gt=!F#CFX7C3*c#8q9) %14UMu*,1Y\Wj+0QK0C/9'YA(g2uno.BD9[&01Kh*)sSWa-L2&%Rb7op6o^!;joDC8h9\]4I2YUOhi."Zmmf %"p.Op/TiXK*MCl[EH`@,io=l9Bl %_n77S+"`4Gnm2mH.!6Uo1ltfQ4[o=.Eru?kp]QTR2"DY\W+%$qN'e,u7+f<`Sp-+e_oShaC2O`b>khdYY\6J0>KrrRoL2mZ>5F,3 %r+n=AlmNP[QH*j^.-Ss_:h+WXS)/c+@TW;(G7b3^[?&Da1&+k1Fmq3HP?:)k71Sr9fjc0`R[?+2[^IoUOqB6Q[TOip[Xn2I@6m/0 %EOCJ.)L2N@A]4g1\Maft;T9e=fnf',W0%g"e6JQTaMM]0DIKfFe>Uu$n,V8nmD$hr'dJ&:kbsrjVR]EIRn0fJ*7\r0T&bZL]IQ/1=q:a$0;,Oc3m=nKAhmqK7jQu92;e`% %\sXED5*F[l.[]*%Ni94nE@aoP"Cs"E!dOD'm@),i7]b$)D_lm%K=dabN,0_&+(Xjt*'0HjNmjPte5T=)eY?N>Y3(`J'`hnUe+E`n %SGUKS*G1PGK"Zg(Omg:1>m#BW@VS:Pkrd^&Vn/P$9F]I%i9JCNjJf=BQ0G6D0#h0-iu:`LBiZQ*j+NSRO\93S`OX#a_gC'.jXV7b %a_)jdK>X&[5c'#i_cY^(GSk:jB=cb+H/Pc?cQb:,FJBqU]-U0c%g[\VET9M;@%NHJAD(YC@a#90%;+_,>?I#VS!1\*%;^eh)i@Wk3;.5Q-"m)u:Dt7(4c=#pRIPSQV#+qLJ?Ph[i+Lf^m$"p3 %&O&VZOfMqCC:t.k=lPLZQS(r.5hs`B)E7+m#Q+fF8uX2"ent. %/3%jPfk:_%:*0#8rQ9(XgVh6he;Y3]hLth?$+*3)oX^@(.nM:,lU3/%mrr6lM5OsaRoJ`/C;f@:;*WYjcqY8M#]<#Wj7% %;aAc>i`FaYl>$CpoNl*RUM?lQpb6NMT-n6RBZ2daZ:jSBd3r:0>Y)5"Z\?D`fk9f\,`9nKFTd]r_H;W7HC5U-)ml%=5@Qadj %/?\WbDH5W>Z!X2i!"Q,kAI1b=N,SBj$]UHWUIJC/#^ch-hYSX?b+M!I&Q4T(i"RDA=#$`lB7n))I4mNGqk@F5ZrUb)!s*)tqL6Cq %LPVW*"-&f+6h;]LROl`.2nK;N$crespe-^,S-62a(h-ScS.=d%^fO)V-ks3g8WYTEOanJ[G!V#:-JLs>2]lET2LQ_e %L8Jc-N,,JHne8/X#d/ep#hR68'P/a@((q4H[kVPl=^+fIFFejU[55Um!/g+%!X"`I-BCfs(`!8%@02!J)#\Up(1sQ9]iA+fd_F;q %WRTVe+qJ#oKiLq14Mq)d)/[tD8^a3?i-*9M+O_)!,`U$RCR)B@ake$:NCRsV[tF]2d&p)Z83UVUidfbchCINiCF?F#$B;>% %+qQ"[a9FdorhirFRT>gT8.]fNAHW>j2FJUlSbCq0EN(I["3CbCA.'>S2:\IoAAprb7UWfBV@\q:iZZlR*5WAc@";b+:gTa"N@Sf' %MsWi]i$K3ae):ra10\Q70ltdgNXCeY&9EWg@9N)6!Nm#'cAm_1%`!'$-u7s4>btjNqIksaRG=rCLc&/$_J7AM,_DOJf(p4I3,][P %kW/kIiAAIV5c#^+=BFtV?0A):Co"8u3Y\.GT592o43QUQ(h).UbIqk %T81U.OiAMhh`_5Y0[ZYJ2T9SoC4b"Q8AeWlIbW+Pb#H>B%GMY.n'f#pae"bm]#o17\h2&H)2_I>6o@GR8XY1oD0LM4=VVT>+'OAi %S/@*GW-Rhto>$/"%dtltNF@Jcj^Buq:Y`AASY351"qL=F_W`#M"[^;NR0 %7q7^jCT3_A$52ilj/(QOHa3o;$)*n\=f,N[oiaBs;/CeuFR^P$*!2.'B6b2]BJu/O1D9=&ksWGF"e@uOOl;b)aQHA:?9n.[%9>fT"hEXA"F/1D %*.%^Yal*2VB+"=m@GJLSGam/aUM;-WWOUB^/FQQ*3mrjQi"G>$Rg7K:TdT#&b!J]3-i*"R+68[Q+CXpu-5jZ.0KNtp1]"U3q2:^+CFXl*iaZsa,6bsBmFu#&X%j?N-t"q*ZD)gj*U,(gJ9p8 %S#C0C89QTuQDk_>_\%5M@s&_CKIGr'N(P;M!W[3lKB@DNUCPqC:?P[Y9cVJO1]E2i/Ell:q<`2MfAJM9`@-Dc7[t.%X*15ACmi'p*"%B=MKTiIlc!4+GO=*n_9=i%)cV(jp&ef;(?DSRUa3sm %O/75A(0iqjErZ6XMlcbofM@@[B!e9l0H5"5bXh:9BHO,kJLZ3ADGC*f %UWYSG9FBu\p*lZ)h(qP5kCsQK>E;+rp(BHj,q(l<:Sf#""i`qo7'6d9W-'6u)Zh$L`^Tqt$H&;Ea)a-+=Z^$GuM.HV2?69P=X@pU+d@/e\WJlO1A+C@Y*8KXTZ[EZ3/l3!@J@=58tjUX@Iq"QW"*8juPY! %D[#V^6?3QJ.$L_e9?tu:N8Zh.dkh:YCT(5Y#&`MF/ge:H9+P1X;B4c!4QUT^9$Y09e9"c%Ak)F^6F!9!Or@ar&>H#V)kcb6c98VY %9u^i=W@W1mb_]4O!4uG/[%n\r=!PCuV8HNcf.X.@ir0PI,g3/HEEP.o4`O#kUVo*$YYZ6_;rgg/'-fTOf`qNf:!:A\Q;UF>L[aF[ %2/1IsR"M7*Y/;Hn^m\t3GdCPEo@siL-WfhE3;O9EKRej9P5rruHtcTFh9psCVQ<[QHpu1mB>#5J_qN97c=LN,iH#l67G4>llooIb %`B?,G9oZ1o/iRe%9qNG$SZuO5?2=X&*df&l.$EYBcbqsIm7iekZSTV*)#ludi$TLB^eLGMT[33^*p`.KaJkGj/7j>LZ&"P:"U3;5\=F"]4Bs!4%Q!hsHIgVRlq1a%g1"Q\6$>]dA9nSX?4:pO%gg.n/8]V5a %6#5!dU++XPC.p7sj#T/lR8KUfCeKkI,YjZ+a9_$@Z;UE>:I$=jF)=-E1-Zp(2#N"Z:pQ(!Kfj*l4SG?REh^B1f/G,;N>GQi!)J\+Z8U: %)F+XiqEp7Y%E>+I_qmG5i+$'4iDA]X&ulF)>EW#544Mm)N7tCK>_Vc_qCA(%:9OS)<^;p:%9ift;ek&/+>TOMW,6;)KrN7`S5h2m %gX$H9)Ku7FeE[p)uZogu_ %Q^8NKY(.A=[3\@5mT9qcE%sZApK1;>aQ1t'a94FZK8_op %**[7h=>Q.,,FBq-:6&cYB9W,D1P3ja77d3*-pOlS8fbi]no$5BqdC4;0cg;qTqEM?&',P3:<\MHWCG?X\5^8P;]L.onCqDT&&j-J %)8a2WPh\>eb46mp%M7R(1]Sdn?DGPp>t<+0@hT^oY9?dmq(:;KHrf&rX9X^i8;50uf#:b@pS\1Ch"3!:N6kJK2NN]:`i;b%:"mgre2hfEUei9Ul\\3K>;_&ZfT6^u:PJE[kpn7LM@h*lO>-J76AM%`\"$`=#/*1=9+GKCU5U?K>(APJ_9%[+)SiNLM$[RNIefZ&5E-;Pk$!=BS=1A*l\tCIS/^]N>\fi#Eo/Ff'd6o**<& %@15]!;pHH0PJT('fdV5Y+WErui;W"1///CH7pDLcRYc\\5`n;l=fJ,sq0uRd %"r1gWPd:p?ZO=i'5:NX3rh1%*Ep#Qd>?K:/cc$B-Oj/u1sl$+&5*8>`o7Q\uP'1#qA+03sn=ml3P1<\RhfLmlMcM)MP* %]*$_b/o7K:47.-g.FmM#C8F_/$oj42pt:>`#V#)4l7bOZ(1tqFVA$;4-42Ggl%';[S*$13-[1M#EWE"WD7[ %aWcs_H>\V/,%ogV5mihpl-BgENQjH&AgG\lNadVd8uj5:`YPQ*ZW,:d=DUC4E_PA$H$M?f+oMjbOTCM1JT'">UrOBE"A%2rTi*^f %+9ULP#Er22)R4-(f08u?,1H"9=Ogj<#)A_XFlYJ,QOE#[$_YL3L2clOYFA#BW!MNga;V3NB\4dcc&>*Q>-e1(*JY>7%Ma``Ck$_. %Lms3p$0g*q2\*-qW#D!1l`qo-:aPTk3";\[nIKRN$8[6__c/$&1=a?lk;t] %h)iFiD1I4,.l3e5>c,Ef'BL$eatX@>!PQa4.Dsa>Xh7c9&).99V2;pX!H^=rbgN?"gKd&pST0(=euK\a9&5a8ZGiQ+F&2dX[a4O_ %55WKu?io[m7!3*#6>K*W,,;nDW])0`gm#B3q(2qGETsl%Tb.J;;X(ZaAYbZ1?o?'Cgn^:f21X4DmSe1CFRW(i2^c.XfrD4+7Do\? %OO/!f,b@%75SV9NW5`?ZGGr^Jp="FUXhj7;5(]7mZjA+u#-)#82s]99>)*bfW)Lg,26o%`B;;0a7H[Ng*>NE[olDhk@$A=),4]9! %HAuk($JLfmP4PV6,@O>N0mY_+"W[K/"SgT.Zq\Yn@JbiQ!9iP.NJsdV=Qe@8%Ul-\-/+J&8WnM2/\oqpk4#@I^qtoOFLYKW6cNZ' %G"`tF8>q/u)$pEc@>M)qZ62MK3C@X^G>60+X;S %2Qi2\>D`p[\0]7Im3*/g:i6DQW%(sPdk]`o*_,+TknKN(:U=/-->DrNg+J/7V\MmOYJQ,ArOo4MZh3E;I@Utg_l\#TjD)'ui3d&+KFA`#:D`K&&m&npd*q7[Vbru7N+>a#mZL&)*/HUcB/PJ_ %#YOVD@1B1hHl4?$Ws=JDit?HUof"%d>`>mrc6AW)1-]A`*YPH$,%BuU-8M:E3(`'S!0b`>EE$ckj#e`[E'^72T#u4#_DEF+VTs4U %EFk/]d+\#ace9`:B[c4M;q!DQ-ml)'>tTr(ANsKt\2ZM#,AdrP,V.(!^nu*"G+up.SKu4"C))3c#"=`kAmM4=ED'7DMJ4?6+I4;) %eV7H!fWM4;m_mTgA[_HX3N\+%)@+ruA_Rr)"-)oN8ZokKW0g+Pbu%RFot@[,J7_1hIm\gW %'J!.KPMLCA6Ar,]4.dY@!t#?bPBF59`%7(/^56V@b&hgLFB1t2Q]&0bPW++k+Ho5d['B]Hi69Y8)=qD>VJ1YE`3flqRB]SN.$s>r %$s@;f%ejYe5-PejWl24WitVK8-`re/-?5No5cU/9j=ECreZ\<:]UuRpl2&s2V(>gHcaG+S!Ud;%,_-OiF %'1>uhXhjm5J=tSpj"k[ZHnI'?YC91O1W[W]_T@)Y,85Dcj0fm[K,$'sZd$2nrH"%0ark@-X)1c"FW:i7VmUIjkZn+Df4Id^ZBp>u %!FR`i$QM/Y'L^3k%E/W>!s!$sE,&rS'J3b$DkYBl[&Wm%Rl-V3'5JEac4a]Ub+_l>b6d1Tkp';;I6Wk02sQ++-kE,fW/8m*h9Q47 %m/SLrD0S!k]Ga"WeJ$m5!XpoTYrIuU=`Hr1XT0JFf*"sadfj-jH*mn=Z;M312k\JVPopZ:OBN8LR[)Y9j%m0#[0?$NEWTnFTEt4B %?*Q0.IZ#pBJQZtr[[[5=?E3,"fjq[YM^#:`=98!*)O\L-RP0se'!%J9gMF:$^[hAlmskH\WBIsb]GQ=9b!GcfH:KT.]:_b:RU'*9 %$#Y01f4sf89QufugAl>>Ej]me2@2"[@$jR&!^a$<\`G:kCITVrg[&X>%2>ErR9k:k^9TWJcVT0K?o %Y]an:B'bg$V>FrLI__igAjdBA6Y=FnU7&L^.*nZLELTL+LNa6.<0>tP,oSB7Ls[TK7;nOF,*K7,>uF5YnBZn5.H%s'@pd:RHN&aM))up)B*XiPH,5; %GCTb.i[4ul9$gl[XQ_Qf5bl]=A-:UW,Wst01SUY.4BSYV;.7u-_j?aC2h5D*,/Lo-!14ZDJQt@P3,39fUmRiUV):@j\i#\LaY'XM %TZKe7cH;?I$+%MXNKV?n7P%H98)gQMj<8-^T,K6L*/>a&lXk$8WP2q$pO3nRfQo@*MXmmZ;%IPQ94SQ0PsW\GL_[bm`@Q$e\h99u %hQ[)N7i.)&g/hC_uTKRW5kjfH-WX:_s8lPA0I5q %G6NdpXAGk^^+XBM1)/-,cHJS@mnge15+iPJ52);5`C@hY=;D@Bc4o\U[0n_dMclRo_g*.^(Ad!^qoERb1XB=\nV#tlj8'@W)[@#p %")JT+>b&b7n)gtk6m$N@%f0+[hHZ=8^G7FurVHhp=W>6afb2DjBUKb>A$fX>cj&AibFg&_=NnMcnrmCl`Qu %%u!(Cg?cWG1),\3Y!Y$e6GZ9Q8;LLUOYB4+D4MXI:o\)X5Z4OiQ43hNEcW7A9O-]WrZ.s>.qDA?V3KX2G;)#Z8S)&7K?g^"KqQH% %r[WorNF"ana-YmRUJIB>_S=6:ffDDjF/5p:Kk=O`/Mjh$OZoZ(MK,Q2F,;:]0qpBM@,_:-EEcURiY;4oGb*Mq:S=8] %5+nk&X?\jQe3Jk+(^:+(+E$rZ/-R%3bJfS"+6bD"*[Q5!#UYnL.nj5:Xb,"`>ED?UhhZic9o2eKq_$>`$%uCsb2DdL0'7a5@U6pP %AlQq'i;k$I(nJX)N1G/>W4[@X?f*G"oiM/"b>8("MEPSfHbTL*5CFBI8c$T/e7Ot7Zf6]YDE\6i(?ji.8kRf!L\%ZXcBR-(gH"E@c<,+(p8XY#R-S(e)727$U@gS7ghtR3Lik7[FFRXFtO!_8f)<[:me %>`k.l,\/fLYB$V^EPM!g2$8=6Am%IC?6e)i;B_4(%#SC8/rH$9mT#*m'1\C[.S$NaX0J'hW@9-2U]sAdHa%&1kLS>hGsjAVH*XQ; %-&/3NjQ]`YPg_KF;N=m4&.8(CgDa#V6qc-DA2[Pr%AYU2]?FVO"Yo8D6CP!uD2]h+)2*O9/qdhifH[WiZt?J!Q_@H<.5%SDBr^VG %E*>4qUf*5ER"fFY-n[;+2AbV0,#d'1"kcPnVPULDQ5G&1l4[=4#t=H?E/AH#QFUKq<&Jubp/n1iVe-Y:'r.U@r]eW?mB.bYFX6Y` %pDrZD!TPo'Y0-52i?-L!%EiG&L'B!S(`3>;L`X`IP6*>D^pj&u=:m(LFC,K9!Bh8+U7,lLWEm+c.s#:'=:mNrkF_i@B[$5`/-$du %DFf_I'!.T_X4Ms>at8Yg7)P]h[S`RF\B$Anq`C>kG%,\D8WMf7l,u??cC,f7-2Jm^mHBfS73/Ra>GZSf7S%mT]K6r^YCB1gIb;P! %0'gZ(%/jfn.ud3[(gjpVok=3q/Ymn_OL+eJIPss:+pZHK/H^i>`sN#G5J@Id#g_CMD"sA-b#n.("-!/!]Q\AH+t!8u6k>3f]jL+Tsf9#1![.oRHp6^,&VHs)!f#^XuE%?97FXfF?^`L&\?oT4@5>HA\/MZ6Eko3HiLog=)m %3"R((Fn;lZc`)(ff`k0leLUF+bt8cI4jnh\QHdHQff&Cia+cn;\FcLFW6#\aZE0`;:,.-Y/fR@5>;:I=242UP((3["BE[dfCcnq" %#=#P'_JEt(?*8(H3[JMP?L&au5\"HMk+>5J>2#;eIR??/VqJsONp)DpdWX5]h_[G"dgq1nQ/gHVcjq8JhO\<\bs1YEcG\fFJfmr4C@OC2X)jb97#F7CKUOug3A)3C4P3\qL#r:eaf+Jo=hni#g$tA %=6XDZQb^2mof+Pq4"d&p>[-G\EQ@M:Zbf<:QWtd)3a^S>HGqB)9eX8LIWoNmoPC9GbudVdhep?h)VYVU(9(6WJO/O%WnW3._VVWF %e0K#4">QK\g)K]8[>S54Nc1AKN8q:,OpUuh>qYF.+b"K'l`!Bq`HrEAmY@ad)83#fSUrc8>.1na1W`C. %44Q%\@6=?na(CJd]hU1Z/?Fi%J(5:h %alAqsYCBVcT_U;\[.M/a8BhA5SO#jFp/mgA1^\U8\f'B&=eT'-eO6Ir[$nn:M\hjb;aF->L,am4n" %+IK9.E'\Gc)^KGWs6_i)2DOl>OZp6l5+bgr'[.$mo<&qtYKMl?/PiT\pTU2GmLET4&h%gFc!DV`]n)bJ$1 %L/SYZYLjPr;ZbUF^4[a"LMQalf+G;$X5"JkKeib8DnPg>4\H&bD2iI/X43T$8fnHKLMOYnc=dV([Rc,0[&I&N%D?+7F2e-@*N"si %C;8ZH6`u79i4a[;6XEfL`Eb4AB86+WjGI8X7atqr,H'j#L0SmKq=.5g(lko,]>gAdr7'>9n-i_ukP0 %k[fJj]66Ufn"PI'JoctLN>uD`H=lV+/%o9u'2>gQ+CYqn>(6g'dY^cP_-Y;NUCOL;M>`@ME<#H)BV@S.'Te9)>26'U*UbiN30_:B#Qk`JfD_l8[=j.Np@4FZ+`m8>C;X(RnE`H"51?q`K=[W9+ %o(J9b4i?M9,F1?UF]BOIZqs`98EBf.2RF2+kKOLs6Ye1:K#;K8G)Ds0:4.Bt\+>lj41#A*h'Y*5b?h`),7:-P@k91^&[J%eCicnl %L,H,;F>1Ub?>7Of)r*BGa7@ct02g&&*q?HH9tChkh*JX^_+mPE]I&s>9goB)p=bRQAQ=B6U7lVjTka"YK %6_:`VZKX28TY%$\oMAG;0I9ZiF*gkPe>V?aaC%&F2l1:%mN)Reg3Xb&@/ZNk&F7`oo<+u&%8a,0BnbCV\*));N^[P%0i,Fr@;or%+*a%/.*q7MbE6[K79:TD44^K6fA0%:GD*kdR.ZWF%$W4>rS#/>VpN!klb;7sg%#mV3%#R;!6*9p*KKe4jh0DKiGh%9Yk#@HQknMZo$+<-]'K?DVJgZ;LGOP6FO8l?#T));jdUm1ePDR;kXI7nIX#0MPeHAc %oNkQm2!.PL`]QgcE>kO^D?ha"bOETWC5aKXo;a\a1$EZ;O[SS2]l8UPb1eVb9E$6H7h)gr]#Q%ON%9)D_pB02UTPX5lZ'#"0/J0T %BkiZ9k-_<"4fsVPZ-@tHMP`g^SIQ]o"8X8`6H[(laR-)7,Pi==F@!*#4+U1HBa&B7%dObnQ6Sk6^HWp,_*>PjB9q0L^Hjd3 %C8o0:XYi)_8\5';%Fh`?l9W3.Af^3<_L7/gI>p-th3P)JLh'iNi)!TUS8C!l*-K*?)OH))*\luf45.`B/J09#?"k5I[p)c#[-8mV %WBbm#5_WYk?ie#).a!pBJqI2O.rAG0"q7.93FG[d2q#0`;dmnIp@A]OC)Nh\;J`h-<2DS82>`8JXDURQP%/n0ZdHd[/7\9GW]$NU=C&[l\er#HoC8]`mX3 %3dEMr?'?9U1WFT@=Ns1g$Anu;:9t/BgF$rTgX&/nV%);_p$YCeg)q#:D.K\oFuZ^)P]kZ+XD350qNPB_g1[F!>sQRQK/>KC]\s`l5[p9IUl=DfXne3HC+1dZ/(^Gi,C=L %[I1hVlElsr=]al>K!gnr]N4:0f!2HG$2oW[bA4a[1IZ)?B697(-%QbpRT76?;h)J]DE.(otKfP:El8E\F7;, %[I.(4nF&^i1?f#[bC-M9d)"c#V.kiHm\Dh.#8OMIA4^*FIur@a#`T.+Ib4J6>c;fXUR?sddufsGP:s.\/BKF18CG4#TsUu>r0 %QMhpNhXNRBH[#ZaAedV*]l"T@(X+H@1Rd5HqmE,3%t#XS[T`-.,iM`"lE5#:7^o[*Nl5W-2sbY8*e?6SW6'505ZP3+cB>:O4_jWH %['O]T]*A^JIpVR-LG03g3r:XCLm$8X.3-G<43OZfd6$3Sce?L/]@!Cq1kKeYX-"6K^ma@^hH.T,NjY(aeEFX1=I\GT;LR4VR'H8i %kCu$in?"&=>YuXD4IF^mkW9`L;.E]sme;+,5H:N&kCB$`XYfM!pinU^Q040GN*g,\iLS78eC@5iZB5pT8JD1(.2QGYjO7-A[h^UUk1q4@#?-"EAsYBL8sKL# %bOSdJ*tU)$ECDM7=6SS3\hoj`Bfg1ZnM>Q?;c&Q2Q;J^rW!#kg;%Q/J\D<8$G9UV3Y)toNd@l10kA=g"8eM0LZ %&\PJ^D6`R#4n-u["2RpjkJ1[m\>BnKEO@1*4:Rr,/927tZ,CY4YKUu35\3&?KVrXP)(s=F8!6g1YXQ)Sa7NT/jfc9YgM"%$!]@9[B9Y7G7%DmdM@skLW=A(e85aY*U9O1ee.93!f!;5oXa^+YE:eE?mJ[@bm7@NahlD?(r@dU %0pi!SCfeG\&Cf+nGT"u!Ep?JGp]Q$K:sk4\\]NYQhuRK&duD`X1ZX7BP%kQ`fp\r-iHgH6@mc6[n=X2S+u8ME^DS&ZQb*A3`!$+C %oOS4C*ausL/!7E*(-`)i;TH]7B?62[_M6!p2*?S&&CNC*b?=GR>'cAibN;-f_Rk*X'ikAq+>677QSI[M)3LQ=F5.p>2#^^@5'mp^=/StNR9?-Q89MBE) %cH'?=Nac?eAoD[/$>/fY4VYC4dY$du*T'B"h%7:Bo[>hP"Oj\hoSc'O- %R>u^m=X$o;j4b97KYM8W.W$,&.qC?]H%\&korN;E/iRfWQ7.OT]=@LEYcg-kTIKmeMQIn&lS8V&\.U6uF_,?9>'OpKJJ$CPOK+Ib %Bo=YAoLf2FpRnD[-?kP/YGYUI1q<>ndtF6Ta"LeMY6&5s"A19m\Bs&b1Zhu*TM,KXh&JY6X%E(mbO-o#2&YO3+l[Ajl"@Iua=a$s %SnkQFR:&E&V70G35=p#`;r#jg;KNg=sdTn_1c9I-,MIT;cce,gS+55t, %&s'=+/p/&F?`A`bA)tQBM4n7/GgZsj@s01I-AF$?XO+O?KJ@M)oEI<.T+L([C\"pGf*>K+<4P48?mUcW7Y*#((SYtSZO0!5`CuOS0H]P>9E:r9G %mRN_qHh'7">bZdDe!X*h)@=6NA6'%%(t^qQ7XHau,i]Y4Z1kaAf5,Ss:-3Z30DE$4CkT?_6+E\B,D)fXaoBfiVl_:H6N#'8RMG2P %lj7W7%s91;5&)i"A_c7I<3&e[6cIUO,3O(XF9A$<+Z:VMXA9.oc"-/c2nm^rC0?0QF)H`?`BcFY[1<6t\R1TZ`sPN9.AX>CNI)#f %)c>\o`(`_7NRIC7^1icTo_mujnH8p@Y2fN`CsA(.9TKS>(&ce))O8>1.=X+p6(bQe[78GO>J%9>LnK+6D5SrQA+_I'f=[Bf[iI*E %h*9RLcZq>r,oc!D,5!5V'QN!@%%2IRS%3Di\Y(3/:b4:uoo/'-6'rCNUjfJNq3J,bppo40Bs&5qC7QM%!/4NSlc+JM35"+@?RoPW %cYPBHj+1Kjmh!%DasHH\^bbFai1XX>N._ni_$PO!q)=Y4qZ$Qj;Bjj#$CWIa4]3ps&/4Y$=YNHejHO*6;*[KmCWj=="i1tJIN=6t %k)e]XIkUC%qg!Z(8F@]_-k&mW_sIk=QtF&g6obqCFX^E:-Up#L^"IFC?=oHjeT)UIZ#ON*0^gW(gi,at)ZW0XadtQ.OZ;Gcbmd\AR1(uU;U=Vd_ %lVdKtO00h=@aCVYp7V(2a,8@6EZX+aF>);n(b"umQKNC7%uO]KBgl`I5JQE%+Vn7/WUBYMMcBmu_4,WS;u#lOIfdMsHP(:ggIfNf-6;*LU<\CJS"`UUU9g7YV:fU;,A24n=M#i0EVK,pCjL-(kq9f %9q"m7XMN%e2r]'d1m-a]KH(8-8NQ!fp3UFrRfVQd`==t %X:F9`C\uA&E$h@6`SbS5"6"'#Ps$S\Oa:N<($HLaBWq':oE@AB1opE?>qB6k)acLDQCb_\s9[]_AQcn0!>^md9PDrojlELXb3;=+i&o;P,?Ll-dK8%gTGuQF*9Z`@_Yp7O.o1F4##]Q[mkF) %bOQ0mCj3Q'e0rRr^ls$('EO!qZ#]1hF"1qF[As`s%<7Aj83jM8,mT"`LGi%4WuR1&KY>ObM8m#jV2LMuWun%Vn'K=dK&4oc`'8/C %IqDpH]uLZQk"=4,F<81H>a#Ca)e7^Ri\GD'K.GEuI714_gm%c9<_.Lt^^7H:!,^i;@8g"gh;]OTK*YdX)qgi2QV\iB-_,SKf=Ceh%%6A@<71`k!;M8Y!T?&DS)-#bq%D+CRfILZp24QfHe5$pdpG9C,9=&0)o4;-/1ET18^c`+o %%t^Y%]SUgE+,=jGEq_J4pPCVdSPO'hohU\0#Js)sg<=_X<$nV8]+DdWBT['dc,!/K%(C#al+!4k]CW%UkkZ&#:t[3l"/3@%"Rc/$ %l#aGi6gPq.!J4GM[J`]\d[GQ@IUtHC-/<*C;=^*1WWs;Yj'5'BUt^R^M`,N3RZooE7in/ta==SU!i?3-2!M9"BOZROdUfLmbW]`! %&([O.fWi=S4kB$m.le"]LSHcHRf+!e+a4jqh8RiachF3W%>T^FM2qG,L7Kp@/:?(G@,>]oA,n-hfGB,CJZ@G%Oc %d'NP?_9j5b:$ua(CoNBp`)Cd=(2i9>'Uo!M*nI?>-B_Q]Q54&FgW6*LrV3@YgIJ1?;&C@R>QV3r2;uj5W`%Ul`sSqG1],cr';d+u %QB9-HS,<'/"2[hI"/obL3Dh]/,Q2#>=0d<9[46D(%#PIdaW%oeD"F-LQ?HC4l3*Cu1*1okM^c!GnBC5F45IMV>=keCh\1iOk'9.o %0WqMZMm?0m\<$'WQ5WoXZ^gJ.4i>EB7XM';:lF"Dod3pNnT[5JDndSVZu\2/9._ZHf$YGr+jqq52R_.;X$.)DZS[iWmFD%*M&R?l %bO=)%Qrki>$D#bm'!Ch,ULr^k(B\`)-Q)3l/Cam?kV?CUm\9p'^Za;sc(u^B.E%s*)`h?W'uO?R3qOpJ=Q?dNDf30B'C9G!EM&ik %Vkf7qC@9_k]EGuM77-pRC(XXp5i,OFl/VWj;(!Js*@#e'`epH`/pm$NXHK8FiDY7tVmPEBk"/b!USjW/8csN:2&EV):,CtE+ib+-`3OC.jGX*"90,?mTl=Q@qaSg\suL\b,#k/"LCUKn+E/Io?1\<>Pl`lbWtJ;oQAnn@.HnpA,n+tp;2D7CFppg %P(9lDTD'_+60>*)J_cB=5%jJ2='3t61m=MS=^;K-4-I1BQRu2Kgki(sCrVjia;mRQ %T3!_91p"/P:u_-h_0-1BBmDm\Tm_Ko%aSo7Rj4<(+Mu9[G02kiPN)%)3Urc+VoibcDaCajO?au[!(nTqjHK3+A[dW2.O#f;=.o>#2kIrq@H4rm)a91!Y`I4=:Ae#0Z))0J&Fhj;P8)5r^pXauSC%_m::0hhl4"G@6jl!Mk%60L!'J"AJiiH4_ZMU'!>Ja1UMhX3lk^uq^PFkh3a'9I)S]!6_O5'1g-+k]'`(hJ4EMY/C %j+J&CWmfnN!A*Jb3a,7?2`_-lTs %pR)bM4'P;g>S]tC&!B_-H.E];fXpk!e7DT0CMt@(*Ploih>>nDG#*Tbl4\DN_H;t.pK13.X-o':EcAM])S@V:ZsB!FpQ5Y6fX;m: %9;4E%'kE=*2c<&S*)`I-bg@>"*=hglhRD#BJ+`j%bE?+Z7N8Gn7)AhQ07B4>NP %jO^:@GBu"VI.4em5"!^L+3#)]1$r3ahdk/X(60!W>;h]>ctf?U_qZ'e@@kig+t&:Y.OYM %JT&-qfUXMnHMUVGBGf5S_PWYc^N6.Y&bf_VgQq)r$U&;#=JK!Za'6eNgTT(bNEKLX>"P1J&eQ-]f$K[XXgL:r,Rmfju"ak7bVj/AiMbH=rQ*R7:7X'u\'Ed`INPG9kao#lH %;6hF2U9^qa&?.S`VbcDL)1WXc`!E>jNG>m>,:K4q#"[\$L14)3lIBRJ]3e@7$C^+tH6P4AlOGE5[00Ltn?p.KUra/^8MKhbhqk$<7k`V"S>.?'.[+e$3cHe)?UI/UD]G!$R)XO@>U`$q.c4i_T&+#bH&P+BN^C..jB4g:1_tF%8-h*p4;\^Ngb4maBm1[!r)d.r=dLfel)5ktV %5Zh%f=R/Q^>PAH&,3']VV(>F,OD!C[!r/e@jN$).0>OuXQL29IIai4OFpdD(HhMTXXrL3@XZ!Jel[+r5G0n2OVl=Rs1Lg^9G>Vm$ %VK1R^_r]O@\H;E=jbtALjEXdIEI&+sSg(3@Wot^27h7u5;EYgtl4mqM.#BJ@_XE#j)BoXOE<_$=tBF&_a:70g=V^lJ[?WPZUF*O %E+SnhZuh`Unq^BqPW/QYlHHhT'J,)MAHU+L$nJU4qRA,D?fIM"N--KBRLf;KZ1&+4@/u/[l.?KbnE2#Y>BKekFfsXt(P_h>YMJHp %i1eMlM]0>eYFn#GG+ApB]'X7'C@WfZ5G\Yu^@Kp/j4u2OXR'.QIQgua$r6Tk1d5$rFrtp"f8[EJ,qG:-g:dUphXG9N>^D[#262>J %(N>1^j4)9'P5nuHX-q5(6mB6qgJY4GYd]nV/gm_P&Wp$C\MF7k1c4dT++,ocnGQi[Tm5b;1 %0]s'>I*&UfYAA:8:\q"`]+M]>#rGVb@ea+r/!dsT&@J]p2716(LYd&9\Z0i4T88Elm.Pl+]n6NCT'DcX,uJP#bHN>\>!A8<2?7:$ %_A*rT!?`7'!EiCb+Q,^hB^JFi$P9-'bQ^jM'ZC%/l!E%\T9Z-;Z<3(ptS.a?u_O#QC>+uAE6j,qc?CqKB8 %Du;PefcD,W=FgEblF]tb$!&KimG#qCC\C`CeSB94tB;d[%qeec`qiZ%EYB+,*BH6jll;1G?7b#Fis@+ %(?GZZH^l5&cYa8#cjQYnK'(1t2$/)OOEn5C[SlP(NaK2p\bHc"A;/(>$JUjZh/FA6gJ6)e.k09YDCf.tYSNWnXOpBo93SMP+0'Vi %)Kj"J^pGi%>P[iu',XSiBMYVpmA,8lfKn8sA7i%7')#+a=AaEZ9pJ2ho\Hs$pO4)'!7?&jd7R1um(rHHQIXT2J_AT%A3%UNpQ[TR %ga)Oqmm*T5co2->8MKqG_W*Dn38KN>-+/=4g3WJ\?8[#'p)dQ('NuTme7crsRdlVf-VQ#.VQ!@fa.Bj*UO-kqS0H"u-AqFjZ0dd_ %B4d@u2VWGZHH_^]8%E)gMIY`d"[0l[UeO`A/h(\L0KeHq*A,leSekr#iXYFpLGE!E[=i+pSL`UJSnZ)5Gaa)M$)-cdi]O=WljI+) %&K8]`E`gImQ#kg@+pk-)BtkX(br]!?9J%]I-/B#d7^dUq=&T*&MXOXt0gq`WL))]r2L4@s.h:R(#"(3()NR\=*4#iWW*lnGDaPsp %*(in*a_$IED0f[s&HM3f1(0jF='R;&(V7/gbiJ6_H5T0_L@\7.^^aS@;>W@Up5?/HQWnlV`bui!O.Pq*TZDm@SjB73h)j##o"h2gMn#R3T^u(:6G='^4JLo(V_AX;_VNs(!jY8seg`Z9$/:>Nknsc5&?N5#AaK/O&&SOhe%=a:sKi?(AHX\M/%CV41a,DVQpO84,d0D,_JF_\QW %)Ll%/i5Lb5dLUrrmGO+#0&EuHcl5C.:C0,VFj(QihHcmk,BAJU'#Sr-5&5M>+spYp:<(qX#lbhAe:J95,7clA8aY=F=:G;8Ta$E. %3k"?U9S5L3Cr04^W#42N&_eAt=a>mbk%J().?Tp0X^W4HRYG&ZR52M:V%o5Lq4"Y,L`Y&OE]-;!Kn]%iSsSm\H8&fF7Sj_"Ug&'1 %a@^H]hQ1VoGib'jDPF[L-l(Y6Phe#LT3FB?@!u=m*-U[te$4,H&8!`['O*H.6F4\4q8N6`R*NKk%f8?O_C@9KP&Rbn$N7^VY,e1+O*?RLP=,umP=ZP# %[lk!B*e]5oO2H-LJrQW(.M#u]oH]DAd1G1_D4ctfg\AJs``]R8=WY*H^&/Wue$UK"MQ0'?WEN`:6b7H+YCJ>Zm=Q!If5k_iS(ZIp$R/9.!;jCT[geM@FkH1HHWUc\QbV5A;0K %^Z*OHN#"O`e^!nFZ%s.]'RTNHK&^?s0(kDF1cYm$?jFR2_AeHmO[W#FE,'NUFr\%:Lus&0(#aG&W`2 %n8b:]r,H`)RLLED4rH1AP20&X41q]\;PI06*.nh-,:gH:GOaf9HPC1KCmI;*G97T*]Wo2P'pEhE;os!]]RlEEHh]&nC5np`ClH1M %DlI:B+`%;o\0AjS`$"@p@8FU.*-n#-9Oe5RiBi%P27^C0=X%?0(^"Z1PdW@sOt[Tam%5[3N@,S-F/Z''UVJ7%]p1XpF](6MFtpmk %9nK1C`PU;['\BFq26JsRd30(3gk^-uQoS.36;Zo[oa[QGZ2<&FElh']Ke@8#h8JHd7\V!Hh2#="-b*V9[BCAAH)tA>;^gSBJJKAfCJLR@CSl3ZVc^/icrl`8RNj,hUPSeP>*7'U);^L^ %J'kMfDSTT+q&5OeEVI@^]l;)`gAhE9#*,k9]Q3inJ?Y>$G,LlR[$egK\L;HbicO&gj.g5XUlUqRqhebqqKAGJum.eb8T/ %a+i:Z_O<`O%r6C.jA=5&LL?BE)0/uIaC]G$/T^)WS_/rPe-'2Sc:fK.c\@f`TV4.jJGVrd'>`i)$4*)%/dP&EEfRV'Z608#Th %_dg3]dp$;hERJ/:VX^)>g7-7WOa-U3#^XsE<6$3"iB`3X8J*.I"-pd$6q1;b$66m\'8M0NQSru"oUZ(1X#"7:G>c+N9-2!U-V&EB %Y+[C]$#2(9&!+Q+hJUD4@XNkh/O*KGIj3Z0Fp=&De*k&h]f7m>RU5Z,]2;C!WY?o(*6 %EnrbQ7)q6=`=F)*[i^[]DNCWa=9Ho8E`ZPtiAa[]Wi59[Xp?`T,#]SCPo,qm*Q#@W*`_BWF,A %_[bK7(LItDbFVRXC'<=NAIsAs %jtaR!NB2\d'!T:AkH:bI/5h!#teJM8E>>4dE;DJN3p]N&nEgkFZLeg'B/.+-H94;Onl'bTEP/'h2`"C4=bW]lVB:&9AR#_@sD`^k:B %9fTUg7c].Q*I["BMBSs)01r=NDeCbX4KD[c/0PtQ:0$"A(.:]\R=]?A3?7.ea0E_oUu>/C:0?kSWMVk?!qn/9qe^8q9QR7hQkINM %/_fDdIa;0]LL\G?O-3ZWWlHLTqfg83;`T#aN0h(&bp9r1)_oEhfO8BZ:$eN%f$7D?a0l*lO![#B]g%+GGD=rt0$FYWh+#-V$*G4i %'..")2_V8qXg,kL>2',U^b&HR2M**pL=5i\-83)`/*?!h0%C817IR+c]bXfm=e3Tqi$DV)a\qcJW'kAk3 %?M#]KDcGdm[bZ-5jM+HNqYuMY-8LI:74ips&,6/BSS#>'5Y[YQ@5An=.(c:0[V:Cc^+(ZP+EuEJ;td=FpH?_h2F7J-g8*%rCFUL/ %)3P&rY"@SN@]4<#B?*VNXB_6Mahblkn4bNcb#`; %)Y%F[YshdC73E:b0<8ZJYG^;Gdn%@J6]4aQYtQ)RV"aY^)*JC.V;?V]H*Xc,nm.)<7TVSX8q,m"Zb%B)$j2\sHl0SF"i>`(lYXP' %cCH(-Q@D*(\4.%%2')qDrK[#P]F/e`&gMX]n; %Oea5\*`O^>Z$SkMV7QDn4tLDa(Ypu5E(TD`2^:;KT>F-5.MTG&T@cb#5$-jKd%Q>ip`+selg][nM^9F)0u.>-itYVGb$]gAR.m+0 %5Jl^T>hQba"V0Rh20)G3\En8=(c;p>e36nlZmhaj[Tca!S(\Sfff^2+oT0Zi>eqOs+fMYs@&uM$5*/A&Ns*`LXal[[8)l"D/u]I= %GkS`$^78*(P^/Rc\F:sV.2FN$M^OqPmAF;")]NpZ\Rd[Y]N3Mkfs(BXVmtol'"m<;ESfVe+\>3['tJk>BV/8kG8eo8"i]l%ZsCbn %UNlo(JH6YhDd8U3A!c^BPUas>gAh"!O(m/;F1&nqZIJiLeq,Q65sqa-`]]CM!KUq)08F3)d3.]N!%r!ljKat]Fp6D,62Tna-o=@o %a9,Sb?%$e$7K+Ki^s^aV(e3'+2Y5nR$\OZP781Sp]qD7[KcS_uEp.7k];Y'>?6@QjrFk&c87R9tp:LACTUZ1Gk2/i$dRj[NtG]*n=<.-^dO1Bqq)Wbdo#0/j/ac/=s7'p5I=#PVq*ZqbrL(T8lCn*O_2#338?#IO&MGi$"@lHeFjIQ*f_V+-p' %F?SUI@LRF>@70n#fdGA-L%Rqfr#7O6qHs^M6,f^&l'B*N94RpMn %E>W#n>J>XP<==:0%:rA9e@(#p=6%pq%3qh4`4AT2GuAsQ^H(Lj3:adGNYRX6`rR%+\I!*#/B^r&\S:5S9Bqh,Xmo-O;Gj(WD@X67 %]sb27H)Et8n@`5UU&<8UK7:sV*.65ZDI,l[A(^p4q8T?N*O+X_LU\C>3%4%&2+Ob_?1brSU7kF0E!V=CWh;Z3OP^.h@4!?U[2=WP %I6V@UE[(Y"]?bY<^/9*>29&8=luf/K*J2+(F3rIT[[%I=EtPW=c73(28IZY^`b=1[J'dRg2QZ4S+K^gGm?MP?!#6$a3MWOWjNh@u %eC`9+@jqKrd#oA1ej6=t#a0np=PMC=qF@P",em?C@Bc1>V&$gq#MI?k=F2&Lkc&Met@NS*er# %*Emh!+7#dSnNBSN&Te]*kp@cuJ+o#EcCL]=4fK[5^KuMq:NH\UI]@D`.R.?f5:o0`7\=BmeYe&e5dsWFE]D>_&qUD#`>Ju/Ph_Rd %`ciT068\aR?e\%[RcK!Sh3`D28%%CUS\Q,*=$a[]u?X?a(%!^''/G0>\_E0!H:-g=<`Ip;'bN2l<.?e$Mtk6us2a!f-p4\nqi:-W;*e08.k`:_.T*'K=ao>38;= %3f\ok*UalqYr+LEaosNA)9RP)J\kS-*jlIr^3@WRj4HG/lGrT$H"tRo\:DI3\mc/./!0)]]H0^bC0b3'r%j^VV(6ot4rfJ#4Sj&q %[##d8as1S57mn.um7s^R0N6pnZp"b!E%YE3_0L+I`3>gj!D9_J9IKH"2.KGY<7]@GTt#^@8On4[cJ38#$t:-Ej7Wn6h*cTH`@F"i %gSK3oq#h#*-ne!X%aGuLj/.bY4Jt+&Wnr?G^:d1cm[5..b5WQ6;\fW?2\hBqb,+r9*Va@G!B4j:`C&>G=,!V()-]8?12,s/b0W+3 %i^`3GaF*bWQsJ@Aoh_^@TsBYgHUpJP0a+a=c;smPhb.]Ekm;7R7(e)o_54j*G]X>>/,iRC?u]Bb>ieQjh92dtWVN0RfZpN,bnV^-%/Zk5kZ,uD %'#NYA*^UZ%kO,M+AQk+-a*S9Z.%r\0!TLZIVuBZ/(E2K`&J*1m"+k_+o_5=_BcV<+)X"e %`PN@*NWKF@LN0[R=]N1j#I=,bib>O]0o7%1PQ9Aj9,]H`Z&JfAh-AC[*^Fs!WKR\SC!Gi`aaATJf8!e,?rmTZ/g?G]$>a:>dA1', %Y\Sc"W)aR*M+0\Tp8L2`=(rZsCgg1^S^5t/5D;3T'kkT:ZQYMZ$XB6,nQA$hTh]hM)E*@>o\sQ%`Z>#Khm?Wn0 %ZG(apg=9QP^$ROKAbZ#^_GV9-]6^?G!ApOFn4idu&RrQgp&;Sa.]6#VGH1CJmG$K.[g-*J;t(>J'AHeoT<;NNGW@=]` %d?/%d83Q@1frS-eX:L>X!5?iZ[sZp5Pgr(/)t,$U@jGH*r+m3?>ga44P![tWQP.D#1a,mX*a#FoQ%s9&K#ar:n(4GhZCB?Si('_' %BRr^Z[T*t`iEV7$Kh.=*Cm7fWB"M7X6$4/g5r,&ILgoQMTMBlm5!*eneP=Qb=dd5jePu$]rL0%/5-M233'5pM5=7(=QTB+2>P8h> %E?gIlnV@I/UO$L$,8\_c'51`EP,q:FKUfGO\l4Fj/EBp.EET#.+W.%VACe`r5*UJb\rGBA2b`Go:C'm$*4^J$4lH]^,rbc*TaN,D %Mi:for^mrJYiEOu_#.T=:kFu=8*WcMEATUY'nO_6^SWg`;%-J@\+%ZoCQP-9)d0"HJ;.aenI[UWM;dUAQ@uOlJ2,8nT_j!;c,Q!T %k.?AHRM`=*Q"V=_FgS46fg7t.*eSd:Kn=-b;&o!Nn#F'7*YH,Wm"Qt']3f]d5Qf'WoZkKZ[8WIp#\`M9q]hJhEO^MtENCu8M(V'4U/T,r1^"P0Aj?K3fVTH2Cn %P3P,mc@Xu[kR3#4Crqm+R'n.\I96Z,5B$Wk]8isIF%%dQ`l/Jur,jU_Q$YM@;mQ%NCf>n6XKlt[UTFL,O"Z"ATd='0M] %03&'CH&(M4?.GUi'm;L>*B6lpoW&M!Gbo073dcM/SYQ8t8J`?:;7dBAO#Ed^+]j=1W0&.;fW4SEpZZbj3e?_8mIh+r",:da %m3dBda^_rf%6S\MaK?X0u@bWLp-PG>hgNZ7-c=r^l`5YB:+Uca4<43=3cqp-G$P@]\3JTuME$2?R+a7YSUVYG)Qh<5@1 %>[s7)LpU#[ahkr5Wu)Aldc';"4NZ-/QO=SM;2EaQ9uL"a`#is>54Yqk8#be8B<\+jM8f,0Run\F"/p7f$P"M+3N(J]ESab^h.a-Nh1&uC`'V>>pFMeNpkbshfb]$"g*Yq`R@:Qoakk/(/OUd:*/f=C#D0c$#n$uWBI$XE`tRR01;jEc!);nn<"D!c;^KX %9L-)LAL.]'1$kMtCOlaA42GYFH^>m%H/4*-"m#>m_.i]RCFD'\>\h!Q*hUWD#cY$eccb;c+RIlmGZ4"0`l %2E"Gc;N,%9CLMLJ'lmVmOqqPS$qpt %EB2J]mrXPnVag$B9Q2#le.GCK0Aufb@@*RaJ'jLi'@0^`RC'h*9jGM*dUTPK'?6Kn"srZW5c5&+(';&<>_#_'=cLAjKh6_cdrL!h %atTBPGOO(Q#q@9`i[m\V%/ %!1VsOQV]Td+:.*PA^F#`pn%sr_n*k`i96sCi(BN@LYINl*N#TUQR[7^"^fg47\< %9"_Y-8+8+&ijHK^G$&pSq@X*Zb7jpm!"@K3Yg84h^CnR_24LN!>qjbK1_+%6cc<:>^LeJj"gqt!Ys0q",+:](g=.QJnkCisbIWb8 %kM6?fp+@Uc4i^&%23cB\lC>j:/sEFiVeUU&<2\Vk7Ki'*3&:jU6&M/SSKCUb3s@4fJYMRC5-=Djn@MSY(meejcg?GXQl9jDNj(<; %VYDASq.Bh%BobsrRFh'p"!tYT\BoVI(Q%uo6159qgkHcnDMK`a$3BQ_\29H7=a19O %&g\PqABNn5G:V_g&!DjBpSS5*Aulm(:A7]$]+Y&^B:aMWp0!LJM$^ECmO?"H1Z/LQPt2EnD!4[$L(#HbSsf8dD!$tj0IPbF2or:1 %fe+HiD@[`--]fo44nnmK,UGrs?(V"[.$Dj:4W=R?L;#0RNSAJo2Q"rt'^\='e]V4lLq*.WX+QE%D>'G^2_kOYi>3+(-`L!2J7 %Xe0TAkl?Qht=VX/6DfVfo#$no7^fR\g-1B_qknEY2b"6ou+[o4fHd8HE2CFY[Qc_--CRN`BC? %\2sKTkKm1%m+Ei"1*_PhN91*:TQ)3n6K\K\J=e)-Zp8Ed!n@.'T^2d36fNlOC_mfM(M76p&+cRSF7;o9eHF%J03o_dKcogFB:[T. %q%%,/Q^8rB/k/BC;22,/lIiMV"QH@6c^me]4F>9>p+@iG?O'6;eM'3`-9YVf*R`O;VIPZ(^S)#TS%'S0a*lfmk;E&-8>*pfgB*pd %@NIUO1(nFIc`=b][8Y$NVP_8!Zm]U>SKEtDd0QA6Z[?'0J"I6/K!eM3IR`_nZf)9$Z$@2A/'uuU+rC2ipc84B;Kd9;[>*4_@d"RX7o^&iSglA!ko:N#p_d@6:W6bnS>%:n6Gs0ekJ9?WWP+*eo'fMjgXS28h6ppp21\"6Kmdjo]`tE[/U.m4pj80*IX1(#/)/cAo9&X4J'`rSaiZA<537C^fXPdf)Eud4;VZGQh;!38I^6G)$Um\hc@,dj/Mm]AH!9$`%9t=hLu;ik+cD_\N$PC[42dKpm908WLaWnXS@XQ %_\:8mU;qi`R[l)Vh#A5:lt?O#&N`fB\&13:KDh#[D0p8,iI]*>HMFE[XQRUu=MM2lBb=o'3jFLdeEq4E2hD?6Veu^VQg5iV@n@$S %n%.;5dY6eIa%.P^Zn#BrJts_Li<8!%5DIGtoG'oRT&JpDQ*p_!:ickng#:].UKLs$4q9*q/8/LI_eR<]/hp'^CN:.;*D)VUjj/(+ %'>YXn,D?FqR(_)^a4>;,$Ht/:W@h=_3V*t&4tH&.?o"&[:Guf*Q'(VkD+8dBmuOU==e$cm$c9c;&S8.+.()D7;P#pkAR-CI)7j%, %*rL\[4V9-%>M\8ZJXg-<%Qu\`?gY(B/Za#k<#q#W:6uhsH'E(]o]AXMmDi^,nS:'/d#EJ!m@!Dc4@$1C(%$Ers"nU\7(IdtH*7oE %M"Ru-c>cWVC;IGr)hf'fR*%Va+P*G1RAHJFJA+q-UUV>c99$.5:&sg(X>9?lH3oFCcMJ4G'dt/9\9JC-g0eqn/]fTXSl7,]G$AXZ %)m+?c+$9).N9mI68+aZU7ot"Ph'p!cR0\:Hdlp+TITrZJESP=f:n*DT;q>e=;YJCHs4q\j\Y,4+g]r'f>ooDuZKNYq;#J %@4?d4R]csOE?-4kbPfB/Y]]r0jcV,3fF%HV]Zsl^o62QSMm^0nls6$iTP'Vjc?dNR:oNWl2NF'8.`EO#<3c4e0UQtRFumOb/dG9W3735H<3_[hta[q>"H %&?e-'1EP@K9:7p:*TFL5hD/U[Q[F^?X`MtCI)ZClXf=ah2hG8uF[`q4jAf1.^>]hoII-aE.cJos(kPffY3`Jl0Xt?M%X#`r\$%AA %BFK3V_ViDre:ME2SrYpC/-i!sUNTRk$4d6`^.>rPS:Rs)$\rRAirNJ6W\_"p^?#k6TgO38->o*G$dVOk1uA*h,nmQXHlfP,k'(NL %<3bo,H-0uu7$Dc8CG-&eON65`FG@$1l`I,/#sg2%IejgH)6h(WqV/g'jQM>Lc:ni!3#X+UI/"SqRfSCXjX:S@=e>K7s-o"[Pq+kAS(dCNS]2,gKEP*urO#,^I[t]gPQQXmRg,Uf[NCknIV3D?XAYVO?cS0/Jc2i,J)ZtgZ %c+)9;W<#AY^c9o\+ADj6h@Ah9`fVQCES/N4WMm_<_3W`^28o=IiL.IB.Dec4+'e*W.020ndUX6A1R&b3WBHh/PjT'ZO!a-)5p9ab %&1L%H`SPfaSDog-kT[+UNZD^?WucML%b*>mK<"KkcEQa(%sB#-[ne1$$"_6!H5q2_,)!Sf0lPs+BO[!YAt<>R<=#nVjZJU<+!9\r %b3bs.WmV,OJDfblG[3McM3cASDA\a[;' %b@AHeTJ,#Bq\^icYMc\J_O$C"LL?$GY>8#29WP[7bE>3n@c=uf4Tp&"-oJaje>hOC/,!FloT`&AX>*-4:>rP2Ms)D/=ntShk:jEB %AbRVfN``>%Zp>X&&RhpI5up/@6a1j5J*R_)uMlWl$o"6Yn$.h@f8tpBZq? %&pp>W%'J_kA#E'>'#YGS]gY3)Kb,*QWEI]0_/tDh!P`k_1KJLf]6f[U#K*CF^g.PI=Gfnf`5KV"eft0H::1L8h$?fe3-ks6k0Ic0 %#)TA+TEk'L=5=rCBAS)m!,fjB!TUOm>SRZ*6k#qUnf*@g(bWiTqt4mh5n`S_P33>S*o9\uHK-@WGE(q/bV_2!$jO\DKi`js*c'n# %R+;fMa4r'OlLO4@dk\B#O1\f%GB``Y%l"?m1q=gg7UMJtX)1dS5cS-ZM`!Y8i>S4@qp#uXl5.o^2Ur5dT">^hCF`8nog!k %<3au`J7t_!5)#i7PT'e^j"85!Sqd1>:ZUsLI*I?VE3*sJ5)Dj\b/?9iGV*TUk@hd=,?!uBR7VRgm'uI!,_7q!kW^_3]u0q=B>n)@ %@R!cq=5;55/WDa/X]@T6:f;0l>V$aTg>IMa1PjVjF,DA#o)ie(FHpU.e(\SU"@nS?;RJPX.3?`n8 %BR(=uD3t$jKs1luO>91U$J:\t+l:@?KY38I,5Pm?!IN^GMUf("Pt2\*XB'6I(MT(QMWlHXlp['&I*Qg%@&IE@IFFH;s'cVEgF1$X %.j;Th&8eqFZ"MERhIA^_f,_$a[@I?hVV`X6Nfhig![G(I9:YVTjr_NR^QEG %4aVS(d;T_SIJe2n07lNV3@8c4LA`HW]Gt8Ckb:G\+:*n^TTI4bdN"TYcN'djkL@?!_Lc@c%OXCfPBWWCZ7dC1/Mdlc&H9@V"cH8@ %K!3F3d?Wt\,IQf^\W9nVY0Y_\^;F?eg;4F-8uU`'W-RG2DYndP,%#1.fX2g"B8@!XEgYC*3_Rj'N.?025;j1\O."aF5^=QPQ+I0@7#84ZLNV-^0*n[`3;/iuO*N45I> %i'?h)[W\VqCK8EA]Gl)N>ZFpC"U^&jc1qpp'N*5\3MghZBflaMb-Q %deB]mH@"K5Tj+ReB=8Wj^.7ZY-Ga3L\IRO=Ka8eq$22M3aBJDR50V38OMTKQo%XE.-D/R6XZEJp"W=o6Et#G?@p=2C+;bf+k]GW8 %2QBb*K %_>A_[i;_B`nb+R=R*RdaHBn_SXcQGD/ %Pp0['=I*g%:I'kO\=3`l%(,H.F6)-W%b#tO\eVHHW5=AJ(F;ZVAX']^I21`UP"":6_VVe'&Q`Mi?LoC1gWC0W^^%eBie'+sNiiKq %3!Ou#LYs\>PUA#5q6Sk5"MKsUK6;AI/&0?r[Ff]:L=5\-@[ZZ),:]_]&I[fLEJ.1(a2D;V/*`#3aa'N,T0t2ae %k0.8s):[`(i!afGQ7\@<6&36>\fZAk[BKdrM-'gt&eHeH8)XZRp_CT#8MValFM>KiW?JUI]3BO#iC-B<6L**!CS=UrB`$B<" %p2(dr-WU3,!S,dQmp`\4ljpLmZeg=PN>:h7W'A+`V=S9/mDi!-D/JB %cjW.,?@Fn%Z+B+!*<`kmm_YL1>Q&^d\GE/%\JZ5m4WBojAb/K?&GOi&YW0`faIF#3e\D=hGZlaXU_7X$Su,N\,YTW5giff_ZQjWf %G-Vqip]0rtFX4Y?cSfVTp[8_J34im]0;1$XW$Be,hANsH>.5Rs!5>dtS])eZC8'WnDn?+\['Q%3e<-p-eMoq&W"M6IB]AEEFY5^]Nk`cD)#8K+^)k+-"(VJfKk+.LH),]Z'KNhWpjgd=^D/]iNOE[=Kl\IGgsou1rjA'D'aZXVB^>\@c?Zb-?/tWQ]sB(Z?/+lj\`m[nNpZ)H?Bo4P_A+sgH0k:[9gMti#Xg[G %iOFZ'QJM`+""*Ier$O;(#55[b$:oN))uKBk]B+5'fOn=N %:+^,43:/6$PfLd2dU%bhS8m[?HLG@jMUJMN4'K'KaiqR,2m$&-2lmZ[3F&Pn0cLlmKan4&&(#_L^g(a)RU(8NJ4\d^H;1GH]Rs);G+[Pj7fget]-aN79\h4%KmR;$9CufHb6V5"3%jU5ep1.%SEmMc,P$CItr>SgGAfcuNFJ4`4cAGHNS(Xf8_V %g78[qLK^p&/g'c>K-TdQ^1%cS-#]9K:qCa-5Ne;jc;^ht)g>1X:!M:_rjkY.@Y9Ma4:^:ui;Im(iK.ng=uEeVeMmR([\;6@49i`0Ur^p#<%N]6JjBmXNJX#:]=7EeAcb.<6ju&$m>+(]+^Yf1];m[<^k&LkPZ"46"W:IGR.ADn/ %d[mq!>"\_.=t9l]U34S]5#)]\%X_omkFJicm-W%sSAK/9FkgU#^=I$>al8Shi\YZ3dI-@/EU_,b"SM?$H"eT\*`p1,T"Y:a#WdOh %m5Q$WD3GL-%BoX+^fWnBY%8![PLll%%j:YgfDTjkd@1kN?h8l$`GUgjCN@L<8TC/FJQ.hS!9V@BVtF(9NdVlJlcT?p%'Ehtd*Q_o02()D^]\2\T]BKJu1N]tggjQbV[i_%`K$hu'IiV90r`_o8@+inq5;JSF^JHaMVj7ns %G\A;cj6LcNnPT/<:eU0OTN*_`O9'Jeps`$K]hoi["a&dk?TB@)(bBN>kVP6/%j1GpifBaLL1)IE$^YIk,;i7>0(=us)=PtYn>k[D^bSX[d.pf$nI*l9ZEfasQ\SP:"ho>gMQn2uhX`5`TlR'&G-A&D9JOun$]cHG%i$[eU)-*96itXe %"9nS`5Z^?S*ET[uNEinHI\S$?fsL*5`'^S/1cG#:B8Kd=(@#dP"**o>[tc#=`bh57&f]WhT7Ft\IR"XArT^."J#q(_2=@\JHG._9VkkfLnmZOJZmq)>hQG554lIL9l/ %AOgms-p.cd'$2%fUKH(5Vs;T72cF\r]j)kKc*(lsHEp=@#Y^jZI\>i/RS$d/K`pV"Yp>E$a2bYoG$?Fq]&=3$6G;'?8WsthJU@4q %O7>3K#a,">O4-3C]fd9b]uE!j!)CAn'Kq6dpgE:Eml%kA[*g&?5L(/%G!7\G7;uHq1=uL^&=cA5I>X19k);ctGT]@lr(Q'h#'Y=q %hp16i9pUi1bB9=9E5dP4YN8LAA[_?!j2IaPlbQJPbX1[Fkqb.,"aF\Go+!PF-ZNR]>`$DT?nc,)f[]a>hpQIMr^SgO27+MI[t7A- %jQsK2X5j$EMepqI8BCF8n%eD\oJ`Y/<`>hirl0ECgU>^o)8m.eMh7B3cZ'P.Wp'*uJ+,s%Q`]iUV?*Snb#gKqE#"_hM79!/b%Rf^ %=Dj@dAlI4k/qs];gkt%$p>Zk=*%Fh=Q^Z42[O8AB/J^KpSenrYGj5_*HWV7&-]._D2,"]Z9YPT6CAWA1!V6/#UI>`nD9hb,]K %]8*a;n;P9>$4Gpk,*uM:#L,Va'dfEJ&f/4J5*Koi^,Sli!I/7VIDdo0KlTTekj'bmG%N-4Y(*pX-!p_n$fOH6!Ocf@RONq"j %EJ>D#kcX&#+Sa*g8Bm74EL^($2%YM^jnO%Al[(oG7=<`oNK+%pWJ;#=YFmgiB^OTg[4SgO*j+PDd:0J`*n6@r7`Y)@.2'D,SD1mP %/:L:7hA'XI>uVfP4@N)q3`PINV/glOf^4\0k\HiM[g%o\oY)K2(8n*c[a7UA`IQTk(o@fZe$B8B)F5h!+Sa"qYQJC%':DFT]^%'Q %gmNtE9".a$HaLg^Lr"ZRS>e-Y80h(JO&*;,dPc6nk>_q?+^iN*m%>%0Uf(L3%%HXt^t82qbLQ %YYnOg+.aYg]Rntq]<+1,X9WG#pq1`e1&S9W#pb@^D695;"&$[1XIA2UnN1r,,-m@$(IRc,7`Zs6E4&FBeD'S(R+?LJ;^8kos]PZn'-c[LY %i.EP##dD7CWnfc2aqD.caT,:Et=b?rD]d'J\6Pea0Mk.#j33'CAfP2M\Md+"/6r#4\<;7,C\QX)%r?V9`\-$\lWG\>ocN?5nt?KPatr!V-Spd**ZP=um7$bkc:l<9)5n.TsWY9lt[ %LVWHC4B46\i!CfV7KrZ:d_kIJ=1g)g;jAB!=K]iO4Z5lc^j2"n^fIPS?Aj%Mrh;-(Z,'Sl'`Yi!\@q-:d4.Ak=K$(+#96 %'qtbj9(f-3Xs6s!JiSI%[\3+#6g"2r@%.r(`Xur7?h8p'DJc=Ok2"9M#]pBQg:1#!Mp;#&>p')9+E9[V*@]Kgp*5aQJjW4lc*>@m7pL6cbV6oDh$.4u1a;I&qX9GM7(F(at7:n[:U<;;1_X7\VTif6i?9$h"cj!B"+6 %&)4+okB6;":.7\^D<_,[D"m7:mM>]IA'#%M?rTjf7pu/)X*\)4[)Oa,j,qr7QIj`[`tEF8!YA%4dA#()00(?R'V[:/4PG7b-/WB. %r1r9,GQ:j-r193'*;8PTl?M0F:e#6q,3Ck+d,jgH.XEsX1F-C3;JQn5buebcd'pVMY2PZ8p]KoKE$pffAqBJD,HU;$lMGRY=(^Ti %YOjraX*BJeNF.&Sc\Jp@0a)Bt*>^-FCPgWGrV1G(?"(VSQDR"#k4))M]9sMHrp)j(@A\VKl(,JsXB)=^uj@C)aSYJYGRAW]C %JXTIB!%pppOV03d@M(@'EHU#C=\.6T'B3X&#JPB2U?eN?h#Pu;AdY806_*]u7&IcM4;g]"QLFXrTE#"^.MOa9seGR9:;\.mo"jsOf %^e>u$H]S\kkH@fkW_VM`E1D.3*pV.ZJet%Vd>sm=DG0]/?a6ar:/UtbB2>?5Fk^8d:P`CcV*Fh?c7(;*EbA<6K$D,D`1%%]No3#/ %*;i(L55f=mH6IKIe)7IB(-hWb]S(eXWRIXoM$,ji0;VKu74fDTTUaHu3ZO3oGZ %B'ICiqhJOpZjn/t"dqmeW:P,/"O2/ZkBV?p`ZEb&hG^U14*l*PMkAa4TRsJ(0J!rT,Ik17cfX2KI=KpF5MZd"/TBXCr2qID@`.%d %oRHVRIb`Sui2s+=?2AZ#&.n#*rq-'FK>-u/mdmam>4SBph@@tLl1%-0nJKAZO;]4O3^B-!TGS(Pf6r-ZYsT,?kXKXb4dq[ki#HLE %q7P5`%3W9icemJ(6\@sf#n?)hAca-4hZGirLTqV`qMO=gKY\tK?NEmrm0M:3P&7cMBA5U %.,fLYaIRB=1.^U90C@Oimr5'#UN;O0$I0:eFN2o"jJ5$hV.g*k:Qu;9`>qZK!J#%4rR0I75rgZ^c7'2'A7n?mXKkW?qW11D %,fLqZ`bq/W93B_Y.Sm\4FEEN5ClsiLpQFO$3:S-pNU#M$2\Mo&DtO=;Zg5C3[783oD)N/^j`ZK%?U!qlVs:.kAVHR[(fcK:`TYc" %7Wc(Feji36;%ee`f>l^#5YYA,Xm:(S!#ONBl\_>-$d\I5P>_-BFGF1KmX=6JF_t>GZ1B4$Fn5')RJsVL-qA2-chu+)#s8.2[>g&4N0.;^jNr9\=;lua.a0NJXl%=$Ap%/4]qT&X7 %$N8/omH=N2kCX/6O^A)Ut@BY**DCl7)O>L\l3YG8k5*o=W',@&mV4#h<&GH"#,GS#;*TOn:>+@fdp*??Uo;Fdd-,n$Wk"MPE6g.e3C,A;Rd-[AjH)'SoO9F\0sW4l8g+E8rlp^%!nXtBH]1,M98DVda_f=ihD9obC3kp %Hrl@!?Yt,[f3eRJO2(XCfmD2HbHA-U2##W]V,tu>RKHGG5QiR)I=kiLg.lR."`ei<^8\!&6J0G9]1gFRWTN_FA%?)b;;; %9.B%]TOUf8957..I(+=(nIg&T^Y@cRY#20+Xo@cm.3_Br_#R_OA-en5\]U$*:-r1-NC+>MHj";e*or@^k %L12s0P_tqS2bThhIA@:W1>do!!+%_@.t]UZj!KY'U8lhHc2)8@$/c#@muScaRLpZ7JD-8!Q$F&S#qEJW0L![AU>h\2F@N!uK<,nP %b0G8+WNj9o:hbeuF0Rg"@R?ckU17LcHc8AZ.;VB9Af8D&L\Tp]C-!.G/)t5C)IiNBGK_mV"X/62.\iZKAR&m15a4.Dj&-bVr>P=\ %3CZ-9c)_2OP %5S"Ee>O_u)1[dF%['Z-pCPhA;r]2M929YR+bDH)@o#M^8f;MJG^YC&LDn!f.5,mpmjo2*K=mI6ZK#`FDX7X/8H1!0'?mYBNJ9YQF5r.gX^*"-n]g32Tr?@P__)k6;^j=7 %.$C^<%Fe@^?*2hdURc.0T?O*pY1r.77VVV%rE#D3faP1M/CU[k,BenP%S,3Q!UIp\=#n"JS?T+S>?tIf9F8"VI$:&)!=+E=:>['B %#6O#Ma1De8n]MOqeQl/h_5U;4lNh6#?Nn/Q/'KqOUoE"GIC,5^"]"G+:d:K=6lA1I&8 %Cc1NS^$ubWTKr\mLu/LB`%96Y9jK5LFO2Rdl+qDejL@_-mnhPQBnTkb&0D'rJ%U4K$Y1NXRnu.e&p;S&#\^%oj#S&2Mrl^X.oelo %gg2kqR.)fRNR3YaJ]@Mpo@(-F2dX>gp,<*67E[H>Cmr##4ij,_7S]E^_ECnq2HdW/frbJWmj>,kY['Mqg-h6J8&%Wp5iLj+U)>Wd %QfgX?m;ZC#71bKJX%G-J<,aTe]4r&lTYUijqBgU+R)O0fUn*HYJ:rP=5imZ3*s#`;W9NjF'jGCem.O\Y<\a4:E0(<8$DjK&.V7D6 %`$:,%hX2e[I#e1=cVTK$$SrenHRM7`"Xnoc!HqE>WMoUQ7Y0nto,*"+mc,4[)nbqP_J^G's/qa)/>3l53B`8+!Z7muc3,>c1;Z+^fI4jgK-QKF[N8QUnF8SbVY[r`-NRGjlZ=B=4L@WADa*[H"S6KZ@K %*a`TieJY[(A5$5RCU"AVFqL`.=c'+D2?I5l(!dRlp\;mgE%#FqK9Cm7DL'_5D$QA5a"47Y^h!f= %(6)U>A$H,RmCV'-r]/AM[Ts"iYhl2e[n+V&_D51P_Vi;iqO<64'GG@b95nEG^dmdb#Xl`FFU5MJ&Z:qa_A#abD9[ZY'I4,j#DL5E %f+mP]Fn"[:2KN;_TU-qF]mSU<\39@k`X?G1-Z*r:^et^jQW$.rMH@e0]NAB-QH?3$ %\-X:Jcj0q2(LcaZdaI6O+^S<)>W3uW@FX\Jg&2_tr[sLV0-/%GIN!@BAeG!r[bc5;IKabR&\fQ/r!Ltr@]FQOcKWIdW[@nb&epp0 %9$MBsZLin8[?>g5$a)SOhBeY9@cOeB]*e2YEM46P14lNpkBr.h1P88[*roMW:pdCi@]4N72nGr4(PfjeC8l'shfL/#>N\hc2Gt9)L<=X-JA$\?a'SR9aHXjsNWCtD&5PZ-"-pWF`V2\6Yr+dAWcD9G,dTP4PgL!uM4=q1!!JEe %"J]B0667b?$dDNkhE0F"Ld[IZ?q9+7d[X=V*Zj3T%SZ^E#AOY)k66g#:0E$(%>J/4"!H"1OQTgmLlAF>(.$0b,h5dG>3f:`(!LQ? %@PU2+`H7mQink)#*(Vmr.:HsG:psQ`9EQd+*TQB>1TE\?nKt_o::o8q1:8>UGh#*N_=dVNBNCLG2Nfg2>6&Z%QZ%a?b\ffmG)TN4 %#btB>f(n*+Z/O\78X=u=.Za]-:_?3mj]"O/12M?-H)Z&8%7W %#bs79o@L`u@,ol2IaP6q"Y+PV2fXYK%h&U&ok9qK7n"lU[3/d&C!su'_NZ9CGi=4s@cp61H2[4hS$37CWi7>79b.7M\U=mJocY[: %Q=s5<+G3&O:_as6k]1p_gsL,*lDJ:JLNiCB9rF,Oog(PHAJZuO84@:+UhOA-n@0I16$Nll"=FYPDin=8OrulBn]NCD]a:(l5$0E: %?)p]1MH[/>l>*;)()*:rBU5QhJVpI@QOD %i"q(_HFHZ)L\99W`cB:rH`moL9[1"6h7T*Z-]g-rU,m\"oJL<>KST+jr %F2jNX2K07AO&)YCH&5N\4%+gBAdUcq*W+aa;HTeB]E24l7K4J?94hm6GSE.73+e`b]M,>`u@b*n$Jb_PV\kO"mMs(`pTtp2& %[V_677ARGT^0ch&KZQh)@8&HR9_%mWQ0al\WAtSdcU.BG>UH!P2Gn#cdZ+dpmF&JeHGr4[gs&f2?NS0lj7?bBXXV#gf%,l+SS7Ka %_6Vl@a,:TUE*!\pWM#9s!-?!%j2'-Ye6fL1/4.,mn"sg/G\=Q$l0h)`^"_MHc%t`OjCf)^7d6FC$aJ"^9@YhuM[9HCVmrT_QgL<_ %\^Ts5P!PtRA,L4aKX#!"DV4ps(Gk %^a7YL_J/MAke7smXEe)BOYu.-%3>OO?JG.bh,YQJ[rU&sY^:4dJ#c8dL>Y$$-@(1>0eO5rk?LkJ6mQ]iYgD'.b`P[DOAKt5l_lo( %c5()^AR:0Q5e`C>r)j@u-4m?=[T\8I:/T(ED,%HPbLfi/Nm:Z0X[&&\7sQdH"n8M907aUT[5=mp?T)!5me4U'5;8I)OCaNemEO(X %AS+Y^;_L,7[94DVK]p^9hl\h0,H=n2>a(4`!cQ3Y\hd;of<)anI2:#lno?]<.;2]lEBsjFRL'jhk_,,EFlfDT2d[g%6+!8[!XXHL %h#u>#MPs)-:6S"M)'H_#U6cA'-Z=o'>G/e_h)..&(@26%m?E]ki0[S$=fA@IFhZPk<(75+M"KF36GeJ`CMY.cDdS5^Y/@p!PZQM-/PHL(@*u; %/UC`7+VL&09L;0CY/?U0X+lWsqf5imOB5^/&#Tf/9G9lFI:^dtaj^\caB*Y7:dl#jJVt3G%Z\7L!Nd6YiLBbFg(Yo9>l+ %#aj$-%8.ff!o3?_9$GPG_r#-m9/VP+2g+#\40ZA"[X\_`2C1M%CbbJ9s%<1"!3H[GLCmJbCA^:Hl6":a8m`AZHr`$Aaq0.'VMp^*^h5ci"(K/G0320["(!=.crE$QW5Sim %:LSpD[<:G]/cU2T-Cb"/)0gbPTROC_CG0)O\'el:@3qKLqKHLU3[AOU!WF7V/7S5D9fFkQ2M?!L2dNEZj`u-(\&H0WT-11I[J[B9 %RWstuYg*E%h[l%9aem)8,H<)!ohqQ0c=HUb^g]M&$ls'Og,Fk88f7bt97s:l_\A!&ociHs]Ia?WE.CkE5k::.`4B?S(Ja>4b*J@6 %dW>fr_:"S2&$S?hp7l;l18Ga!!&iqN:1lA\6&aCgK"ItEME/lNB#&J/<74VX[\EQ!ntUB0P4A^Tl>S@ %c<77OZ_a>n6.&KuOND1`!\t$'"U28)?7cR:]IJHY^88k,"5FL``:M.o::IA_cnbJt-@aC+g)PW+J(fk>l^c^h?f=uS9gl1>]&YfcO %\Yq2(0%tBh$=:P;=CDqAq2MZmPL&HpEm`m#/EJB^9cS3e9J65?X*>!CqNh)LbblZ\/AWR;V.B,*&!4G?\fisPoo7C:eQ %=Uk31HbC,e#>JD;,tKW[BERMCpW1V9@a#h+`35`SX4>&Z)QeD@:n4hX[HX4/,%,QG;#q`Fg`r>d'^3g&QMP!SCVV%6[4Ff,+LXnO %X0k(7A5HrS9nT%_aE"#f7gr3EaO3qHl)[9&g%jCXBrH1C[Qd_S>,5;#loD&3XPh*-[aFN,8^['-V3sXT2jCQ %L)5kSZW1KcHB/shMRooX],;3Cks4PrcU$k'Whggp^;Io:!H1G[bQPNdLouW4T.YI`=&rPJ``U/YSM@)3`?fK8qVg[.6W(+=dQlp@ %TV*4U&%a5GMdL4e!qPu;f::Ys&!b5!^sn3mKT-LlGO'E;gVao.pqPRkX8d5mQ_-Hl#lq]R]5dKT %-U9#E<>W')K@I;!%6H8%JZJW;H\sFX4(*gV$0Ocb^_A>!'%/aW\jO2cmq'lDb&5($Dr=?$Ap=2"95*:ePm`O45S6b\>AQ>j3#UMM %78oD??5FT^Q;+1Uf1h'Y\3_Ynb0R,I(H&Ll2t"LNO:!`]GK6"=Fg]c&qLETJ3n %R6hM(Ru8@Whf:ZY3\*DfFlIdlc%]+f4YHVec39Bne/32.Z&(3L%'Q.%PjMHi7F[nJmGhZ!$lrf'Zq`mC3[%/j-p,j&,f,IJ&kdAG %,&p,j"lZ[I3r\c>0XDFA)0F"]`T9hX"M*0#]O-reTFO#DG3jifm8bXF;Al=1qRR-#WDiB7!\NHKS*Xq;?^h=9(N+Q(Jga6uobHKb %dQVHCp6YQ,pR0TJf>;40<;*1!Y9/TQHi!A"aGAmA$[n)Q=t1Nub),V?n2sl#GA$^PDCj96g:4a8S^+Y6K?VGQ4]?XDh&@@Y8OZE\ %d;#I--g>-@&Ptic4GA_>8Y6-)F+c@qI@M4^aO0;5Mr8]Q1"U"_,PD+X2Y+[8eG4mP[7SW<"OImI%&kYOaCWf?lP)>LkX\Na'XC`I %,eQ.(2.Z[I,TFpAFeBIY%sqsS5g;-TmHF%/8m(/TPt&i3:k6[QC=RALo2nUhN*Fir?]#JY:lTT!5mqWm/.r84R^a3.3>B+]V84<, %$24cDDoi.G,jiFU(+mcD>!726YYihYMCNe18hlS^V!qlM>,iVK9eBFNTflaN(lG+V-'64tLg@bI %/hS+NX`]m":8c.1Ca&.+5X%=/CS@Pn8c91[:%3BQjjo8lmB8%QXs84/eU(+:b0AMMN'7\lIOK)RInFYH'&b %U^=SO_15F^4A>!iH8.T0pjlEJjpqcA/u-^JR2?1$;NILKiT.u9;p#iOYO#(Z6q\]W-fPql+VLI?9qd4oMcta\^k6Nu#CP'\NAr]E %O;/s,2Q3Wqk(jcfmljnmF:rnlSW++jQl@%WE(C(=65@N0Wk)!)0S]MQP&6KrZf]^"qW:RT7g0s5)SI%F?k,AL!Y?hgcrA@c`#D#: %frjL!U&R7)27OK>gr%:"72a`+hJ>r#<6NWAAH!e/.id*7mFmcNBJt!4LTe8n3<)hMMdk@4>9,9;"S$UTjAC3,qG9ZmTP]SHXcToR %f9)"kN>'W7?i`L&.BLu':o;KKon8UW\YtZ4!Ds5LRq#2oHHR"T6:__*KS1>WZjpB5*N(O5AkAcEPd(rCB8oE)I(?Zl>h/J.Jlai? %#T(r&MF+hT;79b7!Upi0BHnPWLgCH35sQG'`F"fr\IOR^6QF``\Nj=l"R0c`HUSClR-9tf9%)HBA)EY7$7[%X($_9&oio[3P%'qfH6/>S,@Zab[f)=0+b6$dmtXBghVJWsSU1 %U.f'u63fk(!*V`1,h9,/*DlE$6Pk]EZqeLfB%C)XOJ=.T,G"J/>Yt\=E2mJYF18UYY*0<)%]l'.jsn9=UMfp%$a;R4TXc?Frlr/+ %6\mUQJB!F&T-Dmd:EB3C5S+"n(Z%MoT.W$VBM+Pa*LhBZfhUReZ?T(J!D*f#]BZt+],Gq$'8c-?D4oejfm"VQVehA99r51(Ep0Hs %+h,abO<*X`p/D51O0aQDgI-LDQ];^(co5&M?)PQLUjq#.-f^8#f9U@!i#,$JIdncPQV:;8kur$?Z:Qf8R2!K_S-HfZ.TLC=p!M?l %Xj7)+nCB!3MTOWo5R#ATEfk2F:;fcG][cCseMq^jKScSG\ho*1Ua<+9o(#ri.3.H>JdPf,#a96"a<./i)R[Pih6NiHPi[XM6\"cL %^u>nQmbag6HG"$Gm=Wn^").*m7>M5Q0aCZ33btDr/ij(EJIcNlFBgg[dV&._iXS_DmU8i+:j3O[SF!EbY,YeP0[,VDm+B^b9o/-a %La%Nm(h'h)>!tTL\cUAMeKf7)C]X!HQ65&U.suChW]WI7'k)lG12_I3`Mj0ZbRd]C2ga)?q$F,R1,**6iaFT!D5`;n91/tp;B99Y %WYnHj@+&\^Np:&#KD/0Bdq08GkQm>@);OMMRpNJ]"F=FDa,J/Aqh$iUakfg2[Qio7XOgj.EG`ohQDD;'DTo]Y>b9`6,*<@YSFSZ* %kb09O,:cfbH-mmtR7A,gOE,@:Wq(,oaR)DV[Rpi@(?*]IBiFu/CTj!&;.p6KuOLd>FZr'1aPWB02rli;4NNp;2 %T!V"6`h?LH%@*32XL`g_pjKQt_n3u5RJ)Ge#KTB\5"rR33s3ns`"g/k@0&N6;IZ7ZTL#Q=q'fpK.^'2DS>$DqXp=keg+_l(NGm\0>3'TG:b"fP %#Hb53A3SQfNJ\DoiW@@W9T@2[FMroi.PIcJ^u0[,<&p/oJ-23K3)+*Tf^Ct&Kscf5.UMql7t>)l-7PK#QTFCLgGr8#0^,3C=a72K %@h*)4_InEf@Dj'@Cdk^sI'DNI#@s2UKW%^\%i@\+=Ht*W%>$Pm-bU&1d9jj:OgZ]?6K+`g[0(/*PeUf8?%-WM-Y7R29^%9C'?39T %5Y9KXJBjr;U\@W`NH158DC\G7c(ecpYJk_tV\QG@?4[trc:'Ne0t)-MJ]Np<"m&GGETO36,Vjsals\,q-n %MCDL#>27#Fn.@U8O>FGhp]d\-.S#[g/=[uLV,8Bfg_c9PM-4\U9LBY6MM_tf&GGG$AR**5*8,d^lX0/$V5LqDOCsGci_i[e2,-48 %r5D)T0G<#j`Tle..:Om-f'mGk3eABsn8^2fi[i>!O?9YCH:?UI">Di%aGl.oUuX)3c>jRN@9;B;i+,TKVR0l=\u3QGF(eO+"rZkI %Z0F;Q]0oM2^P;63icMQTI+=M(%I+dV99ZP_`+)Ur]FjT^h()&/^Wk/W&/*A7AV35`OOt6MS&cPJ9!6,@%JLmIUG:ki:7ZZ'E/WD# %-ZN_0C$7bW.@qU1JnD#@A`k="Oqr-a$'ZRZMlGE5T3X\lO="hb()<'6Oh%iLm>+ZV^l=lHR%fSVl/!K3"6:is!ZL`I:7CM-+^CXe %%<4aHkVreMEl,)tZA#&@68q#S0iQq?%b1#+i?CkQMaqGZW/lfYq!@Qh^lt.p#(1HEi>HA3V'J09AKl%$]MPa]eUZGhJZK)nMNXTT %.0^bXS(18mNY/#1G"Y+1oW$dq2feO*"/AS##sY0<[U %i"69aK#qeS"Xld_'P[c!@fi$WL>\'l1-7#FkS>BjKa#:d1a<-ug6WC<@9?OY:S`4MMN/&/@EV7\A%`>Z$OJ._ERC&ljeYhrKl(Y^ %ac#+(kYC%N/);j[?HP3"UfhQCcUu*8iIGMiWq+,F>!PIi;u/$XZT;P_0Y=$#`0'n4=M)G6XA`On&,e@)P1%E>?o$t%Zmr"(7ofiu %fYH+2@7e("nRsOD;oJSXL9H\E_;hGo9QDE7lRA3uE/FY4nKoX^LoaS7]WMui:6!B@BkLVhX-k98S.Vf;W^J3TPM_N\0?*0sU9=0?ot,#62hL`REbmN%R@:pkY1gD0pc[A'8i14&ZAT3O)M)KOCY(K09le:t5q<10kSN %fimjTj\@Eh0QadlCI(0UXrQ:;*TIf3(^GKU]!%4M)R8s,JJ3NW_9ZN-eLg"Ade%Ej$h6O'S[UdOhbf6k]E'_+;L[teg'r6oKYdaT %/m?RLhn!YW=]'H5?M9N[B"g&B$cS[UpSHoaf--pSb\h-6kI;E^J3m>J27[]fg$Du'%d+D["CdP$`k07,eO!cGbDKDB)cG//bT?Gt %.XEaaDt8$#!"*ocQ.;#)-`Pn@<)hF0PF"6-pHtg@r"OPqr#cDIDcUdcl?74V],lr %:+.o/_c56s93P;BN7\0F6l8u[Ggh4N$Q,$o1M0B0l\^`%!gK@>$utXl_i&ogO*RUm)QLZA"0US;oBhH.h;(0!`^U/eJcCh:C-X;ZcQmfTDVbl4Z_7%&Q:$s9O@:[oA;_ph=iO#P5lNf_o!r\F5!#pD+5 %pl)iSi:AA1_;`U,;p%BDRGE6,KJ&;]W&]L2NP9pWFPL%/:;9+1nA,ZfLnkN`]%e14f0R#1N=CPFOrT6@$Y=F@'(-U_\]9X=j!LaO %'Lr1?>r5k[K(Lu!_ld$X'D_GUe@jWsY32@TA.Q_+O@pV*ea7b97Y12]mr\W6KU6ba#e!Fl:a3YC&GmWSaD)ZoU=h,L,B.;&LU+9]%t$`&-,Zj=P>` %RHjkl\"&fS#CR()S"qY3aLQP**U%_M(<]nXGK/K&%n*YBI@p;"]#HrBZ=#-e6,ckT)U6[N/tk-o@FPiM2.<\/JRV;^,aX %S]j]*)25SgBO3PHcZG+_a=^Q@r`$%#Q)<-KL8Y0'eu_GQ%,bnudTnPdpnG#9@H,Pc[^$aXXcN*'G=XKR3_3UhB68g*6hapS %m*EC0r"!:"j_[j%gqBAVsk6#5t4-Lf/T9pP_mE=W+_:O-1"PYNeR. %)W*ZnZp6g7>#;5d&\K09aA&+!78Y5:"1P0qn!t2?!gp!m]"$b9CSN-dQp08oFY9M=8XC7Wn0rf28^sbf;::hr<%agrfn)ZpaQBGq %n?_b$;E_C>;l>^_H@mZjG7e?3=).qGjT@C=)_p0j2\.;YC*H9k5AD8Y4RDQXB_I96oi`7`&EHLQo0DPnG? %7eHt-,18?J6DQ!mVbge\?L8kA)dL)5nRrTog>!:V3j+a?dMUa4?OQ@Y4,T#'Ci%I>;4Uh/080tRL6-GjWbGH*pTuZ,Eb5$4p`__e %3Ia\-2cN6Tm+ASY^XMr/^pg*6cY=4;D#k%djUFT#^p,h3g7L6n4\cUE,%oC8.`5*ad9nDK3`s0[l];A?*'T9'o]R/,7k+hs<65[n %HF:*$BKDOp,n3UG]`j\dUj]S(3,Oe\kCC6%l\q*EW\16`Hq[-ib]`8n^rE%S/@k#J*[Hfc:NGR?j5A4fK>3cHc*9\e[%BNP$9&HQ %6(@s#YTFn9^?XFie@muTn\mIPs+,bQWFN)1X@@1M+Mp(]nRTMB9SUD/Bo>O(8U"(8XhC %J"`@uAqtH#pD>6q,aM\pnrSRaFE-D>@7"WD3,f4dK<3^dKZe+JCG9 %F:H-bZlKB12\m^(SH+mX!*`GCD?4;(*!YSR%+82VhJU0-ekk*XOud&>1f4N%N^d^97:;qGsmc&BFF %bus@/iU&+;?&,Ek44qZ<3lkjOET9NIJOjC+F/,a/ma/@C:2lfq<6Wg*pJhmZi3s`,MVJJ@('O^/8"=5%9Ro$S#F!-lPh)VYGb+M$ %im4Z$L]BWXWk"a=,\"-4:QC5[%bMJB+Br,J@70TpZSKsudPpcb"gMZ"7QhkH>+\uh^`^ZZL`Ft'NnbEcI]O\b4D%W77QEEdQ(`0a %JAm&ENB_spIHX622)dm3PWkW<`XBus=5@j$YSn!da*_J+jGPZ2e]?Yn'bJtsLJ-q%P_%ZQp2',"?:mLpEI+&fRK*A0SVjZ %=@X)53bAp-caMiP=^=Cg"-.E^+O;-p2rmR6U%2.VF;uY\YmWl=!.9#R%E!UWjT-[^@M>9-)3120\C`6f/AgF1RF %I!GNGK&JZ2MAR.0@N4U2'DUHPR\_Go"!)K:#qJOb[2T66Vl0S+cXX170aA!pP?CL/0'snoY;rX5(frW7VYa3EX`.WN!@-1M6'/$SK"u? %$d/IV%\cXb3i'$i`A!&m=I6$WR6hh5,3gS<.,gue#k.G@&Cakg([oIpR0UrmnL@p'A._]rihV==,a097Ee2!2EAu"(&GWBpCilK+ %FC'-0nk^\K&Ea<)R4$NAB/(\k:40%K<=9,EXduH#e@P)_&\_qkN/h!b_g82h'VUE6-aSOVDS)?K?HIhUVUM#T!!&R]b,2G;P[R*= %Ih>eL)3(XXY8@Qk0*"S(FjkOJd7(;rONqhKF3cm6L-9$=W^?h[d5]k4T`;1cY4@m9^S.T1jVR6g]YhHd^L4DOc:090edVqAQYS_nma_fBo$65L8@8f64M7&g=-:Qac2uHLOc5CAe&-MJU3h*j"B46 %?F;>OeQUSHn-?6X3])@L:g%n!2EY$8VplPZOdO0kM$dnR%O96@%P&oB)..7=Yc4(A)ad#e+Q-UnflCeYP9Y"'m/P2/<&LX+iMl&p %$J$/;/ne`CqHu,q^#agh:WlC'P!>DnRq3O@USmEZRcirb''*cLTk`1Mjs>6s8fc&Y1`0(<$qr%i+._@=p`l!IgKBc'cH+EjKZ['g %0UA8k,1+_sP4aieoQ$Jifl$A[4'8PnK[tt:@Y*=+D'p@sfQBc?`Bg#k %Z-fLp!+&`(6b08$!Zse<8#0sRB(RR>Uc1_HY,udACT,IG&i3%G9:_"%P6K$+Lp1Ed>(TdE:l6:!P=j@"!cLkE#j<7QZa'[Bi2j4j %:oWn5,T/T?30;IeD-]54S0#!O?B^2_`*GbO64HL,PPHbcCNL+kDfeN6P`8ObSIr5VD(l.a,3o$J3ane_5[VUUUU^"YCkLReVfC7- %PX7+1L8WHc6?"fQ%`>Aind2<5\U%2I*&)20WIPS'P5aj?%H0_Ia@I8S@'Y=u8 %F4O/,L$aR4kG""eq+KuA7WCIHJmO]#UKJKKBs&K0n)i3$H7BRpF"e`[*U2BY9rZRm2C"))kpNl2Wgu>l>Tr^7PsS"U]m.gLplc/I %beFY!!"e_G=\FQQ2^JTbDeARb]Sae'$A*r5K]@d!9hkBD!h(33_JWk>@^6Mt<7]4=.]'0##V1M+^8cWS*$<'d\k-*985E(gJ-]2L %SATnZW75CC1*c3W/Eebo]+V*iYIR-aOE^m %1%DY"*`5G9[o+C"`S(F!r,G[Vm27^VXq,3K:T/Y2/MPWq&ZUm,r$GK!R>"ZaFi!Wk,q.pR1TbR6\mD9+baWN_[a[#,Pkl#YjHad3)KiZr$l4L.]#nZp98;U$ONL,Be'eGQUB?!=,"e<%hB67-.jZ %%+6E9jAKV2K)#8_$`+kJ_4@stGN_F]=uR7B[rcZ0Z#F^aF]04lp=,J'Kf(g/Cqgr@%b)('$oYN%W6lQ$u %0Y29*HdJ,(W-`g=,M0f+J6c@tO8o\9do:=uF"(&hI(\O9G?1VP.s2,dKH?8U1D;NI`-7W3]0f/q$(d%E?#AX5.,.Sjl/T,nKUQ<4 %Rad3dRrSZemVAg`?uZX(nf5<.7ZQ$?'(Dim>ch=<6tKi`(^2=ibfN=,gXI3A13j)`)/9W[E,5Nj/jH[:$l9d[9c%B45"'.@efduS %m7\Of!`pQ4C`*O9#Q0*.k"nOBU4N`eiE[CrC>oN,8^o"J8o7IkCA)>Kn]2Q__+SG[`9Sa66W\oC'K$)rS]LjY<5%!UK9q-dmQ"ZJ %)**NZ'8lrPR"iFNBP6lRODh6SVN=%FmS;^Q9rW4>bXN%eg7O"WYd1/=8^b1rWbi&Kmu5DTa$$O'UDPMFIWeh%QP\5Xh,jD<'K %,N*ec=RAuPE*6bT604AS"LkM,m6:2j!0G'nqO1qp;-D6%kQh`fS=ig1mR;1H@3ndGk&+9uXWuf?Wg:&+LLLOf;$k!@_S/9pOCq+) %1&t/;E&bpE-V!!1?>ME.#c`I%??$@UN4)KCSrT;/]%+X\Tg&0H\?V/l97;[ %o5l7EcuhGA&1.ecWY6efa"Rsr]WAKdMmNUGW_2(I.gK"8D%^VI1.JJXf+f8GTH2<&.'.jebA-k)jf^h?K0a:2=?Fs1Gid#.2;uEf %&WfUb(#S7X)g;qBg-7YTV?bk=4(a8?.&ma=Ef>+3#VN(p60P(I&sT6`?`,*<`>J6;*+`;ZOLmEjYs#>TS/7>Q2fpdRK!X\nC6^k4?]NV,AG?P"d@jhf('=P[[WTNC@H(2G %oV1kk$2u`mJ"K4cBjB20O@I'=Zl,";19%[$8uApsWo-9j*F&%K.jGB>J_.4%;[7DDh'A@;@6nW23'!JBD-aFu&7_"W>N=N,;Ym5I %G6$Gs'FV4hI8Ff;Sl`QZl3IkE#cdr03g+bs.Fr/:c"ccC6U8huMQjp!3:%(;\`k50kY"/h\9WGJ-8-J(WeZ>M/dk%I.P6q9AMrs$ %<,!eEj42<536/2hP0-6cJR@6SS]S4e``H0]fE(S0(4+'Nk.Z.iC2E\-Cfen^D&s19@B4:GaV.15N9*ulKtAd-D&`Y>jt#F@9H=.W %O*[aPReWbG#a!p"dZeRaNcH:(X[EAE27`jL(eB=d"XO\S=4&*d.?*f\@d# %FD"e_e2jIi20 %-nuMNaVqPE"MbYk0c=O_iq9hFe=)8k5kMbsRfdGX]33)UW`;WX%sP*B7$"j1lKC^Xb0;IS.RDU?5;g!M_S`o0*%!+5.H$rWP&QX6 %+4p/#O#Ei8S2r]/DLD=p6u%AgJ/?kAS*cH!BH"c:&sLk=4_iL07b=cI=^u-oX\5dnm$(FSJOcsi/bRQS_K?ubMI?J'+^qYmra$h;&NH#7l3%!l`P)hbsP!7Wm#6BX!Qb_1ZOYFC$C;J!r+5l]4mR&-<]J!1-KD5g(q35-aAOMuL1oT4:@i7DdM(8Rbu$IE<`t$0`7X^%6c-2W %Ng>I4&X,6&3CAWdRNKj)R;lXp/6*$oVE%*3g(W\$%:8^P/!m)lG0\$F4'RJ6gBbR7%UjU3Y=@#]XTZ`UgcZO'969%o*)lDJP:+;V>7>^<^;XiRQ1X\,\5`Mr)qsQ[ANnEh8I;\Ng %=6GQHmH,#!fe)TdW0o_.9_;ZXf:)B8V_p!@dtAtud[]Ij>f>ZS[)'P?(tK`i %[FB8D#NFgAaeNR'L.K%f+H7S9q=3(q%ePQMRGl1,d6*f4-ngW0S&H/e0*s=Og2Lmss%+cM38J800cBsfqb0[7cpE/c$F3N3KnP^XuS&R'HbuB]/,4Uq;HT=?uDf(6@Ms3_\\L4kb///4SM7N^L %'L)_AU)H!"k/K9FCXJhPW&sXl)i,KE4'?C#YZ)pcFm-fP4i^S]R %$T5;sZhNmgf8Q %7U9R+%t[tsK*X;9MlGbd8CD/D@IBD`^H\@b8H8I1jM.WHFn"8nht#1EahdYoN$rG.JPrR(-9AbDaAJ]NV@Yn %[BGnQQD+RuKP.W2(UjCJ_.\e#eioubp,4tc&=7)83?F-+"NDr_Um+0d`#uMHOM@3N%&ckGHQ=GJkmZBi/"5?nV>4#S5*TJp';Hgq %GhKX`U6(^&1iVQR/0hPQh(Ec7>+,9eMl`W&d$S(0V"-fbp,:b$S58@pW=5),_S"b`%.n+^s\(q5>P]]J82!ZQsVTp5:69'CTI3d`baF032d0e%qt %7d/XS8J^BBPj'7[E!/(]hZgVqC!9KO9d+,6F"A#VW2fC/AJ\joWD;N;Jjl/%'qm6toGG')$>bfo%dnqS/PT`WC2^@,?BrI/2p)